annotate hgtabwidget.cpp @ 237:c9a7e4ec2f78

* Try to do the right thing when completely reverting a merge (forget that the merge took place) * When trying to clone from remote repo to existing local dir, offer to create a subdir instead * Tidy up clone-successful notification * Add a note to commit and revert confirmation dialogs to tell user if they are committing/reverting only a subset of available files
author Chris Cannam
date Mon, 10 Jan 2011 12:44:03 +0000
parents e67bd8abc3e3
children 8fd71f570884
rev   line source
Chris@57 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@57 2
Chris@57 3 /*
Chris@57 4 EasyMercurial
Chris@57 5
Chris@57 6 Based on HgExplorer by Jari Korhonen
Chris@57 7 Copyright (c) 2010 Jari Korhonen
Chris@57 8 Copyright (c) 2010 Chris Cannam
Chris@57 9 Copyright (c) 2010 Queen Mary, University of London
Chris@57 10
Chris@57 11 This program is free software; you can redistribute it and/or
Chris@57 12 modify it under the terms of the GNU General Public License as
Chris@57 13 published by the Free Software Foundation; either version 2 of the
Chris@57 14 License, or (at your option) any later version. See the file
Chris@57 15 COPYING included with this distribution for more information.
Chris@57 16 */
jtkorhonen@0 17
Chris@96 18 #include "hgtabwidget.h"
jtkorhonen@0 19 #include "common.h"
Chris@88 20 #include "filestatuswidget.h"
Chris@116 21 #include "historywidget.h"
Chris@44 22
Chris@50 23 #include <QClipboard>
Chris@50 24 #include <QContextMenuEvent>
Chris@50 25 #include <QApplication>
Chris@50 26
Chris@44 27 #include <iostream>
jtkorhonen@0 28
Chris@96 29 HgTabWidget::HgTabWidget(QWidget *parent,
Chris@95 30 QString remoteRepo,
Chris@95 31 QString workFolderPath) :
Chris@117 32 QTabWidget(parent)
jtkorhonen@0 33 {
Chris@91 34 // Work page
Chris@116 35 m_fileStatusWidget = new FileStatusWidget;
Chris@116 36 m_fileStatusWidget->setLocalPath(workFolderPath);
Chris@116 37 m_fileStatusWidget->setRemoteURL(remoteRepo);
Chris@116 38 connect(m_fileStatusWidget, SIGNAL(selectionChanged()),
Chris@95 39 this, SIGNAL(selectionChanged()));
Chris@199 40 connect(m_fileStatusWidget, SIGNAL(showAllChanged(bool)),
Chris@199 41 this, SIGNAL(showAllChanged(bool)));
Chris@116 42 addTab(m_fileStatusWidget, tr("My work"));
Chris@88 43
Chris@43 44 // History graph page
Chris@116 45 m_historyWidget = new HistoryWidget;
Chris@116 46 addTab(m_historyWidget, tr("History"));
Chris@141 47
Chris@141 48 connect(m_historyWidget, SIGNAL(commit()),
Chris@141 49 this, SIGNAL(commit()));
Chris@141 50
Chris@141 51 connect(m_historyWidget, SIGNAL(revert()),
Chris@141 52 this, SIGNAL(revert()));
Chris@141 53
Chris@168 54 connect(m_historyWidget, SIGNAL(showSummary()),
Chris@168 55 this, SIGNAL(showSummary()));
Chris@168 56
Chris@141 57 connect(m_historyWidget, SIGNAL(diffWorkingFolder()),
Chris@141 58 this, SIGNAL(diffWorkingFolder()));
Chris@141 59
Chris@153 60 connect(m_historyWidget, SIGNAL(showWork()),
Chris@153 61 this, SLOT(showWorkTab()));
Chris@153 62
Chris@141 63 connect(m_historyWidget, SIGNAL(updateTo(QString)),
Chris@141 64 this, SIGNAL(updateTo(QString)));
Chris@141 65
Chris@141 66 connect(m_historyWidget, SIGNAL(diffToCurrent(QString)),
Chris@141 67 this, SIGNAL(diffToCurrent(QString)));
Chris@141 68
Chris@148 69 connect(m_historyWidget, SIGNAL(diffToParent(QString, QString)),
Chris@148 70 this, SIGNAL(diffToParent(QString, QString)));
Chris@141 71
Chris@141 72 connect(m_historyWidget, SIGNAL(mergeFrom(QString)),
Chris@141 73 this, SIGNAL(mergeFrom(QString)));
Chris@141 74
Chris@141 75 connect(m_historyWidget, SIGNAL(tag(QString)),
Chris@141 76 this, SIGNAL(tag(QString)));
jtkorhonen@32 77 }
jtkorhonen@32 78
Chris@96 79 void HgTabWidget::clearSelections()
Chris@94 80 {
Chris@116 81 m_fileStatusWidget->clearSelections();
Chris@94 82 }
Chris@94 83
Chris@153 84 void HgTabWidget::setCurrent(QStringList ids, QString branch)
Chris@128 85 {
Chris@172 86 bool showUncommitted = haveChangesToCommit();
Chris@163 87 m_historyWidget->setCurrent(ids, branch, showUncommitted);
Chris@129 88 }
Chris@129 89
Chris@230 90 void HgTabWidget::updateFileStates()
Chris@230 91 {
Chris@230 92 m_fileStatusWidget->updateWidgets();
Chris@230 93 }
Chris@230 94
Chris@154 95 void HgTabWidget::updateHistory()
Chris@154 96 {
Chris@154 97 m_historyWidget->update();
Chris@154 98 }
Chris@154 99
Chris@163 100 bool HgTabWidget::canDiff() const
Chris@163 101 {
Chris@237 102 return canRevert();
Chris@163 103 }
Chris@163 104
Chris@96 105 bool HgTabWidget::canCommit() const
Chris@90 106 {
Chris@237 107 if (!m_fileStatusWidget->haveChangesToCommit()) return false;
Chris@237 108 if (!m_fileStatusWidget->getAllUnresolvedFiles().empty()) return false;
Chris@237 109
Chris@237 110 QStringList addable = m_fileStatusWidget->getSelectedAddableFiles();
Chris@237 111 if (addable.empty()) return true;
Chris@237 112
Chris@237 113 QStringList committable = m_fileStatusWidget->getSelectedCommittableFiles();
Chris@237 114
Chris@237 115 // "Removed" files are both committable and addable; don't return
Chris@237 116 // a false negative if the selection only contains these
Chris@237 117 if (committable == addable) return true;
Chris@237 118 return false;
Chris@90 119 }
jtkorhonen@0 120
Chris@109 121 bool HgTabWidget::canRevert() const
Chris@109 122 {
Chris@237 123 // Not the same as canCommit() -- we can revert (and diff)
Chris@237 124 // unresolved files, but we can't commit them
Chris@237 125 if (!m_fileStatusWidget->haveChangesToCommit() &&
Chris@237 126 m_fileStatusWidget->getAllUnresolvedFiles().empty()) return false;
Chris@237 127
Chris@237 128 // The rest of this logic is as in canCommit though
Chris@237 129
Chris@237 130 QStringList addable = m_fileStatusWidget->getSelectedAddableFiles();
Chris@237 131 if (addable.empty()) return true;
Chris@237 132
Chris@237 133 QStringList committable = m_fileStatusWidget->getSelectedCommittableFiles();
Chris@237 134 if (committable == addable) return true;
Chris@237 135 return false;
Chris@109 136 }
Chris@109 137
Chris@96 138 bool HgTabWidget::canAdd() const
Chris@95 139 {
Chris@204 140 QStringList addable = m_fileStatusWidget->getSelectedAddableFiles();
Chris@204 141 if (addable.empty()) return false;
Chris@204 142
Chris@204 143 QStringList removable = m_fileStatusWidget->getSelectedRemovableFiles();
Chris@204 144 if (!removable.empty()) return false;
Chris@204 145
Chris@204 146 QStringList committable = m_fileStatusWidget->getSelectedCommittableFiles();
Chris@237 147
Chris@204 148 // "Removed" files are both committable and addable; don't return
Chris@237 149 // a false negative if the selection only contains these
Chris@204 150 if (committable == addable || committable.empty()) return true;
Chris@204 151 return false;
Chris@95 152 }
Chris@95 153
Chris@96 154 bool HgTabWidget::canRemove() const
Chris@95 155 {
Chris@116 156 if (m_fileStatusWidget->getSelectedRemovableFiles().empty()) return false;
Chris@116 157 if (!m_fileStatusWidget->getSelectedAddableFiles().empty()) return false;
Chris@95 158 return true;
Chris@95 159 }
Chris@95 160
Chris@163 161 bool HgTabWidget::canResolve() const
Chris@95 162 {
Chris@163 163 return !m_fileStatusWidget->getSelectedUnresolvedFiles().empty();
Chris@95 164 }
Chris@95 165
Chris@172 166 bool HgTabWidget::haveChangesToCommit() const
Chris@172 167 {
Chris@172 168 return m_fileStatusWidget->haveChangesToCommit();
Chris@172 169 }
Chris@172 170
Chris@96 171 QStringList HgTabWidget::getAllSelectedFiles() const
Chris@95 172 {
Chris@116 173 return m_fileStatusWidget->getAllSelectedFiles();
Chris@95 174 }
Chris@95 175
Chris@109 176 QStringList HgTabWidget::getAllCommittableFiles() const
Chris@109 177 {
Chris@116 178 return m_fileStatusWidget->getAllCommittableFiles();
Chris@109 179 }
Chris@109 180
Chris@96 181 QStringList HgTabWidget::getSelectedCommittableFiles() const
Chris@95 182 {
Chris@116 183 return m_fileStatusWidget->getSelectedCommittableFiles();
Chris@95 184 }
Chris@95 185
Chris@109 186 QStringList HgTabWidget::getAllRevertableFiles() const
Chris@109 187 {
Chris@116 188 return m_fileStatusWidget->getAllRevertableFiles();
Chris@109 189 }
Chris@109 190
Chris@109 191 QStringList HgTabWidget::getSelectedRevertableFiles() const
Chris@109 192 {
Chris@116 193 return m_fileStatusWidget->getSelectedRevertableFiles();
Chris@109 194 }
Chris@109 195
Chris@96 196 QStringList HgTabWidget::getSelectedAddableFiles() const
Chris@95 197 {
Chris@116 198 return m_fileStatusWidget->getSelectedAddableFiles();
Chris@95 199 }
Chris@95 200
Chris@109 201 QStringList HgTabWidget::getAllRemovableFiles() const
Chris@109 202 {
Chris@116 203 return m_fileStatusWidget->getAllRemovableFiles();
Chris@109 204 }
Chris@109 205
Chris@96 206 QStringList HgTabWidget::getSelectedRemovableFiles() const
Chris@95 207 {
Chris@116 208 return m_fileStatusWidget->getSelectedRemovableFiles();
Chris@95 209 }
Chris@95 210
Chris@163 211 QStringList HgTabWidget::getAllUnresolvedFiles() const
Chris@163 212 {
Chris@163 213 return m_fileStatusWidget->getAllUnresolvedFiles();
Chris@163 214 }
Chris@163 215
Chris@163 216 QStringList HgTabWidget::getSelectedUnresolvedFiles() const
Chris@163 217 {
Chris@163 218 return m_fileStatusWidget->getSelectedUnresolvedFiles();
Chris@163 219 }
Chris@163 220
Chris@96 221 void HgTabWidget::updateWorkFolderFileList(QString fileList)
jtkorhonen@0 222 {
Chris@116 223 m_fileStates.parseStates(fileList);
Chris@116 224 m_fileStatusWidget->setFileStates(m_fileStates);
jtkorhonen@0 225 }
jtkorhonen@0 226
Chris@120 227 void HgTabWidget::setNewLog(QString hgLogList)
jtkorhonen@0 228 {
Chris@120 229 m_historyWidget->parseNewLog(hgLogList);
Chris@134 230 if (m_historyWidget->haveNewItems()) {
Chris@153 231 showHistoryTab();
Chris@134 232 }
Chris@120 233 }
Chris@120 234
Chris@120 235 void HgTabWidget::addIncrementalLog(QString hgLogList)
Chris@120 236 {
Chris@120 237 m_historyWidget->parseIncrementalLog(hgLogList);
Chris@134 238 if (m_historyWidget->haveNewItems()) {
Chris@153 239 showHistoryTab();
Chris@134 240 }
jtkorhonen@0 241 }
jtkorhonen@0 242
Chris@96 243 void HgTabWidget::setWorkFolderAndRepoNames(QString workFolderPath, QString remoteRepoPath)
jtkorhonen@0 244 {
Chris@116 245 m_fileStatusWidget->setLocalPath(workFolderPath);
Chris@116 246 m_fileStatusWidget->setRemoteURL(remoteRepoPath);
jtkorhonen@0 247 }
Chris@106 248
Chris@115 249 void HgTabWidget::setState(QString state)
Chris@106 250 {
Chris@116 251 m_fileStatusWidget->setState(state);
Chris@106 252 }
Chris@153 253
Chris@153 254 void HgTabWidget::showWorkTab()
Chris@153 255 {
Chris@153 256 setCurrentWidget(m_fileStatusWidget);
Chris@153 257 }
Chris@153 258
Chris@153 259 void HgTabWidget::showHistoryTab()
Chris@153 260 {
Chris@153 261 setCurrentWidget(m_historyWidget);
Chris@153 262 }
Chris@153 263