Share pages refactoring

This commit is contained in:
pokamest 2021-11-13 16:09:08 +03:00
parent 396af917b5
commit 836075de10
15 changed files with 222 additions and 622 deletions

View file

@ -135,5 +135,6 @@
<file>ui/qml/Controls/TextAreaType.qml</file>
<file>ui/qml/Controls/ContextMenu.qml</file>
<file>ui/qml/Pages/Share/PageShareProtoAmnezia.qml</file>
<file>ui/qml/Controls/ShareConnectionButtonCopyType.qml</file>
</qresource>
</RCC>

View file

@ -14,8 +14,6 @@ class PageLogicBase : public QObject
{
Q_OBJECT
AUTO_PROPERTY(bool, pageEnabled)
// AUTO_PROPERTY(int, serverIndex)
// AUTO_PROPERTY(DockerContainer, dockerContainer)
public:
explicit PageLogicBase(UiLogic *uiLogic, QObject *parent = nullptr);

View file

@ -127,5 +127,5 @@ void ServerSettingsLogic::onLineEditDescriptionEditingFinished()
void ServerSettingsLogic::onPushButtonShareFullClicked()
{
uiLogic()->shareConnectionLogic()->updateSharingPage(uiLogic()->selectedServerIndex, m_settings.serverCredentials(uiLogic()->selectedServerIndex), DockerContainer::None);
emit uiLogic()->goToPage(Page::ShareConnection);
emit uiLogic()->goToShareProtocolPage(Protocol::Any);
}

View file

@ -23,161 +23,76 @@
ShareConnectionLogic::ShareConnectionLogic(UiLogic *logic, QObject *parent):
PageLogicBase(logic, parent),
m_textEditShareOpenVpnCodeText{},
m_pushButtonShareOpenVpnCopyEnabled{false},
m_pushButtonShareOpenVpnSaveEnabled{false},
m_lineEditShareShadowSocksStringText{},
m_labelShareShadowSocksQrCodeText{},
m_shareShadowSocksQrCodeText{},
m_labelShareShadowSocksServerText{},
m_labelShareShadowSocksPortText{},
m_labelShareShadowSocksMethodText{},
m_labelShareShadowSocksPasswordText{},
m_plainTextEditShareCloakText{},
m_textEditShareFullCodeText{},
m_textEditShareCloakText{},
m_textEditShareAmneziaCodeText{},
m_pushButtonShareFullCopyText{tr("Copy")},
m_pushButtonShareAmneziaCopyText{tr("Copy")},
m_pushButtonShareOpenVpnCopyText{tr("Copy")},
m_pushButtonShareShadowSocksCopyText{tr("Copy")},
m_pushButtonShareCloakCopyText{tr("Copy")},
m_pushButtonShareAmneziaGenerateEnabled{true},
m_pushButtonShareAmneziaCopyEnabled{true},
m_pushButtonShareAmneziaGenerateText{tr("Generate config")},
m_pushButtonShareOpenVpnGenerateEnabled{true},
m_pushButtonShareOpenVpnGenerateText{tr("Generate config")}
{
// TODO consider move to Component.onCompleted
//updateSharingPage(uiLogic()->selectedServerIndex, m_settings.serverCredentials(uiLogic()->selectedServerIndex), uiLogic()->selectedDockerContainer);
}
void ShareConnectionLogic::onPushButtonShareFullCopyClicked()
void ShareConnectionLogic::onUpdatePage()
{
QGuiApplication::clipboard()->setText(textEditShareFullCodeText());
set_pushButtonShareFullCopyText(tr("Copied"));
QTimer::singleShot(3000, this, [this]() {
set_pushButtonShareFullCopyText(tr("Copy"));
});
}
void ShareConnectionLogic::onPushButtonShareFullSaveClicked()
{
if (textEditShareFullCodeText().isEmpty()) return;
QString fileName = QFileDialog::getSaveFileName(nullptr, tr("Save AmneziaVPN config"),
QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation), "*.amnezia");
QSaveFile save(fileName);
save.open(QIODevice::WriteOnly);
save.write(textEditShareFullCodeText().toUtf8());
save.commit();
}
void ShareConnectionLogic::onPushButtonShareAmneziaCopyClicked()
{
if (textEditShareAmneziaCodeText().isEmpty()) return;
QGuiApplication::clipboard()->setText(textEditShareAmneziaCodeText());
set_pushButtonShareAmneziaCopyText(tr("Copied"));
QTimer::singleShot(3000, this, [this]() {
set_pushButtonShareAmneziaCopyText(tr("Copy"));
});
}
void ShareConnectionLogic::onPushButtonShareAmneziaSaveClicked()
{
if (textEditShareAmneziaCodeText().isEmpty()) return;
QString fileName = QFileDialog::getSaveFileName(nullptr, tr("Save AmneziaVPN config"),
QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation), "*.amnezia");
QSaveFile save(fileName);
save.open(QIODevice::WriteOnly);
save.write(textEditShareAmneziaCodeText().toUtf8());
save.commit();
}
void ShareConnectionLogic::onPushButtonShareOpenVpnCopyClicked()
{
QGuiApplication::clipboard()->setText(textEditShareOpenVpnCodeText());
set_pushButtonShareOpenVpnCopyText(tr("Copied"));
QTimer::singleShot(3000, this, [this]() {
set_pushButtonShareOpenVpnCopyText(tr("Copy"));
});
}
void ShareConnectionLogic::onPushButtonShareShadowSocksCopyClicked()
{
QGuiApplication::clipboard()->setText(lineEditShareShadowSocksStringText());
set_pushButtonShareShadowSocksCopyText(tr("Copied"));
QTimer::singleShot(3000, this, [this]() {
set_pushButtonShareShadowSocksCopyText(tr("Copy"));
});
}
void ShareConnectionLogic::onPushButtonShareCloakCopyClicked()
{
QGuiApplication::clipboard()->setText(plainTextEditShareCloakText());
set_pushButtonShareCloakCopyText(tr("Copied"));
QTimer::singleShot(3000, this, [this]() {
set_pushButtonShareCloakCopyText(tr("Copy"));
});
}
void ShareConnectionLogic::onPushButtonShareAmneziaGenerateClicked()
{
set_pushButtonShareAmneziaGenerateEnabled(false);
set_pushButtonShareAmneziaCopyEnabled(false);
set_pushButtonShareAmneziaGenerateText(tr("Generating..."));
qApp->processEvents();
ServerCredentials credentials = m_settings.serverCredentials(uiLogic()->selectedServerIndex);
QJsonObject containerConfig = m_settings.containerConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer);
containerConfig.insert(config_key::container, ContainerProps::containerToString(uiLogic()->selectedDockerContainer));
ErrorCode e = ErrorCode::NoError;
for (Protocol p: ContainerProps::protocolsForContainer(uiLogic()->selectedDockerContainer)) {
QJsonObject protoConfig = m_settings.protocolConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer, p);
QString cfg = VpnConfigurator::genVpnProtocolConfig(credentials, uiLogic()->selectedDockerContainer, containerConfig, p, &e);
if (e) {
cfg = "Error generating config";
break;
}
protoConfig.insert(config_key::last_config, cfg);
containerConfig.insert(ProtocolProps::protoToString(p), protoConfig);
}
QByteArray ba;
if (!e) {
QJsonObject serverConfig = m_settings.server(uiLogic()->selectedServerIndex);
serverConfig.remove(config_key::userName);
serverConfig.remove(config_key::password);
serverConfig.remove(config_key::port);
serverConfig.insert(config_key::containers, QJsonArray {containerConfig});
serverConfig.insert(config_key::defaultContainer, ContainerProps::containerToString(uiLogic()->selectedDockerContainer));
ba = QJsonDocument(serverConfig).toJson().toBase64(QByteArray::Base64UrlEncoding | QByteArray::OmitTrailingEquals);
set_textEditShareAmneziaCodeText(QString("vpn://%1").arg(QString(ba)));
set_textEditShareAmneziaCodeText("");
QJsonObject serverConfig;
// Full access
if (shareFullAccess()) {
serverConfig = m_settings.server(uiLogic()->selectedServerIndex);
}
// Container share
else {
set_textEditShareAmneziaCodeText(tr("Error while generating connection profile"));
ServerCredentials credentials = m_settings.serverCredentials(uiLogic()->selectedServerIndex);
QJsonObject containerConfig = m_settings.containerConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer);
containerConfig.insert(config_key::container, ContainerProps::containerToString(uiLogic()->selectedDockerContainer));
ErrorCode e = ErrorCode::NoError;
for (Protocol p: ContainerProps::protocolsForContainer(uiLogic()->selectedDockerContainer)) {
QJsonObject protoConfig = m_settings.protocolConfig(uiLogic()->selectedServerIndex, uiLogic()->selectedDockerContainer, p);
QString cfg = VpnConfigurator::genVpnProtocolConfig(credentials, uiLogic()->selectedDockerContainer, containerConfig, p, &e);
if (e) {
cfg = "Error generating config";
break;
}
protoConfig.insert(config_key::last_config, cfg);
containerConfig.insert(ProtocolProps::protoToString(p), protoConfig);
}
QByteArray ba;
if (!e) {
serverConfig = m_settings.server(uiLogic()->selectedServerIndex);
serverConfig.remove(config_key::userName);
serverConfig.remove(config_key::password);
serverConfig.remove(config_key::port);
serverConfig.insert(config_key::containers, QJsonArray {containerConfig});
serverConfig.insert(config_key::defaultContainer, ContainerProps::containerToString(uiLogic()->selectedDockerContainer));
}
else {
set_textEditShareAmneziaCodeText(tr("Error while generating connection profile"));
return;
}
}
set_pushButtonShareAmneziaGenerateEnabled(true);
set_pushButtonShareAmneziaCopyEnabled(true);
set_pushButtonShareAmneziaGenerateText(tr("Generate config"));
QByteArray ba = QJsonDocument(serverConfig).toJson().toBase64(QByteArray::Base64UrlEncoding | QByteArray::OmitTrailingEquals);
QString code = QString("vpn://%1").arg(QString(ba));
set_textEditShareAmneziaCodeText(code);
QImage qr = updateQRCodeImage(code);
set_shareAmneziaQrCodeText(imageToBase64(qr));
}
void ShareConnectionLogic::onPushButtonShareOpenVpnGenerateClicked()
{
set_pushButtonShareOpenVpnGenerateEnabled(false);
set_pushButtonShareOpenVpnCopyEnabled(false);
set_pushButtonShareOpenVpnSaveEnabled(false);
set_pushButtonShareOpenVpnGenerateText(tr("Generating..."));
ServerCredentials credentials = m_settings.serverCredentials(uiLogic()->selectedServerIndex);
@ -189,49 +104,19 @@ void ShareConnectionLogic::onPushButtonShareOpenVpnGenerateClicked()
set_textEditShareOpenVpnCodeText(QJsonDocument::fromJson(cfg.toUtf8()).object()[config_key::config].toString());
set_pushButtonShareOpenVpnGenerateEnabled(true);
set_pushButtonShareOpenVpnCopyEnabled(true);
set_pushButtonShareOpenVpnSaveEnabled(true);
set_pushButtonShareOpenVpnGenerateText(tr("Generate config"));
}
void ShareConnectionLogic::onPushButtonShareOpenVpnSaveClicked()
{
QString fileName = QFileDialog::getSaveFileName(nullptr, tr("Save OpenVPN config"),
QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation), "*.ovpn");
QSaveFile save(fileName);
save.open(QIODevice::WriteOnly);
save.write(textEditShareOpenVpnCodeText().toUtf8());
save.commit();
}
void ShareConnectionLogic::updateSharingPage(int serverIndex, const ServerCredentials &credentials,
DockerContainer container)
{
uiLogic()->selectedDockerContainer = container;
uiLogic()->selectedServerIndex = serverIndex;
set_shareFullAccess(container == DockerContainer::None);
// Full access
if (container == DockerContainer::None) {
const QJsonObject &server = m_settings.server(uiLogic()->selectedServerIndex);
QByteArray ba = QJsonDocument(server).toJson().toBase64(QByteArray::Base64UrlEncoding | QByteArray::OmitTrailingEquals);
set_textEditShareFullCodeText(QString("vpn://%1").arg(QString(ba)));
}
else {
if (! shareFullAccess()) {
for (Protocol p : ContainerProps::protocolsForContainer(container)) {
if (p == Protocol::OpenVpn) {
QString cfg = tr("Press Generate config");
set_textEditShareOpenVpnCodeText(cfg);
set_pushButtonShareOpenVpnCopyEnabled(false);
set_pushButtonShareOpenVpnSaveEnabled(false);
}
else if (p == Protocol::ShadowSocks) {
if (p == Protocol::ShadowSocks) {
QJsonObject protoConfig = m_settings.protocolConfig(serverIndex, container, Protocol::ShadowSocks);
QString cfg = protoConfig.value(config_key::last_config).toString();
@ -254,7 +139,7 @@ void ShareConnectionLogic::updateSharingPage(int serverIndex, const ServerCreden
set_lineEditShareShadowSocksStringText(ssString);
QImage qr = updateQRCodeImage(ssString);
set_labelShareShadowSocksQrCodeText(imageToBase64(qr));
set_shareShadowSocksQrCodeText(imageToBase64(qr));
set_labelShareShadowSocksServerText(ssConfig.value("server").toString());
set_labelShareShadowSocksPortText(ssConfig.value("server_port").toString());
@ -263,7 +148,7 @@ void ShareConnectionLogic::updateSharingPage(int serverIndex, const ServerCreden
}
else if (p == Protocol::Cloak) {
set_plainTextEditShareCloakText(QString(""));
set_textEditShareCloakText(QString(""));
QJsonObject protoConfig = m_settings.protocolConfig(serverIndex, container, Protocol::Cloak);
QString cfg = protoConfig.value(config_key::last_config).toString();
@ -281,29 +166,15 @@ void ShareConnectionLogic::updateSharingPage(int serverIndex, const ServerCreden
cloakConfig.remove(config_key::transport_proto);
cloakConfig.insert("ProxyMethod", "shadowsocks");
set_plainTextEditShareCloakText(QJsonDocument(cloakConfig).toJson());
set_textEditShareCloakText(QJsonDocument(cloakConfig).toJson());
}
}
}
//ui->toolBox_share_connection->addItem(ui->page_share_amnezia, tr(" Share for Amnezia client"));
// Amnezia sharing
// QJsonObject exportContainer;
// for (Protocol p: protocolsForContainer(container)) {
// QJsonObject protocolConfig = containerConfig.value(ProtocolProps::protoToString(p)).toObject();
// protocolConfig.remove(config_key::last_config);
// exportContainer.insert(ProtocolProps::protoToString(p), protocolConfig);
// }
// exportContainer.insert(config_key::container, containerToString(container));
// ui->textEdit_share_amnezia_code->setPlainText(QJsonDocument(exportContainer).toJson());
set_textEditShareAmneziaCodeText(tr(""));
}
QImage ShareConnectionLogic::updateQRCodeImage(const QString &text)
{
int levelIndex = 1;

View file

@ -11,40 +11,28 @@ class ShareConnectionLogic: public PageLogicBase
Q_OBJECT
public:
AUTO_PROPERTY(bool, shareFullAccess)
AUTO_PROPERTY(QString, textEditShareAmneziaCodeText)
AUTO_PROPERTY(QString, shareAmneziaQrCodeText)
AUTO_PROPERTY(QString, textEditShareOpenVpnCodeText)
AUTO_PROPERTY(bool, pushButtonShareOpenVpnCopyEnabled)
AUTO_PROPERTY(bool, pushButtonShareOpenVpnSaveEnabled)
AUTO_PROPERTY(QString, pushButtonShareOpenVpnGenerateText)
AUTO_PROPERTY(QString, lineEditShareShadowSocksStringText)
AUTO_PROPERTY(QString, labelShareShadowSocksQrCodeText)
AUTO_PROPERTY(QString, shareShadowSocksQrCodeText)
AUTO_PROPERTY(QString, labelShareShadowSocksServerText)
AUTO_PROPERTY(QString, labelShareShadowSocksPortText)
AUTO_PROPERTY(QString, labelShareShadowSocksMethodText)
AUTO_PROPERTY(QString, labelShareShadowSocksPasswordText)
AUTO_PROPERTY(QString, plainTextEditShareCloakText)
AUTO_PROPERTY(QString, textEditShareFullCodeText)
AUTO_PROPERTY(QString, textEditShareAmneziaCodeText)
AUTO_PROPERTY(QString, pushButtonShareFullCopyText)
AUTO_PROPERTY(QString, pushButtonShareAmneziaCopyText)
AUTO_PROPERTY(QString, pushButtonShareOpenVpnCopyText)
AUTO_PROPERTY(QString, pushButtonShareShadowSocksCopyText)
AUTO_PROPERTY(QString, pushButtonShareCloakCopyText)
AUTO_PROPERTY(bool, pushButtonShareAmneziaGenerateEnabled)
AUTO_PROPERTY(bool, pushButtonShareAmneziaCopyEnabled)
AUTO_PROPERTY(QString, pushButtonShareAmneziaGenerateText)
AUTO_PROPERTY(bool, pushButtonShareOpenVpnGenerateEnabled)
AUTO_PROPERTY(QString, pushButtonShareOpenVpnGenerateText)
AUTO_PROPERTY(QString, textEditShareCloakText)
public:
Q_INVOKABLE void onPushButtonShareFullCopyClicked();
Q_INVOKABLE void onPushButtonShareFullSaveClicked();
Q_INVOKABLE void onPushButtonShareAmneziaCopyClicked();
Q_INVOKABLE void onPushButtonShareAmneziaSaveClicked();
Q_INVOKABLE void onPushButtonShareOpenVpnCopyClicked();
Q_INVOKABLE void onPushButtonShareShadowSocksCopyClicked();
Q_INVOKABLE void onPushButtonShareCloakCopyClicked();
Q_INVOKABLE void onPushButtonShareAmneziaGenerateClicked();
Q_INVOKABLE void onPushButtonShareOpenVpnGenerateClicked();
Q_INVOKABLE void onPushButtonShareOpenVpnSaveClicked();
Q_INVOKABLE virtual void onUpdatePage() override;
public:
explicit ShareConnectionLogic(UiLogic *uiLogic, QObject *parent = nullptr);

View file

@ -0,0 +1,20 @@
import QtQuick 2.12
import QtQuick.Controls 2.12
ShareConnectionButtonType {
readonly property string start_text: qsTr("Copy")
readonly property string end_text: qsTr("Copied")
Timer {
id: timer
interval: 1000; running: false; repeat: false
onTriggered: text = start_text
}
text: start_text
onClicked: {
text = end_text
timer.running = true
}
}

View file

@ -8,7 +8,9 @@ BasicButtonType {
background: Rectangle {
anchors.fill: parent
radius: 4
color: root.containsMouse ? "#282932" : "#181922"
color: root.enabled
? (root.containsMouse ? "#282932" : "#181922")
: "#484952"
}
font.pixelSize: 16
contentItem: Text {

View file

@ -14,12 +14,10 @@ Flickable
id: root
property bool error: false
width: parent.width - 80
height: 40
anchors.topMargin: 5
selectByMouse: false
selectionColor: "darkgray"
font.pixelSize: 16
color: "#333333"

View file

@ -44,13 +44,6 @@ PageBase {
topPadding: 20
spacing: 10
// Caption {
// id: cap1
// text: qsTr("Installed Protocols and Services")
// font.pixelSize: 20
// }
SortFilterProxyModel {
id: proxyProtocolsModel
sourceModel: UiLogic.protocolsModel
@ -92,323 +85,8 @@ PageBase {
onClicked: UiLogic.onGotoShareProtocolPage(proxyProtocolsModel.mapToSource(index))
}
// Rectangle {
// id: c_item
// x: 0
// y: 0
// width: parent.width
// height: 40
// color: "transparent"
// clip: true
// radius: 2
// LinearGradient {
// anchors.fill: parent
// start: Qt.point(0, 0)
// end: Qt.point(0, height)
// gradient: Gradient {
// GradientStop { position: 0.0; color: "#E1E1E1" }
// GradientStop { position: 0.4; color: "#DDDDDD" }
// GradientStop { position: 0.5; color: "#D8D8D8" }
// GradientStop { position: 1.0; color: "#D3D3D3" }
// }
// }
// Image {
// anchors.verticalCenter: parent.verticalCenter
// anchors.left: parent.left
// anchors.leftMargin: 10
// source: "qrc:/images/share.png"
// }
// Rectangle {
// anchors.left: parent.left
// anchors.right: parent.right
// anchors.bottom: parent.bottom
// height: 2
// color: "#148CD2"
// visible: ms.containsMouse ? true : false
// }
// Text {
// x: 40
// anchors.verticalCenter: parent.verticalCenter
// font.family: "Lato"
// font.styleName: "normal"
// font.pixelSize: 18
// color: "#100A44"
// font.bold: true
// text: name_role
// horizontalAlignment: Text.AlignLeft
// verticalAlignment: Text.AlignVCenter
// wrapMode: Text.Wrap
// }
// MouseArea {
// id: ms
// anchors.fill: parent
// hoverEnabled: true
// onClicked: UiLogic.onGotoShareProtocolPage(proxyProtocolsModel.mapToSource(index))
// }
// }
// Item {
// id: c_item
// width: parent.width
// height: row_container.height
// anchors.left: parent.left
// Rectangle {
// anchors.top: parent.top
// width: parent.width
// height: 1
// color: "lightgray"
// visible: index !== tb_c.currentIndex
// }
// Rectangle {
// anchors.top: row_container.top
// anchors.bottom: row_container.bottom
// anchors.left: parent.left
// anchors.right: parent.right
// color: "#63B4FB"
// visible: index === tb_c.currentIndex
// }
// RowLayout {
// id: row_container
// //width: parent.width
// anchors.left: parent.left
// anchors.right: parent.right
//// anchors.top: lb_container_name.top
//// anchors.bottom: lb_container_name.bottom
// Text {
// id: lb_container_name
// text: name_role
// font.pixelSize: 17
// //font.bold: true
// color: "#100A44"
// topPadding: 5
// bottomPadding: 5
// leftPadding: 10
// verticalAlignment: Text.AlignVCenter
// wrapMode: Text.WordWrap
// Layout.fillWidth: true
// MouseArea {
// enabled: col.visible
// anchors.top: lb_container_name.top
// anchors.bottom: lb_container_name.bottom
// anchors.left: parent.left
// anchors.right: parent.right
// propagateComposedEvents: true
// onClicked: {
// if (tb_c.currentIndex === index) tb_c.currentIndex = -1
// else tb_c.currentIndex = index
// UiLogic.protocolsModel.setSelectedDockerContainer(proxyContainersModel.mapToSource(index))
// }
// }
// }
// }
// }
}
}
}
}
// ScrollView {
// x: 10
// y: 40
// width: 360
// height: 580
// Item {
// id: ct
// width: parent.width
// height: childrenRect.height + 10
// property var contentList: [
// full_access,
// share_amezia,
// share_openvpn,
// share_shadowshock,
// share_cloak
// ]
// property int currentIndex: ShareConnectionLogic.toolBoxShareConnectionCurrentIndex
// onCurrentIndexChanged: {
// ShareConnectionLogic.toolBoxShareConnectionCurrentIndex = currentIndex
// for (let i = 0; i < contentList.length; ++i) {
// if (i == currentIndex) {
// contentList[i].active = true
// } else {
// contentList[i].active = false
// }
// }
// }
// function clearActive() {
// for (let i = 0; i < contentList.length; ++i) {
// contentList[i].active = false
// }
// currentIndex = -1;
// }
// Column {
// spacing: 5
// ShareConnectionContent {
// id: full_access
// x: 0
// text: qsTr("Full access")
// visible: ShareConnectionLogic.pageShareFullAccessVisible
// content: Component {
// Item {
// width: 360
// height: 380
// Text {
// x: 10
// y: 250
// width: 341
// height: 111
// font.family: "Lato"
// font.styleName: "normal"
// font.pixelSize: 16
// color: "#181922"
// horizontalAlignment: Text.AlignLeft
// verticalAlignment: Text.AlignVCenter
// wrapMode: Text.Wrap
// text: qsTr("Anyone who logs in with this code will have the same permissions to use VPN and your server as you. \nThis code includes your server credentials!\nProvide this code only to TRUSTED users.")
// }
// ShareConnectionButtonType {
// x: 10
// y: 130
// width: 341
// height: 40
// text: ShareConnectionLogic.pushButtonShareFullCopyText
// onClicked: {
// ShareConnectionLogic.onPushButtonShareFullCopyClicked()
// }
// }
// ShareConnectionButtonType {
// x: 10
// y: 180
// width: 341
// height: 40
// text: qsTr("Save file")
// onClicked: {
// ShareConnectionLogic.onPushButtonShareFullSaveClicked()
// }
// }
// TextFieldType {
// x: 10
// y: 10
// width: 341
// height: 100
// verticalAlignment: Text.AlignTop
// text: ShareConnectionLogic.textEditShareFullCodeText
// onEditingFinished: {
// ShareConnectionLogic.textEditShareFullCodeText = text
// }
// }
// }
// }
// onClicked: {
// if (active) {
// ct.currentIndex = -1
// } else {
// ct.clearActive()
// ct.currentIndex = 0
// }
// }
// }
// ShareConnectionContent {
// id: share_amezia
// x: 0
// text: qsTr("Share for Amnezia client")
// visible: ShareConnectionLogic.pageShareAmneziaVisible
// content: Component {
// Item {
// width: 360
// height: 380
// }
// }
// onClicked: {
// if (active) {
// ct.currentIndex = -1
// } else {
// ct.clearActive()
// ct.currentIndex = 1
// }
// }
// }
// ShareConnectionContent {
// id: share_shadowshock
// x: 0
// text: qsTr("Share for ShadowSocks client")
// visible: ShareConnectionLogic.pageShareShadowSocksVisible
// content: Component {
// Item {
// width: 360
// height: 380
// }
// }
// onClicked: {
// if (active) {
// ct.currentIndex = -1
// } else {
// ct.clearActive()
// ct.currentIndex = 3
// }
// }
// }
// ShareConnectionContent {
// id: share_cloak
// x: 0
// text: qsTr("Share for Cloak client")
// visible: ShareConnectionLogic.pageShareCloakVisible
// content: Component {
// Item {
// width: 360
// height: 380
// }
// }
// onClicked: {
// if (active) {
// ct.currentIndex = -1
// } else {
// ct.clearActive()
// ct.currentIndex = 4
// }
// }
// }
// }
// }
// }
}

View file

@ -11,6 +11,11 @@ PageShareProtocolBase {
protocol: ProtocolEnum.Any
logic: ShareConnectionLogic
readonly property string generateConfigText: qsTr("Generate config")
readonly property string generatingConfigText: qsTr("Generating config...")
readonly property string showConfigText: qsTr("Show config")
property bool genConfigProcess: false
BackButton {
id: back
}
@ -19,72 +24,113 @@ PageShareProtocolBase {
text: qsTr("Share for Amnezia")
}
Text {
id: lb_desc
Flickable {
id: fl
width: root.width
anchors.top: caption.bottom
anchors.topMargin: 20
width: parent.width - 60
anchors.horizontalCenter: root.horizontalCenter
font.family: "Lato"
font.styleName: "normal"
font.pixelSize: 16
color: "#181922"
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignVCenter
wrapMode: Text.Wrap
text: qsTr("Anyone who logs in with this code will be able to connect to this VPN server. \nThis code does not include server credentials.")
}
TextAreaType {
anchors.top: lb_desc.bottom
anchors.topMargin: 20
anchors.bottom: pb_gen.top
anchors.bottomMargin: 20
anchors.horizontalCenter: root.horizontalCenter
width: parent.width - 60
textArea.readOnly: true
textArea.wrapMode: TextEdit.WrapAnywhere
textArea.verticalAlignment: Text.AlignTop
textArea.text: ShareConnectionLogic.textEditShareAmneziaCodeText
}
ShareConnectionButtonType {
id: pb_gen
anchors.bottom: pb_copy.top
anchors.bottomMargin: 10
anchors.horizontalCenter: root.horizontalCenter
width: parent.width - 60
text: ShareConnectionLogic.pushButtonShareAmneziaGenerateText
enabled: ShareConnectionLogic.pushButtonShareAmneziaGenerateEnabled
onClicked: {
ShareConnectionLogic.onPushButtonShareAmneziaGenerateClicked()
}
}
ShareConnectionButtonType {
id: pb_copy
anchors.bottom: pb_save.top
anchors.bottomMargin: 10
anchors.horizontalCenter: root.horizontalCenter
width: parent.width - 60
text: ShareConnectionLogic.pushButtonShareAmneziaCopyText
onClicked: {
ShareConnectionLogic.onPushButtonShareAmneziaCopyClicked()
}
enabled: ShareConnectionLogic.pushButtonShareAmneziaCopyEnabled
}
ShareConnectionButtonType {
id: pb_save
anchors.bottom: root.bottom
anchors.bottomMargin: 10
anchors.horizontalCenter: root.horizontalCenter
width: parent.width - 60
text: qsTr("Save file")
onClicked: {
ShareConnectionLogic.onPushButtonShareAmneziaSaveClicked()
anchors.bottomMargin: 20
anchors.left: root.left
anchors.leftMargin: 30
anchors.right: root.right
anchors.rightMargin: 30
contentHeight: content.height + 20
clip: true
ColumnLayout {
id: content
enabled: logic.pageEnabled
anchors.top: parent.top
anchors.left: parent.left
anchors.right: parent.right
Text {
id: lb_desc
Layout.fillWidth: true
font.family: "Lato"
font.styleName: "normal"
font.pixelSize: 16
color: "#181922"
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
wrapMode: Text.Wrap
text: ShareConnectionLogic.shareFullAccess
? qsTr("Anyone who logs in with this code will have the same permissions to use VPN and YOUR SERVER as you. \n
This code includes your server credentials!\n
Provide this code only to TRUSTED users.")
: qsTr("Anyone who logs in with this code will be able to connect to this VPN server. \n
This code does not include server credentials.")
}
ShareConnectionButtonType {
id: pb_gen
Layout.topMargin: 20
Layout.fillWidth: true
Layout.preferredHeight: 40
text: ShareConnectionLogic.shareFullAccess
? showConfigText
: (genConfigProcess ? generatingConfigText : generateConfigText)
onClicked: {
enabled = false
genConfigProcess = true
ShareConnectionLogic.onPushButtonShareAmneziaGenerateClicked()
enabled = true
genConfigProcess = false
}
}
TextAreaType {
id: tfShareCode
Layout.topMargin: 20
Layout.bottomMargin: 20
Layout.preferredHeight: 200
Layout.fillWidth: true
textArea.readOnly: true
textArea.wrapMode: TextEdit.WrapAnywhere
textArea.verticalAlignment: Text.AlignTop
textArea.text: ShareConnectionLogic.textEditShareAmneziaCodeText
visible: tfShareCode.textArea.length > 0
}
ShareConnectionButtonCopyType {
id: pb_copy
Layout.bottomMargin: 10
Layout.fillWidth: true
Layout.preferredHeight: 40
enabled: tfShareCode.textArea.length > 0
visible: tfShareCode.textArea.length > 0
}
ShareConnectionButtonType {
id: pb_save
Layout.bottomMargin: 10
Layout.fillWidth: true
Layout.preferredHeight: 40
text: qsTr("Save to file")
enabled: tfShareCode.textArea.length > 0
visible: tfShareCode.textArea.length > 0
onClicked: {
UiLogic.saveTextFile(qsTr("Save AmneziaVPN config"), "*.vpn", tfShareCode.textArea.text)
}
}
Image {
id: label_share_code
Layout.topMargin: 20
Layout.fillWidth: true
Layout.preferredHeight: width
smooth: false
source: ShareConnectionLogic.shareAmneziaQrCodeText
}
}
}
}

View file

@ -29,22 +29,15 @@ PageShareProtocolBase {
width: parent.width - 60
textArea.readOnly: true
textArea.text: ShareConnectionLogic.plainTextEditShareCloakText
textArea.text: ShareConnectionLogic.textEditShareCloakText
}
ShareConnectionButtonType {
ShareConnectionButtonCopyType {
id: pb_save
anchors.bottom: root.bottom
anchors.bottomMargin: 10
anchors.horizontalCenter: root.horizontalCenter
width: parent.width - 60
text: ShareConnectionLogic.pushButtonShareCloakCopyText
//enabled: ShareConnectionLogic.pushButtonShareCloakCopyEnabled
onClicked: {
ShareConnectionLogic.onPushButtonShareCloakCopyClicked()
}
}
}

View file

@ -20,6 +20,7 @@ PageShareProtocolBase {
}
TextAreaType {
id: tfShareCode
anchors.top: caption.bottom
anchors.topMargin: 20
anchors.bottom: pb_gen.top
@ -44,22 +45,19 @@ PageShareProtocolBase {
text: ShareConnectionLogic.pushButtonShareOpenVpnGenerateText
onClicked: {
enabled = false
ShareConnectionLogic.onPushButtonShareOpenVpnGenerateClicked()
enabled = true
}
enabled: ShareConnectionLogic.pushButtonShareOpenVpnGenerateEnabled
}
ShareConnectionButtonType {
ShareConnectionButtonCopyType {
id: pb_copy
anchors.bottom: pb_save.top
anchors.bottomMargin: 10
anchors.horizontalCenter: root.horizontalCenter
width: parent.width - 60
text: ShareConnectionLogic.pushButtonShareOpenVpnCopyText
enabled: ShareConnectionLogic.pushButtonShareOpenVpnCopyEnabled
onClicked: {
ShareConnectionLogic.onPushButtonShareOpenVpnCopyClicked()
}
enabled: tfShareCode.textArea.length > 0
}
ShareConnectionButtonType {
id: pb_save
@ -68,10 +66,11 @@ PageShareProtocolBase {
anchors.horizontalCenter: root.horizontalCenter
width: parent.width - 60
text: qsTr("Save file")
enabled: ShareConnectionLogic.pushButtonShareOpenVpnSaveEnabled
text: qsTr("Save to file")
enabled: tfShareCode.textArea.length > 0
onClicked: {
ShareConnectionLogic.onPushButtonShareOpenVpnSaveClicked()
UiLogic.saveTextFile(qsTr("Save OpenVPN config"), "*.ovpn", tfShareCode.textArea.text)
}
}
}

View file

@ -24,7 +24,7 @@ PageShareProtocolBase {
width: root.width
anchors.top: caption.bottom
anchors.topMargin: 20
anchors.bottom: parent.bottom
anchors.bottom: root.bottom
anchors.bottomMargin: 20
anchors.left: root.left
anchors.leftMargin: 30
@ -108,14 +108,10 @@ PageShareProtocolBase {
text: ShareConnectionLogic.lineEditShareShadowSocksStringText
readOnly: true
}
ShareConnectionButtonType {
height: 40
ShareConnectionButtonCopyType {
Layout.preferredHeight: 40
Layout.fillWidth: true
text: ShareConnectionLogic.pushButtonShareShadowSocksCopyText
enabled: tfConnString.length > 0
onClicked: {
ShareConnectionLogic.onPushButtonShareShadowSocksCopyClicked()
}
}
Image {
@ -124,7 +120,7 @@ PageShareProtocolBase {
Layout.fillWidth: true
Layout.preferredHeight: width
smooth: false
source: ShareConnectionLogic.labelShareShadowSocksQrCodeText
source: ShareConnectionLogic.shareShadowSocksQrCodeText
}
}
}

View file

@ -697,4 +697,13 @@ void UiLogic::setTrayState(VpnProtocol::ConnectionState state)
}
bool UiLogic::saveTextFile(const QString& desc, const QString& ext, const QString& data)
{
QString fileName = QFileDialog::getSaveFileName(nullptr, desc,
QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation), ext);
QSaveFile save(fileName);
save.open(QIODevice::WriteOnly);
save.write(data.toUtf8());
return save.commit();
}

View file

@ -98,6 +98,7 @@ public:
Q_INVOKABLE void keyPressEvent(Qt::Key key);
Q_INVOKABLE bool saveTextFile(const QString& desc, const QString& ext, const QString& data);
QString getTrayIconUrl() const;
void setTrayIconUrl(const QString &trayIconUrl);