#include "settingsdialog.h" #include "src/net/instance.h" #include "src/settings_interface.h" #include #include #include #include #include #include #include SettingsDialog::SettingsDialog(QWidget* parent) : QDialog(parent, Qt::Dialog), ui(new Ui::SettingsDialog) { ui->setupUi(this); // Create connections for each dialog button box button, as this is the best way to do it connect(ui->buttonBox->button(QDialogButtonBox::RestoreDefaults), &QPushButton::clicked, this, &SettingsDialog::defaults_button_clicked); connect(ui->buttonBox->button(QDialogButtonBox::Apply), &QPushButton::clicked, this, &SettingsDialog::apply_button_clicked); connect(ui->buttonBox->button(QDialogButtonBox::Cancel), &QPushButton::clicked, this, &SettingsDialog::cancel_button_clicked); #ifndef MASTODONPP_BUILD // Disable unusable settings // TODO: This should be more precise if we ever add other Fedi APIs, as it would disable all of them and not only the Mastodon one. ui->remoteInstanceGroupBox->setDisabled(true); ui->remoteInstanceGroupBox->setToolTip(tr("Setting disabled as not built with mastodonpp support")); #endif update_ui(); } SettingsDialog::~SettingsDialog() { delete ui; } /* ----- General tab ----- */ void SettingsDialog::on_timezoneCombo_activated(int index) { if (update_ui_in_progress) return; settings_interface.write_setting("ui/timezone", index); } /* ----- Network tab ----- */ void SettingsDialog::on_connectToTheInternetCheckBox_clicked(bool checked) { if (update_ui_in_progress) return; settings_interface.write_setting("net/access_internet", checked); } void SettingsDialog::on_DownloadCustomEmojiCheckBox_clicked(bool checked) { if (update_ui_in_progress) return; settings_interface.write_setting("net/download_emoji", checked); } void SettingsDialog::on_downloadAttachmentsCheckBox_clicked(bool checked) { if (update_ui_in_progress) return; settings_interface.write_setting("net/download_attachments", checked); } void SettingsDialog::on_instanceTypeComboBox_activated(int index) { if (update_ui_in_progress) return; settings_interface.write_setting("net/instance/type", index); } void SettingsDialog::on_instanceAddressLineEdit_editingFinished() { if (update_ui_in_progress) return; settings_interface.write_setting("net/instance/address", ui->instanceAddressLineEdit->text()); } void SettingsDialog::on_tokenLineEdit_editingFinished() { if (update_ui_in_progress) return; settings_interface.write_setting("net/instance/token", ui->tokenLineEdit->text()); } void SettingsDialog::on_instanceActionsLabel_linkActivated(const QString& link) { if (link == "action:fill-address") { update_ui_in_progress = true; ui->instanceAddressLineEdit->setText(instance_address); update_ui_in_progress = false; } else if (link == "action:request-token") { InstancePtr instance = Instance::create_instance((AppSettingsTypes::InstanceType)ui->instanceTypeComboBox->currentIndex()); QString url = instance->oauth2_step1(); if (not QDesktopServices::openUrl(url)) QMessageBox::information(this, tr("Navigate to this URL"), tr("Please open the following URL in your browser: %1").arg(url)); Instance::OAuth2Step2 step2 = {.ok = false}; while (not step2.ok) { bool ok; QString code = QInputDialog::getText(this, tr("Enter authorization code"), tr("Enter the given authentification code:"), QLineEdit::Normal, "", &ok); if (code.isEmpty()) return; // User canceled if (ok) step2 = instance->oauth2_step2(code); } // Do not set update_ui_in_progress as we want the new text to be seen as new text by settings_interface (through on_tokenLineEdit_editingFinished()) ui->tokenLineEdit->setText(step2.token); on_tokenLineEdit_editingFinished(); // Make sure that the change has been noticed as sometimes it isn't } } /* ----- Dialog & setting saving/restoring ----- */ // OK button pressed, save and apply new settings void SettingsDialog::apply_button_clicked() { settings_interface.commit(); emit QDialog::accept(); // Closes the dialog with return code } // Cancel button pressed, discard new settings void SettingsDialog::cancel_button_clicked() { emit QDialog::reject(); // Closes the dialog with return code } // Restore defaults button pressed, reset settings void SettingsDialog::defaults_button_clicked() { settings_interface.clear_all(); update_ui(); } // Update the UI's setting values with the values in settings_interface. void SettingsDialog::update_ui() { update_ui_in_progress = true; // General tab ui->timezoneCombo->setCurrentIndex(settings_interface.read_setting("ui/timezone").value()); // Network tab ui->connectToTheInternetCheckBox->setChecked(settings_interface.read_setting("net/access_internet").value()); ui->DownloadCustomEmojiCheckBox->setChecked(settings_interface.read_setting("net/download_emoji").value()); ui->downloadAttachmentsCheckBox->setChecked(settings_interface.read_setting("net/download_attachments").value()); // Instance frame ui->instanceTypeComboBox->setCurrentIndex(settings_interface.read_setting("net/instance/type").value()); ui->instanceAddressLineEdit->setText(settings_interface.read_setting("net/instance/address").value()); ui->tokenLineEdit->setText(settings_interface.read_setting("net/instance/token").value()); update_ui_in_progress = false; } void SettingsDialog::set_instance_address(const QString &url) { instance_address = url; }