# HG changeset patch # User Chris Cannam # Date 1291139771 0 # Node ID e6c6b88d19b9a7db59e82e420f6e0a8513f4cd6e # Parent bad40d7e7a2bc50c1fe1a6d040e8887e84c3e804 * Start hooking up right-button menus on changeset & uncommitted items diff -r bad40d7e7a2b -r e6c6b88d19b9 changesetitem.cpp --- a/changesetitem.cpp Tue Nov 30 14:59:52 2010 +0000 +++ b/changesetitem.cpp Tue Nov 30 17:56:11 2010 +0000 @@ -41,6 +41,12 @@ m_font.setItalic(false); } +QString +ChangesetItem::getId() +{ + return m_changeset->id(); +} + QRectF ChangesetItem::boundingRect() const { @@ -87,6 +93,9 @@ showDetail(); } } else if (e->button() == Qt::RightButton) { + if (m_detail) { + hideDetail(); + } activateMenu(); } } @@ -95,22 +104,41 @@ ChangesetItem::activateMenu() { QMenu *menu = new QMenu; - QLabel *label = new QLabel(tr("Identifier: %1") + QLabel *label = new QLabel(tr("Revision: %1") .arg(m_changeset->id())); - QWidgetAction *wa = new QWidgetAction(menu);; + QWidgetAction *wa = new QWidgetAction(menu); wa->setDefaultWidget(label); menu->addAction(wa); menu->addSeparator(); + QAction *update = menu->addAction(tr("Update to this revision")); + connect(update, SIGNAL(triggered()), this, SLOT(updateActivated())); + menu->addSeparator(); + QAction *diffParent = menu->addAction(tr("Diff against previous revision")); + connect(diffParent, SIGNAL(triggered()), this, SLOT(diffToPreviousActivated())); QAction *diffCurrent = menu->addAction(tr("Diff against current revision")); + connect(diffCurrent, SIGNAL(triggered()), this, SLOT(diffToCurrentActivated())); + menu->addSeparator(); + QAction *merge = menu->addAction(tr("Merge from here to current")); + connect(merge, SIGNAL(triggered()), this, SLOT(mergeActivated())); QAction *tag = menu->addAction(tr("Tag this revision")); - menu->exec(QCursor::pos()); + connect(tag, SIGNAL(triggered()), this, SLOT(tagActivated())); + + QAction *a = menu->exec(QCursor::pos()); + ungrabMouse(); + if (a) a->trigger(); } +void ChangesetItem::updateActivated() { emit updateTo(getId()); } +void ChangesetItem::diffToPreviousActivated() { emit diffToPrevious(getId()); } +void ChangesetItem::diffToCurrentActivated() { emit diffToCurrent(getId()); } +void ChangesetItem::mergeActivated() { emit mergeFrom(getId()); } +void ChangesetItem::tagActivated() { emit tag(getId()); } + void ChangesetItem::paint(QPainter *paint, const QStyleOptionGraphicsItem *option, QWidget *w) diff -r bad40d7e7a2b -r e6c6b88d19b9 changesetitem.h --- a/changesetitem.h Tue Nov 30 14:59:52 2010 +0000 +++ b/changesetitem.h Tue Nov 30 17:56:11 2010 +0000 @@ -36,6 +36,7 @@ virtual void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *); Changeset *getChangeset() { return m_changeset; } + QString getId(); int column() const { return m_column; } int row() const { return m_row; } @@ -58,10 +59,23 @@ void detailShown(); void detailHidden(); + void updateTo(QString); + void diffToPrevious(QString); + void diffToCurrent(QString); + void mergeFrom(QString); + void tag(QString); + public slots: void showDetail(); void hideDetail(); +private slots: + void updateActivated(); + void diffToPreviousActivated(); + void diffToCurrentActivated(); + void mergeActivated(); + void tagActivated(); + protected: virtual void mousePressEvent(QGraphicsSceneMouseEvent *); diff -r bad40d7e7a2b -r e6c6b88d19b9 changesetscene.cpp --- a/changesetscene.cpp Tue Nov 30 14:59:52 2010 +0000 +++ b/changesetscene.cpp Tue Nov 30 17:56:11 2010 +0000 @@ -17,6 +17,7 @@ #include "changesetscene.h" #include "changesetitem.h" +#include "uncommitteditem.h" ChangesetScene::ChangesetScene() : QGraphicsScene(), m_detailShown(0) @@ -24,6 +25,45 @@ } void +ChangesetScene::addChangesetItem(ChangesetItem *item) +{ + addItem(item); + + connect(item, SIGNAL(detailShown()), + this, SLOT(changesetDetailShown())); + + connect(item, SIGNAL(updateTo(QString)), + this, SIGNAL(updateTo(QString))); + + connect(item, SIGNAL(diffToCurrent(QString)), + this, SIGNAL(diffToCurrent(QString))); + + connect(item, SIGNAL(diffToPrevious(QString)), + this, SIGNAL(diffToPrevious(QString))); + + connect(item, SIGNAL(mergeFrom(QString)), + this, SIGNAL(mergeFrom(QString))); + + connect(item, SIGNAL(tag(QString)), + this, SIGNAL(tag(QString))); +} + +void +ChangesetScene::addUncommittedItem(UncommittedItem *item) +{ + addItem(item); + + connect(item, SIGNAL(commit()), + this, SIGNAL(commit())); + + connect(item, SIGNAL(revert()), + this, SIGNAL(revert())); + + connect(item, SIGNAL(diff()), + this, SIGNAL(diffWorkingFolder())); +} + +void ChangesetScene::changesetDetailShown() { ChangesetItem *csi = qobject_cast(sender()); diff -r bad40d7e7a2b -r e6c6b88d19b9 changesetscene.h --- a/changesetscene.h Tue Nov 30 14:59:52 2010 +0000 +++ b/changesetscene.h Tue Nov 30 17:56:11 2010 +0000 @@ -21,6 +21,7 @@ #include class ChangesetItem; +class UncommittedItem; class ChangesetScene : public QGraphicsScene { @@ -29,6 +30,20 @@ public: ChangesetScene(); + void addChangesetItem(ChangesetItem *item); + void addUncommittedItem(UncommittedItem *item); + +signals: + void commit(); + void revert(); + void diffWorkingFolder(); + + void updateTo(QString id); + void diffToPrevious(QString id); + void diffToCurrent(QString id); + void mergeFrom(QString id); + void tag(QString id); + public slots: void changesetDetailShown(); diff -r bad40d7e7a2b -r e6c6b88d19b9 grapher.cpp --- a/grapher.cpp Tue Nov 30 14:59:52 2010 +0000 +++ b/grapher.cpp Tue Nov 30 17:56:11 2010 +0000 @@ -347,9 +347,7 @@ item->setX(0); item->setY(0); m_items[id] = item; - m_scene->addItem(item); - QObject::connect(item, SIGNAL(detailShown()), - m_scene, SLOT(changesetDetailShown())); + m_scene->addChangesetItem(item); } // Add the connecting lines diff -r bad40d7e7a2b -r e6c6b88d19b9 hgtabwidget.cpp --- a/hgtabwidget.cpp Tue Nov 30 14:59:52 2010 +0000 +++ b/hgtabwidget.cpp Tue Nov 30 17:56:11 2010 +0000 @@ -42,6 +42,30 @@ // History graph page m_historyWidget = new HistoryWidget; addTab(m_historyWidget, tr("History")); + + connect(m_historyWidget, SIGNAL(commit()), + this, SIGNAL(commit())); + + connect(m_historyWidget, SIGNAL(revert()), + this, SIGNAL(revert())); + + connect(m_historyWidget, SIGNAL(diffWorkingFolder()), + this, SIGNAL(diffWorkingFolder())); + + connect(m_historyWidget, SIGNAL(updateTo(QString)), + this, SIGNAL(updateTo(QString))); + + connect(m_historyWidget, SIGNAL(diffToCurrent(QString)), + this, SIGNAL(diffToCurrent(QString))); + + connect(m_historyWidget, SIGNAL(diffToPrevious(QString)), + this, SIGNAL(diffToPrevious(QString))); + + connect(m_historyWidget, SIGNAL(mergeFrom(QString)), + this, SIGNAL(mergeFrom(QString))); + + connect(m_historyWidget, SIGNAL(tag(QString)), + this, SIGNAL(tag(QString))); } void HgTabWidget::clearSelections() diff -r bad40d7e7a2b -r e6c6b88d19b9 hgtabwidget.h --- a/hgtabwidget.h Tue Nov 30 14:59:52 2010 +0000 +++ b/hgtabwidget.h Tue Nov 30 17:56:11 2010 +0000 @@ -76,6 +76,16 @@ signals: void selectionChanged(); + void commit(); + void revert(); + void diffWorkingFolder(); + + void updateTo(QString id); + void diffToPrevious(QString id); + void diffToCurrent(QString id); + void mergeFrom(QString id); + void tag(QString id); + public slots: void clearSelections(); diff -r bad40d7e7a2b -r e6c6b88d19b9 historywidget.cpp --- a/historywidget.cpp Tue Nov 30 14:59:52 2010 +0000 +++ b/historywidget.cpp Tue Nov 30 17:56:11 2010 +0000 @@ -72,10 +72,11 @@ { if (m_uncommittedVisible == show) return; m_uncommittedVisible = show; - QGraphicsScene *scene = m_panned->scene(); + ChangesetScene *scene = qobject_cast(m_panned->scene()); if (!scene) return; if (m_uncommittedVisible) { - scene->addItem(m_uncommitted); + scene->addUncommittedItem(m_uncommitted); + m_uncommitted->ensureVisible(); } else { scene->removeItem(m_uncommitted); } @@ -174,7 +175,7 @@ } if (m_uncommittedVisible) { - scene->addItem(m_uncommitted); + scene->addUncommittedItem(m_uncommitted); } m_panned->setScene(scene); @@ -183,11 +184,14 @@ updateNewAndCurrentItems(); if (m_uncommittedVisible) { + DEBUG << "asking uncommitted item to be visible" << endl; m_uncommitted->ensureVisible(); } else if (tipItem) { DEBUG << "asking tip item to be visible" << endl; tipItem->ensureVisible(); } + + connectSceneSignals(); } void HistoryWidget::setChangesetParents() @@ -242,3 +246,33 @@ } } } + +void HistoryWidget::connectSceneSignals() +{ + ChangesetScene *scene = qobject_cast(m_panned->scene()); + if (!scene) return; + + connect(scene, SIGNAL(commit()), + this, SIGNAL(commit())); + + connect(scene, SIGNAL(revert()), + this, SIGNAL(revert())); + + connect(scene, SIGNAL(diffWorkingFolder()), + this, SIGNAL(diffWorkingFolder())); + + connect(scene, SIGNAL(updateTo(QString)), + this, SIGNAL(updateTo(QString))); + + connect(scene, SIGNAL(diffToCurrent(QString)), + this, SIGNAL(diffToCurrent(QString))); + + connect(scene, SIGNAL(diffToPrevious(QString)), + this, SIGNAL(diffToPrevious(QString))); + + connect(scene, SIGNAL(mergeFrom(QString)), + this, SIGNAL(mergeFrom(QString))); + + connect(scene, SIGNAL(tag(QString)), + this, SIGNAL(tag(QString))); +} diff -r bad40d7e7a2b -r e6c6b88d19b9 historywidget.h --- a/historywidget.h Tue Nov 30 14:59:52 2010 +0000 +++ b/historywidget.h Tue Nov 30 17:56:11 2010 +0000 @@ -42,6 +42,17 @@ void parseIncrementalLog(QString log); bool haveNewItems() const { return !m_newIds.empty(); } + +signals: + void commit(); + void revert(); + void diffWorkingFolder(); + + void updateTo(QString id); + void diffToPrevious(QString id); + void diffToCurrent(QString id); + void mergeFrom(QString id); + void tag(QString id); private: Changesets m_changesets; @@ -59,6 +70,7 @@ void layoutAll(); void setChangesetParents(); void updateNewAndCurrentItems(); + void connectSceneSignals(); }; #endif diff -r bad40d7e7a2b -r e6c6b88d19b9 mainwindow.cpp --- a/mainwindow.cpp Tue Nov 30 14:59:52 2010 +0000 +++ b/mainwindow.cpp Tue Nov 30 17:56:11 2010 +0000 @@ -69,6 +69,7 @@ justMerged = false; hgTabs = new HgTabWidget((QWidget *) this, remoteRepoPath, workFolderPath); + connectTabsSignals(); setCentralWidget(hgTabs); connect(hgTabs, SIGNAL(selectionChanged()), @@ -1389,6 +1390,35 @@ connect(hgServeAct, SIGNAL(triggered()), this, SLOT(hgServe())); connect(clearSelectionsAct, SIGNAL(triggered()), this, SLOT(clearSelections())); } + +void MainWindow::connectTabsSignals() +{ + connect(hgTabs, SIGNAL(commit()), + this, SLOT(hgCommit())); + + connect(hgTabs, SIGNAL(revert()), + this, SLOT(hgRevert())); + + connect(hgTabs, SIGNAL(diffWorkingFolder()), + this, SLOT(hgFolderDiff())); +/*!!!! + connect(hgTabs, SIGNAL(updateTo(QString)), + this, SIGNAL(updateTo(QString))); + + connect(hgTabs, SIGNAL(diffToCurrent(QString)), + this, SIGNAL(diffToCurrent(QString))); + + connect(hgTabs, SIGNAL(diffToPrevious(QString)), + this, SIGNAL(diffToPrevious(QString))); + + connect(hgTabs, SIGNAL(mergeFrom(QString)), + this, SIGNAL(mergeFrom(QString))); + + connect(hgTabs, SIGNAL(tag(QString)), + this, SIGNAL(tag(QString))); +*/ +} + /*!!! void MainWindow::tabChanged(int currTab) { diff -r bad40d7e7a2b -r e6c6b88d19b9 mainwindow.h --- a/mainwindow.h Tue Nov 30 14:59:52 2010 +0000 +++ b/mainwindow.h Tue Nov 30 17:56:11 2010 +0000 @@ -104,6 +104,7 @@ void hgLogIncremental(); void createActions(); void connectActions(); + void connectTabsSignals(); void createMenus(); void createToolBars(); void createStatusBar(); diff -r bad40d7e7a2b -r e6c6b88d19b9 uncommitteditem.cpp --- a/uncommitteditem.cpp Tue Nov 30 14:59:52 2010 +0000 +++ b/uncommitteditem.cpp Tue Nov 30 17:56:11 2010 +0000 @@ -21,6 +21,11 @@ #include #include +#include +#include +#include +#include +#include UncommittedItem::UncommittedItem() : m_column(0), m_row(0), m_wide(false) @@ -41,6 +46,37 @@ } void +UncommittedItem::mousePressEvent(QGraphicsSceneMouseEvent *e) +{ + DEBUG << "UncommittedItem::mousePressEvent" << endl; + if (e->button() == Qt::RightButton) { + activateMenu(); + } +} + +void +UncommittedItem::activateMenu() +{ + QMenu *menu = new QMenu; + QLabel *label = new QLabel(tr("Uncommitted changes")); + QWidgetAction *wa = new QWidgetAction(menu); + wa->setDefaultWidget(label); + menu->addAction(wa); + menu->addSeparator(); + + QAction *commit = menu->addAction(tr("Commit...")); + connect(commit, SIGNAL(triggered()), this, SIGNAL(commit())); + QAction *revert = menu->addAction(tr("Revert...")); + connect(revert, SIGNAL(triggered()), this, SIGNAL(revert())); + QAction *dif = menu->addAction(tr("Diff")); + connect(dif, SIGNAL(triggered()), this, SIGNAL(diff())); + + menu->exec(QCursor::pos()); + + ungrabMouse(); +} + +void UncommittedItem::paint(QPainter *paint, const QStyleOptionGraphicsItem *option, QWidget *w) { diff -r bad40d7e7a2b -r e6c6b88d19b9 uncommitteditem.h --- a/uncommitteditem.h Tue Nov 30 14:59:52 2010 +0000 +++ b/uncommitteditem.h Tue Nov 30 17:56:11 2010 +0000 @@ -43,7 +43,17 @@ bool isWide() const { return m_wide; } void setWide(bool w) { m_wide = w; } +signals: + void commit(); + void revert(); + void diff(); + +protected: + virtual void mousePressEvent(QGraphicsSceneMouseEvent *); + private: + void activateMenu(); + QString m_branch; QFont m_font; int m_column;