30#include <QDialogButtonBox>
35#include <QPlainTextEdit>
43 , m_selectedFolder(nullptr)
50 return m_selectedFolder;
53void BookmarksFoldersMenu::folderChoosed()
55 if (
auto* act = qobject_cast<QAction*>(sender())) {
61void BookmarksFoldersMenu::init()
63#define ADD_MENU(name) \
64 BookmarkItem* f_##name = mApp->bookmarks()->name(); \
65 QMenu* m_##name = addMenu(f_##name->icon(), f_##name->title()); \
66 createMenu(m_##name, f_##name);
74void BookmarksFoldersMenu::createMenu(QMenu* menu,
BookmarkItem* parent)
76 QAction* act = menu->addAction(tr(
"Choose %1").arg(parent->
title()));
77 act->setData(QVariant::fromValue<void*>(
static_cast<void*
>(parent)));
78 connect(act, &QAction::triggered,
this, &BookmarksFoldersMenu::folderChoosed);
82 const auto children = parent->
children();
84 if (child->isFolder()) {
85 QMenu* m = menu->addMenu(child->icon(), child->title());
96 , m_selectedFolder(folder ? folder :
mApp->bookmarks()->lastUsedFolder())
105 return m_selectedFolder;
113 m_selectedFolder = folder;
114 setText(folder->
title());
115 setIcon(folder->
icon());
122void BookmarksFoldersButton::init()
132 if (url.isEmpty() || title.isEmpty()) {
136 auto* dialog =
new QDialog(parent);
137 auto* layout =
new QBoxLayout(QBoxLayout::TopToBottom, dialog);
138 auto* label =
new QLabel(dialog);
139 auto* edit =
new QLineEdit(dialog);
142 auto* box =
new QDialogButtonBox(dialog);
143 box->addButton(QDialogButtonBox::Ok);
144 box->addButton(QDialogButtonBox::Cancel);
145 QObject::connect(box, &QDialogButtonBox::rejected, dialog, &QDialog::reject);
146 QObject::connect(box, &QDialogButtonBox::accepted, dialog, &QDialog::accept);
148 layout->addWidget(label);
149 layout->addWidget(edit);
150 layout->addWidget(folderButton);
151 layout->addWidget(box);
153 label->setText(Bookmarks::tr(
"Choose name and location of this bookmark."));
154 edit->setText(title);
155 edit->setCursorPosition(0);
157 dialog->setWindowTitle(Bookmarks::tr(
"Add New Bookmark"));
159 QSize size = dialog->size();
161 dialog->resize(size);
164 if (dialog->result() == QDialog::Rejected || edit->text().isEmpty()) {
170 bookmark->setTitle(edit->text());
171 bookmark->setUrl(url);
172 mApp->bookmarks()->addBookmark(folderButton->selectedFolder(), bookmark);
182 auto* dialog =
new QDialog(parent);
183 auto* layout =
new QBoxLayout(QBoxLayout::TopToBottom, dialog);
184 auto* label =
new QLabel(dialog);
187 auto* box =
new QDialogButtonBox(dialog);
188 box->addButton(QDialogButtonBox::Ok);
189 box->addButton(QDialogButtonBox::Cancel);
190 QObject::connect(box, &QDialogButtonBox::rejected, dialog, &QDialog::reject);
191 QObject::connect(box, &QDialogButtonBox::accepted, dialog, &QDialog::accept);
193 layout->addWidget(label);
194 layout->addWidget(folderButton);
195 layout->addWidget(box);
197 label->setText(Bookmarks::tr(
"Choose folder for bookmarks:"));
198 dialog->setWindowTitle(Bookmarks::tr(
"Bookmark All Tabs"));
200 QSize size = dialog->size();
202 dialog->resize(size);
205 if (dialog->result() == QDialog::Rejected) {
209 const auto allTabs = tabWidget->
allTabs(
false);
210 for (
WebTab* tab : allTabs) {
211 if (!tab->url().isEmpty()) {
213 bookmark->setTitle(tab->title());
214 bookmark->setUrl(tab->url());
215 mApp->bookmarks()->addBookmark(folderButton->selectedFolder(), bookmark);
225 auto* dialog =
new QDialog(parent);
226 auto* layout =
new QFormLayout(dialog);
228 auto* title =
new QLineEdit;
229 auto* address =
new QLineEdit;
230 auto* keyword =
new QLineEdit;
231 auto* description =
new QPlainTextEdit;
233 auto* box =
new QDialogButtonBox(dialog);
234 box->addButton(QDialogButtonBox::Ok);
235 box->addButton(QDialogButtonBox::Cancel);
236 QObject::connect(box, &QDialogButtonBox::accepted, dialog, &QDialog::accept);
237 QObject::connect(box, &QDialogButtonBox::rejected, dialog, &QDialog::reject);
239 layout->addRow(Bookmarks::tr(
"Title:"), title);
240 title->setText(item->
title());
242 layout->addRow(Bookmarks::tr(
"Address:"), address);
244 layout->addRow(Bookmarks::tr(
"Keyword:"), keyword);
245 keyword->setText(item->
keyword());
247 layout->addRow(Bookmarks::tr(
"Description:"), description);
248 description->document()->setPlainText(item->
description());
249 layout->addWidget(box);
251 dialog->setWindowIcon(item->
icon());
252 dialog->setWindowTitle(Bookmarks::tr(
"Edit Bookmark"));
256 if (dialog->result() == QDialog::Rejected) {
263 item->
setUrl(QUrl::fromEncoded(address->text().toUtf8()));
276 if (!item || !item->
isUrl()) {
283 else if (item->
isUrl()) {
300 else if (item->
isUrl()) {
308 if (!item->
isUrl()) {
318 if (!item->
isUrl()) {
323 mApp->startPrivateBrowsing(item->
url());
331 const auto children = folder->
children();
333 bool showWarning = folder->
children().size() > 10;
336 if (child->isFolder()) {
344 const auto button = QMessageBox::warning(window, Bookmarks::tr(
"Confirmation"),
345 Bookmarks::tr(
"Are you sure you want to open all bookmarks from '%1' folder in tabs?").arg(folder->
title()),
346 QMessageBox::Yes | QMessageBox::No);
347 if (button != QMessageBox::Yes) {
353 if (child->isUrl()) {
356 else if (child->isFolder()) {
367 switch (item->
type()) {
389 QString title = QFontMetrics(m->font()).elidedText(folder->
title(), Qt::ElideRight, 250);
391 m->setIcon(folder->
icon());
395 QAction* act = menu->addMenu(m);
396 act->setData(QVariant::fromValue<void*>(
static_cast<void*
>(folder)));
397 act->setIconVisibleInMenu(
true);
404 Q_ASSERT(bookmark->
isUrl());
406 auto* act =
new Action(menu);
407 QString title = QFontMetrics(act->font()).elidedText(bookmark->
title(), Qt::ElideRight, 250);
409 act->setData(QVariant::fromValue<void*>(
static_cast<void*
>(bookmark)));
410 act->setIconVisibleInMenu(
true);
412 QObject::connect(act, SIGNAL(triggered()), receiver, SLOT(bookmarkActivated()));
413 QObject::connect(act, SIGNAL(ctrlTriggered()), receiver, SLOT(bookmarkCtrlActivated()));
414 QObject::connect(act, SIGNAL(shiftTriggered()), receiver, SLOT(bookmarkShiftActivated()));
416 menu->addAction(act);
426 menu->addSeparator();
431 QObject::connect(menu, SIGNAL(aboutToShow()), receiver, SLOT(menuAboutToShow()));
432 QObject::connect(menu, SIGNAL(menuMiddleClicked(
Menu*)), receiver, SLOT(menuMiddleClicked(
Menu*)));
434 const auto children = folder->
children();
439 if (menu->isEmpty()) {
440 menu->addAction(Bookmarks::tr(
"Empty"))->setDisabled(
true);
447 query.exec(
QSL(
"SELECT name FROM sqlite_master WHERE type='table' AND name='folders'"));
453 std::cout <<
"Bookmarks: Migrating your bookmarks from SQLite to JSON..." << std::endl;
455 QHash<QString, BookmarkItem*> folders;
457 folders.insert(
QSL(
"bookmarksMenu"), bookmarks->
menuFolder());
460 query.exec(
QSL(
"SELECT name, subfolder FROM folders"));
461 while (query.next()) {
462 const QString title = query.value(0).toString();
463 bool subfolder = query.value(1).toString() == QLatin1String(
"yes");
467 folder->setTitle(title);
468 folders.insert(folder->title(), folder);
471 query.exec(
QSL(
"SELECT title, folder, url FROM bookmarks ORDER BY position ASC"));
472 while (query.next()) {
473 const QString title = query.value(0).toString();
474 const QString folder = query.value(1).toString();
475 const QUrl url = query.value(2).toUrl();
484 bookmark->setTitle(title);
485 bookmark->setUrl(url);
488 query.exec(
QSL(
"DROP TABLE folders"));
489 query.exec(
QSL(
"DROP TABLE bookmarks"));
490 query.exec(
QSL(
"VACUUM"));
492 std::cout <<
"Bookmarks: Bookmarks successfully migrated!" << std::endl;
void setDescription(const QString &description)
QString urlString() const
QString description() const
void setKeyword(const QString &keyword)
QList< BookmarkItem * > children() const
void setUrl(const QUrl &url)
void setTitle(const QString &title)
BookmarkItem * menuFolder() const
BookmarkItem * unsortedFolder() const
BookmarkItem * toolbarFolder() const
TabWidget * tabWidget() const
void loadAddress(const QUrl &url)
static QIcon iconForUrl(const QUrl &url, bool allowNull=false)
static SqlDatabase * instance()