| Chris@129 | 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */ | 
| Chris@129 | 2 | 
| Chris@129 | 3 /* | 
| Chris@129 | 4     EasyMercurial | 
| Chris@129 | 5 | 
| Chris@129 | 6     Based on HgExplorer by Jari Korhonen | 
| Chris@129 | 7     Copyright (c) 2010 Jari Korhonen | 
| Chris@129 | 8     Copyright (c) 2010 Chris Cannam | 
| Chris@129 | 9     Copyright (c) 2010 Queen Mary, University of London | 
| Chris@129 | 10 | 
| Chris@129 | 11     This program is free software; you can redistribute it and/or | 
| Chris@129 | 12     modify it under the terms of the GNU General Public License as | 
| Chris@129 | 13     published by the Free Software Foundation; either version 2 of the | 
| Chris@129 | 14     License, or (at your option) any later version.  See the file | 
| Chris@129 | 15     COPYING included with this distribution for more information. | 
| Chris@129 | 16 */ | 
| Chris@129 | 17 | 
| Chris@129 | 18 #include "uncommitteditem.h" | 
| Chris@129 | 19 #include "colourset.h" | 
| Chris@129 | 20 #include "debug.h" | 
| Chris@153 | 21 #include "textabbrev.h" | 
| Chris@129 | 22 | 
| Chris@129 | 23 #include <QPainter> | 
| Chris@129 | 24 #include <QGraphicsScene> | 
| Chris@141 | 25 #include <QGraphicsSceneMouseEvent> | 
| Chris@141 | 26 #include <QMenu> | 
| Chris@141 | 27 #include <QAction> | 
| Chris@141 | 28 #include <QLabel> | 
| Chris@141 | 29 #include <QWidgetAction> | 
| Chris@129 | 30 | 
| Chris@129 | 31 UncommittedItem::UncommittedItem() : | 
| Chris@153 | 32     m_showBranch(false), m_column(0), m_row(0), m_wide(false) | 
| Chris@129 | 33 { | 
| Chris@129 | 34     m_font = QFont(); | 
| Chris@129 | 35     m_font.setPixelSize(11); | 
| Chris@129 | 36     m_font.setBold(false); | 
| Chris@129 | 37     m_font.setItalic(false); | 
| Chris@129 | 38 } | 
| Chris@129 | 39 | 
| Chris@129 | 40 QRectF | 
| Chris@129 | 41 UncommittedItem::boundingRect() const | 
| Chris@129 | 42 { | 
| Chris@131 | 43     //!!! this stuff is gross, refactor with changesetitem and connectionitem | 
| Chris@129 | 44     int w = 100; | 
| Chris@129 | 45     if (m_wide) w = 180; | 
| Chris@131 | 46     return QRectF(-((w-50)/2 - 1), -30, w - 3, 79 + 40); | 
| Chris@129 | 47 } | 
| Chris@129 | 48 | 
| Chris@129 | 49 void | 
| Chris@141 | 50 UncommittedItem::mousePressEvent(QGraphicsSceneMouseEvent *e) | 
| Chris@141 | 51 { | 
| Chris@141 | 52     DEBUG << "UncommittedItem::mousePressEvent" << endl; | 
| Chris@141 | 53     if (e->button() == Qt::RightButton) { | 
| Chris@141 | 54         activateMenu(); | 
| Chris@141 | 55     } | 
| Chris@141 | 56 } | 
| Chris@141 | 57 | 
| Chris@141 | 58 void | 
| Chris@153 | 59 UncommittedItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *e) | 
| Chris@153 | 60 { | 
| Chris@153 | 61     DEBUG << "UncommittedItem::mouseDoubleClickEvent" << endl; | 
| Chris@153 | 62     if (e->button() == Qt::LeftButton) { | 
| Chris@153 | 63         emit showWork(); | 
| Chris@153 | 64     } | 
| Chris@153 | 65 } | 
| Chris@153 | 66 | 
| Chris@153 | 67 void | 
| Chris@141 | 68 UncommittedItem::activateMenu() | 
| Chris@141 | 69 { | 
| Chris@141 | 70     QMenu *menu = new QMenu; | 
| Chris@153 | 71     QLabel *label = new QLabel(tr("<qt> <b>Uncommitted changes</b></qt>")); | 
| Chris@141 | 72     QWidgetAction *wa = new QWidgetAction(menu); | 
| Chris@141 | 73     wa->setDefaultWidget(label); | 
| Chris@141 | 74     menu->addAction(wa); | 
| Chris@141 | 75     menu->addSeparator(); | 
| Chris@141 | 76 | 
| Chris@153 | 77     QAction *dif = menu->addAction(tr("Diff")); | 
| Chris@153 | 78     connect(dif, SIGNAL(triggered()), this, SIGNAL(diff())); | 
| Chris@153 | 79 | 
| Chris@153 | 80     menu->addSeparator(); | 
| Chris@153 | 81 | 
| Chris@141 | 82     QAction *commit = menu->addAction(tr("Commit...")); | 
| Chris@141 | 83     connect(commit, SIGNAL(triggered()), this, SIGNAL(commit())); | 
| Chris@141 | 84     QAction *revert = menu->addAction(tr("Revert...")); | 
| Chris@141 | 85     connect(revert, SIGNAL(triggered()), this, SIGNAL(revert())); | 
| Chris@141 | 86 | 
| Chris@141 | 87     menu->exec(QCursor::pos()); | 
| Chris@141 | 88 | 
| Chris@141 | 89     ungrabMouse(); | 
| Chris@141 | 90 } | 
| Chris@141 | 91 | 
| Chris@141 | 92 void | 
| Chris@129 | 93 UncommittedItem::paint(QPainter *paint, const QStyleOptionGraphicsItem *option, | 
| Chris@129 | 94 		       QWidget *w) | 
| Chris@129 | 95 { | 
| Chris@129 | 96     paint->save(); | 
| Chris@129 | 97 | 
| Chris@129 | 98     ColourSet *colourSet = ColourSet::instance(); | 
| Chris@129 | 99     QColor branchColour = colourSet->getColourFor(m_branch); | 
| Chris@129 | 100 | 
| Chris@129 | 101     QFont f(m_font); | 
| Chris@129 | 102 | 
| Chris@129 | 103     QTransform t = paint->worldTransform(); | 
| Chris@129 | 104     float scale = std::min(t.m11(), t.m22()); | 
| Chris@129 | 105     if (scale > 1.0) { | 
| Chris@129 | 106 	int ps = int((f.pixelSize() / scale) + 0.5); | 
| Chris@129 | 107 	if (ps < 8) ps = 8; | 
| Chris@129 | 108 	f.setPixelSize(ps); | 
| Chris@129 | 109     } | 
| Chris@129 | 110 | 
| Chris@129 | 111     if (scale < 0.1) { | 
| Chris@129 | 112 	paint->setPen(QPen(branchColour, 0, Qt::DashLine)); | 
| Chris@129 | 113     } else { | 
| Chris@129 | 114 	paint->setPen(QPen(branchColour, 2, Qt::DashLine)); | 
| Chris@129 | 115     } | 
| Chris@129 | 116 | 
| Chris@129 | 117     paint->setFont(f); | 
| Chris@129 | 118     QFontMetrics fm(f); | 
| Chris@129 | 119     int fh = fm.height(); | 
| Chris@129 | 120 | 
| Chris@129 | 121     int width = 100; | 
| Chris@129 | 122     if (m_wide) width = 180; | 
| Chris@129 | 123     int x0 = -((width - 50) / 2 - 1); | 
| Chris@129 | 124 | 
| Chris@129 | 125     int height = 49; | 
| Chris@129 | 126     QRectF r(x0, 0, width - 3, height); | 
| Chris@129 | 127     paint->drawRect(r); | 
| Chris@129 | 128 | 
| Chris@145 | 129     if (m_wide) { | 
| Chris@145 | 130         QString label = tr("Uncommitted changes"); | 
| Chris@145 | 131         paint->drawText(-(fm.width(label) - 50)/2, | 
| Chris@145 | 132                         25 - fm.height()/2 + fm.ascent(), | 
| Chris@145 | 133                         label); | 
| Chris@145 | 134     } else { | 
| Chris@145 | 135         QString label = tr("Uncommitted"); | 
| Chris@145 | 136         paint->drawText(-(fm.width(label) - 50)/2, | 
| Chris@145 | 137                         25 - fm.height() + fm.ascent(), | 
| Chris@145 | 138                         label); | 
| Chris@145 | 139         label = tr("changes"); | 
| Chris@145 | 140         paint->drawText(-(fm.width(label) - 50)/2, | 
| Chris@145 | 141                         25 + fm.ascent(), | 
| Chris@145 | 142                         label); | 
| Chris@145 | 143     } | 
| Chris@129 | 144 | 
| Chris@153 | 145     if (m_showBranch && m_branch != "") { | 
| Chris@153 | 146         // write branch name | 
| Chris@153 | 147         f.setBold(true); | 
| Chris@153 | 148         paint->setFont(f); | 
| Chris@153 | 149         int wid = width - 3; | 
| Chris@153 | 150         QString b = TextAbbrev::abbreviate(m_branch, QFontMetrics(f), wid); | 
| Chris@153 | 151         paint->drawText(x0, -fh + fm.ascent() - 4, b); | 
| Chris@153 | 152         f.setBold(false); | 
| Chris@153 | 153     } | 
| Chris@153 | 154 | 
| Chris@129 | 155     paint->restore(); | 
| Chris@129 | 156     return; | 
| Chris@129 | 157 } |