changed the way to create qml pages, now the page is created when you go to it
- added PageSetupWizardConfigSource, PageSetupWizardInstalling, PageSetupWizardProtocolSettings, PageSetupWizardTextKey
This commit is contained in:
parent
68b27451f2
commit
4f36349630
25 changed files with 503 additions and 158 deletions
|
@ -99,6 +99,10 @@ void AmneziaApplication::init()
|
|||
}, Qt::QueuedConnection);
|
||||
|
||||
m_engine->rootContext()->setContextProperty("Debug", &Logger::Instance());
|
||||
|
||||
m_containersModel.reset(new ContainersModel(m_settings, this));
|
||||
m_engine->rootContext()->setContextProperty("ContainersModel", m_containersModel.get());
|
||||
|
||||
m_uiLogic->registerPagesLogic();
|
||||
|
||||
#if defined(Q_OS_IOS)
|
||||
|
@ -180,6 +184,8 @@ void AmneziaApplication::loadFonts()
|
|||
QFontDatabase::addApplicationFont(":/fonts/Lato-Regular.ttf");
|
||||
QFontDatabase::addApplicationFont(":/fonts/Lato-Thin.ttf");
|
||||
QFontDatabase::addApplicationFont(":/fonts/Lato-ThinItalic.ttf");
|
||||
|
||||
QFontDatabase::addApplicationFont(":/fonts/pt-root-ui_vf.ttf");
|
||||
}
|
||||
|
||||
void AmneziaApplication::loadTranslator()
|
||||
|
|
|
@ -56,6 +56,8 @@ private:
|
|||
QTranslator* m_translator;
|
||||
QCommandLineParser m_parser;
|
||||
|
||||
QScopedPointer<ContainersModel> m_containersModel;
|
||||
|
||||
};
|
||||
|
||||
#endif // AMNEZIA_APPLICATION_H
|
||||
|
|
3
client/images/controls/folder-open.svg
Normal file
3
client/images/controls/folder-open.svg
Normal file
|
@ -0,0 +1,3 @@
|
|||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M6 14L7.45 11.1C7.61696 10.7687 7.87281 10.4903 8.18893 10.296C8.50504 10.1018 8.86897 9.99927 9.24 10H20C20.3055 9.99946 20.6071 10.0689 20.8816 10.2031C21.1561 10.3372 21.3963 10.5325 21.5836 10.7739C21.7709 11.0152 21.9004 11.2963 21.9622 11.5956C22.024 11.8948 22.0164 12.2042 21.94 12.5L20.39 18.5C20.279 18.9299 20.0281 19.3106 19.6769 19.5822C19.3256 19.8538 18.894 20.0008 18.45 20H4C3.46957 20 2.96086 19.7893 2.58579 19.4142C2.21071 19.0391 2 18.5304 2 18V5C2 3.9 2.9 3 4 3H7.93C8.25941 3.0017 8.58331 3.08475 8.8729 3.24176C9.1625 3.39877 9.40882 3.62488 9.59 3.9L10.41 5.1C10.5912 5.37512 10.8375 5.60123 11.1271 5.75824C11.4167 5.91525 11.7406 5.9983 12.07 6H18C18.5304 6 19.0391 6.21071 19.4142 6.58579C19.7893 6.96086 20 7.46957 20 8V10" stroke="#CBCBCB" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
After Width: | Height: | Size: 948 B |
14
client/images/controls/qr-code.svg
Normal file
14
client/images/controls/qr-code.svg
Normal file
|
@ -0,0 +1,14 @@
|
|||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M7 3H4C3.44772 3 3 3.44772 3 4V7C3 7.55228 3.44772 8 4 8H7C7.55228 8 8 7.55228 8 7V4C8 3.44772 7.55228 3 7 3Z" stroke="#CBCBCB" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M20 3H17C16.4477 3 16 3.44772 16 4V7C16 7.55228 16.4477 8 17 8H20C20.5523 8 21 7.55228 21 7V4C21 3.44772 20.5523 3 20 3Z" stroke="#CBCBCB" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M7 16H4C3.44772 16 3 16.4477 3 17V20C3 20.5523 3.44772 21 4 21H7C7.55228 21 8 20.5523 8 20V17C8 16.4477 7.55228 16 7 16Z" stroke="#CBCBCB" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M21 16H18C17.4696 16 16.9609 16.2107 16.5858 16.5858C16.2107 16.9609 16 17.4696 16 18V21" stroke="#CBCBCB" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M21 21V21.01" stroke="#CBCBCB" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M12 7V10C12 10.5304 11.7893 11.0391 11.4142 11.4142C11.0391 11.7893 10.5304 12 10 12H7" stroke="#CBCBCB" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M3 12H3.01" stroke="#CBCBCB" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M12 3H12.01" stroke="#CBCBCB" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M12 16V16.01" stroke="#CBCBCB" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M16 12H17" stroke="#CBCBCB" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M21 12V12.01" stroke="#CBCBCB" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M12 21V20" stroke="#CBCBCB" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
After Width: | Height: | Size: 1.8 KiB |
5
client/images/controls/text-cursor.svg
Normal file
5
client/images/controls/text-cursor.svg
Normal file
|
@ -0,0 +1,5 @@
|
|||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M17 22H16C14.9391 22 13.9217 21.5786 13.1716 20.8284C12.4214 20.0783 12 19.0609 12 18V6C12 4.93913 12.4214 3.92172 13.1716 3.17157C13.9217 2.42143 14.9391 2 16 2H17" stroke="#CBCBCB" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M7 22H8C9.06087 22 10.0783 21.5786 10.8284 20.8284C11.5786 20.0783 12 19.0609 12 18V17" stroke="#CBCBCB" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M7 2H8C9.06087 2 10.0783 2.42143 10.8284 3.17157C11.5786 3.92172 12 4.93913 12 6V7" stroke="#CBCBCB" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
After Width: | Height: | Size: 717 B |
|
@ -202,5 +202,12 @@
|
|||
<file>ui/qml/Controls2/SwitcherType.qml</file>
|
||||
<file>ui/qml/Pages2/PageTest.qml</file>
|
||||
<file>ui/qml/Controls2/TabButtonType.qml</file>
|
||||
<file>ui/qml/Pages2/PageSetupWizardProtocolSettings.qml</file>
|
||||
<file>ui/qml/Pages2/PageSetupWizardInstalling.qml</file>
|
||||
<file>ui/qml/Pages2/PageSetupWizardConfigSource.qml</file>
|
||||
<file>images/controls/folder-open.svg</file>
|
||||
<file>images/controls/qr-code.svg</file>
|
||||
<file>images/controls/text-cursor.svg</file>
|
||||
<file>ui/qml/Pages2/PageSetupWizardTextKey.qml</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
|
|
@ -56,4 +56,14 @@ void ContainersModel::setSelectedServerIndex(int index)
|
|||
endResetModel();
|
||||
}
|
||||
|
||||
void ContainersModel::setCurrentlyInstalledContainerIndex(int index)
|
||||
{
|
||||
// beginResetModel();
|
||||
m_currentlyInstalledContainerIndex = createIndex(index, 0);
|
||||
// endResetModel();
|
||||
}
|
||||
|
||||
QString ContainersModel::getCurrentlyInstalledContainerName()
|
||||
{
|
||||
return data(m_currentlyInstalledContainerIndex, NameRole).toString();
|
||||
}
|
||||
|
|
|
@ -27,12 +27,16 @@ public:
|
|||
|
||||
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
|
||||
Q_INVOKABLE void setSelectedServerIndex(int index);
|
||||
Q_INVOKABLE void setCurrentlyInstalledContainerIndex(int index);
|
||||
|
||||
Q_INVOKABLE QString getCurrentlyInstalledContainerName();
|
||||
|
||||
protected:
|
||||
QHash<int, QByteArray> roleNames() const override;
|
||||
|
||||
private:
|
||||
int m_selectedServerIndex;
|
||||
QModelIndex m_currentlyInstalledContainerIndex;
|
||||
std::shared_ptr<Settings> m_settings;
|
||||
};
|
||||
|
||||
|
|
|
@ -28,7 +28,9 @@ enum class Page {Start = 0, NewServer, NewServerProtocols, Vpn,
|
|||
ProtocolSettings, ProtocolShare, QrDecoder, QrDecoderIos, About, ViewConfig,
|
||||
AdvancedServerSettings, ClientManagement, ClientInfo,
|
||||
|
||||
Test, WizardCredentials, WizardProtocols, WizardEasySetup};
|
||||
PageStart, PageTest, PageSetupWizardCredentials, PageSetupWizardProtocols, PageSetupWizardEasy,
|
||||
PageSetupWizardProtocolSettings, PageSetupWizardInstalling, PageSetupWizardConfigSource,
|
||||
PageSetupWizardTextKey};
|
||||
Q_ENUM_NS(Page)
|
||||
|
||||
static void declareQmlPageEnum() {
|
||||
|
|
|
@ -22,8 +22,8 @@ ServerContainersLogic::ServerContainersLogic(UiLogic *logic, QObject *parent):
|
|||
|
||||
void ServerContainersLogic::onUpdatePage()
|
||||
{
|
||||
ContainersModel *c_model = qobject_cast<ContainersModel *>(uiLogic()->containersModel());
|
||||
c_model->setSelectedServerIndex(uiLogic()->m_selectedServerIndex);
|
||||
// ContainersModel *c_model = qobject_cast<ContainersModel *>(uiLogic()->containersModel());
|
||||
// c_model->setSelectedServerIndex(uiLogic()->m_selectedServerIndex);
|
||||
|
||||
ProtocolsModel *p_model = qobject_cast<ProtocolsModel *>(uiLogic()->protocolsModel());
|
||||
p_model->setSelectedServerIndex(uiLogic()->m_selectedServerIndex);
|
||||
|
|
|
@ -14,7 +14,6 @@ Button {
|
|||
property string borderColor: "#D7D8DB"
|
||||
property int borderWidth: 0
|
||||
|
||||
implicitWidth: 328
|
||||
implicitHeight: 56
|
||||
|
||||
hoverEnabled: true
|
||||
|
|
|
@ -9,7 +9,9 @@ Item {
|
|||
property string descriptionText
|
||||
|
||||
property var onClickedFunc
|
||||
|
||||
property alias buttonImage: button.image
|
||||
property string iconImage
|
||||
|
||||
implicitWidth: content.implicitWidth
|
||||
implicitHeight: content.implicitHeight
|
||||
|
@ -18,6 +20,13 @@ Item {
|
|||
id: content
|
||||
anchors.fill: parent
|
||||
|
||||
Image {
|
||||
id: icon
|
||||
source: iconImage
|
||||
visible: iconImage ? true : false
|
||||
Layout.rightMargin: visible ? 16 : 0
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
Text {
|
||||
font.family: "PT Root UI"
|
||||
|
@ -25,6 +34,7 @@ Item {
|
|||
font.pixelSize: 18
|
||||
color: "#d7d8db"
|
||||
text: root.text
|
||||
wrapMode: Text.WordWrap
|
||||
|
||||
Layout.fillWidth: true
|
||||
height: 22
|
||||
|
|
|
@ -10,7 +10,11 @@ Item {
|
|||
property string textFieldPlaceholderText
|
||||
property bool textFieldEditable: true
|
||||
|
||||
implicitWidth: 328
|
||||
property string buttonText
|
||||
property var clickedFunc
|
||||
|
||||
property alias textField: textField
|
||||
|
||||
implicitHeight: 74
|
||||
|
||||
Rectangle {
|
||||
|
@ -26,50 +30,77 @@ Item {
|
|||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
RowLayout {
|
||||
anchors.fill: backgroud
|
||||
ColumnLayout {
|
||||
|
||||
Text {
|
||||
text: root.headerText
|
||||
color: "#878b91"
|
||||
font.pixelSize: 13
|
||||
font.weight: 400
|
||||
font.family: "PT Root UI VF"
|
||||
font.letterSpacing: 0.02
|
||||
Text {
|
||||
text: root.headerText
|
||||
color: "#878b91"
|
||||
font.pixelSize: 13
|
||||
font.weight: 400
|
||||
font.family: "PT Root UI VF"
|
||||
font.letterSpacing: 0.02
|
||||
|
||||
height: 16
|
||||
Layout.fillWidth: true
|
||||
Layout.rightMargin: 16
|
||||
Layout.leftMargin: 16
|
||||
Layout.topMargin: 16
|
||||
height: 16
|
||||
Layout.fillWidth: true
|
||||
Layout.rightMargin: 16
|
||||
Layout.leftMargin: 16
|
||||
Layout.topMargin: 16
|
||||
}
|
||||
|
||||
TextField {
|
||||
id: textField
|
||||
|
||||
enabled: root.textFieldEditable
|
||||
text: root.textFieldText
|
||||
color: "#d7d8db"
|
||||
|
||||
placeholderText: textFieldPlaceholderText
|
||||
placeholderTextColor: "#494B50"
|
||||
|
||||
selectionColor: "#412102"
|
||||
selectedTextColor: "#D7D8DB"
|
||||
|
||||
font.pixelSize: 16
|
||||
font.weight: 400
|
||||
font.family: "PT Root UI VF"
|
||||
|
||||
height: 24
|
||||
Layout.fillWidth: true
|
||||
Layout.rightMargin: 16
|
||||
Layout.leftMargin: 16
|
||||
Layout.bottomMargin: 16
|
||||
topPadding: 0
|
||||
rightPadding: 0
|
||||
leftPadding: 0
|
||||
bottomPadding: 0
|
||||
|
||||
background: Rectangle {
|
||||
anchors.fill: parent
|
||||
color: "#1c1d21"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TextField {
|
||||
id: textField
|
||||
BasicButtonType {
|
||||
visible: root.buttonText !== ""
|
||||
|
||||
enabled: root.textFieldEditable
|
||||
text: root.textFieldText
|
||||
color: "#d7d8db"
|
||||
defaultColor: "transparent"
|
||||
hoveredColor: Qt.rgba(1, 1, 1, 0.08)
|
||||
pressedColor: Qt.rgba(1, 1, 1, 0.12)
|
||||
disabledColor: "#878B91"
|
||||
textColor: "#D7D8DB"
|
||||
borderWidth: 0
|
||||
|
||||
placeholderText: textFieldPlaceholderText
|
||||
text: buttonText
|
||||
|
||||
font.pixelSize: 16
|
||||
font.weight: 400
|
||||
font.family: "PT Root UI VF"
|
||||
Layout.rightMargin: 24
|
||||
|
||||
height: 24
|
||||
Layout.fillWidth: true
|
||||
Layout.rightMargin: 16
|
||||
Layout.leftMargin: 16
|
||||
Layout.bottomMargin: 16
|
||||
topPadding: 0
|
||||
rightPadding: 0
|
||||
leftPadding: 0
|
||||
bottomPadding: 0
|
||||
|
||||
background: Rectangle {
|
||||
anchors.fill: parent
|
||||
color: "#1c1d21"
|
||||
onClicked: {
|
||||
if (clickedFunc && typeof clickedFunc === "function") {
|
||||
clickedFunc()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,57 +1,7 @@
|
|||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
|
||||
import Qt.labs.folderlistmodel
|
||||
|
||||
import PageType 1.0
|
||||
|
||||
Item {
|
||||
property var pages: ({})
|
||||
|
||||
signal finished()
|
||||
|
||||
FolderListModel {
|
||||
id: folderModelPages
|
||||
folder: "qrc:/ui/qml/Pages2/"
|
||||
nameFilters: ["*.qml"]
|
||||
showDirs: false
|
||||
|
||||
onStatusChanged: {
|
||||
if (status == FolderListModel.Ready) {
|
||||
for (var i = 0; i < folderModelPages.count; i++) {
|
||||
createPagesObjects(folderModelPages.get(i, "filePath"), PageType.Basic);
|
||||
}
|
||||
finished()
|
||||
}
|
||||
}
|
||||
|
||||
function createPagesObjects(file, type) {
|
||||
if (file.indexOf("Base") !== -1) {
|
||||
return; // skip Base Pages
|
||||
}
|
||||
|
||||
var c = Qt.createComponent("qrc" + file);
|
||||
|
||||
var finishCreation = function(component) {
|
||||
if (component.status === Component.Ready) {
|
||||
var obj = component.createObject(root);
|
||||
if (obj === null) {
|
||||
console.debug("Error creating object " + component.url);
|
||||
} else {
|
||||
obj.visible = false
|
||||
if (type === PageType.Basic) {
|
||||
pages[obj.page] = obj
|
||||
}
|
||||
}
|
||||
} else if (component.status === Component.Error) {
|
||||
console.debug("Error loading component:", component.errorString());
|
||||
}
|
||||
}
|
||||
|
||||
if (c.status === Component.Ready) {
|
||||
finishCreation(c);
|
||||
} else {
|
||||
console.debug("Warning: " + file + " page components are not ready " + c.errorString());
|
||||
}
|
||||
}
|
||||
}
|
||||
StackView {
|
||||
id: stackView
|
||||
initialItem: "PageStart"
|
||||
}
|
||||
|
|
114
client/ui/qml/Pages2/PageSetupWizardConfigSource.qml
Normal file
114
client/ui/qml/Pages2/PageSetupWizardConfigSource.qml
Normal file
|
@ -0,0 +1,114 @@
|
|||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import QtQuick.Dialogs
|
||||
|
||||
import PageEnum 1.0
|
||||
|
||||
import "./"
|
||||
import "../Pages"
|
||||
import "../Controls2"
|
||||
import "../Controls2/TextTypes"
|
||||
import "../Config"
|
||||
|
||||
PageBase {
|
||||
id: root
|
||||
page: PageEnum.PageSetupWizardInstalling
|
||||
|
||||
FlickableType {
|
||||
id: fl
|
||||
anchors.top: root.top
|
||||
anchors.bottom: root.bottom
|
||||
contentHeight: content.height
|
||||
|
||||
ColumnLayout {
|
||||
id: content
|
||||
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 16
|
||||
anchors.leftMargin: 16
|
||||
|
||||
spacing: 16
|
||||
|
||||
HeaderType {
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: 20
|
||||
|
||||
buttonImage: "qrc:/images/controls/arrow-left.svg"
|
||||
|
||||
headerText: "Подключение к серверу"
|
||||
descriptionText: "Не используйте код подключения из публичных источников. Его могли создать, чтобы перехватывать ваши данные.\n
|
||||
Всё в порядке, если код передал друг."
|
||||
}
|
||||
|
||||
Header2TextType {
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: 32
|
||||
|
||||
text: "Что у вас есть?"
|
||||
}
|
||||
|
||||
LabelWithButtonType {
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: 16
|
||||
|
||||
text: "Файл с настройками подключения"
|
||||
buttonImage: "qrc:/images/controls/chevron-right.svg"
|
||||
iconImage: "qrc:/images/controls/folder-open.svg"
|
||||
|
||||
onClickedFunc: function() {
|
||||
onClicked: fileDialog.open()
|
||||
}
|
||||
|
||||
FileDialog {
|
||||
id: fileDialog
|
||||
// currentFolder: StandardPaths.standardLocations(StandardPaths.PicturesLocation)[0]
|
||||
onAccepted: {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
Rectangle {
|
||||
Layout.fillWidth: true
|
||||
height: 1
|
||||
color: "#2C2D30"
|
||||
}
|
||||
|
||||
//todo ifdef mobile platforms>
|
||||
LabelWithButtonType {
|
||||
Layout.fillWidth: true
|
||||
|
||||
text: "QR-код"
|
||||
buttonImage: "qrc:/images/controls/chevron-right.svg"
|
||||
iconImage: "qrc:/images/controls/qr-code.svg"
|
||||
|
||||
onClickedFunc: function() {
|
||||
}
|
||||
}
|
||||
Rectangle {
|
||||
Layout.fillWidth: true
|
||||
height: 1
|
||||
color: "#2C2D30"
|
||||
}
|
||||
|
||||
LabelWithButtonType {
|
||||
Layout.fillWidth: true
|
||||
|
||||
text: "Ключ в виде текста"
|
||||
buttonImage: "qrc:/images/controls/chevron-right.svg"
|
||||
iconImage: "qrc:/images/controls/text-cursor.svg"
|
||||
|
||||
onClickedFunc: function() {
|
||||
UiLogic.goToPage(PageEnum.PageSetupWizardTextKey)
|
||||
}
|
||||
}
|
||||
Rectangle {
|
||||
Layout.fillWidth: true
|
||||
height: 1
|
||||
color: "#2C2D30"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -11,7 +11,7 @@ import "../Config"
|
|||
|
||||
PageBase {
|
||||
id: root
|
||||
page: PageEnum.WizardCredentials
|
||||
page: PageEnum.PageSetupWizardCredentials
|
||||
|
||||
FlickableType {
|
||||
id: fl
|
||||
|
@ -61,7 +61,7 @@ PageBase {
|
|||
text: qsTr("Настроить сервер простым образом")
|
||||
|
||||
onClicked: function() {
|
||||
UiLogic.goToPage(PageEnum.WizardEasySetup)
|
||||
UiLogic.goToPage(PageEnum.PageSetupWizardEasy)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -79,7 +79,7 @@ PageBase {
|
|||
text: qsTr("Выбрать протокол для установки")
|
||||
|
||||
onClicked: function() {
|
||||
UiLogic.goToPage(PageEnum.WizardProtocols)
|
||||
UiLogic.goToPage(PageEnum.PageSetupWizardProtocols)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,7 +11,7 @@ import "../Config"
|
|||
|
||||
PageBase {
|
||||
id: root
|
||||
page: PageEnum.WizardEasySetup
|
||||
page: PageEnum.PageSetupWizardEasy
|
||||
|
||||
FlickableType {
|
||||
id: fl
|
||||
|
|
46
client/ui/qml/Pages2/PageSetupWizardInstalling.qml
Normal file
46
client/ui/qml/Pages2/PageSetupWizardInstalling.qml
Normal file
|
@ -0,0 +1,46 @@
|
|||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
|
||||
import PageEnum 1.0
|
||||
|
||||
import "./"
|
||||
import "../Pages"
|
||||
import "../Controls2"
|
||||
import "../Controls2/TextTypes"
|
||||
import "../Config"
|
||||
|
||||
PageBase {
|
||||
id: root
|
||||
page: PageEnum.PageSetupWizardInstalling
|
||||
|
||||
FlickableType {
|
||||
id: fl
|
||||
anchors.top: root.top
|
||||
anchors.bottom: root.bottom
|
||||
contentHeight: content.height
|
||||
|
||||
ColumnLayout {
|
||||
id: content
|
||||
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 16
|
||||
anchors.leftMargin: 16
|
||||
|
||||
spacing: 16
|
||||
|
||||
HeaderType {
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: 20
|
||||
|
||||
//TODO remove later
|
||||
buttonImage: "qrc:/images/controls/arrow-left.svg"
|
||||
|
||||
headerText: "Установка"
|
||||
descriptionText: ContainersModel.getCurrentlyInstalledContainerName()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
96
client/ui/qml/Pages2/PageSetupWizardProtocolSettings.qml
Normal file
96
client/ui/qml/Pages2/PageSetupWizardProtocolSettings.qml
Normal file
|
@ -0,0 +1,96 @@
|
|||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
|
||||
import PageEnum 1.0
|
||||
|
||||
import "./"
|
||||
import "../Pages"
|
||||
import "../Controls2"
|
||||
import "../Controls2/TextTypes"
|
||||
import "../Config"
|
||||
|
||||
PageBase {
|
||||
id: root
|
||||
page: PageEnum.PageSetupWizardProtocolSettings
|
||||
|
||||
FlickableType {
|
||||
id: fl
|
||||
anchors.top: root.top
|
||||
anchors.bottom: root.bottom
|
||||
contentHeight: content.height
|
||||
|
||||
ColumnLayout {
|
||||
id: content
|
||||
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 16
|
||||
anchors.leftMargin: 16
|
||||
|
||||
spacing: 16
|
||||
|
||||
HeaderType {
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: 20
|
||||
|
||||
buttonImage: "qrc:/images/controls/arrow-left.svg"
|
||||
|
||||
headerText: "Установка " + ContainersModel.getCurrentlyInstalledContainerName()
|
||||
descriptionText: "Эти настройки можно будет изменить позже"
|
||||
}
|
||||
|
||||
BodyTextType {
|
||||
Layout.topMargin: 16
|
||||
|
||||
text: "Network protocol"
|
||||
}
|
||||
|
||||
//TODO move to separete control
|
||||
Rectangle {
|
||||
implicitWidth: buttonGroup.implicitWidth
|
||||
implicitHeight: buttonGroup.implicitHeight
|
||||
|
||||
color: "#1C1D21"
|
||||
radius: 16
|
||||
|
||||
RowLayout {
|
||||
id: buttonGroup
|
||||
|
||||
spacing: 0
|
||||
|
||||
HorizontalRadioButton {
|
||||
implicitWidth: (root.width - 32) / 2
|
||||
text: "UDP"
|
||||
}
|
||||
|
||||
HorizontalRadioButton {
|
||||
implicitWidth: (root.width - 32) / 2
|
||||
text: "TCP"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TextFieldWithHeaderType {
|
||||
Layout.fillWidth: true
|
||||
headerText: "Port"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BasicButtonType {
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 16
|
||||
anchors.leftMargin: 16
|
||||
anchors.bottomMargin: 32
|
||||
|
||||
text: qsTr("Установить")
|
||||
|
||||
onClicked: function() {
|
||||
UiLogic.goToPage(PageEnum.PageSetupWizardInstalling)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -14,11 +14,11 @@ import "../Config"
|
|||
|
||||
PageBase {
|
||||
id: root
|
||||
page: PageEnum.WizardProtocols
|
||||
page: PageEnum.PageSetupWizardProtocols
|
||||
|
||||
SortFilterProxyModel {
|
||||
id: containersModel
|
||||
sourceModel: UiLogic.containersModel
|
||||
id: proxyContainersModel
|
||||
sourceModel: ContainersModel
|
||||
filters: [
|
||||
ValueFilter {
|
||||
roleName: "is_installed_role"
|
||||
|
@ -64,7 +64,7 @@ PageBase {
|
|||
currentIndex: -1
|
||||
clip: true
|
||||
interactive: false
|
||||
model: containersModel
|
||||
model: proxyContainersModel
|
||||
|
||||
delegate: Item {
|
||||
implicitWidth: containers.width
|
||||
|
@ -87,6 +87,10 @@ PageBase {
|
|||
descriptionText: desc_role
|
||||
buttonImage: "qrc:/images/controls/chevron-right.svg"
|
||||
|
||||
onClickedFunc: function() {
|
||||
ContainersModel.setCurrentlyInstalledContainerIndex(proxyContainersModel.mapToSource(index))
|
||||
UiLogic.goToPage(PageEnum.PageSetupWizardProtocolSettings)
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
|
|
74
client/ui/qml/Pages2/PageSetupWizardTextKey.qml
Normal file
74
client/ui/qml/Pages2/PageSetupWizardTextKey.qml
Normal file
|
@ -0,0 +1,74 @@
|
|||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
|
||||
import PageEnum 1.0
|
||||
|
||||
import "./"
|
||||
import "../Pages"
|
||||
import "../Controls2"
|
||||
import "../Controls2/TextTypes"
|
||||
import "../Config"
|
||||
|
||||
PageBase {
|
||||
id: root
|
||||
page: PageEnum.PageSetupWizardInstalling
|
||||
|
||||
FlickableType {
|
||||
id: fl
|
||||
anchors.top: root.top
|
||||
anchors.bottom: root.bottom
|
||||
contentHeight: content.height
|
||||
|
||||
ColumnLayout {
|
||||
id: content
|
||||
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 16
|
||||
anchors.leftMargin: 16
|
||||
|
||||
spacing: 16
|
||||
|
||||
HeaderType {
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: 20
|
||||
|
||||
buttonImage: "qrc:/images/controls/arrow-left.svg"
|
||||
|
||||
headerText: "Ключ для подключения"
|
||||
descriptionText: "Строка, которая начинается с vpn://..."
|
||||
}
|
||||
|
||||
TextFieldWithHeaderType {
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: 32
|
||||
|
||||
headerText: "Ключ"
|
||||
textFieldPlaceholderText: "vpn://"
|
||||
buttonText: "Вставить"
|
||||
|
||||
clickedFunc: function() {
|
||||
textField.text = ""
|
||||
textField.paste()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BasicButtonType {
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: 16
|
||||
anchors.leftMargin: 16
|
||||
anchors.bottomMargin: 32
|
||||
|
||||
text: qsTr("Подключиться")
|
||||
|
||||
onClicked: function() {
|
||||
// UiLogic.goToPage(PageEnum.PageSetupWizardInstalling)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -12,7 +12,7 @@ import "../Controls2/TextTypes"
|
|||
|
||||
PageBase {
|
||||
id: root
|
||||
page: PageEnum.Start
|
||||
page: PageEnum.PageStart
|
||||
|
||||
FlickableType {
|
||||
id: fl
|
||||
|
@ -77,7 +77,7 @@ PageBase {
|
|||
text: qsTr("У меня ничего нет")
|
||||
|
||||
onClicked: {
|
||||
UiLogic.goToPage(PageEnum.Test)
|
||||
UiLogic.goToPage(PageEnum.PageTest)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -129,7 +129,7 @@ PageBase {
|
|||
buttonImage: "qrc:/images/controls/chevron-right.svg"
|
||||
|
||||
onClickedFunc: function() {
|
||||
UiLogic.goToPage(PageEnum.WizardCredentials)
|
||||
UiLogic.goToPage(PageEnum.PageSetupWizardCredentials)
|
||||
drawer.visible = false
|
||||
}
|
||||
}
|
||||
|
@ -144,9 +144,10 @@ PageBase {
|
|||
text: "QR-код, ключ или файл настроек"
|
||||
buttonImage: "qrc:/images/controls/chevron-right.svg"
|
||||
|
||||
// onClickedFunc: function() {
|
||||
// UiLogic.goToPage(PageEnum.Start)
|
||||
// }
|
||||
onClickedFunc: function() {
|
||||
UiLogic.goToPage(PageEnum.PageSetupWizardConfigSource)
|
||||
drawer.visible = false
|
||||
}
|
||||
}
|
||||
Rectangle {
|
||||
Layout.fillWidth: true
|
||||
|
|
|
@ -14,6 +14,7 @@ Window {
|
|||
height: GC.screenHeight
|
||||
minimumWidth: GC.isDesktop() ? 360 : 0
|
||||
minimumHeight: GC.isDesktop() ? 640 : 0
|
||||
|
||||
onClosing: function() {
|
||||
console.debug("QML onClosing signal")
|
||||
UiLogic.onCloseWindow()
|
||||
|
@ -21,28 +22,18 @@ Window {
|
|||
|
||||
title: "AmneziaVPN"
|
||||
|
||||
function gotoPage(type, page, reset, slide) {
|
||||
let p_obj;
|
||||
if (type === PageType.Basic) p_obj = pageLoader.pages[page]
|
||||
else if (type === PageType.Proto) p_obj = protocolPages[page]
|
||||
else if (type === PageType.ShareProto) p_obj = sharePages[page]
|
||||
else return
|
||||
|
||||
function gotoPage(page, reset, slide) {
|
||||
if (pageStackView.depth > 0) {
|
||||
pageStackView.currentItem.deactivated()
|
||||
}
|
||||
|
||||
if (slide) {
|
||||
pageStackView.push(p_obj, {}, StackView.PushTransition)
|
||||
pageStackView.push(UiLogic.pageEnumToString(page), {}, StackView.PushTransition)
|
||||
} else {
|
||||
pageStackView.push(p_obj, {}, StackView.Immediate)
|
||||
pageStackView.push(UiLogic.pageEnumToString(page), {}, StackView.Immediate)
|
||||
}
|
||||
|
||||
// if (reset) {
|
||||
// p_obj.logic.onUpdatePage();
|
||||
// }
|
||||
|
||||
p_obj.activated(reset)
|
||||
pageStackView.currentItem.activated(reset)
|
||||
}
|
||||
|
||||
function closePage() {
|
||||
|
@ -60,9 +51,9 @@ Window {
|
|||
|
||||
pageStackView.clear()
|
||||
if (slide) {
|
||||
pageStackView.push(pages[page], {}, StackView.PushTransition)
|
||||
pageStackView.push(UiLogic.pageEnumToString(page), {}, StackView.PushTransition)
|
||||
} else {
|
||||
pageStackView.push(pages[page], {}, StackView.Immediate)
|
||||
pageStackView.push(UiLogic.pageEnumToString(page), {}, StackView.Immediate)
|
||||
}
|
||||
if (page === PageEnum.Start) {
|
||||
UiLogic.pushButtonBackFromStartVisible = !pageStackView.empty
|
||||
|
@ -79,33 +70,12 @@ Window {
|
|||
id: pageStackView
|
||||
anchors.fill: parent
|
||||
focus: true
|
||||
|
||||
onCurrentItemChanged: function() {
|
||||
UiLogic.currentPageValue = currentItem.page
|
||||
}
|
||||
|
||||
onDepthChanged: function() {
|
||||
UiLogic.pagesStackDepth = depth
|
||||
}
|
||||
|
||||
Keys.onPressed: function(event) {
|
||||
UiLogic.keyPressEvent(event.key)
|
||||
event.accepted = true
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: UiLogic
|
||||
function onGoToPage(page, reset, slide) {
|
||||
root.gotoPage(PageType.Basic, page, reset, slide)
|
||||
}
|
||||
|
||||
function onGoToProtocolPage(protocol, reset, slide) {
|
||||
root.gotoPage(PageType.Proto, protocol, reset, slide)
|
||||
}
|
||||
|
||||
function onGoToShareProtocolPage(protocol, reset, slide) {
|
||||
root.gotoPage(PageType.ShareProto, protocol, reset, slide)
|
||||
root.gotoPage(page, reset, slide)
|
||||
}
|
||||
|
||||
function onClosePage() {
|
||||
|
@ -118,6 +88,7 @@ Window {
|
|||
|
||||
function onShow() {
|
||||
root.show()
|
||||
UiLogic.initializeUiLogic()
|
||||
}
|
||||
|
||||
function onHide() {
|
||||
|
@ -130,13 +101,4 @@ Window {
|
|||
root.requestActivate()
|
||||
}
|
||||
}
|
||||
|
||||
PageLoader {
|
||||
id: pageLoader
|
||||
|
||||
onFinished: {
|
||||
UiLogic.initializeUiLogic()
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -84,7 +84,6 @@ UiLogic::UiLogic(std::shared_ptr<Settings> settings, std::shared_ptr<VpnConfigur
|
|||
m_settings(settings),
|
||||
m_configurator(configurator)
|
||||
{
|
||||
m_containersModel = new ContainersModel(settings, this);
|
||||
m_protocolsModel = new ProtocolsModel(settings, this);
|
||||
m_clientManagementModel = new ClientManagementModel(this);
|
||||
m_vpnConnection = new VpnConnection(settings, configurator);
|
||||
|
@ -155,7 +154,7 @@ void UiLogic::initializeUiLogic()
|
|||
emit goToPage(Page::Vpn, true, false);
|
||||
}
|
||||
else {
|
||||
emit goToPage(Page::Start, true, false);
|
||||
emit goToPage(Page::PageStart, true, false);
|
||||
}
|
||||
|
||||
m_selectedServerIndex = m_settings->defaultServerIndex();
|
||||
|
@ -619,3 +618,8 @@ bool UiLogic::isContainerAlreadyAddedToGui(DockerContainer container)
|
|||
return false;
|
||||
}
|
||||
|
||||
QString UiLogic::pageEnumToString(Page page) {
|
||||
QMetaEnum metaEnum = QMetaEnum::fromType<Page>();
|
||||
QString pageName = metaEnum.valueToKey(static_cast<int>(page));
|
||||
return "Pages2/" + pageName + ".qml";
|
||||
}
|
||||
|
|
|
@ -67,7 +67,6 @@ class UiLogic : public QObject
|
|||
AUTO_PROPERTY(int, pagesStackDepth)
|
||||
AUTO_PROPERTY(int, currentPageValue)
|
||||
|
||||
READONLY_PROPERTY(QObject *, containersModel)
|
||||
READONLY_PROPERTY(QObject *, protocolsModel)
|
||||
READONLY_PROPERTY(QObject *, clientManagementModel)
|
||||
|
||||
|
@ -124,6 +123,8 @@ public:
|
|||
|
||||
Q_INVOKABLE amnezia::ErrorCode addAlreadyInstalledContainersGui(bool &isServerCreated);
|
||||
|
||||
Q_INVOKABLE QString pageEnumToString(PageEnumNS::Page page);
|
||||
|
||||
void shareTempFile(const QString &suggestedName, QString ext, const QString& data);
|
||||
static QString getOpenFileName(QWidget *parent = nullptr,
|
||||
const QString &caption = QString(),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue