Chris@57: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@57: Chris@57: /* Chris@57: EasyMercurial Chris@57: Chris@57: Based on HgExplorer by Jari Korhonen Chris@57: Copyright (c) 2010 Jari Korhonen Chris@57: Copyright (c) 2010 Chris Cannam Chris@57: Copyright (c) 2010 Queen Mary, University of London Chris@57: Chris@57: This program is free software; you can redistribute it and/or Chris@57: modify it under the terms of the GNU General Public License as Chris@57: published by the Free Software Foundation; either version 2 of the Chris@57: License, or (at your option) any later version. See the file Chris@57: COPYING included with this distribution for more information. Chris@57: */ jtkorhonen@0: Chris@96: #include "hgtabwidget.h" jtkorhonen@0: #include "common.h" Chris@43: #include "logparser.h" Chris@43: #include "changeset.h" Chris@43: #include "changesetitem.h" Chris@44: #include "grapher.h" cannam@45: #include "panner.h" cannam@45: #include "panned.h" Chris@88: #include "filestatuswidget.h" Chris@44: Chris@50: #include Chris@50: #include Chris@50: #include Chris@50: Chris@44: #include jtkorhonen@0: Chris@96: HgTabWidget::HgTabWidget(QWidget *parent, Chris@95: QString remoteRepo, Chris@95: QString workFolderPath) : Chris@106: QTabWidget(parent) jtkorhonen@0: { Chris@91: // Work page Chris@88: fileStatusWidget = new FileStatusWidget; Chris@89: fileStatusWidget->setLocalPath(workFolderPath); Chris@89: fileStatusWidget->setRemoteURL(remoteRepo); Chris@95: connect(fileStatusWidget, SIGNAL(selectionChanged()), Chris@95: this, SIGNAL(selectionChanged())); Chris@89: addTab(fileStatusWidget, tr("My work")); Chris@88: Chris@43: // History graph page cannam@45: historyGraphPageWidget = new QWidget; cannam@45: Panned *panned = new Panned; cannam@45: Panner *panner = new Panner; cannam@45: historyGraphWidget = panned; cannam@45: historyGraphPanner = panner; cannam@45: QGridLayout *layout = new QGridLayout; cannam@45: layout->addWidget(historyGraphWidget, 0, 0); cannam@45: layout->addWidget(historyGraphPanner, 0, 1); cannam@45: panner->setMaximumWidth(80); cannam@45: panner->connectToPanned(panned); cannam@45: historyGraphPageWidget->setLayout(layout); Chris@58: addTab(historyGraphPageWidget, tr("History")); jtkorhonen@32: } jtkorhonen@32: Chris@96: void HgTabWidget::clearSelections() Chris@94: { Chris@94: fileStatusWidget->clearSelections(); Chris@94: } Chris@94: Chris@96: bool HgTabWidget::canCommit() const Chris@90: { Chris@109: if (!fileStatusWidget->getSelectedAddableFiles().empty()) return false; Chris@90: return fileStatusWidget->haveChangesToCommit(); Chris@90: } jtkorhonen@0: Chris@109: bool HgTabWidget::canRevert() const Chris@109: { Chris@109: return fileStatusWidget->haveChangesToCommit() || Chris@109: !fileStatusWidget->getSelectedRevertableFiles().empty(); Chris@109: } Chris@109: Chris@96: bool HgTabWidget::canAdd() const Chris@95: { Chris@95: if (fileStatusWidget->getSelectedAddableFiles().empty()) return false; Chris@95: if (!fileStatusWidget->getSelectedCommittableFiles().empty()) return false; Chris@95: if (!fileStatusWidget->getSelectedRemovableFiles().empty()) return false; Chris@95: return true; Chris@95: } Chris@95: Chris@96: bool HgTabWidget::canRemove() const Chris@95: { Chris@95: if (fileStatusWidget->getSelectedRemovableFiles().empty()) return false; Chris@95: if (!fileStatusWidget->getSelectedAddableFiles().empty()) return false; Chris@95: return true; Chris@95: } Chris@95: Chris@96: bool HgTabWidget::canDoDiff() const Chris@95: { Chris@95: return canCommit(); Chris@95: } Chris@95: Chris@96: QStringList HgTabWidget::getAllSelectedFiles() const Chris@95: { Chris@95: return fileStatusWidget->getAllSelectedFiles(); Chris@95: } Chris@95: Chris@109: QStringList HgTabWidget::getAllCommittableFiles() const Chris@109: { Chris@109: return fileStatusWidget->getAllCommittableFiles(); Chris@109: } Chris@109: Chris@96: QStringList HgTabWidget::getSelectedCommittableFiles() const Chris@95: { Chris@95: return fileStatusWidget->getSelectedCommittableFiles(); Chris@95: } Chris@95: Chris@109: QStringList HgTabWidget::getAllRevertableFiles() const Chris@109: { Chris@109: return fileStatusWidget->getAllRevertableFiles(); Chris@109: } Chris@109: Chris@109: QStringList HgTabWidget::getSelectedRevertableFiles() const Chris@109: { Chris@109: return fileStatusWidget->getSelectedRevertableFiles(); Chris@109: } Chris@109: Chris@96: QStringList HgTabWidget::getSelectedAddableFiles() const Chris@95: { Chris@95: return fileStatusWidget->getSelectedAddableFiles(); Chris@95: } Chris@95: Chris@109: QStringList HgTabWidget::getAllRemovableFiles() const Chris@109: { Chris@109: return fileStatusWidget->getAllRemovableFiles(); Chris@109: } Chris@109: Chris@96: QStringList HgTabWidget::getSelectedRemovableFiles() const Chris@95: { Chris@95: return fileStatusWidget->getSelectedRemovableFiles(); Chris@95: } Chris@95: Chris@96: void HgTabWidget::updateWorkFolderFileList(QString fileList) jtkorhonen@0: { Chris@94: fileStates.parseStates(fileList); Chris@92: fileStatusWidget->setFileStates(fileStates); jtkorhonen@0: } jtkorhonen@0: Chris@96: void HgTabWidget::updateLocalRepoHgLogList(QString hgLogList) jtkorhonen@0: { Chris@43: //!!! cannam@45: Panned *panned = static_cast(historyGraphWidget); cannam@45: Panner *panner = static_cast(historyGraphPanner); Chris@43: QGraphicsScene *scene = new QGraphicsScene(); Chris@43: Changesets csets = parseChangeSets(hgLogList); Chris@44: if (csets.empty()) return; Chris@53: Grapher g(scene); Chris@44: try { Chris@106: g.layout(csets); Chris@44: } catch (std::string s) { Chris@106: std::cerr << "Internal error: Layout failed: " << s << std::endl; Chris@44: } Chris@87: QGraphicsScene *oldScene = panned->scene(); cannam@45: panned->setScene(scene); cannam@45: panner->setScene(scene); Chris@87: if (oldScene) delete oldScene; Chris@53: ChangesetItem *tipItem = g.getItemFor(csets[0]); Chris@53: if (tipItem) tipItem->ensureVisible(); Chris@108: //!!! track lifecycle of those Changesets jtkorhonen@0: } jtkorhonen@0: Chris@96: Changesets HgTabWidget::parseChangeSets(QString changeSetsStr) Chris@43: { Chris@108: Changesets csets = Changeset::parseChangesets(changeSetsStr); Chris@44: for (int i = 0; i+1 < csets.size(); ++i) { Chris@106: Changeset *cs = csets[i]; Chris@106: if (cs->parents().empty()) { Chris@106: QStringList list; Chris@106: list.push_back(csets[i+1]->id()); Chris@106: cs->setParents(list); Chris@106: } Chris@44: } Chris@43: return csets; jtkorhonen@0: } jtkorhonen@0: Chris@96: void HgTabWidget::setWorkFolderAndRepoNames(QString workFolderPath, QString remoteRepoPath) jtkorhonen@0: { Chris@89: fileStatusWidget->setLocalPath(workFolderPath); Chris@89: fileStatusWidget->setRemoteURL(remoteRepoPath); jtkorhonen@0: } Chris@106: Chris@106: void HgTabWidget::setBranch(QString branch) Chris@106: { Chris@106: fileStatusWidget->setBranch(branch); Chris@106: }