comparison historywidget.cpp @ 145:644bd31e8301

* Include the uncommitted item in general graph layout (in case it is not at the head, when other items will need to avoid it)
author Chris Cannam
date Wed, 01 Dec 2010 17:41:14 +0000
parents e6c6b88d19b9
children 465c8d51c6d5
comparison
equal deleted inserted replaced
143:f61f032b06f9 145:644bd31e8301
30 30
31 HistoryWidget::HistoryWidget() 31 HistoryWidget::HistoryWidget()
32 { 32 {
33 m_panned = new Panned; 33 m_panned = new Panned;
34 m_panner = new Panner; 34 m_panner = new Panner;
35 m_uncommitted = new UncommittedItem();
36 m_uncommitted->setRow(-1);
37 m_uncommittedVisible = false;
38 35
39 QGridLayout *layout = new QGridLayout; 36 QGridLayout *layout = new QGridLayout;
40 layout->addWidget(m_panned, 0, 0); 37 layout->addWidget(m_panned, 0, 0);
41 layout->addWidget(m_panner, 0, 1); 38 layout->addWidget(m_panner, 0, 1);
42 m_panner->setMaximumWidth(80); 39 m_panner->setMaximumWidth(80);
46 } 43 }
47 44
48 HistoryWidget::~HistoryWidget() 45 HistoryWidget::~HistoryWidget()
49 { 46 {
50 clearChangesets(); 47 clearChangesets();
51 if (!m_uncommittedVisible) delete m_uncommitted; 48 }
49
50 QGraphicsScene *HistoryWidget::scene()
51 {
52 return m_panned->scene();
52 } 53 }
53 54
54 void HistoryWidget::clearChangesets() 55 void HistoryWidget::clearChangesets()
55 { 56 {
56 foreach (Changeset *cs, m_changesets) delete cs; 57 foreach (Changeset *cs, m_changesets) delete cs;
57 m_changesets.clear(); 58 m_changesets.clear();
58 } 59 }
59 60
60 void HistoryWidget::setCurrent(QStringList ids) 61 void HistoryWidget::setCurrent(QStringList ids, bool showUncommitted)
61 { 62 {
62 if (m_currentIds == ids) return; 63 if (m_currentIds == ids && m_showUncommitted == showUncommitted) return;
63 DEBUG << "HistoryWidget::setCurrent: " << ids.size() << " ids" << endl; 64
65 DEBUG << "HistoryWidget::setCurrent: " << ids.size() << " ids, "
66 << "showUncommitted: " << showUncommitted << endl;
67
64 m_currentIds.clear(); 68 m_currentIds.clear();
69 m_uncommittedParentId = "";
70 m_showUncommitted = showUncommitted;
71
72 if (ids.empty()) return;
73
65 foreach (QString id, ids) { 74 foreach (QString id, ids) {
66 m_currentIds.push_back(id); 75 m_currentIds.push_back(id);
67 } 76 }
68 updateNewAndCurrentItems(); 77
69 } 78 if (m_showUncommitted) m_uncommittedParentId = m_currentIds[0];
70 79 layoutAll();
71 void HistoryWidget::showUncommittedChanges(bool show)
72 {
73 if (m_uncommittedVisible == show) return;
74 m_uncommittedVisible = show;
75 ChangesetScene *scene = qobject_cast<ChangesetScene *>(m_panned->scene());
76 if (!scene) return;
77 if (m_uncommittedVisible) {
78 scene->addUncommittedItem(m_uncommitted);
79 m_uncommitted->ensureVisible();
80 } else {
81 scene->removeItem(m_uncommitted);
82 }
83 } 80 }
84 81
85 void HistoryWidget::parseNewLog(QString log) 82 void HistoryWidget::parseNewLog(QString log)
86 { 83 {
87 DEBUG << "HistoryWidget::parseNewLog: log has " << log.length() << " chars" << endl; 84 DEBUG << "HistoryWidget::parseNewLog: log has " << log.length() << " chars" << endl;
150 ChangesetScene *scene = new ChangesetScene(); 147 ChangesetScene *scene = new ChangesetScene();
151 ChangesetItem *tipItem = 0; 148 ChangesetItem *tipItem = 0;
152 149
153 QGraphicsScene *oldScene = m_panned->scene(); 150 QGraphicsScene *oldScene = m_panned->scene();
154 151
155 // detach m_uncommitted from old scene so it doesn't get deleted
156 if (oldScene && (m_uncommitted->scene() == oldScene)) {
157 oldScene->removeItem(m_uncommitted);
158 }
159
160 m_panned->setScene(0); 152 m_panned->setScene(0);
161 m_panner->setScene(0); 153 m_panner->setScene(0);
162 154
163 delete oldScene; 155 delete oldScene;
156
157 QGraphicsItem *toFocus = 0;
164 158
165 if (!m_changesets.empty()) { 159 if (!m_changesets.empty()) {
166 Grapher g(scene); 160 Grapher g(scene);
167 try { 161 try {
168 g.layout(m_changesets); 162 g.layout(m_changesets, m_uncommittedParentId);
169 } catch (std::string s) { 163 } catch (std::string s) {
170 std::cerr << "Internal error: Layout failed: " << s << std::endl; 164 std::cerr << "Internal error: Layout failed: " << s << std::endl;
171 } 165 }
172 tipItem = g.getItemFor(m_changesets[0]); 166 toFocus = g.getUncommittedItem();
173 DEBUG << "tipItem is " << tipItem << " for tip changeset " 167 if (!toFocus) {
174 << m_changesets[0]->id() << endl; 168 toFocus = g.getItemFor(m_changesets[0]);
175 } 169 }
176
177 if (m_uncommittedVisible) {
178 scene->addUncommittedItem(m_uncommitted);
179 } 170 }
180 171
181 m_panned->setScene(scene); 172 m_panned->setScene(scene);
182 m_panner->setScene(scene); 173 m_panner->setScene(scene);
183 174
184 updateNewAndCurrentItems(); 175 updateNewAndCurrentItems();
185 176
186 if (m_uncommittedVisible) { 177 if (toFocus) {
187 DEBUG << "asking uncommitted item to be visible" << endl; 178 toFocus->ensureVisible();
188 m_uncommitted->ensureVisible();
189 } else if (tipItem) {
190 DEBUG << "asking tip item to be visible" << endl;
191 tipItem->ensureVisible();
192 } 179 }
193 180
194 connectSceneSignals(); 181 connectSceneSignals();
195 } 182 }
196 183
235 DEBUG << "id " << id << " is new" << endl; 222 DEBUG << "id " << id << " is new" << endl;
236 } 223 }
237 224
238 csit->setCurrent(current); 225 csit->setCurrent(current);
239 csit->setNew(newid); 226 csit->setNew(newid);
240
241 if (current) {
242 m_uncommitted->setRow(csit->row() - 1);
243 m_uncommitted->setColumn(csit->column());
244 m_uncommitted->setWide(csit->isWide());
245 m_uncommitted->setBranch(csit->getChangeset()->branch());
246 }
247 } 227 }
248 } 228 }
249 229
250 void HistoryWidget::connectSceneSignals() 230 void HistoryWidget::connectSceneSignals()
251 { 231 {