diff --git a/resources/css/style.css b/resources/css/style.css index 05ed9f60..55a87d71 100644 --- a/resources/css/style.css +++ b/resources/css/style.css @@ -73,6 +73,53 @@ SearchBar > BookmarkButton { margin-left: 3px; } +SearchBar > MultiZimButton { + margin-right: 3px; + margin-left: 3px; +} + +MultiZimButton QListWidget { + background-color: white; +} + +MultiZimButton QFrame { + background-color: white; + padding: 0px; + margin: 0px; + border: none; +} + +MultiZimButton QScrollBar { + width: 5px; + border: none; + outline: none; +} + +MultiZimButton QRadioButton { + background-color: white; +} + +MultiZimButton QRadioButton:hover { + border: 1px solid #3366CC; + background-color: #D9E9FF; +} + +MultiZimButton QRadioButton::indicator{ + padding-left: 5px; + padding-right: 5px; + width: 32px; + height: 32px; + image: none; +} + +MultiZimButton QRadioButton::indicator:checked { + image: url(:/icons/tick.svg); +} + +MultiZimButton QScrollBar::handle { + background-color: grey; +} + SearchBar > QToolButton:pressed, SearchBar > QToolButton:hover { border: 1px solid #3366CC; diff --git a/src/searchbar.cpp b/src/searchbar.cpp index 476978c6..724499d0 100644 --- a/src/searchbar.cpp +++ b/src/searchbar.cpp @@ -2,6 +2,8 @@ #include #include +#include +#include #include "kiwixapp.h" #include "suggestionlistworker.h" @@ -133,9 +135,10 @@ void SearchBarLineEdit::focusInEvent( QFocusEvent* event) } if (event->reason() == Qt::ActiveWindowFocusReason || event->reason() == Qt::MouseFocusReason || - event->reason() == Qt::ShortcutFocusReason) { + event->reason() == Qt::ShortcutFocusReason || + event->reason() == Qt::PopupFocusReason) { connect(&m_completer, QOverload::of(&QCompleter::activated), - this, QOverload::of(&SearchBarLineEdit::openCompletion)); + this, QOverload::of(&SearchBarLineEdit::openCompletion), Qt::UniqueConnection); } QLineEdit::focusInEvent(event); } @@ -232,7 +235,8 @@ void SearchBarLineEdit::openCompletion(const QModelIndex &index) SearchBar::SearchBar(QWidget *parent) : QToolBar(parent), m_searchBarLineEdit(this), - m_bookmarkButton(this) + m_bookmarkButton(this), + m_multiZimButton(this) { QLabel* searchIconLabel = new QLabel; searchIconLabel->setObjectName("searchIcon"); @@ -243,9 +247,105 @@ SearchBar::SearchBar(QWidget *parent) : addWidget(searchIconLabel); addWidget(&m_searchBarLineEdit); addWidget(&m_bookmarkButton); + addWidget(&m_multiZimButton); connect(this, &SearchBar::currentTitleChanged, &m_searchBarLineEdit, &SearchBarLineEdit::on_currentTitleChanged); connect(this, &SearchBar::currentTitleChanged, &m_bookmarkButton, &BookmarkButton::update_display); } + +MultiZimButton::MultiZimButton(QWidget *parent) : QToolButton(parent), mp_buttonList(nullptr) +{ + setMenu(new QMenu(this)); + setPopupMode(QToolButton::MenuButtonPopup); + setIcon(QIcon(":/icons/filter.svg")); + setToolTip("MultiZim Search"); + mp_buttonList = new QListWidget(this); + auto popupAction = new QWidgetAction(menu()); + popupAction->setDefaultWidget(mp_buttonList); + menu()->addAction(popupAction); + mp_buttonList->setMinimumWidth(menu()->sizeHint().width()); + mp_buttonList->setMinimumHeight(42 * 7); + mp_buttonList->setSelectionMode(QAbstractItemView::SelectionMode::SingleSelection); + update_display(); + + connect(KiwixApp::instance()->getContentManager(), &ContentManager::booksChanged, this, &MultiZimButton::update_display); + connect(qobject_cast(parent), &SearchBar::currentTitleChanged, this, &MultiZimButton::update_display); +} + +QString MultiZimButton::getZimId() const +{ + for (int row = 0; row < mp_buttonList->model()->rowCount(); row++) + { + auto listItem = mp_buttonList->item(row); + if (qobject_cast(mp_buttonList->itemWidget(listItem))->isChecked()) + { + return mp_buttonList->item(row)->data(Qt::UserRole).toString(); + } + } + return QString{}; +} + +void MultiZimButton::update_display() +{ + mp_buttonList->clear(); + WebView* current = nullptr; + if (KiwixApp::instance()->getMainWindow()) + current = KiwixApp::instance()->getTabWidget()->currentWebView(); + for (const auto& bookId : KiwixApp::instance()->getLibrary()->getBookIds()) + { + std::shared_ptr archive; + QString bookTitle; + auto library = KiwixApp::instance()->getLibrary(); + try + { + archive = library->getArchive(bookId); + bookTitle = QString::fromStdString(library->getBookById(bookId).getTitle()); + } + catch (...) + { + continue; + } + + QIcon zimIcon; + try + { + zimIcon = library->getIconFromArchive(archive); + } + catch (...) + { + zimIcon = QIcon(":/icons/placeholder-icon.png"); + } + QRadioButton* radioBt = new QRadioButton; + radioBt->setIcon(zimIcon); + radioBt->setIconSize(QSize(32, 32)); + radioBt->setFont(QFont("Selawik", 16)); + + QFontMetrics metrics(radioBt->font()); + QString elidedText = metrics.elidedText(bookTitle, Qt::ElideRight, mp_buttonList->width() - 100); + radioBt->setText(elidedText); + + auto item = new QListWidgetItem; + item->setSizeHint(QSize(0, 42)); + item->setData(Qt::UserRole, bookId); + if (current && current->zimId() == bookId) + { + QFontMetrics metrics(radioBt->font()); + QString elidedText = metrics.elidedText("* " + bookTitle, Qt::ElideRight, mp_buttonList->width() - 100); + radioBt->setText(elidedText); + mp_buttonList->insertItem(0, item); + } + else + mp_buttonList->addItem(item); + mp_buttonList->setItemWidget(item, radioBt); + } + if (mp_buttonList->model()->rowCount() == 0) + setDisabled(true); + else + { + setEnabled(true); + qobject_cast(mp_buttonList->itemWidget(mp_buttonList->item(0)))->setChecked(true); + mp_buttonList->scrollToTop(); + } +} diff --git a/src/searchbar.h b/src/searchbar.h index dade25ef..d714db98 100644 --- a/src/searchbar.h +++ b/src/searchbar.h @@ -12,6 +12,8 @@ #include #include "suggestionlistmodel.h" +class QListWidget; + class BookmarkButton : public QToolButton { Q_OBJECT public: @@ -51,12 +53,26 @@ private slots: void openCompletion(const QModelIndex& index); }; +class MultiZimButton : public QToolButton { + Q_OBJECT +public: + MultiZimButton(QWidget *parent = nullptr); + QString getZimId() const; + +public slots: + void update_display(); + +private: + QListWidget* mp_buttonList; + QString m_zimId; +}; class SearchBar : public QToolBar { Q_OBJECT public: SearchBar(QWidget *parent = nullptr); SearchBarLineEdit& getLineEdit() { return m_searchBarLineEdit; }; + MultiZimButton& getMultiZimButton() { return m_multiZimButton; }; signals: void currentTitleChanged(const QString &title); @@ -64,5 +80,6 @@ class SearchBar : public QToolBar { private: SearchBarLineEdit m_searchBarLineEdit; BookmarkButton m_bookmarkButton; + MultiZimButton m_multiZimButton; }; #endif // SEARCHBAR_H diff --git a/src/suggestionlistworker.cpp b/src/suggestionlistworker.cpp index 057546ce..0793a1de 100644 --- a/src/suggestionlistworker.cpp +++ b/src/suggestionlistworker.cpp @@ -15,11 +15,12 @@ void SuggestionListWorker::run() QStringList suggestionList; QVector urlList; - WebView *current = KiwixApp::instance()->getTabWidget()->currentWebView(); - if(!current) - return; - auto qurl = current->url(); - auto currentZimId = qurl.host().split(".")[0]; + // WebView *current = KiwixApp::instance()->getTabWidget()->currentWebView(); + // if(!current) + // return; + auto currentZimId = KiwixApp::instance()->getMainWindow()->getTopWidget()->getSearchBar().getMultiZimButton().getZimId(); + // auto qurl = current->url(); + // auto currentZimId = qurl.host().split(".")[0]; try { auto archive = KiwixApp::instance()->getLibrary()->getArchive(currentZimId); QUrl url;