1 /* $BEGIN_LICENSE
2 
3 This file is part of Minitube.
4 Copyright 2009, Flavio Tordini <flavio.tordini@gmail.com>
5 
6 Minitube is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
10 
11 Minitube is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with Minitube.  If not, see <http://www.gnu.org/licenses/>.
18 
19 $END_LICENSE */
20 
21 #include "sidebarheader.h"
22 #include "fontutils.h"
23 #include "iconutils.h"
24 #include "mainwindow.h"
25 #include "mediaview.h"
26 #include "videosource.h"
27 
SidebarHeader(QWidget * parent)28 SidebarHeader::SidebarHeader(QWidget *parent) : QToolBar(parent) {}
29 
setup()30 void SidebarHeader::setup() {
31     static bool isSetup = false;
32     if (isSetup) return;
33     isSetup = true;
34 
35     setIconSize(QSize(16, 16));
36 
37     backAction = new QAction(tr("&Back"), this);
38     IconUtils::setIcon(backAction, "go-previous");
39     backAction->setShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_Left));
40     connect(backAction, SIGNAL(triggered()), MediaView::instance(), SLOT(goBack()));
41     addAction(backAction);
42 
43     forwardAction = new QAction(tr("&Forward"), this);
44     IconUtils::setIcon(forwardAction, "go-next");
45     forwardAction->setShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_Right));
46     connect(forwardAction, SIGNAL(triggered()), MediaView::instance(), SLOT(goForward()));
47     addAction(forwardAction);
48 
49     const auto a = actions();
50     for (QAction *action : a) {
51         window()->addAction(action);
52         MainWindow::instance()->setupAction(action);
53     }
54 
55     QWidget *spacerWidget = new QWidget(this);
56     spacerWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
57     addWidget(spacerWidget);
58 }
59 
minimumSizeHint() const60 QSize SidebarHeader::minimumSizeHint() const {
61     return QSize(160, QFontMetrics(font()).height() * 1.9);
62 }
63 
updateInfo()64 void SidebarHeader::updateInfo() {
65     setup();
66 
67     const QVector<VideoSource *> &history = MediaView::instance()->getHistory();
68     int currentIndex = MediaView::instance()->getHistoryIndex();
69 
70     bool canGoForward = MediaView::instance()->canGoForward();
71     forwardAction->setVisible(canGoForward);
72     forwardAction->setEnabled(canGoForward);
73     if (canGoForward) {
74         VideoSource *nextVideoSource = history.at(currentIndex + 1);
75         forwardAction->setStatusTip(tr("Forward to %1").arg(nextVideoSource->getName()) + " (" +
76                                     forwardAction->shortcut().toString(QKeySequence::NativeText) +
77                                     ")");
78     }
79 
80     bool canGoBack = MediaView::instance()->canGoBack();
81     bool backVisible = canGoForward || canGoBack;
82     backAction->setVisible(backVisible);
83     backAction->setEnabled(canGoBack);
84     if (canGoBack) {
85         VideoSource *previousVideoSource = history.at(currentIndex - 1);
86         backAction->setStatusTip(tr("Back to %1").arg(previousVideoSource->getName()) + " (" +
87                                  backAction->shortcut().toString(QKeySequence::NativeText) + ")");
88     }
89 
90     VideoSource *currentVideoSource = history.at(currentIndex);
91     connect(currentVideoSource, SIGNAL(nameChanged(QString)), SLOT(updateTitle(QString)),
92             Qt::UniqueConnection);
93     setTitle(currentVideoSource->getName());
94 }
95 
updateTitle(const QString & title)96 void SidebarHeader::updateTitle(const QString &title) {
97     sender()->disconnect(this);
98     setTitle(title);
99 }
100 
setTitle(const QString & title)101 void SidebarHeader::setTitle(const QString &title) {
102     this->title = title;
103     update();
104 
105     QVector<VideoSource *> history = MediaView::instance()->getHistory();
106     int currentIndex = MediaView::instance()->getHistoryIndex();
107     VideoSource *currentVideoSource = history.at(currentIndex);
108     for (QAction *action : videoSourceActions)
109         removeAction(action);
110     videoSourceActions = currentVideoSource->getActions();
111     addActions(videoSourceActions);
112 }
113 
paintEvent(QPaintEvent * event)114 void SidebarHeader::paintEvent(QPaintEvent *event) {
115     if (title.isEmpty()) return;
116     QPainter p(this);
117     p.setPen(palette().windowText().color());
118 
119     const QRect r = rect();
120 
121     QString t = title;
122     QRect textBox = p.boundingRect(r, Qt::AlignCenter, t);
123     int i = 1;
124     const int margin = forwardAction->isVisible() ? 50 : 25;
125     while (textBox.width() > r.width() - margin * 2 && t.length() > 3) {
126         t = t.left(t.length() - i).trimmed() + QStringLiteral("\u2026");
127         textBox = p.boundingRect(r, Qt::AlignCenter, t);
128         i++;
129     }
130     p.drawText(r, Qt::AlignCenter, t);
131 }
132