jtkorhonen@0: /**************************************************************************** jtkorhonen@0: ** jtkorhonen@0: ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). jtkorhonen@0: ** All rights reserved. jtkorhonen@0: ** Contact: Nokia Corporation (qt-info@nokia.com) jtkorhonen@0: ** jtkorhonen@0: ** This file is part of the examples of the Qt Toolkit. jtkorhonen@0: ** jtkorhonen@0: ** $QT_BEGIN_LICENSE:LGPL$ jtkorhonen@0: ** Commercial Usage jtkorhonen@0: ** Licensees holding valid Qt Commercial licenses may use this file in jtkorhonen@0: ** accordance with the Qt Commercial License Agreement provided with the jtkorhonen@0: ** Software or, alternatively, in accordance with the terms contained in jtkorhonen@0: ** a written agreement between you and Nokia. jtkorhonen@0: ** jtkorhonen@0: ** GNU Lesser General Public License Usage jtkorhonen@0: ** Alternatively, this file may be used under the terms of the GNU Lesser jtkorhonen@0: ** General Public License version 2.1 as published by the Free Software jtkorhonen@0: ** Foundation and appearing in the file LICENSE.LGPL included in the jtkorhonen@0: ** packaging of this file. Please review the following information to jtkorhonen@0: ** ensure the GNU Lesser General Public License version 2.1 requirements jtkorhonen@0: ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. jtkorhonen@0: ** jtkorhonen@0: ** In addition, as a special exception, Nokia gives you certain additional jtkorhonen@0: ** rights. These rights are described in the Nokia Qt LGPL Exception jtkorhonen@0: ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. jtkorhonen@0: ** jtkorhonen@0: ** GNU General Public License Usage jtkorhonen@0: ** Alternatively, this file may be used under the terms of the GNU jtkorhonen@0: ** General Public License version 3.0 as published by the Free Software jtkorhonen@0: ** Foundation and appearing in the file LICENSE.GPL included in the jtkorhonen@0: ** packaging of this file. Please review the following information to jtkorhonen@0: ** ensure the GNU General Public License version 3.0 requirements will be jtkorhonen@0: ** met: http://www.gnu.org/copyleft/gpl.html. jtkorhonen@0: ** jtkorhonen@0: ** If you have questions regarding the use of this file, please contact jtkorhonen@0: ** Nokia at qt-info@nokia.com. jtkorhonen@0: ** $QT_END_LICENSE$ jtkorhonen@0: ** jtkorhonen@0: ** Copyright (C) Jari Korhonen, 2010 (HgExplorer specific parts, under lgpl) jtkorhonen@0: *************************************************************************************/ jtkorhonen@0: jtkorhonen@0: #include jtkorhonen@0: #include jtkorhonen@0: #include jtkorhonen@0: jtkorhonen@0: #include "mainwindow.h" jtkorhonen@0: #include "settingsdialog.h" jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: MainWindow::MainWindow() jtkorhonen@0: { jtkorhonen@0: QString wndTitle; jtkorhonen@0: jtkorhonen@0: createActions(); jtkorhonen@0: createMenus(); jtkorhonen@0: createToolBars(); jtkorhonen@0: createStatusBar(); jtkorhonen@0: jtkorhonen@0: timerId = startTimer(200); jtkorhonen@0: runner = new HgRunner(this); jtkorhonen@0: runningAction = ACT_NONE; jtkorhonen@0: statusBar()->addPermanentWidget(runner); jtkorhonen@0: jtkorhonen@0: wndTitle.sprintf("%s %s", APPNAME, APPVERSION); jtkorhonen@0: setWindowTitle(wndTitle); jtkorhonen@0: jtkorhonen@0: remoteRepoPath = ""; jtkorhonen@0: workFolderPath = ""; jtkorhonen@0: jtkorhonen@0: readSettings(); jtkorhonen@0: jtkorhonen@0: tabPage = 0; jtkorhonen@0: hgExp = new HgExpWidget((QWidget *) this, remoteRepoPath, workFolderPath, initialFileTypesBits); jtkorhonen@0: setCentralWidget(hgExp); jtkorhonen@0: jtkorhonen@0: setUnifiedTitleAndToolBarOnMac(true); jtkorhonen@0: connectActions(); jtkorhonen@0: enableDisableActions(); jtkorhonen@0: jtkorhonen@0: if (firstStart) jtkorhonen@0: { jtkorhonen@0: QMessageBox::information(this, tr("First start todo"), tr("Going to \"Settings\" first.")); jtkorhonen@0: settings(); jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: hgStat(); jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: void MainWindow::closeEvent(QCloseEvent *) jtkorhonen@0: { jtkorhonen@0: writeSettings(); jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: void MainWindow::about() jtkorhonen@0: { jtkorhonen@0: QMessageBox::about(this, tr("About HgExplorer"), jtkorhonen@0: tr("HgExplorer tries to be Mercurial's VSS Explorer: ;-)

" jtkorhonen@0: "-Hides command line in normal use
" jtkorhonen@0: "-Makes common operations easier

" jtkorhonen@0: "(c) 2010 (lgpl), Jari Korhonen (jtkorhonen@gmail.com)

" jtkorhonen@0: "-Needs Mercurial ;-) (thanks Matt Mackall, Bryan O'Sullivan and others !)
" jtkorhonen@0: "-Uses excellent Nuvola icons (c) David Vignoni (Thanks, David !)
" jtkorhonen@0: "-Needs Qt4, mingw (in windows), python, kdiff3 (Thanks to all of you !)
")); jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: void MainWindow::hgStat() jtkorhonen@0: { jtkorhonen@0: if (hgStatAct -> isEnabled()) jtkorhonen@0: { jtkorhonen@0: if (runningAction == ACT_NONE) jtkorhonen@0: { jtkorhonen@0: QStringList params; jtkorhonen@0: jtkorhonen@0: QString statFlags = hgExp -> getStatFlags(); jtkorhonen@0: if (statFlags.isEmpty()) jtkorhonen@0: { jtkorhonen@0: params << "stat"; jtkorhonen@0: } jtkorhonen@0: else jtkorhonen@0: { jtkorhonen@0: params << "stat" << "-" + statFlags; jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: runner -> startProc(getHgBinaryName(), workFolderPath, params); jtkorhonen@0: runningAction = ACT_STAT; jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: void MainWindow::hgHeads() jtkorhonen@0: { jtkorhonen@0: if (runningAction == ACT_NONE) jtkorhonen@0: { jtkorhonen@0: QStringList params; jtkorhonen@0: params << "heads"; jtkorhonen@0: jtkorhonen@0: //on empty repos, "hg heads" will fail, don't care of that. jtkorhonen@0: runner -> startProc(getHgBinaryName(), workFolderPath, params, false); jtkorhonen@0: runningAction = ACT_HEADS; jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: void MainWindow::hgLog() jtkorhonen@0: { jtkorhonen@0: if (runningAction == ACT_NONE) jtkorhonen@0: { jtkorhonen@0: QStringList params; jtkorhonen@0: params << "glog" << "--verbose"; jtkorhonen@0: jtkorhonen@0: runner -> startProc(getHgBinaryName(), workFolderPath, params); jtkorhonen@0: runningAction = ACT_LOG; jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: void MainWindow::hgParents() jtkorhonen@0: { jtkorhonen@0: if (runningAction == ACT_NONE) jtkorhonen@0: { jtkorhonen@0: QStringList params; jtkorhonen@0: params << "parents"; jtkorhonen@0: jtkorhonen@0: runner -> startProc(getHgBinaryName(), workFolderPath, params); jtkorhonen@0: runningAction = ACT_PARENTS; jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: void MainWindow::hgRemove() jtkorhonen@0: { jtkorhonen@0: if (runningAction == ACT_NONE) jtkorhonen@0: { jtkorhonen@0: QStringList params; jtkorhonen@0: QString currentFile = hgExp -> getCurrentFileListLine(); jtkorhonen@0: jtkorhonen@0: if (!currentFile.isEmpty()) jtkorhonen@0: { jtkorhonen@0: params << "remove" << currentFile.mid(2); //Jump over status marker characters (e.g "M ") jtkorhonen@0: jtkorhonen@0: runner -> startProc(getHgBinaryName(), workFolderPath, params); jtkorhonen@0: runningAction = ACT_REMOVE; jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: void MainWindow::hgAnnotate() jtkorhonen@0: { jtkorhonen@0: if (runningAction == ACT_NONE) jtkorhonen@0: { jtkorhonen@0: QStringList params; jtkorhonen@0: QString currentFile = hgExp -> getCurrentFileListLine(); jtkorhonen@0: jtkorhonen@0: if (!currentFile.isEmpty()) jtkorhonen@0: { jtkorhonen@0: params << "annotate" << currentFile.mid(2); //Jump over status marker characters (e.g "M ") jtkorhonen@0: jtkorhonen@0: runner -> startProc(getHgBinaryName(), workFolderPath, params); jtkorhonen@0: runningAction = ACT_ANNOTATE; jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: void MainWindow::hgResolveMark() jtkorhonen@0: { jtkorhonen@0: if (runningAction == ACT_NONE) jtkorhonen@0: { jtkorhonen@0: QStringList params; jtkorhonen@0: QString currentFile = hgExp -> getCurrentFileListLine(); jtkorhonen@0: jtkorhonen@0: if (!currentFile.isEmpty()) jtkorhonen@0: { jtkorhonen@0: params << "resolve" << "--mark" << currentFile.mid(2); //Jump over status marker characters (e.g "M ") jtkorhonen@0: jtkorhonen@0: runner -> startProc(getHgBinaryName(), workFolderPath, params); jtkorhonen@0: runningAction = ACT_RESOLVE_MARK; jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: void MainWindow::hgResolveList() jtkorhonen@0: { jtkorhonen@0: if (runningAction == ACT_NONE) jtkorhonen@0: { jtkorhonen@0: QStringList params; jtkorhonen@0: jtkorhonen@0: params << "resolve" << "--list"; jtkorhonen@0: runner -> startProc(getHgBinaryName(), workFolderPath, params); jtkorhonen@0: runningAction = ACT_RESOLVE_LIST; jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: void MainWindow::hgAdd() jtkorhonen@0: { jtkorhonen@0: if (runningAction == ACT_NONE) jtkorhonen@0: { jtkorhonen@0: QStringList params; jtkorhonen@0: jtkorhonen@0: params << "add"; jtkorhonen@0: jtkorhonen@0: runner -> startProc(getHgBinaryName(), workFolderPath, params); jtkorhonen@0: runningAction = ACT_ADD; jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: int MainWindow::getCommitComment(QString& comment) jtkorhonen@0: { jtkorhonen@0: int ret; jtkorhonen@0: jtkorhonen@0: QDialog dlg(this); jtkorhonen@0: jtkorhonen@0: QLabel *commentLabel = new QLabel(tr("Comment:")); jtkorhonen@0: QLineEdit *commentEdit = new QLineEdit; jtkorhonen@0: commentEdit -> setFixedWidth(400); jtkorhonen@0: QHBoxLayout *commentLayout = new QHBoxLayout; jtkorhonen@0: commentLayout -> addWidget(commentLabel); jtkorhonen@0: commentLayout -> addWidget(commentEdit); jtkorhonen@0: jtkorhonen@0: QPushButton *btnOk = new QPushButton(tr("Ok")); jtkorhonen@0: QPushButton *btnCancel = new QPushButton(tr("Cancel")); jtkorhonen@0: QHBoxLayout *btnLayout = new QHBoxLayout; jtkorhonen@0: btnLayout -> addWidget(btnOk); jtkorhonen@0: btnLayout -> addWidget(btnCancel); jtkorhonen@0: jtkorhonen@0: QVBoxLayout *mainLayout = new QVBoxLayout; jtkorhonen@0: mainLayout -> addLayout(commentLayout); jtkorhonen@0: mainLayout -> addLayout(btnLayout); jtkorhonen@0: jtkorhonen@0: dlg.setLayout(mainLayout); jtkorhonen@0: jtkorhonen@0: dlg.setWindowTitle(tr("Save (commit)")); jtkorhonen@0: jtkorhonen@0: connect(btnOk, SIGNAL(clicked()), &dlg, SLOT(accept())); jtkorhonen@0: connect(btnCancel, SIGNAL(clicked()), &dlg, SLOT(reject())); jtkorhonen@0: jtkorhonen@0: ret = dlg.exec(); jtkorhonen@0: comment = commentEdit -> text(); jtkorhonen@0: return ret; jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: void MainWindow::hgCommit() jtkorhonen@0: { jtkorhonen@0: if (runningAction == ACT_NONE) jtkorhonen@0: { jtkorhonen@0: QStringList params; jtkorhonen@0: QString comment; jtkorhonen@0: jtkorhonen@0: if (QDialog::Accepted == getCommitComment(comment)) jtkorhonen@0: { jtkorhonen@0: if (!comment.isEmpty()) jtkorhonen@0: { jtkorhonen@0: params << "commit" << "--message" << comment << "--user" << userInfo; jtkorhonen@0: jtkorhonen@0: runner -> startProc(getHgBinaryName(), workFolderPath, params); jtkorhonen@0: runningAction = ACT_COMMIT; jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: void MainWindow::hgFileDiff() jtkorhonen@0: { jtkorhonen@0: if (runningAction == ACT_NONE) jtkorhonen@0: { jtkorhonen@0: QStringList params; jtkorhonen@0: jtkorhonen@0: QString currentFile = hgExp -> getCurrentFileListLine(); jtkorhonen@0: jtkorhonen@0: if (!currentFile.isEmpty()) jtkorhonen@0: { jtkorhonen@0: //Diff parent file against working folder file jtkorhonen@0: params << "kdiff3" << currentFile.mid(2); jtkorhonen@0: runner -> startProc(getHgBinaryName(), workFolderPath, params, false); jtkorhonen@0: runningAction = ACT_FILEDIFF; jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: void MainWindow::hgFolderDiff() jtkorhonen@0: { jtkorhonen@0: if (runningAction == ACT_NONE) jtkorhonen@0: { jtkorhonen@0: QStringList params; jtkorhonen@0: jtkorhonen@0: //Diff parent against working folder (folder diff) jtkorhonen@0: params << "kdiff3"; jtkorhonen@0: runner -> startProc(getHgBinaryName(), workFolderPath, params, false); jtkorhonen@0: runningAction = ACT_FOLDERDIFF; jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: void MainWindow::hgChgSetDiff() jtkorhonen@0: { jtkorhonen@0: if (runningAction == ACT_NONE) jtkorhonen@0: { jtkorhonen@0: QStringList params; jtkorhonen@0: jtkorhonen@0: //Diff 2 history log versions against each other jtkorhonen@0: QString revA; jtkorhonen@0: QString revB; jtkorhonen@0: jtkorhonen@0: hgExp -> getHistoryDiffRevisions(revA, revB); jtkorhonen@0: jtkorhonen@0: if ((!revA.isEmpty()) && (!revB.isEmpty())) jtkorhonen@0: { jtkorhonen@0: params << "kdiff3" << "--rev" << revA << "--rev" << revB; jtkorhonen@0: runner -> startProc(getHgBinaryName(), workFolderPath, params, false); jtkorhonen@0: runningAction = ACT_CHGSETDIFF; jtkorhonen@0: } jtkorhonen@0: else jtkorhonen@0: { jtkorhonen@0: QMessageBox::information(this, tr("Changeset diff"), tr("Please select two changesets from history list or heads list first.")); jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: void MainWindow::hgUpdate() jtkorhonen@0: { jtkorhonen@0: if (runningAction == ACT_NONE) jtkorhonen@0: { jtkorhonen@0: QStringList params; jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: params << "update"; jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: runner -> startProc(getHgBinaryName(), workFolderPath, params); jtkorhonen@0: runningAction = ACT_UPDATE; jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: void MainWindow::hgUpdateToRev() jtkorhonen@0: { jtkorhonen@0: if (runningAction == ACT_NONE) jtkorhonen@0: { jtkorhonen@0: QStringList params; jtkorhonen@0: QString rev; jtkorhonen@0: jtkorhonen@0: hgExp -> getUpdateToRevRevision(rev); jtkorhonen@0: jtkorhonen@0: hgExp -> setCurrentIndex(WORKTAB); jtkorhonen@0: enableDisableActions(); jtkorhonen@0: jtkorhonen@0: params << "update" << "--rev" << rev << "--clean"; jtkorhonen@0: jtkorhonen@0: runner -> startProc(getHgBinaryName(), workFolderPath, params); jtkorhonen@0: jtkorhonen@0: runningAction = ACT_UPDATE; jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: void MainWindow::hgRevert() jtkorhonen@0: { jtkorhonen@0: if (runningAction == ACT_NONE) jtkorhonen@0: { jtkorhonen@0: QStringList params; jtkorhonen@0: QString currentFile = hgExp -> getCurrentFileListLine(); jtkorhonen@0: jtkorhonen@0: params << "revert" << currentFile.mid(2); jtkorhonen@0: jtkorhonen@0: runner -> startProc(getHgBinaryName(), workFolderPath, params); jtkorhonen@0: runningAction = ACT_REVERT; jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: void MainWindow::hgMerge() jtkorhonen@0: { jtkorhonen@0: if (runningAction == ACT_NONE) jtkorhonen@0: { jtkorhonen@0: QStringList params; jtkorhonen@0: jtkorhonen@0: params << "merge"; jtkorhonen@0: jtkorhonen@0: runner -> startProc(getHgBinaryName(), workFolderPath, params); jtkorhonen@0: runningAction = ACT_MERGE; jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: void MainWindow::hgCloneFromRemote() jtkorhonen@0: { jtkorhonen@0: if (runningAction == ACT_NONE) jtkorhonen@0: { jtkorhonen@0: QStringList params; jtkorhonen@0: jtkorhonen@0: params << "clone" << remoteRepoPath << workFolderPath; jtkorhonen@0: jtkorhonen@0: runner -> startProc(getHgBinaryName(), workFolderPath, params); jtkorhonen@0: runningAction = ACT_CLONEFROMREMOTE; jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: void MainWindow::hgInit() jtkorhonen@0: { jtkorhonen@0: if (runningAction == ACT_NONE) jtkorhonen@0: { jtkorhonen@0: QStringList params; jtkorhonen@0: jtkorhonen@0: params << "init"; jtkorhonen@0: jtkorhonen@0: runner -> startProc(getHgBinaryName(), workFolderPath, params); jtkorhonen@0: runningAction = ACT_INIT; jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: void MainWindow::hgIncoming() jtkorhonen@0: { jtkorhonen@0: if (runningAction == ACT_NONE) jtkorhonen@0: { jtkorhonen@0: QStringList params; jtkorhonen@0: jtkorhonen@0: params << "incoming" << "--newest-first" << remoteRepoPath; jtkorhonen@0: jtkorhonen@0: runner -> startProc(getHgBinaryName(), workFolderPath, params, false); jtkorhonen@0: runningAction = ACT_INCOMING; jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: void MainWindow::hgPull() jtkorhonen@0: { jtkorhonen@0: if (runningAction == ACT_NONE) jtkorhonen@0: { jtkorhonen@0: QStringList params; jtkorhonen@0: jtkorhonen@0: params << "pull" << remoteRepoPath; jtkorhonen@0: jtkorhonen@0: runner -> startProc(getHgBinaryName(), workFolderPath, params); jtkorhonen@0: runningAction = ACT_PULL; jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: void MainWindow::hgPush() jtkorhonen@0: { jtkorhonen@0: if (runningAction == ACT_NONE) jtkorhonen@0: { jtkorhonen@0: QStringList params; jtkorhonen@0: jtkorhonen@0: params << "push" << remoteRepoPath; jtkorhonen@0: jtkorhonen@0: runner -> startProc(getHgBinaryName(), workFolderPath, params); jtkorhonen@0: runningAction = ACT_PUSH; jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: void MainWindow::settings() jtkorhonen@0: { jtkorhonen@0: SettingsDialog *settingsDlg = new SettingsDialog(this); jtkorhonen@0: settingsDlg->setModal(true); jtkorhonen@0: settingsDlg->exec(); jtkorhonen@0: hgExp -> clearLists(); jtkorhonen@0: enableDisableActions(); jtkorhonen@0: hgStat(); jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: void MainWindow::presentLongStdoutToUser(QString stdo, int w, int h) jtkorhonen@0: { jtkorhonen@0: QDialog dlg; jtkorhonen@0: dlg.setMinimumWidth(w); jtkorhonen@0: dlg.setMinimumHeight(h); jtkorhonen@0: jtkorhonen@0: QVBoxLayout *box = new QVBoxLayout; jtkorhonen@0: QListWidget *list = new QListWidget; jtkorhonen@0: list-> addItems(stdo.split("\n")); jtkorhonen@0: QPushButton *btn = new QPushButton(tr("Ok")); jtkorhonen@0: connect(btn, SIGNAL(clicked()), &dlg, SLOT(accept())); jtkorhonen@0: jtkorhonen@0: box -> addWidget(list); jtkorhonen@0: box -> addWidget(btn); jtkorhonen@0: dlg.setLayout(box); jtkorhonen@0: jtkorhonen@0: dlg.exec(); jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: bool MainWindow::isSelectedLocallyDeleted(QListWidget *workList) jtkorhonen@0: { jtkorhonen@0: QList selList = workList -> selectedItems(); jtkorhonen@0: if (selList.count() == 1) jtkorhonen@0: { jtkorhonen@0: if (selList.at(0)->text().mid(0, 1) == "!") jtkorhonen@0: { jtkorhonen@0: return true; jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: return false; jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: bool MainWindow::isSelectedUntracked(QListWidget *workList) jtkorhonen@0: { jtkorhonen@0: QList selList = workList -> selectedItems(); jtkorhonen@0: if (selList.count() == 1) jtkorhonen@0: { jtkorhonen@0: if (selList.at(0)->text().mid(0, 1) == "?") jtkorhonen@0: { jtkorhonen@0: return true; jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: return false; jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: bool MainWindow::isSelectedModified(QListWidget *workList) jtkorhonen@0: { jtkorhonen@0: QList selList = workList -> selectedItems(); jtkorhonen@0: if (selList.count() == 1) jtkorhonen@0: { jtkorhonen@0: if (selList.at(0)->text().mid(0, 1) == "M") jtkorhonen@0: { jtkorhonen@0: return true; jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: return false; jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: void MainWindow::countAMRModifications(QListWidget *workList, int& a, int& m, int& r) jtkorhonen@0: { jtkorhonen@0: int itemCount = workList -> count(); jtkorhonen@0: if (itemCount > 0) jtkorhonen@0: { jtkorhonen@0: int A= 0; jtkorhonen@0: int M=0; jtkorhonen@0: int R=0; jtkorhonen@0: for (int i = 0; i < workList -> count(); i++) jtkorhonen@0: { jtkorhonen@0: QListWidgetItem *currItem = workList -> item(i); jtkorhonen@0: jtkorhonen@0: QString tmp = currItem->text().mid(0, 1); jtkorhonen@0: if (tmp == "M") jtkorhonen@0: { jtkorhonen@0: M++; jtkorhonen@0: } jtkorhonen@0: else if (tmp == "R") jtkorhonen@0: { jtkorhonen@0: R++; jtkorhonen@0: } jtkorhonen@0: else if (tmp == "A") jtkorhonen@0: { jtkorhonen@0: A++; jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: a = A; jtkorhonen@0: m = M; jtkorhonen@0: r = R; jtkorhonen@0: } jtkorhonen@0: else jtkorhonen@0: { jtkorhonen@0: a = 0; jtkorhonen@0: m = 0; jtkorhonen@0: r = 0; jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: void MainWindow::timerEvent(QTimerEvent *) jtkorhonen@0: { jtkorhonen@0: bool shouldHgStat = false; jtkorhonen@0: jtkorhonen@0: if (runningAction != ACT_NONE) jtkorhonen@0: { jtkorhonen@0: //We are running some hg command... jtkorhonen@0: if (runner -> isProcRunning() == false) jtkorhonen@0: { jtkorhonen@0: //Running has just ended. jtkorhonen@0: int exitCode = runner -> getExitCode(); jtkorhonen@0: jtkorhonen@0: runner -> hideProgBar(); jtkorhonen@0: jtkorhonen@0: //Clumsy... jtkorhonen@0: if ((EXITOK(exitCode)) || ((exitCode == 1) && (runningAction == ACT_INCOMING))) jtkorhonen@0: { jtkorhonen@0: //Successful running. jtkorhonen@0: switch(runningAction) jtkorhonen@0: { jtkorhonen@0: case ACT_STAT: jtkorhonen@0: { jtkorhonen@0: hgExp -> updateWorkFolderFileList(runner -> getStdOut()); jtkorhonen@0: } jtkorhonen@0: break; jtkorhonen@0: jtkorhonen@0: case ACT_INCOMING: jtkorhonen@0: case ACT_ANNOTATE: jtkorhonen@0: case ACT_RESOLVE_LIST: jtkorhonen@0: case ACT_RESOLVE_MARK: jtkorhonen@0: presentLongStdoutToUser(runner -> getStdOut(), 1024, 768); jtkorhonen@0: shouldHgStat = true; jtkorhonen@0: break; jtkorhonen@0: jtkorhonen@0: case ACT_PULL: jtkorhonen@0: QMessageBox::information(this, "pull", runner -> getStdOut()); jtkorhonen@0: shouldHgStat = true; jtkorhonen@0: break; jtkorhonen@0: jtkorhonen@0: case ACT_PUSH: jtkorhonen@0: QMessageBox::information(this, "push", runner -> getStdOut()); jtkorhonen@0: shouldHgStat = true; jtkorhonen@0: break; jtkorhonen@0: jtkorhonen@0: case ACT_INIT: jtkorhonen@0: enableDisableActions(); jtkorhonen@0: shouldHgStat = true; jtkorhonen@0: break; jtkorhonen@0: jtkorhonen@0: case ACT_CLONEFROMREMOTE: jtkorhonen@0: QMessageBox::information(this, "clone", runner -> getStdOut()); jtkorhonen@0: enableDisableActions(); jtkorhonen@0: shouldHgStat = true; jtkorhonen@0: break; jtkorhonen@0: jtkorhonen@0: case ACT_LOG: jtkorhonen@0: { jtkorhonen@0: hgExp -> updateLocalRepoHgLogList(runner -> getStdOut()); jtkorhonen@0: } jtkorhonen@0: break; jtkorhonen@0: jtkorhonen@0: case ACT_PARENTS: jtkorhonen@0: { jtkorhonen@0: hgExp -> updateLocalRepoParentsList(runner -> getStdOut()); jtkorhonen@0: } jtkorhonen@0: break; jtkorhonen@0: jtkorhonen@0: case ACT_HEADS: jtkorhonen@0: { jtkorhonen@0: QString stdOut = runner -> getStdOut(); jtkorhonen@0: hgExp -> updateLocalRepoHeadsList(stdOut); jtkorhonen@0: } jtkorhonen@0: break; jtkorhonen@0: jtkorhonen@0: case ACT_REMOVE: jtkorhonen@0: case ACT_ADD: jtkorhonen@0: case ACT_COMMIT: jtkorhonen@0: case ACT_FILEDIFF: jtkorhonen@0: case ACT_FOLDERDIFF: jtkorhonen@0: case ACT_CHGSETDIFF: jtkorhonen@0: case ACT_REVERT: jtkorhonen@0: shouldHgStat = true; jtkorhonen@0: break; jtkorhonen@0: jtkorhonen@0: case ACT_UPDATE: jtkorhonen@0: QMessageBox::information(this, "update", runner -> getStdOut()); jtkorhonen@0: shouldHgStat = true; jtkorhonen@0: break; jtkorhonen@0: jtkorhonen@0: case ACT_MERGE: jtkorhonen@0: QMessageBox::information(this, "merge", runner -> getStdOut()); jtkorhonen@0: shouldHgStat = true; jtkorhonen@0: break; jtkorhonen@0: jtkorhonen@0: default: jtkorhonen@0: break; jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: //Typical sequence goes stat -> heads -> parents -> log jtkorhonen@0: if (runningAction == ACT_STAT) jtkorhonen@0: { jtkorhonen@0: runningAction = ACT_NONE; jtkorhonen@0: hgHeads(); jtkorhonen@0: } jtkorhonen@0: else if (runningAction == ACT_HEADS) jtkorhonen@0: { jtkorhonen@0: runningAction = ACT_NONE; jtkorhonen@0: hgParents(); jtkorhonen@0: } jtkorhonen@0: else if (runningAction == ACT_PARENTS) jtkorhonen@0: { jtkorhonen@0: runningAction = ACT_NONE; jtkorhonen@0: hgLog(); jtkorhonen@0: } jtkorhonen@0: else jtkorhonen@0: { jtkorhonen@0: runningAction = ACT_NONE; jtkorhonen@0: if (shouldHgStat) jtkorhonen@0: { jtkorhonen@0: hgStat(); jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: else jtkorhonen@0: { jtkorhonen@0: enableDisableActions(); jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: void MainWindow::connectActions() jtkorhonen@0: { jtkorhonen@0: connect(exitAct, SIGNAL(triggered()), this, SLOT(close())); jtkorhonen@0: connect(aboutAct, SIGNAL(triggered()), this, SLOT(about())); jtkorhonen@0: connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt())); jtkorhonen@0: jtkorhonen@0: connect(hgStatAct, SIGNAL(triggered()), this, SLOT(hgStat())); jtkorhonen@0: connect(hgExp, SIGNAL(workFolderViewTypesChanged()), this, SLOT(hgStat())); jtkorhonen@0: connect(hgRemoveAct, SIGNAL(triggered()), this, SLOT(hgRemove())); jtkorhonen@0: connect(hgAddAct, SIGNAL(triggered()), this, SLOT(hgAdd())); jtkorhonen@0: connect(hgCommitAct, SIGNAL(triggered()), this, SLOT(hgCommit())); jtkorhonen@0: connect(hgFileDiffAct, SIGNAL(triggered()), this, SLOT(hgFileDiff())); jtkorhonen@0: connect(hgFolderDiffAct, SIGNAL(triggered()), this, SLOT(hgFolderDiff())); jtkorhonen@0: connect(hgChgSetDiffAct, SIGNAL(triggered()), this, SLOT(hgChgSetDiff())); jtkorhonen@0: connect(hgUpdateAct, SIGNAL(triggered()), this, SLOT(hgUpdate())); jtkorhonen@0: connect(hgRevertAct, SIGNAL(triggered()), this, SLOT(hgRevert())); jtkorhonen@0: connect(hgMergeAct, SIGNAL(triggered()), this, SLOT(hgMerge())); jtkorhonen@0: jtkorhonen@0: connect(settingsAct, SIGNAL(triggered()), this, SLOT(settings())); jtkorhonen@0: jtkorhonen@0: connect(hgInitAct, SIGNAL(triggered()), this, SLOT(hgInit())); jtkorhonen@0: connect(hgCloneFromRemoteAct, SIGNAL(triggered()), this, SLOT(hgCloneFromRemote())); jtkorhonen@0: connect(hgIncomingAct, SIGNAL(triggered()), this, SLOT(hgIncoming())); jtkorhonen@0: connect(hgPullAct, SIGNAL(triggered()), this, SLOT(hgPull())); jtkorhonen@0: connect(hgPushAct, SIGNAL(triggered()), this, SLOT(hgPush())); jtkorhonen@0: jtkorhonen@0: connect(hgExp, SIGNAL(currentChanged(int)), this, SLOT(tabChanged(int))); jtkorhonen@0: jtkorhonen@0: connect(hgUpdateToRevAct, SIGNAL(triggered()), this, SLOT(hgUpdateToRev())); jtkorhonen@0: connect(hgAnnotateAct, SIGNAL(triggered()), this, SLOT(hgAnnotate())); jtkorhonen@0: connect(hgResolveListAct, SIGNAL(triggered()), this, SLOT(hgResolveList())); jtkorhonen@0: connect(hgResolveMarkAct, SIGNAL(triggered()), this, SLOT(hgResolveMark())); jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: void MainWindow::tabChanged(int currTab) jtkorhonen@0: { jtkorhonen@0: tabPage = currTab; jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: void MainWindow::enableDisableActions() jtkorhonen@0: { jtkorhonen@0: QDir localRepoDir; jtkorhonen@0: QDir workFolderDir; jtkorhonen@0: bool workFolderExist; jtkorhonen@0: bool localRepoExist; jtkorhonen@0: jtkorhonen@0: remoteRepoActionsEnabled = true; jtkorhonen@0: if (remoteRepoPath.isEmpty()) jtkorhonen@0: { jtkorhonen@0: remoteRepoActionsEnabled = false; jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: localRepoActionsEnabled = true; jtkorhonen@0: if (workFolderPath.isEmpty()) jtkorhonen@0: { jtkorhonen@0: localRepoActionsEnabled = false; jtkorhonen@0: workFolderExist = false; jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: if (!workFolderDir.exists(workFolderPath)) jtkorhonen@0: { jtkorhonen@0: localRepoActionsEnabled = false; jtkorhonen@0: workFolderExist = false; jtkorhonen@0: } jtkorhonen@0: else jtkorhonen@0: { jtkorhonen@0: workFolderExist = true; jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: if (!localRepoDir.exists(workFolderPath + getHgDirName())) jtkorhonen@0: { jtkorhonen@0: localRepoActionsEnabled = false; jtkorhonen@0: localRepoExist = false; jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: hgCloneFromRemoteAct -> setEnabled(remoteRepoActionsEnabled); jtkorhonen@0: hgIncomingAct -> setEnabled(remoteRepoActionsEnabled && remoteRepoActionsEnabled); jtkorhonen@0: hgPullAct -> setEnabled(remoteRepoActionsEnabled && remoteRepoActionsEnabled); jtkorhonen@0: hgPushAct -> setEnabled(remoteRepoActionsEnabled && remoteRepoActionsEnabled); jtkorhonen@0: jtkorhonen@0: if (tabPage != WORKTAB) jtkorhonen@0: { jtkorhonen@0: localRepoActionsEnabled = false; jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: hgInitAct -> setEnabled((localRepoExist == false) && (workFolderExist==true)); jtkorhonen@0: hgStatAct -> setEnabled(localRepoActionsEnabled); jtkorhonen@0: hgFileDiffAct -> setEnabled(localRepoActionsEnabled); jtkorhonen@0: hgFolderDiffAct -> setEnabled(localRepoActionsEnabled); jtkorhonen@0: hgRevertAct -> setEnabled(localRepoActionsEnabled); jtkorhonen@0: hgAddAct -> setEnabled(localRepoActionsEnabled); jtkorhonen@0: hgRemoveAct -> setEnabled(localRepoActionsEnabled); jtkorhonen@0: hgUpdateAct -> setEnabled(localRepoActionsEnabled); jtkorhonen@0: hgCommitAct -> setEnabled(localRepoActionsEnabled); jtkorhonen@0: hgMergeAct -> setEnabled(localRepoActionsEnabled); jtkorhonen@0: jtkorhonen@0: hgExp -> enableDisableOtherTabs(); jtkorhonen@0: jtkorhonen@0: int a, m, r; jtkorhonen@0: countAMRModifications(hgExp -> workFolderFileList, a, m, r); jtkorhonen@0: jtkorhonen@0: if (tabPage == WORKTAB) jtkorhonen@0: { jtkorhonen@0: //Enable / disable actions according to workFolderFileList selections / currentSelection / count jtkorhonen@0: hgChgSetDiffAct -> setEnabled(false); jtkorhonen@0: hgUpdateToRevAct -> setEnabled(false); jtkorhonen@0: jtkorhonen@0: if (localRepoActionsEnabled) jtkorhonen@0: { jtkorhonen@0: if ((a == 0) && (m == 0) && (r == 0)) jtkorhonen@0: { jtkorhonen@0: hgCommitAct -> setEnabled(false); jtkorhonen@0: hgRevertAct -> setEnabled(false); jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: if (m == 0) jtkorhonen@0: { jtkorhonen@0: hgFolderDiffAct -> setEnabled(false); jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: if (!isSelectedModified(hgExp -> workFolderFileList)) jtkorhonen@0: { jtkorhonen@0: hgFileDiffAct -> setEnabled(false); jtkorhonen@0: hgRevertAct -> setEnabled(false); jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: if (!isSelectedUntracked(hgExp -> workFolderFileList)) jtkorhonen@0: { jtkorhonen@0: hgAddAct -> setEnabled(false); jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: if (!isSelectedLocallyDeleted(hgExp -> workFolderFileList)) jtkorhonen@0: { jtkorhonen@0: hgRemoveAct -> setEnabled(false); jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: if (hgExp -> localRepoHeadsList->count() == 1) jtkorhonen@0: { jtkorhonen@0: hgMergeAct -> setEnabled(false); jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: else jtkorhonen@0: { jtkorhonen@0: QList headSelList = hgExp -> localRepoHeadsList->selectedItems(); jtkorhonen@0: QList historySelList = hgExp -> localRepoHgLogList->selectedItems(); jtkorhonen@0: jtkorhonen@0: if ((historySelList.count() == 2) || (headSelList.count() == 2)) jtkorhonen@0: { jtkorhonen@0: hgChgSetDiffAct -> setEnabled(true); jtkorhonen@0: } jtkorhonen@0: else jtkorhonen@0: { jtkorhonen@0: hgChgSetDiffAct -> setEnabled(false); jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: if ((a == 0) && (m == 0) && (r == 0)) jtkorhonen@0: { jtkorhonen@0: if (historySelList.count() == 1) jtkorhonen@0: { jtkorhonen@0: hgUpdateToRevAct -> setEnabled(true); jtkorhonen@0: } jtkorhonen@0: else jtkorhonen@0: { jtkorhonen@0: hgUpdateToRevAct -> setEnabled(false); jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: else jtkorhonen@0: { jtkorhonen@0: hgUpdateToRevAct -> setEnabled(false); jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: void MainWindow::createActions() jtkorhonen@0: { jtkorhonen@0: //File actions jtkorhonen@0: hgInitAct = new QAction(tr("Init local repository"), this); jtkorhonen@0: hgInitAct->setStatusTip(tr("Create an empty local repository in selected folder")); jtkorhonen@0: jtkorhonen@0: hgCloneFromRemoteAct = new QAction(tr("Clone from remote"), this); jtkorhonen@0: hgCloneFromRemoteAct->setStatusTip(tr("Clone from remote repository into local repository in selected folder")); jtkorhonen@0: jtkorhonen@0: settingsAct = new QAction(QIcon(":/images/settings.png"), tr("Settings..."), this); jtkorhonen@0: settingsAct -> setStatusTip(tr("View and change application settings")); jtkorhonen@0: settingsAct -> setIconVisibleInMenu(true); jtkorhonen@0: jtkorhonen@0: exitAct = new QAction(QIcon(":/images/exit.png"), tr("Exit"), this); jtkorhonen@0: exitAct->setShortcuts(QKeySequence::Quit); jtkorhonen@0: exitAct->setStatusTip(tr("Exit application")); jtkorhonen@0: exitAct -> setIconVisibleInMenu(true); jtkorhonen@0: jtkorhonen@0: //Repository actions jtkorhonen@0: hgIncomingAct = new QAction(QIcon(":/images/incoming.png"), tr("View incoming changesets"), this); jtkorhonen@0: hgIncomingAct -> setStatusTip(tr("View info of changesets incoming to us from remote repository (on pull operation)")); jtkorhonen@0: jtkorhonen@0: hgPullAct = new QAction(QIcon(":/images/pull.png"), tr("Pull from remote"), this); jtkorhonen@0: hgPullAct -> setStatusTip(tr("Pull changesets from remote repository to local repository")); jtkorhonen@0: jtkorhonen@0: hgPushAct = new QAction(QIcon(":/images/push.png"), tr("Push to remote"), this); jtkorhonen@0: hgPushAct->setStatusTip(tr("Push local changesets to remote repository")); jtkorhonen@0: jtkorhonen@0: //Workfolder actions jtkorhonen@0: hgStatAct = new QAction(QIcon(":/images/status.png"), tr("Refresh status"), this); jtkorhonen@0: hgStatAct->setStatusTip(tr("Refresh (info of) status of workfolder files (A=Added, M=Mofified, R=Removed, C=Clean, !=Locally deleted, ?=Not tracked, I=Ignored)")); jtkorhonen@0: jtkorhonen@0: hgFileDiffAct = new QAction(QIcon(":/images/diff.png"), tr("View filediff"), this); jtkorhonen@0: hgFileDiffAct->setStatusTip(tr("Filediff: View differences between selected working folder file and local repository file")); jtkorhonen@0: jtkorhonen@0: hgFolderDiffAct = new QAction(QIcon(":/images/folderdiff.png"), tr("View folderdiff"), this); jtkorhonen@0: hgFolderDiffAct->setStatusTip(tr("Folderdiff: View all differences between working folder files and local repository files")); jtkorhonen@0: jtkorhonen@0: hgChgSetDiffAct = new QAction(QIcon(":/images/chgsetdiff.png"), tr("View changesetdiff"), this); jtkorhonen@0: hgChgSetDiffAct->setStatusTip(tr("Change set diff: View differences between all files of 2 repository changesets")); jtkorhonen@0: jtkorhonen@0: hgRevertAct = new QAction(QIcon(":/images/undo.png"), tr("Undo changes"), this); jtkorhonen@0: hgRevertAct->setStatusTip(tr("Undo selected working folder file changes (return to local repository version)")); jtkorhonen@0: jtkorhonen@0: hgAddAct = new QAction(QIcon(":/images/add.png"), tr("Add files"), this); jtkorhonen@0: hgAddAct -> setStatusTip(tr("Add working folder files to local repository (on next commit)")); jtkorhonen@0: jtkorhonen@0: hgRemoveAct = new QAction(QIcon(":/images/remove.png"), tr("Remove file"), this); jtkorhonen@0: hgRemoveAct -> setStatusTip(tr("Remove selected working folder file from local repository (on next commit)")); jtkorhonen@0: jtkorhonen@0: hgUpdateAct = new QAction(QIcon(":/images/update.png"), tr("Update working folder"), this); jtkorhonen@0: hgUpdateAct->setStatusTip(tr("Update working folder from local repository")); jtkorhonen@0: jtkorhonen@0: hgCommitAct = new QAction(QIcon(":/images/commit.png"), tr("Commit / Save changes"), this); jtkorhonen@0: hgCommitAct->setStatusTip(tr("Save all changes in working folder (and all subfolders) to local repository")); jtkorhonen@0: jtkorhonen@0: hgMergeAct = new QAction(QIcon(":/images/merge.png"), tr("Merge"), this); jtkorhonen@0: hgMergeAct->setStatusTip(tr("Merge two local repository changesets to working folder")); jtkorhonen@0: jtkorhonen@0: //Advanced actions jtkorhonen@0: hgUpdateToRevAct = new QAction(tr("Update to revision"), this); jtkorhonen@0: hgUpdateToRevAct -> setStatusTip(tr("Update working folder to version selected from history list")); jtkorhonen@0: jtkorhonen@0: hgAnnotateAct = new QAction(tr("Annotate"), this); jtkorhonen@0: hgAnnotateAct -> setStatusTip(tr("Show line-by-line version information for selected file")); jtkorhonen@0: jtkorhonen@0: hgResolveListAct = new QAction(tr("Resolve (list)"), this); jtkorhonen@0: hgResolveListAct -> setStatusTip(tr("Resolve (list): Show list of files needing merge")); jtkorhonen@0: jtkorhonen@0: hgResolveMarkAct = new QAction(tr("Resolve (mark)"), this); jtkorhonen@0: hgResolveMarkAct -> setStatusTip(tr("Resolve (mark): Mark selected file status as resolved")); jtkorhonen@0: jtkorhonen@0: //Help actions jtkorhonen@0: aboutAct = new QAction(tr("About"), this); jtkorhonen@0: aboutAct->setStatusTip(tr("Show the application's About box")); jtkorhonen@0: jtkorhonen@0: aboutQtAct = new QAction(tr("About Qt"), this); jtkorhonen@0: aboutQtAct->setStatusTip(tr("Show the Qt library's About box")); jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: void MainWindow::createMenus() jtkorhonen@0: { jtkorhonen@0: fileMenu = menuBar()->addMenu(tr("File")); jtkorhonen@0: fileMenu -> addAction(hgInitAct); jtkorhonen@0: fileMenu -> addAction(hgCloneFromRemoteAct); jtkorhonen@0: fileMenu -> addSeparator(); jtkorhonen@0: fileMenu -> addAction(settingsAct); jtkorhonen@0: fileMenu -> addSeparator(); jtkorhonen@0: fileMenu -> addAction(exitAct); jtkorhonen@0: jtkorhonen@0: advancedMenu = menuBar()->addMenu(tr("Advanced")); jtkorhonen@0: advancedMenu -> addAction(hgUpdateToRevAct); jtkorhonen@0: advancedMenu -> addSeparator(); jtkorhonen@0: advancedMenu -> addAction(hgAnnotateAct); jtkorhonen@0: advancedMenu -> addSeparator(); jtkorhonen@0: advancedMenu -> addAction(hgResolveListAct); jtkorhonen@0: advancedMenu -> addAction(hgResolveMarkAct); jtkorhonen@0: jtkorhonen@0: helpMenu = menuBar()->addMenu(tr("Help")); jtkorhonen@0: helpMenu->addAction(aboutAct); jtkorhonen@0: helpMenu->addAction(aboutQtAct); jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: void MainWindow::createToolBars() jtkorhonen@0: { jtkorhonen@0: fileToolBar = addToolBar(tr("File")); jtkorhonen@0: fileToolBar -> setIconSize(QSize(MY_ICON_SIZE, MY_ICON_SIZE)); jtkorhonen@0: fileToolBar -> addAction(settingsAct); jtkorhonen@0: fileToolBar -> addAction(exitAct); jtkorhonen@0: fileToolBar -> addSeparator(); jtkorhonen@0: fileToolBar -> addAction(hgChgSetDiffAct); jtkorhonen@0: fileToolBar -> setMovable(false); jtkorhonen@0: jtkorhonen@0: repoToolBar = addToolBar(tr(REPOMENU_TITLE)); jtkorhonen@0: repoToolBar -> setIconSize(QSize(MY_ICON_SIZE, MY_ICON_SIZE)); jtkorhonen@0: repoToolBar->addAction(hgIncomingAct); jtkorhonen@0: repoToolBar->addAction(hgPullAct); jtkorhonen@0: repoToolBar->addAction(hgPushAct); jtkorhonen@0: repoToolBar -> setMovable(false); jtkorhonen@0: jtkorhonen@0: workFolderToolBar = addToolBar(tr(WORKFOLDERMENU_TITLE)); jtkorhonen@0: addToolBar(Qt::LeftToolBarArea, workFolderToolBar); jtkorhonen@0: workFolderToolBar -> setIconSize(QSize(MY_ICON_SIZE, MY_ICON_SIZE)); jtkorhonen@0: workFolderToolBar->addAction(hgStatAct); jtkorhonen@0: workFolderToolBar->addSeparator(); jtkorhonen@0: workFolderToolBar->addAction(hgFileDiffAct); jtkorhonen@0: workFolderToolBar->addAction(hgFolderDiffAct); jtkorhonen@0: workFolderToolBar->addSeparator(); jtkorhonen@0: workFolderToolBar->addAction(hgRevertAct); jtkorhonen@0: workFolderToolBar->addAction(hgUpdateAct); jtkorhonen@0: workFolderToolBar->addAction(hgCommitAct); jtkorhonen@0: workFolderToolBar->addAction(hgMergeAct); jtkorhonen@0: workFolderToolBar->addSeparator(); jtkorhonen@0: workFolderToolBar->addAction(hgAddAct); jtkorhonen@0: workFolderToolBar->addAction(hgRemoveAct); jtkorhonen@0: workFolderToolBar -> setMovable(false); jtkorhonen@0: jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: void MainWindow::createStatusBar() jtkorhonen@0: { jtkorhonen@0: statusBar()->showMessage(tr("Ready")); jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: void MainWindow::readSettings() jtkorhonen@0: { jtkorhonen@0: QDir workFolder; jtkorhonen@0: jtkorhonen@0: QSettings settings("hgexplorer", "hgexplorer"); jtkorhonen@0: jtkorhonen@0: remoteRepoPath = settings.value("remoterepopath", "").toString() ; jtkorhonen@0: workFolderPath = settings.value("workfolderpath", "").toString(); jtkorhonen@0: if (!workFolder.exists(workFolderPath)) jtkorhonen@0: { jtkorhonen@0: workFolderPath = ""; jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: userInfo = settings.value("userinfo", "").toString(); jtkorhonen@0: jtkorhonen@0: QPoint pos = settings.value("pos", QPoint(200, 200)).toPoint(); jtkorhonen@0: QSize size = settings.value("size", QSize(400, 400)).toSize(); jtkorhonen@0: firstStart = settings.value("firststart", QVariant(true)).toBool(); jtkorhonen@0: jtkorhonen@0: initialFileTypesBits = (unsigned char) settings.value("viewFileTypes", QVariant(DEFAULT_HG_STAT_BITS)).toInt(); jtkorhonen@0: resize(size); jtkorhonen@0: move(pos); jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: void MainWindow::writeSettings() jtkorhonen@0: { jtkorhonen@0: QSettings settings("hgexplorer", "hgexplorer"); jtkorhonen@0: settings.setValue("pos", pos()); jtkorhonen@0: settings.setValue("size", size()); jtkorhonen@0: settings.setValue("remoterepopath", remoteRepoPath); jtkorhonen@0: settings.setValue("workfolderpath", workFolderPath); jtkorhonen@0: settings.setValue("userinfo", userInfo); jtkorhonen@0: settings.setValue("firststart", firstStart); jtkorhonen@0: settings.setValue("viewFileTypes", hgExp -> getFileTypesBits()); jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: jtkorhonen@0: