diff options
| author | Felix (xq) Queißner <git@mq32.de> | 2020-06-10 00:57:05 +0200 |
|---|---|---|
| committer | Felix (xq) Queißner <git@mq32.de> | 2020-06-10 00:57:05 +0200 |
| commit | e32d4644034f0a6df8dd06c985ccfe74e7dd48f4 (patch) | |
| tree | 24590a649f95a8da54ffa3dbb4081272aa8d74fe /src | |
| parent | 656391ecc0555b3462266b886434ae0f120a401c (diff) | |
| download | kristall-e32d4644034f0a6df8dd06c985ccfe74e7dd48f4.tar.gz | |
Enables desktop services via protocols.
Diffstat (limited to 'src')
| -rw-r--r-- | src/browsertab.cpp | 25 | ||||
| -rw-r--r-- | src/protocolsetup.cpp | 10 | ||||
| -rw-r--r-- | src/protocolsetup.hpp | 4 | ||||
| -rw-r--r-- | src/settingsdialog.cpp | 7 | ||||
| -rw-r--r-- | src/settingsdialog.ui | 34 |
5 files changed, 67 insertions, 13 deletions
diff --git a/src/browsertab.cpp b/src/browsertab.cpp index 2cd4fff..086af38 100644 --- a/src/browsertab.cpp +++ b/src/browsertab.cpp @@ -76,9 +76,9 @@ BrowserTab::~BrowserTab() void BrowserTab::navigateTo(const QUrl &url, PushToHistory mode) { - if(not mainWindow->protocols.isSchemeSupported(url.scheme())) + if(mainWindow->protocols.isSchemeSupported(url.scheme()) != ProtocolSetup::Enabled) { - QMessageBox::warning(this, "Kristall", "Unsupported uri scheme: " + url.scheme()); + QMessageBox::warning(this, "Kristall", "URI scheme not supported or disabled: " + url.scheme()); return; } @@ -529,6 +529,8 @@ void BrowserTab::on_fav_button_clicked() toggleIsFavourite(this->ui->fav_button->isChecked()); } +#include <QDesktopServices> + void BrowserTab::on_text_browser_anchorClicked(const QUrl &url) { @@ -538,11 +540,22 @@ void BrowserTab::on_text_browser_anchorClicked(const QUrl &url) if(real_url.isRelative()) real_url = this->current_location.resolved(url); - if(not mainWindow->protocols.isSchemeSupported(real_url.scheme())) { - QMessageBox::warning(this, "Kristall", QString("Unsupported url: %1").arg(real_url.toString())); - } - else { + auto support = mainWindow->protocols.isSchemeSupported(real_url.scheme()); + + if(support == ProtocolSetup::Enabled) { this->navigateTo(real_url, PushAfterSuccess); + } else { + bool use_os_proxy = global_settings.value("use_os_scheme_handler").toBool(); + + if(use_os_proxy) { + if(not QDesktopServices::openUrl(url)) { + QMessageBox::warning(this, "Kristall", QString("Failed to start system URL handler for\r\n%1").arg(real_url.toString())); + } + } else if(support == ProtocolSetup::Disabled) { + QMessageBox::warning(this, "Kristall", QString("The requested url uses a scheme that has been disabled in the settings:\r\n%1").arg(real_url.toString())); + } else { + QMessageBox::warning(this, "Kristall", QString("The requested url cannot be processed by Kristall:\r\n%1").arg(real_url.toString())); + } } } diff --git a/src/protocolsetup.cpp b/src/protocolsetup.cpp index fcf971a..33b454e 100644 --- a/src/protocolsetup.cpp +++ b/src/protocolsetup.cpp @@ -27,17 +27,17 @@ void ProtocolSetup::load(QSettings &settings) settings.endGroup(); } -bool ProtocolSetup::isSchemeSupported(QString const & _scheme) const +ProtocolSetup::ProtocolSupport ProtocolSetup::isSchemeSupported(QString const & _scheme) const { auto scheme = _scheme.toLower(); -#define MAC(X) if(scheme == #X) return this->X; +#define MAC(X) if(scheme == #X) return this->X ? Enabled : Disabled; PROTOCOLS(MAC) #undef MAC // built-in schemes: - if(scheme == "about") return true; - if(scheme == "file") return true; + if(scheme == "about") return Enabled; + if(scheme == "file") return Enabled; - return false; + return Unsupported; } diff --git a/src/protocolsetup.hpp b/src/protocolsetup.hpp index 3cf3ab1..db163de 100644 --- a/src/protocolsetup.hpp +++ b/src/protocolsetup.hpp @@ -22,7 +22,9 @@ struct ProtocolSetup void load(QSettings & settings); - bool isSchemeSupported(QString const & scheme) const; + + enum ProtocolSupport { Disabled, Unsupported, Enabled }; + ProtocolSupport isSchemeSupported(QString const & scheme) const; }; #endif // PROTOCOLSETUP_HPP diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp index c71225c..3581f03 100644 --- a/src/settingsdialog.cpp +++ b/src/settingsdialog.cpp @@ -50,6 +50,12 @@ SettingsDialog::SettingsDialog(QWidget *parent) : this->ui->texthl_off->setChecked(true); } + if(global_settings.value("use_os_scheme_handler").toBool()) { + this->ui->scheme_os_default->setChecked(true); + } else { + this->ui->scheme_error->setChecked(true); + } + int items = global_settings.beginReadArray("Themes"); this->predefined_styles.clear(); @@ -438,6 +444,7 @@ void SettingsDialog::on_SettingsDialog_accepted() global_settings.setValue("gophermap_display", this->ui->gophermap_text->isChecked() ? "text" : "rendered"); global_settings.setValue("text_display", this->ui->fancypants_off->isChecked() ? "plain" : "fancy"); global_settings.setValue("text_decoration", this->ui->texthl_on->isChecked()); + global_settings.setValue("use_os_scheme_handler", this->ui->scheme_os_default->isChecked()); global_settings.beginWriteArray("Themes", this->predefined_styles.size()); diff --git a/src/settingsdialog.ui b/src/settingsdialog.ui index 02cccee..75b84fe 100644 --- a/src/settingsdialog.ui +++ b/src/settingsdialog.ui @@ -202,6 +202,37 @@ </item> </layout> </item> + <item row="6" column="0"> + <widget class="QLabel" name="label_22"> + <property name="text"> + <string>Unknown Scheme</string> + </property> + </widget> + </item> + <item row="6" column="1"> + <layout class="QHBoxLayout" name="horizontalLayout_7"> + <item> + <widget class="QRadioButton" name="scheme_error"> + <property name="text"> + <string>Display error message</string> + </property> + <attribute name="buttonGroup"> + <string notr="true">buttonGroup</string> + </attribute> + </widget> + </item> + <item> + <widget class="QRadioButton" name="scheme_os_default"> + <property name="text"> + <string>Use OS default handler</string> + </property> + <attribute name="buttonGroup"> + <string notr="true">buttonGroup</string> + </attribute> + </widget> + </item> + </layout> + </item> </layout> </widget> <widget class="QWidget" name="style_tab"> @@ -811,8 +842,9 @@ </connection> </connections> <buttongroups> + <buttongroup name="gophermapBtnGroup"/> <buttongroup name="textHighlightsBtnGroup"/> <buttongroup name="textRenderingBtnGroup"/> - <buttongroup name="gophermapBtnGroup"/> + <buttongroup name="buttonGroup"/> </buttongroups> </ui> |
