[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdelibs/plasma/private
From:       Aaron J. Seigo <aseigo () kde ! org>
Date:       2008-11-10 3:53:35
Message-ID: 1226289215.906813.1949.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 882217 by aseigo:

first draft of draggable toolbox; doesn't work quite properly yet due to historical \
oddnesses of the toolbox itself. will finish up in the days to comes; all TODOs are \
documented


 M  +1 -0      desktoptoolbox.cpp  
 M  +106 -4    toolbox.cpp  
 M  +4 -0      toolbox_p.h  


--- trunk/KDE/kdelibs/plasma/private/desktoptoolbox.cpp #882216:882217
@@ -113,6 +113,7 @@
     setFlag(ItemClipsToShape, true);
     setFlag(ItemClipsChildrenToShape, false);
     setFlag(ItemIgnoresTransformations, true);
+    setIsMovable(true);
 }
 
 DesktopToolBox::~DesktopToolBox()
--- trunk/KDE/kdelibs/plasma/private/toolbox.cpp #882216:882217
@@ -40,16 +40,21 @@
     ToolBoxPrivate()
       : size(50),
       iconSize(32, 32),
+      corner(ToolBox::TopRight),
       hidden(false),
       showing(false),
-      corner(ToolBox::TopRight)
+      movable(false),
+      dragging(false)
     {}
 
     int size;
     QSize iconSize;
-    bool hidden;
-    bool showing;
     ToolBox::Corner corner;
+    QPoint dragStart;
+    bool hidden : 1;
+    bool showing : 1;
+    bool movable : 1;
+    bool dragging : 1;
 };
 
 ToolBox::ToolBox(QGraphicsItem *parent)
@@ -173,15 +178,112 @@
 void ToolBox::mousePressEvent(QGraphicsSceneMouseEvent *event)
 {
     event->accept();
+    d->dragStart = mapToParent(event->pos()).toPoint();
 }
 
+void ToolBox::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
+    if (!d->movable || (!d->dragging && boundingRect().contains(event->pos()))) {
+        return;
+    }
+
+    //TODOs:
+    // save toolbox position
+    // move relative to where on the toolbox it was grabbed
+    // stop the toolbox from painting and having a boundingRect that is negative
+    // sticky points at midpoints
+    // change how buttons appear depending on the location of the box
+    d->dragging = true;
+    const QPoint newPos = mapToParent(event->pos()).toPoint();
+    const QPoint curPos = pos().toPoint();
+    const int h = abs(boundingRect().height());
+    const int w = abs(boundingRect().width());
+
+    const int areaWidth = parentWidget()->size().width();
+    const int areaHeight = parentWidget()->size().height();
+
+    int x = curPos.x();
+    int y = curPos.y();
+
+    if (y == 0 || y + h >= areaHeight) {
+        x = curPos.x() + (newPos.x() - d->dragStart.x());
+        if (x < 0) {
+            x = 0;
+        } else if (x + w > areaWidth) {
+            x = areaWidth - w;
+        }
+    }
+
+    //kDebug() << x << w << areaWidth;
+    if (x == 0 || x + w >= areaWidth) {
+        //kDebug() << "moving along the y axis" << curPos << newPos << d->dragStart;
+        y = curPos.y() + (newPos.y() - d->dragStart.y());
+
+        if (y < 0) {
+            y = 0;
+        } else if (y + h > areaHeight) {
+            y = areaHeight - h;
+        }
+    }
+
+    x = qBound(0, x, areaWidth - w);
+    y = qBound(0, y, areaHeight - h);
+
+
+    Corner newCorner = d->corner;
+    if (x == 0) {
+        if (y == 0) {
+            newCorner = TopLeft;
+        } else if (y + h >= areaHeight) {
+            newCorner = BottomLeft;
+        } else {
+            newCorner = Left;
+        }
+    } else if (y == 0) {
+        if (x + w >= areaWidth) {
+            newCorner = TopRight;
+        } else {
+            newCorner = Top;
+        }
+    } else if (x + w >= areaWidth) {
+        if (y + h >= areaHeight) {
+            newCorner = BottomRight;
+        } else {
+            newCorner = Right;
+        }
+    } else {
+        newCorner = Bottom;
+    }
+
+    if (newCorner != d->corner) {
+        prepareGeometryChange();
+        d->corner = newCorner;
+    }
+
+    setPos(x, y);
+    d->dragStart = newPos;
+}
+
 void ToolBox::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
 {
-    if (boundingRect().contains(event->pos())) {
+    if (!d->dragging && boundingRect().contains(event->pos())) {
         emit toggled();
     }
+
+    d->dragStart = QPoint();
+    d->dragging = false;
 }
 
+bool ToolBox::isMovable() const
+{
+    return d->movable;
+}
+
+void ToolBox::setIsMovable(bool movable)
+{
+    d->movable = movable;
+}
+
 } // plasma namespace
 
 #include "toolbox_p.moc"
--- trunk/KDE/kdelibs/plasma/private/toolbox_p.h #882216:882217
@@ -75,6 +75,9 @@
     void setCorner(Corner corner);
     Corner corner() const;
 
+    bool isMovable() const;
+    void setIsMovable(bool movable);
+
     virtual void showToolBox() = 0;
     virtual void hideToolBox() = 0;
 public Q_SLOTS:
@@ -88,6 +91,7 @@
 protected:
     QPoint toolPosition(int toolHeight);
     void mousePressEvent(QGraphicsSceneMouseEvent *event);
+    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
     void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
 
 private:


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic