Skip to content

Commit

Permalink
Add Search page to Optiions dialog
Browse files Browse the repository at this point in the history
  • Loading branch information
glassez committed Jan 17, 2025
1 parent 2d82b6d commit 5017ae8
Show file tree
Hide file tree
Showing 7 changed files with 208 additions and 13 deletions.
26 changes: 26 additions & 0 deletions src/base/preferences.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -655,6 +655,32 @@ void Preferences::setSearchEnabled(const bool enabled)
setValue(u"Preferences/Search/SearchEnabled"_s, enabled);
}

bool Preferences::storeOpenedSearchTabs() const
{
return value(u"Search/StoreOpenedSearchTabs"_s, false);
}

void Preferences::setStoreOpenedSearchTabs(const bool enabled)
{
if (enabled == storeOpenedSearchTabs())
return;

setValue(u"Search/StoreOpenedSearchTabs"_s, enabled);
}

bool Preferences::storeOpenedSearchTabResults() const
{
return value(u"Search/StoreOpenedSearchTabResults"_s, false);
}

void Preferences::setStoreOpenedSearchTabResults(const bool enabled)
{
if (enabled == storeOpenedSearchTabResults())
return;

setValue(u"Search/StoreOpenedSearchTabResults"_s, enabled);
}

bool Preferences::isWebUIEnabled() const
{
#ifdef DISABLE_GUI
Expand Down
6 changes: 6 additions & 0 deletions src/base/preferences.h
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,12 @@ class Preferences final : public QObject
bool isSearchEnabled() const;
void setSearchEnabled(bool enabled);

// Search UI
bool storeOpenedSearchTabs() const;
void setStoreOpenedSearchTabs(bool enabled);
bool storeOpenedSearchTabResults() const;
void setStoreOpenedSearchTabResults(bool enabled);

// HTTP Server
bool isWebUIEnabled() const;
void setWebUIEnabled(bool enabled);
Expand Down
22 changes: 22 additions & 0 deletions src/gui/optionsdialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,7 @@ OptionsDialog::OptionsDialog(IGUIApplication *app, QWidget *parent)
m_ui->tabSelection->item(TAB_DOWNLOADS)->setIcon(UIThemeManager::instance()->getIcon(u"download"_s, u"folder-download"_s));
m_ui->tabSelection->item(TAB_SPEED)->setIcon(UIThemeManager::instance()->getIcon(u"speedometer"_s, u"chronometer"_s));
m_ui->tabSelection->item(TAB_RSS)->setIcon(UIThemeManager::instance()->getIcon(u"application-rss"_s, u"application-rss+xml"_s));
m_ui->tabSelection->item(TAB_SEARCH)->setIcon(UIThemeManager::instance()->getIcon(u"edit-find"_s));
#ifdef DISABLE_WEBUI
m_ui->tabSelection->item(TAB_WEBUI)->setHidden(true);
#else
Expand All @@ -190,6 +191,7 @@ OptionsDialog::OptionsDialog(IGUIApplication *app, QWidget *parent)
loadSpeedTabOptions();
loadBittorrentTabOptions();
loadRSSTabOptions();
loadSearchTabOptions();
#ifndef DISABLE_WEBUI
loadWebUITabOptions();
#endif
Expand Down Expand Up @@ -1273,6 +1275,25 @@ void OptionsDialog::saveRSSTabOptions() const
autoDownloader->setDownloadRepacks(m_ui->checkSmartFilterDownloadRepacks->isChecked());
}

void OptionsDialog::loadSearchTabOptions()
{
const auto *pref = Preferences::instance();

m_ui->groupStoreOpenedTabs->setChecked(pref->storeOpenedSearchTabs());
m_ui->checkStoreTabsSearchResults->setChecked(pref->storeOpenedSearchTabResults());

connect(m_ui->groupStoreOpenedTabs, &QGroupBox::toggled, this, &OptionsDialog::enableApplyButton);
connect(m_ui->checkStoreTabsSearchResults, &QCheckBox::toggled, this, &OptionsDialog::enableApplyButton);
}

void OptionsDialog::saveSearchTabOptions() const
{
auto *pref = Preferences::instance();

pref->setStoreOpenedSearchTabs(m_ui->groupStoreOpenedTabs->isChecked());
pref->setStoreOpenedSearchTabResults(m_ui->checkStoreTabsSearchResults->isChecked());
}

#ifndef DISABLE_WEBUI
void OptionsDialog::loadWebUITabOptions()
{
Expand Down Expand Up @@ -1465,6 +1486,7 @@ void OptionsDialog::saveOptions() const
saveSpeedTabOptions();
saveBittorrentTabOptions();
saveRSSTabOptions();
saveSearchTabOptions();
#ifndef DISABLE_WEBUI
saveWebUITabOptions();
#endif
Expand Down
4 changes: 4 additions & 0 deletions src/gui/optionsdialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ class OptionsDialog final : public GUIApplicationComponent<QDialog>
TAB_SPEED,
TAB_BITTORRENT,
TAB_RSS,
TAB_SEARCH,
TAB_WEBUI,
TAB_ADVANCED
};
Expand Down Expand Up @@ -136,6 +137,9 @@ private slots:
void loadRSSTabOptions();
void saveRSSTabOptions() const;

void loadSearchTabOptions();
void saveSearchTabOptions() const;

#ifndef DISABLE_WEBUI
void loadWebUITabOptions();
void saveWebUITabOptions() const;
Expand Down
84 changes: 84 additions & 0 deletions src/gui/optionsdialog.ui
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,11 @@
<string>RSS</string>
</property>
</item>
<item>
<property name="text">
<string>Search</string>
</property>
</item>
<item>
<property name="text">
<string>WebUI</string>
Expand Down Expand Up @@ -3404,6 +3409,85 @@ Disable encryption: Only connect to peers without protocol encryption</string>
</item>
</layout>
</widget>
<widget class="QWidget" name="tabSearchPage">
<layout class="QVBoxLayout" name="searchPageLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QScrollArea" name="searchPageScrollArea">
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="searchPageScrollAreaWidgetContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>521</width>
<height>541</height>
</rect>
</property>
<layout class="QVBoxLayout" name="searchPageScrollAreaWidgetContentsLayout">
<item>
<widget class="QGroupBox" name="groupSearchUI">
<property name="title">
<string>Search UI</string>
</property>
<layout class="QVBoxLayout" name="groupSearchUILayout">
<item>
<widget class="QGroupBox" name="groupStoreOpenedTabs">
<property name="title">
<string>Store opened tabs</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>false</bool>
</property>
<layout class="QVBoxLayout" name="groupStoreOpenedTabsLayout">
<item>
<widget class="QCheckBox" name="checkStoreTabsSearchResults">
<property name="text">
<string>Also store search results</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="searchPageScrollAreaSpacer">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>422</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tabWebUIPage">
<layout class="QVBoxLayout" name="tabWebUIPageLayout">
<property name="leftMargin">
Expand Down
74 changes: 61 additions & 13 deletions src/gui/search/searchwidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,6 @@

#include <utility>

#ifdef Q_OS_WIN
#include <cstdlib>
#endif

#include <QDebug>
#include <QEvent>
#include <QJsonArray>
Expand All @@ -55,6 +51,7 @@

#include "base/global.h"
#include "base/logger.h"
#include "base/preferences.h"
#include "base/profile.h"
#include "base/search/searchhandler.h"
#include "base/search/searchpluginmanager.h"
Expand Down Expand Up @@ -257,6 +254,9 @@ SearchWidget::SearchWidget(IGUIApplication *app, QWidget *parent)
const auto *focusSearchHotkeyAlternative = new QShortcut((Qt::CTRL | Qt::Key_E), this);
connect(focusSearchHotkeyAlternative, &QShortcut::activated, this, &SearchWidget::toggleFocusBetweenLineEdits);

configure();
connect(Preferences::instance(), &Preferences::changed, this, &SearchWidget::configure);

restoreState();
}

Expand Down Expand Up @@ -291,6 +291,44 @@ bool SearchWidget::eventFilter(QObject *object, QEvent *event)
return QWidget::eventFilter(object, event);
}

void SearchWidget::configure()
{
const auto *pref = Preferences::instance();

const bool storeOpenedTabs = pref->storeOpenedSearchTabs();
const bool isStoreOpenedTabsChanged = storeOpenedTabs != m_storeOpenedTabs;
if (isStoreOpenedTabsChanged)
{
m_storeOpenedTabs = storeOpenedTabs;
if (m_storeOpenedTabs)
{
// TODO: Store all tabs.
}
else
{
// TODO: Delete all stored tabs.
}
}


const bool storeOpenedTabsResults = pref->storeOpenedSearchTabResults();
const bool isStoreOpenedTabsResultsChanged = storeOpenedTabsResults != m_storeOpenedTabsResults;
if (isStoreOpenedTabsResultsChanged)
m_storeOpenedTabsResults = storeOpenedTabsResults;

if (isStoreOpenedTabsResultsChanged || isStoreOpenedTabsChanged)
{
if (m_storeOpenedTabsResults)
{
// TODO: Store all tabs results.
}
else
{
// TODO: Delete all stored tabs results.
}
}
}

void SearchWidget::fillCatCombobox()
{
m_ui->comboCategory->clear();
Expand Down Expand Up @@ -411,6 +449,9 @@ void SearchWidget::saveSearchResults(SearchJobWidget *searchJobWidget) const

void SearchWidget::saveState() const
{
if (!m_storeOpenedTabs)
return;

QJsonArray tabsList;
for (int tabIndex = 0; tabIndex < m_ui->tabWidget->count(); ++tabIndex)
{
Expand All @@ -437,6 +478,9 @@ void SearchWidget::saveState() const

void SearchWidget::restoreState()
{
if (!m_storeOpenedTabs)
return;

const int fileMaxSize = 10 * 1024 * 1024;
const Path stateFilePath = makeDataFilePath(STATE_FILE_NAME);
const auto readResult = Utils::IO::readFile(stateFilePath, fileMaxSize);
Expand Down Expand Up @@ -519,15 +563,18 @@ void SearchWidget::restoreState()
{
QList<SearchResult> searchResults;

const Path tabStateFilePath = makeDataFilePath(tabID + u".json");
if (const auto loadTabStateResult = loadSearchResults(tabStateFilePath))
if (m_storeOpenedTabsResults)
{
searchResults = loadTabStateResult.value();
}
else
{
LogMsg(tr("Failed to load saved search results. Tab: \"%1\". File: \"%2\". Error: \"%3\"")
.arg(searchPattern, tabStateFilePath.toString(), loadTabStateResult.error()), Log::WARNING);
const Path tabStateFilePath = makeDataFilePath(tabID + u".json");
if (const auto loadTabStateResult = loadSearchResults(tabStateFilePath))
{
searchResults = loadTabStateResult.value();
}
else
{
LogMsg(tr("Failed to load saved search results. Tab: \"%1\". File: \"%2\". Error: \"%3\"")
.arg(searchPattern, tabStateFilePath.toString(), loadTabStateResult.error()), Log::WARNING);
}
}

auto *restoredTab = new SearchJobWidget(tabID, searchPattern, searchResults, app(), this);
Expand Down Expand Up @@ -715,7 +762,8 @@ void SearchWidget::tabStatusChanged(SearchJobWidget *tab)

emit searchFinished(tab->status() == SearchJobWidget::Status::Error);

saveSearchResults(tab);
if (m_storeOpenedTabsResults)
saveSearchResults(tab);
}
}

Expand Down
5 changes: 5 additions & 0 deletions src/gui/search/searchwidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ class SearchWidget : public GUIApplicationComponent<QWidget>
private:
bool eventFilter(QObject *object, QEvent *event) override;

void configure();

void pluginsButtonClicked();
void searchButtonClicked();
void stopButtonClicked();
Expand Down Expand Up @@ -100,4 +102,7 @@ class SearchWidget : public GUIApplicationComponent<QWidget>
QPointer<SearchJobWidget> m_currentSearchTab; // Selected tab
bool m_isNewQueryString = false;
QSet<QString> m_tabIDs;

bool m_storeOpenedTabs = false;
bool m_storeOpenedTabsResults = false;
};

0 comments on commit 5017ae8

Please sign in to comment.