From 2429d6ca9e4a9f504e8f5f6814f899b7156e1586 Mon Sep 17 00:00:00 2001 From: kostas Date: Tue, 2 Jun 2015 17:28:10 +0000 Subject: [PATCH 1/6] Initial work on user defined file actions FossilOrigin-Name: c1562dbda3ad33559227bb0d2fd177e35cae6681 --- manifest | 29 ++++++++++--------- manifest.uuid | 2 +- src/MainWindow.cpp | 56 ++++++++++++++++++++++++++++++++++-- src/MainWindow.h | 5 +++- src/Settings.cpp | 5 ++++ src/Settings.h | 2 ++ src/SettingsDialog.cpp | 17 +++++++++++ src/SettingsDialog.h | 1 + ui/MainWindow.ui | 8 ++++++ ui/SettingsDialog.ui | 65 +++++++++++++++++++++++++++++++++++++++++- 10 files changed, 171 insertions(+), 19 deletions(-) diff --git a/manifest b/manifest index fef661d..0b81bc0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Reorganized\sbranch\soptions\sin\scommit\sdialog. -D 2015-06-02T16:19:59.488 +C Initial\swork\son\suser\sdefined\sfile\sactions\n +D 2015-06-02T17:28:10.948 F .travis.yml 77966888a81c4ceee1fcc79bce842c9667ad8a35 F debian/changelog eb4304dfcb6bb66850ec740838090eb50ce1249b F debian/compat b6abd567fa79cbe0196d093a067271361dc6ca8b @@ -224,18 +224,18 @@ F src/FslSettingsDialog.cpp 2531d3709f0eab66651671e3edead2ca720d07d5 F src/FslSettingsDialog.h dfe2a61884a55a74cbb9206b6f6b482b979725e7 F src/LoggedProcess.cpp 2a1e5c94bc1e57c8984563e66c210e43a14dc60c F src/LoggedProcess.h 85df7c635c807a5a0e8c4763f17a0752aaff7261 -F src/MainWindow.cpp 191dff3e4759644be48ce40048d6f93d3a5e03f2 -F src/MainWindow.h 31870bca434835471159ab350583c21028e77e47 +F src/MainWindow.cpp 8521536cfe2167d5b82bc5c7808dff8117d3da4f +F src/MainWindow.h d3216b30702df9a44b3a93e6c96fd05ceb0e3822 F src/RemoteDialog.cpp 8540cc5e2e41c4127ed8a028d84691604fa6ecac F src/RemoteDialog.h 5e0438c2bd7c79b1bb44bfbd58c2181b544a9e5d F src/RevisionDialog.cpp e58c4f8a704f00addebb15d521b76620fdafda79 F src/RevisionDialog.h b718c3009342eaabad39c8a11a253a4e4fef7a73 F src/SearchBox.cpp d4209c575baa9933e1ce5ed376e785b289a145ba F src/SearchBox.h 0c78d3a68136dab3e0e71b83ae36f22bd2688ab2 -F src/Settings.cpp 7a674604caa9d9f5ffb6b73d95745bde09525389 -F src/Settings.h 883ac5c0f38a6ac93b400b7b96447b017ee50c06 -F src/SettingsDialog.cpp 25be4c351dd21ea9132321944f42dc0bc22fb128 -F src/SettingsDialog.h b324dfd77ca3ad24fd83588aaf79a7e4c291e716 +F src/Settings.cpp 8e8c85f2c2aecb6df3d456ce775a4a53704ebbed +F src/Settings.h 9eeeec1ac9cee4d8dc44a448995d0d599274c2ff +F src/SettingsDialog.cpp 611405e28ce746b2db6ff210c2784d5b8f2dbde8 +F src/SettingsDialog.h fea64d7f92ff326ea49f14559e36379892c0a7c4 F src/Utils.cpp d53b1b92352e586a7c12a19ec6b109a9f095b7f1 F src/Utils.h 011e4be3f94cd26be537299cd44ab9c135db44a5 F src/Workspace.cpp 7004c2c30f79d2e64691aa9b2c55ee72a84d978b @@ -248,11 +248,14 @@ F ui/CloneDialog.ui 4886e7d4f258ea8b852b5eefc860396e35145712 F ui/CommitDialog.ui 1e5dafa742e9ae07ec937bcda8cda3297ddc6199 F ui/FileActionDialog.ui 89bb4dc2d0b8adcd41adcb11ec65f2028a09a12d F ui/FslSettingsDialog.ui eb3d4cb764cab90b01e82922237d8c42d6ce1749 -F ui/MainWindow.ui 10181826a25056ed5aba2b23a7d110159be7c043 +F ui/MainWindow.ui 140d5b3e8c37d2e764afd3ee9e74bc754888d067 F ui/RemoteDialog.ui 95a4750d972ed8c49bb10b95db91ff16cfe2dd0b F ui/RevisionDialog.ui 27c3b98c665fec014a50cbf3352c0627f75e68cd -F ui/SettingsDialog.ui 4c480cd595a32664d01c85bf74845c4282fc0068 -P 4e621933a5ddf87127fab8cc0aa94a4a6fd8c964 -R 176bdc576cc4d16d2dc819b4b903879d +F ui/SettingsDialog.ui 2a84288694c666badb6f29e4badaa3f0bdd46287 +P 1954aea71218df9a36b6059fac19ab416ef470dc +R e725cdba0f62a2aad3ff979a23275b03 +T *branch * user-actions +T *sym-user-actions * +T -sym-trunk * U kostas -Z d1ca8b7e2dcce6bdcdbdb07bc1f60316 +Z 732d3b0fa352093eb465015746a344aa diff --git a/manifest.uuid b/manifest.uuid index 67808eb..6ce7e81 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1954aea71218df9a36b6059fac19ab416ef470dc \ No newline at end of file +c1562dbda3ad33559227bb0d2fd177e35cae6681 \ No newline at end of file diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 337f0ab..238d5c8 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -106,11 +106,14 @@ MainWindow::MainWindow(Settings &_settings, QWidget *parent, QString *workspaceP ui->fileTableView->addAction(ui->actionHistory); ui->fileTableView->addAction(ui->actionOpenFile); ui->fileTableView->addAction(ui->actionOpenContaining); + ui->actionCustomFileAction->setVisible(false); + ui->fileTableView->addAction(ui->actionCustomFileAction); ui->fileTableView->addAction(separator); ui->fileTableView->addAction(ui->actionAdd); ui->fileTableView->addAction(ui->actionRevert); ui->fileTableView->addAction(ui->actionRename); ui->fileTableView->addAction(ui->actionDelete); + connect( ui->fileTableView, SIGNAL( dragOutEvent() ), SLOT( onFileViewDragOut() ), @@ -604,7 +607,8 @@ void MainWindow::enableActions(bool on) ui->actionDeleteTag, ui->actionCreateBranch, ui->actionMergeBranch, - ui->actionFossilSettings + ui->actionFossilSettings, + ui->actionCustomFileAction }; for(size_t i=0; iactionCustomFileAction->setVisible(true); + ui->actionCustomFileAction->setText(fileaction_name); + } + else + ui->actionCustomFileAction->setVisible(false); +} + +//------------------------------------------------------------------------------ +void MainWindow::on_actionCustomFileAction_triggered() +{ + if(!settings.HasValue(FUEL_SETTING_FILEACTION_NAME) || !settings.HasValue(FUEL_SETTING_FILEACTION_COMMAND)) + return; + + QStringList selection; + getSelectionFilenames(selection, WorkspaceFile::TYPE_ALL); + + QProcess proc(this); + + QStringList params; + foreach(const QString &f, selection) + { + QString path = QFileInfo(fossil().getCurrentWorkspace() + "/" + f).absoluteFilePath(); + params.append(path); + } + + const QString &cmd = settings.GetValue(FUEL_SETTING_FILEACTION_COMMAND).toString(); + proc.startDetached(cmd, params); +} diff --git a/src/MainWindow.h b/src/MainWindow.h index cbdf458..bde410d 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -52,7 +52,9 @@ private: void updateWorkspaceView(); void updateFileView(); void selectRootDir(); - void MergeRevision(const QString& defaultRevision); + void mergeRevision(const QString& defaultRevision); + void applyUserActions(); + void fossilBrowse(const QString &fossilUrl); void dragEnterEvent(class QDragEnterEvent *event); @@ -132,6 +134,7 @@ private slots: void on_actionSetDefaultRemote_triggered(); void on_actionAddRemote_triggered(); void on_actionDeleteRemote_triggered(); + void on_actionCustomFileAction_triggered(); private: class MainWinUICallback : public UICallback diff --git a/src/Settings.cpp b/src/Settings.cpp index 1a88187..5c35c26 100644 --- a/src/Settings.cpp +++ b/src/Settings.cpp @@ -37,6 +37,11 @@ Settings::Settings(bool portableMode) : store(0) if(!HasValue(FUEL_SETTING_WEB_BROWSER)) SetValue(FUEL_SETTING_WEB_BROWSER, 0); + if(!HasValue(FUEL_SETTING_FILEACTION_NAME)) + SetValue(FUEL_SETTING_FILEACTION_NAME, ""); + if(!HasValue(FUEL_SETTING_FILEACTION_COMMAND)) + SetValue(FUEL_SETTING_FILEACTION_COMMAND, ""); + ApplyEnvironment(); } diff --git a/src/Settings.h b/src/Settings.h index 3153868..fd16b09 100644 --- a/src/Settings.h +++ b/src/Settings.h @@ -10,6 +10,8 @@ #define FUEL_SETTING_FILE_DBLCLICK "FileDblClickAction" #define FUEL_SETTING_LANGUAGE "Language" #define FUEL_SETTING_WEB_BROWSER "WebBrowser" +#define FUEL_SETTING_FILEACTION_NAME "FileActionName" +#define FUEL_SETTING_FILEACTION_COMMAND "FileActionCommand" #define FOSSIL_SETTING_GDIFF_CMD "gdiff-command" #define FOSSIL_SETTING_GMERGE_CMD "gmerge-command" diff --git a/src/SettingsDialog.cpp b/src/SettingsDialog.cpp index 59b86d7..c2e92f2 100644 --- a/src/SettingsDialog.cpp +++ b/src/SettingsDialog.cpp @@ -26,6 +26,9 @@ SettingsDialog::SettingsDialog(QWidget *parent, Settings &_settings) : ui->cmbDoubleClickAction->setCurrentIndex(settings->GetValue(FUEL_SETTING_FILE_DBLCLICK).toInt()); ui->cmbFossilBrowser->setCurrentIndex(settings->GetValue(FUEL_SETTING_WEB_BROWSER).toInt()); + ui->lineCustomFileActionName->setText(settings->GetValue(FUEL_SETTING_FILEACTION_NAME).toString()); + ui->lineCustomFileActionCommand->setText(settings->GetValue(FUEL_SETTING_FILEACTION_COMMAND).toString()); + // Initialize language combo foreach(const LangMap &m, langMap) ui->cmbActiveLanguage->addItem(m.name); @@ -68,6 +71,12 @@ void SettingsDialog::on_buttonBox_accepted() if(curr_langid != new_langid) QMessageBox::information(this, tr("Restart required"), tr("The language change will take effect after restarting the application"), QMessageBox::Ok); + + Q_ASSERT(settings->HasValue(FUEL_SETTING_FILEACTION_NAME)); + settings->SetValue(FUEL_SETTING_FILEACTION_NAME, ui->lineCustomFileActionName->text().trimmed()); + Q_ASSERT(settings->HasValue(FUEL_SETTING_FILEACTION_COMMAND)); + settings->SetValue(FUEL_SETTING_FILEACTION_COMMAND, QDir::fromNativeSeparators(ui->lineCustomFileActionCommand->text().trimmed())); + settings->ApplyEnvironment(); } @@ -121,3 +130,11 @@ QString SettingsDialog::LangNameToId(const QString &name) return ""; } + +//----------------------------------------------------------------------------- +void SettingsDialog::on_btnSelectCustomFileActionCommand_clicked() +{ + QString path = SelectExe(this, tr("Select executable")); + if(!path.isEmpty()) + ui->lineCustomFileActionCommand->setText(QDir::toNativeSeparators(path)); +} diff --git a/src/SettingsDialog.h b/src/SettingsDialog.h index 418f2ea..5eef6a6 100644 --- a/src/SettingsDialog.h +++ b/src/SettingsDialog.h @@ -23,6 +23,7 @@ private slots: void on_btnSelectFossil_clicked(); void on_buttonBox_accepted(); void on_btnClearMessageHistory_clicked(); + void on_btnSelectCustomFileActionCommand_clicked(); private: QString LangIdToName(const QString &id); diff --git a/ui/MainWindow.ui b/ui/MainWindow.ui index 9607069..a4043e0 100644 --- a/ui/MainWindow.ui +++ b/ui/MainWindow.ui @@ -1047,6 +1047,14 @@ Delete Remote + + + Custom File Action + + + Custom File Action + + diff --git a/ui/SettingsDialog.ui b/ui/SettingsDialog.ui index 0685355..ae0116d 100644 --- a/ui/SettingsDialog.ui +++ b/ui/SettingsDialog.ui @@ -10,7 +10,7 @@ 0 0 457 - 204 + 278 @@ -180,6 +180,69 @@ + + + + + 100 + 0 + + + + Custom File Action Name + + + + + + + Name of custom action + + + + + + + + 100 + 0 + + + + Custom File Action Command + + + + + + + + + Custom action command line + + + + + + + + 0 + 0 + + + + + 24 + 24 + + + + ... + + + + + From 78276623a401f058795dfc241ff6e32a51bccaa3 Mon Sep 17 00:00:00 2001 From: kostas Date: Thu, 9 Jul 2015 18:55:33 +0000 Subject: [PATCH 2/6] Support for multiple custom actions FossilOrigin-Name: 172938d454db50a53cd0e0435991a7fccea59ae7 --- manifest | 29 +++--- manifest.uuid | 2 +- src/MainWindow.cpp | 201 +++++++++++++++++++++++++++++++++++------ src/MainWindow.h | 5 +- src/Settings.cpp | 11 ++- src/Settings.h | 58 +++++++++++- src/SettingsDialog.cpp | 76 ++++++++++++++-- src/SettingsDialog.h | 6 ++ ui/MainWindow.ui | 8 -- ui/SettingsDialog.ui | 171 ++++++++++++++++++++--------------- 10 files changed, 422 insertions(+), 145 deletions(-) diff --git a/manifest b/manifest index 0b81bc0..581f3f5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Initial\swork\son\suser\sdefined\sfile\sactions\n -D 2015-06-02T17:28:10.948 +C Support\sfor\smultiple\scustom\sactions\n +D 2015-07-09T18:55:33.249 F .travis.yml 77966888a81c4ceee1fcc79bce842c9667ad8a35 F debian/changelog eb4304dfcb6bb66850ec740838090eb50ce1249b F debian/compat b6abd567fa79cbe0196d093a067271361dc6ca8b @@ -224,18 +224,18 @@ F src/FslSettingsDialog.cpp 2531d3709f0eab66651671e3edead2ca720d07d5 F src/FslSettingsDialog.h dfe2a61884a55a74cbb9206b6f6b482b979725e7 F src/LoggedProcess.cpp 2a1e5c94bc1e57c8984563e66c210e43a14dc60c F src/LoggedProcess.h 85df7c635c807a5a0e8c4763f17a0752aaff7261 -F src/MainWindow.cpp 8521536cfe2167d5b82bc5c7808dff8117d3da4f -F src/MainWindow.h d3216b30702df9a44b3a93e6c96fd05ceb0e3822 +F src/MainWindow.cpp 272e8424e81eb81b1c7a996ded26a217f9ec45e5 +F src/MainWindow.h b03f3d99985dd6d2bfe406239ca54e69f571db6a F src/RemoteDialog.cpp 8540cc5e2e41c4127ed8a028d84691604fa6ecac F src/RemoteDialog.h 5e0438c2bd7c79b1bb44bfbd58c2181b544a9e5d F src/RevisionDialog.cpp e58c4f8a704f00addebb15d521b76620fdafda79 F src/RevisionDialog.h b718c3009342eaabad39c8a11a253a4e4fef7a73 F src/SearchBox.cpp d4209c575baa9933e1ce5ed376e785b289a145ba F src/SearchBox.h 0c78d3a68136dab3e0e71b83ae36f22bd2688ab2 -F src/Settings.cpp 8e8c85f2c2aecb6df3d456ce775a4a53704ebbed -F src/Settings.h 9eeeec1ac9cee4d8dc44a448995d0d599274c2ff -F src/SettingsDialog.cpp 611405e28ce746b2db6ff210c2784d5b8f2dbde8 -F src/SettingsDialog.h fea64d7f92ff326ea49f14559e36379892c0a7c4 +F src/Settings.cpp 258d3f466f6a125ce2b8519d6d57a312cbc44a3f +F src/Settings.h 02bee6bd1178dc456fc80b277edd0843e535649c +F src/SettingsDialog.cpp b0d0bfc45534b7bed148776d4c3865a68d59ec15 +F src/SettingsDialog.h 5eb3ae2cbb00ab5544e1889860f5376f69fe47cd F src/Utils.cpp d53b1b92352e586a7c12a19ec6b109a9f095b7f1 F src/Utils.h 011e4be3f94cd26be537299cd44ab9c135db44a5 F src/Workspace.cpp 7004c2c30f79d2e64691aa9b2c55ee72a84d978b @@ -248,14 +248,11 @@ F ui/CloneDialog.ui 4886e7d4f258ea8b852b5eefc860396e35145712 F ui/CommitDialog.ui 1e5dafa742e9ae07ec937bcda8cda3297ddc6199 F ui/FileActionDialog.ui 89bb4dc2d0b8adcd41adcb11ec65f2028a09a12d F ui/FslSettingsDialog.ui eb3d4cb764cab90b01e82922237d8c42d6ce1749 -F ui/MainWindow.ui 140d5b3e8c37d2e764afd3ee9e74bc754888d067 +F ui/MainWindow.ui 10181826a25056ed5aba2b23a7d110159be7c043 F ui/RemoteDialog.ui 95a4750d972ed8c49bb10b95db91ff16cfe2dd0b F ui/RevisionDialog.ui 27c3b98c665fec014a50cbf3352c0627f75e68cd -F ui/SettingsDialog.ui 2a84288694c666badb6f29e4badaa3f0bdd46287 -P 1954aea71218df9a36b6059fac19ab416ef470dc -R e725cdba0f62a2aad3ff979a23275b03 -T *branch * user-actions -T *sym-user-actions * -T -sym-trunk * +F ui/SettingsDialog.ui b5858067cdb16c3f132af4cf8332e4ad255c915c +P c1562dbda3ad33559227bb0d2fd177e35cae6681 +R 084d6ff50c0d7d634da28bd5e41e98ef U kostas -Z 732d3b0fa352093eb465015746a344aa +Z 5e0824e216c8fc6ae7795004bb7a7ace diff --git a/manifest.uuid b/manifest.uuid index 6ce7e81..0885c2c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c1562dbda3ad33559227bb0d2fd177e35cae6681 \ No newline at end of file +172938d454db50a53cd0e0435991a7fccea59ae7 \ No newline at end of file diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 238d5c8..1f73b13 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -99,6 +99,12 @@ MainWindow::MainWindow(Settings &_settings, QWidget *parent, QString *workspaceP QAction *separator = new QAction(this); separator->setSeparator(true); + fileActionSeparator = new QAction(this); + fileActionSeparator->setSeparator(true); + + workspaceActionSeparator = new QAction(this); + workspaceActionSeparator->setSeparator(true); + // fileTableView ui->fileTableView->setModel(&getWorkspace().getFileModel()); @@ -106,8 +112,6 @@ MainWindow::MainWindow(Settings &_settings, QWidget *parent, QString *workspaceP ui->fileTableView->addAction(ui->actionHistory); ui->fileTableView->addAction(ui->actionOpenFile); ui->fileTableView->addAction(ui->actionOpenContaining); - ui->actionCustomFileAction->setVisible(false); - ui->fileTableView->addAction(ui->actionCustomFileAction); ui->fileTableView->addAction(separator); ui->fileTableView->addAction(ui->actionAdd); ui->fileTableView->addAction(ui->actionRevert); @@ -202,7 +206,7 @@ MainWindow::MainWindow(Settings &_settings, QWidget *parent, QString *workspaceP } } Q_ASSERT(recent_sep); - for (int i = 0; i < MAX_RECENT; ++i) + for(int i = 0; i < MAX_RECENT; ++i) { recentWorkspaceActs[i] = new QAction(this); recentWorkspaceActs[i]->setVisible(false); @@ -210,6 +214,17 @@ MainWindow::MainWindow(Settings &_settings, QWidget *parent, QString *workspaceP ui->menuFile->insertAction(recent_sep, recentWorkspaceActs[i]); } + // Custom Actions + //ui->fileTableView->addAction(separator); + for(int i = 0; i < settings.GetCustomActions().size(); ++i) + { + customActions[i] = new QAction(this); + customActions[i]->setVisible(false); + connect(customActions[i], SIGNAL(triggered()), this, SLOT(on_actionCustomAction_triggered())); + customActions[i]->setData(i); + customActions[i]->setShortcut(QKeySequence(QString("Ctrl+%0").arg(i+1))); + } + // TabWidget ui->tabWidget->setCurrentIndex(TAB_LOG); @@ -608,7 +623,6 @@ void MainWindow::enableActions(bool on) ui->actionCreateBranch, ui->actionMergeBranch, ui->actionFossilSettings, - ui->actionCustomFileAction }; for(size_t i=0; ibeginReadArray("CustomActions"); + int last_action = 0; + for(int i=0; isetArrayIndex(i); + CustomAction &action = settings.GetCustomActions()[last_action]; + + QString descr; + if(store->contains("Description")) + descr = store->value("Description").toString(); + + if(descr.isEmpty()) + continue; + action.Description = descr; + + if(store->contains("Command")) + action.Command = store->value("Command").toString(); + if(store->contains("Context")) + action.Context = static_cast(store->value("Context").toInt()); + + ++last_action; + } + store->endArray(); + applyUserActions(); } @@ -1099,6 +1142,24 @@ void MainWindow::updateSettings() store->setValue("ViewUnchanged", ui->actionViewUnchanged->isChecked()); store->setValue("ViewIgnored", ui->actionViewIgnored->isChecked()); store->setValue("ViewAsList", ui->actionViewAsList->isChecked()); + + // Custom Actions + Settings::custom_actions_t &actions = settings.GetCustomActions(); + store->beginWriteArray("CustomActions", actions.size()); + int active_actions = 0; + for(int i=0; isetArrayIndex(active_actions); + + store->setValue("Description", action.Description); + store->setValue("Command", action.Command); + store->setValue("Context", static_cast(action.Context)); + ++active_actions; + } + store->endArray(); } //------------------------------------------------------------------------------ @@ -2672,42 +2733,128 @@ void MainWindow::on_actionDeleteRemote_triggered() //------------------------------------------------------------------------------ void MainWindow::applyUserActions() { - QString fileaction_name; - QString fileaction_cmd; + Settings::custom_actions_t custom_actions = settings.GetCustomActions(); + Q_ASSERT(MAX_CUSTOM_ACTIONS == custom_actions.size()); - if(settings.HasValue(FUEL_SETTING_FILEACTION_NAME) && settings.HasValue(FUEL_SETTING_FILEACTION_COMMAND)) + // Remove All Actions + for(int i = 0; i < custom_actions.size(); ++i) { - fileaction_name = settings.GetValue(FUEL_SETTING_FILEACTION_NAME).toString(); - fileaction_cmd = settings.GetValue(FUEL_SETTING_FILEACTION_COMMAND).toString(); + QAction *action = customActions[i]; + ui->fileTableView->removeAction(action); + menuWorkspace->removeAction(action); + } + ui->fileTableView->removeAction(fileActionSeparator); + menuWorkspace->removeAction(workspaceActionSeparator); + + // Add them to the top + ui->fileTableView->addAction(fileActionSeparator); + menuWorkspace->addAction(workspaceActionSeparator); + + bool has_file_actions = false; + bool has_folder_actions = false; + + for(int i = 0; i < custom_actions.size(); ++i) + { + CustomAction &cust_act = custom_actions[i]; + QAction *action = customActions[i]; + action->setVisible(cust_act.IsValid()); + action->setText(cust_act.Description); + + if(cust_act.IsActive(ACTION_CONTEXT_FILES)) + { + ui->fileTableView->addAction(action); + has_file_actions = true; + } + + if(cust_act.IsActive(ACTION_CONTEXT_FOLDERS)) + { + menuWorkspace->addAction(action); + has_folder_actions = true; + } } - if(!fileaction_name.isEmpty() && !fileaction_cmd.isEmpty()) - { - ui->actionCustomFileAction->setVisible(true); - ui->actionCustomFileAction->setText(fileaction_name); - } - else - ui->actionCustomFileAction->setVisible(false); + if(!has_file_actions) + ui->fileTableView->removeAction(fileActionSeparator); + + if(!has_folder_actions) + menuWorkspace->removeAction(workspaceActionSeparator); } //------------------------------------------------------------------------------ -void MainWindow::on_actionCustomFileAction_triggered() +void MainWindow::on_actionCustomAction_triggered() { - if(!settings.HasValue(FUEL_SETTING_FILEACTION_NAME) || !settings.HasValue(FUEL_SETTING_FILEACTION_COMMAND)) + QAction *action = qobject_cast(sender()); + if(!action) return; - QStringList selection; - getSelectionFilenames(selection, WorkspaceFile::TYPE_ALL); - - QProcess proc(this); + int action_id = action->data().toInt(); + Q_ASSERT(action_id < settings.GetCustomActions().size()); + CustomAction &cust_action = settings.GetCustomActions()[action_id]; + Q_ASSERT(cust_action.IsValid()); QStringList params; - foreach(const QString &f, selection) + + // Process command string + QString cmd = cust_action.Command; + Q_ASSERT(!cmd.isEmpty()); + + // Split command from embedded params + QString extra_params; + + // Command ends after first space + QChar cmd_char_end = ' '; + int start = 0 ; + + // Unless it is a quoted command + if(cmd[0]=='"') { - QString path = QFileInfo(fossil().getCurrentWorkspace() + "/" + f).absoluteFilePath(); - params.append(path); + cmd_char_end = '"'; + start = 1; } - const QString &cmd = settings.GetValue(FUEL_SETTING_FILEACTION_COMMAND).toString(); + int cmd_end = cmd.indexOf(cmd_char_end, start); + if(cmd_end != -1) + { + extra_params = cmd.mid(cmd_end+1); + cmd = cmd.left(cmd_end); + } + + cmd = cmd.trimmed(); + extra_params = extra_params.trimmed(); + QStringList extra_param_list = extra_params.split(' '); + foreach(const QString &p, extra_param_list) + params.push_back(p); + + // Extract selection + if(cust_action.IsActive(ACTION_CONTEXT_FILES)) + { + QStringList file_selection; + getSelectionFilenames(file_selection, WorkspaceFile::TYPE_ALL); + foreach(const QString &f, file_selection) + { + QString path = QFileInfo(fossil().getCurrentWorkspace() + "/" + f).absoluteFilePath(); + params.append(path); + } + } + + if(cust_action.IsActive(ACTION_CONTEXT_FOLDERS)) + { + stringset_t path_selection; + getSelectionPaths(path_selection); + foreach(const QString &f, path_selection) + { + QString path = QFileInfo(fossil().getCurrentWorkspace() + "/" + f).absoluteFilePath(); + params.append(path); + } + } + + // Skip action if nothing is available + if(params.empty()) + return; + + + log(""+cmd + " "+params.join(" ")+"
", true); + + QProcess proc(this); proc.startDetached(cmd, params); -} +} \ No newline at end of file diff --git a/src/MainWindow.h b/src/MainWindow.h index bde410d..49f7de5 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -134,7 +134,7 @@ private slots: void on_actionSetDefaultRemote_triggered(); void on_actionAddRemote_triggered(); void on_actionDeleteRemote_triggered(); - void on_actionCustomFileAction_triggered(); + void on_actionCustomAction_triggered(); private: class MainWinUICallback : public UICallback @@ -172,6 +172,9 @@ private: QFileIconProvider iconProvider; icon_map_t iconCache; class QAction *recentWorkspaceActs[MAX_RECENT]; + class QAction *customActions[MAX_CUSTOM_ACTIONS]; + class QAction *fileActionSeparator; + class QAction *workspaceActionSeparator; class QProgressBar *progressBar; class QLabel *lblRevision; class QLabel *lblTags; diff --git a/src/Settings.cpp b/src/Settings.cpp index 5c35c26..0f9a652 100644 --- a/src/Settings.cpp +++ b/src/Settings.cpp @@ -37,10 +37,13 @@ Settings::Settings(bool portableMode) : store(0) if(!HasValue(FUEL_SETTING_WEB_BROWSER)) SetValue(FUEL_SETTING_WEB_BROWSER, 0); - if(!HasValue(FUEL_SETTING_FILEACTION_NAME)) - SetValue(FUEL_SETTING_FILEACTION_NAME, ""); - if(!HasValue(FUEL_SETTING_FILEACTION_COMMAND)) - SetValue(FUEL_SETTING_FILEACTION_COMMAND, ""); + + for(int i=0; i #include #include +#include #define FUEL_SETTING_FOSSIL_PATH "FossilPath" #define FUEL_SETTING_COMMIT_MSG "CommitMsgHistory" #define FUEL_SETTING_FILE_DBLCLICK "FileDblClickAction" #define FUEL_SETTING_LANGUAGE "Language" #define FUEL_SETTING_WEB_BROWSER "WebBrowser" -#define FUEL_SETTING_FILEACTION_NAME "FileActionName" -#define FUEL_SETTING_FILEACTION_COMMAND "FileActionCommand" #define FOSSIL_SETTING_GDIFF_CMD "gdiff-command" #define FOSSIL_SETTING_GMERGE_CMD "gmerge-command" @@ -29,6 +28,50 @@ enum FileDblClickAction FILE_DLBCLICK_ACTION_MAX }; + +enum CustomActionContext +{ + ACTION_CONTEXT_FILES = 1 << 0, + ACTION_CONTEXT_FOLDERS = 1 << 1, + ACTION_CONTEXT_FILES_AND_FOLDERS = ACTION_CONTEXT_FILES|ACTION_CONTEXT_FOLDERS +}; + + +enum +{ + MAX_CUSTOM_ACTIONS = 5 +}; + +struct CustomAction +{ + QString Id; + QString Description; + QString Command; + CustomActionContext Context; + + CustomAction() + { + Clear(); + } + + bool IsValid() const + { + return !(Description.isEmpty() || Command.isEmpty()); + } + + bool IsActive(CustomActionContext context) const + { + return (Context & context) != 0; + } + + void Clear() + { + Description.clear(); + Command.clear(); + Context = ACTION_CONTEXT_FILES; + } +}; + struct Settings { struct Setting @@ -45,6 +88,7 @@ struct Settings SettingType Type; }; typedef QMap mappings_t; + typedef QVector custom_actions_t; Settings(bool portableMode = false); @@ -65,10 +109,14 @@ struct Settings bool SupportsLang(const QString &langId) const; bool InstallLang(const QString &langId); + + custom_actions_t &GetCustomActions() { return customActions; } private: - mappings_t Mappings; - class QSettings *store; - QTranslator translator; + mappings_t Mappings; + class QSettings *store; + QTranslator translator; + + custom_actions_t customActions; }; diff --git a/src/SettingsDialog.cpp b/src/SettingsDialog.cpp index c2e92f2..f513e2c 100644 --- a/src/SettingsDialog.cpp +++ b/src/SettingsDialog.cpp @@ -26,9 +26,6 @@ SettingsDialog::SettingsDialog(QWidget *parent, Settings &_settings) : ui->cmbDoubleClickAction->setCurrentIndex(settings->GetValue(FUEL_SETTING_FILE_DBLCLICK).toInt()); ui->cmbFossilBrowser->setCurrentIndex(settings->GetValue(FUEL_SETTING_WEB_BROWSER).toInt()); - ui->lineCustomFileActionName->setText(settings->GetValue(FUEL_SETTING_FILEACTION_NAME).toString()); - ui->lineCustomFileActionCommand->setText(settings->GetValue(FUEL_SETTING_FILEACTION_COMMAND).toString()); - // Initialize language combo foreach(const LangMap &m, langMap) ui->cmbActiveLanguage->addItem(m.name); @@ -39,6 +36,22 @@ SettingsDialog::SettingsDialog(QWidget *parent, Settings &_settings) : ui->cmbActiveLanguage->findText( LangIdToName(lang))); + + lastActionIndex = 0; + currentCustomActions = settings->GetCustomActions(); + + ui->cmbCustomActionContext->addItem(tr("Files")); + ui->cmbCustomActionContext->addItem(tr("Folders")); + ui->cmbCustomActionContext->setCurrentIndex(0); + + GetCustomAction(0); + + for(int i=0; icmbCustomAction->addItem(a.Id); + } + ui->cmbCustomAction->setCurrentIndex(0); } //----------------------------------------------------------------------------- @@ -71,11 +84,16 @@ void SettingsDialog::on_buttonBox_accepted() if(curr_langid != new_langid) QMessageBox::information(this, tr("Restart required"), tr("The language change will take effect after restarting the application"), QMessageBox::Ok); + for(int i=0; iHasValue(FUEL_SETTING_FILEACTION_NAME)); - settings->SetValue(FUEL_SETTING_FILEACTION_NAME, ui->lineCustomFileActionName->text().trimmed()); - Q_ASSERT(settings->HasValue(FUEL_SETTING_FILEACTION_COMMAND)); - settings->SetValue(FUEL_SETTING_FILEACTION_COMMAND, QDir::fromNativeSeparators(ui->lineCustomFileActionCommand->text().trimmed())); + PutCustomAction(ui->cmbCustomAction->currentIndex()); + + settings->GetCustomActions() = currentCustomActions; settings->ApplyEnvironment(); } @@ -134,7 +152,47 @@ QString SettingsDialog::LangNameToId(const QString &name) //----------------------------------------------------------------------------- void SettingsDialog::on_btnSelectCustomFileActionCommand_clicked() { - QString path = SelectExe(this, tr("Select executable")); + QString path = SelectExe(this, tr("Select command")); if(!path.isEmpty()) - ui->lineCustomFileActionCommand->setText(QDir::toNativeSeparators(path)); + ui->lineCustomActionCommand->setText(QDir::toNativeSeparators(path)); +} + +//----------------------------------------------------------------------------- +void SettingsDialog::GetCustomAction(int index) +{ + Q_ASSERT(index>=0 && index < currentCustomActions.size()); + CustomAction &action = currentCustomActions[index]; + ui->lineCustomActionDescription->setText(action.Description); + ui->lineCustomActionCommand->setText(action.Command); + ui->cmbCustomActionContext->setCurrentIndex(action.Context-1); +} + +//----------------------------------------------------------------------------- +void SettingsDialog::PutCustomAction(int index) +{ + Q_ASSERT(index>=0 && index < currentCustomActions.size()); + CustomAction &action = currentCustomActions[index]; + action.Description = ui->lineCustomActionDescription->text().trimmed(); + action.Command = QDir::fromNativeSeparators(ui->lineCustomActionCommand->text().trimmed()); + action.Context = static_cast(ui->cmbCustomActionContext->currentIndex()+1); +} + +//----------------------------------------------------------------------------- +void SettingsDialog::on_cmbCustomAction_currentIndexChanged(int index) +{ + if(index != lastActionIndex) + PutCustomAction(lastActionIndex); + + GetCustomAction(index); + lastActionIndex = index; +} + +//----------------------------------------------------------------------------- +void SettingsDialog::on_cmbCustomActionContext_currentIndexChanged(int index) +{ + int action_index = ui->cmbCustomAction->currentIndex(); + if(action_index<0) + return; + Q_ASSERT(action_index>=0 && action_index < currentCustomActions.size()); + currentCustomActions[action_index].Context = static_cast(index+1); } diff --git a/src/SettingsDialog.h b/src/SettingsDialog.h index 5eef6a6..3b0fdb7 100644 --- a/src/SettingsDialog.h +++ b/src/SettingsDialog.h @@ -24,11 +24,15 @@ private slots: void on_buttonBox_accepted(); void on_btnClearMessageHistory_clicked(); void on_btnSelectCustomFileActionCommand_clicked(); + void on_cmbCustomAction_currentIndexChanged(int index); + void on_cmbCustomActionContext_currentIndexChanged(int index); private: QString LangIdToName(const QString &id); QString LangNameToId(const QString &name); void CreateLangMap(); + void GetCustomAction(int index); + void PutCustomAction(int index); struct LangMap { @@ -44,6 +48,8 @@ private: QList langMap; Ui::SettingsDialog *ui; Settings *settings; + Settings::custom_actions_t currentCustomActions; + int lastActionIndex; }; #endif // SETTINGSDIALOG_H diff --git a/ui/MainWindow.ui b/ui/MainWindow.ui index a4043e0..9607069 100644 --- a/ui/MainWindow.ui +++ b/ui/MainWindow.ui @@ -1047,14 +1047,6 @@ Delete Remote - - - Custom File Action - - - Custom File Action - - diff --git a/ui/SettingsDialog.ui b/ui/SettingsDialog.ui index ae0116d..35c5367 100644 --- a/ui/SettingsDialog.ui +++ b/ui/SettingsDialog.ui @@ -9,8 +9,8 @@ 0 0 - 457 - 278 + 449 + 408 @@ -27,18 +27,6 @@ - - 0 - - - 0 - - - 0 - - - 0 - @@ -180,69 +168,104 @@ - - - - - 100 - 0 - - - - Custom File Action Name + + + + Custom Actions + + + 0 + + + 0 + + + + + Action + + + + + + + + + + Name of custom action + + + + + + + + 100 + 0 + + + + Description + + + + + + + Context + + + + + + + + + + + 100 + 0 + + + + Command + + + + + + + + + Custom action command line + + + + + + + + 0 + 0 + + + + + 24 + 24 + + + + ... + + + + + + - - - - Name of custom action - - - - - - - - 100 - 0 - - - - Custom File Action Command - - - - - - - - - Custom action command line - - - - - - - - 0 - 0 - - - - - 24 - 24 - - - - ... - - - - - From 8b2137a58a09c6902b8a5b2eaa36fa5b3ae049f5 Mon Sep 17 00:00:00 2001 From: kostas Date: Fri, 10 Jul 2015 15:36:47 +0000 Subject: [PATCH 3/6] Added support for $FILE $FOLDER and $WORKSPACE macros in custom action commands FossilOrigin-Name: 381aa49e9b6b5d5424ee6dbd69d0890634d5bf08 --- manifest | 14 ++++----- manifest.uuid | 2 +- src/MainWindow.cpp | 72 ++++++++++++++++++++++++++++++++++++---------- src/MainWindow.h | 2 +- 4 files changed, 66 insertions(+), 24 deletions(-) diff --git a/manifest b/manifest index 581f3f5..502d9cb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Support\sfor\smultiple\scustom\sactions\n -D 2015-07-09T18:55:33.249 +C Added\ssupport\sfor\s$FILE\s$FOLDER\sand\s$WORKSPACE\smacros\sin\scustom\saction\scommands +D 2015-07-10T15:36:47.096 F .travis.yml 77966888a81c4ceee1fcc79bce842c9667ad8a35 F debian/changelog eb4304dfcb6bb66850ec740838090eb50ce1249b F debian/compat b6abd567fa79cbe0196d093a067271361dc6ca8b @@ -224,8 +224,8 @@ F src/FslSettingsDialog.cpp 2531d3709f0eab66651671e3edead2ca720d07d5 F src/FslSettingsDialog.h dfe2a61884a55a74cbb9206b6f6b482b979725e7 F src/LoggedProcess.cpp 2a1e5c94bc1e57c8984563e66c210e43a14dc60c F src/LoggedProcess.h 85df7c635c807a5a0e8c4763f17a0752aaff7261 -F src/MainWindow.cpp 272e8424e81eb81b1c7a996ded26a217f9ec45e5 -F src/MainWindow.h b03f3d99985dd6d2bfe406239ca54e69f571db6a +F src/MainWindow.cpp ab8aa79742a0da21ce1d4ddbe894d523f5c7b7a5 +F src/MainWindow.h 573ffe960044afb446505949da50e0fb5ec2f75f F src/RemoteDialog.cpp 8540cc5e2e41c4127ed8a028d84691604fa6ecac F src/RemoteDialog.h 5e0438c2bd7c79b1bb44bfbd58c2181b544a9e5d F src/RevisionDialog.cpp e58c4f8a704f00addebb15d521b76620fdafda79 @@ -252,7 +252,7 @@ F ui/MainWindow.ui 10181826a25056ed5aba2b23a7d110159be7c043 F ui/RemoteDialog.ui 95a4750d972ed8c49bb10b95db91ff16cfe2dd0b F ui/RevisionDialog.ui 27c3b98c665fec014a50cbf3352c0627f75e68cd F ui/SettingsDialog.ui b5858067cdb16c3f132af4cf8332e4ad255c915c -P c1562dbda3ad33559227bb0d2fd177e35cae6681 -R 084d6ff50c0d7d634da28bd5e41e98ef +P 172938d454db50a53cd0e0435991a7fccea59ae7 +R f0292424de125969e84f6add7e808390 U kostas -Z 5e0824e216c8fc6ae7795004bb7a7ace +Z 655910e224b8a744950ce119d86fd60d diff --git a/manifest.uuid b/manifest.uuid index 0885c2c..c2ccd9a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -172938d454db50a53cd0e0435991a7fccea59ae7 \ No newline at end of file +381aa49e9b6b5d5424ee6dbd69d0890634d5bf08 \ No newline at end of file diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 1f73b13..b98f866 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -215,7 +215,6 @@ MainWindow::MainWindow(Settings &_settings, QWidget *parent, QString *workspaceP } // Custom Actions - //ui->fileTableView->addAction(separator); for(int i = 0; i < settings.GetCustomActions().size(); ++i) { customActions[i] = new QAction(this); @@ -1103,7 +1102,7 @@ void MainWindow::applySettings() } store->endArray(); - applyUserActions(); + updateCustomActions(); } //------------------------------------------------------------------------------ @@ -1211,7 +1210,7 @@ void MainWindow::getSelectionPaths(stringset_t &paths) Q_ASSERT(data.isValid()); WorkspaceItem tv = data.value(); - if(tv.Type != WorkspaceItem::TYPE_FOLDER) + if(tv.Type != WorkspaceItem::TYPE_FOLDER && tv.Type != WorkspaceItem::TYPE_WORKSPACE) continue; paths.insert(tv.Value); @@ -1722,7 +1721,7 @@ void MainWindow::on_actionSettings_triggered() if(!SettingsDialog::run(this, settings)) return; - applyUserActions(); + updateCustomActions(); } //------------------------------------------------------------------------------ @@ -2731,7 +2730,7 @@ void MainWindow::on_actionDeleteRemote_triggered() } //------------------------------------------------------------------------------ -void MainWindow::applyUserActions() +void MainWindow::updateCustomActions() { Settings::custom_actions_t custom_actions = settings.GetCustomActions(); Q_ASSERT(MAX_CUSTOM_ACTIONS == custom_actions.size()); @@ -2803,9 +2802,9 @@ void MainWindow::on_actionCustomAction_triggered() // Command ends after first space QChar cmd_char_end = ' '; - int start = 0 ; + int start = 0; - // Unless it is a quoted command + // ...unless it is a quoted command if(cmd[0]=='"') { cmd_char_end = '"'; @@ -2821,29 +2820,73 @@ void MainWindow::on_actionCustomAction_triggered() cmd = cmd.trimmed(); extra_params = extra_params.trimmed(); - QStringList extra_param_list = extra_params.split(' '); - foreach(const QString &p, extra_param_list) - params.push_back(p); - // Extract selection + // Push all additional params, except those containing macros + QStringList extra_param_list = extra_params.split(' '); + QString macro_file; + QString macro_folder; + + const QString &wkdir = fossil().getCurrentWorkspace(); + + foreach(const QString &p, extra_param_list) + { + if(p.indexOf("$FILE")!=-1) + { + macro_file = p; + continue; + } + else if(p.indexOf("$FOLDER")!=-1) + { + macro_folder = p; + continue; + } + else if(p.indexOf("$WORKSPACE")!=-1) + { + // Add in-place + QString n = p; + n.replace("$WORKSPACE", wkdir, Qt::CaseInsensitive); + params.push_back(n); + continue; + } + + params.push_back(p); + } + + // Build file params if(cust_action.IsActive(ACTION_CONTEXT_FILES)) { QStringList file_selection; getSelectionFilenames(file_selection, WorkspaceFile::TYPE_ALL); foreach(const QString &f, file_selection) { - QString path = QFileInfo(fossil().getCurrentWorkspace() + "/" + f).absoluteFilePath(); + QString path = QFileInfo(wkdir + PATH_SEPARATOR + f).absoluteFilePath(); + + // Apply macro + if(!macro_file.isEmpty()) + { + QString macro = macro_file; + path = macro.replace("$FILE", path, Qt::CaseInsensitive); + } + params.append(path); } } + // Build folder params if(cust_action.IsActive(ACTION_CONTEXT_FOLDERS)) { stringset_t path_selection; getSelectionPaths(path_selection); foreach(const QString &f, path_selection) { - QString path = QFileInfo(fossil().getCurrentWorkspace() + "/" + f).absoluteFilePath(); + QString path = QFileInfo(wkdir + PATH_SEPARATOR + f).absoluteFilePath(); + + // Apply macro + if(!macro_folder.isEmpty()) + { + QString macro = macro_folder; + path = macro.replace("$FOLDER", path, Qt::CaseInsensitive); + } params.append(path); } } @@ -2852,9 +2895,8 @@ void MainWindow::on_actionCustomAction_triggered() if(params.empty()) return; - log(""+cmd + " "+params.join(" ")+"
", true); QProcess proc(this); proc.startDetached(cmd, params); -} \ No newline at end of file +} diff --git a/src/MainWindow.h b/src/MainWindow.h index 49f7de5..d40eb7c 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -53,7 +53,7 @@ private: void updateFileView(); void selectRootDir(); void mergeRevision(const QString& defaultRevision); - void applyUserActions(); + void updateCustomActions(); void fossilBrowse(const QString &fossilUrl); From 30d6cf3da4a5bd4ccfeec82ab7ffa78b6c9fdcb1 Mon Sep 17 00:00:00 2001 From: kostas Date: Fri, 10 Jul 2015 15:49:00 +0000 Subject: [PATCH 4/6] Refactored custom action process invocation into a separate function FossilOrigin-Name: bf36bf1c733da77a39ab9a8b7c63b892c11ef93c --- manifest | 20 ++++---- manifest.uuid | 2 +- src/Fossil.h | 2 - src/MainWindow.cpp | 111 ++++----------------------------------------- src/Utils.cpp | 109 +++++++++++++++++++++++++++++++++++++++++++- src/Utils.h | 53 ++++++++++++---------- src/Workspace.h | 3 -- 7 files changed, 156 insertions(+), 144 deletions(-) diff --git a/manifest b/manifest index 502d9cb..0866a71 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Added\ssupport\sfor\s$FILE\s$FOLDER\sand\s$WORKSPACE\smacros\sin\scustom\saction\scommands -D 2015-07-10T15:36:47.096 +C Refactored\scustom\saction\sprocess\sinvocation\sinto\sa\sseparate\sfunction\n +D 2015-07-10T15:49:00.994 F .travis.yml 77966888a81c4ceee1fcc79bce842c9667ad8a35 F debian/changelog eb4304dfcb6bb66850ec740838090eb50ce1249b F debian/compat b6abd567fa79cbe0196d093a067271361dc6ca8b @@ -219,12 +219,12 @@ F src/FileActionDialog.h 15db1650b3a13d70bc338371e4c033c66e3b79ce F src/FileTableView.cpp 5ddf8c391c9a3ac449ec61fb1db837b577afeec2 F src/FileTableView.h 03e56d87c2d46411b9762b87f4d301619aaf18df F src/Fossil.cpp 0149ce9af91392bb51b87c700e7edd4f8a4aefe7 -F src/Fossil.h e706992b331385660d57df6a27e5418342c14e19 +F src/Fossil.h 02599a958e6c27ac5f15d52a813abd40b8f5b2f4 F src/FslSettingsDialog.cpp 2531d3709f0eab66651671e3edead2ca720d07d5 F src/FslSettingsDialog.h dfe2a61884a55a74cbb9206b6f6b482b979725e7 F src/LoggedProcess.cpp 2a1e5c94bc1e57c8984563e66c210e43a14dc60c F src/LoggedProcess.h 85df7c635c807a5a0e8c4763f17a0752aaff7261 -F src/MainWindow.cpp ab8aa79742a0da21ce1d4ddbe894d523f5c7b7a5 +F src/MainWindow.cpp ad1e2f3dd64ea0774feb7c13371c02bfac9f3f4b F src/MainWindow.h 573ffe960044afb446505949da50e0fb5ec2f75f F src/RemoteDialog.cpp 8540cc5e2e41c4127ed8a028d84691604fa6ecac F src/RemoteDialog.h 5e0438c2bd7c79b1bb44bfbd58c2181b544a9e5d @@ -236,10 +236,10 @@ F src/Settings.cpp 258d3f466f6a125ce2b8519d6d57a312cbc44a3f F src/Settings.h 02bee6bd1178dc456fc80b277edd0843e535649c F src/SettingsDialog.cpp b0d0bfc45534b7bed148776d4c3865a68d59ec15 F src/SettingsDialog.h 5eb3ae2cbb00ab5544e1889860f5376f69fe47cd -F src/Utils.cpp d53b1b92352e586a7c12a19ec6b109a9f095b7f1 -F src/Utils.h 011e4be3f94cd26be537299cd44ab9c135db44a5 +F src/Utils.cpp 876942a44202611d3c778c67f6d0a344e241a000 +F src/Utils.h 4613424aaeb6910689b5821a2dd44ca0b6dd301f F src/Workspace.cpp 7004c2c30f79d2e64691aa9b2c55ee72a84d978b -F src/Workspace.h 7ae2e63196433ae34864d182e49e3a2f0726fb78 +F src/Workspace.h 0ab9b941a537134a7c43cfccee5299b8ccda143a F src/main.cpp d8c65ea5e54102e4989fef9fd8cfd4f13ef8a8f0 F tools/git-push.sh 62cc58434cae5b7bcd6bd9d4cce8b08739f31cd7 x F tools/pack.sh d7f38a498c4e9327fecd6a6e5ac27be270d43008 x @@ -252,7 +252,7 @@ F ui/MainWindow.ui 10181826a25056ed5aba2b23a7d110159be7c043 F ui/RemoteDialog.ui 95a4750d972ed8c49bb10b95db91ff16cfe2dd0b F ui/RevisionDialog.ui 27c3b98c665fec014a50cbf3352c0627f75e68cd F ui/SettingsDialog.ui b5858067cdb16c3f132af4cf8332e4ad255c915c -P 172938d454db50a53cd0e0435991a7fccea59ae7 -R f0292424de125969e84f6add7e808390 +P 381aa49e9b6b5d5424ee6dbd69d0890634d5bf08 +R a7fde02a076af76b8e8f49221c822309 U kostas -Z 655910e224b8a744950ce119d86fd60d +Z 13ebcbf30d3401de44fb0e771c5a69f1 diff --git a/manifest.uuid b/manifest.uuid index c2ccd9a..db70859 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -381aa49e9b6b5d5424ee6dbd69d0890634d5bf08 \ No newline at end of file +bf36bf1c733da77a39ab9a8b7c63b892c11ef93c \ No newline at end of file diff --git a/src/Fossil.h b/src/Fossil.h index c2c75ac..2dc1fc6 100644 --- a/src/Fossil.h +++ b/src/Fossil.h @@ -10,8 +10,6 @@ class QStringList; typedef QMap stashmap_t; -#define PATH_SEPARATOR "/" - enum RunFlags { RUNFLAGS_NONE = 0<<0, diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index b98f866..c58d46f 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -2791,112 +2791,17 @@ void MainWindow::on_actionCustomAction_triggered() CustomAction &cust_action = settings.GetCustomActions()[action_id]; Q_ASSERT(cust_action.IsValid()); - QStringList params; + Q_ASSERT(!cust_action.Command.isEmpty()); - // Process command string - QString cmd = cust_action.Command; - Q_ASSERT(!cmd.isEmpty()); + QStringList file_selection; + if(cust_action.IsActive(ACTION_CONTEXT_FILES)) + getSelectionFilenames(file_selection, WorkspaceFile::TYPE_ALL); - // Split command from embedded params - QString extra_params; - - // Command ends after first space - QChar cmd_char_end = ' '; - int start = 0; - - // ...unless it is a quoted command - if(cmd[0]=='"') - { - cmd_char_end = '"'; - start = 1; - } - - int cmd_end = cmd.indexOf(cmd_char_end, start); - if(cmd_end != -1) - { - extra_params = cmd.mid(cmd_end+1); - cmd = cmd.left(cmd_end); - } - - cmd = cmd.trimmed(); - extra_params = extra_params.trimmed(); - - // Push all additional params, except those containing macros - QStringList extra_param_list = extra_params.split(' '); - QString macro_file; - QString macro_folder; + stringset_t path_selection; + if(cust_action.IsActive(ACTION_CONTEXT_FOLDERS)) + getSelectionPaths(path_selection); const QString &wkdir = fossil().getCurrentWorkspace(); - foreach(const QString &p, extra_param_list) - { - if(p.indexOf("$FILE")!=-1) - { - macro_file = p; - continue; - } - else if(p.indexOf("$FOLDER")!=-1) - { - macro_folder = p; - continue; - } - else if(p.indexOf("$WORKSPACE")!=-1) - { - // Add in-place - QString n = p; - n.replace("$WORKSPACE", wkdir, Qt::CaseInsensitive); - params.push_back(n); - continue; - } - - params.push_back(p); - } - - // Build file params - if(cust_action.IsActive(ACTION_CONTEXT_FILES)) - { - QStringList file_selection; - getSelectionFilenames(file_selection, WorkspaceFile::TYPE_ALL); - foreach(const QString &f, file_selection) - { - QString path = QFileInfo(wkdir + PATH_SEPARATOR + f).absoluteFilePath(); - - // Apply macro - if(!macro_file.isEmpty()) - { - QString macro = macro_file; - path = macro.replace("$FILE", path, Qt::CaseInsensitive); - } - - params.append(path); - } - } - - // Build folder params - if(cust_action.IsActive(ACTION_CONTEXT_FOLDERS)) - { - stringset_t path_selection; - getSelectionPaths(path_selection); - foreach(const QString &f, path_selection) - { - QString path = QFileInfo(wkdir + PATH_SEPARATOR + f).absoluteFilePath(); - - // Apply macro - if(!macro_folder.isEmpty()) - { - QString macro = macro_folder; - path = macro.replace("$FOLDER", path, Qt::CaseInsensitive); - } - params.append(path); - } - } - - // Skip action if nothing is available - if(params.empty()) - return; - - log(""+cmd + " "+params.join(" ")+"
", true); - - QProcess proc(this); - proc.startDetached(cmd, params); + SpawnExternalProcess(this, cust_action.Command, file_selection, path_selection, wkdir, uiCallback); } diff --git a/src/Utils.cpp b/src/Utils.cpp index ce32157..f9ae60a 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -4,8 +4,9 @@ #include #include #include -#include "ext/qtkeychain/keychain.h" +#include #include +#include "ext/qtkeychain/keychain.h" /////////////////////////////////////////////////////////////////////////////// QMessageBox::StandardButton DialogQuery(QWidget *parent, const QString &title, const QString &query, QMessageBox::StandardButtons buttons) @@ -475,3 +476,109 @@ QString UrlToStringNoCredentials(const QUrl& url) return url.toString(QUrl::PrettyDecoded|QUrl::RemoveUserInfo); #endif } + +//------------------------------------------------------------------------------ +bool SpawnExternalProcess(QObject *procesParent, const QString& command, const QStringList& file_selection, const stringset_t& path_selection, const QString &wkdir, UICallback &ui) +{ + QStringList params; + + // Process command string + QString cmd = command; + Q_ASSERT(!cmd.isEmpty()); + + // Split command from embedded params + QString extra_params; + + // Command ends after first space + QChar cmd_char_end = ' '; + int start = 0; + + // ...unless it is a quoted command + if(cmd[0]=='"') + { + cmd_char_end = '"'; + start = 1; + } + + int cmd_end = cmd.indexOf(cmd_char_end, start); + if(cmd_end != -1) + { + extra_params = cmd.mid(cmd_end+1); + cmd = cmd.left(cmd_end); + } + + cmd = cmd.trimmed(); + extra_params = extra_params.trimmed(); + + // Push all additional params, except those containing macros + QString macro_file; + QString macro_folder; + + if(!extra_params.isEmpty()) + { + QStringList extra_param_list = extra_params.split(' '); + + foreach(const QString &p, extra_param_list) + { + if(p.indexOf("$FILE")!=-1) + { + macro_file = p; + continue; + } + else if(p.indexOf("$FOLDER")!=-1) + { + macro_folder = p; + continue; + } + else if(p.indexOf("$WORKSPACE")!=-1) + { + // Add in-place + QString n = p; + n.replace("$WORKSPACE", wkdir, Qt::CaseInsensitive); + params.push_back(n); + continue; + } + + params.push_back(p); + } + } + + // Build file params + foreach(const QString &f, file_selection) + { + QString path = QFileInfo(wkdir + PATH_SEPARATOR + f).absoluteFilePath(); + + // Apply macro + if(!macro_file.isEmpty()) + { + QString macro = macro_file; + path = macro.replace("$FILE", path, Qt::CaseInsensitive); + } + + params.append(path); + } + + + // Build folder params + foreach(const QString &f, path_selection) + { + QString path = QFileInfo(wkdir + PATH_SEPARATOR + f).absoluteFilePath(); + + // Apply macro + if(!macro_folder.isEmpty()) + { + QString macro = macro_folder; + path = macro.replace("$FOLDER", path, Qt::CaseInsensitive); + } + params.append(path); + } + + // Skip action if nothing is available + if(params.empty()) + return false; + + ui.logText(""+cmd + " "+params.join(" ")+"
", true); + + QProcess proc(procesParent); + return proc.startDetached(cmd, params); +} diff --git a/src/Utils.h b/src/Utils.h index 4eb4987..b37c401 100644 --- a/src/Utils.h +++ b/src/Utils.h @@ -5,37 +5,16 @@ #include #include #include +#include #define COUNTOF(array) (sizeof(array)/sizeof(array[0])) #define FOSSIL_CHECKOUT1 "_FOSSIL_" #define FOSSIL_CHECKOUT2 ".fslckout" #define FOSSIL_EXT "fossil" +#define PATH_SEPARATOR "/" +typedef QSet stringset_t; -QMessageBox::StandardButton DialogQuery(QWidget *parent, const QString &title, const QString &query, QMessageBox::StandardButtons buttons = QMessageBox::Yes|QMessageBox::No); -QString QuotePath(const QString &path); -QStringList QuotePaths(const QStringList &paths); -QString SelectExe(QWidget *parent, const QString &description); - - -typedef QMap name_modelindex_map_t; -void GetStandardItemTextRecursive(QString &name, const QStandardItem &item, const QChar &separator='/'); -void BuildNameToModelIndex(name_modelindex_map_t &map, const QStandardItem &item); -void BuildNameToModelIndex(name_modelindex_map_t &map, const QStandardItemModel &model); -bool KeychainSet(QObject* parent, const QUrl& url); -bool KeychainGet(QObject* parent, QUrl& url); -bool KeychainDelete(QObject* parent, const QUrl& url); -QString HashString(const QString &str); -QString UrlToStringDisplay(const QUrl &url); -QString UrlToStringNoCredentials(const QUrl& url); - - -typedef QMap QStringMap; -void ParseProperties(QStringMap &properties, const QStringList &lines, QChar separator=' '); - -#ifdef Q_OS_WIN - bool ShowExplorerMenu(HWND hwnd, const QString &path, const QPoint &qpoint); -#endif class UICallback { @@ -65,4 +44,30 @@ private: UICallback *uiCallback; }; + +QMessageBox::StandardButton DialogQuery(QWidget *parent, const QString &title, const QString &query, QMessageBox::StandardButtons buttons = QMessageBox::Yes|QMessageBox::No); +QString QuotePath(const QString &path); +QStringList QuotePaths(const QStringList &paths); +QString SelectExe(QWidget *parent, const QString &description); + + +typedef QMap name_modelindex_map_t; +void GetStandardItemTextRecursive(QString &name, const QStandardItem &item, const QChar &separator='/'); +void BuildNameToModelIndex(name_modelindex_map_t &map, const QStandardItem &item); +void BuildNameToModelIndex(name_modelindex_map_t &map, const QStandardItemModel &model); +bool KeychainSet(QObject* parent, const QUrl& url); +bool KeychainGet(QObject* parent, QUrl& url); +bool KeychainDelete(QObject* parent, const QUrl& url); +QString HashString(const QString &str); +QString UrlToStringDisplay(const QUrl &url); +QString UrlToStringNoCredentials(const QUrl& url); +bool SpawnExternalProcess(QObject *procesParent, const QString &command, const QStringList &file_selection, const stringset_t &path_selection, const QString& wkdir, UICallback& ui); + +typedef QMap QStringMap; +void ParseProperties(QStringMap &properties, const QStringList &lines, QChar separator=' '); + +#ifdef Q_OS_WIN + bool ShowExplorerMenu(HWND hwnd, const QString &path, const QPoint &qpoint); +#endif + #endif // UTILS_H diff --git a/src/Workspace.h b/src/Workspace.h index fb58735..b7cd50e 100644 --- a/src/Workspace.h +++ b/src/Workspace.h @@ -97,9 +97,6 @@ private: QString Path; }; - -typedef QSet stringset_t; - class Remote { public: From 509a5d2fe147156cf6f952d2db4ec98975cf8e33 Mon Sep 17 00:00:00 2001 From: kostas Date: Fri, 10 Jul 2015 18:06:40 +0000 Subject: [PATCH 5/6] Custom actions now support explicit single selections FossilOrigin-Name: e422f84c485ada3ae538712434ae64ea80021f8b --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/MainWindow.cpp | 21 +++++++++++++++++++++ src/Settings.h | 4 +++- src/SettingsDialog.cpp | 2 ++ ui/SettingsDialog.ui | 38 ++++++++++++++++++++++++++------------ 6 files changed, 62 insertions(+), 23 deletions(-) diff --git a/manifest b/manifest index 0866a71..e91e2d6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Refactored\scustom\saction\sprocess\sinvocation\sinto\sa\sseparate\sfunction\n -D 2015-07-10T15:49:00.994 +C Custom\sactions\snow\ssupport\sexplicit\ssingle\sselections\n\n +D 2015-07-10T18:06:40.135 F .travis.yml 77966888a81c4ceee1fcc79bce842c9667ad8a35 F debian/changelog eb4304dfcb6bb66850ec740838090eb50ce1249b F debian/compat b6abd567fa79cbe0196d093a067271361dc6ca8b @@ -224,7 +224,7 @@ F src/FslSettingsDialog.cpp 2531d3709f0eab66651671e3edead2ca720d07d5 F src/FslSettingsDialog.h dfe2a61884a55a74cbb9206b6f6b482b979725e7 F src/LoggedProcess.cpp 2a1e5c94bc1e57c8984563e66c210e43a14dc60c F src/LoggedProcess.h 85df7c635c807a5a0e8c4763f17a0752aaff7261 -F src/MainWindow.cpp ad1e2f3dd64ea0774feb7c13371c02bfac9f3f4b +F src/MainWindow.cpp 6b31ae5eca52bc128a0a9dd3d3dc153545de7f8c F src/MainWindow.h 573ffe960044afb446505949da50e0fb5ec2f75f F src/RemoteDialog.cpp 8540cc5e2e41c4127ed8a028d84691604fa6ecac F src/RemoteDialog.h 5e0438c2bd7c79b1bb44bfbd58c2181b544a9e5d @@ -233,8 +233,8 @@ F src/RevisionDialog.h b718c3009342eaabad39c8a11a253a4e4fef7a73 F src/SearchBox.cpp d4209c575baa9933e1ce5ed376e785b289a145ba F src/SearchBox.h 0c78d3a68136dab3e0e71b83ae36f22bd2688ab2 F src/Settings.cpp 258d3f466f6a125ce2b8519d6d57a312cbc44a3f -F src/Settings.h 02bee6bd1178dc456fc80b277edd0843e535649c -F src/SettingsDialog.cpp b0d0bfc45534b7bed148776d4c3865a68d59ec15 +F src/Settings.h c743065c1388ae431aa46c2e02470fb3c08b6a79 +F src/SettingsDialog.cpp 1b092c050753afa96f0d23e85775ecf32f6d939a F src/SettingsDialog.h 5eb3ae2cbb00ab5544e1889860f5376f69fe47cd F src/Utils.cpp 876942a44202611d3c778c67f6d0a344e241a000 F src/Utils.h 4613424aaeb6910689b5821a2dd44ca0b6dd301f @@ -251,8 +251,8 @@ F ui/FslSettingsDialog.ui eb3d4cb764cab90b01e82922237d8c42d6ce1749 F ui/MainWindow.ui 10181826a25056ed5aba2b23a7d110159be7c043 F ui/RemoteDialog.ui 95a4750d972ed8c49bb10b95db91ff16cfe2dd0b F ui/RevisionDialog.ui 27c3b98c665fec014a50cbf3352c0627f75e68cd -F ui/SettingsDialog.ui b5858067cdb16c3f132af4cf8332e4ad255c915c -P 381aa49e9b6b5d5424ee6dbd69d0890634d5bf08 -R a7fde02a076af76b8e8f49221c822309 +F ui/SettingsDialog.ui 47b9a31e28ad523f14a1c4cd361270b6babbdf7d +P bf36bf1c733da77a39ab9a8b7c63b892c11ef93c +R acadfb6b4bc5dcb566aa9c59fbff87eb U kostas -Z 13ebcbf30d3401de44fb0e771c5a69f1 +Z 902db766b484bf48a8c240b796fa1687 diff --git a/manifest.uuid b/manifest.uuid index db70859..5b47647 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bf36bf1c733da77a39ab9a8b7c63b892c11ef93c \ No newline at end of file +e422f84c485ada3ae538712434ae64ea80021f8b \ No newline at end of file diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index c58d46f..ba98b3d 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -1097,6 +1097,8 @@ void MainWindow::applySettings() action.Command = store->value("Command").toString(); if(store->contains("Context")) action.Context = static_cast(store->value("Context").toInt()); + if(store->contains("MultipleSelection")) + action.MultipleSelection = store->value("MultipleSelection").toBool(); ++last_action; } @@ -1156,6 +1158,7 @@ void MainWindow::updateSettings() store->setValue("Description", action.Description); store->setValue("Command", action.Command); store->setValue("Context", static_cast(action.Context)); + store->setValue("MultipleSelection", action.MultipleSelection); ++active_actions; } store->endArray(); @@ -2801,6 +2804,24 @@ void MainWindow::on_actionCustomAction_triggered() if(cust_action.IsActive(ACTION_CONTEXT_FOLDERS)) getSelectionPaths(path_selection); + // Trim excess items for single selection + if(!cust_action.MultipleSelection) + { + if(!file_selection.empty()) + { + QString item = *file_selection.begin(); + file_selection.clear(); + file_selection.push_back(item); + path_selection.clear(); + } + else if(!path_selection.empty()) + { + QString item = *path_selection.begin(); + path_selection.clear(); + path_selection.insert(item); + } + } + const QString &wkdir = fossil().getCurrentWorkspace(); SpawnExternalProcess(this, cust_action.Command, file_selection, path_selection, wkdir, uiCallback); diff --git a/src/Settings.h b/src/Settings.h index 06d9831..12db25a 100644 --- a/src/Settings.h +++ b/src/Settings.h @@ -39,7 +39,7 @@ enum CustomActionContext enum { - MAX_CUSTOM_ACTIONS = 5 + MAX_CUSTOM_ACTIONS = 9 }; struct CustomAction @@ -48,6 +48,7 @@ struct CustomAction QString Description; QString Command; CustomActionContext Context; + bool MultipleSelection; CustomAction() { @@ -69,6 +70,7 @@ struct CustomAction Description.clear(); Command.clear(); Context = ACTION_CONTEXT_FILES; + MultipleSelection = true; } }; diff --git a/src/SettingsDialog.cpp b/src/SettingsDialog.cpp index f513e2c..d179e32 100644 --- a/src/SettingsDialog.cpp +++ b/src/SettingsDialog.cpp @@ -165,6 +165,7 @@ void SettingsDialog::GetCustomAction(int index) ui->lineCustomActionDescription->setText(action.Description); ui->lineCustomActionCommand->setText(action.Command); ui->cmbCustomActionContext->setCurrentIndex(action.Context-1); + ui->chkCustomActionMultipleSelection->setChecked(action.MultipleSelection); } //----------------------------------------------------------------------------- @@ -175,6 +176,7 @@ void SettingsDialog::PutCustomAction(int index) action.Description = ui->lineCustomActionDescription->text().trimmed(); action.Command = QDir::fromNativeSeparators(ui->lineCustomActionCommand->text().trimmed()); action.Context = static_cast(ui->cmbCustomActionContext->currentIndex()+1); + action.MultipleSelection = ui->chkCustomActionMultipleSelection->isChecked(); } //----------------------------------------------------------------------------- diff --git a/ui/SettingsDialog.ui b/ui/SettingsDialog.ui index 35c5367..93f1d15 100644 --- a/ui/SettingsDialog.ui +++ b/ui/SettingsDialog.ui @@ -10,7 +10,7 @@ 0 0 449 - 408 + 428
@@ -211,16 +211,6 @@ - - - Context - - - - - - - @@ -233,7 +223,7 @@ - + @@ -263,6 +253,30 @@ + + + + Context + + + + + + + + + + + + + + + + + Multiple Selection + + + From 813443e38046283936907a01dcf33be5c6b7df94 Mon Sep 17 00:00:00 2001 From: kostas Date: Fri, 10 Jul 2015 18:20:19 +0000 Subject: [PATCH 6/6] Allow triggering custom actions via double-clicking a file in the file view FossilOrigin-Name: 4270974c3f9f7fb166a74a9d76c9db8a24428fe5 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/MainWindow.cpp | 24 ++++++++++++++++-------- src/MainWindow.h | 2 +- src/Settings.h | 1 + src/SettingsDialog.cpp | 1 + 6 files changed, 29 insertions(+), 19 deletions(-) diff --git a/manifest b/manifest index e91e2d6..4ecf66c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Custom\sactions\snow\ssupport\sexplicit\ssingle\sselections\n\n -D 2015-07-10T18:06:40.135 +C Allow\striggering\scustom\sactions\svia\sdouble-clicking\sa\sfile\sin\sthe\sfile\sview +D 2015-07-10T18:20:19.694 F .travis.yml 77966888a81c4ceee1fcc79bce842c9667ad8a35 F debian/changelog eb4304dfcb6bb66850ec740838090eb50ce1249b F debian/compat b6abd567fa79cbe0196d093a067271361dc6ca8b @@ -224,8 +224,8 @@ F src/FslSettingsDialog.cpp 2531d3709f0eab66651671e3edead2ca720d07d5 F src/FslSettingsDialog.h dfe2a61884a55a74cbb9206b6f6b482b979725e7 F src/LoggedProcess.cpp 2a1e5c94bc1e57c8984563e66c210e43a14dc60c F src/LoggedProcess.h 85df7c635c807a5a0e8c4763f17a0752aaff7261 -F src/MainWindow.cpp 6b31ae5eca52bc128a0a9dd3d3dc153545de7f8c -F src/MainWindow.h 573ffe960044afb446505949da50e0fb5ec2f75f +F src/MainWindow.cpp 764eb76c1c420ea4677639baae925e5e8fc203d6 +F src/MainWindow.h 765c362ad4937da808276ec321adf4a351ab5b28 F src/RemoteDialog.cpp 8540cc5e2e41c4127ed8a028d84691604fa6ecac F src/RemoteDialog.h 5e0438c2bd7c79b1bb44bfbd58c2181b544a9e5d F src/RevisionDialog.cpp e58c4f8a704f00addebb15d521b76620fdafda79 @@ -233,8 +233,8 @@ F src/RevisionDialog.h b718c3009342eaabad39c8a11a253a4e4fef7a73 F src/SearchBox.cpp d4209c575baa9933e1ce5ed376e785b289a145ba F src/SearchBox.h 0c78d3a68136dab3e0e71b83ae36f22bd2688ab2 F src/Settings.cpp 258d3f466f6a125ce2b8519d6d57a312cbc44a3f -F src/Settings.h c743065c1388ae431aa46c2e02470fb3c08b6a79 -F src/SettingsDialog.cpp 1b092c050753afa96f0d23e85775ecf32f6d939a +F src/Settings.h 0a10b0b83fe804bdc7dac58eed06b5b6ee422055 +F src/SettingsDialog.cpp cab739fb0569bd26550e57f97136c7515fe757fe F src/SettingsDialog.h 5eb3ae2cbb00ab5544e1889860f5376f69fe47cd F src/Utils.cpp 876942a44202611d3c778c67f6d0a344e241a000 F src/Utils.h 4613424aaeb6910689b5821a2dd44ca0b6dd301f @@ -252,7 +252,7 @@ F ui/MainWindow.ui 10181826a25056ed5aba2b23a7d110159be7c043 F ui/RemoteDialog.ui 95a4750d972ed8c49bb10b95db91ff16cfe2dd0b F ui/RevisionDialog.ui 27c3b98c665fec014a50cbf3352c0627f75e68cd F ui/SettingsDialog.ui 47b9a31e28ad523f14a1c4cd361270b6babbdf7d -P bf36bf1c733da77a39ab9a8b7c63b892c11ef93c -R acadfb6b4bc5dcb566aa9c59fbff87eb +P e422f84c485ada3ae538712434ae64ea80021f8b +R 724773d1d3e654260b0257e41d2ffb40 U kostas -Z 902db766b484bf48a8c240b796fa1687 +Z 1d18b22dc355232cae5061179d4d3a7e diff --git a/manifest.uuid b/manifest.uuid index 5b47647..7f8af23 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e422f84c485ada3ae538712434ae64ea80021f8b \ No newline at end of file +4270974c3f9f7fb166a74a9d76c9db8a24428fe5 \ No newline at end of file diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index ba98b3d..1ed61ce 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -1433,6 +1433,8 @@ void MainWindow::on_fileTableView_doubleClicked(const QModelIndex &/*index*/) on_actionOpenFile_triggered(); else if(action==FILE_DLBCLICK_ACTION_OPENCONTAINING) on_actionOpenContaining_triggered(); + else if(action==FILE_DLBCLICK_ACTION_CUSTOM) + invokeCustomAction(0); } //------------------------------------------------------------------------------ @@ -2783,15 +2785,10 @@ void MainWindow::updateCustomActions() } //------------------------------------------------------------------------------ -void MainWindow::on_actionCustomAction_triggered() +void MainWindow::invokeCustomAction(int actionId) { - QAction *action = qobject_cast(sender()); - if(!action) - return; - - int action_id = action->data().toInt(); - Q_ASSERT(action_id < settings.GetCustomActions().size()); - CustomAction &cust_action = settings.GetCustomActions()[action_id]; + Q_ASSERT(actionId < settings.GetCustomActions().size()); + CustomAction &cust_action = settings.GetCustomActions()[actionId]; Q_ASSERT(cust_action.IsValid()); Q_ASSERT(!cust_action.Command.isEmpty()); @@ -2826,3 +2823,14 @@ void MainWindow::on_actionCustomAction_triggered() SpawnExternalProcess(this, cust_action.Command, file_selection, path_selection, wkdir, uiCallback); } + +//------------------------------------------------------------------------------ +void MainWindow::on_actionCustomAction_triggered() +{ + QAction *action = qobject_cast(sender()); + if(!action) + return; + + int action_id = action->data().toInt(); + invokeCustomAction(action_id); +} diff --git a/src/MainWindow.h b/src/MainWindow.h index d40eb7c..d3b07cf 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -54,7 +54,7 @@ private: void selectRootDir(); void mergeRevision(const QString& defaultRevision); void updateCustomActions(); - + void invokeCustomAction(int actionId); void fossilBrowse(const QString &fossilUrl); void dragEnterEvent(class QDragEnterEvent *event); diff --git a/src/Settings.h b/src/Settings.h index 12db25a..63b3e41 100644 --- a/src/Settings.h +++ b/src/Settings.h @@ -25,6 +25,7 @@ enum FileDblClickAction FILE_DLBCLICK_ACTION_DIFF, FILE_DLBCLICK_ACTION_OPEN, FILE_DLBCLICK_ACTION_OPENCONTAINING, + FILE_DLBCLICK_ACTION_CUSTOM, // Custom Action 1 FILE_DLBCLICK_ACTION_MAX }; diff --git a/src/SettingsDialog.cpp b/src/SettingsDialog.cpp index d179e32..4f93e74 100644 --- a/src/SettingsDialog.cpp +++ b/src/SettingsDialog.cpp @@ -17,6 +17,7 @@ SettingsDialog::SettingsDialog(QWidget *parent, Settings &_settings) : ui->cmbDoubleClickAction->addItem(tr("Diff File")); ui->cmbDoubleClickAction->addItem(tr("Open File")); ui->cmbDoubleClickAction->addItem(tr("Open Containing Folder")); + ui->cmbDoubleClickAction->addItem(tr("Custom Action %0").arg(1)); ui->cmbFossilBrowser->addItem(tr("System")); ui->cmbFossilBrowser->addItem(tr("Internal"));