# HG changeset patch
# User Chris Cannam
# Date 1306335940 -3600
# Node ID 75003687f3647d6a353b23c9487a2f5065ece7e0
# Parent  c3276f8998eee5a1217fc4a2d56b2dbaef3653f7
Better version of ensuring the scene size is properly updated and the detail item made visible

diff -r c3276f8998ee -r 75003687f364 src/changesetdetailitem.cpp
--- a/src/changesetdetailitem.cpp	Wed May 25 15:38:48 2011 +0100
+++ b/src/changesetdetailitem.cpp	Wed May 25 16:05:40 2011 +0100
@@ -49,6 +49,19 @@
     return QRectF(-10, -10, w + 10, m_doc->size().height() + 10);
 }
 
+QVariant
+ChangesetDetailItem::itemChange(GraphicsItemChange c, const QVariant &v)
+{
+    if (c == ItemVisibleHasChanged) {
+        bool visible = v.toBool();
+        DEBUG << "ChangesetDetailItem::itemChange: visible = " << visible << endl;
+        if (visible && scene()) {
+            ensureVisible();
+        }
+    }
+    return v;
+}
+
 void
 ChangesetDetailItem::paint(QPainter *paint,
 			   const QStyleOptionGraphicsItem *option,
diff -r c3276f8998ee -r 75003687f364 src/changesetdetailitem.h
--- a/src/changesetdetailitem.h	Wed May 25 15:38:48 2011 +0100
+++ b/src/changesetdetailitem.h	Wed May 25 16:05:40 2011 +0100
@@ -39,6 +39,8 @@
     Changeset *m_changeset;
     QTextDocument *m_doc;
 
+    QVariant itemChange(GraphicsItemChange, const QVariant &);
+
     void makeDocument();
 };
 
diff -r c3276f8998ee -r 75003687f364 src/changesetitem.cpp
--- a/src/changesetitem.cpp	Wed May 25 15:38:48 2011 +0100
+++ b/src/changesetitem.cpp	Wed May 25 16:05:40 2011 +0100
@@ -78,7 +78,6 @@
 //                     y() + 60);
     m_detail->moveBy(x() + (w + 50) / 2 + 10 + 0.5,
                      y() - (m_detail->boundingRect().height() - h) / 2 + 0.5);
-    m_detail->ensureVisible();
     emit detailShown();
 }    
 
diff -r c3276f8998ee -r 75003687f364 src/changesetscene.cpp
--- a/src/changesetscene.cpp	Wed May 25 15:38:48 2011 +0100
+++ b/src/changesetscene.cpp	Wed May 25 16:05:40 2011 +0100
@@ -106,17 +106,28 @@
 void
 ChangesetScene::itemAddCompleted()
 {
+    connect(this, SIGNAL(changed(const QList<QRectF> &)),
+            this, SLOT(recalculateSceneRect()));
+    recalculateSceneRect();
+}
+
+void
+ChangesetScene::recalculateSceneRect()
+{
+    QRectF existingSr = sceneRect();
+
     QRectF r = itemsBoundingRect();
     float minwidth = 300; //!!!
-    DEBUG << "ChangesetScene::itemAddCompleted: minwidth = " << minwidth
+    DEBUG << "ChangesetScene::recalculateSceneRect: minwidth = " << minwidth
           << ", r = " << r << endl;
     if (r.width() < minwidth) {
         float edgediff = (minwidth - r.width()) / 2;
         r.setLeft(r.left() - edgediff);
         r.setRight(r.right() + edgediff);
     }
-    DEBUG << "ChangesetScene::itemAddCompleted: r now is " << r << endl;
-    setSceneRect(r);
+    DEBUG << "ChangesetScene::recalculateSceneRect: r now is " << r << endl;
+
+    setSceneRect(r.united(existingSr));
 }
 
 void
@@ -129,8 +140,6 @@
 	m_detailShown->hideDetail();
     }
     m_detailShown = csi;
-    itemAddCompleted();
-    csi->ensureVisible();
 }
 
 void
diff -r c3276f8998ee -r 75003687f364 src/changesetscene.h
--- a/src/changesetscene.h	Wed May 25 15:38:48 2011 +0100
+++ b/src/changesetscene.h	Wed May 25 16:05:40 2011 +0100
@@ -71,6 +71,7 @@
 private slots:
     void changesetDetailShown();
     void changesetDetailHidden();
+    void recalculateSceneRect();
 
 protected:
     void drawBackground(QPainter *, const QRectF &);