diff --git a/redis-desktop-manager/forms/demo.ui b/redis-desktop-manager/forms/demo.ui index 04b4262e..706d2965 100644 --- a/redis-desktop-manager/forms/demo.ui +++ b/redis-desktop-manager/forms/demo.ui @@ -381,7 +381,7 @@ aa|bb Either aa or bb. - + 1 @@ -591,6 +591,12 @@ aa|bb Either aa or bb. QTreeView
ConnectionTreeView.h
+ + MainTabsWidget + QTabWidget +
MainTabsWidget.h
+ 1 +
diff --git a/redis-desktop-manager/include/demo.h b/redis-desktop-manager/include/demo.h index fdda4ba7..bf654806 100644 --- a/redis-desktop-manager/include/demo.h +++ b/redis-desktop-manager/include/demo.h @@ -1,5 +1,4 @@ -#ifndef DEMO_H -#define DEMO_H +#pragma once #include #include @@ -28,35 +27,18 @@ private: QMenu * keyMenu; QMenu * connectionsMenu; - // TODO: move to custom tabWidget class - void addTab(QString&, QWidget*, QString icon = QString(), bool forceOpenInNewTab = false); - // todo: move to custom tabWidget class - void closeCurrentTabWithValue(); - // todo: move to custom tabWidget class - void closeAllServerTabs(RedisServerItem *); - // todo: move to custom tabWidget class - void openKeyTab(RedisKeyItem * key, bool inNewTab = false); - - // todo: move to custom tabWidget class - /** @return >=0 if exist **/ - int getTabIndex(QString&); - - // todo: move to custom Settings class QString getConfigPath(const QString&); void initFormButtons(); void initConnectionsTreeView(); - //todo combine in one method - initContextMenus() void initServerMenu(); void initKeyMenu(); void initConnectionsMenu(); // end todo - - void initTabs(); void initUpdater(); void initFilter(); @@ -64,7 +46,6 @@ private: void OnAddConnectionClick(); void OnConnectionTreeClick(const QModelIndex & index); void OnConnectionTreeWheelClick(const QModelIndex & index); - void OnTabClose(int index); void OnTreeViewContextMenu(const QPoint &); void OnReloadServerInTree(); void OnDisconnectFromServer(); @@ -81,7 +62,4 @@ private: void OnUIUnlock(); void OnStatusMessage(QString); void OnKeyOpenInNewTab(); - void OnKeyDeleted(QWidget * tab, RedisKeyItem * key); }; - -#endif // DEMO_H diff --git a/redis-desktop-manager/include/widgets/MainTabsWidget.h b/redis-desktop-manager/include/widgets/MainTabsWidget.h new file mode 100644 index 00000000..b43add56 --- /dev/null +++ b/redis-desktop-manager/include/widgets/MainTabsWidget.h @@ -0,0 +1,39 @@ +#pragma once + +#include + +class RedisServerItem; +class RedisKeyItem; + +class MainTabsWidget : public QTabWidget +{ + Q_OBJECT + +public: + MainTabsWidget(QWidget * parent = nullptr); + + int addTab(QString&, QWidget*, QString icon = QString(), bool forceOpenInNewTab = false); + + int addTab(QWidget*, const QIcon&, const QString &); + + int addTab(QWidget*, const QString &); + + void closeTab(unsigned int index); + + void closeAllServerTabs(RedisServerItem *); + + void openKeyTab(RedisKeyItem * key, bool inNewTab = false); + +protected: + void closeCurrentTabWithValue(); + + /** @return >=0 if exist **/ + int getTabIndex(QString&); + +protected slots: + void OnTabClose(int i); + void OnKeyDeleted(QWidget * tab, RedisKeyItem * key); + + +}; + diff --git a/redis-desktop-manager/source/demo.cpp b/redis-desktop-manager/source/demo.cpp index 94fe7b2b..13bcf2a8 100644 --- a/redis-desktop-manager/source/demo.cpp +++ b/redis-desktop-manager/source/demo.cpp @@ -27,7 +27,6 @@ MainWin::MainWin(QWidget *parent) initKeyMenu(); initConnectionsMenu(); initFormButtons(); - initTabs(); initUpdater(); initFilter(); @@ -97,17 +96,6 @@ void MainWin::initFormButtons() connect(ui.pbImportConnections, SIGNAL(clicked()), SLOT(OnImportConnectionsClick())); } -void MainWin::initTabs() -{ - connect(ui.tabWidget, SIGNAL(tabCloseRequested(int)), this, SLOT(OnTabClose(int))); - -#ifndef Q_OS_DARWIN - //hide close button for first tab - // on Mac Os this code crash application - ui.tabWidget->tabBar()->tabButton(0, QTabBar::RightSide)->setFixedWidth(0); -#endif -} - void MainWin::initUpdater() { //set current version @@ -205,106 +193,20 @@ void MainWin::OnConnectionTreeClick(const QModelIndex & index) break; case RedisKeyItem::TYPE: - openKeyTab((RedisKeyItem *)item); + ui.tabWidget->openKeyTab((RedisKeyItem *)item); break; } } -void MainWin::openKeyTab(RedisKeyItem * key, bool inNewTab) -{ - QWidget * viewTab = new ValueTab(key); - - connect(viewTab, SIGNAL(keyDeleted(QWidget *, RedisKeyItem *)), - this, SLOT(OnKeyDeleted(QWidget *, RedisKeyItem *))); - - connect(viewTab, SIGNAL(error(const QString &)), - this, SLOT(OnError(const QString &))); - - QString keyFullName = key->getTabLabelText(); - - if (inNewTab) { - addTab(keyFullName, viewTab, QString(), true); - } else { - addTab(keyFullName, viewTab); - } -} - void MainWin::OnConnectionTreeWheelClick(const QModelIndex & index) { QStandardItem * item = connections->itemFromIndex(index); if (item->type() == RedisKeyItem::TYPE) { - openKeyTab((RedisKeyItem *)item, true); + ui.tabWidget->openKeyTab((RedisKeyItem *)item, true); } } -void MainWin::OnTabClose(int index) -{ - ValueTab * w = qobject_cast (ui.tabWidget->widget(index)); - - ui.tabWidget->removeTab(index); - - w->close(); -} - -int MainWin::getTabIndex(QString& name) -{ - for (int i = 0; i < ui.tabWidget->count(); ++i) - { - if (name == ui.tabWidget->tabText(i)) { - return i; - } - } - - return -1; -} - -void MainWin::closeCurrentTabWithValue() -{ - int currIndex = ui.tabWidget->currentIndex(); - - if (currIndex == -1) - return; - - QWidget * w = ui.tabWidget->widget(currIndex); - - if (w->objectName() == "valueTabReady") { - OnTabClose(currIndex); - } -} - -void MainWin::closeAllServerTabs(RedisServerItem * server) -{ - unsigned int tabsCount = ui.tabWidget->count(); - - QString title; - - for (int tabIndex = 0; tabIndex < tabsCount; tabIndex++) - { - title = ui.tabWidget->widget(tabIndex)->windowTitle(); - - //if (title.contains)) - - } -} - -void MainWin::addTab(QString& tabName, QWidget* tab, QString icon, bool forceOpenInNewTab) -{ - int currIndex; - - if (!forceOpenInNewTab) { - closeCurrentTabWithValue(); - } - - if (icon.isEmpty()) { - currIndex = ui.tabWidget->addTab(tab, tabName); - } else { - currIndex = ui.tabWidget->addTab(tab, QIcon(icon), tabName); - } - - ui.tabWidget->setCurrentIndex(currIndex); -} - // todo: move responsibility to ConnectionTreeView // ConnectionTreeView::setItemsContextMenu( QHash( int => QMenu ) ) @@ -472,7 +374,7 @@ void MainWin::OnServerInfoOpen() serverInfoViewTab * tab = new serverInfoViewTab(server->text(), info); QString serverName = QString("Info: %1").arg(server->text()); - addTab(serverName, tab, ":/images/serverinfo.png"); + ui.tabWidget->addTab(serverName, tab, ":/images/serverinfo.png"); } void MainWin::OnConsoleOpen() @@ -489,7 +391,7 @@ void MainWin::OnConsoleOpen() QString serverName = server->text(); - addTab(serverName, tab, ":/images/terminal.png"); + ui.tabWidget->addTab(serverName, tab, ":/images/terminal.png"); } void MainWin::OnKeyOpenInNewTab() @@ -499,7 +401,7 @@ void MainWin::OnKeyOpenInNewTab() if (item == nullptr || item->type() != RedisKeyItem::TYPE) return; - openKeyTab((RedisKeyItem *)item, true); + ui.tabWidget->openKeyTab((RedisKeyItem *)item, true); } void MainWin::OnError(QString msg) @@ -520,29 +422,4 @@ void MainWin::OnUIUnlock() void MainWin::OnStatusMessage(QString message) { statusBar()->showMessage(message); -} - - -// TODO: move responsibility to ValueTab + RedisServerDbItem -void MainWin::OnKeyDeleted(QWidget * tab, RedisKeyItem * key) -{ - if (tab == nullptr || key == nullptr) - return; - - int widgetsCount = ui.tabWidget->count(); - int widgetIndex = -1; - - for (int currentWidget = 0; currentWidget < widgetsCount; currentWidget++) - { - if (tab == ui.tabWidget->widget(currentWidget)) { - widgetIndex = currentWidget; - break; - } - } - - if (widgetIndex == -1) { - return; - } - - OnTabClose(widgetIndex); -} +} \ No newline at end of file diff --git a/redis-desktop-manager/source/widgets/MainTabsWidget.cpp b/redis-desktop-manager/source/widgets/MainTabsWidget.cpp new file mode 100644 index 00000000..e49c8f56 --- /dev/null +++ b/redis-desktop-manager/source/widgets/MainTabsWidget.cpp @@ -0,0 +1,147 @@ +#include "MainTabsWidget.h" +#include +#include "valueViewTab.h" + +MainTabsWidget::MainTabsWidget(QWidget * parent) + : QTabWidget(parent) +{ + connect(this, SIGNAL(tabCloseRequested(int)), this, SLOT(OnTabClose(int))); +} + +int MainTabsWidget::addTab(QWidget*w, const QIcon&i, const QString &label) +{ +#ifndef Q_OS_DARWIN + //hide close button for first tab + // on Mac Os this code crash application + if (count() == 0) { + int currentIndex = QTabWidget::addTab(w, i, label); + tabBar()->tabButton(0, QTabBar::RightSide)->setFixedWidth(0); + return currentIndex; + } +#endif + + return QTabWidget::addTab(w, i, label); +} + +int MainTabsWidget::addTab(QWidget*w, const QString &label) +{ + return QTabWidget::addTab(w, label); +} + +int MainTabsWidget::addTab(QString& tabName, QWidget* tab, QString icon, bool forceOpenInNewTab) +{ + int currIndex; + + if (!forceOpenInNewTab) { + closeCurrentTabWithValue(); + } + + if (icon.isEmpty()) { + currIndex = QTabWidget::addTab(tab, tabName); + } else { + currIndex = QTabWidget::addTab(tab, QIcon(icon), tabName); + } + + setCurrentIndex(currIndex); + + return currIndex; +} + +void MainTabsWidget::openKeyTab(RedisKeyItem * key, bool inNewTab) +{ + QWidget * viewTab = new ValueTab(key); + + connect(viewTab, SIGNAL(keyDeleted(QWidget *, RedisKeyItem *)), + this, SLOT(OnKeyDeleted(QWidget *, RedisKeyItem *))); + + connect(viewTab, SIGNAL(error(const QString &)), + this, SLOT(OnError(const QString &))); + + QString keyFullName = key->getTabLabelText(); + + if (inNewTab) { + addTab(keyFullName, viewTab, QString(), true); + } else { + addTab(keyFullName, viewTab); + } +} + +void MainTabsWidget::OnKeyDeleted(QWidget * tab, RedisKeyItem * key) +{ + if (tab == nullptr || key == nullptr) + return; + + int widgetsCount = count(); + int widgetIndex = -1; + + for (int currentWidget = 0; currentWidget < widgetsCount; currentWidget++) + { + if (tab == widget(currentWidget)) { + widgetIndex = currentWidget; + break; + } + } + + if (widgetIndex == -1) { + return; + } + + closeTab(widgetIndex); +} + +int MainTabsWidget::getTabIndex(QString& name) +{ + for (int i = 0; i < count(); ++i) + { + if (name == tabText(i)) { + return i; + } + } + + return -1; +} + +void MainTabsWidget::closeCurrentTabWithValue() +{ + int currIndex = currentIndex(); + + if (currIndex == -1) + return; + + QWidget * w = widget(currIndex); + + if (w->objectName() == "valueTabReady") { + closeTab(currIndex); + } +} + +void MainTabsWidget::closeTab(unsigned int index) +{ + ValueTab * w = qobject_cast (widget(index)); + + removeTab(index); + + w->close(); +} + +void MainTabsWidget::OnTabClose(int index) +{ + closeTab((unsigned int)index); +} + +void MainTabsWidget::closeAllServerTabs(RedisServerItem * server) +{ + unsigned int tabsCount = count(); + + QString title; + + for (int tabIndex = 0; tabIndex < tabsCount; tabIndex++) + { + title = widget(tabIndex)->windowTitle(); + + //if (title.contains)) + + + //todo implement this + } +} \ No newline at end of file