diff --git a/rsrc/misc.png b/rsrc/misc.png new file mode 100644 index 00000000..05c8a388 Binary files /dev/null and b/rsrc/misc.png differ diff --git a/rsrc/misc.svg b/rsrc/misc.svg new file mode 100644 index 00000000..8fe52efc --- /dev/null +++ b/rsrc/misc.svg @@ -0,0 +1,91 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + diff --git a/rsrc/misc@2x.png b/rsrc/misc@2x.png new file mode 100644 index 00000000..f15cf190 Binary files /dev/null and b/rsrc/misc@2x.png differ diff --git a/rsrc/resources.qrc b/rsrc/resources.qrc index 8930fa0a..c0dbc702 100644 --- a/rsrc/resources.qrc +++ b/rsrc/resources.qrc @@ -60,5 +60,7 @@ update@2x.png window.png window@2x.png + misc.png + misc@2x.png diff --git a/src/dialogs/SettingsDialog.cpp b/src/dialogs/SettingsDialog.cpp index 9bec649c..20507d78 100644 --- a/src/dialogs/SettingsDialog.cpp +++ b/src/dialogs/SettingsDialog.cpp @@ -601,6 +601,30 @@ public: } }; +class MiscPanel : public QWidget +{ +public: + MiscPanel(QWidget *parent = nullptr) + : QWidget(parent) + { + Settings *settings = Settings::instance(); + + QLineEdit *sshConfigPathBox = new QLineEdit(settings->value("ssh/configFilePath").toString(), this); + connect(sshConfigPathBox, &QLineEdit::textChanged, [](const QString &text) { + Settings::instance()->setValue("ssh/configFilePath", text); + }); + + QLineEdit *sshKeyPathBox = new QLineEdit(settings->value("ssh/keyFilePath").toString(), this); + connect(sshKeyPathBox, &QLineEdit::textChanged, [](const QString &text) { + Settings::instance()->setValue("ssh/keyFilePath", text); + }); + + QFormLayout *layout = new QFormLayout(this); + layout->addRow(tr("Path to SSH config file:"), sshConfigPathBox); + layout->addRow(tr("Path to default / fallback SSH key file:"), sshKeyPathBox); + } +}; + #ifdef Q_OS_UNIX class TerminalPanel : public QWidget { @@ -800,6 +824,14 @@ SettingsDialog::SettingsDialog(Index index, QWidget *parent) stack->addWidget(new TerminalPanel(this)); #endif + // Add misc panel. + QAction *misc = toolbar->addAction(QIcon(":/misc.png"), tr("Misc")); + misc->setData(Misc); + misc->setActionGroup(actions); + misc->setCheckable(true); + + stack->addWidget(new MiscPanel(this)); + // Hook up edit button. connect(edit, &QPushButton::clicked, stack, [stack] { // Update on save. diff --git a/src/dialogs/SettingsDialog.h b/src/dialogs/SettingsDialog.h index a9ee77f9..c4372116 100644 --- a/src/dialogs/SettingsDialog.h +++ b/src/dialogs/SettingsDialog.h @@ -24,7 +24,8 @@ public: Editor, Update, Plugins, - Terminal + Terminal, + Misc }; SettingsDialog(Index index, QWidget *parent = nullptr); diff --git a/src/git/Remote.cpp b/src/git/Remote.cpp index d18b7b0f..66025d6c 100644 --- a/src/git/Remote.cpp +++ b/src/git/Remote.cpp @@ -38,6 +38,22 @@ const QStringList kKeyKinds = {"ed25519", "rsa", "dsa"}; bool keyFile(QString &key) { QDir dir = QDir::home(); + + QString filePath = Settings::instance()->value("ssh/keyFilePath").toString(); + if (!filePath.isEmpty()) { + QFileInfo file(filePath); + + if (!file.isAbsolute()) + file.setFile(dir.absolutePath() + '/' + file.filePath()); + + if (file.exists()) { + key = file.absoluteFilePath(); + return true; + } else { + return false; + } + } + if (!dir.cd(".ssh")) return false; @@ -136,11 +152,22 @@ public: ConfigFile() { + QString filePath = Settings::instance()->value("ssh/configFilePath").toString(); QDir dir = QDir::home(); - if (!dir.cd(".ssh")) - return; - mFile.reset(new QFile(dir.filePath("config"))); + if (filePath.isEmpty()) { + if (!dir.cd(".ssh")) + return; + + filePath = dir.absoluteFilePath("config"); + } + + QFileInfo file(filePath); + + if (!file.isAbsolute()) + file.setFile(dir.absolutePath() + '/' + file.filePath()); + + mFile.reset(new QFile(file.absoluteFilePath())); if (!mFile->open(QFile::ReadOnly)) return;