Files
tustu/app_qml/RegistrationDialog.qml
johndoe6345789 741702cedf feat: Add Offline Activation Dialog and Registration Dialog
- 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.
2026-01-11 03:11:28 +00:00

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()
}
}