Compare commits
7 Commits
d0e2659c30
...
00255f67a0
Author | SHA1 | Date |
---|---|---|
|
00255f67a0 | |
|
87f51e733e | |
|
f77d01134b | |
|
0416992a57 | |
|
9f181047ac | |
|
f4affd9241 | |
|
5f1e2b3b2d |
35
guix.scm
35
guix.scm
|
@ -116,40 +116,6 @@
|
|||
(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))))
|
||||
|
||||
(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
|
||||
(package
|
||||
(inherit postgresql-15)
|
||||
|
@ -249,7 +215,6 @@
|
|||
("perl" ,perl)
|
||||
("pg-libphonenumber" ,pg-libphonenumber)
|
||||
("pguri" ,pguri)
|
||||
("PostgreSQL-IBAN" ,postgresql-iban)
|
||||
("postgresql" ,postgresql-15/xml)))
|
||||
(synopsis "Simple camping management and booking web application")
|
||||
(description "A simple web application to manage small campings and other touristic accomodations in Spain.")
|
||||
|
|
|
@ -12,6 +12,7 @@ qt_add_qml_module(${PROJECT_NAME}
|
|||
calendarlistmodel.cpp calendarlistmodel.h
|
||||
database.cpp database.h
|
||||
mnemonicattached.cpp mnemonicattached.h
|
||||
timelineview.cpp timelineview.h
|
||||
QML_FILES
|
||||
ErrorNotification.qml
|
||||
Expander.qml
|
||||
|
|
|
@ -45,6 +45,8 @@ Control {
|
|||
id: label
|
||||
|
||||
Accessible.ignored: !control.visible
|
||||
Accessible.role: Accessible.StaticText
|
||||
focus: control.visible
|
||||
|
||||
anchors {
|
||||
left: parent.left
|
||||
|
@ -64,7 +66,7 @@ Control {
|
|||
display: ToolButton.IconOnly
|
||||
height: implicitHeight
|
||||
icon.name: "dialog-close"
|
||||
text: qsTr("Close")
|
||||
text: qsTr("Close alert")
|
||||
|
||||
onClicked: function () {
|
||||
hideTimer.stop();
|
||||
|
|
|
@ -8,6 +8,7 @@ Page {
|
|||
id: page
|
||||
|
||||
function saveSettings() {
|
||||
settings.autoLogIn = autoLogIn.checked;
|
||||
settings.connectOptions = connectOptions.text;
|
||||
settings.databaseName = databaseName.text;
|
||||
settings.hostName = hostName.text;
|
||||
|
@ -15,9 +16,16 @@ Page {
|
|||
settings.usePort = usePort.checked;
|
||||
}
|
||||
|
||||
function tryAutoLogIn() {
|
||||
if (autoLogIn.checked) {
|
||||
loginAction.trigger();
|
||||
}
|
||||
}
|
||||
|
||||
title: qsTr("Login")
|
||||
|
||||
ColumnLayout {
|
||||
Accessible.role: Accessible.Form
|
||||
anchors.centerIn: parent
|
||||
|
||||
GridLayout {
|
||||
|
@ -133,6 +141,22 @@ Page {
|
|||
|
||||
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()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -145,6 +169,7 @@ Page {
|
|||
Settings {
|
||||
id: settings
|
||||
|
||||
property bool autoLogIn: false
|
||||
property string connectOptions: ""
|
||||
property string databaseName: ""
|
||||
property string hostName: ""
|
||||
|
|
|
@ -9,6 +9,10 @@ ApplicationWindow {
|
|||
visible: true
|
||||
width: 640
|
||||
|
||||
Component.onCompleted: function () {
|
||||
(pageStack.currentItem as LoginPage)?.tryAutoLogIn();
|
||||
}
|
||||
|
||||
StackView {
|
||||
id: pageStack
|
||||
|
||||
|
|
|
@ -18,4 +18,10 @@ Label {
|
|||
control.buddy.forceActiveFocus();
|
||||
}
|
||||
}
|
||||
|
||||
Binding {
|
||||
property: "Accessible.name"
|
||||
target: control.buddy
|
||||
value: control.Mnemonic.plainLabel
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@ pragma ComponentBehavior: Bound
|
|||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import Camper
|
||||
|
||||
Page {
|
||||
title: qsTr("Reservations")
|
||||
|
@ -17,17 +18,76 @@ Page {
|
|||
}
|
||||
|
||||
ListView {
|
||||
anchors.fill: parent
|
||||
id: lodgingList
|
||||
|
||||
delegate: Text {
|
||||
ScrollBar.vertical: verticalScroll
|
||||
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
|
||||
|
||||
text: name
|
||||
}
|
||||
model: CalendarListModel {
|
||||
header: Pane {
|
||||
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 {
|
||||
id: logoutAction
|
||||
|
||||
|
|
|
@ -10,6 +10,9 @@ Control {
|
|||
contentItem: TextArea {
|
||||
id: textArea
|
||||
|
||||
Accessible.ignored: control.Accessible.ignored
|
||||
Accessible.role: control.Accessible.role
|
||||
focus: control.focus
|
||||
padding: 0
|
||||
readOnly: true
|
||||
selectByMouse: true
|
||||
|
|
|
@ -61,6 +61,7 @@ private:
|
|||
MnemonicAttached::MnemonicAttached(QObject *parent)
|
||||
: QObject{parent}
|
||||
, m_label{}
|
||||
, m_plainLabel{}
|
||||
, m_richTextLabel{}
|
||||
, m_active{MnemonicEventFilter::instance().isAltPressed()}
|
||||
{
|
||||
|
@ -93,9 +94,15 @@ void MnemonicAttached::setLabel(const QString &label)
|
|||
emit labelChanged();
|
||||
emit sequenceChanged();
|
||||
|
||||
setPlainLabel(QString(m_label).remove('&'_L1));
|
||||
updateRichText();
|
||||
}
|
||||
|
||||
QString MnemonicAttached::plainLabel() const
|
||||
{
|
||||
return m_plainLabel;
|
||||
}
|
||||
|
||||
QString MnemonicAttached::richTextLabel() const
|
||||
{
|
||||
return m_richTextLabel;
|
||||
|
@ -124,6 +131,15 @@ void MnemonicAttached::onAltReleased()
|
|||
updateRichText();
|
||||
}
|
||||
|
||||
void MnemonicAttached::setPlainLabel(const QString &plain)
|
||||
{
|
||||
if (plain == m_plainLabel) {
|
||||
return;
|
||||
}
|
||||
m_plainLabel = plain;
|
||||
emit plainLabelChanged();
|
||||
}
|
||||
|
||||
void MnemonicAttached::updateRichText()
|
||||
{
|
||||
QString richTextLabel;
|
||||
|
|
|
@ -11,6 +11,7 @@ class MnemonicAttached : public QObject
|
|||
Q_OBJECT
|
||||
|
||||
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(QKeySequence sequence READ sequence NOTIFY sequenceChanged FINAL)
|
||||
|
||||
|
@ -25,6 +26,8 @@ public:
|
|||
QString label() const;
|
||||
void setLabel(const QString &label);
|
||||
|
||||
QString plainLabel() const;
|
||||
|
||||
QString richTextLabel() const;
|
||||
|
||||
QKeySequence sequence() const;
|
||||
|
@ -32,6 +35,7 @@ public:
|
|||
signals:
|
||||
void enabledChanged();
|
||||
void labelChanged();
|
||||
void plainLabelChanged();
|
||||
void richTextLabelChanged();
|
||||
void sequenceChanged();
|
||||
|
||||
|
@ -40,9 +44,11 @@ private slots:
|
|||
void onAltReleased();
|
||||
|
||||
private:
|
||||
void setPlainLabel(const QString &plain);
|
||||
void updateRichText();
|
||||
|
||||
QString m_label;
|
||||
QString m_plainLabel;
|
||||
QString m_richTextLabel;
|
||||
bool m_active;
|
||||
};
|
||||
|
|
|
@ -0,0 +1,260 @@
|
|||
#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"
|
|
@ -0,0 +1,77 @@
|
|||
#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
|
Loading…
Reference in New Issue