comparison changesetitem.cpp @ 153:70fe12873106

* Show both parents of uncommitted merge; fixes to right-button menus
author Chris Cannam
date Thu, 02 Dec 2010 17:55:21 +0000
parents 2fef6b0dfbe8
children 97faf861618b
comparison
equal deleted inserted replaced
152:2b997861174b 153:70fe12873106
27 #include <QGraphicsSceneMouseEvent> 27 #include <QGraphicsSceneMouseEvent>
28 #include <QMenu> 28 #include <QMenu>
29 #include <QAction> 29 #include <QAction>
30 #include <QLabel> 30 #include <QLabel>
31 #include <QWidgetAction> 31 #include <QWidgetAction>
32 #include <QApplication>
33 #include <QClipboard>
32 34
33 ChangesetItem::ChangesetItem(Changeset *cs) : 35 ChangesetItem::ChangesetItem(Changeset *cs) :
34 m_changeset(cs), m_detail(0), 36 m_changeset(cs), m_detail(0),
35 m_showBranch(false), m_column(0), m_row(0), m_wide(false), 37 m_showBranch(false), m_column(0), m_row(0), m_wide(false),
36 m_current(false), m_new(false) 38 m_current(false), m_new(false)
101 } 103 }
102 104
103 void 105 void
104 ChangesetItem::activateMenu() 106 ChangesetItem::activateMenu()
105 { 107 {
108 m_parentDiffActions.clear();
109
106 QMenu *menu = new QMenu; 110 QMenu *menu = new QMenu;
107 QLabel *label = new QLabel(tr("<qt><b>Revision: </b>%1</qt>") 111 QLabel *label = new QLabel(tr("<qt>&nbsp;<b>Revision: </b>%1</qt>")
108 .arg(m_changeset->id())); 112 .arg(m_changeset->id()));
109 QWidgetAction *wa = new QWidgetAction(menu); 113 QWidgetAction *wa = new QWidgetAction(menu);
110 wa->setDefaultWidget(label); 114 wa->setDefaultWidget(label);
111 menu->addAction(wa); 115 menu->addAction(wa);
112 menu->addSeparator(); 116 menu->addSeparator();
113 117
118 QAction *copyId = menu->addAction(tr("Copy identifier to clipboard"));
119 connect(copyId, SIGNAL(triggered()), this, SLOT(copyIdActivated()));
120
121 menu->addSeparator();
122
123 if (m_changeset->parents().size() > 1) {
124
125 foreach (QString parentId, m_changeset->parents()) {
126 QAction *diffParent =
127 menu->addAction(tr("Diff to parent %1").arg(parentId));
128 connect(diffParent, SIGNAL(triggered()),
129 this, SLOT(diffToParentActivated()));
130 m_parentDiffActions[diffParent] = parentId;
131 }
132
133 } else {
134
135 QAction *diffParent =
136 menu->addAction(tr("Diff to parent"));
137 connect(diffParent, SIGNAL(triggered()),
138 this, SLOT(diffToParentActivated()));
139 }
140
141 QAction *diffCurrent = menu->addAction(tr("Diff to current working folder"));
142 connect(diffCurrent, SIGNAL(triggered()), this, SLOT(diffToCurrentActivated()));
143
144 menu->addSeparator();
145
114 QAction *update = menu->addAction(tr("Update to this revision")); 146 QAction *update = menu->addAction(tr("Update to this revision"));
115 connect(update, SIGNAL(triggered()), this, SLOT(updateActivated())); 147 connect(update, SIGNAL(triggered()), this, SLOT(updateActivated()));
116 148
117 menu->addSeparator();
118
119 QAction *diffParent = menu->addAction(tr("Diff against previous revision"));
120 connect(diffParent, SIGNAL(triggered()), this, SLOT(diffToPreviousActivated()));
121 QAction *diffCurrent = menu->addAction(tr("Diff against current revision"));
122 connect(diffCurrent, SIGNAL(triggered()), this, SLOT(diffToCurrentActivated()));
123
124 menu->addSeparator();
125
126 QAction *merge = menu->addAction(tr("Merge from here to current")); 149 QAction *merge = menu->addAction(tr("Merge from here to current"));
127 connect(merge, SIGNAL(triggered()), this, SLOT(mergeActivated())); 150 connect(merge, SIGNAL(triggered()), this, SLOT(mergeActivated()));
128 QAction *tag = menu->addAction(tr("Tag this revision")); 151
152 menu->addSeparator();
153
154 QAction *tag = menu->addAction(tr("Add tag..."));
129 connect(tag, SIGNAL(triggered()), this, SLOT(tagActivated())); 155 connect(tag, SIGNAL(triggered()), this, SLOT(tagActivated()));
130 156
131 menu->exec(QCursor::pos()); 157 menu->exec(QCursor::pos());
132 158
133 ungrabMouse(); 159 ungrabMouse();
134 } 160 }
135 161
162 void
163 ChangesetItem::copyIdActivated()
164 {
165 QClipboard *clipboard = QApplication::clipboard();
166 clipboard->setText(Changeset::hashOf(m_changeset->id()));
167 }
168
169 void ChangesetItem::diffToParentActivated()
170 {
171 QAction *a = qobject_cast<QAction *>(sender());
172 QString parentId;
173 if (m_parentDiffActions.contains(a)) {
174 parentId = m_parentDiffActions[a];
175 DEBUG << "ChangesetItem::diffToParentActivated: specific parent "
176 << parentId << " selected" << endl;
177 } else {
178 parentId = m_changeset->parents()[0];
179 DEBUG << "ChangesetItem::diffToParentActivated: "
180 << "no specific parent selected, using first parent "
181 << parentId << endl;
182 }
183
184 emit diffToParent(getId(), parentId);
185 }
186
136 void ChangesetItem::updateActivated() { emit updateTo(getId()); } 187 void ChangesetItem::updateActivated() { emit updateTo(getId()); }
137 void ChangesetItem::diffToPreviousActivated() { emit diffToParent(getId(), m_changeset->parents()[0]); } //!!! no, this is most likely to be useful when something has more than one parent!
138 void ChangesetItem::diffToCurrentActivated() { emit diffToCurrent(getId()); } 188 void ChangesetItem::diffToCurrentActivated() { emit diffToCurrent(getId()); }
139 void ChangesetItem::mergeActivated() { emit mergeFrom(getId()); } 189 void ChangesetItem::mergeActivated() { emit mergeFrom(getId()); }
140 void ChangesetItem::tagActivated() { emit tag(getId()); } 190 void ChangesetItem::tagActivated() { emit tag(getId()); }
141 191
142 void 192 void
226 } 276 }
227 } 277 }
228 278
229 if (m_showBranch) { 279 if (m_showBranch) {
230 // write branch name 280 // write branch name
281 paint->save();
231 f.setBold(true); 282 f.setBold(true);
232 paint->setFont(f); 283 paint->setFont(f);
284 paint->setPen(QPen(branchColour));
233 QString branch = m_changeset->branch(); 285 QString branch = m_changeset->branch();
234 if (branch == "") branch = "default"; 286 if (branch == "") branch = "default";
235 int wid = width - 3; 287 int wid = width - 3;
236 branch = TextAbbrev::abbreviate(branch, QFontMetrics(f), wid); 288 branch = TextAbbrev::abbreviate(branch, QFontMetrics(f), wid);
237 paint->drawText(x0, -fh + fm.ascent() - 4, branch); 289 paint->drawText(x0, -fh + fm.ascent() - 4, branch);
238 f.setBold(false); 290 f.setBold(false);
239 } 291 paint->restore();
240 292 }
241 // f.setItalic(true); 293
242 fm = QFontMetrics(f); 294 fm = QFontMetrics(f);
243 fh = fm.height(); 295 fh = fm.height();
244 paint->setFont(f); 296 paint->setFont(f);
245 297
246 QString comment = m_changeset->comment().trimmed(); 298 QString comment = m_changeset->comment().trimmed();