annotate src/hgtabwidget.cpp @ 403:44cef6368690

Ensure drags are constrained to either horizontal or vertical once the user's primary direction has become clear, switching to free drag only if the user makes a big move in the other axis
author Chris Cannam
date Wed, 25 May 2011 16:16:01 +0100
parents b9c153e00e84
children ad106f5fe75f
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@244 8 Copyright (c) 2011 Chris Cannam
Chris@244 9 Copyright (c) 2011 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 workFolderPath) :
Chris@117 31 QTabWidget(parent)
jtkorhonen@0 32 {
Chris@326 33 // Work tab
Chris@116 34 m_fileStatusWidget = new FileStatusWidget;
Chris@116 35 m_fileStatusWidget->setLocalPath(workFolderPath);
Chris@326 36
Chris@116 37 connect(m_fileStatusWidget, SIGNAL(selectionChanged()),
Chris@95 38 this, SIGNAL(selectionChanged()));
Chris@326 39
Chris@199 40 connect(m_fileStatusWidget, SIGNAL(showAllChanged(bool)),
Chris@199 41 this, SIGNAL(showAllChanged(bool)));
Chris@326 42
Chris@326 43 connect(m_fileStatusWidget, SIGNAL(annotateFiles(QStringList)),
Chris@326 44 this, SIGNAL(annotateFiles(QStringList)));
Chris@326 45
Chris@326 46 connect(m_fileStatusWidget, SIGNAL(diffFiles(QStringList)),
Chris@326 47 this, SIGNAL(diffFiles(QStringList)));
Chris@326 48
Chris@326 49 connect(m_fileStatusWidget, SIGNAL(commitFiles(QStringList)),
Chris@326 50 this, SIGNAL(commitFiles(QStringList)));
Chris@326 51
Chris@326 52 connect(m_fileStatusWidget, SIGNAL(revertFiles(QStringList)),
Chris@326 53 this, SIGNAL(revertFiles(QStringList)));
Chris@326 54
Chris@361 55 connect(m_fileStatusWidget, SIGNAL(renameFiles(QStringList)),
Chris@361 56 this, SIGNAL(renameFiles(QStringList)));
Chris@361 57
Chris@361 58 connect(m_fileStatusWidget, SIGNAL(copyFiles(QStringList)),
Chris@361 59 this, SIGNAL(copyFiles(QStringList)));
Chris@361 60
Chris@326 61 connect(m_fileStatusWidget, SIGNAL(addFiles(QStringList)),
Chris@326 62 this, SIGNAL(addFiles(QStringList)));
Chris@326 63
Chris@326 64 connect(m_fileStatusWidget, SIGNAL(removeFiles(QStringList)),
Chris@326 65 this, SIGNAL(removeFiles(QStringList)));
Chris@326 66
Chris@326 67 connect(m_fileStatusWidget, SIGNAL(redoFileMerges(QStringList)),
Chris@326 68 this, SIGNAL(redoFileMerges(QStringList)));
Chris@326 69
Chris@326 70 connect(m_fileStatusWidget, SIGNAL(markFilesResolved(QStringList)),
Chris@326 71 this, SIGNAL(markFilesResolved(QStringList)));
Chris@326 72
Chris@326 73 connect(m_fileStatusWidget, SIGNAL(ignoreFiles(QStringList)),
Chris@326 74 this, SIGNAL(ignoreFiles(QStringList)));
Chris@326 75
Chris@326 76 connect(m_fileStatusWidget, SIGNAL(unIgnoreFiles(QStringList)),
Chris@326 77 this, SIGNAL(unIgnoreFiles(QStringList)));
Chris@326 78
Chris@116 79 addTab(m_fileStatusWidget, tr("My work"));
Chris@88 80
Chris@326 81 // History graph tab
Chris@116 82 m_historyWidget = new HistoryWidget;
Chris@116 83 addTab(m_historyWidget, tr("History"));
Chris@141 84
Chris@141 85 connect(m_historyWidget, SIGNAL(commit()),
Chris@141 86 this, SIGNAL(commit()));
Chris@141 87
Chris@141 88 connect(m_historyWidget, SIGNAL(revert()),
Chris@141 89 this, SIGNAL(revert()));
Chris@141 90
Chris@168 91 connect(m_historyWidget, SIGNAL(showSummary()),
Chris@168 92 this, SIGNAL(showSummary()));
Chris@168 93
Chris@311 94 connect(m_historyWidget, SIGNAL(newBranch()),
Chris@311 95 this, SIGNAL(newBranch()));
Chris@311 96
Chris@311 97 connect(m_historyWidget, SIGNAL(noBranch()),
Chris@311 98 this, SIGNAL(noBranch()));
Chris@311 99
Chris@141 100 connect(m_historyWidget, SIGNAL(diffWorkingFolder()),
Chris@141 101 this, SIGNAL(diffWorkingFolder()));
Chris@141 102
Chris@153 103 connect(m_historyWidget, SIGNAL(showWork()),
Chris@153 104 this, SLOT(showWorkTab()));
Chris@153 105
Chris@141 106 connect(m_historyWidget, SIGNAL(updateTo(QString)),
Chris@141 107 this, SIGNAL(updateTo(QString)));
Chris@141 108
Chris@141 109 connect(m_historyWidget, SIGNAL(diffToCurrent(QString)),
Chris@141 110 this, SIGNAL(diffToCurrent(QString)));
Chris@141 111
Chris@148 112 connect(m_historyWidget, SIGNAL(diffToParent(QString, QString)),
Chris@148 113 this, SIGNAL(diffToParent(QString, QString)));
Chris@141 114
Chris@289 115 connect(m_historyWidget, SIGNAL(showSummary(Changeset *)),
Chris@289 116 this, SIGNAL(showSummary(Changeset *)));
Chris@288 117
Chris@141 118 connect(m_historyWidget, SIGNAL(mergeFrom(QString)),
Chris@141 119 this, SIGNAL(mergeFrom(QString)));
Chris@141 120
Chris@278 121 connect(m_historyWidget, SIGNAL(newBranch(QString)),
Chris@278 122 this, SIGNAL(newBranch(QString)));
Chris@278 123
Chris@141 124 connect(m_historyWidget, SIGNAL(tag(QString)),
Chris@141 125 this, SIGNAL(tag(QString)));
jtkorhonen@32 126 }
jtkorhonen@32 127
Chris@96 128 void HgTabWidget::clearSelections()
Chris@94 129 {
Chris@116 130 m_fileStatusWidget->clearSelections();
Chris@94 131 }
Chris@94 132
Chris@153 133 void HgTabWidget::setCurrent(QStringList ids, QString branch)
Chris@128 134 {
Chris@172 135 bool showUncommitted = haveChangesToCommit();
Chris@163 136 m_historyWidget->setCurrent(ids, branch, showUncommitted);
Chris@129 137 }
Chris@129 138
Chris@230 139 void HgTabWidget::updateFileStates()
Chris@230 140 {
Chris@230 141 m_fileStatusWidget->updateWidgets();
Chris@230 142 }
Chris@230 143
Chris@154 144 void HgTabWidget::updateHistory()
Chris@154 145 {
Chris@154 146 m_historyWidget->update();
Chris@154 147 }
Chris@154 148
Chris@163 149 bool HgTabWidget::canDiff() const
Chris@163 150 {
Chris@237 151 return canRevert();
Chris@163 152 }
Chris@163 153
Chris@96 154 bool HgTabWidget::canCommit() const
Chris@90 155 {
Chris@237 156 if (!m_fileStatusWidget->haveChangesToCommit()) return false;
Chris@237 157 if (!m_fileStatusWidget->getAllUnresolvedFiles().empty()) return false;
Chris@326 158 return true;
Chris@90 159 }
jtkorhonen@0 160
Chris@109 161 bool HgTabWidget::canRevert() const
Chris@109 162 {
Chris@237 163 // Not the same as canCommit() -- we can revert (and diff)
Chris@237 164 // unresolved files, but we can't commit them
Chris@237 165 if (!m_fileStatusWidget->haveChangesToCommit() &&
Chris@237 166 m_fileStatusWidget->getAllUnresolvedFiles().empty()) return false;
Chris@326 167 return true;
Chris@109 168 }
Chris@109 169
Chris@96 170 bool HgTabWidget::canAdd() const
Chris@95 171 {
Chris@327 172 // Permit this only when work tab is visible
Chris@327 173 if (currentIndex() != 0) return false;
Chris@327 174
Chris@204 175 QStringList addable = m_fileStatusWidget->getSelectedAddableFiles();
Chris@204 176 if (addable.empty()) return false;
Chris@204 177
Chris@204 178 QStringList removable = m_fileStatusWidget->getSelectedRemovableFiles();
Chris@204 179 if (!removable.empty()) return false;
Chris@204 180
Chris@326 181 return true;
Chris@95 182 }
Chris@95 183
Chris@96 184 bool HgTabWidget::canRemove() const
Chris@95 185 {
Chris@327 186 // Permit this only when work tab is visible
Chris@327 187 if (currentIndex() != 0) return false;
Chris@327 188
Chris@116 189 if (m_fileStatusWidget->getSelectedRemovableFiles().empty()) return false;
Chris@116 190 if (!m_fileStatusWidget->getSelectedAddableFiles().empty()) return false;
Chris@95 191 return true;
Chris@95 192 }
Chris@95 193
Chris@163 194 bool HgTabWidget::canResolve() const
Chris@95 195 {
Chris@326 196 return !m_fileStatusWidget->getAllUnresolvedFiles().empty();
Chris@95 197 }
Chris@95 198
Chris@172 199 bool HgTabWidget::haveChangesToCommit() const
Chris@172 200 {
Chris@172 201 return m_fileStatusWidget->haveChangesToCommit();
Chris@172 202 }
Chris@172 203
Chris@109 204 QStringList HgTabWidget::getAllCommittableFiles() const
Chris@109 205 {
Chris@116 206 return m_fileStatusWidget->getAllCommittableFiles();
Chris@109 207 }
Chris@109 208
Chris@109 209 QStringList HgTabWidget::getAllRevertableFiles() const
Chris@109 210 {
Chris@116 211 return m_fileStatusWidget->getAllRevertableFiles();
Chris@109 212 }
Chris@109 213
Chris@96 214 QStringList HgTabWidget::getSelectedAddableFiles() const
Chris@95 215 {
Chris@116 216 return m_fileStatusWidget->getSelectedAddableFiles();
Chris@95 217 }
Chris@95 218
Chris@96 219 QStringList HgTabWidget::getSelectedRemovableFiles() const
Chris@95 220 {
Chris@116 221 return m_fileStatusWidget->getSelectedRemovableFiles();
Chris@95 222 }
Chris@95 223
Chris@163 224 QStringList HgTabWidget::getAllUnresolvedFiles() const
Chris@163 225 {
Chris@163 226 return m_fileStatusWidget->getAllUnresolvedFiles();
Chris@163 227 }
Chris@163 228
Chris@96 229 void HgTabWidget::updateWorkFolderFileList(QString fileList)
jtkorhonen@0 230 {
Chris@116 231 m_fileStates.parseStates(fileList);
Chris@116 232 m_fileStatusWidget->setFileStates(m_fileStates);
jtkorhonen@0 233 }
jtkorhonen@0 234
Chris@120 235 void HgTabWidget::setNewLog(QString hgLogList)
jtkorhonen@0 236 {
Chris@120 237 m_historyWidget->parseNewLog(hgLogList);
Chris@134 238 if (m_historyWidget->haveNewItems()) {
Chris@153 239 showHistoryTab();
Chris@134 240 }
Chris@120 241 }
Chris@120 242
Chris@120 243 void HgTabWidget::addIncrementalLog(QString hgLogList)
Chris@120 244 {
Chris@120 245 m_historyWidget->parseIncrementalLog(hgLogList);
Chris@134 246 if (m_historyWidget->haveNewItems()) {
Chris@153 247 showHistoryTab();
Chris@134 248 }
jtkorhonen@0 249 }
jtkorhonen@0 250
Chris@287 251 void HgTabWidget::setLocalPath(QString workFolderPath)
jtkorhonen@0 252 {
Chris@116 253 m_fileStatusWidget->setLocalPath(workFolderPath);
Chris@106 254 }
Chris@153 255
Chris@153 256 void HgTabWidget::showWorkTab()
Chris@153 257 {
Chris@153 258 setCurrentWidget(m_fileStatusWidget);
Chris@153 259 }
Chris@153 260
Chris@153 261 void HgTabWidget::showHistoryTab()
Chris@153 262 {
Chris@153 263 setCurrentWidget(m_historyWidget);
Chris@153 264 }
Chris@153 265