Skip to content

Commit

Permalink
Added Multi-Zim Radio Select
Browse files Browse the repository at this point in the history
User can choose which zim to search
  • Loading branch information
ShaopengLin committed Aug 28, 2024
1 parent a64e1a0 commit 2feeb7b
Show file tree
Hide file tree
Showing 4 changed files with 173 additions and 8 deletions.
47 changes: 47 additions & 0 deletions resources/css/style.css
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
106 changes: 103 additions & 3 deletions src/searchbar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

#include <QCompleter>
#include <QFocusEvent>
#include <QRadioButton>
#include <QWidgetAction>

#include "kiwixapp.h"
#include "suggestionlistworker.h"
Expand Down Expand Up @@ -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<const QModelIndex &>::of(&QCompleter::activated),
this, QOverload<const QModelIndex &>::of(&SearchBarLineEdit::openCompletion));
this, QOverload<const QModelIndex &>::of(&SearchBarLineEdit::openCompletion), Qt::UniqueConnection);
}
QLineEdit::focusInEvent(event);
}
Expand Down Expand Up @@ -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");
Expand All @@ -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<SearchBar *>(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<QRadioButton *>(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<zim::Archive> 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<QRadioButton *>(mp_buttonList->itemWidget(mp_buttonList->item(0)))->setChecked(true);
mp_buttonList->scrollToTop();
}
}
17 changes: 17 additions & 0 deletions src/searchbar.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
#include <QToolBar>
#include "suggestionlistmodel.h"

class QListWidget;

class BookmarkButton : public QToolButton {
Q_OBJECT
public:
Expand Down Expand Up @@ -51,18 +53,33 @@ 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);

private:
SearchBarLineEdit m_searchBarLineEdit;
BookmarkButton m_bookmarkButton;
MultiZimButton m_multiZimButton;
};
#endif // SEARCHBAR_H
11 changes: 6 additions & 5 deletions src/suggestionlistworker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,12 @@ void SuggestionListWorker::run()
QStringList suggestionList;
QVector<QUrl> 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;
Expand Down

0 comments on commit 2feeb7b

Please sign in to comment.