From: APTX Date: Mon, 29 Apr 2013 23:08:44 +0000 (+0200) Subject: Tabs can now be added and removed. X-Git-Url: https://gitweb.tyo.aptx.org/?a=commitdiff_plain;h=a0eb198862c9f362bd7641f20f4ceb954f4920fc;p=localmylist.git Tabs can now be added and removed. --- diff --git a/localmylist-management/abstracttab.cpp b/localmylist-management/abstracttab.cpp index fa050c5..b361383 100644 --- a/localmylist-management/abstracttab.cpp +++ b/localmylist-management/abstracttab.cpp @@ -9,9 +9,19 @@ AbstractTab::~AbstractTab() { } -QString AbstractTab::name() const +QString AbstractTab::id() const { - return m_name; + return "__invalid"; +} + +QString AbstractTab::name() +{ + return "__invalid"; +} + +QString AbstractTab::label() const +{ + return m_label; } MainWindow *AbstractTab::mainWindow() const @@ -47,9 +57,9 @@ void AbstractTab::saveSettings(QSettings *settings) void AbstractTab::setName(QString name) { - if (m_name != name) + if (m_label != name) { - m_name = name; + m_label = name; emit nameChanged(name); } } diff --git a/localmylist-management/abstracttab.h b/localmylist-management/abstracttab.h index 2d4ff4e..fb4951e 100644 --- a/localmylist-management/abstracttab.h +++ b/localmylist-management/abstracttab.h @@ -9,13 +9,16 @@ class MainWindow; class AbstractTab : public QWidget { Q_OBJECT - Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) + Q_PROPERTY(QString label READ label WRITE setName NOTIFY nameChanged) public: explicit AbstractTab(QWidget *parent = 0); ~AbstractTab(); - QString name() const; + virtual QString id() const; + static QString name(); + + QString label() const; MainWindow *mainWindow() const; virtual void init(); @@ -28,14 +31,14 @@ public: virtual void saveSettings(QSettings *settings); signals: - void nameChanged(QString name); + void nameChanged(QString label); public slots: - void setName(QString name); + void setName(QString label); void setMainWindow(MainWindow *mainWindow); protected: - QString m_name; + QString m_label; MainWindow *m_mainWindow; }; diff --git a/localmylist-management/mainwindow.cpp b/localmylist-management/mainwindow.cpp index bc0a5aa..8944e7e 100644 --- a/localmylist-management/mainwindow.cpp +++ b/localmylist-management/mainwindow.cpp @@ -77,20 +77,19 @@ MainWindow::MainWindow(QWidget *parent) : ui->actionRenameFiles->setDisabled(true); } + TabWidget::registerTab(); + TabWidget::registerTab(); - AbstractTab *tab; - tab = new MyListTab(); - tab->setMainWindow(this); - ui->tabWidget->addTab(tab); - tab = new ReportsTab(); - tab->setMainWindow(this); - ui->tabWidget->addTab(tab); + ui->tabWidget->setMainWindow(this); + ui->tabWidget->populateMenu(ui->menuView); + ui->tabWidget->loadSettings(MyList::instance()->defaultLocalQSettings()); } MainWindow::~MainWindow() { saveSettings(); + ui->tabWidget->saveSettings(MyList::instance()->defaultLocalQSettings()); delete ui; } diff --git a/localmylist-management/mainwindow.h b/localmylist-management/mainwindow.h index f98e0ab..de79e61 100644 --- a/localmylist-management/mainwindow.h +++ b/localmylist-management/mainwindow.h @@ -2,7 +2,6 @@ #define MAINWINDOW_H #include -#include namespace Ui { class MainWindow; diff --git a/localmylist-management/mainwindow.ui b/localmylist-management/mainwindow.ui index fd57650..a3d45b8 100644 --- a/localmylist-management/mainwindow.ui +++ b/localmylist-management/mainwindow.ui @@ -98,7 +98,13 @@ + + + View + + + diff --git a/localmylist-management/tabs/mylisttab.cpp b/localmylist-management/tabs/mylisttab.cpp index 9de2f1c..7db8fc5 100644 --- a/localmylist-management/tabs/mylisttab.cpp +++ b/localmylist-management/tabs/mylisttab.cpp @@ -22,7 +22,7 @@ MyListTab::MyListTab(QWidget *parent) : ui(new Ui::MyListTab) { ui->setupUi(this); - m_name = tr("MyList"); + m_label = tr("MyList"); } MyListTab::~MyListTab() @@ -30,6 +30,15 @@ MyListTab::~MyListTab() delete ui; } +QString MyListTab::id() const +{ + return "mylist"; +} + +QString MyListTab::name() +{ + return tr("MyList"); +} void MyListTab::init() { diff --git a/localmylist-management/tabs/mylisttab.h b/localmylist-management/tabs/mylisttab.h index b18ec01..447a85a 100644 --- a/localmylist-management/tabs/mylisttab.h +++ b/localmylist-management/tabs/mylisttab.h @@ -23,6 +23,9 @@ public: explicit MyListTab(QWidget *parent = 0); ~MyListTab(); + QString id() const; + static QString name(); + void init(); void loadSettings(QSettings *settings); diff --git a/localmylist-management/tabs/reportstab.cpp b/localmylist-management/tabs/reportstab.cpp index 61fb239..8c4cba3 100644 --- a/localmylist-management/tabs/reportstab.cpp +++ b/localmylist-management/tabs/reportstab.cpp @@ -15,7 +15,7 @@ ReportsTab::ReportsTab(QWidget *parent) : ui(new Ui::ReportsTab) { ui->setupUi(this); - m_name = tr("Reports"); + m_label = tr("Reports"); } ReportsTab::~ReportsTab() @@ -23,6 +23,16 @@ ReportsTab::~ReportsTab() delete ui; } +QString ReportsTab::id() const +{ + return "reports"; +} + +QString ReportsTab::name() +{ + return tr("Reports"); +} + void ReportsTab::init() { reportResultModel = new QSqlQueryModel(this); diff --git a/localmylist-management/tabs/reportstab.h b/localmylist-management/tabs/reportstab.h index e36c2ca..af04831 100644 --- a/localmylist-management/tabs/reportstab.h +++ b/localmylist-management/tabs/reportstab.h @@ -17,6 +17,9 @@ public: explicit ReportsTab(QWidget *parent = 0); ~ReportsTab(); + QString id() const; + static QString name(); + void init(); void activate(); diff --git a/localmylist-management/tabwidget.cpp b/localmylist-management/tabwidget.cpp index 924f73a..fb49828 100644 --- a/localmylist-management/tabwidget.cpp +++ b/localmylist-management/tabwidget.cpp @@ -1,6 +1,9 @@ #include "tabwidget.h" #include +#include +#include +#include #include "abstracttab.h" #include "mainwindow.h" @@ -9,14 +12,17 @@ #include TabWidget::TabWidget(QWidget *parent) : - QTabWidget(parent), previousTab(0) + QTabWidget(parent), previousTab(0), m_mainWindow(0) { setDocumentMode(true); -// setTabsClosable(true); -// setMovable(true); + setTabsClosable(true); + setMovable(true); + + signalMapper = new QSignalMapper(this); connect(this, SIGNAL(tabCloseRequested(int)), this, SLOT(removeTab(int))); connect(this, SIGNAL(currentChanged(int)), this, SLOT(currentTabChanged(int))); + connect(signalMapper, SIGNAL(mapped(QString)), this, SLOT(addTabRequested(QString))); } TabWidget::~TabWidget() @@ -25,16 +31,74 @@ TabWidget::~TabWidget() removeTab(0); } +void TabWidget::populateMenu(QMenu *menu) +{ + for (const auto &action : menu->actions()) + signalMapper->removeMappings(action); + qDeleteAll(menu->actions()); + + for (const QString &id : tabMenuOrder) + { + QAction *action = new QAction(registeredTabNames.value(id)(), menu); + connect(action, SIGNAL(triggered()), signalMapper, SLOT(map())); + signalMapper->setMapping(action, id); + menu->addAction(action); + } +} + +MainWindow *TabWidget::mainWindow() const +{ + return m_mainWindow; +} + +void TabWidget::loadSettings(QSettings *s) +{ + QStringList ids; + s->beginGroup("management-gui"); + ids = s->value("tabs", "mylist").toString().split(QChar(',')); + s->endGroup(); + + for (const QString &id : ids) + addTab(id); +} + +void TabWidget::saveSettings(QSettings *s) +{ + QStringList ids; + for (int i = 0; i < count(); ++i) + ids << tab(i)->id(); + + s->beginGroup("management-gui"); + s->setValue("tabs", ids.join(QChar(','))); + s->endGroup(); +} + +int TabWidget::addTab(const QString &id) +{ + AbstractTab *t = createTab(id); + + if (!t) return -1; + + t->setMainWindow(m_mainWindow); + + return addTab(t); +} + +void TabWidget::setMainWindow(MainWindow *mainWindow) +{ + m_mainWindow = mainWindow; +} + int TabWidget::addTab(AbstractTab *tab) { initTab(tab); - return QTabWidget::addTab(tab, tab->name()); + return QTabWidget::addTab(tab, tab->label()); } int TabWidget::insertTab(int index, AbstractTab *tab) { initTab(tab); - return QTabWidget::insertTab(index, tab, tab->name()); + return QTabWidget::insertTab(index, tab, tab->label()); } void TabWidget::removeTab(int index) @@ -81,6 +145,11 @@ void TabWidget::currentTabChanged(int newIndex) previousTab->activate(); } +void TabWidget::addTabRequested(const QString &id) +{ + addTab(id); +} + void TabWidget::initTab(AbstractTab *tab) { Q_ASSERT_X(tab, "TabWidget", "initTab, Invalid tab"); @@ -106,3 +175,27 @@ void TabWidget::deinitTab(AbstractTab *tab) tab->deinit(); delete tab; } + +AbstractTab *TabWidget::createTab(const QString &id) +{ + if (!registeredTabs.contains(id)) + return 0; + + return registeredTabs.value(id)(); +} + +bool TabWidget::registerTab(const QString &id, TabWidget::TabName tabName, TabWidget::TabFactory factory) +{ + if (registeredTabs.contains(id)) + return false; + + tabMenuOrder.append(id); + registeredTabNames.insert(id, tabName); + registeredTabs.insert(id, factory); + return true; +} + +QList TabWidget::tabMenuOrder; +QHash TabWidget::registeredTabNames; +QHash TabWidget::registeredTabs; + diff --git a/localmylist-management/tabwidget.h b/localmylist-management/tabwidget.h index 7ff0241..9e4069f 100644 --- a/localmylist-management/tabwidget.h +++ b/localmylist-management/tabwidget.h @@ -2,17 +2,37 @@ #define TABWIDGET_H #include +#include +#include + +class QMenu; +class QSignalMapper; +class QSettings; class AbstractTab; +class MainWindow; class TabWidget : public QTabWidget { Q_OBJECT + Q_PROPERTY(MainWindow *mainWindow READ mainWindow WRITE setMainWindow) + + typedef std::function TabFactory; + typedef std::function TabName; + public: explicit TabWidget(QWidget *parent = 0); ~TabWidget(); + void populateMenu(QMenu *menu); + + MainWindow *mainWindow() const; + + void loadSettings(QSettings *settings); + void saveSettings(QSettings *settings); + public slots: + int addTab(const QString &id); int addTab(AbstractTab *tab); int insertTab(int index, AbstractTab *tab); @@ -21,16 +41,37 @@ public slots: AbstractTab *tab(int index) const; + void setMainWindow(MainWindow *mainWindow); + private slots: void tabNameChanged(const QString &newName); - void currentTabChanged(int newIndex); + void addTabRequested(const QString &id); + private: void initTab(AbstractTab *tab); void deinitTab(AbstractTab *tab); AbstractTab *previousTab; + QSignalMapper *signalMapper; + MainWindow * m_mainWindow; + +public: + static AbstractTab *createTab(const QString &id); + static bool registerTab(const QString &id, TabName tabName, TabFactory factory); + template static bool registerTab() + { + // TODO fix this + return registerTab(T().id(), T::name, TabWidget::createTab); + } + + template static T *createTab() { return new T; } + +private: + static QList tabMenuOrder; + static QHash registeredTabNames; + static QHash registeredTabs; }; #endif // TABWIDGET_H