annotate hgexpwidget.cpp @ 44:bed7ab59f62e

* A snatched bit of work on graph layout
author Chris Cannam
date Tue, 09 Nov 2010 17:51:12 +0000
parents c32067cd19f8
children 4286836bb3c9
rev   line source
jtkorhonen@30 1 /****************************************************************************
jtkorhonen@30 2 ** Copyright (C) Jari Korhonen, 2010 (under lgpl)
jtkorhonen@30 3 ****************************************************************************/
jtkorhonen@0 4
jtkorhonen@0 5 #include <QtGui>
jtkorhonen@32 6 #include <QtCore>
jtkorhonen@32 7 #include <QClipboard>
jtkorhonen@0 8
jtkorhonen@0 9 #include "hgexpwidget.h"
jtkorhonen@0 10 #include "common.h"
Chris@43 11 #include "logparser.h"
Chris@43 12 #include "changeset.h"
Chris@43 13 #include "changesetitem.h"
Chris@44 14 #include "grapher.h"
Chris@44 15
Chris@44 16 #include <iostream>
jtkorhonen@0 17
jtkorhonen@0 18 #define REMOTE_REPO_STR "Remote repository: "
jtkorhonen@0 19 #define LOCAL_REPO_STR "Local repository: "
jtkorhonen@0 20 #define WORKFOLDER_STR "Working folder: "
jtkorhonen@0 21
jtkorhonen@0 22
jtkorhonen@0 23 const char hgStatViewOptions[NUM_STAT_FILE_TYPES] = {'m','a','r','d','u','c','i'};
jtkorhonen@0 24
jtkorhonen@0 25 const char *statFilesStr[NUM_STAT_FILE_TYPES] = { "M: Modified",
jtkorhonen@0 26 "A: To be added on next commit",
jtkorhonen@0 27 "R: To be removed on next commit",
jtkorhonen@0 28 "!: Tracked, locally deleted",
jtkorhonen@0 29 "?: Unknown, not yet tracked",
jtkorhonen@0 30 "C: Clean (not changed)",
jtkorhonen@0 31 "I: Ignored (via .hgignore file)"};
jtkorhonen@0 32
jtkorhonen@0 33
jtkorhonen@0 34 HgExpWidget::HgExpWidget(QWidget *parent, QString remoteRepo, QString workFolderPath, unsigned char viewFileTypesBits): QTabWidget(parent)
jtkorhonen@0 35 {
jtkorhonen@0 36 //Work page
jtkorhonen@0 37 //Work page
jtkorhonen@0 38 //Work page
jtkorhonen@0 39
jtkorhonen@0 40 //Remote repo
jtkorhonen@0 41 grpRemoteRepo = new QGroupBox(tr(REMOTE_REPO_STR) + remoteRepo);
jtkorhonen@0 42 grpRemoteRepo -> setMinimumHeight(24);
jtkorhonen@0 43
jtkorhonen@0 44 //Local Repo
jtkorhonen@0 45 grpLocalRepo = new QGroupBox(tr(LOCAL_REPO_STR) + workFolderPath + getHgDirName());
jtkorhonen@0 46 parentsLabel = new QLabel(tr("Working folder parent(s):"));
jtkorhonen@0 47 localRepoHgParentsList = new QListWidget;
jtkorhonen@0 48 localRepoHgParentsList -> setSelectionMode(QAbstractItemView::NoSelection);
jtkorhonen@0 49 parentsLayout = new QVBoxLayout;
jtkorhonen@0 50 parentsLayout -> addWidget(parentsLabel);
jtkorhonen@0 51 parentsLayout -> addWidget(localRepoHgParentsList);
jtkorhonen@0 52 grpLocalRepo -> setLayout(parentsLayout);
jtkorhonen@32 53 copyCommentAct = new QAction("Copy comment", localRepoHgParentsList);
jtkorhonen@32 54 userListMenu = new QMenu(localRepoHgParentsList);
jtkorhonen@32 55 userListMenu -> addAction(copyCommentAct);
jtkorhonen@32 56 connect(copyCommentAct, SIGNAL(triggered()), this, SLOT(copyComment()));
jtkorhonen@0 57
jtkorhonen@0 58 //Workfolder
jtkorhonen@0 59 grpWorkFolder = new QGroupBox(tr(WORKFOLDER_STR) + workFolderPath);
jtkorhonen@0 60 workFolderLayout = new QHBoxLayout;
jtkorhonen@0 61 workFolderFileList = new QListWidget;
jtkorhonen@19 62 workFolderFileList -> setSelectionMode(QAbstractItemView::ExtendedSelection);
jtkorhonen@0 63 grpViewFileTypes = new QGroupBox;
jtkorhonen@0 64 fileTypesLayout = new QVBoxLayout;
jtkorhonen@0 65
jtkorhonen@0 66 for(int i = 0; i < NUM_STAT_FILE_TYPES; i++)
jtkorhonen@0 67 {
jtkorhonen@0 68 chkViewFileTypes[i] = new QCheckBox(statFilesStr[i]);
jtkorhonen@0 69 if ((1U << i) & viewFileTypesBits)
jtkorhonen@0 70 {
jtkorhonen@0 71 chkViewFileTypes[i]->setChecked(true);
jtkorhonen@0 72 }
jtkorhonen@0 73 else
jtkorhonen@0 74 {
jtkorhonen@0 75 chkViewFileTypes[i]->setChecked(false);
jtkorhonen@0 76 }
jtkorhonen@0 77 connect(chkViewFileTypes[i], SIGNAL(stateChanged(int)), this, SIGNAL(workFolderViewTypesChanged()));
jtkorhonen@0 78 fileTypesLayout -> addWidget(chkViewFileTypes[i]);
jtkorhonen@0 79 }
jtkorhonen@0 80
jtkorhonen@0 81 grpViewFileTypes -> setLayout(fileTypesLayout);
jtkorhonen@0 82 workFolderLayout->addWidget(workFolderFileList, 3);
jtkorhonen@0 83 workFolderLayout->addWidget(grpViewFileTypes, 1);
jtkorhonen@0 84 grpWorkFolder -> setLayout(workFolderLayout);
jtkorhonen@0 85
jtkorhonen@0 86 workPageWidget = new QWidget;
jtkorhonen@0 87 mainLayout = new QVBoxLayout(workPageWidget);
jtkorhonen@0 88 mainLayout -> addWidget(grpRemoteRepo, 1);
jtkorhonen@0 89 mainLayout -> addWidget(grpLocalRepo, 8);
jtkorhonen@0 90 mainLayout -> addWidget(grpWorkFolder, 12);
jtkorhonen@0 91 addTab(workPageWidget, tr("Work"));
jtkorhonen@0 92
Chris@43 93 // History graph page
Chris@43 94 historyGraphPageWidget = new QGraphicsView;
Chris@43 95 addTab(historyGraphPageWidget, tr("History (graph)"));
Chris@43 96
Chris@43 97
jtkorhonen@0 98 //History page
jtkorhonen@0 99 //History page
jtkorhonen@0 100 //History page
jtkorhonen@0 101 historyPageWidget = new QWidget;
jtkorhonen@0 102 localRepoHgLogList = new QListWidget;
jtkorhonen@0 103 localRepoHgLogList->setFont(QFont("Courier New"));
jtkorhonen@0 104 localRepoHgLogList -> setSelectionMode(QAbstractItemView::ExtendedSelection);
jtkorhonen@0 105
jtkorhonen@0 106 historyLayout = new QVBoxLayout(historyPageWidget);
jtkorhonen@0 107 historyLayout->addWidget(localRepoHgLogList);
jtkorhonen@0 108 addTab(historyPageWidget, tr("History (log)"));
jtkorhonen@0 109
jtkorhonen@0 110 //Heads page
jtkorhonen@0 111 //Heads page
jtkorhonen@0 112 //Heads page
jtkorhonen@0 113 headsPageWidget = new QWidget;
jtkorhonen@0 114 localRepoHeadsList = new QListWidget;
jtkorhonen@0 115 localRepoHeadsList -> setSelectionMode(QAbstractItemView::ExtendedSelection);
jtkorhonen@0 116
jtkorhonen@0 117 headsLayout = new QVBoxLayout(headsPageWidget);
jtkorhonen@0 118 headsLayout->addWidget(localRepoHeadsList);
jtkorhonen@0 119 addTab(headsPageWidget, tr("Heads"));
jtkorhonen@0 120
jtkorhonen@0 121 //Initially, only work page is active
jtkorhonen@0 122 setTabEnabled(HEADSTAB, false);
jtkorhonen@0 123 setTabEnabled(HISTORYTAB, false);
jtkorhonen@0 124 }
jtkorhonen@0 125
jtkorhonen@32 126 void HgExpWidget::contextMenuEvent(QContextMenuEvent * event)
jtkorhonen@32 127 {
jtkorhonen@32 128 if (copyCommentAct -> isEnabled())
jtkorhonen@32 129 {
jtkorhonen@32 130 QPoint topL;
jtkorhonen@32 131 QPoint bottomR;
jtkorhonen@32 132
jtkorhonen@32 133 topL = localRepoHgParentsList->
jtkorhonen@32 134 mapToGlobal(QPoint(0, 0));
jtkorhonen@32 135 bottomR = localRepoHgParentsList->
jtkorhonen@32 136 mapToGlobal(QPoint(localRepoHgParentsList -> width(), localRepoHgParentsList -> height()));
jtkorhonen@32 137
jtkorhonen@32 138 if ((event -> globalPos().x() > topL.x()) && (event -> globalPos().x() < bottomR.x()))
jtkorhonen@32 139 {
jtkorhonen@32 140 if ((event -> globalPos().y() > topL.y()) && (event -> globalPos().y() < bottomR.y()))
jtkorhonen@32 141 {
jtkorhonen@32 142 userListMenu->exec(event -> globalPos());
jtkorhonen@32 143 }
jtkorhonen@32 144 }
jtkorhonen@32 145 }
jtkorhonen@32 146 }
jtkorhonen@32 147
jtkorhonen@32 148 void HgExpWidget::copyComment()
jtkorhonen@32 149 {
jtkorhonen@32 150 if (localRepoHgParentsList -> count() >= 1)
jtkorhonen@32 151 {
jtkorhonen@32 152 QListWidgetItem *it = localRepoHgParentsList -> item(0);
jtkorhonen@32 153 QString tmp = it -> text();
jtkorhonen@32 154 int ind = tmp.indexOf("summary:");
jtkorhonen@32 155 if (ind != -1)
jtkorhonen@32 156 {
jtkorhonen@32 157 QString comment;
jtkorhonen@32 158 ind += 11; //jump over word "summary:"
jtkorhonen@32 159
jtkorhonen@32 160 comment = tmp.mid(ind);
jtkorhonen@32 161
jtkorhonen@32 162 QClipboard *clipboard = QApplication::clipboard();
jtkorhonen@32 163 clipboard->setText(comment);
jtkorhonen@32 164 }
jtkorhonen@32 165 }
jtkorhonen@32 166 }
jtkorhonen@32 167
jtkorhonen@32 168
jtkorhonen@0 169
jtkorhonen@0 170 QString HgExpWidget::getStatFlags()
jtkorhonen@0 171 {
jtkorhonen@0 172 QString ret;
jtkorhonen@0 173
jtkorhonen@0 174 for(int i = 0; i < NUM_STAT_FILE_TYPES; i++)
jtkorhonen@0 175 {
jtkorhonen@0 176 if (Qt::Checked == chkViewFileTypes[i]->checkState())
jtkorhonen@0 177 {
jtkorhonen@0 178 ret += hgStatViewOptions[i];
jtkorhonen@0 179 }
jtkorhonen@0 180 }
jtkorhonen@0 181
jtkorhonen@0 182 return ret;
jtkorhonen@0 183 }
jtkorhonen@0 184
jtkorhonen@0 185
jtkorhonen@0 186 unsigned char HgExpWidget::getFileTypesBits()
jtkorhonen@0 187 {
jtkorhonen@0 188 unsigned char ret;
jtkorhonen@0 189
jtkorhonen@0 190 ret = 0;
jtkorhonen@0 191
jtkorhonen@0 192 for(int i = 0; i < NUM_STAT_FILE_TYPES; i++)
jtkorhonen@0 193 {
jtkorhonen@0 194 if (Qt::Checked == chkViewFileTypes[i]->checkState())
jtkorhonen@0 195 {
jtkorhonen@0 196 ret |= (1U << i);
jtkorhonen@0 197 }
jtkorhonen@0 198 }
jtkorhonen@0 199
jtkorhonen@0 200 return ret;
jtkorhonen@0 201 }
jtkorhonen@0 202
jtkorhonen@0 203
jtkorhonen@0 204 void HgExpWidget::updateWorkFolderFileList(QString fileList)
jtkorhonen@0 205 {
jtkorhonen@0 206 workFolderFileList-> clear();
jtkorhonen@0 207 workFolderFileList -> addItems(fileList.split("\n"));
jtkorhonen@0 208 }
jtkorhonen@0 209
jtkorhonen@0 210 void HgExpWidget::updateLocalRepoHeadsList(QString headList)
jtkorhonen@0 211 {
jtkorhonen@0 212 localRepoHeadsList-> clear();
jtkorhonen@0 213 localRepoHeadsList -> addItems(splitChangeSets(headList));
jtkorhonen@0 214
jtkorhonen@0 215 //heads list is interesting only when we have 2 or more
jtkorhonen@0 216 if (localRepoHeadsList-> count() < 2)
jtkorhonen@0 217 {
jtkorhonen@0 218 setTabEnabled(HEADSTAB, false);
jtkorhonen@0 219 }
jtkorhonen@0 220 else
jtkorhonen@0 221 {
jtkorhonen@0 222 setTabEnabled(HEADSTAB, true);
jtkorhonen@0 223 }
jtkorhonen@0 224 }
jtkorhonen@0 225
jtkorhonen@0 226
jtkorhonen@0 227 void HgExpWidget::clearLists()
jtkorhonen@0 228 {
jtkorhonen@0 229 localRepoHeadsList-> clear();
jtkorhonen@0 230 localRepoHgParentsList-> clear();
jtkorhonen@0 231 workFolderFileList-> clear();
jtkorhonen@0 232 localRepoHgLogList -> clear();
jtkorhonen@0 233 }
jtkorhonen@0 234
jtkorhonen@0 235 void HgExpWidget::updateLocalRepoParentsList(QString parentsList)
jtkorhonen@0 236 {
jtkorhonen@0 237 localRepoHgParentsList-> clear();
jtkorhonen@0 238 localRepoHgParentsList -> addItems(splitChangeSets(parentsList));
jtkorhonen@0 239 }
jtkorhonen@0 240
jtkorhonen@0 241 void HgExpWidget::updateLocalRepoHgLogList(QString hgLogList)
jtkorhonen@0 242 {
jtkorhonen@0 243 localRepoHgLogList -> clear();
jtkorhonen@0 244 localRepoHgLogList -> addItems(splitChangeSets(hgLogList));
jtkorhonen@0 245
Chris@43 246 //!!!
Chris@43 247 QGraphicsView *gv = static_cast<QGraphicsView *>(historyGraphPageWidget);
Chris@43 248 gv->scene()->deleteLater();
Chris@43 249 QGraphicsScene *scene = new QGraphicsScene();
Chris@43 250 Changesets csets = parseChangeSets(hgLogList);
Chris@44 251 if (csets.empty()) return;
Chris@44 252 ChangesetItemMap csetItemMap;
Chris@43 253 foreach (Changeset *cs, csets) {
Chris@43 254 ChangesetItem *item = new ChangesetItem(cs);
Chris@43 255 item->setX(0);
Chris@44 256 item->setY(0);
Chris@44 257 csetItemMap[cs] = item;
Chris@43 258 scene->addItem(item);
Chris@43 259 }
Chris@44 260 try {
Chris@44 261 Grapher().layout(csets, csetItemMap);
Chris@44 262 } catch (std::string s) {
Chris@44 263 std::cerr << "Internal error: Layout failed: " << s << std::endl;
Chris@44 264 }
Chris@44 265 /*
Chris@44 266 QMap<QString, Changeset *> idCsetMap;
Chris@44 267 foreach (Changeset *cs, csets) {
Chris@44 268 if (cs->id() == "") {
Chris@44 269 throw std::string("Changeset has no ID");
Chris@44 270 }
Chris@44 271 if (idCsetMap.contains(cs->id())) {
Chris@44 272 throw std::string("Changeset ID is already in map");
Chris@44 273 }
Chris@44 274 idCsetMap[cs->id()] = cs;
Chris@44 275 }
Chris@44 276 typedef QSet<int> ColumnSet;
Chris@44 277 typedef QMap<int, ColumnSet> GridAlloc;
Chris@44 278 typedef QMap<Changeset *, ChangesetItem *> ChangesetItemMap;
Chris@44 279 ChangesetItemMap csetItemMap;
Chris@44 280 foreach (Changeset *cs, csets) {
Chris@44 281 ChangesetItem *item = new ChangesetItem(cs);
Chris@44 282 item->setX(0);
Chris@44 283 item->setY(-cs->number() * 100);
Chris@44 284 csetItemMap[cs] = item;
Chris@44 285 scene->addItem(item);
Chris@44 286 }
Chris@44 287 QSet<Changeset *> handled;
Chris@44 288 for (int i = csets.size() - 1; i >= 0; --i) {
Chris@44 289 Changeset *cs = csets[i];
Chris@44 290 if (handled.contains(cs)) continue;
Chris@44 291
Chris@44 292
Chris@44 293 handled.insert(cs);
Chris@44 294 }
Chris@44 295 */
Chris@43 296 gv->setScene(scene);
jtkorhonen@0 297 }
jtkorhonen@0 298
jtkorhonen@0 299
Chris@43 300
jtkorhonen@0 301 int HgExpWidget::findLineStart(int nowIndex, QString str)
jtkorhonen@0 302 {
jtkorhonen@0 303 if (nowIndex < 0)
jtkorhonen@0 304 {
jtkorhonen@0 305 return -1;
jtkorhonen@0 306 }
jtkorhonen@0 307
jtkorhonen@0 308 while(str.at(nowIndex) != '\n')
jtkorhonen@0 309 {
jtkorhonen@0 310 if (nowIndex == 0)
jtkorhonen@0 311 {
jtkorhonen@0 312 return nowIndex;
jtkorhonen@0 313 }
jtkorhonen@0 314 nowIndex--;
jtkorhonen@0 315 }
jtkorhonen@0 316 return nowIndex + 1;
jtkorhonen@0 317 }
jtkorhonen@0 318
jtkorhonen@0 319
jtkorhonen@0 320 QStringList HgExpWidget::splitChangeSets(QString chgSetsStr)
jtkorhonen@0 321 {
Chris@43 322 return LogParser(chgSetsStr).split();
Chris@43 323 /*
jtkorhonen@0 324 int currChgSet;
jtkorhonen@0 325 int currChgSetLineStart;
jtkorhonen@0 326
jtkorhonen@0 327 int prevChgSet;
jtkorhonen@0 328 QStringList tmp;
jtkorhonen@0 329
jtkorhonen@0 330 currChgSet = chgSetsStr.indexOf(CHGSET);
jtkorhonen@0 331 currChgSetLineStart = findLineStart(currChgSet, chgSetsStr);
jtkorhonen@0 332 prevChgSet = -1;
jtkorhonen@0 333 while (currChgSet != -1)
jtkorhonen@0 334 {
jtkorhonen@0 335 if (prevChgSet != -1)
jtkorhonen@0 336 {
jtkorhonen@0 337 tmp.append(chgSetsStr.mid(prevChgSet, (currChgSetLineStart - prevChgSet - 1)));
jtkorhonen@0 338 }
jtkorhonen@0 339
jtkorhonen@0 340 prevChgSet = currChgSetLineStart;
jtkorhonen@0 341
jtkorhonen@0 342 currChgSet = chgSetsStr.indexOf(CHGSET, currChgSet + 1);
jtkorhonen@0 343 currChgSetLineStart = findLineStart(currChgSet, chgSetsStr);
jtkorhonen@0 344 }
jtkorhonen@0 345
jtkorhonen@0 346 if (prevChgSet != -1)
jtkorhonen@0 347 {
jtkorhonen@0 348 //Last changeset
jtkorhonen@0 349 tmp.append(chgSetsStr.mid(prevChgSet));
jtkorhonen@0 350 }
jtkorhonen@0 351 else
jtkorhonen@0 352 {
jtkorhonen@0 353 //Only changeset (if any)
jtkorhonen@0 354 if (!chgSetsStr.isEmpty())
jtkorhonen@0 355 {
jtkorhonen@0 356 tmp.append(chgSetsStr.mid(0));
jtkorhonen@0 357 }
jtkorhonen@0 358 }
jtkorhonen@0 359
jtkorhonen@0 360 return tmp;
Chris@43 361 */
Chris@43 362 }
Chris@43 363
Chris@43 364 Changesets HgExpWidget::parseChangeSets(QString changeSetsStr)
Chris@43 365 {
Chris@43 366 Changesets csets;
Chris@43 367 LogList log = LogParser(changeSetsStr).parse();
Chris@43 368 foreach (LogEntry e, log) {
Chris@43 369 Changeset *cs = new Changeset();
Chris@43 370 foreach (QString key, e.keys()) {
Chris@44 371 if (key == "parents") {
Chris@44 372 QStringList parents = e.value(key).split
Chris@44 373 (" ", QString::SkipEmptyParts);
Chris@44 374 cs->setParents(parents);
Chris@44 375 } else {
Chris@44 376 cs->setProperty(key.toLocal8Bit().data(), e.value(key));
Chris@44 377 }
Chris@43 378 }
Chris@43 379 csets.push_back(cs);
Chris@43 380 }
Chris@44 381 for (int i = 0; i+1 < csets.size(); ++i) {
Chris@44 382 Changeset *cs = csets[i];
Chris@44 383 if (cs->parents().empty()) {
Chris@44 384 QStringList list;
Chris@44 385 list.push_back(csets[i+1]->id());
Chris@44 386 cs->setParents(list);
Chris@44 387 }
Chris@44 388 }
Chris@43 389 return csets;
jtkorhonen@0 390 }
jtkorhonen@0 391
jtkorhonen@0 392 QString HgExpWidget::getCurrentFileListLine()
jtkorhonen@0 393 {
jtkorhonen@0 394 if (workFolderFileList -> currentItem() != NULL)
jtkorhonen@0 395 {
jtkorhonen@0 396 return workFolderFileList -> currentItem()->text();
jtkorhonen@0 397 }
jtkorhonen@0 398 return "";
jtkorhonen@0 399 }
jtkorhonen@0 400
jtkorhonen@0 401 void HgExpWidget::setWorkFolderAndRepoNames(QString workFolderPath, QString remoteRepoPath)
jtkorhonen@0 402 {
jtkorhonen@0 403 grpRemoteRepo -> setTitle(tr(REMOTE_REPO_STR) + remoteRepoPath);
jtkorhonen@0 404 grpLocalRepo -> setTitle(tr(LOCAL_REPO_STR) + workFolderPath + getHgDirName());
jtkorhonen@0 405 grpWorkFolder -> setTitle(tr(WORKFOLDER_STR) + workFolderPath);
jtkorhonen@0 406 }
jtkorhonen@0 407
jtkorhonen@0 408 #define MERC_SHA1_MARKER_LEN 12
jtkorhonen@0 409 QString HgExpWidget::findRev(QString itemText, QString & smallRev)
jtkorhonen@0 410 {
jtkorhonen@0 411 QString tmp(itemText);
jtkorhonen@0 412 int i;
jtkorhonen@0 413 int j;
jtkorhonen@0 414
jtkorhonen@0 415 smallRev ="0";
jtkorhonen@0 416
jtkorhonen@0 417 i = tmp.indexOf(CHGSET);
jtkorhonen@0 418 if (i != -1)
jtkorhonen@0 419 {
jtkorhonen@0 420 j = i + 10;
jtkorhonen@0 421 i = tmp.indexOf(":", j); //xx:yyyyyy after changeset:
jtkorhonen@0 422
jtkorhonen@0 423 if (i != -1)
jtkorhonen@0 424 {
jtkorhonen@0 425 smallRev = tmp.mid(j, (i-j));
jtkorhonen@0 426 return tmp.mid(i+1, MERC_SHA1_MARKER_LEN);
jtkorhonen@0 427 }
jtkorhonen@0 428 }
jtkorhonen@0 429
jtkorhonen@0 430 return "";
jtkorhonen@0 431 }
jtkorhonen@0 432
jtkorhonen@0 433 void HgExpWidget::getHistoryDiffRevisions(QString& revA, QString& revB)
jtkorhonen@0 434 {
jtkorhonen@0 435 QList <QListWidgetItem *> histList = localRepoHgLogList->selectedItems();
jtkorhonen@0 436 QList <QListWidgetItem *> headList = localRepoHeadsList->selectedItems();
jtkorhonen@0 437
jtkorhonen@0 438 QString revATmp;
jtkorhonen@0 439 QString revBTmp;
jtkorhonen@0 440 QString smallRevA;
jtkorhonen@0 441 QString smallRevB;
jtkorhonen@0 442 QString txtA;
jtkorhonen@0 443 QString txtB;
jtkorhonen@0 444
jtkorhonen@0 445 if (histList.count() == REQUIRED_CHGSET_DIFF_COUNT)
jtkorhonen@0 446 {
jtkorhonen@0 447 txtA = histList.last()->text();
jtkorhonen@0 448 txtB = histList.first()->text();
jtkorhonen@0 449
jtkorhonen@0 450 }
jtkorhonen@0 451 else if (headList.count() == REQUIRED_CHGSET_DIFF_COUNT)
jtkorhonen@0 452 {
jtkorhonen@0 453 txtA = headList.last()->text();
jtkorhonen@0 454 txtB = headList.first()->text();
jtkorhonen@0 455 }
jtkorhonen@0 456 else
jtkorhonen@0 457 {
jtkorhonen@0 458 revA = "";
jtkorhonen@0 459 revB = "";
jtkorhonen@0 460 return;
jtkorhonen@0 461 }
jtkorhonen@0 462
jtkorhonen@0 463 revATmp = findRev(txtA, smallRevA);
jtkorhonen@0 464 revBTmp = findRev(txtB, smallRevB);
jtkorhonen@0 465
jtkorhonen@0 466 //Switch order according to repo small revision number (user can select items from list in "wrong" order)
jtkorhonen@0 467 if (smallRevB.toULongLong() > smallRevA.toULongLong())
jtkorhonen@0 468 {
jtkorhonen@0 469 revA = revATmp;
jtkorhonen@0 470 revB = revBTmp;
jtkorhonen@0 471 }
jtkorhonen@0 472 else
jtkorhonen@0 473 {
jtkorhonen@0 474 revA = revBTmp;
jtkorhonen@0 475 revB = revATmp;
jtkorhonen@0 476 }
jtkorhonen@0 477 }
jtkorhonen@0 478
jtkorhonen@0 479
jtkorhonen@0 480 void HgExpWidget::getUpdateToRevRevision(QString& rev)
jtkorhonen@0 481 {
jtkorhonen@0 482 QList <QListWidgetItem *> histList = localRepoHgLogList->selectedItems();
jtkorhonen@0 483 QString txt;
jtkorhonen@0 484 QString smallRev;
jtkorhonen@0 485
jtkorhonen@0 486
jtkorhonen@0 487 if (histList.count() == 1)
jtkorhonen@0 488 {
jtkorhonen@0 489 txt = histList.first()->text();
jtkorhonen@0 490 rev = findRev(txt, smallRev);
jtkorhonen@0 491 }
jtkorhonen@0 492 else
jtkorhonen@0 493 {
jtkorhonen@0 494 rev = "";
jtkorhonen@0 495 }
jtkorhonen@0 496 }
jtkorhonen@0 497
jtkorhonen@0 498
jtkorhonen@32 499 void HgExpWidget::enableDisableOtherTabs(int tabPage)
jtkorhonen@32 500 {
jtkorhonen@32 501 static int oldTabPage = -1;
jtkorhonen@0 502
jtkorhonen@32 503 if (tabPage != oldTabPage)
jtkorhonen@32 504 {
jtkorhonen@32 505 oldTabPage = tabPage;
jtkorhonen@32 506 if (tabPage == WORKTAB)
jtkorhonen@32 507 {
jtkorhonen@32 508 copyCommentAct -> setEnabled(true);
jtkorhonen@32 509 }
jtkorhonen@32 510 else
jtkorhonen@32 511 {
jtkorhonen@32 512 copyCommentAct -> setEnabled(false);
jtkorhonen@32 513 }
jtkorhonen@32 514 }
jtkorhonen@32 515
jtkorhonen@0 516 //history list is only interesting when we have something in it ;-)
jtkorhonen@0 517 if (localRepoHgLogList -> count() < 2)
jtkorhonen@0 518 {
jtkorhonen@0 519 setTabEnabled(HISTORYTAB, false);
jtkorhonen@0 520 }
jtkorhonen@0 521 else
jtkorhonen@0 522 {
jtkorhonen@0 523 setTabEnabled(HISTORYTAB, true);
jtkorhonen@0 524 }
jtkorhonen@0 525
jtkorhonen@0 526 //history list is only interesting when we have something in it ;-)
jtkorhonen@0 527 if (localRepoHgLogList -> count() < 2)
jtkorhonen@0 528 {
jtkorhonen@0 529 setTabEnabled(HISTORYTAB, false);
jtkorhonen@0 530 }
jtkorhonen@0 531 else
jtkorhonen@0 532 {
jtkorhonen@0 533 setTabEnabled(HISTORYTAB, true);
jtkorhonen@0 534 }
jtkorhonen@0 535 }
jtkorhonen@0 536
jtkorhonen@0 537
jtkorhonen@0 538
jtkorhonen@0 539