Working on per acc proxy.

This commit is contained in:
Martin Rotter 2021-01-20 14:23:58 +01:00
parent 18a1d0e595
commit ff969016db
29 changed files with 484 additions and 430 deletions

View File

@ -0,0 +1,39 @@
// For license of this file, see <project-root-folder>/LICENSE.md.
#include "gui/networkproxydetails.h"
#include "gui/guiutilities.h"
#include <QNetworkProxy>
NetworkProxyDetails::NetworkProxyDetails(QWidget* parent) : QWidget(parent) {
m_ui.setupUi(this);
GuiUtilities::setLabelAsNotice(*m_ui.m_lblProxyInfo, false);
connect(m_ui.m_cmbProxyType, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this,
&NetworkProxyDetails::onProxyTypeChanged);
connect(m_ui.m_checkShowPassword, &QCheckBox::stateChanged, this, &NetworkProxyDetails::displayProxyPassword);
m_ui.m_cmbProxyType->addItem(tr("No proxy"), QNetworkProxy::ProxyType::NoProxy);
m_ui.m_cmbProxyType->addItem(tr("System proxy"), QNetworkProxy::ProxyType::DefaultProxy);
m_ui.m_cmbProxyType->addItem(tr("Socks5"), QNetworkProxy::ProxyType::Socks5Proxy);
m_ui.m_cmbProxyType->addItem(tr("Http"), QNetworkProxy::ProxyType::HttpProxy);
displayProxyPassword(Qt::CheckState::Unchecked);
}
void NetworkProxyDetails::displayProxyPassword(int state) {
if (state == Qt::CheckState::Checked) {
m_ui.m_txtProxyPassword->setEchoMode(QLineEdit::EchoMode::Normal);
}
else {
m_ui.m_txtProxyPassword->setEchoMode(QLineEdit::EchoMode::PasswordEchoOnEdit);
}
}
void NetworkProxyDetails::onProxyTypeChanged(int index) {
const QNetworkProxy::ProxyType selected_type = static_cast<QNetworkProxy::ProxyType>(m_ui.m_cmbProxyType->itemData(index).toInt());
const bool is_proxy_selected = selected_type != QNetworkProxy::NoProxy && selected_type != QNetworkProxy::DefaultProxy;
m_ui.m_proxyDetails->setEnabled(is_proxy_selected);
}

View File

@ -0,0 +1,24 @@
// For license of this file, see <project-root-folder>/LICENSE.md.
#ifndef NETWORKPROXYDETAILS_H
#define NETWORKPROXYDETAILS_H
#include <QWidget>
#include "ui_networkproxydetails.h"
class NetworkProxyDetails : public QWidget {
Q_OBJECT
public:
explicit NetworkProxyDetails(QWidget* parent = nullptr);
private slots:
void displayProxyPassword(int state);
void onProxyTypeChanged(int index);
public:
Ui::NetworkProxyDetails m_ui;
};
#endif // NETWORKPROXYDETAILS_H

View File

@ -0,0 +1,194 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>NetworkProxyDetails</class>
<widget class="QWidget" name="NetworkProxyDetails">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>507</width>
<height>257</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QFormLayout" name="formLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="m_lblProxyType">
<property name="text">
<string extracomment="Proxy server type.">Type</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>m_cmbProxyType</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="m_cmbProxyType"/>
</item>
<item row="1" column="0" colspan="2">
<widget class="QWidget" name="m_proxyDetails" native="true">
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="m_lblProxyHost">
<property name="text">
<string>Host</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>m_txtProxyHost</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
<widget class="QLineEdit" name="m_txtProxyHost">
<property name="enabled">
<bool>true</bool>
</property>
<property name="placeholderText">
<string>Hostname or IP of your proxy server</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="m_lblProxyPort">
<property name="text">
<string>Port</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>m_spinProxyPort</cstring>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="m_spinProxyPort">
<property name="enabled">
<bool>true</bool>
</property>
<property name="maximum">
<number>65535</number>
</property>
<property name="value">
<number>80</number>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="0">
<widget class="QLabel" name="m_lblProxyUsername">
<property name="text">
<string>Username</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>m_txtProxyUsername</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="m_txtProxyUsername">
<property name="enabled">
<bool>true</bool>
</property>
<property name="placeholderText">
<string>Your username for proxy server authentication</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="m_lblProxyPassword">
<property name="text">
<string>Password</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>m_txtProxyPassword</cstring>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="m_txtProxyPassword">
<property name="enabled">
<bool>true</bool>
</property>
<property name="echoMode">
<enum>QLineEdit::PasswordEchoOnEdit</enum>
</property>
<property name="placeholderText">
<string>Your password for proxy server authentication</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QCheckBox" name="m_checkShowPassword">
<property name="enabled">
<bool>true</bool>
</property>
<property name="text">
<string>Display password</string>
</property>
</widget>
</item>
<item row="4" column="0" colspan="2">
<widget class="QLabel" name="m_lblProxyInfo">
<property name="text">
<string>Note that these settings are applied only on newly established connections.</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="5" column="0" colspan="2">
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
<item row="2" column="0" colspan="2">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -3,6 +3,7 @@
#include "gui/settings/settingsbrowsermail.h" #include "gui/settings/settingsbrowsermail.h"
#include "gui/guiutilities.h" #include "gui/guiutilities.h"
#include "gui/networkproxydetails.h"
#include "miscellaneous/application.h" #include "miscellaneous/application.h"
#include "miscellaneous/externaltool.h" #include "miscellaneous/externaltool.h"
#include "network-web/silentnetworkaccessmanager.h" #include "network-web/silentnetworkaccessmanager.h"
@ -13,12 +14,13 @@
#include <QNetworkProxy> #include <QNetworkProxy>
SettingsBrowserMail::SettingsBrowserMail(Settings* settings, QWidget* parent) SettingsBrowserMail::SettingsBrowserMail(Settings* settings, QWidget* parent)
: SettingsPanel(settings, parent), m_ui(new Ui::SettingsBrowserMail) { : SettingsPanel(settings, parent), m_proxyDetails(new NetworkProxyDetails(this)), m_ui(new Ui::SettingsBrowserMail) {
m_ui->setupUi(this); m_ui->setupUi(this);
m_ui->m_tabBrowserProxy->addTab(m_proxyDetails, tr("Network proxy"));
GuiUtilities::setLabelAsNotice(*m_ui->label, false); GuiUtilities::setLabelAsNotice(*m_ui->label, false);
GuiUtilities::setLabelAsNotice(*m_ui->m_lblExternalEmailInfo, false); GuiUtilities::setLabelAsNotice(*m_ui->m_lblExternalEmailInfo, false);
GuiUtilities::setLabelAsNotice(*m_ui->m_lblProxyInfo, false);
GuiUtilities::setLabelAsNotice(*m_ui->m_lblToolInfo, false); GuiUtilities::setLabelAsNotice(*m_ui->m_lblToolInfo, false);
#if defined(USE_WEBENGINE) #if defined(USE_WEBENGINE)
@ -30,12 +32,12 @@ SettingsBrowserMail::SettingsBrowserMail(Settings* settings, QWidget* parent)
m_ui->m_listTools->setHeaderLabels(QStringList() << tr("Executable") << tr("Parameters")); m_ui->m_listTools->setHeaderLabels(QStringList() << tr("Executable") << tr("Parameters"));
m_ui->m_listTools->header()->setSectionResizeMode(0, QHeaderView::ResizeToContents); m_ui->m_listTools->header()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
connect(m_ui->m_cmbProxyType, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, connect(m_proxyDetails->m_ui.m_cmbProxyType, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this,
&SettingsBrowserMail::dirtifySettings); &SettingsBrowserMail::dirtifySettings);
connect(m_ui->m_txtProxyHost, &QLineEdit::textChanged, this, &SettingsBrowserMail::dirtifySettings); connect(m_proxyDetails->m_ui.m_txtProxyHost, &QLineEdit::textChanged, this, &SettingsBrowserMail::dirtifySettings);
connect(m_ui->m_txtProxyPassword, &QLineEdit::textChanged, this, &SettingsBrowserMail::dirtifySettings); connect(m_proxyDetails->m_ui.m_txtProxyPassword, &QLineEdit::textChanged, this, &SettingsBrowserMail::dirtifySettings);
connect(m_ui->m_txtProxyUsername, &QLineEdit::textChanged, this, &SettingsBrowserMail::dirtifySettings); connect(m_proxyDetails->m_ui.m_txtProxyUsername, &QLineEdit::textChanged, this, &SettingsBrowserMail::dirtifySettings);
connect(m_ui->m_spinProxyPort, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), this, connect(m_proxyDetails->m_ui.m_spinProxyPort, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), this,
&SettingsBrowserMail::dirtifySettings); &SettingsBrowserMail::dirtifySettings);
connect(m_ui->m_grpCustomExternalBrowser, &QGroupBox::toggled, this, &SettingsBrowserMail::dirtifySettings); connect(m_ui->m_grpCustomExternalBrowser, &QGroupBox::toggled, this, &SettingsBrowserMail::dirtifySettings);
connect(m_ui->m_grpCustomExternalEmail, &QGroupBox::toggled, this, &SettingsBrowserMail::dirtifySettings); connect(m_ui->m_grpCustomExternalEmail, &QGroupBox::toggled, this, &SettingsBrowserMail::dirtifySettings);
@ -43,9 +45,6 @@ SettingsBrowserMail::SettingsBrowserMail(Settings* settings, QWidget* parent)
connect(m_ui->m_txtExternalBrowserExecutable, &QLineEdit::textChanged, this, &SettingsBrowserMail::dirtifySettings); connect(m_ui->m_txtExternalBrowserExecutable, &QLineEdit::textChanged, this, &SettingsBrowserMail::dirtifySettings);
connect(m_ui->m_txtExternalEmailArguments, &QLineEdit::textChanged, this, &SettingsBrowserMail::dirtifySettings); connect(m_ui->m_txtExternalEmailArguments, &QLineEdit::textChanged, this, &SettingsBrowserMail::dirtifySettings);
connect(m_ui->m_txtExternalEmailExecutable, &QLineEdit::textChanged, this, &SettingsBrowserMail::dirtifySettings); connect(m_ui->m_txtExternalEmailExecutable, &QLineEdit::textChanged, this, &SettingsBrowserMail::dirtifySettings);
connect(m_ui->m_cmbProxyType, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this,
&SettingsBrowserMail::onProxyTypeChanged);
connect(m_ui->m_checkShowPassword, &QCheckBox::stateChanged, this, &SettingsBrowserMail::displayProxyPassword);
connect(m_ui->m_cmbExternalBrowserPreset, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, connect(m_ui->m_cmbExternalBrowserPreset, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this,
&SettingsBrowserMail::changeDefaultBrowserArguments); &SettingsBrowserMail::changeDefaultBrowserArguments);
connect(m_ui->m_btnExternalBrowserExecutable, &QPushButton::clicked, this, &SettingsBrowserMail::selectBrowserExecutable); connect(m_ui->m_btnExternalBrowserExecutable, &QPushButton::clicked, this, &SettingsBrowserMail::selectBrowserExecutable);
@ -90,31 +89,6 @@ void SettingsBrowserMail::selectBrowserExecutable() {
} }
} }
void SettingsBrowserMail::displayProxyPassword(int state) {
if (state == Qt::Checked) {
m_ui->m_txtProxyPassword->setEchoMode(QLineEdit::Normal);
}
else {
m_ui->m_txtProxyPassword->setEchoMode(QLineEdit::PasswordEchoOnEdit);
}
}
void SettingsBrowserMail::onProxyTypeChanged(int index) {
const QNetworkProxy::ProxyType selected_type = static_cast<QNetworkProxy::ProxyType>(m_ui->m_cmbProxyType->itemData(index).toInt());
const bool is_proxy_selected = selected_type != QNetworkProxy::NoProxy && selected_type != QNetworkProxy::DefaultProxy;
m_ui->m_txtProxyHost->setEnabled(is_proxy_selected);
m_ui->m_txtProxyPassword->setEnabled(is_proxy_selected);
m_ui->m_txtProxyUsername->setEnabled(is_proxy_selected);
m_ui->m_spinProxyPort->setEnabled(is_proxy_selected);
m_ui->m_checkShowPassword->setEnabled(is_proxy_selected);
m_ui->m_lblProxyHost->setEnabled(is_proxy_selected);
m_ui->m_lblProxyInfo->setEnabled(is_proxy_selected);
m_ui->m_lblProxyPassword->setEnabled(is_proxy_selected);
m_ui->m_lblProxyPort->setEnabled(is_proxy_selected);
m_ui->m_lblProxyUsername->setEnabled(is_proxy_selected);
}
QList<ExternalTool> SettingsBrowserMail::externalTools() const { QList<ExternalTool> SettingsBrowserMail::externalTools() const {
QList<ExternalTool> list; QList<ExternalTool> list;
@ -181,19 +155,15 @@ void SettingsBrowserMail::loadSettings() {
SETTING(Browser::CustomExternalEmailExecutable)).toString()); SETTING(Browser::CustomExternalEmailExecutable)).toString());
m_ui->m_txtExternalEmailArguments->setText(settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailArguments)).toString()); m_ui->m_txtExternalEmailArguments->setText(settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailArguments)).toString());
m_ui->m_grpCustomExternalEmail->setChecked(settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailEnabled)).toBool()); m_ui->m_grpCustomExternalEmail->setChecked(settings()->value(GROUP(Browser), SETTING(Browser::CustomExternalEmailEnabled)).toBool());
m_ui->m_cmbProxyType->addItem(tr("No proxy"), QNetworkProxy::NoProxy);
m_ui->m_cmbProxyType->addItem(tr("System proxy"), QNetworkProxy::DefaultProxy);
m_ui->m_cmbProxyType->addItem(tr("Socks5"), QNetworkProxy::Socks5Proxy);
m_ui->m_cmbProxyType->addItem(tr("Http"), QNetworkProxy::HttpProxy);
// Load the settings. // Load the settings.
QNetworkProxy::ProxyType selected_proxy_type = static_cast<QNetworkProxy::ProxyType>(settings()->value(GROUP(Proxy), QNetworkProxy::ProxyType selected_proxy_type = static_cast<QNetworkProxy::ProxyType>(settings()->value(GROUP(Proxy),
SETTING(Proxy::Type)).toInt()); SETTING(Proxy::Type)).toInt());
m_ui->m_cmbProxyType->setCurrentIndex(m_ui->m_cmbProxyType->findData(selected_proxy_type)); m_proxyDetails->m_ui.m_cmbProxyType->setCurrentIndex(m_proxyDetails->m_ui.m_cmbProxyType->findData(selected_proxy_type));
m_ui->m_txtProxyHost->setText(settings()->value(GROUP(Proxy), SETTING(Proxy::Host)).toString()); m_proxyDetails->m_ui.m_txtProxyHost->setText(settings()->value(GROUP(Proxy), SETTING(Proxy::Host)).toString());
m_ui->m_txtProxyUsername->setText(settings()->value(GROUP(Proxy), SETTING(Proxy::Username)).toString()); m_proxyDetails->m_ui.m_txtProxyUsername->setText(settings()->value(GROUP(Proxy), SETTING(Proxy::Username)).toString());
m_ui->m_txtProxyPassword->setText(settings()->password(GROUP(Proxy), SETTING(Proxy::Password)).toString()); m_proxyDetails->m_ui.m_txtProxyPassword->setText(settings()->password(GROUP(Proxy), SETTING(Proxy::Password)).toString());
m_ui->m_spinProxyPort->setValue(settings()->value(GROUP(Proxy), SETTING(Proxy::Port)).toInt()); m_proxyDetails->m_ui.m_spinProxyPort->setValue(settings()->value(GROUP(Proxy), SETTING(Proxy::Port)).toInt());
setExternalTools(ExternalTool::toolsFromSettings()); setExternalTools(ExternalTool::toolsFromSettings());
onEndLoadSettings(); onEndLoadSettings();
@ -215,11 +185,11 @@ void SettingsBrowserMail::saveSettings() {
settings()->setValue(GROUP(Browser), Browser::CustomExternalEmailExecutable, m_ui->m_txtExternalEmailExecutable->text()); settings()->setValue(GROUP(Browser), Browser::CustomExternalEmailExecutable, m_ui->m_txtExternalEmailExecutable->text());
settings()->setValue(GROUP(Browser), Browser::CustomExternalEmailArguments, m_ui->m_txtExternalEmailArguments->text()); settings()->setValue(GROUP(Browser), Browser::CustomExternalEmailArguments, m_ui->m_txtExternalEmailArguments->text());
settings()->setValue(GROUP(Browser), Browser::CustomExternalEmailEnabled, m_ui->m_grpCustomExternalEmail->isChecked()); settings()->setValue(GROUP(Browser), Browser::CustomExternalEmailEnabled, m_ui->m_grpCustomExternalEmail->isChecked());
settings()->setValue(GROUP(Proxy), Proxy::Type, m_ui->m_cmbProxyType->itemData(m_ui->m_cmbProxyType->currentIndex())); settings()->setValue(GROUP(Proxy), Proxy::Type, m_proxyDetails->m_ui.m_cmbProxyType->itemData(m_proxyDetails->m_ui.m_cmbProxyType->currentIndex()));
settings()->setValue(GROUP(Proxy), Proxy::Host, m_ui->m_txtProxyHost->text()); settings()->setValue(GROUP(Proxy), Proxy::Host, m_proxyDetails->m_ui.m_txtProxyHost->text());
settings()->setValue(GROUP(Proxy), Proxy::Username, m_ui->m_txtProxyUsername->text()); settings()->setValue(GROUP(Proxy), Proxy::Username, m_proxyDetails->m_ui.m_txtProxyUsername->text());
settings()->setPassword(GROUP(Proxy), Proxy::Password, m_ui->m_txtProxyPassword->text()); settings()->setPassword(GROUP(Proxy), Proxy::Password, m_proxyDetails->m_ui.m_txtProxyPassword->text());
settings()->setValue(GROUP(Proxy), Proxy::Port, m_ui->m_spinProxyPort->value()); settings()->setValue(GROUP(Proxy), Proxy::Port, m_proxyDetails->m_ui.m_spinProxyPort->value());
auto tools = externalTools(); auto tools = externalTools();

View File

@ -6,8 +6,11 @@
#include "gui/settings/settingspanel.h" #include "gui/settings/settingspanel.h"
#include "miscellaneous/externaltool.h" #include "miscellaneous/externaltool.h"
#include "ui_settingsbrowsermail.h" #include "ui_settingsbrowsermail.h"
class NetworkProxyDetails;
class SettingsBrowserMail : public SettingsPanel { class SettingsBrowserMail : public SettingsPanel {
Q_OBJECT Q_OBJECT
@ -26,13 +29,12 @@ class SettingsBrowserMail : public SettingsPanel {
void selectBrowserExecutable(); void selectBrowserExecutable();
void changeDefaultEmailArguments(int index); void changeDefaultEmailArguments(int index);
void selectEmailExecutable(); void selectEmailExecutable();
void displayProxyPassword(int state);
void onProxyTypeChanged(int index);
private: private:
QList<ExternalTool> externalTools() const; QList<ExternalTool> externalTools() const;
void setExternalTools(const QList<ExternalTool>& list); void setExternalTools(const QList<ExternalTool>& list);
NetworkProxyDetails* m_proxyDetails;
Ui::SettingsBrowserMail* m_ui; Ui::SettingsBrowserMail* m_ui;
}; };

View File

@ -335,167 +335,6 @@
</item> </item>
</layout> </layout>
</widget> </widget>
<widget class="QWidget" name="m_tabProxy">
<attribute name="title">
<string>Proxy</string>
</attribute>
<layout class="QFormLayout" name="formLayout_6">
<item row="0" column="0">
<widget class="QLabel" name="m_lblProxyType">
<property name="text">
<string extracomment="Proxy server type.">Type</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>m_cmbProxyType</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="m_cmbProxyType"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="m_lblProxyHost">
<property name="text">
<string>Host</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>m_txtProxyHost</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
<widget class="QLineEdit" name="m_txtProxyHost">
<property name="enabled">
<bool>true</bool>
</property>
<property name="placeholderText">
<string>Hostname or IP of your proxy server</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="m_lblProxyPort">
<property name="text">
<string>Port</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>m_spinProxyPort</cstring>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="m_spinProxyPort">
<property name="enabled">
<bool>true</bool>
</property>
<property name="maximum">
<number>65535</number>
</property>
<property name="value">
<number>80</number>
</property>
</widget>
</item>
</layout>
</item>
<item row="2" column="0">
<widget class="QLabel" name="m_lblProxyUsername">
<property name="text">
<string>Username</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>m_txtProxyUsername</cstring>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="m_txtProxyUsername">
<property name="enabled">
<bool>true</bool>
</property>
<property name="placeholderText">
<string>Your username for proxy server authentication</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="m_lblProxyPassword">
<property name="text">
<string>Password</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>m_txtProxyPassword</cstring>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="m_txtProxyPassword">
<property name="enabled">
<bool>true</bool>
</property>
<property name="echoMode">
<enum>QLineEdit::PasswordEchoOnEdit</enum>
</property>
<property name="placeholderText">
<string>Your password for proxy server authentication</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QCheckBox" name="m_checkShowPassword">
<property name="enabled">
<bool>true</bool>
</property>
<property name="text">
<string>Display password</string>
</property>
</widget>
</item>
<item row="5" column="0" colspan="2">
<widget class="QLabel" name="m_lblProxyInfo">
<property name="text">
<string>Note that these settings are applied only on newly established connections.</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="6" column="0" colspan="2">
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget> </widget>
</item> </item>
</layout> </layout>
@ -516,12 +355,6 @@
<tabstop>m_listTools</tabstop> <tabstop>m_listTools</tabstop>
<tabstop>m_btnAddTool</tabstop> <tabstop>m_btnAddTool</tabstop>
<tabstop>m_btnDeleteTool</tabstop> <tabstop>m_btnDeleteTool</tabstop>
<tabstop>m_cmbProxyType</tabstop>
<tabstop>m_txtProxyHost</tabstop>
<tabstop>m_spinProxyPort</tabstop>
<tabstop>m_txtProxyUsername</tabstop>
<tabstop>m_txtProxyPassword</tabstop>
<tabstop>m_checkShowPassword</tabstop>
</tabstops> </tabstops>
<resources/> <resources/>
<connections/> <connections/>

View File

@ -98,6 +98,7 @@ HEADERS += core/feeddownloader.h \
gui/toolbareditor.h \ gui/toolbareditor.h \
gui/treeviewcolumnsmenu.h \ gui/treeviewcolumnsmenu.h \
gui/widgetwithstatus.h \ gui/widgetwithstatus.h \
gui/networkproxydetails.h \
miscellaneous/application.h \ miscellaneous/application.h \
miscellaneous/autosaver.h \ miscellaneous/autosaver.h \
miscellaneous/databasecleaner.h \ miscellaneous/databasecleaner.h \
@ -166,6 +167,7 @@ HEADERS += core/feeddownloader.h \
services/standard/atomparser.h \ services/standard/atomparser.h \
services/standard/feedparser.h \ services/standard/feedparser.h \
services/abstract/gui/authenticationdetails.h \ services/abstract/gui/authenticationdetails.h \
services/standard/gui/formeditstandardaccount.h \
services/standard/gui/formstandardcategorydetails.h \ services/standard/gui/formstandardcategorydetails.h \
services/standard/gui/formstandardfeeddetails.h \ services/standard/gui/formstandardfeeddetails.h \
services/standard/gui/formstandardimportexport.h \ services/standard/gui/formstandardimportexport.h \
@ -260,6 +262,7 @@ SOURCES += core/feeddownloader.cpp \
gui/toolbareditor.cpp \ gui/toolbareditor.cpp \
gui/treeviewcolumnsmenu.cpp \ gui/treeviewcolumnsmenu.cpp \
gui/widgetwithstatus.cpp \ gui/widgetwithstatus.cpp \
gui/networkproxydetails.cpp \
miscellaneous/application.cpp \ miscellaneous/application.cpp \
miscellaneous/autosaver.cpp \ miscellaneous/autosaver.cpp \
miscellaneous/databasecleaner.cpp \ miscellaneous/databasecleaner.cpp \
@ -322,6 +325,7 @@ SOURCES += core/feeddownloader.cpp \
services/standard/atomparser.cpp \ services/standard/atomparser.cpp \
services/standard/feedparser.cpp \ services/standard/feedparser.cpp \
services/abstract/gui/authenticationdetails.cpp \ services/abstract/gui/authenticationdetails.cpp \
services/standard/gui/formeditstandardaccount.cpp \
services/standard/gui/formstandardcategorydetails.cpp \ services/standard/gui/formstandardcategorydetails.cpp \
services/standard/gui/formstandardfeeddetails.cpp \ services/standard/gui/formstandardfeeddetails.cpp \
services/standard/gui/formstandardimportexport.cpp \ services/standard/gui/formstandardimportexport.cpp \
@ -373,6 +377,7 @@ FORMS += gui/dialogs/formabout.ui \
gui/settings/settingslocalization.ui \ gui/settings/settingslocalization.ui \
gui/settings/settingsshortcuts.ui \ gui/settings/settingsshortcuts.ui \
gui/toolbareditor.ui \ gui/toolbareditor.ui \
gui/networkproxydetails.ui \
network-web/downloaditem.ui \ network-web/downloaditem.ui \
network-web/downloadmanager.ui \ network-web/downloadmanager.ui \
services/abstract/gui/formaccountdetails.ui \ services/abstract/gui/formaccountdetails.ui \

View File

@ -1841,6 +1841,7 @@ int DatabaseQueries::createBaseAccount(const QSqlDatabase& db, const QString& co
void DatabaseQueries::editBaseAccount(const QSqlDatabase& db, ServiceRoot* account, bool* ok) { void DatabaseQueries::editBaseAccount(const QSqlDatabase& db, ServiceRoot* account, bool* ok) {
Q_UNUSED(account) Q_UNUSED(account)
Q_UNUSED(ok) Q_UNUSED(ok)
Q_UNUSED(db)
// TODO: edit proxy etc // TODO: edit proxy etc
} }
@ -2406,7 +2407,7 @@ QList<ServiceRoot*> DatabaseQueries::getGmailAccounts(const QSqlDatabase& db, bo
if (query.exec("SELECT * FROM GmailAccounts;")) { if (query.exec("SELECT * FROM GmailAccounts;")) {
while (query.next()) { while (query.next()) {
auto* root = new GmailServiceRoot(nullptr); auto* root = new GmailServiceRoot();
root->setId(query.value(0).toInt()); root->setId(query.value(0).toInt());
root->setAccountId(query.value(0).toInt()); root->setAccountId(query.value(0).toInt());
@ -2504,7 +2505,7 @@ QList<ServiceRoot*> DatabaseQueries::getInoreaderAccounts(const QSqlDatabase& db
if (query.exec("SELECT * FROM InoreaderAccounts;")) { if (query.exec("SELECT * FROM InoreaderAccounts;")) {
while (query.next()) { while (query.next()) {
auto* root = new InoreaderServiceRoot(nullptr); auto* root = new InoreaderServiceRoot();
root->setId(query.value(0).toInt()); root->setId(query.value(0).toInt());
root->setAccountId(query.value(0).toInt()); root->setAccountId(query.value(0).toInt());

View File

@ -3,31 +3,22 @@
#include "services/abstract/gui/formaccountdetails.h" #include "services/abstract/gui/formaccountdetails.h"
#include "gui/guiutilities.h" #include "gui/guiutilities.h"
#include "gui/networkproxydetails.h"
#include "miscellaneous/application.h" #include "miscellaneous/application.h"
#include "miscellaneous/iconfactory.h" #include "miscellaneous/iconfactory.h"
#include "services/abstract/serviceroot.h" #include "services/abstract/serviceroot.h"
FormAccountDetails::FormAccountDetails(const QIcon& icon, QWidget* parent) : QDialog(parent), m_account(nullptr) { FormAccountDetails::FormAccountDetails(const QIcon& icon, QWidget* parent)
: QDialog(parent), m_proxyDetails(new NetworkProxyDetails(this)), m_account(nullptr) {
m_ui.setupUi(this); m_ui.setupUi(this);
insertCustomTab(m_proxyDetails, tr("Network proxy"), 0);
GuiUtilities::applyDialogProperties(*this, icon.isNull() GuiUtilities::applyDialogProperties(*this, icon.isNull()
? qApp->icons()->fromTheme(QSL("emblem-system")) ? qApp->icons()->fromTheme(QSL("emblem-system"))
: icon); : icon);
createConnections(); createConnections();
} }
void FormAccountDetails::apply() {
if (m_account != nullptr) {
// Perform last-time operations before account is changed.
auto* cached_account = dynamic_cast<CacheForServiceRoot*>(m_account);
if (cached_account != nullptr) {
qWarningNN << LOGSEC_CORE << "Last-time account cache saving before account gets changed.";
cached_account->saveAllCachedData(true);
}
}
}
void FormAccountDetails::insertCustomTab(QWidget* custom_tab, const QString& title, int index) { void FormAccountDetails::insertCustomTab(QWidget* custom_tab, const QString& title, int index) {
m_ui.m_tabWidget->insertTab(index, custom_tab, title); m_ui.m_tabWidget->insertTab(index, custom_tab, title);
} }

View File

@ -7,7 +7,12 @@
#include "ui_formaccountdetails.h" #include "ui_formaccountdetails.h"
#include "miscellaneous/application.h"
#include "miscellaneous/databasefactory.h"
#include "miscellaneous/databasequeries.h"
class ServiceRoot; class ServiceRoot;
class NetworkProxyDetails;
class FormAccountDetails : public QDialog { class FormAccountDetails : public QDialog {
Q_OBJECT Q_OBJECT
@ -24,11 +29,17 @@ class FormAccountDetails : public QDialog {
protected slots: protected slots:
// Applies changes. // Applies changes.
// NOTE: This must be reimplemented in subclasses. Also this // NOTE: This must be reimplemented in subclasses. Also, every
// base implementation must be called first. // subclass must call applyInternal() method as first statement.
virtual void apply(); virtual void apply() = 0;
protected: protected:
// Performs some common operations and returns true if creating
// new account or false if editing existing account.
template<class T>
bool applyInternal();
void activateTab(int index); void activateTab(int index);
void clearTabs(); void clearTabs();
void insertCustomTab(QWidget* custom_tab, const QString& title, int index); void insertCustomTab(QWidget* custom_tab, const QString& title, int index);
@ -43,9 +54,36 @@ class FormAccountDetails : public QDialog {
protected: protected:
Ui::FormAccountDetails m_ui; Ui::FormAccountDetails m_ui;
NetworkProxyDetails* m_proxyDetails;
ServiceRoot* m_account; ServiceRoot* m_account;
}; };
template<class T>
inline bool FormAccountDetails::applyInternal() {
if (m_account != nullptr) {
// Perform last-time operations before account is changed.
auto* cached_account = dynamic_cast<CacheForServiceRoot*>(m_account);
if (cached_account != nullptr) {
qWarningNN << LOGSEC_CORE << "Last-time account cache saving before account gets changed.";
cached_account->saveAllCachedData(true);
}
}
QSqlDatabase database = qApp->database()->connection(QSL("FormAccountDetails"));
bool creating = m_account == nullptr;
if (m_account == nullptr) {
m_account = new T();
m_account->setAccountId(DatabaseQueries::createBaseAccount(database, m_account->code()));
m_account->setId(m_account->accountId());
}
// NOTE: We edit account common attributes here directly.
DatabaseQueries::editBaseAccount(database, m_account);
return creating;
}
template<class T> template<class T>
inline T* FormAccountDetails::addEditAccount(T* account_to_edit) { inline T* FormAccountDetails::addEditAccount(T* account_to_edit) {
if (account_to_edit == nullptr) { if (account_to_edit == nullptr) {
@ -55,8 +93,12 @@ inline T* FormAccountDetails::addEditAccount(T* account_to_edit) {
setEditableAccount(static_cast<ServiceRoot*>(account_to_edit)); setEditableAccount(static_cast<ServiceRoot*>(account_to_edit));
} }
exec(); if (exec() == QDialog::DialogCode::Accepted) {
return account<T>(); return account<T>();
}
else {
return nullptr;
}
} }
template<class T> template<class T>

View File

@ -18,15 +18,8 @@
#include <QFileDialog> #include <QFileDialog>
GmailServiceRoot::GmailServiceRoot(GmailNetworkFactory* network, RootItem* parent) GmailServiceRoot::GmailServiceRoot(RootItem* parent)
: ServiceRoot(parent), m_network(network), m_actionReply(nullptr) { : ServiceRoot(parent), m_network(new GmailNetworkFactory(this)), m_actionReply(nullptr) {
if (network == nullptr) {
m_network = new GmailNetworkFactory(this);
}
else {
m_network->setParent(this);
}
m_network->setService(this); m_network->setService(this);
setIcon(GmailEntryPoint().icon()); setIcon(GmailEntryPoint().icon());
} }
@ -74,10 +67,10 @@ void GmailServiceRoot::loadFromDatabase() {
} }
} }
void GmailServiceRoot::saveAccountDataToDatabase() { void GmailServiceRoot::saveAccountDataToDatabase(bool creating_new) {
QSqlDatabase database = qApp->database()->connection(metaObject()->className()); QSqlDatabase database = qApp->database()->connection(metaObject()->className());
if (accountId() != NO_PARENT_CATEGORY) { if (!creating_new) {
if (DatabaseQueries::overwriteGmailAccount(database, m_network->username(), if (DatabaseQueries::overwriteGmailAccount(database, m_network->username(),
m_network->oauth()->clientId(), m_network->oauth()->clientId(),
m_network->oauth()->clientSecret(), m_network->oauth()->clientSecret(),
@ -90,21 +83,15 @@ void GmailServiceRoot::saveAccountDataToDatabase() {
} }
} }
else { else {
bool saved; if (DatabaseQueries::createGmailAccount(database,
int id_to_assign = DatabaseQueries::createBaseAccount(database, code(), &saved); accountId(),
m_network->username(),
if (saved) { m_network->oauth()->clientId(),
if (DatabaseQueries::createGmailAccount(database, id_to_assign, m_network->oauth()->clientSecret(),
m_network->username(), m_network->oauth()->redirectUrl(),
m_network->oauth()->clientId(), m_network->oauth()->refreshToken(),
m_network->oauth()->clientSecret(), m_network->batchSize())) {
m_network->oauth()->redirectUrl(), updateTitle();
m_network->oauth()->refreshToken(),
m_network->batchSize())) {
setId(id_to_assign);
setAccountId(id_to_assign);
updateTitle();
}
} }
} }
} }

View File

@ -12,10 +12,10 @@ class GmailServiceRoot : public ServiceRoot, public CacheForServiceRoot {
Q_OBJECT Q_OBJECT
public: public:
explicit GmailServiceRoot(GmailNetworkFactory* network, RootItem* parent = nullptr); explicit GmailServiceRoot(RootItem* parent = nullptr);
virtual ~GmailServiceRoot(); virtual ~GmailServiceRoot();
void saveAccountDataToDatabase(); void saveAccountDataToDatabase(bool creating_new);
void setNetwork(GmailNetworkFactory* network); void setNetwork(GmailNetworkFactory* network);
GmailNetworkFactory* network() const; GmailNetworkFactory* network() const;

View File

@ -20,16 +20,7 @@ FormEditGmailAccount::FormEditGmailAccount(QWidget* parent)
} }
void FormEditGmailAccount::apply() { void FormEditGmailAccount::apply() {
FormAccountDetails::apply(); bool editing_account = !applyInternal<GmailServiceRoot>();
bool editing_account = true;
if (m_account == nullptr) {
// We want to confirm newly created account.
// So save new account into DB, setup its properties.
m_account = new GmailServiceRoot(nullptr);
editing_account = false;
}
// We copy credentials from testing OAuth to live OAuth. // We copy credentials from testing OAuth to live OAuth.
account<GmailServiceRoot>()->network()->oauth()->setAccessToken(m_details->m_oauth->accessToken()); account<GmailServiceRoot>()->network()->oauth()->setAccessToken(m_details->m_oauth->accessToken());
@ -42,7 +33,8 @@ void FormEditGmailAccount::apply() {
account<GmailServiceRoot>()->network()->setUsername(m_details->m_ui.m_txtUsername->lineEdit()->text()); account<GmailServiceRoot>()->network()->setUsername(m_details->m_ui.m_txtUsername->lineEdit()->text());
account<GmailServiceRoot>()->network()->setBatchSize(m_details->m_ui.m_spinLimitMessages->value()); account<GmailServiceRoot>()->network()->setBatchSize(m_details->m_ui.m_spinLimitMessages->value());
account<GmailServiceRoot>()->saveAccountDataToDatabase();
account<GmailServiceRoot>()->saveAccountDataToDatabase(!editing_account);
accept(); accept();
if (editing_account) { if (editing_account) {

View File

@ -21,16 +21,7 @@ FormEditInoreaderAccount::FormEditInoreaderAccount(QWidget* parent)
} }
void FormEditInoreaderAccount::apply() { void FormEditInoreaderAccount::apply() {
FormAccountDetails::apply(); bool editing_account = !applyInternal<InoreaderServiceRoot>();
bool editing_account = true;
if (m_account == nullptr) {
// We want to confirm newly created account.
// So save new account into DB, setup its properties.
m_account = new InoreaderServiceRoot(nullptr);
editing_account = false;
}
// We copy credentials from testing OAuth to live OAuth. // We copy credentials from testing OAuth to live OAuth.
account<InoreaderServiceRoot>()->network()->oauth()->setAccessToken(m_details->m_oauth->accessToken()); account<InoreaderServiceRoot>()->network()->oauth()->setAccessToken(m_details->m_oauth->accessToken());
@ -43,7 +34,8 @@ void FormEditInoreaderAccount::apply() {
account<InoreaderServiceRoot>()->network()->setUsername(m_details->m_ui.m_txtUsername->lineEdit()->text()); account<InoreaderServiceRoot>()->network()->setUsername(m_details->m_ui.m_txtUsername->lineEdit()->text());
account<InoreaderServiceRoot>()->network()->setBatchSize(m_details->m_ui.m_spinLimitMessages->value()); account<InoreaderServiceRoot>()->network()->setBatchSize(m_details->m_ui.m_spinLimitMessages->value());
account<InoreaderServiceRoot>()->saveAccountDataToDatabase();
account<InoreaderServiceRoot>()->saveAccountDataToDatabase(!editing_account);
accept(); accept();
if (editing_account) { if (editing_account) {

View File

@ -16,15 +16,8 @@
#include <QThread> #include <QThread>
InoreaderServiceRoot::InoreaderServiceRoot(InoreaderNetworkFactory* network, RootItem* parent) InoreaderServiceRoot::InoreaderServiceRoot(RootItem* parent)
: ServiceRoot(parent), m_network(network) { : ServiceRoot(parent), m_network(new InoreaderNetworkFactory(this)) {
if (network == nullptr) {
m_network = new InoreaderNetworkFactory(this);
}
else {
m_network->setParent(this);
}
m_network->setService(this); m_network->setService(this);
setIcon(InoreaderEntryPoint().icon()); setIcon(InoreaderEntryPoint().icon());
} }
@ -44,10 +37,10 @@ void InoreaderServiceRoot::loadFromDatabase() {
performInitialAssembly(categories, feeds, labels); performInitialAssembly(categories, feeds, labels);
} }
void InoreaderServiceRoot::saveAccountDataToDatabase() { void InoreaderServiceRoot::saveAccountDataToDatabase(bool creating_new) {
QSqlDatabase database = qApp->database()->connection(metaObject()->className()); QSqlDatabase database = qApp->database()->connection(metaObject()->className());
if (accountId() != NO_PARENT_CATEGORY) { if (!creating_new) {
if (DatabaseQueries::overwriteInoreaderAccount(database, m_network->userName(), if (DatabaseQueries::overwriteInoreaderAccount(database, m_network->userName(),
m_network->oauth()->clientId(), m_network->oauth()->clientId(),
m_network->oauth()->clientSecret(), m_network->oauth()->clientSecret(),
@ -60,21 +53,15 @@ void InoreaderServiceRoot::saveAccountDataToDatabase() {
} }
} }
else { else {
bool saved; if (DatabaseQueries::createInoreaderAccount(database,
int id_to_assign = DatabaseQueries::createBaseAccount(database, code(), &saved); accountId(),
m_network->userName(),
if (saved) { m_network->oauth()->clientId(),
if (DatabaseQueries::createInoreaderAccount(database, id_to_assign, m_network->oauth()->clientSecret(),
m_network->userName(), m_network->oauth()->redirectUrl(),
m_network->oauth()->clientId(), m_network->oauth()->refreshToken(),
m_network->oauth()->clientSecret(), m_network->batchSize())) {
m_network->oauth()->redirectUrl(), updateTitle();
m_network->oauth()->refreshToken(),
m_network->batchSize())) {
setId(id_to_assign);
setAccountId(id_to_assign);
updateTitle();
}
} }
} }
} }

View File

@ -12,10 +12,10 @@ class InoreaderServiceRoot : public ServiceRoot, public CacheForServiceRoot {
Q_OBJECT Q_OBJECT
public: public:
explicit InoreaderServiceRoot(InoreaderNetworkFactory* network, RootItem* parent = nullptr); explicit InoreaderServiceRoot(RootItem* parent = nullptr);
virtual ~InoreaderServiceRoot(); virtual ~InoreaderServiceRoot();
void saveAccountDataToDatabase(); void saveAccountDataToDatabase(bool creating_new);
void setNetwork(InoreaderNetworkFactory* network); void setNetwork(InoreaderNetworkFactory* network);
InoreaderNetworkFactory* network() const; InoreaderNetworkFactory* network() const;

View File

@ -19,16 +19,7 @@ FormEditOwnCloudAccount::FormEditOwnCloudAccount(QWidget* parent)
} }
void FormEditOwnCloudAccount::apply() { void FormEditOwnCloudAccount::apply() {
FormAccountDetails::apply(); bool editing_account = !applyInternal<OwnCloudServiceRoot>();
bool editing_account = true;
if (m_account == nullptr) {
// We want to confirm newly created account.
// So save new account into DB, setup its properties.
m_account = new OwnCloudServiceRoot();
editing_account = false;
}
account<OwnCloudServiceRoot>()->network()->setUrl(m_details->m_ui.m_txtUrl->lineEdit()->text()); account<OwnCloudServiceRoot>()->network()->setUrl(m_details->m_ui.m_txtUrl->lineEdit()->text());
account<OwnCloudServiceRoot>()->network()->setAuthUsername(m_details->m_ui.m_txtUsername->lineEdit()->text()); account<OwnCloudServiceRoot>()->network()->setAuthUsername(m_details->m_ui.m_txtUsername->lineEdit()->text());
@ -37,7 +28,7 @@ void FormEditOwnCloudAccount::apply() {
account<OwnCloudServiceRoot>()->network()->setBatchSize(m_details->m_ui.m_spinLimitMessages->value()); account<OwnCloudServiceRoot>()->network()->setBatchSize(m_details->m_ui.m_spinLimitMessages->value());
account<OwnCloudServiceRoot>()->network()->setDownloadOnlyUnreadMessages(m_details->m_ui.m_checkDownloadOnlyUnreadMessages->isChecked()); account<OwnCloudServiceRoot>()->network()->setDownloadOnlyUnreadMessages(m_details->m_ui.m_checkDownloadOnlyUnreadMessages->isChecked());
account<OwnCloudServiceRoot>()->saveAccountDataToDatabase(); account<OwnCloudServiceRoot>()->saveAccountDataToDatabase(!editing_account);
accept(); accept();
if (editing_account) { if (editing_account) {

View File

@ -128,10 +128,10 @@ void OwnCloudServiceRoot::updateTitle() {
setTitle(m_network->authUsername() + QSL(" (Nextcloud News)")); setTitle(m_network->authUsername() + QSL(" (Nextcloud News)"));
} }
void OwnCloudServiceRoot::saveAccountDataToDatabase() { void OwnCloudServiceRoot::saveAccountDataToDatabase(bool creating_new) {
QSqlDatabase database = qApp->database()->connection(metaObject()->className()); QSqlDatabase database = qApp->database()->connection(metaObject()->className());
if (accountId() != NO_PARENT_CATEGORY) { if (!creating_new) {
if (DatabaseQueries::overwriteOwnCloudAccount(database, m_network->authUsername(), if (DatabaseQueries::overwriteOwnCloudAccount(database, m_network->authUsername(),
m_network->authPassword(), m_network->url(), m_network->authPassword(), m_network->url(),
m_network->forceServerSideUpdate(), m_network->batchSize(), m_network->forceServerSideUpdate(), m_network->batchSize(),
@ -141,19 +141,12 @@ void OwnCloudServiceRoot::saveAccountDataToDatabase() {
} }
} }
else { else {
bool saved; if (DatabaseQueries::createOwnCloudAccount(database, accountId(), m_network->authUsername(),
int id_to_assign = DatabaseQueries::createBaseAccount(database, code(), &saved); m_network->authPassword(), m_network->url(),
m_network->forceServerSideUpdate(),
if (saved) { m_network->downloadOnlyUnreadMessages(),
if (DatabaseQueries::createOwnCloudAccount(database, id_to_assign, m_network->authUsername(), m_network->batchSize())) {
m_network->authPassword(), m_network->url(), updateTitle();
m_network->forceServerSideUpdate(),
m_network->downloadOnlyUnreadMessages(),
m_network->batchSize())) {
setId(id_to_assign);
setAccountId(id_to_assign);
updateTitle();
}
} }
} }
} }

View File

@ -32,7 +32,7 @@ class OwnCloudServiceRoot : public ServiceRoot, public CacheForServiceRoot {
OwnCloudNetworkFactory* network() const; OwnCloudNetworkFactory* network() const;
void updateTitle(); void updateTitle();
void saveAccountDataToDatabase(); void saveAccountDataToDatabase(bool creating_new);
protected: protected:
virtual RootItem* obtainNewTreeForSyncIn() const; virtual RootItem* obtainNewTreeForSyncIn() const;

View File

@ -0,0 +1,21 @@
// For license of this file, see <project-root-folder>/LICENSE.md.
#include "services/standard/gui/formeditstandardaccount.h"
#include "miscellaneous/application.h"
#include "miscellaneous/databasefactory.h"
#include "miscellaneous/databasequeries.h"
#include "miscellaneous/iconfactory.h"
#include "services/standard/standardserviceroot.h"
FormEditStandardAccount::FormEditStandardAccount(QWidget* parent)
: FormAccountDetails(qApp->icons()->fromTheme(QSL("rssguard")), parent) {}
void FormEditStandardAccount::apply() {
applyInternal<StandardServiceRoot>();
accept();
}
void FormEditStandardAccount::setEditableAccount(ServiceRoot* editable_account) {
FormAccountDetails::setEditableAccount(editable_account);
}

View File

@ -0,0 +1,19 @@
// For license of this file, see <project-root-folder>/LICENSE.md.
#ifndef FORMEDITSTANDARDACCOUNT_H
#define FORMEDITSTANDARDACCOUNT_H
#include "services/abstract/gui/formaccountdetails.h"
class FormEditStandardAccount : public FormAccountDetails {
public:
explicit FormEditStandardAccount(QWidget* parent = nullptr);
protected slots:
virtual void apply();
protected:
virtual void setEditableAccount(ServiceRoot* editable_account);
};
#endif // FORMEDITSTANDARDACCOUNT_H

View File

@ -5,6 +5,7 @@
#include "definitions/definitions.h" #include "definitions/definitions.h"
#include "miscellaneous/application.h" #include "miscellaneous/application.h"
#include "miscellaneous/databasequeries.h" #include "miscellaneous/databasequeries.h"
#include "services/standard/gui/formeditstandardaccount.h"
#include "services/standard/standardserviceroot.h" #include "services/standard/standardserviceroot.h"
QString StandardServiceEntryPoint::name() const { QString StandardServiceEntryPoint::name() const {
@ -28,20 +29,9 @@ QString StandardServiceEntryPoint::code() const {
} }
ServiceRoot* StandardServiceEntryPoint::createNewRoot() const { ServiceRoot* StandardServiceEntryPoint::createNewRoot() const {
// Switch DB. FormEditStandardAccount form_acc(qApp->mainFormWidget());
QSqlDatabase database = qApp->database()->connection(QSL("StandardServiceEntryPoint"));
bool ok;
int new_id = DatabaseQueries::createBaseAccount(database, code(), &ok);
if (ok) { return form_acc.addEditAccount<StandardServiceRoot>();
auto* root = new StandardServiceRoot();
root->setAccountId(new_id);
return root;
}
else {
return nullptr;
}
} }
QList<ServiceRoot*> StandardServiceEntryPoint::initializeSubtree() const { QList<ServiceRoot*> StandardServiceEntryPoint::initializeSubtree() const {

View File

@ -14,6 +14,7 @@
#include "services/abstract/importantnode.h" #include "services/abstract/importantnode.h"
#include "services/abstract/labelsnode.h" #include "services/abstract/labelsnode.h"
#include "services/abstract/recyclebin.h" #include "services/abstract/recyclebin.h"
#include "services/standard/gui/formeditstandardaccount.h"
#include "services/standard/gui/formstandardcategorydetails.h" #include "services/standard/gui/formstandardcategorydetails.h"
#include "services/standard/gui/formstandardfeeddetails.h" #include "services/standard/gui/formstandardfeeddetails.h"
#include "services/standard/gui/formstandardimportexport.h" #include "services/standard/gui/formstandardimportexport.h"
@ -87,13 +88,20 @@ QString StandardServiceRoot::code() const {
} }
bool StandardServiceRoot::canBeEdited() const { bool StandardServiceRoot::canBeEdited() const {
return false; return true;
} }
bool StandardServiceRoot::canBeDeleted() const { bool StandardServiceRoot::canBeDeleted() const {
return true; return true;
} }
bool StandardServiceRoot::editViaGui() {
FormEditStandardAccount form_pointer(qApp->mainFormWidget());
form_pointer.addEditAccount(this);
return true;
}
bool StandardServiceRoot::deleteViaGui() { bool StandardServiceRoot::deleteViaGui() {
return ServiceRoot::deleteViaGui(); return ServiceRoot::deleteViaGui();
} }

View File

@ -29,6 +29,7 @@ class StandardServiceRoot : public ServiceRoot {
bool canBeEdited() const; bool canBeEdited() const;
bool canBeDeleted() const; bool canBeDeleted() const;
bool editViaGui();
bool deleteViaGui(); bool deleteViaGui();
bool supportsFeedAdding() const; bool supportsFeedAdding() const;
bool supportsCategoryAdding() const; bool supportsCategoryAdding() const;

View File

@ -17,16 +17,7 @@ FormEditTtRssAccount::FormEditTtRssAccount(QWidget* parent)
} }
void FormEditTtRssAccount::apply() { void FormEditTtRssAccount::apply() {
FormAccountDetails::apply(); bool editing_account = !applyInternal<TtRssServiceRoot>();
bool editing_account = true;
if (m_account == nullptr) {
// We want to confirm newly created account.
// So save new account into DB, setup its properties.
m_account = new TtRssServiceRoot();
editing_account = false;
}
account<TtRssServiceRoot>()->network()->setUrl(m_details->m_ui.m_txtUrl->lineEdit()->text()); account<TtRssServiceRoot>()->network()->setUrl(m_details->m_ui.m_txtUrl->lineEdit()->text());
account<TtRssServiceRoot>()->network()->setUsername(m_details->m_ui.m_txtUsername->lineEdit()->text()); account<TtRssServiceRoot>()->network()->setUsername(m_details->m_ui.m_txtUsername->lineEdit()->text());
@ -37,7 +28,7 @@ void FormEditTtRssAccount::apply() {
account<TtRssServiceRoot>()->network()->setForceServerSideUpdate(m_details->m_ui.m_checkServerSideUpdate->isChecked()); account<TtRssServiceRoot>()->network()->setForceServerSideUpdate(m_details->m_ui.m_checkServerSideUpdate->isChecked());
account<TtRssServiceRoot>()->network()->setDownloadOnlyUnreadMessages(m_details->m_ui.m_checkDownloadOnlyUnreadMessages->isChecked()); account<TtRssServiceRoot>()->network()->setDownloadOnlyUnreadMessages(m_details->m_ui.m_checkDownloadOnlyUnreadMessages->isChecked());
account<TtRssServiceRoot>()->saveAccountDataToDatabase(); account<TtRssServiceRoot>()->saveAccountDataToDatabase(!editing_account);
accept(); accept();
if (editing_account) { if (editing_account) {

View File

@ -13,7 +13,6 @@ TtRssAccountDetails::TtRssAccountDetails(QWidget* parent) : QWidget(parent) {
m_ui.m_lblTestResult->label()->setWordWrap(true); m_ui.m_lblTestResult->label()->setWordWrap(true);
m_ui.m_lblServerSideUpdateInformation->setText(tr("Leaving this option on causes that updates " m_ui.m_lblServerSideUpdateInformation->setText(tr("Leaving this option on causes that updates "
"of feeds will be probably much slower and may time-out often.")); "of feeds will be probably much slower and may time-out often."));
m_ui.m_lblDescription->setText(tr("Note that at least API level %1 is required.").arg(TTRSS_MINIMAL_API_LEVEL));
m_ui.m_txtHttpUsername->lineEdit()->setPlaceholderText(tr("HTTP authentication username")); m_ui.m_txtHttpUsername->lineEdit()->setPlaceholderText(tr("HTTP authentication username"));
m_ui.m_txtHttpPassword->lineEdit()->setPlaceholderText(tr("HTTP authentication password")); m_ui.m_txtHttpPassword->lineEdit()->setPlaceholderText(tr("HTTP authentication password"));
m_ui.m_txtPassword->lineEdit()->setPlaceholderText(tr("Password for your TT-RSS account")); m_ui.m_txtPassword->lineEdit()->setPlaceholderText(tr("Password for your TT-RSS account"));
@ -23,7 +22,6 @@ TtRssAccountDetails::TtRssAccountDetails(QWidget* parent) : QWidget(parent) {
tr("No test done yet."), tr("No test done yet."),
tr("Here, results of connection test are shown.")); tr("Here, results of connection test are shown."));
GuiUtilities::setLabelAsNotice(*m_ui.m_lblDescription, true);
GuiUtilities::setLabelAsNotice(*m_ui.m_lblServerSideUpdateInformation, true); GuiUtilities::setLabelAsNotice(*m_ui.m_lblServerSideUpdateInformation, true);
setTabOrder(m_ui.m_txtUrl->lineEdit(), m_ui.m_checkDownloadOnlyUnreadMessages); setTabOrder(m_ui.m_txtUrl->lineEdit(), m_ui.m_checkDownloadOnlyUnreadMessages);

View File

@ -11,21 +11,48 @@
</rect> </rect>
</property> </property>
<layout class="QFormLayout" name="formLayout"> <layout class="QFormLayout" name="formLayout">
<item row="2" column="0" colspan="2"> <item row="0" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="m_lblTitle">
<property name="text">
<string>URL</string>
</property>
<property name="buddy">
<cstring>m_txtUrl</cstring>
</property>
</widget>
</item>
<item>
<widget class="LineEditWithStatus" name="m_txtUrl" native="true"/>
</item>
</layout>
</item>
<item row="1" column="0" colspan="2">
<widget class="QCheckBox" name="m_checkDownloadOnlyUnreadMessages"> <widget class="QCheckBox" name="m_checkDownloadOnlyUnreadMessages">
<property name="text"> <property name="text">
<string>Download only unread messages</string> <string>Download only unread messages</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="0" colspan="2"> <item row="2" column="0" colspan="2">
<widget class="QCheckBox" name="m_checkServerSideUpdate"> <widget class="QCheckBox" name="m_checkServerSideUpdate">
<property name="text"> <property name="text">
<string>Force execution of server-side update when updating feeds from RSS Guard</string> <string>Force execution of server-side update when updating feeds from RSS Guard</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="5" column="0" colspan="2"> <item row="3" column="0" colspan="2">
<widget class="QLabel" name="m_lblServerSideUpdateInformation">
<property name="text">
<string/>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="4" column="0" colspan="2">
<widget class="QGroupBox" name="m_gbAuthentication"> <widget class="QGroupBox" name="m_gbAuthentication">
<property name="toolTip"> <property name="toolTip">
<string>Some feeds require authentication, including GMail feeds. BASIC, NTLM-2 and DIGEST-MD5 authentication schemes are supported.</string> <string>Some feeds require authentication, including GMail feeds. BASIC, NTLM-2 and DIGEST-MD5 authentication schemes are supported.</string>
@ -76,7 +103,7 @@
</layout> </layout>
</widget> </widget>
</item> </item>
<item row="6" column="0" colspan="2"> <item row="5" column="0" colspan="2">
<widget class="QGroupBox" name="m_gbHttpAuthentication"> <widget class="QGroupBox" name="m_gbHttpAuthentication">
<property name="toolTip"> <property name="toolTip">
<string>Some feeds require authentication, including GMail feeds. BASIC, NTLM-2 and DIGEST-MD5 authentication schemes are supported.</string> <string>Some feeds require authentication, including GMail feeds. BASIC, NTLM-2 and DIGEST-MD5 authentication schemes are supported.</string>
@ -130,14 +157,14 @@
</layout> </layout>
</widget> </widget>
</item> </item>
<item row="7" column="0"> <item row="6" column="0">
<widget class="QPushButton" name="m_btnTestSetup"> <widget class="QPushButton" name="m_btnTestSetup">
<property name="text"> <property name="text">
<string>&amp;Test setup</string> <string>&amp;Test setup</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="7" column="1"> <item row="6" column="1">
<widget class="LabelWithStatus" name="m_lblTestResult" native="true"> <widget class="LabelWithStatus" name="m_lblTestResult" native="true">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred"> <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
@ -150,7 +177,7 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="8" column="0" colspan="2"> <item row="7" column="0" colspan="2">
<spacer name="verticalSpacer"> <spacer name="verticalSpacer">
<property name="orientation"> <property name="orientation">
<enum>Qt::Vertical</enum> <enum>Qt::Vertical</enum>
@ -163,43 +190,6 @@
</property> </property>
</spacer> </spacer>
</item> </item>
<item row="0" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="m_lblTitle">
<property name="text">
<string>URL</string>
</property>
<property name="buddy">
<cstring>m_txtUrl</cstring>
</property>
</widget>
</item>
<item>
<widget class="LineEditWithStatus" name="m_txtUrl" native="true"/>
</item>
</layout>
</item>
<item row="1" column="0" colspan="2">
<widget class="QLabel" name="m_lblDescription">
<property name="text">
<string/>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="4" column="0" colspan="2">
<widget class="QLabel" name="m_lblServerSideUpdateInformation">
<property name="text">
<string/>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
<customwidgets> <customwidgets>

View File

@ -211,10 +211,10 @@ TtRssNetworkFactory* TtRssServiceRoot::network() const {
return m_network; return m_network;
} }
void TtRssServiceRoot::saveAccountDataToDatabase() { void TtRssServiceRoot::saveAccountDataToDatabase(bool creating_new) {
QSqlDatabase database = qApp->database()->connection(metaObject()->className()); QSqlDatabase database = qApp->database()->connection(metaObject()->className());
if (accountId() != NO_PARENT_CATEGORY) { if (!creating_new) {
// We are overwritting previously saved data. // We are overwritting previously saved data.
if (DatabaseQueries::overwriteTtRssAccount(database, m_network->username(), m_network->password(), if (DatabaseQueries::overwriteTtRssAccount(database, m_network->username(), m_network->password(),
m_network->authIsUsed(), m_network->authUsername(), m_network->authIsUsed(), m_network->authUsername(),
@ -226,19 +226,12 @@ void TtRssServiceRoot::saveAccountDataToDatabase() {
} }
} }
else { else {
bool saved; if (DatabaseQueries::createTtRssAccount(database, accountId(), m_network->username(),
int id_to_assign = DatabaseQueries::createBaseAccount(database, code(), &saved); m_network->password(), m_network->authIsUsed(),
m_network->authUsername(), m_network->authPassword(),
if (saved) { m_network->url(), m_network->forceServerSideUpdate(),
if (DatabaseQueries::createTtRssAccount(database, id_to_assign, m_network->username(), m_network->downloadOnlyUnreadMessages())) {
m_network->password(), m_network->authIsUsed(), updateTitle();
m_network->authUsername(), m_network->authPassword(),
m_network->url(), m_network->forceServerSideUpdate(),
m_network->downloadOnlyUnreadMessages())) {
setId(id_to_assign);
setAccountId(id_to_assign);
updateTitle();
}
} }
} }
} }

View File

@ -37,7 +37,7 @@ class TtRssServiceRoot : public ServiceRoot, public CacheForServiceRoot {
// Access to network. // Access to network.
TtRssNetworkFactory* network() const; TtRssNetworkFactory* network() const;
void saveAccountDataToDatabase(); void saveAccountDataToDatabase(bool creating_new);
void updateTitle(); void updateTitle();
protected: protected: