[Kst] branches/work/kst/portto4/kst/src/libkstapp

Peter Kümmel syntheticpp at gmx.net
Fri Aug 27 18:40:45 CEST 2010


SVN commit 1168869 by kuemmel:

Plots could be moved to a other tab by drag&drop.
Drag the plot with the upper left round button to a other tabbar.

CBUG: 248885


 M  +49 -0     tabwidget.cpp  
 M  +38 -1     viewitem.cpp  
 M  +15 -0     viewitem.h  


--- branches/work/kst/portto4/kst/src/libkstapp/tabwidget.cpp #1168868:1168869
@@ -12,7 +12,10 @@
 #include "tabwidget.h"
 #include "mainwindow.h"
 #include "view.h"
+#include "viewitem.h"
+#include "curveplacement.h"
 
+
 #include <QInputDialog>
 #include <QMenu>
 #include <QTabBar>
@@ -21,8 +24,53 @@
 
 namespace Kst {
 
+class TabBar : public QTabBar
+{
+public:
+  TabBar(TabWidget* tabw);
+
+  void dragEnterEvent(QDragEnterEvent* event);
+  void dragMoveEvent(QDragMoveEvent* event);
+  void dropEvent(QDropEvent* event);
+
+  TabWidget* tabWidget;
+};
+
+TabBar::TabBar(TabWidget* tabw) : QTabBar(), tabWidget(tabw)
+{
+  setAcceptDrops(true);
+}
+
+void TabBar::dragEnterEvent(QDragEnterEvent* event)
+{
+  if (MimeDataViewItem::downcast(event->mimeData())) {
+      event->acceptProposedAction();
+  }
+}
+
+void TabBar::dragMoveEvent(QDragMoveEvent* event)
+{  
+  if (MimeDataViewItem::downcast(event->mimeData())) {
+    setCurrentIndex(tabAt(event->pos()));
+    event->acceptProposedAction();
+   }
+}
+
+void TabBar::dropEvent(QDropEvent* event)
+{
+  const MimeDataViewItem* m = MimeDataViewItem::downcast(event->mimeData());
+  if (m && m->item) {       
+    View* view = tabWidget->currentView();
+    view->appendToLayout(CurvePlacement::Auto, m->item);
+    event->acceptProposedAction();
+  }
+}
+
+
+
 TabWidget::TabWidget(QWidget *parent)
 : QTabWidget(parent) {
+  setTabBar(new TabBar(this));
   tabBar()->setContextMenuPolicy(Qt::CustomContextMenu);
   connect(tabBar(), SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(contextMenu(const QPoint&)));
   _cnt = 0;
@@ -56,6 +104,7 @@
 
   addTab(view, label);
   setCurrentWidget(view);
+  tabBar()->setAcceptDrops(true);
 }
 
 
--- branches/work/kst/portto4/kst/src/libkstapp/viewitem.cpp #1168868:1168869
@@ -31,6 +31,8 @@
 #include <QGraphicsScene>
 #include <QGraphicsSceneContextMenuEvent>
 #include <QInputDialog>
+#include <QDrag>
+#include <QMimeData>
 
 static const double ONE_PI = 3.14159265358979323846264338327950288419717;
 static double TWO_PI = 2.0 * ONE_PI;
@@ -108,6 +110,8 @@
 
   _customLayoutAction = new QAction(tr("Custom"), this);
   connect(_customLayoutAction, SIGNAL(triggered()), this, SLOT(createCustomLayout()));
+
+  setAcceptDrops(true);
 }
 
 
@@ -915,6 +919,23 @@
 
 void ViewItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
 
+  if (event->buttons() & Qt::LeftButton &&
+      (event->pos() - dragStartPosition).manhattanLength() > QApplication::startDragDistance()) {
+
+    QDrag *drag = new QDrag(event->widget());
+    MimeDataViewItem* mimeData = new MimeDataViewItem;
+    mimeData->item = this;
+    drag->setMimeData(mimeData);
+
+    
+    Qt::DropActions dact = Qt::MoveAction;
+    Qt::DropAction dropAction = drag->exec(dact);
+    if (dropAction == Qt::MoveAction) {
+      _autoLayoutAction->trigger();
+    }
+  }
+
+
   if (parentView()->viewMode() == View::Data) {
     event->ignore();
     return;
@@ -1587,12 +1608,18 @@
 
 void ViewItem::mousePressEvent(QGraphicsSceneMouseEvent *event) {
 
+  QPointF p = event->pos();
+  if (checkBox().contains(p)) {
+    if (event->buttons() & Qt::LeftButton) {
+       dragStartPosition = p;
+    }
+  }
+
   if (parentView()->viewMode() == View::Data) {
     event->ignore();
     return;
   }
 
-  QPointF p = event->pos();
   if (isAllowed(TopLeftGrip) && topLeftGrip().contains(p)) {
     setActiveGrip(TopLeftGrip);
   } else if (isAllowed(TopRightGrip) && topRightGrip().contains(p)) {
@@ -2166,6 +2193,16 @@
   _item->setTransform(_newTransform);
 }
 
+
+
+
+MimeDataViewItem::MimeDataViewItem() : QMimeData() {
 }
 
+const MimeDataViewItem* MimeDataViewItem::downcast(const QMimeData* m) {
+  return qobject_cast<const MimeDataViewItem*>(m);
+}
+
+}
+
 // vim: ts=2 sw=2 et
--- branches/work/kst/portto4/kst/src/libkstapp/viewitem.h #1168868:1168869
@@ -17,6 +17,7 @@
 #include <QXmlStreamWriter>
 #include <QHash>
 #include <QAction>
+#include <QMimeData>
 
 #include "namedobject.h"
 #include "kst_export.h"
@@ -259,6 +260,7 @@
     virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
     virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value);
 
+
     QAction *_editAction;
     QAction *_deleteAction;
     QAction *_raiseAction;
@@ -310,6 +312,8 @@
 
     QSizeF _layoutMargins, _layoutSpacing;
 
+    QPointF dragStartPosition;
+
     friend class View;
     friend class Scene;
 };
@@ -522,6 +526,17 @@
   return tItems;
 }
 
+class MimeDataViewItem : public QMimeData
+{
+  Q_OBJECT
+public:
+  MimeDataViewItem();
+
+  ViewItem* item;
+
+  static const MimeDataViewItem* downcast(const QMimeData*);
+};
+
 }
 
 #endif


More information about the Kst mailing list