diff --git a/kiwix-desktop.pro b/kiwix-desktop.pro index 9fb0c12..8d370af 100644 --- a/kiwix-desktop.pro +++ b/kiwix-desktop.pro @@ -91,6 +91,7 @@ SOURCES += \ src/fullscreenwindow.cpp \ src/fullscreennotification.cpp \ src/zimview.cpp \ + src/multizimbutton.cpp \ HEADERS += \ src/choiceitem.h \ @@ -143,6 +144,7 @@ HEADERS += \ src/zimview.h \ src/portutils.h \ src/css_constants.h \ + src/multizimbutton.h \ FORMS += \ src/choiceitem.ui \ diff --git a/src/multizimbutton.cpp b/src/multizimbutton.cpp new file mode 100644 index 0000000..10850e5 --- /dev/null +++ b/src/multizimbutton.cpp @@ -0,0 +1,75 @@ +#include +#include +#include +#include +#include +#include "kiwixapp.h" +#include "multizimbutton.h" + +MultiZimButton::MultiZimButton(QWidget *parent) : + QToolButton(parent), + mp_buttonList(new QListWidget), + mp_radioButtonGroup(new QButtonGroup(this)) +{ + setMenu(new QMenu(this)); + setPopupMode(QToolButton::InstantPopup); + + const auto popupAction = new QWidgetAction(menu()); + popupAction->setDefaultWidget(mp_buttonList); + menu()->addAction(popupAction); +} + +void MultiZimButton::updateDisplay() +{ + mp_buttonList->clear(); + for (const auto& button : mp_radioButtonGroup->buttons()) + mp_radioButtonGroup->removeButton(button); + + const auto library = KiwixApp::instance()->getLibrary(); + for (const auto& bookId : library->getBookIds()) + { + try + { + library->getArchive(bookId); + } catch (...) { continue; } + + const QString bookTitle = QString::fromStdString(library->getBookById(bookId).getTitle()); + const QIcon zimIcon = library->getBookIcon(bookId); + + const auto item = new QListWidgetItem(); + item->setData(Qt::UserRole, bookId); + item->setData(Qt::DisplayRole, bookTitle); + + const auto radioBt = new QRadioButton(bookTitle); + radioBt->setIcon(zimIcon); + mp_radioButtonGroup->addButton(radioBt); + + mp_buttonList->addItem(item); + mp_buttonList->setItemWidget(item, radioBt); + } + + mp_buttonList->sortItems(); + + /* Display should not be used other than for sorting. */ + for (int i = 0; i < mp_buttonList->count(); i++) + mp_buttonList->item(i)->setData(Qt::DisplayRole, QVariant()); + + setDisabled(mp_buttonList->model()->rowCount() == 0); + + const auto firstWidget = mp_buttonList->itemWidget(mp_buttonList->item(0)); + if (const auto firstBt = qobject_cast(firstWidget)) + firstBt->setChecked(true); +} + +QStringList MultiZimButton::getZimIds() const +{ + QStringList idList; + for (int row = 0; row < mp_buttonList->count(); row++) + { + const auto listItem = mp_buttonList->item(row); + const auto radioBt = qobject_cast(mp_buttonList->itemWidget(listItem)); + if (radioBt && radioBt->isChecked()) + idList.append(listItem->data(Qt::UserRole).toString()); + } + return idList; +} diff --git a/src/multizimbutton.h b/src/multizimbutton.h new file mode 100644 index 0000000..e21b423 --- /dev/null +++ b/src/multizimbutton.h @@ -0,0 +1,24 @@ +#ifndef MULTIZIMBUTTON_H +#define MULTIZIMBUTTON_H + +#include + +class QListWidget; +class QButtonGroup; + +class MultiZimButton : public QToolButton { + Q_OBJECT + +public: + explicit MultiZimButton(QWidget *parent = nullptr); + +public slots: + void updateDisplay(); + QStringList getZimIds() const; + +private: + QListWidget* mp_buttonList; + QButtonGroup* mp_radioButtonGroup; +}; + +#endif // MULTIZIMBUTTON_H diff --git a/src/searchbar.cpp b/src/searchbar.cpp index 253dcc8..792dce1 100644 --- a/src/searchbar.cpp +++ b/src/searchbar.cpp @@ -414,7 +414,8 @@ QRect SearchBarLineEdit::getCompleterRect() const 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"); @@ -425,9 +426,15 @@ 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); + connect(KiwixApp::instance()->getContentManager(), + &ContentManager::booksChanged, &m_multiZimButton, + &MultiZimButton::updateDisplay); + connect(this, &SearchBar::currentTitleChanged, &m_multiZimButton, + &MultiZimButton::updateDisplay); } diff --git a/src/searchbar.h b/src/searchbar.h index 8b6b4e0..1a9f654 100644 --- a/src/searchbar.h +++ b/src/searchbar.h @@ -11,6 +11,7 @@ #include #include #include "suggestionlistmodel.h" +#include "multizimbutton.h" class QTreeView; @@ -78,6 +79,7 @@ class SearchBar : public QToolBar { public: SearchBar(QWidget *parent = nullptr); SearchBarLineEdit& getLineEdit() { return m_searchBarLineEdit; }; + MultiZimButton& getMultiZimButton() { return m_multiZimButton; }; signals: void currentTitleChanged(const QString &title); @@ -85,5 +87,6 @@ signals: private: SearchBarLineEdit m_searchBarLineEdit; BookmarkButton m_bookmarkButton; + MultiZimButton m_multiZimButton; }; #endif // SEARCHBAR_H diff --git a/src/suggestionlistworker.cpp b/src/suggestionlistworker.cpp index 9230ef0..5f328b0 100644 --- a/src/suggestionlistworker.cpp +++ b/src/suggestionlistworker.cpp @@ -14,13 +14,13 @@ void SuggestionListWorker::run() { QList suggestionList; - WebView *current = KiwixApp::instance()->getTabWidget()->currentWebView(); - if(!current) - return; - auto qurl = current->url(); - auto currentZimId = qurl.host().split(".")[0]; + const auto app = KiwixApp::instance(); + const auto selectedIdList = app->getSearchBar().getMultiZimButton().getZimIds(); + + /* TODO: re-implement this after introducing the actual Multi-Zim. */ + const auto currentZimId = selectedIdList[0]; try { - auto archive = KiwixApp::instance()->getLibrary()->getArchive(currentZimId); + const auto archive = app->getLibrary()->getArchive(currentZimId); QUrl url; url.setScheme("zim"); url.setHost(currentZimId + ".zim");