Introduce MultiZim Search Button

User can search zim other than the current tab.
This commit is contained in:
ShaopengLin 2024-10-28 18:16:02 -04:00 committed by Kelson
parent bdfcc88425
commit 95ccd7602c
6 changed files with 118 additions and 7 deletions

View File

@ -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 \

75
src/multizimbutton.cpp Normal file
View File

@ -0,0 +1,75 @@
#include <QListWidget>
#include <QMenu>
#include <QWidgetAction>
#include <QButtonGroup>
#include <QRadioButton>
#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<QRadioButton *>(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<QRadioButton *>(mp_buttonList->itemWidget(listItem));
if (radioBt && radioBt->isChecked())
idList.append(listItem->data(Qt::UserRole).toString());
}
return idList;
}

24
src/multizimbutton.h Normal file
View File

@ -0,0 +1,24 @@
#ifndef MULTIZIMBUTTON_H
#define MULTIZIMBUTTON_H
#include <QToolButton>
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

View File

@ -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);
}

View File

@ -11,6 +11,7 @@
#include <QThread>
#include <QToolBar>
#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

View File

@ -14,13 +14,13 @@ void SuggestionListWorker::run()
{
QList<SuggestionData> 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");