diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7bed6499..5a769e1b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -58,6 +58,7 @@ set(keepassx_SOURCES gui/DatabaseTabWidget.cpp gui/DatabaseWidget.cpp gui/DialogyWidget.cpp + gui/DragTabBar.cpp gui/EditEntryWidget.cpp gui/EditGroupWidget.cpp gui/EditWidget.cpp @@ -96,6 +97,7 @@ set(keepassx_MOC gui/DatabaseTabWidget.h gui/DatabaseWidget.h gui/DialogyWidget.h + gui/DragTabBar.h gui/EditEntryWidget.h gui/EditGroupWidget.h gui/EditWidget.h diff --git a/src/gui/DatabaseTabWidget.cpp b/src/gui/DatabaseTabWidget.cpp index 688b0b97..8e474f0b 100644 --- a/src/gui/DatabaseTabWidget.cpp +++ b/src/gui/DatabaseTabWidget.cpp @@ -26,6 +26,7 @@ #include "core/Metadata.h" #include "gui/DatabaseOpenDialog.h" #include "gui/DatabaseWidget.h" +#include "gui/DragTabBar.h" #include "gui/EntryView.h" #include "gui/FileDialog.h" #include "gui/GroupView.h" @@ -43,6 +44,10 @@ DatabaseTabWidget::DatabaseTabWidget(QWidget* parent) : QTabWidget(parent) , m_window(parent->window()) { + DragTabBar* tabBar = new DragTabBar(this); + tabBar->setDrawBase(false); + setTabBar(tabBar); + connect(this, SIGNAL(tabCloseRequested(int)), SLOT(closeDatabase(int))); connect(this, SIGNAL(currentChanged(int)), SLOT(emitEntrySelectionChanged())); } diff --git a/src/gui/DragTabBar.cpp b/src/gui/DragTabBar.cpp new file mode 100644 index 00000000..0fff6912 --- /dev/null +++ b/src/gui/DragTabBar.cpp @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2012 Felix Geyer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "DragTabBar.h" + +#include +#include +#include + +DragTabBar::DragTabBar(QWidget* parent) + : QTabBar(parent) + , m_tabSwitchTimer(new QTimer(this)) + , m_tabSwitchIndex(-1) +{ + m_tabSwitchTimer->setSingleShot(true); + connect(m_tabSwitchTimer, SIGNAL(timeout()), SLOT(dragSwitchTab())); + + setAcceptDrops(true); +} + +void DragTabBar::dragEnterEvent(QDragEnterEvent* event) +{ + int tab = tabAt(event->pos()); + + if (tab != -1) { + if (tab != currentIndex()) { + m_tabSwitchIndex = tab; + m_tabSwitchTimer->start(QApplication::doubleClickInterval() * 2); + } + event->setAccepted(true); + } + else { + QTabBar::dragEnterEvent(event); + } +} + +void DragTabBar::dragMoveEvent(QDragMoveEvent* event) +{ + int tab = tabAt(event->pos()); + + if (tab != -1) { + if (tab == currentIndex()) { + m_tabSwitchTimer->stop(); + } + else if (tab != m_tabSwitchIndex) { + m_tabSwitchIndex = tab; + m_tabSwitchTimer->start(QApplication::doubleClickInterval() * 2); + } + event->setAccepted(true); + } + else { + m_tabSwitchIndex = -1; + m_tabSwitchTimer->stop(); + QTabBar::dragMoveEvent(event); + } +} + +void DragTabBar::dragLeaveEvent(QDragLeaveEvent* event) +{ + m_tabSwitchIndex = -1; + m_tabSwitchTimer->stop(); + QTabBar::dragLeaveEvent(event); +} + +void DragTabBar::dropEvent(QDropEvent* event) +{ + m_tabSwitchIndex = -1; + m_tabSwitchTimer->stop(); + QTabBar::dropEvent(event); +} + +void DragTabBar::tabLayoutChange() +{ + m_tabSwitchIndex = -1; + m_tabSwitchTimer->stop(); + QTabBar::tabLayoutChange(); +} + +void DragTabBar::dragSwitchTab() +{ + int tab = tabAt(mapFromGlobal(QCursor::pos())); + + if (tab != -1 && tab == m_tabSwitchIndex) { + m_tabSwitchIndex = -1; + setCurrentIndex(tab); + } +} diff --git a/src/gui/DragTabBar.h b/src/gui/DragTabBar.h new file mode 100644 index 00000000..a9232d17 --- /dev/null +++ b/src/gui/DragTabBar.h @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2012 Felix Geyer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef KEEPASSX_DRAGTABWIDGET_H +#define KEEPASSX_DRAGTABWIDGET_H + +#include + +class DragTabBar : public QTabBar +{ + Q_OBJECT + +public: + DragTabBar(QWidget* parent = 0); + +protected: + void dragEnterEvent(QDragEnterEvent* event); + void dragMoveEvent(QDragMoveEvent* event); + void dragLeaveEvent(QDragLeaveEvent* event); + void dropEvent(QDropEvent* event); + void tabLayoutChange(); + +private Q_SLOTS: + void dragSwitchTab(); + +private: + QTimer* m_tabSwitchTimer; + int m_tabSwitchIndex; +}; + +#endif // KEEPASSX_DRAGTABWIDGET_H