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@88: #include "filestatuswidget.h" Chris@116: #include "historywidget.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@117: QTabWidget(parent) jtkorhonen@0: { Chris@91: // Work page Chris@116: m_fileStatusWidget = new FileStatusWidget; Chris@116: m_fileStatusWidget->setLocalPath(workFolderPath); Chris@116: m_fileStatusWidget->setRemoteURL(remoteRepo); Chris@116: connect(m_fileStatusWidget, SIGNAL(selectionChanged()), Chris@95: this, SIGNAL(selectionChanged())); Chris@199: connect(m_fileStatusWidget, SIGNAL(showAllChanged(bool)), Chris@199: this, SIGNAL(showAllChanged(bool))); Chris@116: addTab(m_fileStatusWidget, tr("My work")); Chris@88: Chris@43: // History graph page Chris@116: m_historyWidget = new HistoryWidget; Chris@116: addTab(m_historyWidget, tr("History")); Chris@141: Chris@141: connect(m_historyWidget, SIGNAL(commit()), Chris@141: this, SIGNAL(commit())); Chris@141: Chris@141: connect(m_historyWidget, SIGNAL(revert()), Chris@141: this, SIGNAL(revert())); Chris@141: Chris@168: connect(m_historyWidget, SIGNAL(showSummary()), Chris@168: this, SIGNAL(showSummary())); Chris@168: Chris@141: connect(m_historyWidget, SIGNAL(diffWorkingFolder()), Chris@141: this, SIGNAL(diffWorkingFolder())); Chris@141: Chris@153: connect(m_historyWidget, SIGNAL(showWork()), Chris@153: this, SLOT(showWorkTab())); Chris@153: Chris@141: connect(m_historyWidget, SIGNAL(updateTo(QString)), Chris@141: this, SIGNAL(updateTo(QString))); Chris@141: Chris@141: connect(m_historyWidget, SIGNAL(diffToCurrent(QString)), Chris@141: this, SIGNAL(diffToCurrent(QString))); Chris@141: Chris@148: connect(m_historyWidget, SIGNAL(diffToParent(QString, QString)), Chris@148: this, SIGNAL(diffToParent(QString, QString))); Chris@141: Chris@141: connect(m_historyWidget, SIGNAL(mergeFrom(QString)), Chris@141: this, SIGNAL(mergeFrom(QString))); Chris@141: Chris@141: connect(m_historyWidget, SIGNAL(tag(QString)), Chris@141: this, SIGNAL(tag(QString))); jtkorhonen@32: } jtkorhonen@32: Chris@96: void HgTabWidget::clearSelections() Chris@94: { Chris@116: m_fileStatusWidget->clearSelections(); Chris@94: } Chris@94: Chris@153: void HgTabWidget::setCurrent(QStringList ids, QString branch) Chris@128: { Chris@172: bool showUncommitted = haveChangesToCommit(); Chris@163: m_historyWidget->setCurrent(ids, branch, showUncommitted); Chris@129: } Chris@129: Chris@230: void HgTabWidget::updateFileStates() Chris@230: { Chris@230: m_fileStatusWidget->updateWidgets(); Chris@230: } Chris@230: Chris@154: void HgTabWidget::updateHistory() Chris@154: { Chris@154: m_historyWidget->update(); Chris@154: } Chris@154: Chris@163: bool HgTabWidget::canDiff() const Chris@163: { Chris@237: return canRevert(); Chris@163: } Chris@163: Chris@96: bool HgTabWidget::canCommit() const Chris@90: { Chris@237: if (!m_fileStatusWidget->haveChangesToCommit()) return false; Chris@237: if (!m_fileStatusWidget->getAllUnresolvedFiles().empty()) return false; Chris@237: Chris@237: QStringList addable = m_fileStatusWidget->getSelectedAddableFiles(); Chris@237: if (addable.empty()) return true; Chris@237: Chris@237: QStringList committable = m_fileStatusWidget->getSelectedCommittableFiles(); Chris@237: Chris@237: // "Removed" files are both committable and addable; don't return Chris@237: // a false negative if the selection only contains these Chris@237: if (committable == addable) return true; Chris@237: return false; Chris@90: } jtkorhonen@0: Chris@109: bool HgTabWidget::canRevert() const Chris@109: { Chris@237: // Not the same as canCommit() -- we can revert (and diff) Chris@237: // unresolved files, but we can't commit them Chris@237: if (!m_fileStatusWidget->haveChangesToCommit() && Chris@237: m_fileStatusWidget->getAllUnresolvedFiles().empty()) return false; Chris@237: Chris@237: // The rest of this logic is as in canCommit though Chris@237: Chris@237: QStringList addable = m_fileStatusWidget->getSelectedAddableFiles(); Chris@237: if (addable.empty()) return true; Chris@237: Chris@237: QStringList committable = m_fileStatusWidget->getSelectedCommittableFiles(); Chris@237: if (committable == addable) return true; Chris@237: return false; Chris@109: } Chris@109: Chris@96: bool HgTabWidget::canAdd() const Chris@95: { Chris@204: QStringList addable = m_fileStatusWidget->getSelectedAddableFiles(); Chris@204: if (addable.empty()) return false; Chris@204: Chris@204: QStringList removable = m_fileStatusWidget->getSelectedRemovableFiles(); Chris@204: if (!removable.empty()) return false; Chris@204: Chris@204: QStringList committable = m_fileStatusWidget->getSelectedCommittableFiles(); Chris@237: Chris@204: // "Removed" files are both committable and addable; don't return Chris@237: // a false negative if the selection only contains these Chris@204: if (committable == addable || committable.empty()) return true; Chris@204: return false; Chris@95: } Chris@95: Chris@96: bool HgTabWidget::canRemove() const Chris@95: { Chris@116: if (m_fileStatusWidget->getSelectedRemovableFiles().empty()) return false; Chris@116: if (!m_fileStatusWidget->getSelectedAddableFiles().empty()) return false; Chris@95: return true; Chris@95: } Chris@95: Chris@163: bool HgTabWidget::canResolve() const Chris@95: { Chris@163: return !m_fileStatusWidget->getSelectedUnresolvedFiles().empty(); Chris@95: } Chris@95: Chris@172: bool HgTabWidget::haveChangesToCommit() const Chris@172: { Chris@172: return m_fileStatusWidget->haveChangesToCommit(); Chris@172: } Chris@172: Chris@96: QStringList HgTabWidget::getAllSelectedFiles() const Chris@95: { Chris@116: return m_fileStatusWidget->getAllSelectedFiles(); Chris@95: } Chris@95: Chris@109: QStringList HgTabWidget::getAllCommittableFiles() const Chris@109: { Chris@116: return m_fileStatusWidget->getAllCommittableFiles(); Chris@109: } Chris@109: Chris@96: QStringList HgTabWidget::getSelectedCommittableFiles() const Chris@95: { Chris@116: return m_fileStatusWidget->getSelectedCommittableFiles(); Chris@95: } Chris@95: Chris@109: QStringList HgTabWidget::getAllRevertableFiles() const Chris@109: { Chris@116: return m_fileStatusWidget->getAllRevertableFiles(); Chris@109: } Chris@109: Chris@109: QStringList HgTabWidget::getSelectedRevertableFiles() const Chris@109: { Chris@116: return m_fileStatusWidget->getSelectedRevertableFiles(); Chris@109: } Chris@109: Chris@96: QStringList HgTabWidget::getSelectedAddableFiles() const Chris@95: { Chris@116: return m_fileStatusWidget->getSelectedAddableFiles(); Chris@95: } Chris@95: Chris@109: QStringList HgTabWidget::getAllRemovableFiles() const Chris@109: { Chris@116: return m_fileStatusWidget->getAllRemovableFiles(); Chris@109: } Chris@109: Chris@96: QStringList HgTabWidget::getSelectedRemovableFiles() const Chris@95: { Chris@116: return m_fileStatusWidget->getSelectedRemovableFiles(); Chris@95: } Chris@95: Chris@163: QStringList HgTabWidget::getAllUnresolvedFiles() const Chris@163: { Chris@163: return m_fileStatusWidget->getAllUnresolvedFiles(); Chris@163: } Chris@163: Chris@163: QStringList HgTabWidget::getSelectedUnresolvedFiles() const Chris@163: { Chris@163: return m_fileStatusWidget->getSelectedUnresolvedFiles(); Chris@163: } Chris@163: Chris@96: void HgTabWidget::updateWorkFolderFileList(QString fileList) jtkorhonen@0: { Chris@116: m_fileStates.parseStates(fileList); Chris@116: m_fileStatusWidget->setFileStates(m_fileStates); jtkorhonen@0: } jtkorhonen@0: Chris@120: void HgTabWidget::setNewLog(QString hgLogList) jtkorhonen@0: { Chris@120: m_historyWidget->parseNewLog(hgLogList); Chris@134: if (m_historyWidget->haveNewItems()) { Chris@153: showHistoryTab(); Chris@134: } Chris@120: } Chris@120: Chris@120: void HgTabWidget::addIncrementalLog(QString hgLogList) Chris@120: { Chris@120: m_historyWidget->parseIncrementalLog(hgLogList); Chris@134: if (m_historyWidget->haveNewItems()) { Chris@153: showHistoryTab(); Chris@134: } jtkorhonen@0: } jtkorhonen@0: Chris@96: void HgTabWidget::setWorkFolderAndRepoNames(QString workFolderPath, QString remoteRepoPath) jtkorhonen@0: { Chris@116: m_fileStatusWidget->setLocalPath(workFolderPath); Chris@116: m_fileStatusWidget->setRemoteURL(remoteRepoPath); jtkorhonen@0: } Chris@106: Chris@115: void HgTabWidget::setState(QString state) Chris@106: { Chris@116: m_fileStatusWidget->setState(state); Chris@106: } Chris@153: Chris@153: void HgTabWidget::showWorkTab() Chris@153: { Chris@153: setCurrentWidget(m_fileStatusWidget); Chris@153: } Chris@153: Chris@153: void HgTabWidget::showHistoryTab() Chris@153: { Chris@153: setCurrentWidget(m_historyWidget); Chris@153: } Chris@153: