mirror of
https://github.com/johndoe6345789/tustu.git
synced 2026-04-24 21:55:12 +00:00
- Implemented OfflineActivationDialog.qml for offline activation process with detailed instructions and file handling. - Created RegistrationDialog.qml for user registration with manual input and email parsing options. - Added new components: RoundGauge.qml, ScalarEditor.qml, Table2DEditor.qml, Table3DEditor.qml, TableEditorPanel.qml, and TableEditorView.qml for enhanced table editing features. - Updated main.py to include clipboard operations and file handling for saving/loading activation requests and codes. - Enhanced README.md to document new features and file structure.
306 lines
10 KiB
QML
306 lines
10 KiB
QML
import QtQuick
|
|
import QtQuick.Controls
|
|
import QtQuick.Layouts
|
|
import QtQuick.Dialogs
|
|
|
|
ApplicationWindow {
|
|
id: registrationDialog
|
|
width: 600
|
|
height: 580
|
|
minimumWidth: 550
|
|
minimumHeight: 520
|
|
title: "Enter Registration Information"
|
|
color: "#f5f5f5"
|
|
|
|
// Signals
|
|
signal registrationComplete(string firstName, string lastName, string email, string key, string edition, string serialNumber)
|
|
signal registrationCancelled()
|
|
|
|
// Properties
|
|
property var editions: ["Standard", "Professional", "Ultra", "Lite"]
|
|
property string productName: "TunerStudio MS"
|
|
|
|
ColumnLayout {
|
|
anchors.fill: parent
|
|
anchors.margins: 10
|
|
spacing: 10
|
|
|
|
// Radio buttons for input method
|
|
RowLayout {
|
|
Layout.fillWidth: true
|
|
Layout.alignment: Qt.AlignHCenter
|
|
spacing: 20
|
|
|
|
RadioButton {
|
|
id: inputsRadio
|
|
text: "Inputs"
|
|
checked: true
|
|
onCheckedChanged: {
|
|
if (checked) {
|
|
stackLayout.currentIndex = 0
|
|
}
|
|
}
|
|
}
|
|
|
|
RadioButton {
|
|
id: pasteEmailRadio
|
|
text: "Paste Email"
|
|
onCheckedChanged: {
|
|
if (checked) {
|
|
stackLayout.currentIndex = 1
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Stack layout for switching between input methods
|
|
StackLayout {
|
|
id: stackLayout
|
|
Layout.fillWidth: true
|
|
Layout.fillHeight: true
|
|
currentIndex: 0
|
|
|
|
// Page 0: Manual Inputs
|
|
Item {
|
|
Layout.fillWidth: true
|
|
Layout.fillHeight: true
|
|
|
|
ColumnLayout {
|
|
anchors.fill: parent
|
|
spacing: 10
|
|
|
|
// Edition selector
|
|
GroupBox {
|
|
Layout.fillWidth: true
|
|
title: "Register " + productName + " (Select Edition)"
|
|
|
|
ColumnLayout {
|
|
anchors.fill: parent
|
|
|
|
ComboBox {
|
|
id: editionCombo
|
|
Layout.fillWidth: true
|
|
model: editions
|
|
currentIndex: 0
|
|
}
|
|
}
|
|
}
|
|
|
|
// Registration Information
|
|
GroupBox {
|
|
Layout.fillWidth: true
|
|
title: "Registration Information"
|
|
|
|
GridLayout {
|
|
anchors.fill: parent
|
|
columns: 2
|
|
columnSpacing: 10
|
|
rowSpacing: 8
|
|
|
|
Label {
|
|
text: "Registered First Name:"
|
|
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
|
|
}
|
|
TextField {
|
|
id: firstNameField
|
|
Layout.fillWidth: true
|
|
placeholderText: "Enter first name"
|
|
}
|
|
|
|
Label {
|
|
text: "Registered Last Name:"
|
|
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
|
|
}
|
|
TextField {
|
|
id: lastNameField
|
|
Layout.fillWidth: true
|
|
placeholderText: "Enter last name"
|
|
}
|
|
|
|
Label {
|
|
text: "Registered eMail Address:"
|
|
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
|
|
}
|
|
TextField {
|
|
id: emailField
|
|
Layout.fillWidth: true
|
|
placeholderText: "your.email@example.com"
|
|
}
|
|
|
|
Label {
|
|
text: "Registration Key:"
|
|
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
|
|
}
|
|
TextField {
|
|
id: keyField
|
|
Layout.fillWidth: true
|
|
placeholderText: "Enter registration key"
|
|
}
|
|
|
|
Label {
|
|
text: "Serial Number:"
|
|
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
|
|
}
|
|
TextField {
|
|
id: serialNumberField
|
|
Layout.fillWidth: true
|
|
placeholderText: "Optional"
|
|
}
|
|
}
|
|
}
|
|
|
|
Item {
|
|
Layout.fillHeight: true
|
|
}
|
|
}
|
|
}
|
|
|
|
// Page 1: Paste Email
|
|
Item {
|
|
Layout.fillWidth: true
|
|
Layout.fillHeight: true
|
|
|
|
ColumnLayout {
|
|
anchors.fill: parent
|
|
spacing: 10
|
|
|
|
Button {
|
|
text: "Paste"
|
|
Layout.alignment: Qt.AlignHCenter
|
|
onClicked: {
|
|
pasteEmailText.text = clipboardHelper.getClipboardText()
|
|
parseEmailContent()
|
|
}
|
|
}
|
|
|
|
ScrollView {
|
|
Layout.fillWidth: true
|
|
Layout.fillHeight: true
|
|
|
|
TextArea {
|
|
id: pasteEmailText
|
|
wrapMode: TextEdit.Wrap
|
|
placeholderText: "Paste your registration email here..."
|
|
onTextChanged: parseEmailContent()
|
|
|
|
background: Rectangle {
|
|
color: "white"
|
|
border.color: "#ccc"
|
|
border.width: 1
|
|
radius: 3
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Buttons
|
|
RowLayout {
|
|
Layout.fillWidth: true
|
|
Layout.alignment: Qt.AlignRight
|
|
spacing: 10
|
|
|
|
Button {
|
|
text: "Ok"
|
|
highlighted: true
|
|
onClicked: validateAndAccept()
|
|
}
|
|
|
|
Button {
|
|
text: "Cancel"
|
|
onClicked: {
|
|
registrationCancelled()
|
|
registrationDialog.close()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Dialog for validation errors
|
|
MessageDialog {
|
|
id: errorDialog
|
|
buttons: MessageDialog.Ok
|
|
}
|
|
|
|
// Functions
|
|
function parseEmailContent() {
|
|
var text = pasteEmailText.text
|
|
var lines = text.split('\n')
|
|
var inRegistrationSection = false
|
|
|
|
for (var i = 0; i < lines.length; i++) {
|
|
var line = lines[i].trim()
|
|
|
|
if (line.startsWith("[Registration]")) {
|
|
inRegistrationSection = true
|
|
continue
|
|
}
|
|
|
|
if (line.startsWith("[End Registration]")) {
|
|
inRegistrationSection = false
|
|
continue
|
|
}
|
|
|
|
if (inRegistrationSection) {
|
|
if (line.startsWith("First Name")) {
|
|
var value = line.substring(line.indexOf(":") + 1).trim()
|
|
firstNameField.text = value
|
|
}
|
|
else if (line.startsWith("Last Name")) {
|
|
var value = line.substring(line.indexOf(":") + 1).trim()
|
|
lastNameField.text = value
|
|
}
|
|
else if (line.startsWith("Registered email")) {
|
|
var value = line.substring(line.indexOf(":") + 1).trim()
|
|
emailField.text = value
|
|
}
|
|
else if (line.includes("Serial Number:")) {
|
|
var value = line.substring(line.indexOf(":") + 1).trim()
|
|
serialNumberField.text = value
|
|
}
|
|
else if (line.startsWith("Registration Key")) {
|
|
var value = line.substring(line.indexOf(":") + 1).trim()
|
|
keyField.text = value
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function validateAndAccept() {
|
|
var errors = []
|
|
|
|
if (firstNameField.text.trim() === "") {
|
|
errors.push("First Name")
|
|
}
|
|
if (lastNameField.text.trim() === "") {
|
|
errors.push("Last Name")
|
|
}
|
|
if (emailField.text.trim() === "") {
|
|
errors.push("eMail Address")
|
|
}
|
|
if (keyField.text.trim() === "") {
|
|
errors.push("Registration Key")
|
|
}
|
|
|
|
if (errors.length > 0) {
|
|
errorDialog.title = "Missing Information"
|
|
errorDialog.text = "You must provide the information used during registration for:\n" + errors.join("\n")
|
|
errorDialog.open()
|
|
return
|
|
}
|
|
|
|
// Emit signal with registration data
|
|
registrationComplete(
|
|
firstNameField.text.trim(),
|
|
lastNameField.text.trim(),
|
|
emailField.text.trim(),
|
|
keyField.text.trim(),
|
|
editionCombo.currentText,
|
|
serialNumberField.text.trim()
|
|
)
|
|
|
|
registrationDialog.close()
|
|
}
|
|
}
|