diff --git a/resources/css/style.css b/resources/css/style.css index eba6b15..04d29cd 100644 --- a/resources/css/style.css +++ b/resources/css/style.css @@ -32,22 +32,51 @@ QToolButton { SearchBar { background-color: white; - padding: 2px 2px 2px 40px; - max-height: 38px; margin: 2px 5px; - color: #666; - font-size: 16px; border: 1px solid #ccc; border-radius: 3px; + + max-height: 40px; } -SearchBar > QPushButton { - margin: 8px 0px 8px 12px; +SearchBar > QLabel#searchIcon { + padding: 0; + border: none; + background-color: none; + margin: 0px 4px 0px 9px; + + max-height: 38px; + max-width: 38px; +} + +SearchBar > SearchBarLineEdit { + background-color: white; + margin: 0; + padding: 0; + color: #666; + border: none; + font-size: 16px; + + max-height: 38px; +} + +SearchBar > QToolButton { padding: 0; border: 0 solid #fff; - background-color: white; - height: 32px; - width: 32px; + background-color: none; + max-height: 38px; + max-width: 38px; +} + +SearchBar > BookmarkButton { + margin-right: 4px; +} + +SearchBar > QToolButton:pressed, +SearchBar > QToolButton:hover { + border: 1px solid #3366CC; + background-color: #D9E9FF; + border-radius: 3px; } TopWidget QToolButton:pressed, diff --git a/resources/icons/star-active.svg b/resources/icons/star-active.svg index 90002b7..4bdcd1f 100755 --- a/resources/icons/star-active.svg +++ b/resources/icons/star-active.svg @@ -1 +1 @@ -icon / star-active \ No newline at end of file +icon / star-active \ No newline at end of file diff --git a/resources/icons/star.svg b/resources/icons/star.svg index 814b926..a28f57e 100755 --- a/resources/icons/star.svg +++ b/resources/icons/star.svg @@ -1 +1 @@ -icon / star \ No newline at end of file +icon / star \ No newline at end of file diff --git a/src/kiwixapp.cpp b/src/kiwixapp.cpp index b146be0..be38033 100644 --- a/src/kiwixapp.cpp +++ b/src/kiwixapp.cpp @@ -144,11 +144,11 @@ KiwixApp::~KiwixApp() void KiwixApp::newTab() { getTabWidget()->createNewTab(true, false); - auto& searchBar = mp_mainWindow->getTopWidget()->getSearchBar(); - searchBar.setFocus(Qt::MouseFocusReason); - searchBar.clear(); - searchBar.clearSuggestions(); - searchBar.hideSuggestions(); + auto& searchBarLineEdit = mp_mainWindow->getTopWidget()->getSearchBar().getLineEdit(); + searchBarLineEdit.setFocus(Qt::MouseFocusReason); + searchBarLineEdit.clear(); + searchBarLineEdit.clearSuggestions(); + searchBarLineEdit.hideSuggestions(); } QString KiwixApp::findLibraryDirectory() @@ -467,6 +467,8 @@ void KiwixApp::createActions() CREATE_ACTION_ONOFF_ICON_SHORTCUT(ToggleReadingListAction, "reading-list-active", "reading-list", gt("reading-list"), QKeySequence(Qt::CTRL | Qt::Key_B)); + CREATE_ACTION_ONOFF_ICON_SHORTCUT(ToggleAddBookmarkAction, "star-active", "star", gt("add-bookmark"), QKeySequence(Qt::CTRL | Qt::Key_D)); + CREATE_ACTION_SHORTCUTS(ZoomInAction, gt("zoom-in"), QList({QKeySequence::ZoomIn, QKeySequence(Qt::CTRL | Qt::Key_Equal)})); CREATE_ACTION_SHORTCUT(ZoomOutAction, gt("zoom-out"), QKeySequence::ZoomOut); @@ -493,7 +495,7 @@ void KiwixApp::createActions() CREATE_ACTION_ICON_SHORTCUT(SettingAction, "settings", gt("settings"), QKeySequence(Qt::Key_F12)); - CREATE_ACTION_ICON_SHORTCUT(DonateAction, "donate", gt("donate-to-support-kiwix"), QKeySequence(Qt::CTRL | Qt::Key_D)); + CREATE_ACTION_ICON_SHORTCUT(DonateAction, "donate", gt("donate-to-support-kiwix"), QKeySequence(Qt::CTRL | Qt::SHIFT | Qt::Key_D)); CREATE_ACTION_ICON_SHORTCUT(ExitAction, "exit", gt("exit"), QKeySequence::Quit); } @@ -509,12 +511,18 @@ void KiwixApp::postInit() { void KiwixApp::handleItemsState(TabType tabType) { auto libraryOrSettingsTab = (tabType == TabType::LibraryTab || tabType == TabType::SettingsTab); + auto notBookmarkableTab = libraryOrSettingsTab || getTabWidget()->currentArticleUrl().isEmpty(); KiwixApp::instance()->getAction(KiwixApp::ToggleReadingListAction)->setDisabled(libraryOrSettingsTab); + KiwixApp::instance()->getAction(KiwixApp::ToggleAddBookmarkAction)->setDisabled(notBookmarkableTab); KiwixApp::instance()->getAction(KiwixApp::FindInPageAction)->setDisabled(libraryOrSettingsTab); KiwixApp::instance()->getAction(KiwixApp::ZoomInAction)->setDisabled(libraryOrSettingsTab); KiwixApp::instance()->getAction(KiwixApp::ZoomOutAction)->setDisabled(libraryOrSettingsTab); KiwixApp::instance()->getAction(KiwixApp::ZoomResetAction)->setDisabled(libraryOrSettingsTab); KiwixApp::instance()->getAction(KiwixApp::RandomArticleAction)->setDisabled(libraryOrSettingsTab); + + /* Non-Zim tabs are not bookmarkable therefore never in reading list. */ + if (notBookmarkableTab) + KiwixApp::instance()->getAction(KiwixApp::ToggleAddBookmarkAction)->setChecked(false); } void KiwixApp::updateNameMapper() diff --git a/src/kiwixapp.h b/src/kiwixapp.h index ee7901e..5b3322c 100644 --- a/src/kiwixapp.h +++ b/src/kiwixapp.h @@ -46,6 +46,7 @@ public: ToggleFullscreenAction, ToggleTOCAction, ToggleReadingListAction, + ToggleAddBookmarkAction, ZoomInAction, ZoomOutAction, ZoomResetAction, diff --git a/src/mainmenu.cpp b/src/mainmenu.cpp index 54ea0f1..2c0f155 100644 --- a/src/mainmenu.cpp +++ b/src/mainmenu.cpp @@ -35,6 +35,7 @@ MainMenu::MainMenu(QWidget *parent) : m_editMenu.ADD_ACTION(SearchArticleAction); m_editMenu.ADD_ACTION(SearchLibraryAction); m_editMenu.ADD_ACTION(FindInPageAction); + m_editMenu.ADD_ACTION(ToggleAddBookmarkAction); addMenu(&m_editMenu); m_viewMenu.setTitle(gt("view")); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index df3b863..c980c32 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -61,7 +61,7 @@ MainWindow::MainWindow(QWidget *parent) : }); connect(mp_ui->tabBar, &TabBar::currentTitleChanged, - &(mp_ui->mainToolBar->getSearchBar()), &SearchBar::on_currentTitleChanged); + &(mp_ui->mainToolBar->getSearchBar()), &SearchBar::currentTitleChanged); // This signal emited more often than the history really updated // but for now we have no better signal for it. diff --git a/src/searchbar.cpp b/src/searchbar.cpp index 2f0d021..69620c5 100644 --- a/src/searchbar.cpp +++ b/src/searchbar.cpp @@ -6,39 +6,25 @@ #include "kiwixapp.h" #include "suggestionlistworker.h" -SearchButton::SearchButton(QWidget *parent) : - QPushButton(parent), - m_searchMode(true) +BookmarkButton::BookmarkButton(QWidget *parent) : + QToolButton(parent) { - setFlat(true); - setIcon(QIcon(":/icons/search.svg")); - connect(this, &QPushButton::clicked, this, &SearchButton::on_buttonClicked); + connect(this, &QToolButton::triggered, this, &BookmarkButton::on_buttonClicked); + connect(this, &QToolButton::triggered, this, &BookmarkButton::update_display); + setDefaultAction(KiwixApp::instance()->getAction(KiwixApp::Actions::ToggleAddBookmarkAction)); } -void SearchButton::set_searchMode(bool searchMode) +void BookmarkButton::update_display() { - m_searchMode = searchMode; - if (m_searchMode) { - setIcon(QIcon(":/icons/search.svg")); - setIconSize(QSize(27, 27)); - } else { - auto kiwixApp = KiwixApp::instance(); - if (kiwixApp->isCurrentArticleBookmarked()) { - setIcon(QIcon(":/icons/star-active.svg")); - setToolTip(gt("remove-bookmark")); - } else { - setIcon(QIcon(":/icons/star.svg")); - setToolTip(gt("add-bookmark")); - } - setIconSize(QSize(32, 32)); - } + auto isBookMarked = KiwixApp::instance()->isCurrentArticleBookmarked(); + auto buttonText = isBookMarked ? gt("remove-bookmark") : gt("add-bookmark"); + defaultAction()->setChecked(isBookMarked); + defaultAction()->setToolTip(buttonText); + defaultAction()->setText(buttonText); } -void SearchButton::on_buttonClicked() +void BookmarkButton::on_buttonClicked() { - if (m_searchMode) - return; - auto kiwixApp = KiwixApp::instance(); auto library = kiwixApp->getLibrary(); auto tabWidget = kiwixApp->getTabWidget(); @@ -55,14 +41,12 @@ void SearchButton::on_buttonClicked() bookmark.setTitle(tabWidget->currentArticleTitle().toStdString()); library->addBookmark(bookmark); } - set_searchMode(false); library->save(); } -SearchBar::SearchBar(QWidget *parent) : +SearchBarLineEdit::SearchBarLineEdit(QWidget *parent) : QLineEdit(parent), - m_completer(&m_completionModel, this), - m_button(this) + m_completer(&m_completionModel, this) { mp_typingTimer = new QTimer(this); mp_typingTimer->setSingleShot(true); @@ -76,7 +60,7 @@ SearchBar::SearchBar(QWidget *parent) : m_completer.popup()->setStyleSheet(KiwixApp::instance()->parseStyleFromFile(":/css/popup.css")); qRegisterMetaType>("QVector"); - connect(mp_typingTimer, &QTimer::timeout, this, &SearchBar::updateCompletion); + connect(mp_typingTimer, &QTimer::timeout, this, &SearchBarLineEdit::updateCompletion); connect(this, &QLineEdit::textEdited, this, [=](const QString &text) { @@ -103,19 +87,19 @@ SearchBar::SearchBar(QWidget *parent) : }); } -void SearchBar::hideSuggestions() +void SearchBarLineEdit::hideSuggestions() { m_completer.popup()->hide(); } -void SearchBar::clearSuggestions() +void SearchBarLineEdit::clearSuggestions() { QStringList empty; m_completionModel.setStringList(empty); m_urlList.clear(); } -void SearchBar::on_currentTitleChanged(const QString& title) +void SearchBarLineEdit::on_currentTitleChanged(const QString& title) { if (this->hasFocus()) { return; @@ -125,11 +109,10 @@ void SearchBar::on_currentTitleChanged(const QString& title) } else { setText(""); } - m_button.set_searchMode(title.isEmpty()); m_title = title; } -void SearchBar::focusInEvent( QFocusEvent* event) +void SearchBarLineEdit::focusInEvent( QFocusEvent* event) { setReadOnly(false); if (event->reason() == Qt::MouseFocusReason && text() == m_title) { @@ -139,24 +122,22 @@ void SearchBar::focusInEvent( QFocusEvent* event) event->reason() == Qt::MouseFocusReason || event->reason() == Qt::ShortcutFocusReason) { connect(&m_completer, QOverload::of(&QCompleter::activated), - this, QOverload::of(&SearchBar::openCompletion)); + this, QOverload::of(&SearchBarLineEdit::openCompletion)); } QLineEdit::focusInEvent(event); - m_button.set_searchMode(true); } -void SearchBar::focusOutEvent(QFocusEvent* event) +void SearchBarLineEdit::focusOutEvent(QFocusEvent* event) { setReadOnly(true); if (event->reason() == Qt::MouseFocusReason && text().isEmpty()) { - m_button.set_searchMode(false); setText(m_title); } deselect(); return QLineEdit::focusOutEvent(event); } -void SearchBar::updateCompletion() +void SearchBarLineEdit::updateCompletion() { mp_typingTimer->stop(); clearSuggestions(); @@ -184,14 +165,14 @@ void SearchBar::updateCompletion() suggestionWorker->start(); } -void SearchBar::openCompletion(const QModelIndex &index) +void SearchBarLineEdit::openCompletion(const QModelIndex &index) { if (m_urlList.size() != 0) { openCompletion(index.data().toString(), index.row()); } } -void SearchBar::openCompletion(const QString& text, int index) +void SearchBarLineEdit::openCompletion(const QString& text, int index) { QUrl url; if (this->text().compare(text, Qt::CaseInsensitive) == 0) { @@ -201,3 +182,24 @@ void SearchBar::openCompletion(const QString& text, int index) } QTimer::singleShot(0, [=](){KiwixApp::instance()->openUrl(url, false);}); } + +SearchBar::SearchBar(QWidget *parent) : + QToolBar(parent), + m_searchBarLineEdit(this), + m_bookmarkButton(this) +{ + QLabel* searchIconLabel = new QLabel; + searchIconLabel->setObjectName("searchIcon"); + searchIconLabel->setPixmap(QIcon(":/icons/search.svg").pixmap(QSize(27, 27))); + + setIconSize(QSize(32, 32)); + + addWidget(searchIconLabel); + addWidget(&m_searchBarLineEdit); + addWidget(&m_bookmarkButton); + + connect(this, &SearchBar::currentTitleChanged, &m_searchBarLineEdit, + &SearchBarLineEdit::on_currentTitleChanged); + connect(this, &SearchBar::currentTitleChanged, &m_bookmarkButton, + &BookmarkButton::update_display); +} diff --git a/src/searchbar.h b/src/searchbar.h index 378200a..f1295ce 100644 --- a/src/searchbar.h +++ b/src/searchbar.h @@ -5,29 +5,27 @@ #include #include #include -#include +#include #include #include #include +#include -class SearchButton : public QPushButton { +class BookmarkButton : public QToolButton { Q_OBJECT public: - SearchButton(QWidget *parent = nullptr); + BookmarkButton(QWidget *parent = nullptr); public slots: - void set_searchMode(bool searchMode); + void update_display(); void on_buttonClicked(); - -protected: - bool m_searchMode; }; -class SearchBar : public QLineEdit +class SearchBarLineEdit : public QLineEdit { Q_OBJECT public: - SearchBar(QWidget *parent = nullptr); + SearchBarLineEdit(QWidget *parent = nullptr); void hideSuggestions(); public slots: @@ -41,7 +39,6 @@ private: QStringListModel m_completionModel; QCompleter m_completer; QVector m_urlList; - SearchButton m_button; QString m_title; QString m_searchbarInput; bool m_returnPressed = false; @@ -54,4 +51,18 @@ private slots: void openCompletion(const QString& text, int index); }; + +class SearchBar : public QToolBar { + Q_OBJECT +public: + SearchBar(QWidget *parent = nullptr); + SearchBarLineEdit& getLineEdit() { return m_searchBarLineEdit; }; + +signals: + void currentTitleChanged(const QString &title); + +private: + SearchBarLineEdit m_searchBarLineEdit; + BookmarkButton m_bookmarkButton; +}; #endif // SEARCHBAR_H