src/gui/widgets/qdockarealayout.cpp
changeset 30 5dc02b23752f
parent 19 fcece45ef507
--- a/src/gui/widgets/qdockarealayout.cpp	Wed Jun 23 19:07:03 2010 +0300
+++ b/src/gui/widgets/qdockarealayout.cpp	Tue Jul 06 15:10:48 2010 +0300
@@ -220,20 +220,22 @@
 }
 #endif
 
+static const int zero = 0;
+
 QDockAreaLayoutInfo::QDockAreaLayoutInfo()
-    : sep(0), dockPos(QInternal::LeftDock), o(Qt::Horizontal), mainWindow(0)
+    : sep(&zero), dockPos(QInternal::LeftDock), o(Qt::Horizontal), mainWindow(0)
 #ifndef QT_NO_TABBAR
-    , tabbed(false), tabBar(0), tabBarShape(QTabBar::RoundedSouth), tabBarVisible(false)
+    , tabbed(false), tabBar(0), tabBarShape(QTabBar::RoundedSouth)
 #endif
 {
 }
 
-QDockAreaLayoutInfo::QDockAreaLayoutInfo(int _sep, QInternal::DockPosition _dockPos,
+QDockAreaLayoutInfo::QDockAreaLayoutInfo(const int *_sep, QInternal::DockPosition _dockPos,
                                             Qt::Orientation _o, int tbshape,
                                             QMainWindow *window)
     : sep(_sep), dockPos(_dockPos), o(_o), mainWindow(window)
 #ifndef QT_NO_TABBAR
-    , tabbed(false), tabBar(0), tabBarShape(static_cast<QTabBar::Shape>(tbshape)), tabBarVisible(false)
+    , tabbed(false), tabBar(0), tabBarShape(static_cast<QTabBar::Shape>(tbshape))
 #endif
 {
 #ifdef QT_NO_TABBAR
@@ -281,7 +283,7 @@
 #endif
         {
             if (!first)
-                a += sep;
+                a += *sep;
             a += pick(o, min_size);
         }
         b = qMax(b, perp(o, min_size));
@@ -294,8 +296,8 @@
     rperp(o, result) = b;
 
 #ifndef QT_NO_TABBAR
-    if (tabbed) {
-        QSize tbm = tabBarMinimumSize();
+    QSize tbm = tabBarMinimumSize();
+    if (!tbm.isNull()) {
         switch (tabBarShape) {
             case QTabBar::RoundedNorth:
             case QTabBar::RoundedSouth:
@@ -349,7 +351,7 @@
 #endif
         {
             if (!first)
-                a += sep;
+                a += *sep;
             a += pick(o, max_size);
         }
         b = qMin(b, perp(o, max_size));
@@ -367,8 +369,8 @@
     rperp(o, result) = b;
 
 #ifndef QT_NO_TABBAR
-    if (tabbed) {
-        QSize tbh = tabBarSizeHint();
+    QSize tbh = tabBarSizeHint();
+    if (!tbh.isNull()) {
         switch (tabBarShape) {
             case QTabBar::RoundedNorth:
             case QTabBar::RoundedSouth:
@@ -415,7 +417,7 @@
         {
             if (previous && !gap && !(previous->flags &  QDockAreaLayoutItem::GapItem)
                 && !previous->hasFixedSize(o)) {
-                a += sep;
+                a += *sep;
             }
             a += gap ? item.size : pick(o, size_hint);
         }
@@ -491,7 +493,7 @@
             min = pick(info.o, item.minimumSize());
 
         if (!first)
-            result += info.sep;
+            result += *info.sep;
         result += min;
 
         first = false;
@@ -516,7 +518,7 @@
             max = pick(info.o, item.maximumSize());
 
         if (!first)
-            result += info.sep;
+            result += *info.sep;
         result += max;
 
         if (result >= QWIDGETSIZE_MAX)
@@ -555,7 +557,7 @@
             if (!(previous->flags & QDockAreaLayoutItem::GapItem)) {
                 QLayoutStruct &ls = layout_struct_list[j++];
                 ls.init();
-                ls.minimumSize = ls.maximumSize = ls.sizeHint = previous->hasFixedSize(o) ? 0 : sep;
+                ls.minimumSize = ls.maximumSize = ls.sizeHint = previous->hasFixedSize(o) ? 0 : *sep;
                 ls.empty = false;
             }
         }
@@ -938,7 +940,7 @@
         if (item.skip()) {
             ls.empty = true;
         } else {
-            const int separatorSpace = item.hasFixedSize(o) ? 0 : sep;
+            const int separatorSpace = item.hasFixedSize(o) ? 0 : *sep;
             ls.empty = false;
             ls.pos = item.pos;
             ls.size = item.size + separatorSpace;
@@ -956,7 +958,7 @@
         if (item.skip())
             continue;
         QLayoutStruct &ls = list[i];
-        const int separatorSpace = item.hasFixedSize(o) ? 0 : sep;
+        const int separatorSpace = item.hasFixedSize(o) ? 0 : *sep;
         item.size = ls.size - separatorSpace;
         item.pos = ls.pos;
         if (item.subinfo != 0) {
@@ -1041,11 +1043,11 @@
         int next = this->next(index);
 
         if (prev != -1 && !(item_list.at(prev).flags & QDockAreaLayoutItem::GapItem)) {
-            item.pos += sep;
-            item.size -= sep;
+            item.pos += *sep;
+            item.size -= *sep;
         }
         if (next != -1 && !(item_list.at(next).flags & QDockAreaLayoutItem::GapItem))
-            item.size -= sep;
+            item.size -= *sep;
 
         QPoint pos;
         rpick(o, pos) = item.pos;
@@ -1083,11 +1085,11 @@
 #endif
     {
         if (prev != -1 && !(item_list.at(prev).flags & QDockAreaLayoutItem::GapItem)) {
-            item.pos -= sep;
-            item.size += sep;
+            item.pos -= *sep;
+            item.size += *sep;
         }
         if (next != -1 && !(item_list.at(next).flags & QDockAreaLayoutItem::GapItem))
-            item.size += sep;
+            item.size += *sep;
     }
 
     return item.widgetItem;
@@ -1255,9 +1257,9 @@
             QRect r = dockedGeometry(dockWidgetItem->widget());
             gap_size = pick(o, r.size());
         if (prev != -1 && !(item_list.at(prev).flags & QDockAreaLayoutItem::GapItem))
-                sep_size += sep;
+                sep_size += *sep;
             if (next != -1 && !(item_list.at(next).flags & QDockAreaLayoutItem::GapItem))
-                sep_size += sep;
+                sep_size += *sep;
         }
         if (gap_size + sep_size > space)
             gap_size = pick(o, gap_item.minimumSize());
@@ -1364,7 +1366,7 @@
     QPoint pos = rect.topLeft();
     rpick(o, pos) = item.pos + item.size;
     QSize s = rect.size();
-    rpick(o, s) = sep;
+    rpick(o, s) = *sep;
 
     return QRect(pos, s);
 }
@@ -1413,7 +1415,7 @@
             continue;
 
         QRect sepRect = separatorRect(i);
-        if (!sepRect.isNull() && sep == 1)
+        if (!sepRect.isNull() && *sep == 1)
             sepRect.adjust(-2, -2, 2, 2);
         //we also make sure we don't find a separator that's not there
         if (sepRect.contains(_pos) && !item.hasFixedSize(o)) {
@@ -1498,7 +1500,7 @@
         QRect tab_rect;
         QSize tbh = tabBarSizeHint();
 
-        if (tabBarVisible) {
+        if (!tbh.isNull()) {
             switch (tabBarShape) {
                 case QTabBar::RoundedNorth:
                 case QTabBar::TriangularNorth:
@@ -1560,7 +1562,7 @@
         }
     }
 #ifndef QT_NO_TABBAR
-    if (sep == 1)
+    if (*sep == 1)
         updateSeparatorWidgets();
 #endif //QT_NO_TABBAR
 }
@@ -1983,7 +1985,10 @@
                         emit widget->dockLocationChanged(toDockWidgetArea(dockPos));
                     }
                 }
-
+		if (testing) {
+		  //was it is not really added to the layout, we need to delete the object here
+		  delete item.widgetItem;
+		}
             }
         } else if (nextMarker == SequenceMarker) {
             int dummy;
@@ -2013,7 +2018,7 @@
         updateTabBar();
         setCurrentTabId(tabId(item_list.at(index)));
     }
-    if (!testing && sep == 1)
+    if (!testing && *sep == 1)
         updateSeparatorWidgets();
 #endif
 
@@ -2074,10 +2079,11 @@
 #endif //QT_NO_TABBAR
 
 #ifndef QT_NO_TABBAR
-void QDockAreaLayoutInfo::updateTabBar() const
+//returns whether the tabbar is visible or not
+bool QDockAreaLayoutInfo::updateTabBar() const
 {
     if (!tabbed)
-        return;
+        return false;
 
     QDockAreaLayoutInfo *that = const_cast<QDockAreaLayoutInfo*>(this);
 
@@ -2145,12 +2151,8 @@
 
     tabBar->blockSignals(blocked);
 
-    that->tabBarVisible = ( (gap ? 1 : 0) + tabBar->count()) > 1;
-
-    if (changed || !tabBarMin.isValid() | !tabBarHint.isValid()) {
-        that->tabBarMin = tabBar->minimumSizeHint();
-        that->tabBarHint = tabBar->sizeHint();
-    }
+    //returns if the tabbar is visible or not
+    return ( (gap ? 1 : 0) + tabBar->count()) > 1;
 }
 
 void QDockAreaLayoutInfo::setTabBarShape(int shape)
@@ -2158,11 +2160,8 @@
     if (shape == tabBarShape)
         return;
     tabBarShape = shape;
-    if (tabBar != 0) {
+    if (tabBar != 0)
         tabBar->setShape(static_cast<QTabBar::Shape>(shape));
-        tabBarMin = QSize();
-        tabBarHint = QSize();
-    }
 
     for (int i = 0; i < item_list.count(); ++i) {
         QDockAreaLayoutItem &item = item_list[i];
@@ -2173,22 +2172,18 @@
 
 QSize QDockAreaLayoutInfo::tabBarMinimumSize() const
 {
-    if (!tabbed)
+    if (!updateTabBar())
         return QSize(0, 0);
 
-    updateTabBar();
-
-    return tabBarMin;
+    return tabBar->minimumSizeHint();
 }
 
 QSize QDockAreaLayoutInfo::tabBarSizeHint() const
 {
-    if (!tabbed)
+    if (!updateTabBar())
         return QSize(0, 0);
 
-    updateTabBar();
-
-    return tabBarHint;
+    return tabBar->sizeHint();
 }
 
 QSet<QTabBar*> QDockAreaLayoutInfo::usedTabBars() const
@@ -2235,7 +2230,7 @@
     QRect result = rect;
     QSize tbh = tabBarSizeHint();
 
-    if (tabBarVisible) {
+    if (!tbh.isNull()) {
         switch (tabBarShape) {
             case QTabBar::RoundedNorth:
             case QTabBar::TriangularNorth:
@@ -2276,13 +2271,13 @@
     const int tabShape = 0;
 #endif
     docks[QInternal::LeftDock]
-        = QDockAreaLayoutInfo(sep, QInternal::LeftDock, Qt::Vertical, tabShape, win);
+        = QDockAreaLayoutInfo(&sep, QInternal::LeftDock, Qt::Vertical, tabShape, win);
     docks[QInternal::RightDock]
-        = QDockAreaLayoutInfo(sep, QInternal::RightDock, Qt::Vertical, tabShape, win);
+        = QDockAreaLayoutInfo(&sep, QInternal::RightDock, Qt::Vertical, tabShape, win);
     docks[QInternal::TopDock]
-        = QDockAreaLayoutInfo(sep, QInternal::TopDock, Qt::Horizontal, tabShape, win);
+        = QDockAreaLayoutInfo(&sep, QInternal::TopDock, Qt::Horizontal, tabShape, win);
     docks[QInternal::BottomDock]
-        = QDockAreaLayoutInfo(sep, QInternal::BottomDock, Qt::Horizontal, tabShape, win);
+        = QDockAreaLayoutInfo(&sep, QInternal::BottomDock, Qt::Horizontal, tabShape, win);
     centralWidgetItem = 0;
 
 
@@ -2994,8 +2989,7 @@
         QRect r = constrainedRect(placeHolder->topLevelRect, desktop.screenGeometry(dockWidget));
         dockWidget->d_func()->setWindowState(true, true, r);
     }
-    dockWidget->show();
-//    dockWidget->setVisible(!placeHolder->hidden);
+    dockWidget->setVisible(!placeHolder->hidden);
 #ifdef Q_WS_X11
     if (placeHolder->window) // gets rid of the X11BypassWindowManager window flag
         dockWidget->d_func()->setWindowState(true);
@@ -3031,7 +3025,7 @@
 #else
         int tbshape = 0;
 #endif
-        QDockAreaLayoutInfo new_info(sep, pos, orientation, tbshape, mainWindow);
+        QDockAreaLayoutInfo new_info(&sep, pos, orientation, tbshape, mainWindow);
         new_info.item_list.append(new QDockAreaLayoutInfo(info));
         new_info.item_list.append(dockWidgetItem);
         info = new_info;
@@ -3327,6 +3321,12 @@
         item.flags |= QDockAreaLayoutItem::KeepSize;
 }
 
+void QDockAreaLayout::styleChangedEvent()
+{
+    sep = mainWindow->style()->pixelMetric(QStyle::PM_DockWidgetSeparatorExtent, 0, mainWindow);
+    fitLayout();
+}
+
 QT_END_NAMESPACE
 
 #endif // QT_NO_DOCKWIDGET