diff --git a/modules/gui/src/panels/tabbed_panel_bar.cc b/modules/gui/src/panels/tabbed_panel_bar.cc index 914c25ae1717e163fd81d41a63d26a5403e6e835..25cd310a60eeff3c7c62533738924d883a2c01e9 100644 --- a/modules/gui/src/panels/tabbed_panel_bar.cc +++ b/modules/gui/src/panels/tabbed_panel_bar.cc @@ -17,9 +17,12 @@ // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA //------------------------------------------------------------------------------ +#include <QApplication> #include <QSettings> #include <QDir> +#include <ost/gui/gosty_app.hh> +#include <ost/gui/perspective.hh> #include <ost/gui/widget_registry.hh> #include "tabbed_panel_bar.hh" @@ -32,7 +35,7 @@ TabbedPanelBar::TabbedPanelBar(PanelBar* parent): layout_ = new QHBoxLayout(this); layout_->setMargin(0); layout_->setSpacing(0); - tab_widget_ = new QTabWidget(this); + tab_widget_ = new TabbedDragWidget(this); #if QT_VERSION>=0x40503 tab_widget_->setDocumentMode(true); #endif @@ -94,10 +97,73 @@ void TabbedPanelBar::CurrentChanged(int index){ } } - TabbedPanelBar::~TabbedPanelBar(){ toolbar_->clear(); } +//TabbedDragWidget +TabbedDragWidget::TabbedDragWidget(QWidget* parent): + QTabWidget(parent) { + setTabBar(new DragTabBar(this)); +} + +//DragTabBar +DragTabBar::DragTabBar(QTabWidget* parent): + QTabBar(parent),tab_widget_(parent) { + this->setAcceptDrops(true); +} + +void DragTabBar::mousePressEvent(QMouseEvent *event) +{ + if (event->button() == Qt::LeftButton){ + drag_start_pos_ = event->pos(); + } + QTabBar::mousePressEvent(event); +} + +void DragTabBar::mouseMoveEvent(QMouseEvent *event) +{ + if (!(event->buttons() & Qt::LeftButton)) return; + + if ((event->pos() - drag_start_pos_).manhattanLength() + < QApplication::startDragDistance()) return; + + Widget* widget = qobject_cast<Widget*>(tab_widget_->currentWidget()); + if(!widget)return; + + QDrag *drag = new QDrag(this); + QMimeData *mime_data = new QMimeData; + QVariant self; + self.setValue(widget); + mime_data->setData("OpenStructure/Widget",QByteArray()); + mime_data->setProperty("OpenStructure/Widget",self); + + drag->setMimeData(mime_data); + drag->exec(); + PanelManager* panels = GostyApp::Instance()->GetPerspective()->GetPanels(); + panels->EndDrag(); +} + +void DragTabBar::dragEnterEvent(QDragEnterEvent *event) +{ + if (event->mimeData()->hasFormat("OpenStructure/Widget")){ + PanelManager* panels = GostyApp::Instance()->GetPerspective()->GetPanels(); + panels->StartDrag(); + event->acceptProposedAction(); + } +} + +void DragTabBar::dropEvent(QDropEvent *event) +{ + const QMimeData* mime_data = event->mimeData(); + QVariant variant = mime_data->property("OpenStructure/Widget"); + Widget* widget = variant.value<Widget*>(); + Widget* current_widget = qobject_cast<Widget*>(tab_widget_->currentWidget()); + if(widget && current_widget && widget != current_widget){ + GostyApp::Instance()->GetPerspective()->GetPanels()->MoveNextTo(current_widget,widget); + } + event->acceptProposedAction(); +} + }} diff --git a/modules/gui/src/panels/tabbed_panel_bar.hh b/modules/gui/src/panels/tabbed_panel_bar.hh index dd889bb02d1f068456be408b0dc67161ceb87c4e..7ec4d8959c3019e716b57c220ed2b3035d33c65e 100644 --- a/modules/gui/src/panels/tabbed_panel_bar.hh +++ b/modules/gui/src/panels/tabbed_panel_bar.hh @@ -23,6 +23,7 @@ #include <QWidget> #include <QString> #include <QAction> +#include <QTabBar> #include <QTabWidget> #include <QToolBar> @@ -35,7 +36,32 @@ namespace ost { namespace gui { -/// \brief tabbed bottom Bar +/// \brief tabbed drag widget +class DLLEXPORT_OST_GUI DragTabBar : public QTabBar{ + Q_OBJECT +public: + DragTabBar(QTabWidget* parent); + +protected: + void mousePressEvent(QMouseEvent *event); + void mouseMoveEvent(QMouseEvent *event); + void dragEnterEvent(QDragEnterEvent *event); + void dropEvent(QDropEvent *event); + +private: + QTabWidget* tab_widget_; + QPoint drag_start_pos_; + +}; + +/// \brief tabbed drag widget +class DLLEXPORT_OST_GUI TabbedDragWidget : public QTabWidget{ + Q_OBJECT +public: + TabbedDragWidget(QWidget* parent); +}; + +/// \brief tabbed bar class DLLEXPORT_OST_GUI TabbedPanelBar : public PanelWidgetContainer { Q_OBJECT public: