From 6aa4cd67e7792550cf7afe97cdbdaf7554cb0645 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Mon, 18 Dec 2017 17:45:21 +0100 Subject: [PATCH 01/11] Removed attachTo for StripsWidget --- zeiterfassunglib/zeiterfassungplugin.h | 1 - 1 file changed, 1 deletion(-) diff --git a/zeiterfassunglib/zeiterfassungplugin.h b/zeiterfassunglib/zeiterfassungplugin.h index 33eee20..0f53d31 100644 --- a/zeiterfassunglib/zeiterfassungplugin.h +++ b/zeiterfassunglib/zeiterfassungplugin.h @@ -16,7 +16,6 @@ public: explicit ZeiterfassungPlugin(QObject *parent = 0); virtual void attachTo(MainWindow &mainWindow) { Q_UNUSED(mainWindow) } - virtual void attachTo(StripsWidget &stripsWidget) { Q_UNUSED(stripsWidget) } }; Q_DECLARE_INTERFACE(ZeiterfassungPlugin, "dbsoftware.zeiterfassung.plugin/1.0") -- 2.50.1 From 426e77b72e6040106260a913d7f999a6104d1422 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Mon, 18 Dec 2017 17:48:02 +0100 Subject: [PATCH 02/11] Added accessor to strip widgets in MainWindow --- zeiterfassunglib/mainwindow.cpp | 10 ++++++++++ zeiterfassunglib/mainwindow.h | 3 +++ 2 files changed, 13 insertions(+) diff --git a/zeiterfassunglib/mainwindow.cpp b/zeiterfassunglib/mainwindow.cpp index da35f4b..0c6e72a 100644 --- a/zeiterfassunglib/mainwindow.cpp +++ b/zeiterfassunglib/mainwindow.cpp @@ -166,6 +166,16 @@ StripFactory &MainWindow::stripFactory() const return m_stripFactory; } +const QMap &MainWindow::projects() const +{ + return m_projects; +} + +const std::array &MainWindow::stripsWidgets() const +{ + return m_stripsWidgets; +} + void MainWindow::getProjectsFinished() { if(m_getProjectsReply->success()) diff --git a/zeiterfassunglib/mainwindow.h b/zeiterfassunglib/mainwindow.h index a41e9cc..e5e9e62 100644 --- a/zeiterfassunglib/mainwindow.h +++ b/zeiterfassunglib/mainwindow.h @@ -41,6 +41,9 @@ public: const GetUserInfoReply::UserInfo &userInfo() const; StripFactory &stripFactory() const; + const QMap &projects() const; + const std::array &stripsWidgets() const; + private Q_SLOTS: void getProjectsFinished(); void getAuswertungFinished(); -- 2.50.1 From 151441706f14bfff948645c1beae8705a0e67104 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Mon, 18 Dec 2017 18:04:00 +0100 Subject: [PATCH 03/11] Exposed layout members of StripLayout --- zeiterfassunglib/stripswidget.cpp | 85 ++++++++++++++++++++----------- zeiterfassunglib/stripswidget.h | 13 ++++- 2 files changed, 67 insertions(+), 31 deletions(-) diff --git a/zeiterfassunglib/stripswidget.cpp b/zeiterfassunglib/stripswidget.cpp index 6b00f52..b0bd6fe 100644 --- a/zeiterfassunglib/stripswidget.cpp +++ b/zeiterfassunglib/stripswidget.cpp @@ -18,7 +18,6 @@ StripsWidget::StripsWidget(ZeiterfassungApi &erfassung, int userId, StripFactory m_userId(userId), m_stripFactory(stripFactory), m_projects(projects), - m_layout(new QVBoxLayout(this)), m_refreshing(false), m_refreshingBookings(false), m_refreshingTimeAssignments(false), @@ -27,7 +26,39 @@ StripsWidget::StripsWidget(ZeiterfassungApi &erfassung, int userId, StripFactory m_getBookingsReply(Q_NULLPTR), m_getTimeAssignmentsReply(Q_NULLPTR) { - setLayout(m_layout); + auto layout = new QVBoxLayout(this); + + m_headerLayout = new QHBoxLayout(this); + m_label = new QLabel(this); + { + auto font = m_label->font(); + font.setBold(true); + m_label->setFont(font); + } + m_headerLayout->addWidget(m_label, 1); + layout->addLayout(m_headerLayout); + + m_stripsLayout = new QVBoxLayout(this); + layout->addLayout(m_stripsLayout); + + layout->addStretch(1); + + setLayout(layout); +} + +QBoxLayout *StripsWidget::headerLayout() const +{ + return m_headerLayout; +} + +QBoxLayout *StripsWidget::stripsLayout() const +{ + return m_stripsLayout; +} + +QLabel *StripsWidget::label() const +{ + return m_label; } const QDate &StripsWidget::date() const @@ -37,8 +68,20 @@ const QDate &StripsWidget::date() const void StripsWidget::setDate(const QDate &date) { - m_date = date; - refresh(); + if(m_date != date) + { + Q_EMIT dateChanged(m_date = date); + + if(m_date.isValid()) + m_label->setText(tr("%0 (%1)") + .arg(std::array { tr("Monday"), tr("Tuesday"), tr("Wednesday"), tr("Thursday"), + tr("Friday"), tr("Saturday"), tr("Sunday") }[m_date.dayOfWeek() - 1]) + .arg(m_date.toString(tr("dd.MM.yyyy")))); + else + m_label->setText(tr("Invalid")); + + refresh(); + } } const QVector &StripsWidget::bookings() const @@ -95,8 +138,7 @@ void StripsWidget::refresh() { clearStrips(); - m_layout->addWidget(new QLabel(tr("Loading..."), this)); - m_layout->addStretch(1); + m_stripsLayout->addWidget(new QLabel(tr("Loading..."), this)); refreshBookings(); refreshTimeAssignments(); @@ -199,7 +241,7 @@ bool StripsWidget::createStrips() { auto breakTime = timeBetween(lastBooking->time, startBooking.time); auto label = new QLabel(tr("%0: %1").arg(tr("Break")).arg(tr("%0h").arg(breakTime.toString(tr("HH:mm")))), this); - m_layout->addWidget(label); + m_stripsLayout->addWidget(label); } lastBooking = &startBooking; @@ -392,7 +434,7 @@ bool StripsWidget::createStrips() auto label = new QLabel(tr("%0: %1") .arg(tr("Assigned time")) .arg(tr("%0h").arg(timeAssignmentTime.toString(tr("HH:mm")))), this); - m_layout->addWidget(label); + m_stripsLayout->addWidget(label); } else { @@ -406,7 +448,7 @@ bool StripsWidget::createStrips() "Your bookings and time assignments for this day are in an illegal state!") % "\n" % errorMessage, this); label->setStyleSheet("color: red;"); - m_layout->addWidget(label); + m_stripsLayout->addWidget(label); } if(m_timeAssignmentTime != timeAssignmentTime) @@ -424,33 +466,16 @@ bool StripsWidget::createStrips() if(m_endEnabled != endEnabled) Q_EMIT endEnabledChanged(m_endEnabled = endEnabled); - m_layout->addStretch(1); - return !errorMessage.isEmpty(); } void StripsWidget::clearStrips() { - while(QLayoutItem *item = m_layout->takeAt(0)) + while(QLayoutItem *item = m_stripsLayout->takeAt(0)) { delete item->widget(); delete item; } - - auto label = new QLabel(this); - if(m_date.isValid()) - label->setText(tr("%0 (%1)") - .arg(std::array { tr("Monday"), tr("Tuesday"), tr("Wednesday"), tr("Thursday"), - tr("Friday"), tr("Saturday"), tr("Sunday") }[m_date.dayOfWeek() - 1]) - .arg(m_date.toString(tr("dd.MM.yyyy")))); - else - label->setText(tr("Invalid")); - { - auto font = label->font(); - font.setBold(true); - label->setFont(font); - } - m_layout->addWidget(label); } void StripsWidget::getBookingsFinished() @@ -532,7 +557,7 @@ QWidget *StripsWidget::appendBookingStartStrip(int id, const QTime &time) else qWarning() << "no labelId found!"; - m_layout->addWidget(widget); + m_stripsLayout->addWidget(widget); return widget; } @@ -551,7 +576,7 @@ QWidget *StripsWidget::appendBookingEndStrip(int id, const QTime &time) else qWarning() << "no labelId found!"; - m_layout->addWidget(widget); + m_stripsLayout->addWidget(widget); return widget; } @@ -590,7 +615,7 @@ QWidget *StripsWidget::appendTimeAssignmentStrip(int id, const QTime &duration, else qWarning() << "no labelText found!"; - m_layout->addWidget(widget); + m_stripsLayout->addWidget(widget); return widget; } diff --git a/zeiterfassunglib/stripswidget.h b/zeiterfassunglib/stripswidget.h index 8995538..26ffc14 100644 --- a/zeiterfassunglib/stripswidget.h +++ b/zeiterfassunglib/stripswidget.h @@ -11,6 +11,7 @@ #include "replies/gettimeassignmentsreply.h" class QBoxLayout; +class QLabel; template class QMap; template class QVector; @@ -25,6 +26,11 @@ public: explicit StripsWidget(ZeiterfassungApi &erfassung, int userId, StripFactory &stripFactory, const QMap &projects, QWidget *parent = Q_NULLPTR); + QBoxLayout *headerLayout() const; + QBoxLayout *stripsLayout() const; + + QLabel *label() const; + const QDate &date() const; void setDate(const QDate &date); @@ -47,6 +53,8 @@ public: void clearStrips(); Q_SIGNALS: + void dateChanged(const QDate &date); + void bookingsChanged(const QVector &bookings); void timeAssignmentsChanged(const QVector &timeAssignments); @@ -78,7 +86,10 @@ private: StripFactory &m_stripFactory; const QMap &m_projects; - QBoxLayout *m_layout; + QBoxLayout *m_headerLayout; + QBoxLayout *m_stripsLayout; + + QLabel *m_label; QDate m_date; -- 2.50.1 From 22fb4b93527f292547bf1d66305a94bd81e09a76 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Mon, 18 Dec 2017 18:06:01 +0100 Subject: [PATCH 04/11] Updated translations --- .../translations/zeiterfassunglib_de.ts | 188 +++++++++--------- .../translations/zeiterfassunglib_en.ts | 188 +++++++++--------- 2 files changed, 188 insertions(+), 188 deletions(-) diff --git a/zeiterfassunglib/translations/zeiterfassunglib_de.ts b/zeiterfassunglib/translations/zeiterfassunglib_de.ts index db4389c..bbace03 100644 --- a/zeiterfassunglib/translations/zeiterfassunglib_de.ts +++ b/zeiterfassunglib/translations/zeiterfassunglib_de.ts @@ -376,8 +376,8 @@ - - + + Start Kommen @@ -477,13 +477,13 @@ Zeiterfassung - %0 (%1) - - + + Could not open auswertung! - + Could not open default PDF viewer! Konnte den PDF-Anzeiger nicht öffnen! @@ -503,147 +503,147 @@ Text - - - - + + + + %0: %1 %0: %1 - - + + ??? ??? - - + + Balance Saldo - - + + Holidays Urlaubstage - - + + Could not load bookings! Konnte Buchungen nicht laden! - + Could not load Auswertung! - + %0h %0h - + Could not delete booking! Konnte Buchung nicht löschen! - + Edit booking Buchung bearbeiten - + Delete booking Buchung löschen - + Could not edit booking! Konnte Buchung nicht bearbeiten! - + Create booking Buchung erstellen - - + + n/a n/v - + Refresh bookings Buchungen aktualisieren - - - + + + Could not create booking! Konnte Buchung nicht erstellen! - + Do you really want to delete the booking? Möchten Sie die Buchung wirklich löschen? - + Refresh time assignments Kontierungen aktualisieren - + Edit time assignment Kontierung bearbeiten - + Delete time assignment Kontierung löschen - - - + + + Could not edit time assignment! Konnte Kontierung nicht bearbeiten! - + Do you really want to delete the time assignment? Möchten Sie die Kontierung wirklich löschen? - + Could not delete time assignment! Konnte Kontierung nicht löschen! - - + + %0 (%1) %0 (%1) - + Create time assignment Kontierung erstellen - - + + Could not create time assignment! Konnte Kontierung nicht erstellen! - - + + Switch Wechseln @@ -728,178 +728,178 @@ StripsWidget - + Loading... Lade... - + Missing booking! Kontierung fehlend! - + Expected start booking, instead got type %0 Booking ID: %1 - - + + %0: %1 %0: %1 - + Break Pause - - - + + + %0h %0h - - - - - + + + + + HH:mm HH:mm - + Missing time assignment! Kontierung fehlend! - - - + + + Expected %0 but received %1 in time assignment. Time assignment ID: %2 - - - - - - - - + + + + + + + + HH:mm:ss HH:mm:ss - - + + There is another booking after an unfinished time assignment. Booking ID: %0 Time assignment ID: %1 - - - + + + There is another time assignment after an unfinished time assignment. Time assignment ID: %0 Time assignment ID: %1 - + The last time assignment is finished without end booking Time assignment ID: %0 - + Expected end booking, instead got type %0 Booking ID: %1 - + Missing time assignment! Missing: %0 Kontierung fehlend! %0 nicht kontiert - + Assigned time Kontierte Zeit - + dd.MM.yyyy dd.MM.yyyy - + %0 (%1) %0 (%1) - + Time assignment time longer than booking time! Time assignment: %0 Booking: %1 - + Strip rendering aborted due error. Your bookings and time assignments for this day are in an illegal state! - + Monday Montag - + Tuesday Dienstag - + Wednesday Mittwoch - + Thursday Donnerstag - + Friday Freitag - + Saturday Samstag - + Sunday Sonntag - + Invalid Ungültig - + Open Offen diff --git a/zeiterfassunglib/translations/zeiterfassunglib_en.ts b/zeiterfassunglib/translations/zeiterfassunglib_en.ts index 7fb33eb..c58d108 100644 --- a/zeiterfassunglib/translations/zeiterfassunglib_en.ts +++ b/zeiterfassunglib/translations/zeiterfassunglib_en.ts @@ -376,8 +376,8 @@ - - + + Start @@ -492,158 +492,158 @@ - - + + ??? - - + + Could not load bookings! - + Could not load Auswertung! - - + + n/a - + %0h - - - - + + + + %0: %1 - - + + Balance - - + + Holidays - + Create booking - + Refresh bookings - - - + + + Could not create booking! - + Edit booking - + Delete booking - + Could not edit booking! - + Do you really want to delete the booking? - + Could not delete booking! - + Create time assignment - + Refresh time assignments - - + + Could not create time assignment! - + Edit time assignment - + Delete time assignment - - - + + + Could not edit time assignment! - + Do you really want to delete the time assignment? - + Could not delete time assignment! - - + + Could not open auswertung! - + Could not open default PDF viewer! - - + + Switch - - + + %0 (%1) @@ -728,178 +728,178 @@ StripsWidget - + Loading... - + Missing booking! - + Expected start booking, instead got type %0 Booking ID: %1 - - + + %0: %1 - + Break - - - + + + %0h - - - - - + + + + + HH:mm - + Missing time assignment! - - - + + + Expected %0 but received %1 in time assignment. Time assignment ID: %2 - - - - - - - - + + + + + + + + HH:mm:ss - - + + There is another booking after an unfinished time assignment. Booking ID: %0 Time assignment ID: %1 - - - + + + There is another time assignment after an unfinished time assignment. Time assignment ID: %0 Time assignment ID: %1 - + The last time assignment is finished without end booking Time assignment ID: %0 - + Expected end booking, instead got type %0 Booking ID: %1 - + Missing time assignment! Missing: %0 - + Time assignment time longer than booking time! Time assignment: %0 Booking: %1 - + Assigned time - + Strip rendering aborted due error. Your bookings and time assignments for this day are in an illegal state! - + %0 (%1) - + Monday - + Tuesday - + Wednesday - + Thursday - + Friday - + Saturday - + Sunday - + dd.MM.yyyy - + Invalid - + Open -- 2.50.1 From ba361601a7b258193b6a7d7477ce8ff95baeb3f2 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Mon, 18 Dec 2017 18:27:07 +0100 Subject: [PATCH 05/11] Implemented small button for every StripsWidget --- .../advancedviewplugin/advancedviewplugin.cpp | 18 +++++++++++++++ .../advancedviewplugin/advancedviewplugin.h | 23 +++++++++++++++++++ .../advancedviewplugin.json | 0 .../advancedviewplugin/advancedviewplugin.pro | 23 +++++++++++++++++++ .../advancedviewplugin/advancedviewwidget.cpp | 10 ++++++++ .../advancedviewplugin/advancedviewwidget.h | 19 +++++++++++++++ plugins/lunchmealplugin/lunchmealplugin.h | 2 +- plugins/plugins.pro | 3 ++- plugins/presenceplugin/presenceplugin.h | 2 +- plugins/weatherplugin/weatherplugin.h | 2 +- zeiterfassunglib/zeiterfassungplugin.h | 2 +- 11 files changed, 99 insertions(+), 5 deletions(-) create mode 100644 plugins/advancedviewplugin/advancedviewplugin.cpp create mode 100644 plugins/advancedviewplugin/advancedviewplugin.h create mode 100644 plugins/advancedviewplugin/advancedviewplugin.json create mode 100644 plugins/advancedviewplugin/advancedviewplugin.pro create mode 100644 plugins/advancedviewplugin/advancedviewwidget.cpp create mode 100644 plugins/advancedviewplugin/advancedviewwidget.h diff --git a/plugins/advancedviewplugin/advancedviewplugin.cpp b/plugins/advancedviewplugin/advancedviewplugin.cpp new file mode 100644 index 0000000..d84bae7 --- /dev/null +++ b/plugins/advancedviewplugin/advancedviewplugin.cpp @@ -0,0 +1,18 @@ +#include "advancedviewplugin.h" + +#include + +#include "mainwindow.h" +#include "stripswidget.h" +#include "advancedviewwidget.h" + +AdvancedViewPlugin::AdvancedViewPlugin(QObject *parent) : + ZeiterfassungPlugin(parent) +{ +} + +void AdvancedViewPlugin::attachTo(MainWindow &mainWindow) +{ + for(auto irgendwas : mainWindow.stripsWidgets()) + irgendwas->headerLayout()->addWidget(new AdvancedViewWidget(mainWindow)); +} diff --git a/plugins/advancedviewplugin/advancedviewplugin.h b/plugins/advancedviewplugin/advancedviewplugin.h new file mode 100644 index 0000000..e4a08e8 --- /dev/null +++ b/plugins/advancedviewplugin/advancedviewplugin.h @@ -0,0 +1,23 @@ +#ifndef ADVANCEDVIEWPLUGIN_H +#define ADVANCEDVIEWPLUGIN_H + +#include + +#include "zeiterfassungplugin.h" + +class MainWindow; + +class Q_DECL_EXPORT AdvancedViewPlugin : public ZeiterfassungPlugin +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "dbsoftware.zeiterfassung.plugin/1.0" FILE "advancedviewplugin.json") + Q_INTERFACES(ZeiterfassungPlugin) + +public: + explicit AdvancedViewPlugin(QObject *parent = Q_NULLPTR); + + // ZeiterfassungPlugin interface + void attachTo(MainWindow &mainWindow); +}; + +#endif // ADVANCEDVIEWPLUGIN_H diff --git a/plugins/advancedviewplugin/advancedviewplugin.json b/plugins/advancedviewplugin/advancedviewplugin.json new file mode 100644 index 0000000..e69de29 diff --git a/plugins/advancedviewplugin/advancedviewplugin.pro b/plugins/advancedviewplugin/advancedviewplugin.pro new file mode 100644 index 0000000..a1a3e27 --- /dev/null +++ b/plugins/advancedviewplugin/advancedviewplugin.pro @@ -0,0 +1,23 @@ +QT += core network gui widgets + +TARGET = advancedviewplugin +TEMPLATE = lib + +CONFIG += shared c++14 + +DESTDIR = $${OUT_PWD}/../../bin/plugins/zeiterfassung + +LIBS += -L$$OUT_PWD/../../lib -lzeiterfassunglib + +INCLUDEPATH += $$PWD/../../zeiterfassunglib +DEPENDPATH += $$PWD/../../zeiterfassunglib + +DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT + +HEADERS += advancedviewplugin.h \ + advancedviewwidget.h + +SOURCES += advancedviewplugin.cpp \ + advancedviewwidget.cpp + +OTHER_FILES += advancedviewplugin.json diff --git a/plugins/advancedviewplugin/advancedviewwidget.cpp b/plugins/advancedviewplugin/advancedviewwidget.cpp new file mode 100644 index 0000000..124115d --- /dev/null +++ b/plugins/advancedviewplugin/advancedviewwidget.cpp @@ -0,0 +1,10 @@ +#include "advancedviewwidget.h" + +#include "mainwindow.h" + +AdvancedViewWidget::AdvancedViewWidget(MainWindow &mainWindow) : + QToolButton(&mainWindow), + m_mainWindow(mainWindow) +{ + setText(tr("X")); +} diff --git a/plugins/advancedviewplugin/advancedviewwidget.h b/plugins/advancedviewplugin/advancedviewwidget.h new file mode 100644 index 0000000..d6397b6 --- /dev/null +++ b/plugins/advancedviewplugin/advancedviewwidget.h @@ -0,0 +1,19 @@ +#ifndef ADVANCEDVIEWWIDGET_H +#define ADVANCEDVIEWWIDGET_H + +#include + +class MainWindow; + +class AdvancedViewWidget : public QToolButton +{ + Q_OBJECT + +public: + explicit AdvancedViewWidget(MainWindow &mainWindow); + +private: + MainWindow &m_mainWindow; +}; + +#endif // ADVANCEDVIEWWIDGET_H diff --git a/plugins/lunchmealplugin/lunchmealplugin.h b/plugins/lunchmealplugin/lunchmealplugin.h index e73e062..c5626a8 100644 --- a/plugins/lunchmealplugin/lunchmealplugin.h +++ b/plugins/lunchmealplugin/lunchmealplugin.h @@ -12,7 +12,7 @@ class Q_DECL_EXPORT LunchMealPlugin : public ZeiterfassungPlugin Q_INTERFACES(ZeiterfassungPlugin) public: - explicit LunchMealPlugin(QObject *parent = 0); + explicit LunchMealPlugin(QObject *parent = Q_NULLPTR); // ZeiterfassungPlugin interface }; diff --git a/plugins/plugins.pro b/plugins/plugins.pro index 5335e51..e062acc 100644 --- a/plugins/plugins.pro +++ b/plugins/plugins.pro @@ -1,5 +1,6 @@ TEMPLATE = subdirs -SUBDIRS += lunchmealplugin \ +SUBDIRS += advancedviewplugin \ + lunchmealplugin \ presenceplugin \ weatherplugin diff --git a/plugins/presenceplugin/presenceplugin.h b/plugins/presenceplugin/presenceplugin.h index 5ccdc86..362c0f1 100644 --- a/plugins/presenceplugin/presenceplugin.h +++ b/plugins/presenceplugin/presenceplugin.h @@ -14,7 +14,7 @@ class Q_DECL_EXPORT PresencePlugin : public ZeiterfassungPlugin Q_INTERFACES(ZeiterfassungPlugin) public: - explicit PresencePlugin(QObject *parent = 0); + explicit PresencePlugin(QObject *parent = Q_NULLPTR); // ZeiterfassungPlugin interface void attachTo(MainWindow &mainWindow); diff --git a/plugins/weatherplugin/weatherplugin.h b/plugins/weatherplugin/weatherplugin.h index 9db873d..f8abc9b 100644 --- a/plugins/weatherplugin/weatherplugin.h +++ b/plugins/weatherplugin/weatherplugin.h @@ -12,7 +12,7 @@ class Q_DECL_EXPORT WeatherPlugin : public ZeiterfassungPlugin Q_INTERFACES(ZeiterfassungPlugin) public: - explicit WeatherPlugin(QObject *parent = 0); + explicit WeatherPlugin(QObject *parent = Q_NULLPTR); // ZeiterfassungPlugin interface }; diff --git a/zeiterfassunglib/zeiterfassungplugin.h b/zeiterfassunglib/zeiterfassungplugin.h index 0f53d31..1b170c0 100644 --- a/zeiterfassunglib/zeiterfassungplugin.h +++ b/zeiterfassunglib/zeiterfassungplugin.h @@ -13,7 +13,7 @@ class ZEITERFASSUNGLIBSHARED_EXPORT ZeiterfassungPlugin : public QObject Q_OBJECT public: - explicit ZeiterfassungPlugin(QObject *parent = 0); + explicit ZeiterfassungPlugin(QObject *parent = Q_NULLPTR); virtual void attachTo(MainWindow &mainWindow) { Q_UNUSED(mainWindow) } }; -- 2.50.1 From c921a6c0fcdf5bff7cdb57f5ccc312ce34be580d Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Mon, 18 Dec 2017 20:31:36 +0100 Subject: [PATCH 06/11] Added icon to advanced view widget --- .../advancedviewplugin/advancedviewplugin.cpp | 5 +++-- .../advancedviewplugin/advancedviewplugin.pro | 7 ++++++ .../advancedviewplugin_resources.qrc | 5 +++++ .../advancedviewplugin/advancedviewwidget.cpp | 20 +++++++++++++----- .../advancedviewplugin/advancedviewwidget.h | 9 +++++--- .../images/advanced-view.png | Bin 0 -> 2772 bytes 6 files changed, 36 insertions(+), 10 deletions(-) create mode 100644 plugins/advancedviewplugin/advancedviewplugin_resources.qrc create mode 100644 plugins/advancedviewplugin/images/advanced-view.png diff --git a/plugins/advancedviewplugin/advancedviewplugin.cpp b/plugins/advancedviewplugin/advancedviewplugin.cpp index d84bae7..e4124ba 100644 --- a/plugins/advancedviewplugin/advancedviewplugin.cpp +++ b/plugins/advancedviewplugin/advancedviewplugin.cpp @@ -9,10 +9,11 @@ AdvancedViewPlugin::AdvancedViewPlugin(QObject *parent) : ZeiterfassungPlugin(parent) { + Q_INIT_RESOURCE(advancedviewplugin_resources); } void AdvancedViewPlugin::attachTo(MainWindow &mainWindow) { - for(auto irgendwas : mainWindow.stripsWidgets()) - irgendwas->headerLayout()->addWidget(new AdvancedViewWidget(mainWindow)); + for(auto stripsWidget : mainWindow.stripsWidgets()) + stripsWidget->headerLayout()->addWidget(new AdvancedViewWidget(*stripsWidget)); } diff --git a/plugins/advancedviewplugin/advancedviewplugin.pro b/plugins/advancedviewplugin/advancedviewplugin.pro index a1a3e27..3a3116b 100644 --- a/plugins/advancedviewplugin/advancedviewplugin.pro +++ b/plugins/advancedviewplugin/advancedviewplugin.pro @@ -20,4 +20,11 @@ HEADERS += advancedviewplugin.h \ SOURCES += advancedviewplugin.cpp \ advancedviewwidget.cpp +FORMS += + +RESOURCES += \ + advancedviewplugin_resources.qrc + +TRANSLATIONS += + OTHER_FILES += advancedviewplugin.json diff --git a/plugins/advancedviewplugin/advancedviewplugin_resources.qrc b/plugins/advancedviewplugin/advancedviewplugin_resources.qrc new file mode 100644 index 0000000..c0cfae7 --- /dev/null +++ b/plugins/advancedviewplugin/advancedviewplugin_resources.qrc @@ -0,0 +1,5 @@ + + + images/advanced-view.png + + diff --git a/plugins/advancedviewplugin/advancedviewwidget.cpp b/plugins/advancedviewplugin/advancedviewwidget.cpp index 124115d..aab7f36 100644 --- a/plugins/advancedviewplugin/advancedviewwidget.cpp +++ b/plugins/advancedviewplugin/advancedviewwidget.cpp @@ -1,10 +1,20 @@ #include "advancedviewwidget.h" -#include "mainwindow.h" +#include -AdvancedViewWidget::AdvancedViewWidget(MainWindow &mainWindow) : - QToolButton(&mainWindow), - m_mainWindow(mainWindow) +#include "stripswidget.h" + +AdvancedViewWidget::AdvancedViewWidget(StripsWidget &stripsWidget) : + QToolButton(&stripsWidget), + m_stripsWidget(stripsWidget) { - setText(tr("X")); + setIcon(QIcon(QStringLiteral(":/zeiterfassunglib/plugins/advancedviewplugin/images/advanced-view.png"))); + setText(tr("Advanced view")); + connect(&stripsWidget, &StripsWidget::dateChanged, this, &AdvancedViewWidget::dateChanged); + dateChanged(stripsWidget.date()); +} + +void AdvancedViewWidget::dateChanged(const QDate &date) +{ + setEnabled(date.isValid()); } diff --git a/plugins/advancedviewplugin/advancedviewwidget.h b/plugins/advancedviewplugin/advancedviewwidget.h index d6397b6..b1c33bc 100644 --- a/plugins/advancedviewplugin/advancedviewwidget.h +++ b/plugins/advancedviewplugin/advancedviewwidget.h @@ -3,17 +3,20 @@ #include -class MainWindow; +class StripsWidget; class AdvancedViewWidget : public QToolButton { Q_OBJECT public: - explicit AdvancedViewWidget(MainWindow &mainWindow); + explicit AdvancedViewWidget(StripsWidget &stripsWidget); + +private Q_SLOTS: + void dateChanged(const QDate &date); private: - MainWindow &m_mainWindow; + StripsWidget &m_stripsWidget; }; #endif // ADVANCEDVIEWWIDGET_H diff --git a/plugins/advancedviewplugin/images/advanced-view.png b/plugins/advancedviewplugin/images/advanced-view.png new file mode 100644 index 0000000000000000000000000000000000000000..7a6c875cfd20053e6c267a5d0bc1ea5e3c711c5b GIT binary patch literal 2772 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4i*Lm28M*4p$rTROiAAEE({E-dX5d-oLTeg zU8KHI#EFLRO%o3&^t7aGuuxd{>;U7LUgQ4_^@l}wC@B_hNh#bip?5;AWV7WBqix?V zKfZhO<*HLX6_z1k~4KrFi1iFNu|#9`&ABub$lSfBOFdL57HjtTmi24h;@%zW;KJsQ^!2{f|^25_`Dw^tW91iElFr2OAt{$`)~4#TVe zE&If`?^8T~O!d&x{WUXA-TZw|_ui}fe+%}0Gh`F|G25(7_`@l~5_Z_MRRnG>p# zzVBz=_gndYufP5$d|c(hwwTy;^Zwm4pU*pe<9XTQ-;EPimY%;7HRbyLs;aHKr=E5@ zAf^7xLhifzq1J6F$vq6^>%Ouxx+pYgxTM^#73kl%p!OJzTYV+MFYk zAFMd|T9|WEK~prNNTWlD<|3sKPJuV&DoGCSv(1at8p=;S|JCC%Zs>@{-~$R+3A1@7%rns#s%|kD*(Y zS4&5Lrrwmh=XUP3exa~KnL*|3X2HITDYjV)chBCrbLY&;g}ZzAwNII(<=orM7Am-K zj=k*(%f+e63nIjpUpBk9tJvgq+?_Kv)gO~uTlt(!j=7ndI3{~29#vZ=5c+-hzgE?2 z*FH{SmzrzFcH`C78I>E~9Nm;IZL|3TLtyT#)C^}1!==kIgQRauxag(VN;7^pO3^MU zHvjx6?WniuY}@Gk=I{5a+nh~~q;~mc1YOp<<$BvJHz#RI``IP48&AeEs&vcpmv7lI zbGE2W#+lk9+3E)o47V_h8%RPY99Y+I`@K8syu=JFl=J$t!!Z7(?c{xhRawfEhJvGpPk z+4ujq4`BIW_|Ks2>xRBBFHhg-;XAOusosxi-l1~E(~I>Vch9SMknoG=UsZ9{r-QS% zzkl9upcKe*kGJ3U>c3Aj^V`3yILmy_y8KqW?*EFv6|Xu952$O!S3LV||NGi2$A9yU z_n&V+!IrnIFiQKR<%$~*zsv9c{^{lXPqFh^z8FNd9KUq^>nTabPYlfu(t;lJBrda3 zno#x5+y1E59G$Wm8=8w!-?iy3EnwfQt@u_z(J)Z4Y=h4Nr9}aOU2lvxUfj7Y&rI+L zPlCqHYXN?nPk*_o%e&~@MVU;_FB9izIdt{4vjxsvcKok|kS&|s_wQ%7xjbQ5oAP=^ z6K`^O{?6oS%5w^jObwLgxVXTOg;z?|gT?X8#ujU)uK7HBfAUQdoTqF2dyCN7ge$To z_y1_|@3Q7(S5Rz`NOqdS;?Uw$_;GKY^*d>v7R&QG#}&?Yr>?d0yI1ve@yU#(PWtak z1SSY1Ww}H?tVnXQY2Y-E{k?{vAugw&-Cyuo%C$S*M=!ofyUE?l*X7}}c9quzi6Eba zyqYeeZ_4*|pAum_9eE^CxXfR~CdqSMi%G;cCUJ$9Wsz;J9h%FoEHN`pY}w?0vL$V) zuxZp&Mg6clI@RBjn$us~R;M!?bGA$g(_AX(etTQ2Np6mlMT5uF8pf1urQvRBI%!kc zH|KX;_*d~(vsUs^q6^o8$8&e@Y2UQl_|eOc@$o-D z)E>F{?(*EyYL{KNf2cIH2zlFZnmciME_UNxR8(h_u>V5kpNl8&-<;bR#9}*1xvi6P zYMwL$gp>9XqksfU_ZZ)a%u zH|d&OT*|Jk>38ZxTp27rNgg>Cx1_zcnmzZtmOV1ad zY|qoTFXoB3b~iq6-^Y6=|K`qm*ZX1a>g)9-Z^f^RP3KhIkh$*e?RU}De0N{P|Bd~h z823Gz(Y7zT{?SkM`Uy`OZ5_V(6qF^2FG{iVDBJI}CwYDR?$V{#Gw<~{^zY87Y@L69 z`suq9Ee>z;HOqEu4eIT3N_}#uR%5r9*YecO3GNT%)=fYDTQ2*B%iQQ<8)Na@OQrjM zR&UZ%p0@Cj$%ua^t&=>~DqCwgnQtXE&uAC#+;@k;n{aX5$qWo_E^i z$bo%py3bx`I{e_M)%)!>7T(@r@!8LEx?A2&{<|RYiIGd^0tSJ+Yi{!d0}{-f4{7>y zoIk_&gJscWE0gUOPtV@rp6kc3NO6hC>?Ka3T&!G$H%)h6UwHnc@UBY3r0i`@lIEQ! zXKmZ~$Zaum!?78Mm;_d=VCz-Pw5azEalgd;xg|lf*<#iHFBgM9Pn^)@Z@D>XCL6np zX=|#-RE}if+cTUdoPL+DJ!RK(qXlZ3$7?cLh4sT~e6I1@-EdgUZF0=D$I-dVH*40F zWoEwj>ZKT$+z!}ua9KcpaOq*TGgk6@I=b7;;xeb_=FHv}yCrvX#;hwX&P7XFn5<{s zDNIfZv(q$pS6OQpy)mbm|Jv<@y`@XHpEF)DY1-+8qVTD$c3!CKnDB;rC>tk=Q^xeDnB->)9ijOF>Qpsfh z`)Br9XP;w9RTj(?cO6| z^##-vk}YwKC~?lu%}vcKVQ?-=O)N=GQ7F$W$xsN%NL6t6^bL5QqMFCRz@Q3Jm<(2+ zo03?P%3x$*V5w_psB35*Vq{=tU}j}%scT?vWneIm&EY&u14yM6L>GgRfuVt}fsw9} zL5PvDm63^+p#?-kvgF$u6b-rgDVb@NPz{EFa~-$}CGw&d<%w&nwo;FG|7ex5>bYRNkFh4u^#3~mTD@u5LJ zFn1Ma<`(3nX6EJPmnD{D=I8047BOtCeZ T>iF{*sI}_p>gTe~DWM4f!P(AS literal 0 HcmV?d00001 -- 2.50.1 From 27b3a5d7af1adc07dc918bf423ce1318b9e3ca69 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Mon, 18 Dec 2017 20:52:10 +0100 Subject: [PATCH 07/11] Added dialog to advanced view plugin --- .../advancedviewplugin/advancedviewplugin.pro | 11 +-- .../advancedviewplugin/advancedviewwidget.cpp | 13 +++- .../advancedviewplugin/advancedviewwidget.h | 5 +- .../advancedviewplugin/advanvedviewdialog.cpp | 18 +++++ .../advancedviewplugin/advanvedviewdialog.h | 23 ++++++ .../advancedviewplugin/advanvedviewdialog.ui | 71 +++++++++++++++++++ zeiterfassunglib/mainwindow.cpp | 2 +- zeiterfassunglib/stripswidget.cpp | 36 +++++----- zeiterfassunglib/stripswidget.h | 19 ++--- 9 files changed, 158 insertions(+), 40 deletions(-) create mode 100644 plugins/advancedviewplugin/advanvedviewdialog.cpp create mode 100644 plugins/advancedviewplugin/advanvedviewdialog.h create mode 100644 plugins/advancedviewplugin/advanvedviewdialog.ui diff --git a/plugins/advancedviewplugin/advancedviewplugin.pro b/plugins/advancedviewplugin/advancedviewplugin.pro index 3a3116b..348a6bc 100644 --- a/plugins/advancedviewplugin/advancedviewplugin.pro +++ b/plugins/advancedviewplugin/advancedviewplugin.pro @@ -15,15 +15,16 @@ DEPENDPATH += $$PWD/../../zeiterfassunglib DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT HEADERS += advancedviewplugin.h \ - advancedviewwidget.h + advancedviewwidget.h \ + advanvedviewdialog.h SOURCES += advancedviewplugin.cpp \ - advancedviewwidget.cpp + advancedviewwidget.cpp \ + advanvedviewdialog.cpp -FORMS += +FORMS += advanvedviewdialog.ui -RESOURCES += \ - advancedviewplugin_resources.qrc +RESOURCES += advancedviewplugin_resources.qrc TRANSLATIONS += diff --git a/plugins/advancedviewplugin/advancedviewwidget.cpp b/plugins/advancedviewplugin/advancedviewwidget.cpp index aab7f36..a48699c 100644 --- a/plugins/advancedviewplugin/advancedviewwidget.cpp +++ b/plugins/advancedviewplugin/advancedviewwidget.cpp @@ -3,18 +3,27 @@ #include #include "stripswidget.h" +#include "advanvedviewdialog.h" AdvancedViewWidget::AdvancedViewWidget(StripsWidget &stripsWidget) : - QToolButton(&stripsWidget), + QPushButton(&stripsWidget), m_stripsWidget(stripsWidget) { setIcon(QIcon(QStringLiteral(":/zeiterfassunglib/plugins/advancedviewplugin/images/advanced-view.png"))); - setText(tr("Advanced view")); + connect(&stripsWidget, &StripsWidget::dateChanged, this, &AdvancedViewWidget::dateChanged); dateChanged(stripsWidget.date()); + + connect(this, &QAbstractButton::pressed, this, &AdvancedViewWidget::pressedSlot); } void AdvancedViewWidget::dateChanged(const QDate &date) { setEnabled(date.isValid()); } + +void AdvancedViewWidget::pressedSlot() +{ + AdvanvedViewDialog dialog(m_stripsWidget); + dialog.exec(); +} diff --git a/plugins/advancedviewplugin/advancedviewwidget.h b/plugins/advancedviewplugin/advancedviewwidget.h index b1c33bc..cb3bcd9 100644 --- a/plugins/advancedviewplugin/advancedviewwidget.h +++ b/plugins/advancedviewplugin/advancedviewwidget.h @@ -1,11 +1,11 @@ #ifndef ADVANCEDVIEWWIDGET_H #define ADVANCEDVIEWWIDGET_H -#include +#include class StripsWidget; -class AdvancedViewWidget : public QToolButton +class AdvancedViewWidget : public QPushButton { Q_OBJECT @@ -14,6 +14,7 @@ public: private Q_SLOTS: void dateChanged(const QDate &date); + void pressedSlot(); private: StripsWidget &m_stripsWidget; diff --git a/plugins/advancedviewplugin/advanvedviewdialog.cpp b/plugins/advancedviewplugin/advanvedviewdialog.cpp new file mode 100644 index 0000000..93a8a16 --- /dev/null +++ b/plugins/advancedviewplugin/advanvedviewdialog.cpp @@ -0,0 +1,18 @@ +#include "advanvedviewdialog.h" +#include "ui_advanvedviewdialog.h" + +#include "stripswidget.h" +#include "mainwindow.h" + +AdvanvedViewDialog::AdvanvedViewDialog(StripsWidget &stripsWidget) : + QDialog(&stripsWidget.mainWindow()), + ui(new Ui::AdvanvedViewDialog), + m_stripsWidget(stripsWidget) +{ + ui->setupUi(this); +} + +AdvanvedViewDialog::~AdvanvedViewDialog() +{ + delete ui; +} diff --git a/plugins/advancedviewplugin/advanvedviewdialog.h b/plugins/advancedviewplugin/advanvedviewdialog.h new file mode 100644 index 0000000..deba798 --- /dev/null +++ b/plugins/advancedviewplugin/advanvedviewdialog.h @@ -0,0 +1,23 @@ +#ifndef ADVANVEDVIEWDIALOG_H +#define ADVANVEDVIEWDIALOG_H + +#include + +class StripsWidget; +namespace Ui { class AdvanvedViewDialog; } + +class AdvanvedViewDialog : public QDialog +{ + Q_OBJECT + +public: + explicit AdvanvedViewDialog(StripsWidget &stripsWidget); + ~AdvanvedViewDialog(); + +private: + Ui::AdvanvedViewDialog *ui; + + StripsWidget &m_stripsWidget; +}; + +#endif // ADVANVEDVIEWDIALOG_H diff --git a/plugins/advancedviewplugin/advanvedviewdialog.ui b/plugins/advancedviewplugin/advanvedviewdialog.ui new file mode 100644 index 0000000..fc814f5 --- /dev/null +++ b/plugins/advancedviewplugin/advanvedviewdialog.ui @@ -0,0 +1,71 @@ + + + + + AdvanvedViewDialog + + + + 0 + 0 + 400 + 300 + + + + Dialog + + + + + 30 + 240 + 341 + 32 + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + buttonBox + accepted() + AdvanvedViewDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + AdvanvedViewDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/zeiterfassunglib/mainwindow.cpp b/zeiterfassunglib/mainwindow.cpp index 0c6e72a..87eeb07 100644 --- a/zeiterfassunglib/mainwindow.cpp +++ b/zeiterfassunglib/mainwindow.cpp @@ -55,7 +55,7 @@ MainWindow::MainWindow(ZeiterfassungSettings &settings, ZeiterfassungApi &erfass for(quint8 i = 0; i < 7; i++) { - m_stripsWidgets[i] = new StripsWidget(m_erfassung, m_userInfo.userId, m_stripFactory, m_projects, ui->widgetWeek); + m_stripsWidgets[i] = new StripsWidget(*this); connect(m_stripsWidgets[i], &StripsWidget::refreshingChanged, this, &MainWindow::refreshingChanged); ui->layoutWeek->addWidget(m_stripsWidgets[i]); } diff --git a/zeiterfassunglib/stripswidget.cpp b/zeiterfassunglib/stripswidget.cpp index b0bd6fe..1896485 100644 --- a/zeiterfassunglib/stripswidget.cpp +++ b/zeiterfassunglib/stripswidget.cpp @@ -7,24 +7,19 @@ #include #include +#include "mainwindow.h" #include "zeiterfassungapi.h" #include "timeutils.h" #include "stripfactory.h" -StripsWidget::StripsWidget(ZeiterfassungApi &erfassung, int userId, StripFactory &stripFactory, - const QMap &projects, QWidget *parent) : - QWidget(parent), - m_erfassung(erfassung), - m_userId(userId), - m_stripFactory(stripFactory), - m_projects(projects), +StripsWidget::StripsWidget(MainWindow &mainWindow) : + QWidget(&mainWindow), + m_mainWindow(mainWindow), m_refreshing(false), m_refreshingBookings(false), m_refreshingTimeAssignments(false), m_startEnabled(false), - m_endEnabled(false), - m_getBookingsReply(Q_NULLPTR), - m_getTimeAssignmentsReply(Q_NULLPTR) + m_endEnabled(false) { auto layout = new QVBoxLayout(this); @@ -46,6 +41,11 @@ StripsWidget::StripsWidget(ZeiterfassungApi &erfassung, int userId, StripFactory setLayout(layout); } +MainWindow &StripsWidget::mainWindow() const +{ + return m_mainWindow; +} + QBoxLayout *StripsWidget::headerLayout() const { return m_headerLayout; @@ -166,7 +166,7 @@ void StripsWidget::refreshBookings() invalidateValues(); - m_getBookingsReply = m_erfassung.doGetBookings(m_userId, m_date, m_date); + m_getBookingsReply = m_mainWindow.erfassung().doGetBookings(m_mainWindow.userInfo().userId, m_date, m_date); connect(m_getBookingsReply.get(), &ZeiterfassungReply::finished, this, &StripsWidget::getBookingsFinished); } @@ -192,7 +192,7 @@ void StripsWidget::refreshTimeAssignments() invalidateValues(); - m_getTimeAssignmentsReply = m_erfassung.doGetTimeAssignments(m_userId, m_date, m_date); + m_getTimeAssignmentsReply = m_mainWindow.erfassung().doGetTimeAssignments(m_mainWindow.userInfo().userId, m_date, m_date); connect(m_getTimeAssignmentsReply.get(), &ZeiterfassungReply::finished, this, &StripsWidget::getTimeAssignmentsFinished); } @@ -532,10 +532,10 @@ void StripsWidget::invalidateValues() Q_EMIT endEnabledChanged(m_endEnabled = false); } -QString StripsWidget::buildProjectString(const QString &project) +QString StripsWidget::buildProjectString(const QString &project) const { - if(m_projects.contains(project)) - return m_projects.value(project) % "\n" % project; + if(m_mainWindow.projects().contains(project)) + return m_mainWindow.projects().value(project) % "\n" % project; else { qWarning() << "could not find project" << project; @@ -545,7 +545,7 @@ QString StripsWidget::buildProjectString(const QString &project) QWidget *StripsWidget::appendBookingStartStrip(int id, const QTime &time) { - auto widget = m_stripFactory.createBookingStartStrip(this).release(); + auto widget = m_mainWindow.stripFactory().createBookingStartStrip(this).release(); if(auto labelTime = widget->findChild(QStringLiteral("labelTime"))) labelTime->setProperty("text", time.toString(tr("HH:mm"))); @@ -564,7 +564,7 @@ QWidget *StripsWidget::appendBookingStartStrip(int id, const QTime &time) QWidget *StripsWidget::appendBookingEndStrip(int id, const QTime &time) { - auto widget = m_stripFactory.createBookingEndStrip(this).release(); + auto widget = m_mainWindow.stripFactory().createBookingEndStrip(this).release(); if(auto labelTime = widget->findChild(QStringLiteral("labelTime"))) labelTime->setProperty("text", time.toString(tr("HH:mm"))); @@ -583,7 +583,7 @@ QWidget *StripsWidget::appendBookingEndStrip(int id, const QTime &time) QWidget *StripsWidget::appendTimeAssignmentStrip(int id, const QTime &duration, const QString &project, const QString &subproject, const QString &workpackage, const QString &text) { - auto widget = m_stripFactory.createTimeAssignmentStrip(this).release(); + auto widget = m_mainWindow.stripFactory().createTimeAssignmentStrip(this).release(); if(auto labelTime = widget->findChild(QStringLiteral("labelTime"))) labelTime->setProperty("text", duration == QTime(0, 0) ? tr("Open") : duration.toString(tr("HH:mm"))); diff --git a/zeiterfassunglib/stripswidget.h b/zeiterfassunglib/stripswidget.h index 26ffc14..3cc1a8c 100644 --- a/zeiterfassunglib/stripswidget.h +++ b/zeiterfassunglib/stripswidget.h @@ -12,19 +12,18 @@ class QBoxLayout; class QLabel; -template class QMap; template class QVector; -class ZeiterfassungApi; -class StripFactory; +class MainWindow; class ZEITERFASSUNGLIBSHARED_EXPORT StripsWidget : public QWidget { Q_OBJECT public: - explicit StripsWidget(ZeiterfassungApi &erfassung, int userId, StripFactory &stripFactory, - const QMap &projects, QWidget *parent = Q_NULLPTR); + explicit StripsWidget(MainWindow &mainWindow); + + MainWindow &mainWindow() const; QBoxLayout *headerLayout() const; QBoxLayout *stripsLayout() const; @@ -72,19 +71,15 @@ private Q_SLOTS: void getTimeAssignmentsFinished(); private: - void invalidateValues(); - - QString buildProjectString(const QString &project); + void invalidateValues(); + QString buildProjectString(const QString &project) const; QWidget *appendBookingStartStrip(int id, const QTime &time); QWidget *appendBookingEndStrip(int id, const QTime &time); QWidget *appendTimeAssignmentStrip(int id, const QTime &duration, const QString &project, const QString &subproject, const QString &workpackage, const QString &text); - ZeiterfassungApi &m_erfassung; - int m_userId; - StripFactory &m_stripFactory; - const QMap &m_projects; + MainWindow &m_mainWindow; QBoxLayout *m_headerLayout; QBoxLayout *m_stripsLayout; -- 2.50.1 From 36cf0794033a8df8262a2638b44e7a69a64d9c61 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Mon, 18 Dec 2017 20:54:40 +0100 Subject: [PATCH 08/11] Added views to dialog --- .../advancedviewplugin/advanvedviewdialog.ui | 48 ++++++++++--------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/plugins/advancedviewplugin/advanvedviewdialog.ui b/plugins/advancedviewplugin/advanvedviewdialog.ui index fc814f5..bf1934a 100644 --- a/plugins/advancedviewplugin/advanvedviewdialog.ui +++ b/plugins/advancedviewplugin/advanvedviewdialog.ui @@ -1,38 +1,40 @@ + - - - AdvanvedViewDialog 0 0 - 400 - 300 + 640 + 480 - Dialog + Advanced view - - - - 30 - 240 - 341 - 32 - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - + + + + + Qt::Vertical + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Close + + + + - -- 2.50.1 From 1be335a98f0eb06504b0a37901eb15b4670c595a Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Mon, 18 Dec 2017 20:58:43 +0100 Subject: [PATCH 09/11] Added custom view widget classes --- .../advancedviewplugin/advancedviewplugin.pro | 8 ++++++-- plugins/advancedviewplugin/advanvedviewdialog.ui | 16 ++++++++++++++-- .../advancedviewplugin/views/bookingsview.cpp | 7 +++++++ plugins/advancedviewplugin/views/bookingsview.h | 14 ++++++++++++++ .../views/timeassignmentsview.cpp | 7 +++++++ .../views/timeassignmentsview.h | 14 ++++++++++++++ 6 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 plugins/advancedviewplugin/views/bookingsview.cpp create mode 100644 plugins/advancedviewplugin/views/bookingsview.h create mode 100644 plugins/advancedviewplugin/views/timeassignmentsview.cpp create mode 100644 plugins/advancedviewplugin/views/timeassignmentsview.h diff --git a/plugins/advancedviewplugin/advancedviewplugin.pro b/plugins/advancedviewplugin/advancedviewplugin.pro index 348a6bc..7e2e846 100644 --- a/plugins/advancedviewplugin/advancedviewplugin.pro +++ b/plugins/advancedviewplugin/advancedviewplugin.pro @@ -16,11 +16,15 @@ DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSA HEADERS += advancedviewplugin.h \ advancedviewwidget.h \ - advanvedviewdialog.h + advanvedviewdialog.h \ + views/bookingsview.h \ + views/timeassignmentsview.h SOURCES += advancedviewplugin.cpp \ advancedviewwidget.cpp \ - advanvedviewdialog.cpp + advanvedviewdialog.cpp \ + views/bookingsview.cpp \ + views/timeassignmentsview.cpp FORMS += advanvedviewdialog.ui diff --git a/plugins/advancedviewplugin/advanvedviewdialog.ui b/plugins/advancedviewplugin/advanvedviewdialog.ui index bf1934a..da2fe7c 100644 --- a/plugins/advancedviewplugin/advanvedviewdialog.ui +++ b/plugins/advancedviewplugin/advanvedviewdialog.ui @@ -19,8 +19,8 @@ Qt::Vertical - - + + @@ -35,6 +35,18 @@ + + + BookingsView + QTreeView +
views/bookingsview.h
+
+ + TimeAssignmentsView + QTreeView +
views/timeassignmentsview.h
+
+
diff --git a/plugins/advancedviewplugin/views/bookingsview.cpp b/plugins/advancedviewplugin/views/bookingsview.cpp new file mode 100644 index 0000000..07e5b0f --- /dev/null +++ b/plugins/advancedviewplugin/views/bookingsview.cpp @@ -0,0 +1,7 @@ +#include "bookingsview.h" + +BookingsView::BookingsView(QWidget *parent) : + QTreeView(parent) +{ + +} diff --git a/plugins/advancedviewplugin/views/bookingsview.h b/plugins/advancedviewplugin/views/bookingsview.h new file mode 100644 index 0000000..97966f3 --- /dev/null +++ b/plugins/advancedviewplugin/views/bookingsview.h @@ -0,0 +1,14 @@ +#ifndef BOOKINGSVIEW_H +#define BOOKINGSVIEW_H + +#include + +class BookingsView : public QTreeView +{ + Q_OBJECT + +public: + explicit BookingsView(QWidget *parent = Q_NULLPTR); +}; + +#endif // BOOKINGSVIEW_H diff --git a/plugins/advancedviewplugin/views/timeassignmentsview.cpp b/plugins/advancedviewplugin/views/timeassignmentsview.cpp new file mode 100644 index 0000000..4d862c5 --- /dev/null +++ b/plugins/advancedviewplugin/views/timeassignmentsview.cpp @@ -0,0 +1,7 @@ +#include "timeassignmentsview.h" + +TimeAssignmentsView::TimeAssignmentsView(QWidget *parent) : + QTreeView(parent) +{ + +} diff --git a/plugins/advancedviewplugin/views/timeassignmentsview.h b/plugins/advancedviewplugin/views/timeassignmentsview.h new file mode 100644 index 0000000..3064a33 --- /dev/null +++ b/plugins/advancedviewplugin/views/timeassignmentsview.h @@ -0,0 +1,14 @@ +#ifndef TIMEASSIGNMENTSVIEW_H +#define TIMEASSIGNMENTSVIEW_H + +#include + +class TimeAssignmentsView : public QTreeView +{ + Q_OBJECT + +public: + explicit TimeAssignmentsView(QWidget *parent = 0); +}; + +#endif // TIMEASSIGNMENTSVIEW_H -- 2.50.1 From a456318a065f48c5ffe9aa65d18218a25e2d4cdb Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Mon, 18 Dec 2017 21:41:39 +0100 Subject: [PATCH 10/11] Moved advanced view code into plugin --- .../advancedviewplugin/advancedviewplugin.pro | 24 +- .../advancedviewplugin/advanvedviewdialog.cpp | 275 +++++++++++++++++- .../advancedviewplugin/advanvedviewdialog.h | 11 +- .../advancedviewplugin/advanvedviewdialog.ui | 24 +- .../dialogs/bookingdialog.cpp | 0 .../dialogs/bookingdialog.h | 0 .../dialogs/bookingdialog.ui | 0 .../dialogs/timeassignmentdialog.cpp | 0 .../dialogs/timeassignmentdialog.h | 0 .../dialogs/timeassignmentdialog.ui | 0 .../models/bookingsmodel.cpp | 88 ++++++ .../models/bookingsmodel.h | 11 +- .../models/timeassignmentsmodel.cpp | 92 ++++++ .../models/timeassignmentsmodel.h | 9 +- .../advancedviewplugin/views/bookingsview.cpp | 7 - .../advancedviewplugin/views/bookingsview.h | 14 - .../views/timeassignmentsview.cpp | 7 - .../views/timeassignmentsview.h | 14 - zeiterfassunglib/mainwindow.cpp | 244 +--------------- zeiterfassunglib/mainwindow.h | 2 - zeiterfassunglib/mainwindow.ui | 80 ++--- zeiterfassunglib/models/bookingsmodel.cpp | 123 -------- .../models/timeassignmentsmodel.cpp | 127 -------- zeiterfassunglib/stripswidget.cpp | 4 +- zeiterfassunglib/stripswidget.h | 2 +- zeiterfassunglib/zeiterfassunglib.pro | 16 +- 26 files changed, 521 insertions(+), 653 deletions(-) rename {zeiterfassunglib => plugins/advancedviewplugin}/dialogs/bookingdialog.cpp (100%) rename {zeiterfassunglib => plugins/advancedviewplugin}/dialogs/bookingdialog.h (100%) rename {zeiterfassunglib => plugins/advancedviewplugin}/dialogs/bookingdialog.ui (100%) rename {zeiterfassunglib => plugins/advancedviewplugin}/dialogs/timeassignmentdialog.cpp (100%) rename {zeiterfassunglib => plugins/advancedviewplugin}/dialogs/timeassignmentdialog.h (100%) rename {zeiterfassunglib => plugins/advancedviewplugin}/dialogs/timeassignmentdialog.ui (100%) create mode 100644 plugins/advancedviewplugin/models/bookingsmodel.cpp rename {zeiterfassunglib => plugins/advancedviewplugin}/models/bookingsmodel.h (67%) create mode 100644 plugins/advancedviewplugin/models/timeassignmentsmodel.cpp rename {zeiterfassunglib => plugins/advancedviewplugin}/models/timeassignmentsmodel.h (75%) delete mode 100644 plugins/advancedviewplugin/views/bookingsview.cpp delete mode 100644 plugins/advancedviewplugin/views/bookingsview.h delete mode 100644 plugins/advancedviewplugin/views/timeassignmentsview.cpp delete mode 100644 plugins/advancedviewplugin/views/timeassignmentsview.h delete mode 100644 zeiterfassunglib/models/bookingsmodel.cpp delete mode 100644 zeiterfassunglib/models/timeassignmentsmodel.cpp diff --git a/plugins/advancedviewplugin/advancedviewplugin.pro b/plugins/advancedviewplugin/advancedviewplugin.pro index 7e2e846..a4436d6 100644 --- a/plugins/advancedviewplugin/advancedviewplugin.pro +++ b/plugins/advancedviewplugin/advancedviewplugin.pro @@ -14,19 +14,25 @@ DEPENDPATH += $$PWD/../../zeiterfassunglib DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT -HEADERS += advancedviewplugin.h \ +HEADERS += advanvedviewdialog.h \ + advancedviewplugin.h \ advancedviewwidget.h \ - advanvedviewdialog.h \ - views/bookingsview.h \ - views/timeassignmentsview.h + dialogs/bookingdialog.h \ + dialogs/timeassignmentdialog.h \ + models/bookingsmodel.h \ + models/timeassignmentsmodel.h -SOURCES += advancedviewplugin.cpp \ +SOURCES += advanvedviewdialog.cpp \ + advancedviewplugin.cpp \ advancedviewwidget.cpp \ - advanvedviewdialog.cpp \ - views/bookingsview.cpp \ - views/timeassignmentsview.cpp + dialogs/bookingdialog.cpp \ + dialogs/timeassignmentdialog.cpp \ + models/bookingsmodel.cpp \ + models/timeassignmentsmodel.cpp -FORMS += advanvedviewdialog.ui +FORMS += advanvedviewdialog.ui \ + dialogs/bookingdialog.ui \ + dialogs/timeassignmentdialog.ui RESOURCES += advancedviewplugin_resources.qrc diff --git a/plugins/advancedviewplugin/advanvedviewdialog.cpp b/plugins/advancedviewplugin/advanvedviewdialog.cpp index 93a8a16..fb56af4 100644 --- a/plugins/advancedviewplugin/advanvedviewdialog.cpp +++ b/plugins/advancedviewplugin/advanvedviewdialog.cpp @@ -1,18 +1,291 @@ #include "advanvedviewdialog.h" #include "ui_advanvedviewdialog.h" +#include +#include +#include +#include +#include + +#include "replies/createbookingreply.h" +#include "replies/updatebookingreply.h" +#include "replies/deletebookingreply.h" +#include "replies/createtimeassignmentreply.h" +#include "replies/updatetimeassignmentreply.h" +#include "replies/deletetimeassignmentreply.h" + #include "stripswidget.h" #include "mainwindow.h" +#include "timeutils.h" +#include "dialogs/bookingdialog.h" +#include "dialogs/timeassignmentdialog.h" +#include "models/bookingsmodel.h" +#include "models/timeassignmentsmodel.h" AdvanvedViewDialog::AdvanvedViewDialog(StripsWidget &stripsWidget) : QDialog(&stripsWidget.mainWindow()), ui(new Ui::AdvanvedViewDialog), - m_stripsWidget(stripsWidget) + m_stripsWidget(stripsWidget), + m_bookingsModel(new BookingsModel(stripsWidget, this)), + m_timeAssignmentsModel(new TimeAssignmentsModel(stripsWidget, this)) { ui->setupUi(this); + + ui->bookingsView->setModel(m_bookingsModel); + connect(m_bookingsModel, &BookingsModel::enabledChanged, ui->bookingsView, &QWidget::setEnabled); + connect(ui->bookingsView, &QWidget::customContextMenuRequested, this, &AdvanvedViewDialog::contextMenuBooking); + + ui->timeAssignmentsView->setModel(m_timeAssignmentsModel); + connect(m_timeAssignmentsModel, &TimeAssignmentsModel::enabledChanged, ui->timeAssignmentsView, &QWidget::setEnabled); + connect(ui->timeAssignmentsView, &QWidget::customContextMenuRequested, this, &AdvanvedViewDialog::contextMenuTimeAssignment); } AdvanvedViewDialog::~AdvanvedViewDialog() { delete ui; } + +void AdvanvedViewDialog::contextMenuBooking(const QPoint &pos) +{ + auto index = ui->bookingsView->indexAt(pos); + + if(!index.isValid()) + { + QMenu menu; + auto createAction = menu.addAction(tr("Create booking")); + auto refreshAction = menu.addAction(QIcon(QPixmap(QStringLiteral(":/zeiterfassunglib/images/refresh.png"))), tr("Refresh bookings")); + auto selectedAction = menu.exec(ui->bookingsView->viewport()->mapToGlobal(pos)); + if(selectedAction == createAction) + { + BookingDialog dialog(this); + dialog.setTime(timeNormalise(QTime::currentTime())); + again2: + if(dialog.exec() == QDialog::Accepted) + { + auto reply = m_stripsWidget.mainWindow().erfassung().doCreateBooking( + m_stripsWidget.mainWindow().userInfo().userId, + m_stripsWidget.date(), + dialog.getTime(), + dialog.getTimespan(), + dialog.getType(), + dialog.getText() + ); + + { + QEventLoop eventLoop; + connect(reply.get(), &ZeiterfassungReply::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + } + + if(reply->success()) + { + m_stripsWidget.refreshBookings(); + } + else + { + QMessageBox::warning(this, tr("Could not create booking!"), tr("Could not create booking!") % "\n\n" % reply->message()); + goto again2; + } + } + } + else if(selectedAction == refreshAction) + { + m_stripsWidget.refreshBookings(); + } + } + else + { + auto booking = m_stripsWidget.bookings().at(index.row()); + + QMenu menu; + auto editAction = menu.addAction(tr("Edit booking")); + auto deleteAction = menu.addAction(tr("Delete booking")); + auto selectedAction = menu.exec(ui->bookingsView->viewport()->mapToGlobal(pos)); + if(selectedAction == editAction) + { + BookingDialog dialog(this); + dialog.setTime(booking.time); + dialog.setTimespan(booking.timespan); + dialog.setType(booking.type); + dialog.setText(booking.text); + again1: + if(dialog.exec() == QDialog::Accepted) + { + auto reply = m_stripsWidget.mainWindow().erfassung().doUpdateBooking( + booking.id, + m_stripsWidget.mainWindow().userInfo().userId, + m_stripsWidget.date(), + dialog.getTime(), + dialog.getTimespan(), + dialog.getType(), + dialog.getText() + ); + + { + QEventLoop eventLoop; + connect(reply.get(), &ZeiterfassungReply::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + } + + if(reply->success()) + { + m_stripsWidget.refreshBookings(); + } + else + { + QMessageBox::warning(this, tr("Could not edit booking!"), tr("Could not edit booking!") % "\n\n" % reply->message()); + goto again1; + } + } + } + else if(selectedAction == deleteAction) + { + QMessageBox msgBox; + msgBox.setText(tr("Do you really want to delete the booking?")); + msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel); + msgBox.setDefaultButton(QMessageBox::Cancel); + if(msgBox.exec() == QMessageBox::Yes) + { + auto reply = m_stripsWidget.mainWindow().erfassung().doDeleteBooking(booking.id); + + { + QEventLoop eventLoop; + connect(reply.get(), &ZeiterfassungReply::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + } + + if(reply->success()) + m_stripsWidget.refreshBookings(); + else + QMessageBox::warning(this, tr("Could not delete booking!"), tr("Could not delete booking!") % "\n\n" % reply->message()); + } + } + } +} + +void AdvanvedViewDialog::contextMenuTimeAssignment(const QPoint &pos) +{ + auto index = ui->timeAssignmentsView->indexAt(pos); + + if(!index.isValid()) + { + QMenu menu; + auto createAction = menu.addAction(tr("Create time assignment")); + auto refreshAction = menu.addAction(QIcon(QPixmap(QStringLiteral(":/zeiterfassunglib/images/refresh.png"))), tr("Refresh time assignments")); + auto selectedAction = menu.exec(ui->timeAssignmentsView->viewport()->mapToGlobal(pos)); + if(selectedAction == createAction) + { + TimeAssignmentDialog dialog(m_stripsWidget.mainWindow().projects(), + m_stripsWidget.mainWindow().settings(), this); + again2: + if(dialog.exec() == QDialog::Accepted) + { + auto reply = m_stripsWidget.mainWindow().erfassung().doCreateTimeAssignment( + m_stripsWidget.mainWindow().userInfo().userId, + m_stripsWidget.date(), + dialog.getTime(), + dialog.getTimespan(), + dialog.getProject(), + dialog.getSubproject(), + dialog.getWorkpackage(), + dialog.getText() + ); + + { + QEventLoop eventLoop; + connect(reply.get(), &ZeiterfassungReply::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + } + + if(reply->success()) + { + m_stripsWidget.refreshTimeAssignments(); + } + else + { + QMessageBox::warning(this, tr("Could not create time assignment!"), tr("Could not create time assignment!") % "\n\n" % reply->message()); + goto again2; + } + } + } + else if(selectedAction == refreshAction) + { + m_stripsWidget.refreshTimeAssignments(); + } + } + else + { + auto timeAssignment = m_stripsWidget.timeAssignments().at(index.row()); + + QMenu menu; + auto editAction = menu.addAction(tr("Edit time assignment")); + auto deleteAction = menu.addAction(tr("Delete time assignment")); + auto selectedAction = menu.exec(ui->timeAssignmentsView->viewport()->mapToGlobal(pos)); + if(selectedAction == editAction) + { + TimeAssignmentDialog dialog(m_stripsWidget.mainWindow().projects(), + m_stripsWidget.mainWindow().settings(), this); + dialog.setTime(timeAssignment.time); + dialog.setTimespan(timeAssignment.timespan); + dialog.setProject(timeAssignment.project); + dialog.setSubproject(timeAssignment.subproject); + dialog.setWorkpackage(timeAssignment.workpackage); + dialog.setText(timeAssignment.text); + again1: + if(dialog.exec() == QDialog::Accepted) + { + auto reply = m_stripsWidget.mainWindow().erfassung().doUpdateTimeAssignment( + timeAssignment.id, + m_stripsWidget.mainWindow().userInfo().userId, + m_stripsWidget.date(), + dialog.getTime(), + dialog.getTimespan(), + dialog.getProject(), + dialog.getSubproject(), + dialog.getWorkpackage(), + dialog.getText() + ); + + { + QEventLoop eventLoop; + connect(reply.get(), &ZeiterfassungReply::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + } + + if(reply->success()) + { + m_stripsWidget.refreshTimeAssignments(); + } + else + { + QMessageBox::warning(this, tr("Could not edit time assignment!"), tr("Could not edit time assignment!") % "\n\n" % reply->message()); + goto again1; + } + } + } + else if(selectedAction == deleteAction) + { + QMessageBox msgBox; + msgBox.setText(tr("Do you really want to delete the time assignment?")); + msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel); + msgBox.setDefaultButton(QMessageBox::Cancel); + if(msgBox.exec() == QMessageBox::Yes) + { + auto reply = m_stripsWidget.mainWindow().erfassung().doDeleteTimeAssignment(timeAssignment.id); + + { + QEventLoop eventLoop; + connect(reply.get(), &ZeiterfassungReply::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + } + + if(reply->success()) + { + m_stripsWidget.refreshTimeAssignments(); + } + else + QMessageBox::warning(this, tr("Could not delete time assignment!"), tr("Could not delete time assignment!") % "\n\n" % reply->message()); + } + } + } +} diff --git a/plugins/advancedviewplugin/advanvedviewdialog.h b/plugins/advancedviewplugin/advanvedviewdialog.h index deba798..4423716 100644 --- a/plugins/advancedviewplugin/advanvedviewdialog.h +++ b/plugins/advancedviewplugin/advanvedviewdialog.h @@ -3,8 +3,10 @@ #include -class StripsWidget; namespace Ui { class AdvanvedViewDialog; } +class StripsWidget; +class BookingsModel; +class TimeAssignmentsModel; class AdvanvedViewDialog : public QDialog { @@ -14,10 +16,17 @@ public: explicit AdvanvedViewDialog(StripsWidget &stripsWidget); ~AdvanvedViewDialog(); +private Q_SLOTS: + void contextMenuBooking(const QPoint &pos); + void contextMenuTimeAssignment(const QPoint &pos); + private: Ui::AdvanvedViewDialog *ui; StripsWidget &m_stripsWidget; + + BookingsModel *m_bookingsModel; + TimeAssignmentsModel *m_timeAssignmentsModel; }; #endif // ADVANVEDVIEWDIALOG_H diff --git a/plugins/advancedviewplugin/advanvedviewdialog.ui b/plugins/advancedviewplugin/advanvedviewdialog.ui index da2fe7c..9418d8e 100644 --- a/plugins/advancedviewplugin/advanvedviewdialog.ui +++ b/plugins/advancedviewplugin/advanvedviewdialog.ui @@ -19,8 +19,16 @@ Qt::Vertical - - + + + Qt::CustomContextMenu + + + + + Qt::CustomContextMenu + + @@ -35,18 +43,6 @@ - - - BookingsView - QTreeView -
views/bookingsview.h
-
- - TimeAssignmentsView - QTreeView -
views/timeassignmentsview.h
-
-
diff --git a/zeiterfassunglib/dialogs/bookingdialog.cpp b/plugins/advancedviewplugin/dialogs/bookingdialog.cpp similarity index 100% rename from zeiterfassunglib/dialogs/bookingdialog.cpp rename to plugins/advancedviewplugin/dialogs/bookingdialog.cpp diff --git a/zeiterfassunglib/dialogs/bookingdialog.h b/plugins/advancedviewplugin/dialogs/bookingdialog.h similarity index 100% rename from zeiterfassunglib/dialogs/bookingdialog.h rename to plugins/advancedviewplugin/dialogs/bookingdialog.h diff --git a/zeiterfassunglib/dialogs/bookingdialog.ui b/plugins/advancedviewplugin/dialogs/bookingdialog.ui similarity index 100% rename from zeiterfassunglib/dialogs/bookingdialog.ui rename to plugins/advancedviewplugin/dialogs/bookingdialog.ui diff --git a/zeiterfassunglib/dialogs/timeassignmentdialog.cpp b/plugins/advancedviewplugin/dialogs/timeassignmentdialog.cpp similarity index 100% rename from zeiterfassunglib/dialogs/timeassignmentdialog.cpp rename to plugins/advancedviewplugin/dialogs/timeassignmentdialog.cpp diff --git a/zeiterfassunglib/dialogs/timeassignmentdialog.h b/plugins/advancedviewplugin/dialogs/timeassignmentdialog.h similarity index 100% rename from zeiterfassunglib/dialogs/timeassignmentdialog.h rename to plugins/advancedviewplugin/dialogs/timeassignmentdialog.h diff --git a/zeiterfassunglib/dialogs/timeassignmentdialog.ui b/plugins/advancedviewplugin/dialogs/timeassignmentdialog.ui similarity index 100% rename from zeiterfassunglib/dialogs/timeassignmentdialog.ui rename to plugins/advancedviewplugin/dialogs/timeassignmentdialog.ui diff --git a/plugins/advancedviewplugin/models/bookingsmodel.cpp b/plugins/advancedviewplugin/models/bookingsmodel.cpp new file mode 100644 index 0000000..15a4896 --- /dev/null +++ b/plugins/advancedviewplugin/models/bookingsmodel.cpp @@ -0,0 +1,88 @@ +#include "bookingsmodel.h" + +#include "stripswidget.h" + +BookingsModel::BookingsModel(StripsWidget &stripsWidget, QObject *parent) : + QAbstractListModel(parent), + m_stripsWidget(stripsWidget) +{ + connect(&stripsWidget, &StripsWidget::bookingsChanged, this, &BookingsModel::bookingsChanged); + connect(&stripsWidget, &StripsWidget::refreshingBookingsChanged, this, &BookingsModel::enabledChanged); +} + +StripsWidget &BookingsModel::stripsWidget() const +{ + return m_stripsWidget; +} + +bool BookingsModel::enabled() const +{ + return !m_stripsWidget.refreshingBookings(); +} + +int BookingsModel::rowCount(const QModelIndex &parent) const +{ + Q_UNUSED(parent) + + return m_stripsWidget.bookings().count(); +} + +int BookingsModel::columnCount(const QModelIndex &parent) const +{ + Q_UNUSED(parent) + + return 5; +} + +QVariant BookingsModel::data(const QModelIndex &index, int role) const +{ + Q_ASSERT(index.row() < m_stripsWidget.bookings().count()); + const auto &booking = m_stripsWidget.bookings().at(index.row()); + + switch(role) + { + case Qt::DisplayRole: + case Qt::EditRole: + switch(index.column()) + { + case 0: return booking.id; + case 1: return booking.time; + case 2: return booking.timespan; + case 3: return booking.type; + case 4: return booking.text; + } + } + + return QVariant(); +} + +QVariant BookingsModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + switch(orientation) + { + case Qt::Horizontal: + switch(role) + { + case Qt::DisplayRole: + case Qt::EditRole: + switch(section) + { + case 0: return tr("ID"); + case 1: return tr("Time"); + case 2: return tr("Timespan"); + case 3: return tr("Type"); + case 4: return tr("Text"); + } + } + default: + qt_noop(); + } + + return QVariant(); +} + +void BookingsModel::bookingsChanged() +{ + beginResetModel(); + endResetModel(); +} diff --git a/zeiterfassunglib/models/bookingsmodel.h b/plugins/advancedviewplugin/models/bookingsmodel.h similarity index 67% rename from zeiterfassunglib/models/bookingsmodel.h rename to plugins/advancedviewplugin/models/bookingsmodel.h index c6a0e5e..0c02b3e 100644 --- a/zeiterfassunglib/models/bookingsmodel.h +++ b/plugins/advancedviewplugin/models/bookingsmodel.h @@ -12,14 +12,12 @@ class StripsWidget; class ZEITERFASSUNGLIBSHARED_EXPORT BookingsModel : public QAbstractListModel { Q_OBJECT - Q_PROPERTY(StripsWidget* stripsWidget READ stripsWidget WRITE setStripsWidget NOTIFY stripsWidgetChanged) Q_PROPERTY(bool enabled READ enabled NOTIFY enabledChanged) public: - explicit BookingsModel(QObject *parent = Q_NULLPTR); + explicit BookingsModel(StripsWidget &stripsWidget, QObject *parent = Q_NULLPTR); - StripsWidget *stripsWidget() const; - void setStripsWidget(StripsWidget *stripsWidget); + StripsWidget &stripsWidget() const; bool enabled() const; @@ -30,16 +28,13 @@ public: QVariant headerData(int section, Qt::Orientation orientation, int role) const Q_DECL_OVERRIDE; Q_SIGNALS: - void stripsWidgetChanged(StripsWidget *stripsWidget); void enabledChanged(bool enabled); private Q_SLOTS: void bookingsChanged(); - void refreshingChanged(bool refreshing); private: - StripsWidget *m_stripsWidget; - bool m_enabled; + StripsWidget &m_stripsWidget; }; #endif // BOOKINGSMODEL_H diff --git a/plugins/advancedviewplugin/models/timeassignmentsmodel.cpp b/plugins/advancedviewplugin/models/timeassignmentsmodel.cpp new file mode 100644 index 0000000..623efba --- /dev/null +++ b/plugins/advancedviewplugin/models/timeassignmentsmodel.cpp @@ -0,0 +1,92 @@ +#include "timeassignmentsmodel.h" + +#include "stripswidget.h" + +TimeAssignmentsModel::TimeAssignmentsModel(StripsWidget &stripsWidget, QObject *parent) : + QAbstractListModel(parent), + m_stripsWidget(stripsWidget) +{ + connect(&stripsWidget, &StripsWidget::timeAssignmentsChanged, this, &TimeAssignmentsModel::timeAssignmentsChanged); + connect(&stripsWidget, &StripsWidget::refreshingBookingsChanged, this, &TimeAssignmentsModel::enabledChanged); +} + +StripsWidget &TimeAssignmentsModel::stripsWidget() const +{ + return m_stripsWidget; +} + +bool TimeAssignmentsModel::enabled() const +{ + return !m_stripsWidget.refreshingTimeAssignments(); +} + +int TimeAssignmentsModel::rowCount(const QModelIndex &parent) const +{ + Q_UNUSED(parent) + + return m_stripsWidget.timeAssignments().count(); +} + +int TimeAssignmentsModel::columnCount(const QModelIndex &parent) const +{ + Q_UNUSED(parent) + + return 7; +} + +QVariant TimeAssignmentsModel::data(const QModelIndex &index, int role) const +{ + Q_ASSERT(index.row() < m_stripsWidget.timeAssignments().count()); + const auto &timeAssignment = m_stripsWidget.timeAssignments().at(index.row()); + + switch(role) + { + case Qt::DisplayRole: + case Qt::EditRole: + switch(index.column()) + { + case 0: return timeAssignment.id; + case 1: return timeAssignment.time; + case 2: return timeAssignment.timespan; + case 3: return timeAssignment.project; + case 4: return timeAssignment.subproject; + case 5: return timeAssignment.workpackage; + case 6: return timeAssignment.text; + } + } + + return QVariant(); +} + +QVariant TimeAssignmentsModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + switch(orientation) + { + case Qt::Horizontal: + switch(role) + { + case Qt::DisplayRole: + case Qt::EditRole: + switch(section) + { + case 0: return tr("ID"); + case 1: return tr("Time"); + case 2: return tr("Timespan"); + case 3: return tr("Project"); + case 4: return tr("Subproject"); + case 5: return tr("Workpackage"); + case 6: return tr("Text"); + } + } + default: + qt_noop(); + } + + return QVariant(); +} + +void TimeAssignmentsModel::timeAssignmentsChanged() +{ + beginResetModel(); + endResetModel(); +} diff --git a/zeiterfassunglib/models/timeassignmentsmodel.h b/plugins/advancedviewplugin/models/timeassignmentsmodel.h similarity index 75% rename from zeiterfassunglib/models/timeassignmentsmodel.h rename to plugins/advancedviewplugin/models/timeassignmentsmodel.h index a860a40..b4bb8f3 100644 --- a/zeiterfassunglib/models/timeassignmentsmodel.h +++ b/plugins/advancedviewplugin/models/timeassignmentsmodel.h @@ -12,14 +12,12 @@ class StripsWidget; class ZEITERFASSUNGLIBSHARED_EXPORT TimeAssignmentsModel : public QAbstractListModel { Q_OBJECT - Q_PROPERTY(StripsWidget* stripsWidget READ stripsWidget WRITE setStripsWidget NOTIFY stripsWidgetChanged) Q_PROPERTY(bool enabled READ enabled NOTIFY enabledChanged) public: - explicit TimeAssignmentsModel(QObject *parent = Q_NULLPTR); + explicit TimeAssignmentsModel(StripsWidget &stripsWidget, QObject *parent = Q_NULLPTR); - StripsWidget *stripsWidget() const; - void setStripsWidget(StripsWidget *stripsWidget); + StripsWidget &stripsWidget() const; bool enabled() const; @@ -38,8 +36,7 @@ private Q_SLOTS: void refreshingChanged(bool refreshing); private: - StripsWidget *m_stripsWidget; - bool m_enabled; + StripsWidget &m_stripsWidget; }; #endif // TIMEASSIGNMENTSMODEL_H diff --git a/plugins/advancedviewplugin/views/bookingsview.cpp b/plugins/advancedviewplugin/views/bookingsview.cpp deleted file mode 100644 index 07e5b0f..0000000 --- a/plugins/advancedviewplugin/views/bookingsview.cpp +++ /dev/null @@ -1,7 +0,0 @@ -#include "bookingsview.h" - -BookingsView::BookingsView(QWidget *parent) : - QTreeView(parent) -{ - -} diff --git a/plugins/advancedviewplugin/views/bookingsview.h b/plugins/advancedviewplugin/views/bookingsview.h deleted file mode 100644 index 97966f3..0000000 --- a/plugins/advancedviewplugin/views/bookingsview.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef BOOKINGSVIEW_H -#define BOOKINGSVIEW_H - -#include - -class BookingsView : public QTreeView -{ - Q_OBJECT - -public: - explicit BookingsView(QWidget *parent = Q_NULLPTR); -}; - -#endif // BOOKINGSVIEW_H diff --git a/plugins/advancedviewplugin/views/timeassignmentsview.cpp b/plugins/advancedviewplugin/views/timeassignmentsview.cpp deleted file mode 100644 index 4d862c5..0000000 --- a/plugins/advancedviewplugin/views/timeassignmentsview.cpp +++ /dev/null @@ -1,7 +0,0 @@ -#include "timeassignmentsview.h" - -TimeAssignmentsView::TimeAssignmentsView(QWidget *parent) : - QTreeView(parent) -{ - -} diff --git a/plugins/advancedviewplugin/views/timeassignmentsview.h b/plugins/advancedviewplugin/views/timeassignmentsview.h deleted file mode 100644 index 3064a33..0000000 --- a/plugins/advancedviewplugin/views/timeassignmentsview.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef TIMEASSIGNMENTSVIEW_H -#define TIMEASSIGNMENTSVIEW_H - -#include - -class TimeAssignmentsView : public QTreeView -{ - Q_OBJECT - -public: - explicit TimeAssignmentsView(QWidget *parent = 0); -}; - -#endif // TIMEASSIGNMENTSVIEW_H diff --git a/zeiterfassunglib/mainwindow.cpp b/zeiterfassunglib/mainwindow.cpp index 87eeb07..6c3e90d 100644 --- a/zeiterfassunglib/mainwindow.cpp +++ b/zeiterfassunglib/mainwindow.cpp @@ -21,21 +21,13 @@ #include "stripfactory.h" #include "stripswidget.h" #include "dialogs/aboutmedialog.h" -#include "dialogs/bookingdialog.h" -#include "dialogs/timeassignmentdialog.h" #include "dialogs/settingsdialog.h" #include "dialogs/updatedialog.h" -#include "models/bookingsmodel.h" -#include "models/timeassignmentsmodel.h" #include "replies/getprojectsreply.h" #include "replies/getauswertungreply.h" -#include "replies/updatebookingreply.h" -#include "replies/deletebookingreply.h" #include "replies/createbookingreply.h" -#include "replies/updatetimeassignmentreply.h" -#include "replies/deletetimeassignmentreply.h" #include "replies/createtimeassignmentreply.h" -#include "replies/createbookingreply.h" +#include "replies/updatetimeassignmentreply.h" MainWindow::MainWindow(ZeiterfassungSettings &settings, ZeiterfassungApi &erfassung, const GetUserInfoReply::UserInfo &userInfo, StripFactory &stripFactory, QWidget *parent) : @@ -47,15 +39,13 @@ MainWindow::MainWindow(ZeiterfassungSettings &settings, ZeiterfassungApi &erfass m_stripFactory(stripFactory), m_getProjectsReply(Q_NULLPTR), m_getAuswertungReply(Q_NULLPTR), - m_bookingsModel(new BookingsModel(this)), - m_timeAssignmentsModel(new TimeAssignmentsModel(this)), m_currentStripWidget(Q_NULLPTR) { ui->setupUi(this); for(quint8 i = 0; i < 7; i++) { - m_stripsWidgets[i] = new StripsWidget(*this); + m_stripsWidgets[i] = new StripsWidget(*this, ui->widgetWeek); connect(m_stripsWidgets[i], &StripsWidget::refreshingChanged, this, &MainWindow::refreshingChanged); ui->layoutWeek->addWidget(m_stripsWidgets[i]); } @@ -100,14 +90,6 @@ MainWindow::MainWindow(ZeiterfassungSettings &settings, ZeiterfassungApi &erfass connect(ui->pushButtonStart, &QAbstractButton::pressed, this, &MainWindow::pushButtonStartPressed); connect(ui->pushButtonEnd, &QAbstractButton::pressed, this, &MainWindow::pushButtonEndPressed); - ui->treeViewBookings->setModel(m_bookingsModel); - connect(m_bookingsModel, &BookingsModel::enabledChanged, ui->treeViewBookings, &QWidget::setEnabled); - connect(ui->treeViewBookings, &QWidget::customContextMenuRequested, this, &MainWindow::contextMenuBooking); - - ui->treeViewTimeAssignments->setModel(m_timeAssignmentsModel); - connect(m_timeAssignmentsModel, &TimeAssignmentsModel::enabledChanged, ui->treeViewTimeAssignments, &QWidget::setEnabled); - connect(ui->treeViewTimeAssignments, &QWidget::customContextMenuRequested, this, &MainWindow::contextMenuTimeAssignment); - ui->statusbar->addPermanentWidget(m_balanceLabel = new QLabel(ui->statusbar)); m_balanceLabel->setFrameShape(QFrame::Panel); m_balanceLabel->setFrameShadow(QFrame::Sunken); @@ -254,225 +236,6 @@ void MainWindow::getAuswertungFinished() m_getAuswertungReply = Q_NULLPTR; } -void MainWindow::contextMenuBooking(const QPoint &pos) -{ - auto index = ui->treeViewBookings->indexAt(pos); - - if(!index.isValid()) - { - QMenu menu; - auto createAction = menu.addAction(tr("Create booking")); - auto refreshAction = menu.addAction(QIcon(QPixmap(QStringLiteral(":/zeiterfassunglib/images/refresh.png"))), tr("Refresh bookings")); - auto selectedAction = menu.exec(ui->treeViewBookings->viewport()->mapToGlobal(pos)); - if(selectedAction == createAction) - { - BookingDialog dialog(this); - dialog.setTime(timeNormalise(QTime::currentTime())); - again2: - if(dialog.exec() == QDialog::Accepted) - { - auto reply = m_erfassung.doCreateBooking(m_userInfo.userId, ui->dateEditDate->date(), - dialog.getTime(), dialog.getTimespan(), - dialog.getType(), dialog.getText()); - - { - QEventLoop eventLoop; - connect(reply.get(), &ZeiterfassungReply::finished, &eventLoop, &QEventLoop::quit); - eventLoop.exec(); - } - - if(reply->success()) - { - m_currentStripWidget->refreshBookings(); - } - else - { - QMessageBox::warning(this, tr("Could not create booking!"), tr("Could not create booking!") % "\n\n" % reply->message()); - goto again2; - } - } - } - else if(selectedAction == refreshAction) - { - m_currentStripWidget->refreshBookings(); - } - } - else - { - auto booking = m_currentStripWidget->bookings().at(index.row()); - - QMenu menu; - auto editAction = menu.addAction(tr("Edit booking")); - auto deleteAction = menu.addAction(tr("Delete booking")); - auto selectedAction = menu.exec(ui->treeViewBookings->viewport()->mapToGlobal(pos)); - if(selectedAction == editAction) - { - BookingDialog dialog(this); - dialog.setTime(booking.time); - dialog.setTimespan(booking.timespan); - dialog.setType(booking.type); - dialog.setText(booking.text); - again1: - if(dialog.exec() == QDialog::Accepted) - { - auto reply = m_erfassung.doUpdateBooking(booking.id, m_userInfo.userId, ui->dateEditDate->date(), - dialog.getTime(), dialog.getTimespan(), - dialog.getType(), dialog.getText()); - - { - QEventLoop eventLoop; - connect(reply.get(), &ZeiterfassungReply::finished, &eventLoop, &QEventLoop::quit); - eventLoop.exec(); - } - - if(reply->success()) - { - m_currentStripWidget->refreshBookings(); - } - else - { - QMessageBox::warning(this, tr("Could not edit booking!"), tr("Could not edit booking!") % "\n\n" % reply->message()); - goto again1; - } - } - } - else if(selectedAction == deleteAction) - { - QMessageBox msgBox; - msgBox.setText(tr("Do you really want to delete the booking?")); - msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel); - msgBox.setDefaultButton(QMessageBox::Cancel); - if(msgBox.exec() == QMessageBox::Yes) - { - auto reply = m_erfassung.doDeleteBooking(booking.id); - - { - QEventLoop eventLoop; - connect(reply.get(), &ZeiterfassungReply::finished, &eventLoop, &QEventLoop::quit); - eventLoop.exec(); - } - - if(reply->success()) - m_currentStripWidget->refreshBookings(); - else - QMessageBox::warning(this, tr("Could not delete booking!"), tr("Could not delete booking!") % "\n\n" % reply->message()); - } - } - } -} - -void MainWindow::contextMenuTimeAssignment(const QPoint &pos) -{ - auto index = ui->treeViewTimeAssignments->indexAt(pos); - - if(!index.isValid()) - { - QMenu menu; - auto createAction = menu.addAction(tr("Create time assignment")); - auto refreshAction = menu.addAction(QIcon(QPixmap(QStringLiteral(":/zeiterfassunglib/images/refresh.png"))), tr("Refresh time assignments")); - auto selectedAction = menu.exec(ui->treeViewTimeAssignments->viewport()->mapToGlobal(pos)); - if(selectedAction == createAction) - { - TimeAssignmentDialog dialog(m_projects, m_settings, this); - again2: - if(dialog.exec() == QDialog::Accepted) - { - auto reply = m_erfassung.doCreateTimeAssignment(m_userInfo.userId, ui->dateEditDate->date(), - dialog.getTime(), dialog.getTimespan(), - dialog.getProject(), dialog.getSubproject(), - dialog.getWorkpackage(), dialog.getText()); - - { - QEventLoop eventLoop; - connect(reply.get(), &ZeiterfassungReply::finished, &eventLoop, &QEventLoop::quit); - eventLoop.exec(); - } - - if(reply->success()) - { - m_currentStripWidget->refreshTimeAssignments(); - } - else - { - QMessageBox::warning(this, tr("Could not create time assignment!"), tr("Could not create time assignment!") % "\n\n" % reply->message()); - goto again2; - } - } - } - else if(selectedAction == refreshAction) - { - m_currentStripWidget->refreshTimeAssignments(); - } - } - else - { - auto timeAssignment = m_currentStripWidget->timeAssignments().at(index.row()); - - QMenu menu; - auto editAction = menu.addAction(tr("Edit time assignment")); - auto deleteAction = menu.addAction(tr("Delete time assignment")); - auto selectedAction = menu.exec(ui->treeViewTimeAssignments->viewport()->mapToGlobal(pos)); - if(selectedAction == editAction) - { - TimeAssignmentDialog dialog(m_projects, m_settings, this); - dialog.setTime(timeAssignment.time); - dialog.setTimespan(timeAssignment.timespan); - dialog.setProject(timeAssignment.project); - dialog.setSubproject(timeAssignment.subproject); - dialog.setWorkpackage(timeAssignment.workpackage); - dialog.setText(timeAssignment.text); - again1: - if(dialog.exec() == QDialog::Accepted) - { - auto reply = m_erfassung.doUpdateTimeAssignment(timeAssignment.id, m_userInfo.userId, ui->dateEditDate->date(), - dialog.getTime(), dialog.getTimespan(), - dialog.getProject(), dialog.getSubproject(), - dialog.getWorkpackage(), dialog.getText()); - - { - QEventLoop eventLoop; - connect(reply.get(), &ZeiterfassungReply::finished, &eventLoop, &QEventLoop::quit); - eventLoop.exec(); - } - - if(reply->success()) - { - m_currentStripWidget->refreshTimeAssignments(); - } - else - { - QMessageBox::warning(this, tr("Could not edit time assignment!"), tr("Could not edit time assignment!") % "\n\n" % reply->message()); - goto again1; - } - } - } - else if(selectedAction == deleteAction) - { - QMessageBox msgBox; - msgBox.setText(tr("Do you really want to delete the time assignment?")); - msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel); - msgBox.setDefaultButton(QMessageBox::Cancel); - if(msgBox.exec() == QMessageBox::Yes) - { - auto reply = m_erfassung.doDeleteTimeAssignment(timeAssignment.id); - - { - QEventLoop eventLoop; - connect(reply.get(), &ZeiterfassungReply::finished, &eventLoop, &QEventLoop::quit); - eventLoop.exec(); - } - - if(reply->success()) - { - m_currentStripWidget->refreshTimeAssignments(); - } - else - QMessageBox::warning(this, tr("Could not delete time assignment!"), tr("Could not delete time assignment!") % "\n\n" % reply->message()); - } - } - } -} - void MainWindow::pushButtonStartPressed() { auto bookingsChanged = false; @@ -652,9 +415,6 @@ void MainWindow::dateChanged(bool force) m_currentStripWidget = m_stripsWidgets[i]; - m_bookingsModel->setStripsWidget(m_currentStripWidget); - m_timeAssignmentsModel->setStripsWidget(m_currentStripWidget); - minimumTimeChanged(); startEnabledChanged(); endEnabledChanged(); diff --git a/zeiterfassunglib/mainwindow.h b/zeiterfassunglib/mainwindow.h index e5e9e62..c74ae2a 100644 --- a/zeiterfassunglib/mainwindow.h +++ b/zeiterfassunglib/mainwindow.h @@ -47,8 +47,6 @@ public: private Q_SLOTS: void getProjectsFinished(); void getAuswertungFinished(); - void contextMenuBooking(const QPoint &pos); - void contextMenuTimeAssignment(const QPoint &pos); void pushButtonStartPressed(); void pushButtonEndPressed(); void dateChanged(bool force = false); diff --git a/zeiterfassunglib/mainwindow.ui b/zeiterfassunglib/mainwindow.ui index 1097f45..9bfdf0b 100644 --- a/zeiterfassunglib/mainwindow.ui +++ b/zeiterfassunglib/mainwindow.ui @@ -167,70 +167,26 @@ - - - 0 + + + QFrame::NoFrame - - - QFrame::NoFrame + + QFrame::Plain + + + true + + + + + 0 + 0 + 1393 + 440 + - - QFrame::Plain - - - true - - - Optimized view - - - - - 0 - 0 - 1389 - 409 - - - - - - - - Qt::Vertical - - - Advanced view - - - - Bookings - - - - - - Qt::CustomContextMenu - - - - - - - - Time assignments - - - - - - Qt::CustomContextMenu - - - - - + diff --git a/zeiterfassunglib/models/bookingsmodel.cpp b/zeiterfassunglib/models/bookingsmodel.cpp deleted file mode 100644 index cc95afd..0000000 --- a/zeiterfassunglib/models/bookingsmodel.cpp +++ /dev/null @@ -1,123 +0,0 @@ -#include "bookingsmodel.h" - -#include - -#include "stripswidget.h" - -BookingsModel::BookingsModel(QObject *parent) : - QAbstractListModel(parent), - m_stripsWidget(Q_NULLPTR), - m_enabled(false) -{ -} - -StripsWidget *BookingsModel::stripsWidget() const -{ - return m_stripsWidget; -} - -void BookingsModel::setStripsWidget(StripsWidget *stripsWidget) -{ - if(m_stripsWidget != stripsWidget) - { - if(m_stripsWidget) - { - disconnect(m_stripsWidget, &StripsWidget::bookingsChanged, this, &BookingsModel::bookingsChanged); - disconnect(m_stripsWidget, &StripsWidget::refreshingBookingsChanged, this, &BookingsModel::refreshingChanged); - } - - beginResetModel(); - Q_EMIT stripsWidgetChanged(m_stripsWidget = stripsWidget); - endResetModel(); - - if(m_stripsWidget) - { - connect(m_stripsWidget, &StripsWidget::bookingsChanged, this, &BookingsModel::bookingsChanged); - connect(m_stripsWidget, &StripsWidget::refreshingBookingsChanged, this, &BookingsModel::refreshingChanged); - - if(m_enabled == m_stripsWidget->refreshingBookings()) - Q_EMIT enabledChanged(m_enabled = !m_stripsWidget->refreshingBookings()); - } - else if(m_enabled) - Q_EMIT enabledChanged(m_enabled = false); - } -} - -bool BookingsModel::enabled() const -{ - return m_enabled; -} - -int BookingsModel::rowCount(const QModelIndex &parent) const -{ - Q_UNUSED(parent) - - return m_stripsWidget ? m_stripsWidget->bookings().count() : 0; -} - -int BookingsModel::columnCount(const QModelIndex &parent) const -{ - Q_UNUSED(parent) - - return 5; -} - -QVariant BookingsModel::data(const QModelIndex &index, int role) const -{ - Q_ASSERT(m_stripsWidget != Q_NULLPTR); - Q_ASSERT(index.row() < m_stripsWidget->bookings().count()); - const auto &booking = m_stripsWidget->bookings().at(index.row()); - - switch(role) - { - case Qt::DisplayRole: - case Qt::EditRole: - switch(index.column()) - { - case 0: return booking.id; - case 1: return booking.time; - case 2: return booking.timespan; - case 3: return booking.type; - case 4: return booking.text; - } - } - - return QVariant(); -} - -QVariant BookingsModel::headerData(int section, Qt::Orientation orientation, int role) const -{ - switch(orientation) - { - case Qt::Horizontal: - switch(role) - { - case Qt::DisplayRole: - case Qt::EditRole: - switch(section) - { - case 0: return tr("ID"); - case 1: return tr("Time"); - case 2: return tr("Timespan"); - case 3: return tr("Type"); - case 4: return tr("Text"); - } - } - default: - qt_noop(); - } - - return QVariant(); -} - -void BookingsModel::bookingsChanged() -{ - beginResetModel(); - endResetModel(); -} - -void BookingsModel::refreshingChanged(bool refreshing) -{ - if(m_enabled == refreshing) - Q_EMIT enabledChanged(m_enabled = !refreshing); -} diff --git a/zeiterfassunglib/models/timeassignmentsmodel.cpp b/zeiterfassunglib/models/timeassignmentsmodel.cpp deleted file mode 100644 index 6080dc3..0000000 --- a/zeiterfassunglib/models/timeassignmentsmodel.cpp +++ /dev/null @@ -1,127 +0,0 @@ -#include "timeassignmentsmodel.h" - -#include - -#include "stripswidget.h" - -TimeAssignmentsModel::TimeAssignmentsModel(QObject *parent) : - QAbstractListModel(parent), - m_stripsWidget(Q_NULLPTR), - m_enabled(false) -{ -} - -StripsWidget *TimeAssignmentsModel::stripsWidget() const -{ - return m_stripsWidget; -} - -void TimeAssignmentsModel::setStripsWidget(StripsWidget *stripsWidget) -{ - if(m_stripsWidget != stripsWidget) - { - if(m_stripsWidget) - { - disconnect(m_stripsWidget, &StripsWidget::timeAssignmentsChanged, this, &TimeAssignmentsModel::timeAssignmentsChanged); - disconnect(m_stripsWidget, &StripsWidget::refreshingTimeAssignmentsChanged, this, &TimeAssignmentsModel::refreshingChanged); - } - - beginResetModel(); - m_stripsWidget = stripsWidget; - endResetModel(); - - if(m_stripsWidget) - { - connect(m_stripsWidget, &StripsWidget::timeAssignmentsChanged, this, &TimeAssignmentsModel::timeAssignmentsChanged); - connect(m_stripsWidget, &StripsWidget::refreshingTimeAssignmentsChanged, this, &TimeAssignmentsModel::refreshingChanged); - - if(m_enabled == m_stripsWidget->refreshingTimeAssignments()) - Q_EMIT enabledChanged(m_enabled = !m_stripsWidget->refreshingTimeAssignments()); - } - else if(m_enabled) - Q_EMIT enabledChanged(m_enabled = false); - } -} - -bool TimeAssignmentsModel::enabled() const -{ - return m_enabled; -} - -int TimeAssignmentsModel::rowCount(const QModelIndex &parent) const -{ - Q_UNUSED(parent) - - return m_stripsWidget ? m_stripsWidget->timeAssignments().count() : 0; -} - -int TimeAssignmentsModel::columnCount(const QModelIndex &parent) const -{ - Q_UNUSED(parent) - - return 7; -} - -QVariant TimeAssignmentsModel::data(const QModelIndex &index, int role) const -{ - Q_ASSERT(m_stripsWidget != Q_NULLPTR); - Q_ASSERT(index.row() < m_stripsWidget->timeAssignments().count()); - const auto &timeAssignment = m_stripsWidget->timeAssignments().at(index.row()); - - switch(role) - { - case Qt::DisplayRole: - case Qt::EditRole: - switch(index.column()) - { - case 0: return timeAssignment.id; - case 1: return timeAssignment.time; - case 2: return timeAssignment.timespan; - case 3: return timeAssignment.project; - case 4: return timeAssignment.subproject; - case 5: return timeAssignment.workpackage; - case 6: return timeAssignment.text; - } - } - - return QVariant(); -} - -QVariant TimeAssignmentsModel::headerData(int section, Qt::Orientation orientation, int role) const -{ - switch(orientation) - { - case Qt::Horizontal: - switch(role) - { - case Qt::DisplayRole: - case Qt::EditRole: - switch(section) - { - case 0: return tr("ID"); - case 1: return tr("Time"); - case 2: return tr("Timespan"); - case 3: return tr("Project"); - case 4: return tr("Subproject"); - case 5: return tr("Workpackage"); - case 6: return tr("Text"); - } - } - default: - qt_noop(); - } - - return QVariant(); -} - -void TimeAssignmentsModel::timeAssignmentsChanged() -{ - beginResetModel(); - endResetModel(); -} - -void TimeAssignmentsModel::refreshingChanged(bool refreshing) -{ - if(m_enabled == refreshing) - Q_EMIT enabledChanged(m_enabled = !refreshing); -} diff --git a/zeiterfassunglib/stripswidget.cpp b/zeiterfassunglib/stripswidget.cpp index 1896485..31d061a 100644 --- a/zeiterfassunglib/stripswidget.cpp +++ b/zeiterfassunglib/stripswidget.cpp @@ -12,8 +12,8 @@ #include "timeutils.h" #include "stripfactory.h" -StripsWidget::StripsWidget(MainWindow &mainWindow) : - QWidget(&mainWindow), +StripsWidget::StripsWidget(MainWindow &mainWindow, QWidget *parent) : + QWidget(parent), m_mainWindow(mainWindow), m_refreshing(false), m_refreshingBookings(false), diff --git a/zeiterfassunglib/stripswidget.h b/zeiterfassunglib/stripswidget.h index 3cc1a8c..c1b2b64 100644 --- a/zeiterfassunglib/stripswidget.h +++ b/zeiterfassunglib/stripswidget.h @@ -21,7 +21,7 @@ class ZEITERFASSUNGLIBSHARED_EXPORT StripsWidget : public QWidget Q_OBJECT public: - explicit StripsWidget(MainWindow &mainWindow); + explicit StripsWidget(MainWindow &mainWindow, QWidget *parent = Q_NULLPTR); MainWindow &mainWindow() const; diff --git a/zeiterfassunglib/zeiterfassunglib.pro b/zeiterfassunglib/zeiterfassunglib.pro index 4b10025..62c40c9 100644 --- a/zeiterfassunglib/zeiterfassunglib.pro +++ b/zeiterfassunglib/zeiterfassunglib.pro @@ -19,13 +19,9 @@ SOURCES += mainwindow.cpp \ zeiterfassungsettings.cpp \ dialogs/aboutmedialog.cpp \ dialogs/authenticationdialog.cpp \ - dialogs/bookingdialog.cpp \ dialogs/languageselectiondialog.cpp \ dialogs/settingsdialog.cpp \ - dialogs/timeassignmentdialog.cpp \ dialogs/updatedialog.cpp \ - models/bookingsmodel.cpp \ - models/timeassignmentsmodel.cpp \ replies/createbookingreply.cpp \ replies/createtimeassignmentreply.cpp \ replies/deletebookingreply.cpp \ @@ -40,7 +36,7 @@ SOURCES += mainwindow.cpp \ replies/updatebookingreply.cpp \ replies/updatetimeassignmentreply.cpp \ replies/zeiterfassungreply.cpp \ - replies/getuserinforeply.cpp + replies/getuserinforeply.cpp HEADERS += cpp14polyfills.h \ mainwindow.h \ @@ -53,13 +49,9 @@ HEADERS += cpp14polyfills.h \ zeiterfassungsettings.h \ dialogs/aboutmedialog.h \ dialogs/authenticationdialog.h \ - dialogs/bookingdialog.h \ dialogs/languageselectiondialog.h \ dialogs/settingsdialog.h \ - dialogs/timeassignmentdialog.h \ dialogs/updatedialog.h \ - models/bookingsmodel.h \ - models/timeassignmentsmodel.h \ replies/createbookingreply.h \ replies/createtimeassignmentreply.h \ replies/deletebookingreply.h \ @@ -74,16 +66,14 @@ HEADERS += cpp14polyfills.h \ replies/updatebookingreply.h \ replies/updatetimeassignmentreply.h \ replies/zeiterfassungreply.h \ - replies/getuserinforeply.h + replies/getuserinforeply.h FORMS += mainwindow.ui \ dialogs/updatedialog.ui \ dialogs/settingsdialog.ui \ dialogs/languageselectiondialog.ui \ dialogs/authenticationdialog.ui \ - dialogs/bookingdialog.ui \ - dialogs/aboutmedialog.ui \ - dialogs/timeassignmentdialog.ui + dialogs/aboutmedialog.ui RESOURCES += resources.qrc -- 2.50.1 From 01583dea10438cd8f8ece9adefe48f1011a5ac90 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Mon, 18 Dec 2017 21:50:30 +0100 Subject: [PATCH 11/11] Fixed bugs with refreshing label --- .../advancedviewplugin/advanvedviewdialog.cpp | 2 ++ .../advancedviewplugin/advanvedviewdialog.ui | 2 +- .../models/bookingsmodel.cpp | 2 +- .../models/timeassignmentsmodel.cpp | 2 +- zeiterfassunglib/stripswidget.cpp | 26 ++++++++++++++----- zeiterfassunglib/stripswidget.h | 4 +-- 6 files changed, 27 insertions(+), 11 deletions(-) diff --git a/plugins/advancedviewplugin/advanvedviewdialog.cpp b/plugins/advancedviewplugin/advanvedviewdialog.cpp index fb56af4..bcc77a9 100644 --- a/plugins/advancedviewplugin/advanvedviewdialog.cpp +++ b/plugins/advancedviewplugin/advanvedviewdialog.cpp @@ -32,10 +32,12 @@ AdvanvedViewDialog::AdvanvedViewDialog(StripsWidget &stripsWidget) : ui->setupUi(this); ui->bookingsView->setModel(m_bookingsModel); + ui->bookingsView->setEnabled(m_bookingsModel->enabled()); connect(m_bookingsModel, &BookingsModel::enabledChanged, ui->bookingsView, &QWidget::setEnabled); connect(ui->bookingsView, &QWidget::customContextMenuRequested, this, &AdvanvedViewDialog::contextMenuBooking); ui->timeAssignmentsView->setModel(m_timeAssignmentsModel); + ui->timeAssignmentsView->setEnabled(m_timeAssignmentsModel->enabled()); connect(m_timeAssignmentsModel, &TimeAssignmentsModel::enabledChanged, ui->timeAssignmentsView, &QWidget::setEnabled); connect(ui->timeAssignmentsView, &QWidget::customContextMenuRequested, this, &AdvanvedViewDialog::contextMenuTimeAssignment); } diff --git a/plugins/advancedviewplugin/advanvedviewdialog.ui b/plugins/advancedviewplugin/advanvedviewdialog.ui index 9418d8e..0ad8f3f 100644 --- a/plugins/advancedviewplugin/advanvedviewdialog.ui +++ b/plugins/advancedviewplugin/advanvedviewdialog.ui @@ -6,7 +6,7 @@ 0 0 - 640 + 1024 480 diff --git a/plugins/advancedviewplugin/models/bookingsmodel.cpp b/plugins/advancedviewplugin/models/bookingsmodel.cpp index 15a4896..14ece31 100644 --- a/plugins/advancedviewplugin/models/bookingsmodel.cpp +++ b/plugins/advancedviewplugin/models/bookingsmodel.cpp @@ -7,7 +7,7 @@ BookingsModel::BookingsModel(StripsWidget &stripsWidget, QObject *parent) : m_stripsWidget(stripsWidget) { connect(&stripsWidget, &StripsWidget::bookingsChanged, this, &BookingsModel::bookingsChanged); - connect(&stripsWidget, &StripsWidget::refreshingBookingsChanged, this, &BookingsModel::enabledChanged); + connect(&stripsWidget, &StripsWidget::refreshingBookingsChanged, [=](bool refreshing){ enabledChanged(!refreshing); }); } StripsWidget &BookingsModel::stripsWidget() const diff --git a/plugins/advancedviewplugin/models/timeassignmentsmodel.cpp b/plugins/advancedviewplugin/models/timeassignmentsmodel.cpp index 623efba..b33930b 100644 --- a/plugins/advancedviewplugin/models/timeassignmentsmodel.cpp +++ b/plugins/advancedviewplugin/models/timeassignmentsmodel.cpp @@ -7,7 +7,7 @@ TimeAssignmentsModel::TimeAssignmentsModel(StripsWidget &stripsWidget, QObject * m_stripsWidget(stripsWidget) { connect(&stripsWidget, &StripsWidget::timeAssignmentsChanged, this, &TimeAssignmentsModel::timeAssignmentsChanged); - connect(&stripsWidget, &StripsWidget::refreshingBookingsChanged, this, &TimeAssignmentsModel::enabledChanged); + connect(&stripsWidget, &StripsWidget::refreshingTimeAssignmentsChanged, [=](bool refreshing){ enabledChanged(!refreshing); }); } StripsWidget &TimeAssignmentsModel::stripsWidget() const diff --git a/zeiterfassunglib/stripswidget.cpp b/zeiterfassunglib/stripswidget.cpp index 31d061a..07814bc 100644 --- a/zeiterfassunglib/stripswidget.cpp +++ b/zeiterfassunglib/stripswidget.cpp @@ -140,11 +140,11 @@ void StripsWidget::refresh() m_stripsLayout->addWidget(new QLabel(tr("Loading..."), this)); - refreshBookings(); - refreshTimeAssignments(); + refreshBookings(false); + refreshTimeAssignments(false); } -void StripsWidget::refreshBookings() +void StripsWidget::refreshBookings(bool createLabel) { if(!m_date.isValid()) { @@ -152,7 +152,14 @@ void StripsWidget::refreshBookings() return; } - if(m_bookings.count()) + if(createLabel) + { + clearStrips(); + + m_stripsLayout->addWidget(new QLabel(tr("Loading..."), this)); + } + + if(!m_bookings.empty()) { m_bookings.clear(); Q_EMIT bookingsChanged(m_bookings); @@ -170,7 +177,7 @@ void StripsWidget::refreshBookings() connect(m_getBookingsReply.get(), &ZeiterfassungReply::finished, this, &StripsWidget::getBookingsFinished); } -void StripsWidget::refreshTimeAssignments() +void StripsWidget::refreshTimeAssignments(bool createLabel) { if(!m_date.isValid()) { @@ -178,7 +185,14 @@ void StripsWidget::refreshTimeAssignments() return; } - if(m_timeAssignments.count()) + if(createLabel) + { + clearStrips(); + + m_stripsLayout->addWidget(new QLabel(tr("Loading..."), this)); + } + + if(!m_timeAssignments.empty()) { m_timeAssignments.clear(); Q_EMIT timeAssignmentsChanged(m_timeAssignments); diff --git a/zeiterfassunglib/stripswidget.h b/zeiterfassunglib/stripswidget.h index c1b2b64..76e48d7 100644 --- a/zeiterfassunglib/stripswidget.h +++ b/zeiterfassunglib/stripswidget.h @@ -46,8 +46,8 @@ public: bool endEnabled() const; void refresh(); - void refreshBookings(); - void refreshTimeAssignments(); + void refreshBookings(bool createLabel = true); + void refreshTimeAssignments(bool createLabel = true); bool createStrips(); void clearStrips(); -- 2.50.1