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

List:       kde-panel-devel
Subject:    [Panel-devel] KDE/kdebase/workspace/plasma/applets/kickoff/ui
From:       Aaron J. Seigo <aseigo () kde ! org>
Date:       2007-11-17 19:30:58
Message-ID: 1195327858.290798.8969.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 738047 by aseigo:

ensure that a parent menu is shown in the same position and with the same item \
selected when leaving a submenu. patch by Jason Stubbs (who needs to get an svn \
account ;)

not safe yet for multi-level jumps (or menu resets, it seems), but that isn't \
possible with the current UI anyways. CCMAIL:panel-devel@kde.org.


 M  +31 -24    flipscrollview.cpp  


--- trunk/KDE/kdebase/workspace/plasma/applets/kickoff/ui/flipscrollview.cpp \
#738046:738047 @@ -24,6 +24,7 @@
 #include <QMouseEvent>
 #include <QPainter>
 #include <QScrollBar>
+#include <QStack>
 #include <QTimeLine>
 #include <QtDebug>
 
@@ -42,7 +43,6 @@
           , backArrowHover(false)
           , flipAnimTimeLine(new QTimeLine())
           , animLeftToRight(true)
-          , previousVerticalOffset(0)
     {
     }
     ~Private() 
@@ -58,33 +58,40 @@
             return q->rootIndex(); 
         }
     }
-    QModelIndex previousRoot() const {
-        return previousRootIndex;
+    QModelIndex previousRoot() const
+    {
+        if (previousRootIndices.isEmpty()) {
+            return QModelIndex();
+        }
+        return previousRootIndices.top();
     }
     void setCurrentRoot(const QModelIndex& index)
     {
-        previousRootIndex = currentRootIndex;
-        previousVerticalOffset = q->verticalOffset();
-        currentRootIndex = index;
-       
-        updateScrollBarRange();
-        q->verticalScrollBar()->setValue(0);
-
-        // when going back up the tree, highlight the item which opens
-        // the branch we have just left
-        if (previousRootIndex.parent() == index)
-            hoveredIndex = previousRootIndex;
-        else
+        if (previousRootIndices.isEmpty() || previousRootIndices.top() != index) {
+            // we're entering into a submenu
+            animLeftToRight = true;
             hoveredIndex = QModelIndex();
+            previousRootIndices.push(currentRootIndex);
+            currentRootIndex = index;
+            previousVerticalOffsets.append(q->verticalOffset());
+            updateScrollBarRange();
+            q->verticalScrollBar()->setValue(0);
+        } else {
+            // we're exiting to the parent menu
+            animLeftToRight = false;
+            hoveredIndex = currentRootIndex;
+            previousRootIndices.pop();
+            currentRootIndex = index;
+            updateScrollBarRange();
+            q->verticalScrollBar()->setValue(previousVerticalOffsets.pop());
+        }
 
-        // set whether the flip animation should go in a left to right
-        // or right to left direction. 
-        // note: this check used gives the wrong value for animLeftToRight
-        // if we go down more than one level of the tree at once 
-        animLeftToRight = currentRootIndex.parent() == previousRootIndex;
-
         flipAnimTimeLine->start();
     }
+    int previousVerticalOffset()
+    {
+        return previousVerticalOffsets.isEmpty() ? 0 : \
previousVerticalOffsets.top(); +    }
     int treeDepth(const QModelIndex& headerIndex) const 
     {
         int depth = 0;
@@ -209,13 +216,13 @@
 
     QTimeLine *flipAnimTimeLine;
     bool animLeftToRight;
-    int previousVerticalOffset;
 
     static const int FLIP_ANIM_DURATION = 300;
 
 private:
      QPersistentModelIndex currentRootIndex;
-     QPersistentModelIndex previousRootIndex;
+     QStack<QPersistentModelIndex> previousRootIndices;
+     QStack<int> previousVerticalOffsets;
 };
 
 FlipScrollView::FlipScrollView(QWidget *parent)
@@ -285,7 +292,7 @@
     }
 
     if (parentIsPreviousRoot) {
-        topOffset -= d->previousVerticalOffset;
+        topOffset -= d->previousVerticalOffset();
     } else {
         topOffset -= verticalOffset();
     }
_______________________________________________
Panel-devel mailing list
Panel-devel@kde.org
https://mail.kde.org/mailman/listinfo/panel-devel


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

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