Files
lan 94c4facf57 fix(some Dialogs): some Dialogs
Description: Adjust some Dialogs

Log:  弹出窗口位置不对
Task: http://pm.kylin.com/biz/story-view-6494.html
2021-06-01 19:21:43 +08:00

392 lines
13 KiB
C++

/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#include "proxy.h"
#include "ui_proxy.h"
#include <QDebug>
#define PROXY_SCHEMA "org.gnome.system.proxy"
#define PROXY_MODE_KEY "mode"
#define PROXY_AUTOCONFIG_URL_KEY "autoconfig-url"
#define IGNORE_HOSTS_KEY "ignore-hosts"
#define HTTP_PROXY_SCHEMA "org.gnome.system.proxy.http"
#define HTTP_USE_AUTH_KEY "use-authentication"
#define HTTP_AUTH_USER_KEY "authentication-user"
#define HTTP_AUTH_PASSWD_KEY "authentication-password"
#define HTTPS_PROXY_SCHEMA "org.gnome.system.proxy.https"
#define FTP_PROXY_SCHEMA "org.gnome.system.proxy.ftp"
#define SOCKS_PROXY_SCHEMA "org.gnome.system.proxy.socks"
#define PROXY_HOST_KEY "host"
#define PROXY_PORT_KEY "port"
Proxy::Proxy() : mFirstLoad(true)
{
ui = new Ui::Proxy;
pluginName = tr("Proxy");
pluginType = NETWORK;
}
Proxy::~Proxy()
{
if (!mFirstLoad) {
delete ui;
ui = nullptr;
if (settingsCreate){
delete proxysettings;
proxysettings = nullptr;
delete httpsettings;
httpsettings = nullptr;
delete securesettings;
securesettings = nullptr;
delete ftpsettings;
ftpsettings = nullptr;
delete sockssettings;
sockssettings = nullptr;
}
}
}
QString Proxy::get_plugin_name() {
return pluginName;
}
int Proxy::get_plugin_type() {
return pluginType;
}
QWidget *Proxy::get_plugin_ui() {
if (mFirstLoad) {
mFirstLoad = false;
pluginWidget = new QWidget;
pluginWidget->setAttribute(Qt::WA_DeleteOnClose);
ui->setupUi(pluginWidget);
settingsCreate = false;
const QByteArray id(PROXY_SCHEMA);
const QByteArray idd(HTTP_PROXY_SCHEMA);
const QByteArray iddd(HTTPS_PROXY_SCHEMA);
const QByteArray iid(FTP_PROXY_SCHEMA);
const QByteArray iiid(SOCKS_PROXY_SCHEMA);
initSearchText();
setupStylesheet();
setupComponent();
if (QGSettings::isSchemaInstalled(id) && QGSettings::isSchemaInstalled(idd) &&
QGSettings::isSchemaInstalled(iddd) && QGSettings::isSchemaInstalled(iid) &&
QGSettings::isSchemaInstalled(iiid)){
settingsCreate = true;
proxysettings = new QGSettings(id);
httpsettings = new QGSettings(idd);
securesettings = new QGSettings(iddd);
ftpsettings = new QGSettings(iid);
sockssettings = new QGSettings(iiid);
setupConnect();
initProxyModeStatus();
initAutoProxyStatus();
initManualProxyStatus();
initIgnoreHostStatus();
} else {
qCritical() << "Xml needed by Proxy is not installed";
}
}
return pluginWidget;
}
void Proxy::plugin_delay_control(){
}
const QString Proxy::name() const {
return QStringLiteral("proxy");
}
void Proxy::initSearchText() {
//~ contents_path /proxy/Auto proxy
ui->autoLabel->setText(tr("Auto proxy"));
//~ contents_path /proxy/Manual proxy
ui->manualLabel->setText(tr("Manual proxy"));
}
void Proxy::setupStylesheet(){
}
void Proxy::setupComponent(){
//添加自动配置代理开关按钮
autoSwitchBtn = new SwitchButton(ui->autoFrame);
autoSwitchBtn->setObjectName("auto");
ui->autoHorLayout->addWidget(autoSwitchBtn);
//添加手动配置代理开关按钮
manualSwitchBtn = new SwitchButton(ui->manualFrame);
manualSwitchBtn->setObjectName("manual");
ui->manualHorLayout->addWidget(manualSwitchBtn);
ui->cetificationBtn->hide();
//QLineEdit 设置数据
GSData httpHostData;
httpHostData.schema = HTTP_PROXY_SCHEMA;
httpHostData.key = PROXY_HOST_KEY;
ui->httpHostLineEdit->setProperty("gData", QVariant::fromValue(httpHostData));
GSData httpsHostData;
httpsHostData.schema = HTTPS_PROXY_SCHEMA;
httpsHostData.key = PROXY_HOST_KEY;
ui->httpsHostLineEdit->setProperty("gData", QVariant::fromValue(httpsHostData));
GSData ftpHostData;
ftpHostData.schema = FTP_PROXY_SCHEMA;
ftpHostData.key = PROXY_HOST_KEY;
ui->ftpHostLineEdit->setProperty("gData", QVariant::fromValue(ftpHostData));
GSData socksHostData;
socksHostData.schema = SOCKS_PROXY_SCHEMA;
socksHostData.key = PROXY_HOST_KEY;
ui->socksHostLineEdit->setProperty("gData", QVariant::fromValue(socksHostData));
GSData httpPortData;
httpPortData.schema = HTTP_PROXY_SCHEMA;
httpPortData.key = PROXY_PORT_KEY;
ui->httpPortLineEdit->setProperty("gData", QVariant::fromValue(httpPortData));
GSData httpsPortData;
httpsPortData.schema = HTTPS_PROXY_SCHEMA;
httpsPortData.key = PROXY_PORT_KEY;
ui->httpsPortLineEdit->setProperty("gData", QVariant::fromValue(httpsPortData));
GSData ftpPortData;
ftpPortData.schema = FTP_PROXY_SCHEMA;
ftpPortData.key = PROXY_PORT_KEY;
ui->ftpPortLineEdit->setProperty("gData", QVariant::fromValue(ftpPortData));
GSData socksPortData;
socksPortData.schema = SOCKS_PROXY_SCHEMA;
socksPortData.key = PROXY_PORT_KEY;
ui->socksPortLineEdit->setProperty("gData", QVariant::fromValue(socksPortData));
}
void Proxy::setupConnect(){
connect(autoSwitchBtn, SIGNAL(checkedChanged(bool)), this, SLOT(proxyModeChangedSlot(bool)));
connect(manualSwitchBtn, SIGNAL(checkedChanged(bool)), this, SLOT(proxyModeChangedSlot(bool)));
connect(ui->urlLineEdit, &QLineEdit::textChanged, this, [=](const QString &txt){proxysettings->set(PROXY_AUTOCONFIG_URL_KEY, QVariant(txt));});
connect(ui->httpHostLineEdit, &QLineEdit::textChanged, this, [=](const QString &txt){manualProxyTextChanged(txt);});
connect(ui->httpsHostLineEdit, &QLineEdit::textChanged, this, [=](const QString &txt){manualProxyTextChanged(txt);});
connect(ui->ftpHostLineEdit, &QLineEdit::textChanged, this, [=](const QString &txt){manualProxyTextChanged(txt);});
connect(ui->socksHostLineEdit, &QLineEdit::textChanged, this, [=](const QString &txt){manualProxyTextChanged(txt);});
connect(ui->httpPortLineEdit, &QLineEdit::textChanged, this, [=](const QString &txt){manualProxyTextChanged(txt);});
connect(ui->httpsPortLineEdit, &QLineEdit::textChanged, this, [=](const QString &txt){manualProxyTextChanged(txt);});
connect(ui->ftpPortLineEdit, &QLineEdit::textChanged, this, [=](const QString &txt){manualProxyTextChanged(txt);});
connect(ui->socksPortLineEdit, &QLineEdit::textChanged, this, [=](const QString &txt){manualProxyTextChanged(txt);});
// connect(ui->cetificationBtn, &QPushButton::clicked, [=](bool checked){
// Q_UNUSED(checked)
// showCertificationDialog();
// });
connect(ui->ignoreHostTextEdit, &QTextEdit::textChanged, this, [=](){
QString text = ui->ignoreHostTextEdit->toPlainText();
QStringList hostStringList = text.split(";");
proxysettings->set(IGNORE_HOSTS_KEY, QVariant(hostStringList));
});
}
void Proxy::initProxyModeStatus(){
int mode = _getCurrentProxyMode();
autoSwitchBtn->blockSignals(true);
manualSwitchBtn->blockSignals(true);
if (mode == AUTO){
autoSwitchBtn->setChecked(true);
} else if (mode == MANUAL){
manualSwitchBtn->setChecked(true);
} else{
autoSwitchBtn->setChecked(false);
manualSwitchBtn->setChecked(false);
}
autoSwitchBtn->blockSignals(false);
manualSwitchBtn->blockSignals(false);
_setSensitivity();
}
void Proxy::initAutoProxyStatus(){
ui->urlLineEdit->blockSignals(true);
//设置当前url
QString urlString = proxysettings->get(PROXY_AUTOCONFIG_URL_KEY).toString();
ui->urlLineEdit->setText(urlString);
ui->urlLineEdit->blockSignals(false);
}
void Proxy::initManualProxyStatus(){
//信号阻塞
ui->httpHostLineEdit->blockSignals(true);
ui->httpsHostLineEdit->blockSignals(true);
ui->ftpHostLineEdit->blockSignals(true);
ui->socksHostLineEdit->blockSignals(true);
ui->httpPortLineEdit->blockSignals(true);
ui->httpsPortLineEdit->blockSignals(true);
ui->ftpPortLineEdit->blockSignals(true);
ui->socksPortLineEdit->blockSignals(true);
//HTTP
QString httphost = httpsettings->get(PROXY_HOST_KEY).toString();
ui->httpHostLineEdit->setText(httphost);
int httpport = httpsettings->get(PROXY_PORT_KEY).toInt();
ui->httpPortLineEdit->setText(QString::number(httpport));
//HTTPS
QString httpshost = securesettings->get(PROXY_HOST_KEY).toString();
ui->httpsHostLineEdit->setText(httpshost);
int httpsport = securesettings->get(PROXY_PORT_KEY).toInt();
ui->httpsPortLineEdit->setText(QString::number(httpsport));
//FTP
QString ftphost = ftpsettings->get(PROXY_HOST_KEY).toString();
ui->ftpHostLineEdit->setText(ftphost);
int ftppost = ftpsettings->get(PROXY_PORT_KEY).toInt();
ui->ftpPortLineEdit->setText(QString::number(ftppost));
//SOCKS
QString sockshost = sockssettings->get(PROXY_HOST_KEY).toString();
ui->socksHostLineEdit->setText(sockshost);
int socksport = sockssettings->get(PROXY_PORT_KEY).toInt();
ui->socksPortLineEdit->setText(QString::number(socksport));
//解除信号阻塞
ui->httpHostLineEdit->blockSignals(false);
ui->httpsHostLineEdit->blockSignals(false);
ui->ftpHostLineEdit->blockSignals(false);
ui->socksHostLineEdit->blockSignals(false);
ui->httpPortLineEdit->blockSignals(false);
ui->httpsPortLineEdit->blockSignals(false);
ui->ftpPortLineEdit->blockSignals(false);
ui->socksPortLineEdit->blockSignals(false);
}
void Proxy::initIgnoreHostStatus(){
ui->ignoreHostTextEdit->blockSignals(true);
//设置当前ignore host
QStringList ignorehost = proxysettings->get(IGNORE_HOSTS_KEY).toStringList();
ui->ignoreHostTextEdit->setPlainText(ignorehost.join(";"));
ui->ignoreHostTextEdit->blockSignals(false);
}
int Proxy::_getCurrentProxyMode(){
GSettings * proxygsettings;
proxygsettings = g_settings_new(PROXY_SCHEMA);
int mode = g_settings_get_enum(proxygsettings, PROXY_MODE_KEY);
g_object_unref(proxygsettings);
return mode;
}
void Proxy::_setSensitivity(){
//自动配置代理界面敏感性
bool autoChecked = autoSwitchBtn->isChecked();
ui->urlFrame->setVisible(autoChecked);
//手动配置代理界面敏感性
bool manualChecked = manualSwitchBtn->isChecked();
ui->httpFrame->setVisible(manualChecked);
ui->httpsFrame->setVisible(manualChecked);
ui->ftpFrame->setVisible(manualChecked);
ui->socksFrame->setVisible(manualChecked);
}
void Proxy::showCertificationDialog(){
QDialog * certificationDialog = new CertificationDialog(pluginWidget);
certificationDialog->setAttribute(Qt::WA_DeleteOnClose);
certificationDialog->show();
}
void Proxy::manualProxyTextChanged(QString txt){
//获取被修改控件
QObject * pobject = this->sender();
QLineEdit * who = dynamic_cast<QLineEdit *>(pobject);
//获取控件保存的用户数据
GSData currentData = who->property("gData").value<GSData>();
QString schema = currentData.schema; QString key = currentData.key;
//构建临时QGSettings
const QByteArray id = schema.toUtf8();
const QByteArray iidd(id.data());
QGSettings * setting = new QGSettings(iidd);
setting->set(key, QVariant(txt));
delete setting;
setting = nullptr;
}
void Proxy::proxyModeChangedSlot(bool checked){
GSettings * proxygsettings;
proxygsettings = g_settings_new(PROXY_SCHEMA);
//两个switchbutton要达到互斥的效果,自定义按钮暂时未支持添加buttongroup
QObject * object = QObject::sender();
if (object->objectName() == "auto"){ //区分哪个switchbutton
if (checked){
if (manualSwitchBtn->isChecked())
manualSwitchBtn->setChecked(false);
g_settings_set_enum(proxygsettings, PROXY_MODE_KEY, AUTO);
}
else{
if (!manualSwitchBtn->isChecked())
g_settings_set_enum(proxygsettings, PROXY_MODE_KEY, NONE);
}
}
else{
if (checked){
if (autoSwitchBtn->isChecked())
autoSwitchBtn->setChecked(false);
g_settings_set_enum(proxygsettings, PROXY_MODE_KEY, MANUAL);
}
else{
if (!autoSwitchBtn->isChecked())
g_settings_set_enum(proxygsettings, PROXY_MODE_KEY, NONE);
}
}
g_object_unref(proxygsettings);
_setSensitivity();
}