Compare commits

..

No commits in common. "00255f67a0563fb84e4c33682c4dd5f6c0641c6a" and "d0e2659c30efc626a7fb47d9187447f681aaa607" have entirely different histories.

12 changed files with 39 additions and 464 deletions

View File

@ -116,6 +116,40 @@
(description "This is an extension for PostgreSQL that provides a uri data type. Advantages over using plain text for storing URIs include: URI syntax checking, functions for extracting URI components, and human-friendly sorting.") (description "This is an extension for PostgreSQL that provides a uri data type. Advantages over using plain text for storing URIs include: URI syntax checking, functions for extracting URI components, and human-friendly sorting.")
(license asl2.0)))) (license asl2.0))))
(define postgresql-iban
(let ((commit "0e533afb4d6bdb5af615d71ee16db9528e501ba6")
(revision "1"))
(package
(name "PostgreSQL-IBAN")
(version (git-version "1.0.0" revision commit))
(source (origin
(method git-fetch)
(uri (git-reference
(url "https://github.com/yorickdewid/PostgreSQL-IBAN.git")
(commit commit)))
(file-name (git-file-name name version))
(sha256
(base32
"1fqjk0amdr3mvhq6n7ig6lxs8xckm6vh5nxm8m1rlar82081agh2"))
(patches (search-patches "postgresql-iban-enable-nls.patch"))))
(build-system gnu-build-system)
(arguments
`(#:tests? #f
#:make-flags
(list (string-append "datadir=" (assoc-ref %outputs "out") "/share")
(string-append "docdir="(assoc-ref %outputs "out") "/share/doc")
(string-append "pkglibdir="(assoc-ref %outputs "out") "/lib")
(string-append "bindir=" (assoc-ref %outputs "out") "/bin"))
#:phases
(modify-phases %standard-phases
(delete 'configure))))
(inputs
`(("postgresql" ,postgresql-15)))
(home-page "https://github.com/yorickdewid/PostgreSQL-IBAN")
(synopsis "PostgreSQL extension that can verify International Bank Account Numbers")
(description "PostgreSQL IBAN extension that can verify International Bank Account Numbers. This ensures that only valid bank account numbers are stored.")
(license gpl3+))))
(define postgresql-15/xml (define postgresql-15/xml
(package (package
(inherit postgresql-15) (inherit postgresql-15)
@ -215,6 +249,7 @@
("perl" ,perl) ("perl" ,perl)
("pg-libphonenumber" ,pg-libphonenumber) ("pg-libphonenumber" ,pg-libphonenumber)
("pguri" ,pguri) ("pguri" ,pguri)
("PostgreSQL-IBAN" ,postgresql-iban)
("postgresql" ,postgresql-15/xml))) ("postgresql" ,postgresql-15/xml)))
(synopsis "Simple camping management and booking web application") (synopsis "Simple camping management and booking web application")
(description "A simple web application to manage small campings and other touristic accomodations in Spain.") (description "A simple web application to manage small campings and other touristic accomodations in Spain.")

View File

@ -12,7 +12,6 @@ qt_add_qml_module(${PROJECT_NAME}
calendarlistmodel.cpp calendarlistmodel.h calendarlistmodel.cpp calendarlistmodel.h
database.cpp database.h database.cpp database.h
mnemonicattached.cpp mnemonicattached.h mnemonicattached.cpp mnemonicattached.h
timelineview.cpp timelineview.h
QML_FILES QML_FILES
ErrorNotification.qml ErrorNotification.qml
Expander.qml Expander.qml

View File

@ -45,8 +45,6 @@ Control {
id: label id: label
Accessible.ignored: !control.visible Accessible.ignored: !control.visible
Accessible.role: Accessible.StaticText
focus: control.visible
anchors { anchors {
left: parent.left left: parent.left
@ -66,7 +64,7 @@ Control {
display: ToolButton.IconOnly display: ToolButton.IconOnly
height: implicitHeight height: implicitHeight
icon.name: "dialog-close" icon.name: "dialog-close"
text: qsTr("Close alert") text: qsTr("Close")
onClicked: function () { onClicked: function () {
hideTimer.stop(); hideTimer.stop();

View File

@ -8,7 +8,6 @@ Page {
id: page id: page
function saveSettings() { function saveSettings() {
settings.autoLogIn = autoLogIn.checked;
settings.connectOptions = connectOptions.text; settings.connectOptions = connectOptions.text;
settings.databaseName = databaseName.text; settings.databaseName = databaseName.text;
settings.hostName = hostName.text; settings.hostName = hostName.text;
@ -16,16 +15,9 @@ Page {
settings.usePort = usePort.checked; settings.usePort = usePort.checked;
} }
function tryAutoLogIn() {
if (autoLogIn.checked) {
loginAction.trigger();
}
}
title: qsTr("Login") title: qsTr("Login")
ColumnLayout { ColumnLayout {
Accessible.role: Accessible.Form
anchors.centerIn: parent anchors.centerIn: parent
GridLayout { GridLayout {
@ -141,22 +133,6 @@ Page {
onAccepted: loginAction.trigger() onAccepted: loginAction.trigger()
} }
CheckBox {
id: autoLogIn
Layout.alignment: Qt.AlignRight
Layout.columnSpan: 2
Mnemonic.label: qsTr("Log in auto&matically")
checked: settings.autoLogIn
text: Mnemonic.richTextLabel
Shortcut {
sequence: autoLogIn.Mnemonic.sequence
onActivated: autoLogIn.click()
}
}
} }
} }
@ -169,7 +145,6 @@ Page {
Settings { Settings {
id: settings id: settings
property bool autoLogIn: false
property string connectOptions: "" property string connectOptions: ""
property string databaseName: "" property string databaseName: ""
property string hostName: "" property string hostName: ""

View File

@ -9,10 +9,6 @@ ApplicationWindow {
visible: true visible: true
width: 640 width: 640
Component.onCompleted: function () {
(pageStack.currentItem as LoginPage)?.tryAutoLogIn();
}
StackView { StackView {
id: pageStack id: pageStack

View File

@ -18,10 +18,4 @@ Label {
control.buddy.forceActiveFocus(); control.buddy.forceActiveFocus();
} }
} }
Binding {
property: "Accessible.name"
target: control.buddy
value: control.Mnemonic.plainLabel
}
} }

View File

@ -2,7 +2,6 @@ pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import Camper
Page { Page {
title: qsTr("Reservations") title: qsTr("Reservations")
@ -18,75 +17,16 @@ Page {
} }
ListView { ListView {
id: lodgingList anchors.fill: parent
ScrollBar.vertical: verticalScroll delegate: Text {
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.top: parent.top
headerPositioning: ListView.OverlayHeader
model: calendarList
width: 100
delegate: Label {
required property string name required property string name
text: name text: name
} }
header: Pane { model: CalendarListModel {
z: 2
Label {
text: qsTr("Lodging")
} }
} }
}
ListView {
id: timelineList
anchors.bottom: parent.bottom
anchors.left: lodgingList.right
anchors.right: parent.right
anchors.top: parent.top
clip: true
contentWidth: 2184
flickableDirection: Flickable.AutoFlickDirection
headerPositioning: ListView.OverlayHeader
model: calendarList
ScrollBar.horizontal: ScrollBar {
}
ScrollBar.vertical: ScrollBar {
id: verticalScroll
}
delegate: TimelineView {
fromDate: "2024-11-01"
height: 16
toDate: "2025-01-31"
viewportWidth: ListView.view.width
viewportX: ListView.view.contentX
delegate: Rectangle {
border.color: "black"
border.width: 1
color: "blue"
}
}
header: Pane {
z: 2
Label {
text: qsTr("Calendar")
}
}
}
CalendarListModel {
id: calendarList
}
MnemonicAction { MnemonicAction {
id: logoutAction id: logoutAction

View File

@ -10,9 +10,6 @@ Control {
contentItem: TextArea { contentItem: TextArea {
id: textArea id: textArea
Accessible.ignored: control.Accessible.ignored
Accessible.role: control.Accessible.role
focus: control.focus
padding: 0 padding: 0
readOnly: true readOnly: true
selectByMouse: true selectByMouse: true

View File

@ -61,7 +61,6 @@ private:
MnemonicAttached::MnemonicAttached(QObject *parent) MnemonicAttached::MnemonicAttached(QObject *parent)
: QObject{parent} : QObject{parent}
, m_label{} , m_label{}
, m_plainLabel{}
, m_richTextLabel{} , m_richTextLabel{}
, m_active{MnemonicEventFilter::instance().isAltPressed()} , m_active{MnemonicEventFilter::instance().isAltPressed()}
{ {
@ -94,15 +93,9 @@ void MnemonicAttached::setLabel(const QString &label)
emit labelChanged(); emit labelChanged();
emit sequenceChanged(); emit sequenceChanged();
setPlainLabel(QString(m_label).remove('&'_L1));
updateRichText(); updateRichText();
} }
QString MnemonicAttached::plainLabel() const
{
return m_plainLabel;
}
QString MnemonicAttached::richTextLabel() const QString MnemonicAttached::richTextLabel() const
{ {
return m_richTextLabel; return m_richTextLabel;
@ -131,15 +124,6 @@ void MnemonicAttached::onAltReleased()
updateRichText(); updateRichText();
} }
void MnemonicAttached::setPlainLabel(const QString &plain)
{
if (plain == m_plainLabel) {
return;
}
m_plainLabel = plain;
emit plainLabelChanged();
}
void MnemonicAttached::updateRichText() void MnemonicAttached::updateRichText()
{ {
QString richTextLabel; QString richTextLabel;

View File

@ -11,7 +11,6 @@ class MnemonicAttached : public QObject
Q_OBJECT Q_OBJECT
Q_PROPERTY(QString label READ label WRITE setLabel NOTIFY labelChanged FINAL) Q_PROPERTY(QString label READ label WRITE setLabel NOTIFY labelChanged FINAL)
Q_PROPERTY(QString plainLabel READ plainLabel NOTIFY plainLabelChanged FINAL)
Q_PROPERTY(QString richTextLabel READ richTextLabel NOTIFY richTextLabelChanged FINAL) Q_PROPERTY(QString richTextLabel READ richTextLabel NOTIFY richTextLabelChanged FINAL)
Q_PROPERTY(QKeySequence sequence READ sequence NOTIFY sequenceChanged FINAL) Q_PROPERTY(QKeySequence sequence READ sequence NOTIFY sequenceChanged FINAL)
@ -26,8 +25,6 @@ public:
QString label() const; QString label() const;
void setLabel(const QString &label); void setLabel(const QString &label);
QString plainLabel() const;
QString richTextLabel() const; QString richTextLabel() const;
QKeySequence sequence() const; QKeySequence sequence() const;
@ -35,7 +32,6 @@ public:
signals: signals:
void enabledChanged(); void enabledChanged();
void labelChanged(); void labelChanged();
void plainLabelChanged();
void richTextLabelChanged(); void richTextLabelChanged();
void sequenceChanged(); void sequenceChanged();
@ -44,11 +40,9 @@ private slots:
void onAltReleased(); void onAltReleased();
private: private:
void setPlainLabel(const QString &plain);
void updateRichText(); void updateRichText();
QString m_label; QString m_label;
QString m_plainLabel;
QString m_richTextLabel; QString m_richTextLabel;
bool m_active; bool m_active;
}; };

View File

@ -1,260 +0,0 @@
#include "timelineview.h"
#include <QQmlContext>
#include <QQmlInfo>
struct TimelineViewItem
{
TimelineViewItem(qint64 day, qint64 len, QQuickItem &qitem, TimelineView &view)
: item(&qitem)
, day(day)
{
item->setParentItem(&view);
item->setPosition(QPointF(day * view.dayWidth(), 0.0));
item->setSize(QSizeF(len * view.dayWidth(), view.height()));
item->setVisible(true);
}
~TimelineViewItem()
{
item->setVisible(false);
item->setParent(nullptr);
}
qreal left() const { return item->x(); }
qreal right() const { return item->x() + item->width(); }
QQuickItem *item;
const qint64 day;
};
TimelineView::TimelineView(QQuickItem *parent)
: QQuickItem(parent)
, m_dayWidth(24.0)
, m_delegate(nullptr)
, m_fromDate()
, m_items()
, m_reusableItems()
, m_toDate()
, m_viewportX(0)
, m_prevViewportX(0)
, m_viewportWidth(0)
, m_prevViewportWidth(0)
{}
TimelineView::~TimelineView()
{
clear();
drainItems();
}
qreal TimelineView::dayWidth() const
{
return m_dayWidth;
}
void TimelineView::setDayWidth(qreal width)
{
if (width == m_dayWidth) {
return;
}
m_dayWidth = width;
emit dayWidthChanged(m_dayWidth);
updateImplicitWidth();
clear();
populate();
}
QQmlComponent *TimelineView::delegate() const
{
return m_delegate;
}
void TimelineView::setDelegate(QQmlComponent *delegate)
{
if (delegate == m_delegate) {
return;
}
m_delegate = delegate;
emit delegateChanged(m_delegate);
clear();
drainItems();
populate();
update();
}
QDate TimelineView::fromDate() const
{
return m_fromDate;
}
void TimelineView::setFromDate(QDate date)
{
if (date == m_fromDate) {
return;
}
m_fromDate = date;
emit fromDateChanged(m_fromDate);
updateImplicitWidth();
populate();
}
QDate TimelineView::toDate() const
{
return m_toDate;
}
void TimelineView::setToDate(QDate date)
{
if (date == m_toDate) {
return;
}
m_toDate = date;
emit toDateChanged(m_toDate);
updateImplicitWidth();
populate();
}
qreal TimelineView::viewportX() const
{
return m_viewportX;
}
void TimelineView::setViewportX(qreal x)
{
if (x == m_viewportX) {
return;
}
m_viewportX = x;
emit viewportXChanged(m_viewportX);
populate();
}
qreal TimelineView::viewportWidth() const
{
return m_viewportWidth;
}
void TimelineView::setViewportWidth(qreal width)
{
if (width == m_viewportWidth) {
return;
}
m_viewportWidth = width;
emit viewportWidthChanged(m_viewportWidth);
populate();
}
void TimelineView::componentComplete()
{
QQuickItem::componentComplete();
populate();
}
TimelineViewItem *TimelineView::createItem(qint64 day, qint64 len)
{
QQuickItem *item = m_reusableItems.isEmpty() ? qobject_cast<QQuickItem *>(m_delegate->create(
m_delegate->creationContext()))
: m_reusableItems.takeLast();
if (!item) {
qmlWarning(m_delegate) << TimelineView::tr("Delegate must be of Item type");
return nullptr;
}
auto *viewItem = new TimelineViewItem(day, len, *item, *this);
return viewItem;
}
void TimelineView::releaseItem(TimelineViewItem *item)
{
if (!item) {
return;
}
qsizetype index = m_items.indexOf(item);
if (index < 0) {
return;
}
QQuickItem *qitem = item->item;
if (!m_reusableItems.contains(qitem)) {
m_reusableItems.append(qitem);
}
m_items.removeAt(index);
delete item;
}
void TimelineView::drainItems()
{
qDeleteAll(m_reusableItems);
m_reusableItems.clear();
}
void TimelineView::clear()
{
while (!m_items.isEmpty()) {
releaseItem(m_items.last());
}
}
void TimelineView::populate()
{
if (!isComponentComplete() || !m_delegate) {
return;
}
if (m_viewportX > m_prevViewportX) {
// Delete from the left
while (!m_items.isEmpty()) {
TimelineViewItem *item = m_items.first();
if (item->right() >= m_viewportX) {
break;
}
releaseItem(item);
}
} else if (m_viewportX < m_prevViewportX) {
// Insert from the left
for (qint64 day = m_items.isEmpty() ? qCeil(m_prevViewportX / m_dayWidth) - 1
: m_items.first()->day - 1,
len = 1,
lastDay = qMax(-1, qFloor((m_viewportX - (len * m_dayWidth)) / m_dayWidth));
day > lastDay;
day -= len) {
TimelineViewItem *viewItem = createItem(day, len);
if (!viewItem) {
break;
}
m_items.prepend(viewItem);
}
}
int currentRight = m_viewportX + m_viewportWidth;
int prevRight = m_prevViewportX + m_prevViewportWidth;
if (currentRight < prevRight) {
// Delete from the right
while (!m_items.isEmpty()) {
TimelineViewItem *item = m_items.last();
if (item->left() < currentRight) {
break;
}
releaseItem(item);
}
} else if (currentRight > prevRight) {
// Insert from the right
for (qint64 day = m_items.isEmpty() ? qCeil(prevRight / m_dayWidth) - 1
: m_items.last()->day + 1,
len = 1,
lastDay = qFloor((currentRight + (len * m_dayWidth)) / m_dayWidth);
day < lastDay;
day += len) {
TimelineViewItem *viewItem = createItem(day, len);
if (!viewItem) {
break;
}
m_items.append(viewItem);
}
}
m_prevViewportX = m_viewportX;
m_prevViewportWidth = m_viewportWidth;
}
void TimelineView::updateImplicitWidth()
{
setImplicitWidth(m_dayWidth * m_fromDate.daysTo(m_toDate));
}
#include "moc_timelineview.cpp"

View File

@ -1,77 +0,0 @@
#ifndef TIMELINEVIEW_H
#define TIMELINEVIEW_H
#include <QList>
#include <QQmlComponent>
#include <QQuickItem>
struct TimelineViewItem;
class TimelineView : public QQuickItem
{
Q_OBJECT
QML_ELEMENT
Q_PROPERTY(qreal dayWidth READ dayWidth WRITE setDayWidth NOTIFY dayWidthChanged)
Q_PROPERTY(QQmlComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged)
Q_PROPERTY(QDate fromDate READ fromDate WRITE setFromDate NOTIFY fromDateChanged)
Q_PROPERTY(QDate toDate READ toDate WRITE setToDate NOTIFY toDateChanged)
Q_PROPERTY(qreal viewportX READ viewportX WRITE setViewportX NOTIFY viewportXChanged)
Q_PROPERTY(
qreal viewportWidth READ viewportWidth WRITE setViewportWidth NOTIFY viewportWidthChanged)
public:
TimelineView(QQuickItem *parent = nullptr);
~TimelineView() override;
qreal dayWidth() const;
void setDayWidth(qreal width);
QQmlComponent *delegate() const;
void setDelegate(QQmlComponent *delegate);
QDate fromDate() const;
void setFromDate(QDate date);
QDate toDate() const;
void setToDate(QDate date);
qreal viewportX() const;
void setViewportX(qreal x);
qreal viewportWidth() const;
void setViewportWidth(qreal width);
signals:
void dayWidthChanged(qreal width);
void delegateChanged(QQmlComponent *delegate);
void fromDateChanged(QDate date);
void toDateChanged(QDate date);
void viewportXChanged(qreal x);
void viewportWidthChanged(qreal width);
protected:
void componentComplete() override;
private:
Q_DISABLE_COPY_MOVE(TimelineView)
TimelineViewItem *createItem(qint64 day, qint64 len);
void releaseItem(TimelineViewItem *item);
void drainItems();
void clear();
void populate();
void updateImplicitWidth();
qreal m_dayWidth;
QQmlComponent *m_delegate;
QDate m_fromDate;
QList<TimelineViewItem *> m_items;
QList<QQuickItem *> m_reusableItems;
QDate m_toDate;
qreal m_viewportX;
qreal m_prevViewportX;
qreal m_viewportWidth;
qreal m_prevViewportWidth;
};
#endif // TIMELINEVIEW_H