mirror of
https://github.com/kiwix/kiwix-desktop.git
synced 2025-09-22 19:46:12 -04:00
Introduce MultiZim Search Button
User can search zim other than the current tab.
This commit is contained in:
parent
bdfcc88425
commit
95ccd7602c
@ -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
75
src/multizimbutton.cpp
Normal 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
24
src/multizimbutton.h
Normal 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
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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");
|
||||
|
Loading…
x
Reference in New Issue
Block a user