diff --git a/src/base/preferences.cpp b/src/base/preferences.cpp index bacaa4add..1e8e943d3 100644 --- a/src/base/preferences.cpp +++ b/src/base/preferences.cpp @@ -1256,22 +1256,24 @@ void Preferences::setMainGeometry(const QByteArray &geometry) setValue(u"MainWindow/geometry"_qs, geometry); } -QByteArray Preferences::getMainVSplitterState() const +bool Preferences::isFiltersSidebarVisible() const { -#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) - return value(u"GUI/Qt6/MainWindow/VSplitterState"_qs); -#else - return value(u"MainWindow/qt5/vsplitterState"_qs); -#endif + return value(u"GUI/MainWindow/FiltersSidebarVisible"_qs, true); } -void Preferences::setMainVSplitterState(const QByteArray &state) +void Preferences::setFiltersSidebarVisible(const bool value) { -#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) - setValue(u"GUI/Qt6/MainWindow/VSplitterState"_qs, state); -#else - setValue(u"MainWindow/qt5/vsplitterState"_qs, state); -#endif + setValue(u"GUI/MainWindow/FiltersSidebarVisible"_qs, value); +} + +int Preferences::getFiltersSidebarWidth() const +{ + return value(u"GUI/MainWindow/FiltersSidebarWidth"_qs, 120); +} + +void Preferences::setFiltersSidebarWidth(const int value) +{ + setValue(u"GUI/MainWindow/FiltersSidebarWidth"_qs, value); } Path Preferences::getMainLastDir() const diff --git a/src/base/preferences.h b/src/base/preferences.h index 8186d5175..9bfa3add4 100644 --- a/src/base/preferences.h +++ b/src/base/preferences.h @@ -340,8 +340,10 @@ public: void setAcceptedLegal(bool accepted); QByteArray getMainGeometry() const; void setMainGeometry(const QByteArray &geometry); - QByteArray getMainVSplitterState() const; - void setMainVSplitterState(const QByteArray &state); + bool isFiltersSidebarVisible() const; + void setFiltersSidebarVisible(bool value); + int getFiltersSidebarWidth() const; + void setFiltersSidebarWidth(int value); Path getMainLastDir() const; void setMainLastDir(const Path &path); QByteArray getPeerListState() const; diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp index db2884e96..fc7094389 100644 --- a/src/gui/mainwindow.cpp +++ b/src/gui/mainwindow.cpp @@ -223,13 +223,10 @@ MainWindow::MainWindow(QWidget *parent) // m_transferListWidget->setStyleSheet("QTreeView {border: none;}"); // borderless m_propertiesWidget = new PropertiesWidget(hSplitter); connect(m_transferListWidget, &TransferListWidget::currentTorrentChanged, m_propertiesWidget, &PropertiesWidget::loadTorrentInfos); - m_transferListFiltersWidget = new TransferListFiltersWidget(m_splitter, m_transferListWidget, isDownloadTrackerFavicon()); hSplitter->addWidget(m_transferListWidget); hSplitter->addWidget(m_propertiesWidget); - m_splitter->addWidget(m_transferListFiltersWidget); m_splitter->addWidget(hSplitter); - m_splitter->setCollapsible(0, true); - m_splitter->setCollapsible(1, false); + m_splitter->setCollapsible(0, false); m_tabs->addTab(m_splitter, #ifndef Q_OS_MACOS UIThemeManager::instance()->getIcon(u"folder-remote"_qs), @@ -238,12 +235,8 @@ MainWindow::MainWindow(QWidget *parent) connect(m_searchFilter, &LineEdit::textChanged, m_transferListWidget, &TransferListWidget::applyNameFilter); connect(hSplitter, &QSplitter::splitterMoved, this, &MainWindow::writeSettings); - connect(m_splitter, &QSplitter::splitterMoved, this, &MainWindow::writeSettings); + connect(m_splitter, &QSplitter::splitterMoved, this, &MainWindow::writeSplitterSettings); connect(BitTorrent::Session::instance(), &BitTorrent::Session::trackersChanged, m_propertiesWidget, &PropertiesWidget::loadTrackers); - connect(BitTorrent::Session::instance(), &BitTorrent::Session::trackersAdded, m_transferListFiltersWidget, &TransferListFiltersWidget::addTrackers); - connect(BitTorrent::Session::instance(), &BitTorrent::Session::trackersRemoved, m_transferListFiltersWidget, &TransferListFiltersWidget::removeTrackers); - connect(BitTorrent::Session::instance(), &BitTorrent::Session::trackerlessStateChanged, m_transferListFiltersWidget, &TransferListFiltersWidget::changeTrackerless); - connect(BitTorrent::Session::instance(), &BitTorrent::Session::trackerEntriesUpdated, m_transferListFiltersWidget, &TransferListFiltersWidget::trackerEntriesUpdated); #ifdef Q_OS_MACOS // Increase top spacing to avoid tab overlapping @@ -435,6 +428,20 @@ MainWindow::MainWindow(QWidget *parent) m_propertiesWidget->readSettings(); + const bool isFiltersSidebarVisible = pref->isFiltersSidebarVisible(); + m_ui->actionShowFiltersSidebar->setChecked(isFiltersSidebarVisible); + if (isFiltersSidebarVisible) + { + showFiltersSidebar(true); + } + else + { + m_transferListWidget->applyStatusFilter(pref->getTransSelFilter()); + m_transferListWidget->applyCategoryFilter(QString()); + m_transferListWidget->applyTagFilter(QString()); + m_transferListWidget->applyTrackerFilterAll(); + } + // Start watching the executable for updates m_executableWatcher = new QFileSystemWatcher(this); connect(m_executableWatcher, &QFileSystemWatcher::fileChanged, this, &MainWindow::notifyOfUpdate); @@ -538,7 +545,8 @@ bool MainWindow::isDownloadTrackerFavicon() const void MainWindow::setDownloadTrackerFavicon(const bool value) { - m_transferListFiltersWidget->setDownloadTrackerFavicon(value); + if (m_transferListFiltersWidget) + m_transferListFiltersWidget->setDownloadTrackerFavicon(value); m_storeDownloadTrackerFavicon = value; } @@ -784,11 +792,16 @@ void MainWindow::writeSettings() { Preferences *const pref = Preferences::instance(); pref->setMainGeometry(saveGeometry()); - // Splitter size - pref->setMainVSplitterState(m_splitter->saveState()); m_propertiesWidget->saveSettings(); } +void MainWindow::writeSplitterSettings() +{ + Q_ASSERT(m_splitter->widget(0) == m_transferListFiltersWidget); + Preferences *const pref = Preferences::instance(); + pref->setFiltersSidebarWidth(m_splitter->sizes()[0]); +} + void MainWindow::cleanup() { writeSettings(); @@ -817,12 +830,6 @@ void MainWindow::readSettings() const QByteArray mainGeo = pref->getMainGeometry(); if (!mainGeo.isEmpty() && restoreGeometry(mainGeo)) m_posInitialized = true; - const QByteArray splitterState = pref->getMainVSplitterState(); - if (splitterState.isEmpty()) - // Default sizes - m_splitter->setSizes({ 120, m_splitter->width() - 120 }); - else - m_splitter->restoreState(splitterState); } void MainWindow::balloonClicked() @@ -1475,6 +1482,33 @@ void MainWindow::showStatusBar(bool show) } } +void MainWindow::showFiltersSidebar(const bool show) +{ + Preferences *const pref = Preferences::instance(); + + if (show && !m_transferListFiltersWidget) + { + const int width = pref->getFiltersSidebarWidth(); + m_transferListFiltersWidget = new TransferListFiltersWidget(m_splitter, m_transferListWidget, isDownloadTrackerFavicon()); + m_splitter->insertWidget(0, m_transferListFiltersWidget); + m_splitter->setCollapsible(0, true); + m_splitter->setSizes({width, (m_splitter->width() - width)}); + + connect(BitTorrent::Session::instance(), &BitTorrent::Session::trackersAdded, m_transferListFiltersWidget, &TransferListFiltersWidget::addTrackers); + connect(BitTorrent::Session::instance(), &BitTorrent::Session::trackersRemoved, m_transferListFiltersWidget, &TransferListFiltersWidget::removeTrackers); + connect(BitTorrent::Session::instance(), &BitTorrent::Session::trackerlessStateChanged, m_transferListFiltersWidget, &TransferListFiltersWidget::changeTrackerless); + connect(BitTorrent::Session::instance(), &BitTorrent::Session::trackerEntriesUpdated, m_transferListFiltersWidget, &TransferListFiltersWidget::trackerEntriesUpdated); + } + else if (!show && m_transferListFiltersWidget) + { + Q_ASSERT(m_splitter->widget(0) == m_transferListFiltersWidget); + + pref->setFiltersSidebarWidth(m_splitter->sizes()[0]); + delete m_transferListFiltersWidget; + m_transferListFiltersWidget = nullptr; + } +} + void MainWindow::loadPreferences() { const Preferences *pref = Preferences::instance(); @@ -1801,6 +1835,13 @@ void MainWindow::on_actionShowStatusbar_triggered() showStatusBar(isVisible); } +void MainWindow::on_actionShowFiltersSidebar_triggered(const bool checked) +{ + Preferences *const pref = Preferences::instance(); + pref->setFiltersSidebarVisible(checked); + showFiltersSidebar(checked); +} + void MainWindow::on_actionSpeedInTitleBar_triggered() { m_displaySpeedInTitle = static_cast(sender())->isChecked(); diff --git a/src/gui/mainwindow.h b/src/gui/mainwindow.h index 52c5252c8..a14894a65 100644 --- a/src/gui/mainwindow.h +++ b/src/gui/mainwindow.h @@ -115,6 +115,7 @@ private slots: void showFilterContextMenu(); void balloonClicked(); void writeSettings(); + void writeSplitterSettings(); void readSettings(); void fullDiskError(BitTorrent::Torrent *const torrent, const QString &msg) const; void handleDownloadFromUrlFailure(const QString &, const QString &) const; @@ -158,6 +159,7 @@ private slots: void on_actionSpeedInTitleBar_triggered(); void on_actionTopToolBar_triggered(); void on_actionShowStatusbar_triggered(); + void on_actionShowFiltersSidebar_triggered(bool checked); void on_actionDonateMoney_triggered(); void on_actionExecutionLogs_triggered(bool checked); void on_actionNormalMessages_triggered(bool checked); @@ -214,6 +216,7 @@ private: void displaySearchTab(bool enable); void createTorrentTriggered(const Path &path); void showStatusBar(bool show); + void showFiltersSidebar(bool show); Ui::MainWindow *m_ui; @@ -234,7 +237,7 @@ private: QPointer m_trayIconMenu; TransferListWidget *m_transferListWidget; - TransferListFiltersWidget *m_transferListFiltersWidget; + TransferListFiltersWidget *m_transferListFiltersWidget = nullptr; PropertiesWidget *m_propertiesWidget; bool m_displaySpeedInTitle; bool m_forceExit = false; diff --git a/src/gui/mainwindow.ui b/src/gui/mainwindow.ui index a3e17d0db..1a8d7d259 100644 --- a/src/gui/mainwindow.ui +++ b/src/gui/mainwindow.ui @@ -112,6 +112,7 @@ + @@ -307,6 +308,14 @@ Status &Bar + + + true + + + Filters Sidebar + + true diff --git a/src/webui/www/private/index.html b/src/webui/www/private/index.html index 0726ce732..0bd78fa6b 100644 --- a/src/webui/www/private/index.html +++ b/src/webui/www/private/index.html @@ -73,6 +73,7 @@
  • QBT_TR(Top Toolbar)QBT_TR[CONTEXT=MainWindow]QBT_TR(Top Toolbar)QBT_TR[CONTEXT=MainWindow]
  • QBT_TR(Status Bar)QBT_TR[CONTEXT=MainWindow]QBT_TR(Status Bar)QBT_TR[CONTEXT=MainWindow]
  • +
  • QBT_TR(Filters Sidebar)QBT_TR[CONTEXT=MainWindow]QBT_TR(Filters Sidebar)QBT_TR[CONTEXT=MainWindow]
  • QBT_TR(Speed in Title Bar)QBT_TR[CONTEXT=MainWindow]QBT_TR(Speed in Title Bar)QBT_TR[CONTEXT=MainWindow]
  • QBT_TR(Search Engine)QBT_TR[CONTEXT=MainWindow]QBT_TR(Search Engine)QBT_TR[CONTEXT=MainWindow]
  • QBT_TR(RSS)QBT_TR[CONTEXT=MainWindow]QBT_TR(RSS Reader)QBT_TR[CONTEXT=MainWindow]
  • diff --git a/src/webui/www/private/scripts/client.js b/src/webui/www/private/scripts/client.js index 94b9ec558..63ff6ac23 100644 --- a/src/webui/www/private/scripts/client.js +++ b/src/webui/www/private/scripts/client.js @@ -87,6 +87,12 @@ const loadSelectedTracker = function() { }; loadSelectedTracker(); +const getShowFiltersSidebar = function() { + // Show Filters Sidebar is enabled by default + const show = LocalPreferences.get('show_filters_sidebar'); + return (show === null) || (show === 'true'); +} + function genHash(string) { // origins: // https://stackoverflow.com/a/8831937 @@ -284,6 +290,13 @@ window.addEvent('load', function() { $('desktopFooterWrapper').addClass('invisible'); } + const showFiltersSidebar = getShowFiltersSidebar(); + if (!showFiltersSidebar) { + $('showFiltersSidebarLink').firstChild.style.opacity = '0'; + $('filtersColumn').addClass('invisible'); + $('filtersColumn_handle').addClass('invisible'); + } + let speedInTitle = LocalPreferences.get('speed_in_browser_title_bar') == "true"; if (!speedInTitle) $('speedInBrowserTitleBarLink').firstChild.style.opacity = '0'; @@ -855,6 +868,22 @@ window.addEvent('load', function() { registerMagnetHandler(); }); + $('showFiltersSidebarLink').addEvent('click', function(e) { + const showFiltersSidebar = !getShowFiltersSidebar(); + LocalPreferences.set('show_filters_sidebar', showFiltersSidebar.toString()); + if (showFiltersSidebar) { + $('showFiltersSidebarLink').firstChild.style.opacity = '1'; + $('filtersColumn').removeClass('invisible'); + $('filtersColumn_handle').removeClass('invisible'); + } + else { + $('showFiltersSidebarLink').firstChild.style.opacity = '0'; + $('filtersColumn').addClass('invisible'); + $('filtersColumn_handle').addClass('invisible'); + } + MochaUI.Desktop.setDesktopSize(); + }); + $('speedInBrowserTitleBarLink').addEvent('click', function(e) { speedInTitle = !speedInTitle; LocalPreferences.set('speed_in_browser_title_bar', speedInTitle.toString());