Browse Source

Add option to toggle filters sidebar

PR #15409.
adaptive-webui-19844
AbeniMatteo 3 years ago committed by GitHub
parent
commit
baa8d2c326
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 26
      src/base/preferences.cpp
  2. 6
      src/base/preferences.h
  3. 77
      src/gui/mainwindow.cpp
  4. 5
      src/gui/mainwindow.h
  5. 9
      src/gui/mainwindow.ui
  6. 1
      src/webui/www/private/index.html
  7. 29
      src/webui/www/private/scripts/client.js

26
src/base/preferences.cpp

@ -1256,22 +1256,24 @@ void Preferences::setMainGeometry(const QByteArray &geometry)
setValue(u"MainWindow/geometry"_qs, 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/MainWindow/FiltersSidebarVisible"_qs, true);
return value<QByteArray>(u"GUI/Qt6/MainWindow/VSplitterState"_qs);
#else
return value<QByteArray>(u"MainWindow/qt5/vsplitterState"_qs);
#endif
} }
void Preferences::setMainVSplitterState(const QByteArray &state) void Preferences::setFiltersSidebarVisible(const bool value)
{ {
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) setValue(u"GUI/MainWindow/FiltersSidebarVisible"_qs, value);
setValue(u"GUI/Qt6/MainWindow/VSplitterState"_qs, state); }
#else
setValue(u"MainWindow/qt5/vsplitterState"_qs, state); int Preferences::getFiltersSidebarWidth() const
#endif {
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 Path Preferences::getMainLastDir() const

6
src/base/preferences.h

@ -340,8 +340,10 @@ public:
void setAcceptedLegal(bool accepted); void setAcceptedLegal(bool accepted);
QByteArray getMainGeometry() const; QByteArray getMainGeometry() const;
void setMainGeometry(const QByteArray &geometry); void setMainGeometry(const QByteArray &geometry);
QByteArray getMainVSplitterState() const; bool isFiltersSidebarVisible() const;
void setMainVSplitterState(const QByteArray &state); void setFiltersSidebarVisible(bool value);
int getFiltersSidebarWidth() const;
void setFiltersSidebarWidth(int value);
Path getMainLastDir() const; Path getMainLastDir() const;
void setMainLastDir(const Path &path); void setMainLastDir(const Path &path);
QByteArray getPeerListState() const; QByteArray getPeerListState() const;

77
src/gui/mainwindow.cpp

@ -223,13 +223,10 @@ MainWindow::MainWindow(QWidget *parent)
// m_transferListWidget->setStyleSheet("QTreeView {border: none;}"); // borderless // m_transferListWidget->setStyleSheet("QTreeView {border: none;}"); // borderless
m_propertiesWidget = new PropertiesWidget(hSplitter); m_propertiesWidget = new PropertiesWidget(hSplitter);
connect(m_transferListWidget, &TransferListWidget::currentTorrentChanged, m_propertiesWidget, &PropertiesWidget::loadTorrentInfos); 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_transferListWidget);
hSplitter->addWidget(m_propertiesWidget); hSplitter->addWidget(m_propertiesWidget);
m_splitter->addWidget(m_transferListFiltersWidget);
m_splitter->addWidget(hSplitter); m_splitter->addWidget(hSplitter);
m_splitter->setCollapsible(0, true); m_splitter->setCollapsible(0, false);
m_splitter->setCollapsible(1, false);
m_tabs->addTab(m_splitter, m_tabs->addTab(m_splitter,
#ifndef Q_OS_MACOS #ifndef Q_OS_MACOS
UIThemeManager::instance()->getIcon(u"folder-remote"_qs), 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(m_searchFilter, &LineEdit::textChanged, m_transferListWidget, &TransferListWidget::applyNameFilter);
connect(hSplitter, &QSplitter::splitterMoved, this, &MainWindow::writeSettings); 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::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 #ifdef Q_OS_MACOS
// Increase top spacing to avoid tab overlapping // Increase top spacing to avoid tab overlapping
@ -435,6 +428,20 @@ MainWindow::MainWindow(QWidget *parent)
m_propertiesWidget->readSettings(); 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 // Start watching the executable for updates
m_executableWatcher = new QFileSystemWatcher(this); m_executableWatcher = new QFileSystemWatcher(this);
connect(m_executableWatcher, &QFileSystemWatcher::fileChanged, this, &MainWindow::notifyOfUpdate); connect(m_executableWatcher, &QFileSystemWatcher::fileChanged, this, &MainWindow::notifyOfUpdate);
@ -538,7 +545,8 @@ bool MainWindow::isDownloadTrackerFavicon() const
void MainWindow::setDownloadTrackerFavicon(const bool value) void MainWindow::setDownloadTrackerFavicon(const bool value)
{ {
m_transferListFiltersWidget->setDownloadTrackerFavicon(value); if (m_transferListFiltersWidget)
m_transferListFiltersWidget->setDownloadTrackerFavicon(value);
m_storeDownloadTrackerFavicon = value; m_storeDownloadTrackerFavicon = value;
} }
@ -784,11 +792,16 @@ void MainWindow::writeSettings()
{ {
Preferences *const pref = Preferences::instance(); Preferences *const pref = Preferences::instance();
pref->setMainGeometry(saveGeometry()); pref->setMainGeometry(saveGeometry());
// Splitter size
pref->setMainVSplitterState(m_splitter->saveState());
m_propertiesWidget->saveSettings(); 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() void MainWindow::cleanup()
{ {
writeSettings(); writeSettings();
@ -817,12 +830,6 @@ void MainWindow::readSettings()
const QByteArray mainGeo = pref->getMainGeometry(); const QByteArray mainGeo = pref->getMainGeometry();
if (!mainGeo.isEmpty() && restoreGeometry(mainGeo)) if (!mainGeo.isEmpty() && restoreGeometry(mainGeo))
m_posInitialized = true; 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() 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() void MainWindow::loadPreferences()
{ {
const Preferences *pref = Preferences::instance(); const Preferences *pref = Preferences::instance();
@ -1801,6 +1835,13 @@ void MainWindow::on_actionShowStatusbar_triggered()
showStatusBar(isVisible); 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() void MainWindow::on_actionSpeedInTitleBar_triggered()
{ {
m_displaySpeedInTitle = static_cast<QAction *>(sender())->isChecked(); m_displaySpeedInTitle = static_cast<QAction *>(sender())->isChecked();

5
src/gui/mainwindow.h

@ -115,6 +115,7 @@ private slots:
void showFilterContextMenu(); void showFilterContextMenu();
void balloonClicked(); void balloonClicked();
void writeSettings(); void writeSettings();
void writeSplitterSettings();
void readSettings(); void readSettings();
void fullDiskError(BitTorrent::Torrent *const torrent, const QString &msg) const; void fullDiskError(BitTorrent::Torrent *const torrent, const QString &msg) const;
void handleDownloadFromUrlFailure(const QString &, const QString &) const; void handleDownloadFromUrlFailure(const QString &, const QString &) const;
@ -158,6 +159,7 @@ private slots:
void on_actionSpeedInTitleBar_triggered(); void on_actionSpeedInTitleBar_triggered();
void on_actionTopToolBar_triggered(); void on_actionTopToolBar_triggered();
void on_actionShowStatusbar_triggered(); void on_actionShowStatusbar_triggered();
void on_actionShowFiltersSidebar_triggered(bool checked);
void on_actionDonateMoney_triggered(); void on_actionDonateMoney_triggered();
void on_actionExecutionLogs_triggered(bool checked); void on_actionExecutionLogs_triggered(bool checked);
void on_actionNormalMessages_triggered(bool checked); void on_actionNormalMessages_triggered(bool checked);
@ -214,6 +216,7 @@ private:
void displaySearchTab(bool enable); void displaySearchTab(bool enable);
void createTorrentTriggered(const Path &path); void createTorrentTriggered(const Path &path);
void showStatusBar(bool show); void showStatusBar(bool show);
void showFiltersSidebar(bool show);
Ui::MainWindow *m_ui; Ui::MainWindow *m_ui;
@ -234,7 +237,7 @@ private:
QPointer<QMenu> m_trayIconMenu; QPointer<QMenu> m_trayIconMenu;
TransferListWidget *m_transferListWidget; TransferListWidget *m_transferListWidget;
TransferListFiltersWidget *m_transferListFiltersWidget; TransferListFiltersWidget *m_transferListFiltersWidget = nullptr;
PropertiesWidget *m_propertiesWidget; PropertiesWidget *m_propertiesWidget;
bool m_displaySpeedInTitle; bool m_displaySpeedInTitle;
bool m_forceExit = false; bool m_forceExit = false;

9
src/gui/mainwindow.ui

@ -112,6 +112,7 @@
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="actionTopToolBar"/> <addaction name="actionTopToolBar"/>
<addaction name="actionShowStatusbar"/> <addaction name="actionShowStatusbar"/>
<addaction name="actionShowFiltersSidebar"/>
<addaction name="actionSpeedInTitleBar"/> <addaction name="actionSpeedInTitleBar"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="actionSearchWidget"/> <addaction name="actionSearchWidget"/>
@ -307,6 +308,14 @@
<string>Status &amp;Bar</string> <string>Status &amp;Bar</string>
</property> </property>
</action> </action>
<action name="actionShowFiltersSidebar">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Filters Sidebar</string>
</property>
</action>
<action name="actionSpeedInTitleBar"> <action name="actionSpeedInTitleBar">
<property name="checkable"> <property name="checkable">
<bool>true</bool> <bool>true</bool>

1
src/webui/www/private/index.html

@ -73,6 +73,7 @@
<ul> <ul>
<li><a id="showTopToolbarLink"><img class="MyMenuIcon" src="icons/checked.svg" alt="QBT_TR(Top Toolbar)QBT_TR[CONTEXT=MainWindow]" width="16" height="16" />QBT_TR(Top Toolbar)QBT_TR[CONTEXT=MainWindow]</a></li> <li><a id="showTopToolbarLink"><img class="MyMenuIcon" src="icons/checked.svg" alt="QBT_TR(Top Toolbar)QBT_TR[CONTEXT=MainWindow]" width="16" height="16" />QBT_TR(Top Toolbar)QBT_TR[CONTEXT=MainWindow]</a></li>
<li><a id="showStatusBarLink"><img class="MyMenuIcon" src="icons/checked.svg" alt="QBT_TR(Status Bar)QBT_TR[CONTEXT=MainWindow]" width="16" height="16" />QBT_TR(Status Bar)QBT_TR[CONTEXT=MainWindow]</a></li> <li><a id="showStatusBarLink"><img class="MyMenuIcon" src="icons/checked.svg" alt="QBT_TR(Status Bar)QBT_TR[CONTEXT=MainWindow]" width="16" height="16" />QBT_TR(Status Bar)QBT_TR[CONTEXT=MainWindow]</a></li>
<li><a id="showFiltersSidebarLink"><img class="MyMenuIcon" src="icons/checked.svg" alt="QBT_TR(Filters Sidebar)QBT_TR[CONTEXT=MainWindow]" width="16" height="16" />QBT_TR(Filters Sidebar)QBT_TR[CONTEXT=MainWindow]</a></li>
<li><a id="speedInBrowserTitleBarLink"><img class="MyMenuIcon" src="icons/checked.svg" alt="QBT_TR(Speed in Title Bar)QBT_TR[CONTEXT=MainWindow]" width="16" height="16" />QBT_TR(Speed in Title Bar)QBT_TR[CONTEXT=MainWindow]</a></li> <li><a id="speedInBrowserTitleBarLink"><img class="MyMenuIcon" src="icons/checked.svg" alt="QBT_TR(Speed in Title Bar)QBT_TR[CONTEXT=MainWindow]" width="16" height="16" />QBT_TR(Speed in Title Bar)QBT_TR[CONTEXT=MainWindow]</a></li>
<li class="divider"><a id="showSearchEngineLink"><img class="MyMenuIcon" src="icons/checked.svg" alt="QBT_TR(Search Engine)QBT_TR[CONTEXT=MainWindow]" width="16" height="16" />QBT_TR(Search Engine)QBT_TR[CONTEXT=MainWindow]</a></li> <li class="divider"><a id="showSearchEngineLink"><img class="MyMenuIcon" src="icons/checked.svg" alt="QBT_TR(Search Engine)QBT_TR[CONTEXT=MainWindow]" width="16" height="16" />QBT_TR(Search Engine)QBT_TR[CONTEXT=MainWindow]</a></li>
<li><a id="showRssReaderLink"><img class="MyMenuIcon" src="icons/checked.svg" alt="QBT_TR(RSS)QBT_TR[CONTEXT=MainWindow]" width="16" height="16" />QBT_TR(RSS Reader)QBT_TR[CONTEXT=MainWindow]</a></li> <li><a id="showRssReaderLink"><img class="MyMenuIcon" src="icons/checked.svg" alt="QBT_TR(RSS)QBT_TR[CONTEXT=MainWindow]" width="16" height="16" />QBT_TR(RSS Reader)QBT_TR[CONTEXT=MainWindow]</a></li>

29
src/webui/www/private/scripts/client.js

@ -87,6 +87,12 @@ const loadSelectedTracker = function() {
}; };
loadSelectedTracker(); 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) { function genHash(string) {
// origins: // origins:
// https://stackoverflow.com/a/8831937 // https://stackoverflow.com/a/8831937
@ -284,6 +290,13 @@ window.addEvent('load', function() {
$('desktopFooterWrapper').addClass('invisible'); $('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"; let speedInTitle = LocalPreferences.get('speed_in_browser_title_bar') == "true";
if (!speedInTitle) if (!speedInTitle)
$('speedInBrowserTitleBarLink').firstChild.style.opacity = '0'; $('speedInBrowserTitleBarLink').firstChild.style.opacity = '0';
@ -855,6 +868,22 @@ window.addEvent('load', function() {
registerMagnetHandler(); 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) { $('speedInBrowserTitleBarLink').addEvent('click', function(e) {
speedInTitle = !speedInTitle; speedInTitle = !speedInTitle;
LocalPreferences.set('speed_in_browser_title_bar', speedInTitle.toString()); LocalPreferences.set('speed_in_browser_title_bar', speedInTitle.toString());

Loading…
Cancel
Save