annotate src/hgtabwidget.cpp @ 600:641ccce7c771

Avoid messing with font size when zooming, let it zoom naturally; don't delete detail item when removing it, just let it wait to be shown again (and do delete it when deleting main item)
author Chris Cannam
date Fri, 11 May 2012 17:44:33 +0100
parents 533519ebc0cb
children 6f90bb52eee6
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@560 8 Copyright (c) 2012 Chris Cannam
Chris@560 9 Copyright (c) 2012 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@505 31 QTabWidget(parent),
Chris@505 32 m_haveMerge(false)
jtkorhonen@0 33 {
Chris@326 34 // Work tab
Chris@116 35 m_fileStatusWidget = new FileStatusWidget;
Chris@116 36 m_fileStatusWidget->setLocalPath(workFolderPath);
Chris@326 37
Chris@116 38 connect(m_fileStatusWidget, SIGNAL(selectionChanged()),
Chris@95 39 this, SIGNAL(selectionChanged()));
Chris@326 40
Chris@484 41 connect(m_fileStatusWidget, SIGNAL(showAllChanged()),
Chris@484 42 this, SIGNAL(showAllChanged()));
Chris@326 43
Chris@326 44 connect(m_fileStatusWidget, SIGNAL(annotateFiles(QStringList)),
Chris@326 45 this, SIGNAL(annotateFiles(QStringList)));
Chris@326 46
Chris@326 47 connect(m_fileStatusWidget, SIGNAL(diffFiles(QStringList)),
Chris@326 48 this, SIGNAL(diffFiles(QStringList)));
Chris@326 49
Chris@326 50 connect(m_fileStatusWidget, SIGNAL(commitFiles(QStringList)),
Chris@326 51 this, SIGNAL(commitFiles(QStringList)));
Chris@326 52
Chris@326 53 connect(m_fileStatusWidget, SIGNAL(revertFiles(QStringList)),
Chris@326 54 this, SIGNAL(revertFiles(QStringList)));
Chris@326 55
Chris@361 56 connect(m_fileStatusWidget, SIGNAL(renameFiles(QStringList)),
Chris@361 57 this, SIGNAL(renameFiles(QStringList)));
Chris@361 58
Chris@361 59 connect(m_fileStatusWidget, SIGNAL(copyFiles(QStringList)),
Chris@361 60 this, SIGNAL(copyFiles(QStringList)));
Chris@361 61
Chris@326 62 connect(m_fileStatusWidget, SIGNAL(addFiles(QStringList)),
Chris@326 63 this, SIGNAL(addFiles(QStringList)));
Chris@326 64
Chris@326 65 connect(m_fileStatusWidget, SIGNAL(removeFiles(QStringList)),
Chris@326 66 this, SIGNAL(removeFiles(QStringList)));
Chris@326 67
Chris@326 68 connect(m_fileStatusWidget, SIGNAL(redoFileMerges(QStringList)),
Chris@326 69 this, SIGNAL(redoFileMerges(QStringList)));
Chris@326 70
Chris@326 71 connect(m_fileStatusWidget, SIGNAL(markFilesResolved(QStringList)),
Chris@326 72 this, SIGNAL(markFilesResolved(QStringList)));
Chris@326 73
Chris@326 74 connect(m_fileStatusWidget, SIGNAL(ignoreFiles(QStringList)),
Chris@326 75 this, SIGNAL(ignoreFiles(QStringList)));
Chris@326 76
Chris@326 77 connect(m_fileStatusWidget, SIGNAL(unIgnoreFiles(QStringList)),
Chris@326 78 this, SIGNAL(unIgnoreFiles(QStringList)));
Chris@326 79
Chris@116 80 addTab(m_fileStatusWidget, tr("My work"));
Chris@88 81
Chris@326 82 // History graph tab
Chris@116 83 m_historyWidget = new HistoryWidget;
Chris@116 84 addTab(m_historyWidget, tr("History"));
Chris@141 85
Chris@141 86 connect(m_historyWidget, SIGNAL(commit()),
Chris@141 87 this, SIGNAL(commit()));
Chris@141 88
Chris@141 89 connect(m_historyWidget, SIGNAL(revert()),
Chris@141 90 this, SIGNAL(revert()));
Chris@141 91
Chris@168 92 connect(m_historyWidget, SIGNAL(showSummary()),
Chris@168 93 this, SIGNAL(showSummary()));
Chris@168 94
Chris@311 95 connect(m_historyWidget, SIGNAL(newBranch()),
Chris@311 96 this, SIGNAL(newBranch()));
Chris@311 97
Chris@311 98 connect(m_historyWidget, SIGNAL(noBranch()),
Chris@311 99 this, SIGNAL(noBranch()));
Chris@311 100
Chris@141 101 connect(m_historyWidget, SIGNAL(diffWorkingFolder()),
Chris@141 102 this, SIGNAL(diffWorkingFolder()));
Chris@141 103
Chris@153 104 connect(m_historyWidget, SIGNAL(showWork()),
Chris@153 105 this, SLOT(showWorkTab()));
Chris@153 106
Chris@141 107 connect(m_historyWidget, SIGNAL(updateTo(QString)),
Chris@141 108 this, SIGNAL(updateTo(QString)));
Chris@141 109
Chris@141 110 connect(m_historyWidget, SIGNAL(diffToCurrent(QString)),
Chris@141 111 this, SIGNAL(diffToCurrent(QString)));
Chris@141 112
Chris@148 113 connect(m_historyWidget, SIGNAL(diffToParent(QString, QString)),
Chris@148 114 this, SIGNAL(diffToParent(QString, QString)));
Chris@141 115
Chris@289 116 connect(m_historyWidget, SIGNAL(showSummary(Changeset *)),
Chris@289 117 this, SIGNAL(showSummary(Changeset *)));
Chris@288 118
Chris@141 119 connect(m_historyWidget, SIGNAL(mergeFrom(QString)),
Chris@141 120 this, SIGNAL(mergeFrom(QString)));
Chris@141 121
Chris@278 122 connect(m_historyWidget, SIGNAL(newBranch(QString)),
Chris@278 123 this, SIGNAL(newBranch(QString)));
Chris@278 124
Chris@514 125 connect(m_historyWidget, SIGNAL(closeBranch(QString)),
Chris@514 126 this, SIGNAL(closeBranch(QString)));
Chris@514 127
Chris@141 128 connect(m_historyWidget, SIGNAL(tag(QString)),
Chris@141 129 this, SIGNAL(tag(QString)));
jtkorhonen@32 130 }
jtkorhonen@32 131
Chris@96 132 void HgTabWidget::clearSelections()
Chris@94 133 {
Chris@116 134 m_fileStatusWidget->clearSelections();
Chris@94 135 }
Chris@94 136
Chris@153 137 void HgTabWidget::setCurrent(QStringList ids, QString branch)
Chris@128 138 {
Chris@505 139 m_historyWidget->setCurrent(ids, branch, haveChangesToCommit());
Chris@129 140 }
Chris@129 141
Chris@506 142 void HgTabWidget::setClosedHeadIds(QSet<QString> closed)
Chris@506 143 {
Chris@506 144 m_historyWidget->setClosedHeadIds(closed);
Chris@506 145 }
Chris@506 146
Chris@230 147 void HgTabWidget::updateFileStates()
Chris@230 148 {
Chris@230 149 m_fileStatusWidget->updateWidgets();
Chris@230 150 }
Chris@230 151
Chris@154 152 void HgTabWidget::updateHistory()
Chris@154 153 {
Chris@154 154 m_historyWidget->update();
Chris@154 155 }
Chris@154 156
Chris@555 157 void HgTabWidget::setSearchText(QString text)
Chris@555 158 {
Chris@555 159 m_fileStatusWidget->setSearchText(text);
Chris@555 160 m_historyWidget->setSearchText(text);
Chris@555 161 }
Chris@555 162
Chris@163 163 bool HgTabWidget::canDiff() const
Chris@163 164 {
Chris@237 165 return canRevert();
Chris@163 166 }
Chris@163 167
Chris@96 168 bool HgTabWidget::canCommit() const
Chris@90 169 {
Chris@505 170 if (!haveChangesToCommit()) return false;
Chris@505 171 if (!getAllUnresolvedFiles().empty()) return false;
Chris@326 172 return true;
Chris@90 173 }
jtkorhonen@0 174
Chris@109 175 bool HgTabWidget::canRevert() const
Chris@109 176 {
Chris@237 177 // Not the same as canCommit() -- we can revert (and diff)
Chris@237 178 // unresolved files, but we can't commit them
Chris@505 179 if (!haveChangesToCommit() &&
Chris@505 180 getAllUnresolvedFiles().empty()) return false;
Chris@326 181 return true;
Chris@109 182 }
Chris@109 183
Chris@96 184 bool HgTabWidget::canAdd() 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@505 189 QStringList addable = getSelectedAddableFiles();
Chris@204 190 if (addable.empty()) return false;
Chris@204 191
Chris@505 192 QStringList removable = getSelectedRemovableFiles();
Chris@204 193 if (!removable.empty()) return false;
Chris@204 194
Chris@326 195 return true;
Chris@95 196 }
Chris@95 197
Chris@96 198 bool HgTabWidget::canRemove() const
Chris@95 199 {
Chris@327 200 // Permit this only when work tab is visible
Chris@327 201 if (currentIndex() != 0) return false;
Chris@327 202
Chris@505 203 if (getSelectedRemovableFiles().empty()) return false;
Chris@505 204 if (!getSelectedAddableFiles().empty()) return false;
Chris@95 205 return true;
Chris@95 206 }
Chris@95 207
Chris@163 208 bool HgTabWidget::canResolve() const
Chris@95 209 {
Chris@505 210 return !getAllUnresolvedFiles().empty();
Chris@95 211 }
Chris@95 212
Chris@425 213 bool HgTabWidget::canIgnore() const
Chris@425 214 {
Chris@425 215 return canAdd();
Chris@425 216 }
Chris@425 217
Chris@172 218 bool HgTabWidget::haveChangesToCommit() const
Chris@172 219 {
Chris@505 220 return m_haveMerge || m_fileStatusWidget->haveChangesToCommit();
Chris@172 221 }
Chris@172 222
Chris@109 223 QStringList HgTabWidget::getAllCommittableFiles() const
Chris@109 224 {
Chris@116 225 return m_fileStatusWidget->getAllCommittableFiles();
Chris@109 226 }
Chris@109 227
Chris@109 228 QStringList HgTabWidget::getAllRevertableFiles() const
Chris@109 229 {
Chris@116 230 return m_fileStatusWidget->getAllRevertableFiles();
Chris@109 231 }
Chris@109 232
Chris@96 233 QStringList HgTabWidget::getSelectedAddableFiles() const
Chris@95 234 {
Chris@116 235 return m_fileStatusWidget->getSelectedAddableFiles();
Chris@95 236 }
Chris@95 237
Chris@96 238 QStringList HgTabWidget::getSelectedRemovableFiles() const
Chris@95 239 {
Chris@116 240 return m_fileStatusWidget->getSelectedRemovableFiles();
Chris@95 241 }
Chris@95 242
Chris@163 243 QStringList HgTabWidget::getAllUnresolvedFiles() const
Chris@163 244 {
Chris@163 245 return m_fileStatusWidget->getAllUnresolvedFiles();
Chris@163 246 }
Chris@163 247
Chris@96 248 void HgTabWidget::updateWorkFolderFileList(QString fileList)
jtkorhonen@0 249 {
Chris@116 250 m_fileStates.parseStates(fileList);
Chris@116 251 m_fileStatusWidget->setFileStates(m_fileStates);
jtkorhonen@0 252 }
jtkorhonen@0 253
Chris@505 254 void HgTabWidget::setHaveMerge(bool haveMerge)
Chris@505 255 {
Chris@505 256 if (m_haveMerge != haveMerge) {
Chris@505 257 m_haveMerge = haveMerge;
Chris@505 258 m_historyWidget->setShowUncommitted(haveChangesToCommit());
Chris@505 259 updateHistory();
Chris@505 260 }
Chris@505 261 }
Chris@505 262
Chris@120 263 void HgTabWidget::setNewLog(QString hgLogList)
jtkorhonen@0 264 {
Chris@120 265 m_historyWidget->parseNewLog(hgLogList);
Chris@134 266 if (m_historyWidget->haveNewItems()) {
Chris@153 267 showHistoryTab();
Chris@134 268 }
Chris@120 269 }
Chris@120 270
Chris@120 271 void HgTabWidget::addIncrementalLog(QString hgLogList)
Chris@120 272 {
Chris@120 273 m_historyWidget->parseIncrementalLog(hgLogList);
Chris@134 274 if (m_historyWidget->haveNewItems()) {
Chris@153 275 showHistoryTab();
Chris@134 276 }
jtkorhonen@0 277 }
jtkorhonen@0 278
Chris@287 279 void HgTabWidget::setLocalPath(QString workFolderPath)
jtkorhonen@0 280 {
Chris@116 281 m_fileStatusWidget->setLocalPath(workFolderPath);
Chris@106 282 }
Chris@153 283
Chris@153 284 void HgTabWidget::showWorkTab()
Chris@153 285 {
Chris@153 286 setCurrentWidget(m_fileStatusWidget);
Chris@153 287 }
Chris@153 288
Chris@153 289 void HgTabWidget::showHistoryTab()
Chris@153 290 {
Chris@153 291 setCurrentWidget(m_historyWidget);
Chris@153 292 }
Chris@153 293
Chris@484 294 bool HgTabWidget::shouldShowAll() const
Chris@484 295 {
Chris@484 296 return m_fileStatusWidget->shouldShowAll();
Chris@484 297 }
Chris@484 298