# HG changeset patch # User Chris Cannam # Date 1350643648 -3600 # Node ID 91b7ad45c6080bfdb8fb8dea5f70c15506503e6a # Parent 31f5168fb5d968c5ae038599c52fc706e6a752f6# Parent 66adbedb69a959d8e0cc0c94a7773efa3729709f Merge diff -r 66adbedb69a9 -r 91b7ad45c608 easyhg.pro --- a/easyhg.pro Fri Oct 19 11:25:02 2012 +0100 +++ b/easyhg.pro Fri Oct 19 11:47:28 2012 +0100 @@ -145,7 +145,7 @@ } win* { - LIBS += -lSecur32 + LIBS += -lSecur32 -lAdvapi32 } RESOURCES = easyhg.qrc diff -r 66adbedb69a9 -r 91b7ad45c608 src/filestates.cpp --- a/src/filestates.cpp Fri Oct 19 11:25:02 2012 +0100 +++ b/src/filestates.cpp Fri Oct 19 11:47:28 2012 +0100 @@ -161,11 +161,11 @@ switch (s) { case Modified: - a << Annotate << Diff << Commit << Revert << Rename << Copy << Remove; + a << Annotate << Diff << Commit << Revert << Rename << Copy << Remove << ShowIn; break; case Added: - a << Commit << Revert << Rename << Copy << Remove; + a << Commit << Revert << Rename << Copy << Remove << ShowIn; break; case Removed: @@ -173,7 +173,7 @@ break; case InConflict: - a << Annotate << Diff << RedoMerge << MarkResolved << Revert; + a << Annotate << Diff << RedoMerge << MarkResolved << Revert << ShowIn; break; case Missing: @@ -181,15 +181,15 @@ break; case Unknown: - a << Add << Ignore; + a << Add << Ignore << ShowIn; break; case Clean: - a << Annotate << Rename << Copy << Remove; + a << Annotate << Rename << Copy << Remove << ShowIn; break; case Ignored: - a << UnIgnore; + a << UnIgnore << ShowIn; break; } @@ -210,6 +210,7 @@ case Add: case Remove: return 3; case RedoMerge: case MarkResolved: return 4; case Ignore: case UnIgnore: return 5; + case ShowIn: return 6; } return 0; } diff -r 66adbedb69a9 -r 91b7ad45c608 src/filestates.h --- a/src/filestates.h Fri Oct 19 11:25:02 2012 +0100 +++ b/src/filestates.h Fri Oct 19 11:47:28 2012 +0100 @@ -77,6 +77,8 @@ Ignore, UnIgnore, + ShowIn, + FirstActivity = Diff, LastActivity = UnIgnore }; diff -r 66adbedb69a9 -r 91b7ad45c608 src/filestatuswidget.cpp --- a/src/filestatuswidget.cpp Fri Oct 19 11:25:02 2012 +0100 +++ b/src/filestatuswidget.cpp Fri Oct 19 11:47:28 2012 +0100 @@ -72,6 +72,18 @@ // Unignore is too difficult in fact, so we just offer to edit the hgignore m_actionLabels[FileStates::UnIgnore] = tr("Edit .hgignore File"); + // No "show in" under Unix at the moment. +#if defined Q_OS_MAC + m_actionLabels[FileStates::ShowIn] = tr("Show in Finder"); +#elif defined Q_OS_WIN32 + m_actionLabels[FileStates::ShowIn] = tr("Show in Windows Explorer"); +#endif + + m_shortcuts[FileStates::ShowIn] = tr("Ctrl+Shift+S"); + m_shortcuts[FileStates::Diff] = tr("Ctrl+Shift+D"); + m_shortcuts[FileStates::Commit] = tr("Ctrl+Shift+C"); + m_shortcuts[FileStates::Revert] = tr("Ctrl+Shift+R"); + m_descriptions[FileStates::Clean] = tr("You have not changed these files."); m_descriptions[FileStates::Modified] = tr("You have changed these files since you last committed them."); m_descriptions[FileStates::Added] = tr("These files will be added to version control next time you commit them."); @@ -127,6 +139,11 @@ FileStates::Activities activities = m_fileStates.activitiesSupportedBy(s); int prevGroup = -1; foreach (FileStates::Activity a, activities) { + QString label = m_actionLabels[a]; + if (label.length() == 0) { + // Skip empty labels. + continue; + } int group = FileStates::activityGroup(a); if (group != prevGroup && prevGroup != -1) { QAction *sep = new QAction("", w); @@ -134,9 +151,14 @@ w->insertAction(0, sep); } prevGroup = group; - QAction *act = new QAction(m_actionLabels[a], w); + QAction *act = new QAction(label, w); act->setProperty("state", s); act->setProperty("activity", a); + if (m_shortcuts.contains(a)) { + QString shortcut = m_shortcuts[a]; + act->setShortcut(shortcut); + act->setShortcutContext(Qt::WidgetShortcut); + } connect(act, SIGNAL(triggered()), this, SLOT(menuActionActivated())); w->insertAction(0, act); } @@ -282,6 +304,7 @@ case FileStates::MarkResolved: emit markFilesResolved(files); break; case FileStates::Ignore: emit ignoreFiles(files); break; case FileStates::UnIgnore: emit unIgnoreFiles(files); break; + case FileStates::ShowIn: emit showIn(files); break; } } diff -r 66adbedb69a9 -r 91b7ad45c608 src/filestatuswidget.h --- a/src/filestatuswidget.h Fri Oct 19 11:25:02 2012 +0100 +++ b/src/filestatuswidget.h Fri Oct 19 11:47:28 2012 +0100 @@ -74,6 +74,7 @@ void markFilesResolved(QStringList); void ignoreFiles(QStringList); void unIgnoreFiles(QStringList); + void showIn(QStringList); public slots: void clearSelections(); @@ -99,6 +100,7 @@ QMap m_descriptions; QMap m_stateListMap; QMap m_actionLabels; + QMap m_shortcuts; QString m_highlightExplanation; QFileInfo *m_dateReference; diff -r 66adbedb69a9 -r 91b7ad45c608 src/findwidget.cpp --- a/src/findwidget.cpp Fri Oct 19 11:25:02 2012 +0100 +++ b/src/findwidget.cpp Fri Oct 19 11:47:28 2012 +0100 @@ -33,6 +33,7 @@ layout->addWidget(button, 0, 0); button->setText(tr("Find...")); button->setToolButtonStyle(Qt::ToolButtonTextOnly); + button->setShortcut(tr("Ctrl+F")); connect(button, SIGNAL(clicked()), this, SLOT(buttonPressed())); m_lineEdit = new QLineEdit(); @@ -59,15 +60,15 @@ QAbstractButton *button = qobject_cast(sender()); if (!button) return; if (m_lineEdit->isVisible()) { - m_lineEdit->hide(); - button->setText(tr("Find...")); + m_lineEdit->hide(); + button->setText(tr("Find...")); if (m_lineEdit->text() != "") { emit findTextChanged(""); } } else { - m_lineEdit->show(); + m_lineEdit->show(); m_lineEdit->setFocus(Qt::OtherFocusReason); - button->setText(tr("Find:")); + button->setText(tr("Find:")); if (m_lineEdit->text() != "") { emit findTextChanged(m_lineEdit->text()); } diff -r 66adbedb69a9 -r 91b7ad45c608 src/hgtabwidget.cpp --- a/src/hgtabwidget.cpp Fri Oct 19 11:25:02 2012 +0100 +++ b/src/hgtabwidget.cpp Fri Oct 19 11:47:28 2012 +0100 @@ -23,6 +23,7 @@ #include #include #include +#include #include @@ -77,6 +78,9 @@ connect(m_fileStatusWidget, SIGNAL(unIgnoreFiles(QStringList)), this, SIGNAL(unIgnoreFiles(QStringList))); + connect(m_fileStatusWidget, SIGNAL(showIn(QStringList)), + this, SIGNAL(showIn(QStringList))); + addTab(m_fileStatusWidget, tr("My work")); // History graph tab @@ -278,7 +282,11 @@ { m_historyWidget->parseIncrementalLog(hgLogList); if (m_historyWidget->haveNewItems()) { - showHistoryTab(); + QSettings settings; + settings.beginGroup("Presentation"); + if (settings.value("showHistoryAutomatically", true).toBool()) { + showHistoryTab(); + } } } diff -r 66adbedb69a9 -r 91b7ad45c608 src/hgtabwidget.h --- a/src/hgtabwidget.h Fri Oct 19 11:25:02 2012 +0100 +++ b/src/hgtabwidget.h Fri Oct 19 11:47:28 2012 +0100 @@ -108,6 +108,7 @@ void markFilesResolved(QStringList); void ignoreFiles(QStringList); void unIgnoreFiles(QStringList); + void showIn(QStringList); public slots: void clearSelections(); diff -r 66adbedb69a9 -r 91b7ad45c608 src/mainwindow.cpp --- a/src/mainwindow.cpp Fri Oct 19 11:25:02 2012 +0100 +++ b/src/mainwindow.cpp Fri Oct 19 11:47:28 2012 +0100 @@ -857,6 +857,33 @@ hgEditIgnore(); } +void MainWindow::hgShowIn(QStringList files) +{ + foreach (QString file, files) + { + QStringList args; +#if defined Q_OS_WIN32 + // Although the Win32 API is quite happy to have + // forward slashes as directory separators, Windows + // Explorer is not + int last = m_workFolderPath.length() - 1; + char c = m_workFolderPath[last].toAscii(); + if (c == '\\' || c == '/') { + m_workFolderPath.chop(1); + } + file = m_workFolderPath + "\\" + file; + file = file.replace('/', '\\'); + args << "/select," << file; + // FIXME: This shouldn't be using a hardcoded path. + QProcess::execute("c:/windows/explorer.exe", args); +#elif defined(Q_OS_MAC) + file = m_workFolderPath + "/" + file; + args << "--reveal" << file; + QProcess::execute("/usr/bin/open", args); +#endif + } +} + QString MainWindow::getDiffBinaryName() { QSettings settings; @@ -895,11 +922,20 @@ // Diff parent against working folder (folder diff) params << "--config" << "extensions.extdiff=" << "extdiff"; - params << "--program" << diff; - - params << "--" << files; // may be none: whole dir - - m_runner->requestAction(HgAction(ACT_FOLDERDIFF, m_workFolderPath, params)); + params << "--program" << diff << "--"; + + QSettings settings; + if (settings.value("multipleDiffInstances", false).toBool()) { + foreach (QString file, files) { + QStringList p = params; + p << file; + m_runner->requestAction(HgAction(ACT_FOLDERDIFF, m_workFolderPath, p)); + } + } + else { + params << files; // may be none: whole dir + m_runner->requestAction(HgAction(ACT_FOLDERDIFF, m_workFolderPath, params)); + } } void MainWindow::hgDiffToCurrent(QString id) @@ -2670,6 +2706,9 @@ connect(m_hgTabs, SIGNAL(unIgnoreFiles(QStringList)), this, SLOT(hgUnIgnoreFiles(QStringList))); + + connect(m_hgTabs, SIGNAL(showIn(QStringList)), + this, SLOT(hgShowIn(QStringList))); } void MainWindow::enableDisableActions() diff -r 66adbedb69a9 -r 91b7ad45c608 src/mainwindow.h --- a/src/mainwindow.h Fri Oct 19 11:25:02 2012 +0100 +++ b/src/mainwindow.h Fri Oct 19 11:47:28 2012 +0100 @@ -114,6 +114,7 @@ void hgMarkFilesResolved(QStringList); void hgIgnoreFiles(QStringList); void hgUnIgnoreFiles(QStringList); + void hgShowIn(QStringList); void updateFsWatcher(); void checkFilesystem(); diff -r 66adbedb69a9 -r 91b7ad45c608 src/settingsdialog.cpp --- a/src/settingsdialog.cpp Fri Oct 19 11:25:02 2012 +0100 +++ b/src/settingsdialog.cpp Fri Oct 19 11:47:28 2012 +0100 @@ -87,6 +87,9 @@ m_showExtraText = new QCheckBox(tr("Show long descriptions for file status headings")); lookLayout->addWidget(m_showExtraText, row++, 0, 1, 2); + m_showHistoryAutomatically = new QCheckBox(tr("Switch to history tab automatically when history changes")); + lookLayout->addWidget(m_showHistoryAutomatically, row++, 0, 1, 2); + #ifdef NOT_IMPLEMENTED_YET lookLayout->addWidget(new QLabel(tr("Place the work and history views")), row, 0); m_workHistoryArrangement = new QComboBox(); @@ -138,7 +141,10 @@ browse = new QPushButton(tr("Browse...")); pathsLayout->addWidget(browse, row++, 1); connect(browse, SIGNAL(clicked()), this, SLOT(diffPathBrowse())); - + + m_multipleDiffInstances = new QCheckBox(tr("Multiple instances when multiple files are selected")); + pathsLayout->addWidget(m_multipleDiffInstances, row++, 2); + pathsLayout->addWidget(new QLabel(tr("External file-merge program:")), row, 0); m_mergePathLabel = new QLineEdit(); @@ -157,20 +163,20 @@ pathsLayout->addWidget(browse, row++, 1); connect(browse, SIGNAL(clicked()), this, SLOT(sshPathBrowse())); - pathsLayout->addWidget(new QLabel(tr("EasyHg Mercurial extension:")), row, 0); + //!!! more info plz + m_useExtension = new QCheckBox(tr("Use EasyHg Mercurial extension")); + pathsLayout->addWidget(m_useExtension, row, 0); + connect(m_useExtension, SIGNAL(stateChanged(int)), this, SLOT(useExtension(int))); m_extensionPathLabel = new QLineEdit(); pathsLayout->addWidget(m_extensionPathLabel, row, 2); - browse = new QPushButton(tr("Browse...")); - pathsLayout->addWidget(browse, row++, 1); - connect(browse, SIGNAL(clicked()), this, SLOT(extensionPathBrowse())); - - //!!! more info plz - m_useExtension = new QCheckBox(tr("Use EasyHg Mercurial extension")); - pathsLayout->addWidget(m_useExtension, row++, 2); + m_extensionBrowse = new QPushButton(tr("Browse...")); + pathsLayout->addWidget(m_extensionBrowse, row++, 1); + connect(m_extensionBrowse, SIGNAL(clicked()), this, SLOT(extensionPathBrowse())); pathsLayout->setRowStretch(row, 20); + pathsLayout->setColumnStretch(2, 20); reset(); // loads current defaults from settings @@ -225,6 +231,13 @@ } void +SettingsDialog::useExtension(int) +{ + m_extensionPathLabel->setEnabled(m_useExtension->isChecked()); + m_extensionBrowse->setEnabled(m_useExtension->isChecked()); +} + +void SettingsDialog::browseFor(QString title, QLineEdit *edit) { QString origin = edit->text(); @@ -407,6 +420,7 @@ settings.beginGroup("Presentation"); settings.remove("showiconlabels"); settings.remove("showhelpfultext"); + settings.remove("showHistoryAutomatically"); settings.remove("dateformat"); settings.endGroup(); settings.beginGroup("Locations"); @@ -418,6 +432,7 @@ settings.endGroup(); settings.beginGroup(""); settings.remove("useextension"); + settings.remove("multipleDiffInstances"); settings.endGroup(); } @@ -433,6 +448,7 @@ settings.beginGroup("Presentation"); m_showIconLabels->setChecked(settings.value("showiconlabels", true).toBool()); m_showExtraText->setChecked(settings.value("showhelpfultext", true).toBool()); + m_showHistoryAutomatically->setChecked(settings.value("showHistoryAutomatically", true).toBool()); #ifdef NOT_IMPLEMENTED_YET m_workHistoryArrangement->setCurrentIndex(settings.value("workhistoryarrangement", 0).toInt()); #endif @@ -448,6 +464,8 @@ settings.endGroup(); settings.beginGroup(""); m_useExtension->setChecked(settings.value("useextension", true).toBool()); + useExtension(m_useExtension->isChecked()); + m_multipleDiffInstances->setChecked(settings.value("multipleDiffInstances", false).toBool()); settings.endGroup(); } @@ -472,6 +490,7 @@ settings.setValue("showhelpfultext", b); m_presentationChanged = true; } + settings.setValue("showHistoryAutomatically", m_showHistoryAutomatically->isChecked()); int i; #ifdef NOT_IMPLEMENTED_YET i = m_workHistoryArrangement->currentIndex(); @@ -500,6 +519,7 @@ settings.endGroup(); settings.beginGroup(""); settings.setValue("useextension", m_useExtension->isChecked()); + settings.setValue("multipleDiffInstances", m_multipleDiffInstances->isChecked()); settings.endGroup(); QDialog::accept(); } diff -r 66adbedb69a9 -r 91b7ad45c608 src/settingsdialog.h --- a/src/settingsdialog.h Fri Oct 19 11:25:02 2012 +0100 +++ b/src/settingsdialog.h Fri Oct 19 11:47:28 2012 +0100 @@ -55,6 +55,7 @@ void mergePathBrowse(); void sshPathBrowse(); void extensionPathBrowse(); + void useExtension(int); void accept(); void reset(); @@ -71,11 +72,15 @@ QLineEdit *m_mergePathLabel; QLineEdit *m_sshPathLabel; + QPushButton *m_extensionBrowse; + + QCheckBox *m_multipleDiffInstances; QCheckBox *m_useExtension; QLineEdit *m_extensionPathLabel; QCheckBox *m_showIconLabels; QCheckBox *m_showExtraText; + QCheckBox *m_showHistoryAutomatically; QComboBox *m_dateFormat; QDateEdit *m_dateFrom;