Compare commits
No commits in common. "7343174056948ee45f2ed08692c8556e5f16a01a" and "3193e4469bb2aacd0c84b8d31d7eaa768da877e9" have entirely different histories.
7343174056
...
3193e4469b
|
@ -10,9 +10,7 @@ qt_add_qml_module(${PROJECT_NAME}
|
||||||
database.cpp database.h
|
database.cpp database.h
|
||||||
QML_FILES
|
QML_FILES
|
||||||
ErrorNotification.qml
|
ErrorNotification.qml
|
||||||
LoginPage.qml
|
|
||||||
Main.qml
|
Main.qml
|
||||||
ReservationsPage.qml
|
|
||||||
SelectableLabel.qml
|
SelectableLabel.qml
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
pragma ComponentBehavior: Bound
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
|
|
||||||
|
|
|
@ -1,59 +0,0 @@
|
||||||
pragma ComponentBehavior: Bound
|
|
||||||
import QtQuick
|
|
||||||
import QtQuick.Controls
|
|
||||||
import QtQuick.Layouts
|
|
||||||
|
|
||||||
Page {
|
|
||||||
id: page
|
|
||||||
|
|
||||||
title: qsTr("Login")
|
|
||||||
|
|
||||||
ColumnLayout {
|
|
||||||
Label {
|
|
||||||
text: qsTr("&User:")
|
|
||||||
}
|
|
||||||
|
|
||||||
TextField {
|
|
||||||
id: user
|
|
||||||
|
|
||||||
focus: true
|
|
||||||
|
|
||||||
validator: RegularExpressionValidator {
|
|
||||||
regularExpression: /[^s].*/
|
|
||||||
}
|
|
||||||
|
|
||||||
onAccepted: function () {
|
|
||||||
loginAction.trigger();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Label {
|
|
||||||
text: qsTr("&Password:")
|
|
||||||
}
|
|
||||||
|
|
||||||
TextField {
|
|
||||||
id: password
|
|
||||||
|
|
||||||
echoMode: TextInput.Password
|
|
||||||
|
|
||||||
onAccepted: function () {
|
|
||||||
loginAction.trigger();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Button {
|
|
||||||
action: loginAction
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Action {
|
|
||||||
id: loginAction
|
|
||||||
|
|
||||||
enabled: user.acceptableInput
|
|
||||||
text: "&Login"
|
|
||||||
|
|
||||||
onTriggered: function () {
|
|
||||||
Database.open(user.text, password.text);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
73
src/Main.qml
73
src/Main.qml
|
@ -1,35 +1,49 @@
|
||||||
pragma ComponentBehavior: Bound
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
|
import QtQuick.Layouts
|
||||||
import Camper
|
import Camper
|
||||||
|
|
||||||
ApplicationWindow {
|
ApplicationWindow {
|
||||||
height: 480
|
height: 480
|
||||||
title: pageStack.title ? qsTr("%1 — Camper").arg(pageStack.title) : qsTr("Camper")
|
title: qsTr("Camper")
|
||||||
visible: true
|
visible: true
|
||||||
width: 640
|
width: 640
|
||||||
|
|
||||||
StackView {
|
ColumnLayout {
|
||||||
id: pageStack
|
Label {
|
||||||
|
text: qsTr("&User:")
|
||||||
property string title: (currentItem as Page)?.title ?? ""
|
|
||||||
|
|
||||||
anchors.fill: parent
|
|
||||||
focus: true
|
|
||||||
initialItem: loginPage
|
|
||||||
}
|
|
||||||
|
|
||||||
Component {
|
|
||||||
id: loginPage
|
|
||||||
|
|
||||||
LoginPage {
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
Component {
|
TextField {
|
||||||
id: reservationsPage
|
id: user
|
||||||
|
|
||||||
ReservationsPage {
|
focus: true
|
||||||
|
|
||||||
|
validator: RegularExpressionValidator {
|
||||||
|
regularExpression: /[^s].*/
|
||||||
|
}
|
||||||
|
|
||||||
|
onAccepted: function () {
|
||||||
|
loginAction.trigger();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Label {
|
||||||
|
text: qsTr("&Password:")
|
||||||
|
}
|
||||||
|
|
||||||
|
TextField {
|
||||||
|
id: password
|
||||||
|
|
||||||
|
echoMode: TextInput.Password
|
||||||
|
|
||||||
|
onAccepted: function () {
|
||||||
|
loginAction.trigger();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Button {
|
||||||
|
action: loginAction
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,19 +59,22 @@ ApplicationWindow {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Connections {
|
Action {
|
||||||
function onClosed() {
|
id: loginAction
|
||||||
pageStack.replace(null, loginPage);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
enabled: user.acceptableInput
|
||||||
|
text: "&Login"
|
||||||
|
|
||||||
|
onTriggered: function () {
|
||||||
|
Database.open(user.text, password.text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Connections {
|
||||||
function onErrorOcurred(errorMessage) {
|
function onErrorOcurred(errorMessage) {
|
||||||
errorNotification.show(errorMessage);
|
errorNotification.show(errorMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
function onOpened() {
|
|
||||||
pageStack.replace(reservationsPage);
|
|
||||||
}
|
|
||||||
|
|
||||||
target: Database
|
target: Database
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
pragma ComponentBehavior: Bound
|
|
||||||
import QtQuick
|
|
||||||
import QtQuick.Controls
|
|
||||||
|
|
||||||
Page {
|
|
||||||
title: qsTr("Reservations")
|
|
||||||
|
|
||||||
Button {
|
|
||||||
action: logoutAction
|
|
||||||
}
|
|
||||||
|
|
||||||
Action {
|
|
||||||
id: logoutAction
|
|
||||||
|
|
||||||
icon.name: "system-log-out"
|
|
||||||
shortcut: "Ctrl+L"
|
|
||||||
text: qsTr("&Log out")
|
|
||||||
|
|
||||||
onTriggered: function () {
|
|
||||||
Database.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,4 +1,3 @@
|
||||||
pragma ComponentBehavior: Bound
|
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,6 @@
|
||||||
Database::Database(QObject *parent)
|
Database::Database(QObject *parent)
|
||||||
: QObject{parent}
|
: QObject{parent}
|
||||||
, m_pool{}
|
, m_pool{}
|
||||||
, m_connectionName{"main"}
|
|
||||||
{
|
{
|
||||||
m_pool.setMaxThreadCount(1);
|
m_pool.setMaxThreadCount(1);
|
||||||
m_pool.setExpiryTimeout(-1);
|
m_pool.setExpiryTimeout(-1);
|
||||||
|
@ -15,30 +14,16 @@ Database::Database(QObject *parent)
|
||||||
QFuture<void> Database::open(const QString &user, const QString &password)
|
QFuture<void> Database::open(const QString &user, const QString &password)
|
||||||
{
|
{
|
||||||
return QtConcurrent::run(&m_pool, [this, user, password]() {
|
return QtConcurrent::run(&m_pool, [this, user, password]() {
|
||||||
QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL", m_connectionName);
|
QString connectionName("main");
|
||||||
|
QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL", connectionName);
|
||||||
db.setConnectOptions("service=camper; options=-csearch_path=camper,public");
|
db.setConnectOptions("service=camper; options=-csearch_path=camper,public");
|
||||||
if (db.open(user, password)) {
|
if (!db.open(user, password)) {
|
||||||
emit opened();
|
|
||||||
} else {
|
|
||||||
const QString errorMessage(db.lastError().text());
|
const QString errorMessage(db.lastError().text());
|
||||||
db = QSqlDatabase(); // Otherwise removeDatabase complains is still being used.
|
db = QSqlDatabase(); // Otherwise removeDatabase complains is still being used.
|
||||||
QSqlDatabase::removeDatabase(m_connectionName);
|
QSqlDatabase::removeDatabase(connectionName);
|
||||||
emit errorOcurred(errorMessage);
|
emit errorOcurred(errorMessage);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
QFuture<void> Database::close()
|
|
||||||
{
|
|
||||||
return QtConcurrent::run(&m_pool, [this]() {
|
|
||||||
QSqlDatabase db = QSqlDatabase::database(m_connectionName);
|
|
||||||
if (!db.isValid()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
db.close();
|
|
||||||
QSqlDatabase::removeDatabase(m_connectionName);
|
|
||||||
emit closed();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
#include "moc_database.cpp"
|
#include "moc_database.cpp"
|
||||||
|
|
|
@ -16,16 +16,12 @@ public:
|
||||||
explicit Database(QObject *parent = nullptr);
|
explicit Database(QObject *parent = nullptr);
|
||||||
|
|
||||||
Q_INVOKABLE QFuture<void> open(const QString &user, const QString &password);
|
Q_INVOKABLE QFuture<void> open(const QString &user, const QString &password);
|
||||||
Q_INVOKABLE QFuture<void> close();
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void closed();
|
|
||||||
void errorOcurred(const QString &errorMessage);
|
void errorOcurred(const QString &errorMessage);
|
||||||
void opened();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QThreadPool m_pool;
|
QThreadPool m_pool;
|
||||||
QString m_connectionName;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // DATABASE_H
|
#endif // DATABASE_H
|
||||||
|
|
Loading…
Reference in New Issue