Falkon Develop
Cross-platform Qt-based web browser
sidebar.cpp
Go to the documentation of this file.
1/* ============================================================
2* Falkon - Qt web browser
3* Copyright (C) 2010-2018 David Rosca <nowrep@gmail.com>
4*
5* This program is free software: you can redistribute it and/or modify
6* it under the terms of the GNU General Public License as published by
7* the Free Software Foundation, either version 3 of the License, or
8* (at your option) any later version.
9*
10* This program is distributed in the hope that it will be useful,
11* but WITHOUT ANY WARRANTY; without even the implied warranty of
12* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13* GNU General Public License for more details.
14*
15* You should have received a copy of the GNU General Public License
16* along with this program. If not, see <http://www.gnu.org/licenses/>.
17* ============================================================ */
18#include "sidebar.h"
19#include "sidebarinterface.h"
20#include "docktitlebarwidget.h"
21#include "bookmarkssidebar.h"
22#include "historysidebar.h"
23#include "mainapplication.h"
24#include "browserwindow.h"
25#include "settings.h"
26
27#include <QMenu>
28#include <QActionGroup>
29
30QHash<QString, QPointer<SideBarInterface> > s_sidebars;
31
33 : QWidget(window)
34 , m_window(window)
35 , m_manager(manager)
36{
37 setObjectName("sidebar");
38 setAttribute(Qt::WA_DeleteOnClose);
39
40 m_layout = new QVBoxLayout(this);
41 m_layout->setContentsMargins(0, 0, 0, 0);
42 m_layout->setSpacing(0);
43 setLayout(m_layout);
44
45 m_titleBar = new DockTitleBarWidget(QString(), this);
46 m_layout->addWidget(m_titleBar);
47}
48
49void SideBar::setTitle(const QString &title)
50{
51 m_titleBar->setTitle(title);
52}
53
54void SideBar::setWidget(QWidget* widget)
55{
56 if (m_layout->count() == 2) {
57 delete m_layout->itemAt(1)->widget();
58 }
59
60 if (widget)
61 m_layout->addWidget(widget);
62}
63
65{
66 m_titleBar->setTitle(tr("Bookmarks"));
67 auto* bar = new BookmarksSidebar(m_window);
68 setWidget(bar);
69}
70
72{
73 m_titleBar->setTitle(tr("History"));
74 auto* bar = new HistorySideBar(m_window);
75 setWidget(bar);
76}
77
79{
80 m_manager->closeSideBar();
81
82 QWidget* p = parentWidget();
83 if (p) {
84 p->setFocus();
85 }
86
87 QWidget::close();
88}
89
91 : QObject(parent)
92 , m_window(parent)
93{
94}
95
97{
98 return m_activeBar;
99}
100
102{
103 m_window->removeActions(menu->actions());
104 menu->clear();
105
106 auto *group = new QActionGroup(menu);
107
108 QAction* act = menu->addAction(SideBar::tr("Bookmarks"), this, &SideBarManager::slotShowSideBar);
109 act->setCheckable(true);
110 act->setShortcut(QKeySequence(QSL("Ctrl+Shift+B")));
111 act->setData(QSL("Bookmarks"));
112 act->setChecked(m_activeBar == QL1S("Bookmarks"));
113 group->addAction(act);
114
115 act = menu->addAction(SideBar::tr("History"), this, &SideBarManager::slotShowSideBar);
116 act->setCheckable(true);
117 act->setShortcut(QKeySequence(QSL("Ctrl+H")));
118 act->setData(QSL("History"));
119 act->setChecked(m_activeBar == QL1S("History"));
120 group->addAction(act);
121
122 for (const QPointer<SideBarInterface> &sidebar : std::as_const(s_sidebars)) {
123 if (sidebar) {
124 QAction* act = sidebar.data()->createMenuAction();
125 act->setData(s_sidebars.key(sidebar));
126 act->setChecked(m_activeBar == s_sidebars.key(sidebar));
127 connect(act, &QAction::triggered, this, &SideBarManager::slotShowSideBar);
128 menu->addAction(act);
129 group->addAction(act);
130 }
131 }
132
133 m_window->addActions(menu->actions());
134}
135
136void SideBarManager::addSidebar(const QString &id, SideBarInterface* interface)
137{
138 s_sidebars[id] = interface;
139}
140
142{
143 const QString id = s_sidebars.key(interface);
144 if (id.isEmpty()) {
145 return;
146 }
147
148 s_sidebars.remove(id);
149
150 const auto windows = mApp->windows();
151 for (BrowserWindow* window : windows) {
152 window->sideBarManager()->sideBarRemoved(id);
153 }
154}
155
156void SideBarManager::slotShowSideBar()
157{
158 if (auto* act = qobject_cast<QAction*>(sender())) {
159 showSideBar(act->data().toString());
160 }
161}
162
163void SideBarManager::showSideBar(const QString &id, bool toggle)
164{
165 if (id.isEmpty() || id == QL1S("None")) {
166 return;
167 }
168
169 if (!m_sideBar) {
170 m_sideBar = m_window->addSideBar();
171 connect(m_sideBar, &QObject::destroyed, this, [this]() {
172 m_activeBar.clear();
173 m_window->saveSideBarSettings();
174 });
175 }
176
177 if (id == m_activeBar) {
178 if (!toggle) {
179 return;
180 }
181 m_sideBar.data()->close();
182 m_activeBar.clear();
183 m_window->saveSideBarSettings();
184 return;
185 }
186
187 if (id == QLatin1String("Bookmarks")) {
188 m_sideBar.data()->showBookmarks();
189 }
190 else if (id == QLatin1String("History")) {
191 m_sideBar.data()->showHistory();
192 }
193 else {
194 SideBarInterface* sidebar = s_sidebars[id].data();
195 if (!sidebar) {
196 m_sideBar.data()->close();
197 return;
198 }
199
200 m_sideBar.data()->setTitle(sidebar->title());
201 m_sideBar.data()->setWidget(sidebar->createSideBarWidget(m_window));
202 }
203
204 m_activeBar = id;
205 m_window->saveSideBarSettings();
206}
207
208void SideBarManager::sideBarRemoved(const QString &id)
209{
210 if (m_activeBar == id && m_sideBar) {
211 m_sideBar.data()->setWidget(nullptr);
212 m_sideBar.data()->close();
213 }
214}
215
217{
218 if (mApp->isClosing()) {
219 return;
220 }
221
222 m_activeBar.clear();
223 m_window->saveSideBarSettings();
224}
void removeActions(const QList< QAction * > &actions)
void saveSideBarSettings()
SideBar * addSideBar()
void setTitle(const QString &title)
void setTitle(const QString &title)
Definition: sidebar.cpp:49
void showHistory()
Definition: sidebar.cpp:71
SideBar(SideBarManager *manager, BrowserWindow *window)
Definition: sidebar.cpp:32
void setWidget(QWidget *widget)
Definition: sidebar.cpp:54
void showBookmarks()
Definition: sidebar.cpp:64
void close()
Definition: sidebar.cpp:78
virtual QString title() const =0
virtual QWidget * createSideBarWidget(BrowserWindow *mainWindow)=0
QString activeSideBar() const
Definition: sidebar.cpp:96
static void removeSidebar(SideBarInterface *interface)
Definition: sidebar.cpp:141
void createMenu(QMenu *menu)
Definition: sidebar.cpp:101
SideBarManager(BrowserWindow *parent)
Definition: sidebar.cpp:90
static void addSidebar(const QString &id, SideBarInterface *interface)
Definition: sidebar.cpp:136
void sideBarRemoved(const QString &id)
Definition: sidebar.cpp:208
void closeSideBar()
Definition: sidebar.cpp:216
void showSideBar(const QString &id, bool toggle=true)
Definition: sidebar.cpp:163
#define mApp
#define QL1S(x)
Definition: qzcommon.h:44
#define QSL(x)
Definition: qzcommon.h:40
QHash< QString, QPointer< SideBarInterface > > s_sidebars
Definition: sidebar.cpp:30