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

List:       kde-commits
Subject:    KDE/kdelibs/plasma
From:       Marco Martin <notmart () gmail ! com>
Date:       2009-03-02 20:32:02
Message-ID: 1236025922.499940.5077.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 934351 by mart:

deactivate the dialog borders that are at the edge of the working
desktop, makes kickoff more fitts law friendly and gives for free an
extender-like appearance to all dialogs


 M  +58 -20    dialog.cpp  
 M  +1 -0      dialog.h  


--- trunk/KDE/kdelibs/plasma/dialog.cpp #934350:934351
@@ -30,10 +30,13 @@
 #include <QX11Info>
 #endif
 #include <QBitmap>
+#include <QTimer>
 #include <QtGui/QVBoxLayout>
 #include <QtGui/QGraphicsSceneEvent>
 #include <QtGui/QGraphicsView>
 #include <QtGui/QGraphicsWidget>
+#include <QApplication>
+#include <QDesktopWidget>
 
 #include <kdebug.h>
 #include <netwm.h>
@@ -60,7 +63,8 @@
               view(0),
               widget(0),
               resizeCorners(Dialog::NoCorner),
-              resizeStartCorner(Dialog::NoCorner)
+              resizeStartCorner(Dialog::NoCorner),
+              moveTimer(0)
     {
     }
 
@@ -84,47 +88,70 @@
     Dialog::ResizeCorners resizeCorners;
     QMap<Dialog::ResizeCorner, QRect> resizeAreas;
     Dialog::ResizeCorner resizeStartCorner;
+    QTimer *moveTimer;
 };
 
 void DialogPrivate::themeUpdated()
 {
-    const int topHeight = background->marginSize(Plasma::TopMargin);
-    const int leftWidth = background->marginSize(Plasma::LeftMargin);
-    const int rightWidth = background->marginSize(Plasma::RightMargin);
-    const int bottomHeight = background->marginSize(Plasma::BottomMargin);
+    int topHeight = background->marginSize(Plasma::TopMargin);
+    int leftWidth = background->marginSize(Plasma::LeftMargin);
+    int rightWidth = background->marginSize(Plasma::RightMargin);
+    int bottomHeight = background->marginSize(Plasma::BottomMargin);
 
+    FrameSvg::EnabledBorders borders = FrameSvg::AllBorders;
+
     //TODO: correct handling of the situation when having vertical panels.
     Extender *extender = qobject_cast<Extender*>(widget);
     if (extender) {
         switch (extender->d->applet->location()) {
         case BottomEdge:
-            background->setEnabledBorders(FrameSvg::LeftBorder | FrameSvg::TopBorder
-                                                               | FrameSvg::RightBorder);
-            q->setContentsMargins(0, topHeight, 0, 0);
+            borders ^= FrameSvg::BottomBorder;
+            leftWidth = 0;
+            rightWidth = 0;
+            bottomHeight = 0;
             break;
         case TopEdge:
-            background->setEnabledBorders(FrameSvg::LeftBorder | FrameSvg::BottomBorder
-                                                               | FrameSvg::RightBorder);
-            q->setContentsMargins(0, 0, 0, bottomHeight);
+            borders ^= FrameSvg::TopBorder;
+            topHeight = 0;
+            leftWidth = 0;
+            rightWidth = 0;
             break;
         case LeftEdge:
-            background->setEnabledBorders(FrameSvg::TopBorder | FrameSvg::BottomBorder
-                                                              | FrameSvg::RightBorder);
-            q->setContentsMargins(0, topHeight, 0, bottomHeight);
+            borders ^= FrameSvg::LeftBorder;
+            leftWidth = 0;
+            rightWidth = 0;
             break;
         case RightEdge:
-            background->setEnabledBorders(FrameSvg::TopBorder | FrameSvg::BottomBorder
-                                                              | FrameSvg::LeftBorder);
-            q->setContentsMargins(0, topHeight, 0, bottomHeight);
+            borders ^= FrameSvg::RightBorder;
+            leftWidth = 0;
+            rightWidth = 0;
             break;
         default:
-            background->setEnabledBorders(FrameSvg::AllBorders);
-            q->setContentsMargins(leftWidth, topHeight, rightWidth, bottomHeight);
+            break;
         }
     } else {
-        q->setContentsMargins(leftWidth, topHeight, rightWidth, bottomHeight);
+        QRect avail = QApplication::desktop()->availableGeometry();
+        QRect dialogGeom = q->geometry();
+
+        if (dialogGeom.left() <= avail.left()) {
+            borders ^= FrameSvg::LeftBorder;
+        }
+        if (dialogGeom.top() <= avail.top()) {
+            borders ^= FrameSvg::TopBorder;
+        }
+        //FIXME: that 2 pixels offset has probably something to do with kwin
+        if (dialogGeom.right() + 2 > avail.right()) {
+            borders ^= FrameSvg::RightBorder;
+        }
+        if (dialogGeom.bottom() + 2 > avail.bottom()) {
+            borders ^= FrameSvg::BottomBorder;
+        }
     }
 
+    background->setEnabledBorders(borders);
+
+    q->setContentsMargins(leftWidth, topHeight, rightWidth, bottomHeight);
+
     q->update();
 }
 
@@ -429,9 +456,20 @@
         d->widget->setFocus();
     }
 
+    d->themeUpdated();
     emit dialogVisible(true);
 }
 
+void Dialog::moveEvent(QMoveEvent *event)
+{
+    if (!d->moveTimer) {
+        d->moveTimer = new QTimer(this);
+        d->moveTimer->setSingleShot(true);
+        connect(d->moveTimer, SIGNAL(timeout()), this, SLOT(themeUpdated()));
+    }
+    d->moveTimer->start(200);
+}
+
 void Dialog::setResizeHandleCorners(ResizeCorners corners)
 {
     if (d->resizeCorners != corners) {
--- trunk/KDE/kdelibs/plasma/dialog.h #934350:934351
@@ -111,6 +111,7 @@
         void mousePressEvent(QMouseEvent *event);
         void mouseReleaseEvent(QMouseEvent *event);
         void keyPressEvent(QKeyEvent *event);
+        void moveEvent(QMoveEvent *event);
 
         /**
          * Convenience method to know whether the point is in a control area (e.g. resize area)
[prev in list] [next in list] [prev in thread] [next in thread] 

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