jtkorhonen@0: /**************************************************************************** jtkorhonen@30: ** Copyright (C) Jari Korhonen, 2010 (under lgpl) jtkorhonen@30: ****************************************************************************/ jtkorhonen@0: jtkorhonen@0: #include jtkorhonen@0: #include jtkorhonen@0: #include jtkorhonen@24: #include jtkorhonen@17: #include jtkorhonen@17: #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@29: "-Needs Qt4, mingw (in windows), python, kdiff3 (Thanks to all of you !)
" jtkorhonen@29: "-Windows standalone install uses hg / python / kdiff3 from TortoiseHg (BIG Thanks !)
" jtkorhonen@29: "-Windows standalone install uses InstallJammer setup tool (Thanks, great tool !)
")); 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@6: if (QMessageBox::Ok == QMessageBox::warning(this, "Remove file", "Really remove file " + currentFile.mid(2) + "?", jtkorhonen@6: QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Cancel)) jtkorhonen@6: { jtkorhonen@6: params << "remove" << "--after" << "--force" << currentFile.mid(2); //Jump over status marker characters (e.g "M ") jtkorhonen@0: jtkorhonen@6: runner -> startProc(getHgBinaryName(), workFolderPath, params); jtkorhonen@6: runningAction = ACT_REMOVE; jtkorhonen@6: } 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@5: QString currentFile = hgExp -> getCurrentFileListLine(); jtkorhonen@5: jtkorhonen@17: if (areAllSelectedUntracked(hgExp -> workFolderFileList)) jtkorhonen@5: { jtkorhonen@17: //User wants to add selected file(s) jtkorhonen@17: params << "add"; jtkorhonen@17: jtkorhonen@17: QList selList = hgExp -> workFolderFileList -> selectedItems(); jtkorhonen@17: jtkorhonen@17: for (int i = 0; i < selList.size(); ++i) jtkorhonen@17: { jtkorhonen@17: QString tmp = selList.at(i)->text(); jtkorhonen@17: params.append(tmp.mid(2)); jtkorhonen@17: } jtkorhonen@5: } jtkorhonen@5: else jtkorhonen@5: { jtkorhonen@5: //Add all untracked files jtkorhonen@5: params << "add"; jtkorhonen@5: } 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@11: QString currentFile = hgExp -> getCurrentFileListLine(); jtkorhonen@11: jtkorhonen@17: if (areAllSelectedCommitable(hgExp -> workFolderFileList)) jtkorhonen@11: { jtkorhonen@17: //User wants to commit selected file(s) jtkorhonen@17: params << "commit" << "--message" << comment << "--user" << userInfo; jtkorhonen@17: jtkorhonen@17: QList selList = hgExp -> workFolderFileList -> selectedItems(); jtkorhonen@17: for (int i = 0; i < selList.size(); ++i) jtkorhonen@17: { jtkorhonen@17: QString tmp = selList.at(i)->text(); jtkorhonen@17: params.append(tmp.mid(2)); jtkorhonen@17: } jtkorhonen@11: } jtkorhonen@11: else jtkorhonen@11: { jtkorhonen@11: //Commit all changes jtkorhonen@11: params << "commit" << "--message" << comment << "--user" << userInfo; jtkorhonen@11: } 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@5: params << "revert" << "--no-backup" << 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@26: jtkorhonen@28: QString MainWindow::listAllUpIpV4Addresses() jtkorhonen@26: { jtkorhonen@28: QString ret; jtkorhonen@26: QList ifaces = QNetworkInterface::allInterfaces(); jtkorhonen@26: jtkorhonen@26: for (int i = 0; i < ifaces.count(); i++) jtkorhonen@26: { jtkorhonen@26: QNetworkInterface iface = ifaces.at(i); jtkorhonen@26: jtkorhonen@26: if (iface.flags().testFlag(QNetworkInterface::IsUp) && !iface.flags().testFlag(QNetworkInterface::IsLoopBack)) jtkorhonen@26: { jtkorhonen@26: for (int j=0; j startProc(getHgBinaryName(), workFolderPath, params, false); jtkorhonen@11: runningAction = ACT_SERVE; jtkorhonen@11: jtkorhonen@17: QMessageBox::information(this, "Serve", msg, QMessageBox::Close); jtkorhonen@11: runner -> killProc(); jtkorhonen@11: } jtkorhonen@11: } jtkorhonen@11: jtkorhonen@11: jtkorhonen@11: 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@2: #define STDOUT_NEEDS_BIG_WINDOW 512 jtkorhonen@2: #define SMALL_WND_W 500 jtkorhonen@2: #define SMALL_WND_H 300 jtkorhonen@2: jtkorhonen@2: #define BIG_WND_W 1024 jtkorhonen@2: #define BIG_WND_H 768 jtkorhonen@2: jtkorhonen@2: jtkorhonen@2: void MainWindow::presentLongStdoutToUser(QString stdo) jtkorhonen@0: { jtkorhonen@2: if (!stdo.isEmpty()) jtkorhonen@2: { jtkorhonen@2: QDialog dlg; jtkorhonen@0: jtkorhonen@2: if (stdo.length() > STDOUT_NEEDS_BIG_WINDOW) jtkorhonen@2: { jtkorhonen@2: dlg.setMinimumWidth(BIG_WND_W); jtkorhonen@2: dlg.setMinimumHeight(BIG_WND_H); jtkorhonen@2: } jtkorhonen@2: else jtkorhonen@2: { jtkorhonen@2: dlg.setMinimumWidth(SMALL_WND_W); jtkorhonen@2: dlg.setMinimumHeight(SMALL_WND_H); jtkorhonen@2: } jtkorhonen@0: jtkorhonen@2: QVBoxLayout *box = new QVBoxLayout; jtkorhonen@2: QListWidget *list = new QListWidget; jtkorhonen@2: list-> addItems(stdo.split("\n")); jtkorhonen@2: QPushButton *btn = new QPushButton(tr("Ok")); jtkorhonen@2: connect(btn, SIGNAL(clicked()), &dlg, SLOT(accept())); jtkorhonen@0: jtkorhonen@2: box -> addWidget(list); jtkorhonen@2: box -> addWidget(btn); jtkorhonen@2: dlg.setLayout(box); jtkorhonen@2: jtkorhonen@2: dlg.exec(); jtkorhonen@2: } jtkorhonen@2: else jtkorhonen@2: { jtkorhonen@2: QMessageBox::information(this, tr("HgExplorer"), tr("Mercurial command did not return any output.")); jtkorhonen@2: } jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: jtkorhonen@17: bool MainWindow::areAllSelectedCommitable(QListWidget *workList) jtkorhonen@11: { jtkorhonen@11: QList selList = workList -> selectedItems(); jtkorhonen@17: for (int i = 0; i < selList.size(); ++i) jtkorhonen@11: { jtkorhonen@17: QString tmp = selList.at(i) -> text().mid(0, 1); jtkorhonen@11: if (tmp == "A") jtkorhonen@11: { jtkorhonen@11: //scheduled to be added, ok to commit jtkorhonen@11: } jtkorhonen@11: else if (tmp == "M") jtkorhonen@11: { jtkorhonen@11: //locally modified, ok to commit jtkorhonen@17: } jtkorhonen@17: else if (tmp == "R") jtkorhonen@17: { jtkorhonen@17: //user wants to remove from repo, ok to commit jtkorhonen@17: } jtkorhonen@17: else jtkorhonen@17: { jtkorhonen@17: return false; jtkorhonen@11: } jtkorhonen@11: } jtkorhonen@17: return true; jtkorhonen@11: } jtkorhonen@11: jtkorhonen@6: bool MainWindow::isSelectedDeletable(QListWidget *workList) jtkorhonen@0: { jtkorhonen@0: QList selList = workList -> selectedItems(); jtkorhonen@0: if (selList.count() == 1) jtkorhonen@0: { jtkorhonen@6: QString tmp = selList.at(0)->text().mid(0, 1); jtkorhonen@6: if (tmp == "A") jtkorhonen@0: { jtkorhonen@6: //scheduled to be added, ok to remove (won't go to repo) jtkorhonen@6: return true; jtkorhonen@6: } jtkorhonen@6: else if (tmp == "C") jtkorhonen@6: { jtkorhonen@6: //Tracked but unchanged, ok to remove jtkorhonen@6: return true; jtkorhonen@6: } jtkorhonen@6: else if (tmp == "M") jtkorhonen@6: { jtkorhonen@6: //locally modified, ok to remove from repo jtkorhonen@6: return true; jtkorhonen@6: } jtkorhonen@6: else if (tmp == "!") jtkorhonen@6: { jtkorhonen@6: //locally deleted, ok to remove from repo jtkorhonen@0: return true; jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@0: return false; jtkorhonen@0: } jtkorhonen@0: jtkorhonen@0: jtkorhonen@17: bool MainWindow::areAllSelectedUntracked(QListWidget *workList) jtkorhonen@0: { jtkorhonen@0: QList selList = workList -> selectedItems(); jtkorhonen@17: for (int i = 0; i < selList.size(); ++i) jtkorhonen@0: { jtkorhonen@17: QString tmp = selList.at(i) -> text(); jtkorhonen@17: jtkorhonen@17: if (tmp.mid(0,1) != "?") jtkorhonen@0: { jtkorhonen@17: return false; jtkorhonen@0: } jtkorhonen@0: } jtkorhonen@17: return true; 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@17: void MainWindow::countModifications(QListWidget *workList, int& added, int& modified, int& removed, int& notTracked, jtkorhonen@17: int& selected, jtkorhonen@17: int& selectedAdded, int& selectedModified, int& selectedRemoved, int& selectedNotTracked) 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@5: int N=0; jtkorhonen@17: int S=0; jtkorhonen@17: int SA=0; jtkorhonen@17: int SM=0; jtkorhonen@17: int SR=0; jtkorhonen@17: int SN=0; jtkorhonen@17: 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@5: else if (tmp == "?") jtkorhonen@5: { jtkorhonen@5: N++; jtkorhonen@5: } jtkorhonen@0: } jtkorhonen@0: jtkorhonen@17: added = A; jtkorhonen@17: modified = M; jtkorhonen@17: removed = R; jtkorhonen@17: notTracked = N; jtkorhonen@17: jtkorhonen@17: QList selList = workList -> selectedItems(); jtkorhonen@17: jtkorhonen@17: S = selList.size(); jtkorhonen@17: for (int i = 0; i < selList.size(); ++i) jtkorhonen@17: { jtkorhonen@17: QString tmp = selList.at(i) -> text(); jtkorhonen@17: jtkorhonen@17: if (tmp.mid(0,1) == "A") jtkorhonen@17: { jtkorhonen@17: SA++; jtkorhonen@17: } jtkorhonen@17: else if (tmp.mid(0,1) == "M") jtkorhonen@17: { jtkorhonen@17: SM++; jtkorhonen@17: } jtkorhonen@17: else if (tmp.mid(0,1) == "R") jtkorhonen@17: { jtkorhonen@17: SR++; jtkorhonen@17: } jtkorhonen@17: else if (tmp.mid(0,1) == "?") jtkorhonen@17: { jtkorhonen@17: SN++; jtkorhonen@17: } jtkorhonen@17: } jtkorhonen@17: jtkorhonen@17: selected = S; jtkorhonen@17: selectedAdded = SA; jtkorhonen@17: selectedModified = SM; jtkorhonen@17: selectedRemoved = SR; jtkorhonen@17: selectedNotTracked = SN; jtkorhonen@0: } jtkorhonen@0: else jtkorhonen@0: { jtkorhonen@17: added = 0; jtkorhonen@17: modified = 0; jtkorhonen@17: removed = 0; jtkorhonen@17: notTracked = 0; jtkorhonen@17: selected = 0; jtkorhonen@17: selectedAdded = 0; jtkorhonen@17: selectedModified = 0; jtkorhonen@17: selectedRemoved = 0; jtkorhonen@17: selectedNotTracked = 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@2: presentLongStdoutToUser(runner -> getStdOut()); 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@11: case ACT_SERVE: 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@11: connect(hgServeAct, SIGNAL(triggered()), this, SLOT(hgServe())); 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@2: hgResolveListAct -> setEnabled(localRepoActionsEnabled); jtkorhonen@2: hgResolveMarkAct -> setEnabled(localRepoActionsEnabled); jtkorhonen@2: hgAnnotateAct -> setEnabled(localRepoActionsEnabled); jtkorhonen@11: hgServeAct -> setEnabled(localRepoActionsEnabled); jtkorhonen@0: jtkorhonen@0: hgExp -> enableDisableOtherTabs(); jtkorhonen@0: jtkorhonen@17: int added, modified, removed, notTracked, selected, selectedAdded, selectedModified, selectedRemoved, selectedNotTracked; jtkorhonen@17: jtkorhonen@17: countModifications(hgExp -> workFolderFileList, jtkorhonen@17: added, modified, removed, notTracked, jtkorhonen@17: selected, jtkorhonen@17: selectedAdded, selectedModified, selectedRemoved, selectedNotTracked); 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@17: if ((added == 0) && (modified == 0) && (removed == 0)) jtkorhonen@0: { jtkorhonen@0: hgCommitAct -> setEnabled(false); jtkorhonen@0: hgRevertAct -> setEnabled(false); jtkorhonen@0: } jtkorhonen@17: else if (selected != 0) jtkorhonen@17: { jtkorhonen@17: if (selectedNotTracked != 0) jtkorhonen@17: { jtkorhonen@17: hgCommitAct -> setEnabled(false); jtkorhonen@17: } jtkorhonen@17: else if ((selectedAdded == 0) && (selectedModified == 0) && (selectedRemoved == 0)) jtkorhonen@17: { jtkorhonen@17: hgCommitAct -> setEnabled(false); jtkorhonen@17: } jtkorhonen@17: } jtkorhonen@0: jtkorhonen@17: if (modified == 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@5: //JK 14.5.2010: Fixed confusing add button. Now this is simple: If we have something to add (any non-tracked files), add is enabled. jtkorhonen@17: if (notTracked == 0) jtkorhonen@0: { jtkorhonen@0: hgAddAct -> setEnabled(false); jtkorhonen@0: } jtkorhonen@0: jtkorhonen@6: if (!isSelectedDeletable(hgExp -> workFolderFileList)) jtkorhonen@0: { jtkorhonen@0: hgRemoveAct -> setEnabled(false); jtkorhonen@0: } jtkorhonen@0: jtkorhonen@2: hgResolveListAct -> setEnabled(true); jtkorhonen@2: jtkorhonen@5: if (hgExp -> localRepoHeadsList->count() < 2) jtkorhonen@0: { jtkorhonen@0: hgMergeAct -> setEnabled(false); jtkorhonen@0: } jtkorhonen@0: jtkorhonen@2: QString currentFile = hgExp -> getCurrentFileListLine(); jtkorhonen@2: if (!currentFile.isEmpty()) jtkorhonen@2: { jtkorhonen@2: hgAnnotateAct -> setEnabled(true); jtkorhonen@2: hgResolveMarkAct -> setEnabled(true); jtkorhonen@2: } jtkorhonen@2: else jtkorhonen@2: { jtkorhonen@2: hgAnnotateAct -> setEnabled(false); jtkorhonen@2: hgResolveMarkAct -> setEnabled(false); jtkorhonen@2: } 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@30: if (historySelList.count() == 1) jtkorhonen@0: { jtkorhonen@30: hgUpdateToRevAct -> setEnabled(true); 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@20: hgStatAct->setStatusTip(tr("Refresh (info of) status of workfolder files")); 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@17: hgAddAct -> setStatusTip(tr("Add working folder file(s) (selected or all yet untracked) 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@11: hgCommitAct = new QAction(QIcon(":/images/commit.png"), tr("Commit / Save change(s)"), this); jtkorhonen@20: hgCommitAct->setStatusTip(tr("Save selected file(s) or all changed files 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@11: hgServeAct = new QAction(tr("Serve (via http)"), this); jtkorhonen@11: hgServeAct -> setStatusTip(tr("Serve local repository via http for workgroup access")); jtkorhonen@11: 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@11: advancedMenu -> addSeparator(); jtkorhonen@11: advancedMenu -> addAction(hgServeAct); 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@30: 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@30: for(int i = 0; i < NUM_PATHS_IN_MRU_LIST; i++) jtkorhonen@30: { jtkorhonen@30: QString tmp; jtkorhonen@30: jtkorhonen@30: tmp.sprintf("remoterepomrupath%d", i); jtkorhonen@30: remoteRepoMruList[i] = settings.value(tmp, "").toString(); jtkorhonen@30: jtkorhonen@30: tmp.sprintf("workfoldermru%d", i); jtkorhonen@30: workFolderMruList[i] = settings.value(tmp, "").toString(); jtkorhonen@30: } jtkorhonen@30: 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@17: 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@30: jtkorhonen@30: for(int i = 0; i < NUM_PATHS_IN_MRU_LIST; i++) jtkorhonen@30: { jtkorhonen@30: QString tmp; jtkorhonen@30: jtkorhonen@30: tmp.sprintf("remoterepomrupath%d", i); jtkorhonen@30: settings.setValue(tmp, remoteRepoMruList[i]); jtkorhonen@30: jtkorhonen@30: tmp.sprintf("workfoldermru%d", i); jtkorhonen@30: settings.setValue(tmp, workFolderMruList[i]); jtkorhonen@30: } jtkorhonen@30: 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: