Skip to content

Commit

Permalink
Add tab selector with tab count (issue #1094, issue #1413)
Browse files Browse the repository at this point in the history
  • Loading branch information
Bionus committed Sep 11, 2018
1 parent 9910c74 commit 4b6e84c
Show file tree
Hide file tree
Showing 6 changed files with 153 additions and 12 deletions.
44 changes: 34 additions & 10 deletions gui/src/main-window.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
#include "tags/tag-stylist.h"
#include "theme-loader.h"
#include "ui/QAffiche.h"
#include "ui/tab-selector.h"
#include "utils/blacklist-fix/blacklist-fix-1.h"
#include "utils/empty-dirs-fix/empty-dirs-fix-1.h"
#include "utils/md5-fix/md5-fix.h"
Expand All @@ -61,7 +62,10 @@ void MainWindow::init(const QStringList &args, const QMap<QString, QString> &par
ui->setupUi(this);

if (m_settings->value("Log/show", true).toBool())
{ ui->tabWidget->addTab(new LogTab(this), tr("Log")); }
{
m_logTab = new LogTab(this);
ui->tabWidget->addTab(m_logTab, m_logTab->windowTitle());
}

log(QStringLiteral("New session started."), Logger::Info);
log(QStringLiteral("Software version: %1.").arg(VERSION), Logger::Info);
Expand Down Expand Up @@ -221,29 +225,46 @@ void MainWindow::init(const QStringList &args, const QMap<QString, QString> &par

// Downloads tab
m_downloadsTab = new DownloadsTab(m_profile, this);
ui->tabWidget->insertTab(m_tabs.size(), m_downloadsTab, tr("Downloads"));
ui->tabWidget->insertTab(m_tabs.size(), m_downloadsTab, m_downloadsTab->windowTitle());
ui->tabWidget->setCurrentIndex(0);

// Restore download lists
if (m_restore)
{ m_downloadsTab->loadLinkList(m_profile->getPath() + "/restore.igl"); }

// Tab add button
QPushButton *add = new QPushButton(QIcon(":/images/add.png"), "", this);
add->setFlat(true);
add->resize(QSize(12, 12));
connect(add, SIGNAL(clicked()), this, SLOT(addTab()));
ui->tabWidget->setCornerWidget(add);

// Favorites tab
m_favoritesTab = new FavoritesTab(m_profile, this);
connect(m_favoritesTab, &SearchTab::batchAddGroup, m_downloadsTab, &DownloadsTab::batchAddGroup);
connect(m_favoritesTab, SIGNAL(batchAddUnique(DownloadQueryImage)), m_downloadsTab, SLOT(batchAddUnique(DownloadQueryImage)));
connect(m_favoritesTab, &SearchTab::titleChanged, this, &MainWindow::updateTabTitle);
connect(m_favoritesTab, &SearchTab::changed, this, &MainWindow::updateTabs);
ui->tabWidget->insertTab(m_tabs.size(), m_favoritesTab, tr("Favorites"));
ui->tabWidget->insertTab(m_tabs.size(), m_favoritesTab, m_favoritesTab->windowTitle());
ui->tabWidget->setCurrentIndex(0);

// Tab corner widget
QWidget *cornerWidget = new QWidget(this);
QLayout *layout = new QHBoxLayout(cornerWidget);
layout->setContentsMargins(0, 0, 6, 0);
layout->setSpacing(0);
ui->tabWidget->setCornerWidget(cornerWidget);

// Add tab button
QPushButton *add = new QPushButton(QIcon(":/images/add.png"), "", this);
add->setFlat(true);
add->resize(QSize(12, 12));
connect(add, SIGNAL(clicked()), this, SLOT(addTab()));
layout->addWidget(add);

// Tab selector
m_tabSelector = new TabSelector(ui->tabWidget, this);
m_tabSelector->setShowTabCount(true); // TODO(Bionus): add a setting to disable tab count
m_tabSelector->setFlat(true);
m_tabSelector->markStaticTab(m_favoritesTab);
m_tabSelector->markStaticTab(m_downloadsTab);
if (m_logTab != nullptr)
{ m_tabSelector->markStaticTab(m_logTab); }
layout->addWidget(m_tabSelector);

// Load given files
parseArgs(args, params);

Expand Down Expand Up @@ -438,6 +459,8 @@ void MainWindow::addSearchTab(SearchTab *w, bool background, bool save)
int index = ui->tabWidget->insertTab(pos, w, title);
m_tabs.append(w);

m_tabSelector->updateCounter();

QPushButton *closeTab = new QPushButton(QIcon(":/images/close.png"), "", this);
closeTab->setFlat(true);
closeTab->resize(QSize(8, 8));
Expand Down Expand Up @@ -499,6 +522,7 @@ void MainWindow::tabClosed(SearchTab *tab)
ui->actionRestoreLastClosedTab->setEnabled(true);

m_tabs.removeAll(tab);
m_tabSelector->updateCounter();
}
void MainWindow::restoreLastClosedTab()
{
Expand Down
4 changes: 4 additions & 0 deletions gui/src/main-window.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,12 @@ class SearchTab;
class FavoritesTab;
class Profile;
class DownloadsTab;
class LogTab;
class Favorite;
class MonitoringCenter;
class QSettings;
class Site;
class TabSelector;
class Tag;

class MainWindow : public QMainWindow
Expand Down Expand Up @@ -119,11 +121,13 @@ class MainWindow : public QMainWindow
QList<Site*> m_selectedSites;
FavoritesTab *m_favoritesTab;
DownloadsTab *m_downloadsTab;
LogTab *m_logTab;
QStringList m_lineFilename_completer, m_lineFolder_completer;
bool m_restore;
QList<Tag> m_currentTags;
QLinkedList<QJsonObject> m_closedTabs;
QNetworkAccessManager m_networkAccessManager;
TabSelector *m_tabSelector;

// System tray
QSystemTrayIcon *m_trayIcon;
Expand Down
2 changes: 1 addition & 1 deletion gui/src/tabs/downloads-tab.ui
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
</size>
</property>
<property name="windowTitle">
<string>New tab</string>
<string>Downloads</string>
</property>
<property name="windowIcon">
<iconset resource="../../resources/resources.qrc">
Expand Down
2 changes: 1 addition & 1 deletion gui/src/tabs/log-tab.ui
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
</size>
</property>
<property name="windowTitle">
<string>New tab</string>
<string>Log</string>
</property>
<property name="windowIcon">
<iconset resource="../../resources/resources.qrc">
Expand Down
74 changes: 74 additions & 0 deletions gui/src/ui/tab-selector.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
#include "tab-selector.h"
#include <QAction>
#include <QMenu>
#include <QTabWidget>
#include "tabs/search-tab.h"


TabSelector::TabSelector(QTabWidget *tabWidget, QWidget *parent)
: QPushButton(parent), m_tabWidget(tabWidget)
{
m_menu = new QMenu(this);
m_menu->setStyleSheet("QMenu { menu-scrollable: 1; }");
connect(m_menu, &QMenu::aboutToShow, this, &TabSelector::menuAboutToShow);
connect(m_menu, &QMenu::triggered, this, &TabSelector::actionTriggered);
setMenu(m_menu);

updateCounter();
}

void TabSelector::setShowTabCount(bool showTabCount)
{
m_showTabCount = showTabCount;
}

void TabSelector::markStaticTab(QWidget *tab)
{
m_staticTabs.append(tab);
}

void TabSelector::updateCounter()
{
if (m_showTabCount) {
const QString count = QString::number(m_tabWidget->count());
setText(count);
setMaximumWidth(23 + 7 * count.length());
} else {
setMaximumWidth(20);
}
}

void TabSelector::menuAboutToShow()
{
m_menu->clear();

// Add static tabs at the beginning
for (QWidget *widget : m_staticTabs) {
m_menu->addAction(widget->windowTitle())->setData(QVariant::fromValue(widget));
}

// Add separator if necessary
if (m_tabWidget->count() > m_staticTabs.count()) {
m_menu->addSeparator();
}

// Add "dynamic" tabs
for (int i = 0; i < m_tabWidget->count(); ++i) {
QWidget *widget = m_tabWidget->widget(i);
if (m_staticTabs.contains(widget)) {
continue;
}

m_menu->addAction(widget->windowTitle())->setData(QVariant::fromValue(widget));
}
}

void TabSelector::actionTriggered(QAction *action)
{
QWidget *widget = action->data().value<QWidget*>();
if (widget == nullptr) {
return;
}

m_tabWidget->setCurrentWidget(widget);
}
39 changes: 39 additions & 0 deletions gui/src/ui/tab-selector.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#ifndef TAB_SELECTOR_H
#define TAB_SELECTOR_H

#include <QList>
#include <QPushButton>


class QAction;
class QMenu;
class QTabWidget;
class QWidget;

class TabSelector : public QPushButton
{
Q_OBJECT

public:
explicit TabSelector(QTabWidget *tabWidget, QWidget *parent = nullptr);

public slots:
void setShowTabCount(bool showTabCount);
void markStaticTab(QWidget *tab);
void updateCounter();

private slots:
void menuAboutToShow();
void actionTriggered(QAction *action);

signals:
void selected(QWidget *widget);

private:
QTabWidget *m_tabWidget;
QMenu *m_menu;
QList<QWidget*> m_staticTabs;
bool m_showTabCount = true;
};

#endif // TAB_SELECTOR_H

0 comments on commit 4b6e84c

Please sign in to comment.