]> Some of my projects - localmylist.git/commitdiff
Tabs can now be added and removed.
authorAPTX <marek321@gmail.com>
Mon, 29 Apr 2013 23:08:44 +0000 (01:08 +0200)
committerAPTX <marek321@gmail.com>
Mon, 29 Apr 2013 23:08:44 +0000 (01:08 +0200)
localmylist-management/abstracttab.cpp
localmylist-management/abstracttab.h
localmylist-management/mainwindow.cpp
localmylist-management/mainwindow.h
localmylist-management/mainwindow.ui
localmylist-management/tabs/mylisttab.cpp
localmylist-management/tabs/mylisttab.h
localmylist-management/tabs/reportstab.cpp
localmylist-management/tabs/reportstab.h
localmylist-management/tabwidget.cpp
localmylist-management/tabwidget.h

index fa050c54be9350c141cc943acceb55cf0546e742..b3613836911692161db19f31d13286834f8d4897 100644 (file)
@@ -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);
        }
 }
index 2d4ff4ef35e9d91088183f24366824e406dd7e5f..fb4951e6b4fe4649aa301f1fbae28a65b786d113 100644 (file)
@@ -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;
 };
 
index bc0a5aaa0cc5211cbce2546fc663be91957a16f7..8944e7e070f358ddfaedca7c01f25f945a8ea737 100644 (file)
@@ -77,20 +77,19 @@ MainWindow::MainWindow(QWidget *parent) :
                ui->actionRenameFiles->setDisabled(true);
        }
 
+       TabWidget::registerTab<MyListTab>();
+       TabWidget::registerTab<ReportsTab>();
 
-       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;
 }
 
index f98e0ab7dcbf02327df8604d0e78aeee3d4d75c9..de79e614083b9111e40d0e475fd7ade345519dfa 100644 (file)
@@ -2,7 +2,6 @@
 #define MAINWINDOW_H
 
 #include <QMainWindow>
-#include <QModelIndex>
 
 namespace Ui {
        class MainWindow;
index fd57650629de82efb108b1b63c2236304393507d..a3d45b8b2c9743499839948edc2e7af7048b7976 100644 (file)
     </property>
     <addaction name="actionAboutLocalMyList"/>
    </widget>
+   <widget class="QMenu" name="menuView">
+    <property name="title">
+     <string>View</string>
+    </property>
+   </widget>
    <addaction name="menuConnection"/>
+   <addaction name="menuView"/>
    <addaction name="menu_Actions"/>
    <addaction name="menuSettings"/>
    <addaction name="menu_Help"/>
index 9de2f1cc9543793c53806b05662fcb055b3dd93d..7db8fc50842082fbc753dd6079ea760f15e8bd7e 100644 (file)
@@ -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()
 {
index b18ec013a4d4a9c5a8bbc653a99da6d8f4e6ccc4..447a85af55ff280269aba91de39ff515072d849b 100644 (file)
@@ -23,6 +23,9 @@ public:
        explicit MyListTab(QWidget *parent = 0);
        ~MyListTab();
 
+       QString id() const;
+       static QString name();
+
        void init();
 
        void loadSettings(QSettings *settings);
index 61fb2398ff3436738b2267b4b157ac03f2a7bdeb..8c4cba32084bc6bc118387bfdf062a2b7e039af2 100644 (file)
@@ -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);
index e36c2cadeb9c3e16cd730696fc8dfce7ff201628..af04831e33201952fd2653e19334a7857d2bce0e 100644 (file)
@@ -17,6 +17,9 @@ public:
        explicit ReportsTab(QWidget *parent = 0);
        ~ReportsTab();
 
+       QString id() const;
+       static QString name();
+
        void init();
        void activate();
 
index 924f73a76e6692760b717b460a1b78695f144e37..fb4982804d86132fd7e0dcbed0f1eb2dccd6ef6c 100644 (file)
@@ -1,6 +1,9 @@
 #include "tabwidget.h"
 
 #include <QSettings>
+#include <QMenu>
+#include <QAction>
+#include <QSignalMapper>
 
 #include "abstracttab.h"
 #include "mainwindow.h"
 #include <QDebug>
 
 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<QString> TabWidget::tabMenuOrder;
+QHash<QString, TabWidget::TabName> TabWidget::registeredTabNames;
+QHash<QString, TabWidget::TabFactory> TabWidget::registeredTabs;
+
index 7ff0241c6d199cb9f70694a9ee4be14b3c4d48a1..9e4069f96b95e45b6f7317741b6b48470b138dab 100644 (file)
@@ -2,17 +2,37 @@
 #define TABWIDGET_H
 
 #include <QTabWidget>
+#include <QHash>
+#include <functional>
+
+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<AbstractTab *()> TabFactory;
+       typedef std::function<QString()> 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<typename T> static bool registerTab()
+       {
+               // TODO fix this
+               return registerTab(T().id(), T::name, TabWidget::createTab<T>);
+       }
+
+       template<typename T> static T *createTab() { return new T; }
+
+private:
+       static QList<QString> tabMenuOrder;
+       static QHash<QString, TabName> registeredTabNames;
+       static QHash<QString, TabFactory> registeredTabs;
 };
 
 #endif // TABWIDGET_H