diff --git a/plugins/lunchmealplugin/lunchmealplugin.cpp b/plugins/lunchmealplugin/lunchmealplugin.cpp index 3e8e278..e1b1b92 100644 --- a/plugins/lunchmealplugin/lunchmealplugin.cpp +++ b/plugins/lunchmealplugin/lunchmealplugin.cpp @@ -7,8 +7,3 @@ LunchMealPlugin::LunchMealPlugin(QObject *parent) : { } - -void LunchMealPlugin::initialize() -{ - qDebug() << "called"; -} diff --git a/plugins/lunchmealplugin/lunchmealplugin.h b/plugins/lunchmealplugin/lunchmealplugin.h index 9befa20..e73e062 100644 --- a/plugins/lunchmealplugin/lunchmealplugin.h +++ b/plugins/lunchmealplugin/lunchmealplugin.h @@ -15,7 +15,6 @@ public: explicit LunchMealPlugin(QObject *parent = 0); // ZeiterfassungPlugin interface - void initialize() Q_DECL_OVERRIDE; }; #endif // LUNCHMEALPLUGIN_H diff --git a/plugins/presenceplugin/presenceplugin.cpp b/plugins/presenceplugin/presenceplugin.cpp index d0a3f5f..0560bb6 100644 --- a/plugins/presenceplugin/presenceplugin.cpp +++ b/plugins/presenceplugin/presenceplugin.cpp @@ -2,13 +2,16 @@ #include +#include "mainwindow.h" +#include "presencewidget.h" + PresencePlugin::PresencePlugin(QObject *parent) : ZeiterfassungPlugin(parent) -{ - -} - -void PresencePlugin::initialize() { qDebug() << "called"; } + +void PresencePlugin::attachTo(MainWindow &mainWindow) +{ + new PresenceWidget(mainWindow); +} diff --git a/plugins/presenceplugin/presenceplugin.h b/plugins/presenceplugin/presenceplugin.h index c90e0ea..5ccdc86 100644 --- a/plugins/presenceplugin/presenceplugin.h +++ b/plugins/presenceplugin/presenceplugin.h @@ -5,6 +5,8 @@ #include "zeiterfassungplugin.h" +class MainWindow; + class Q_DECL_EXPORT PresencePlugin : public ZeiterfassungPlugin { Q_OBJECT @@ -15,7 +17,7 @@ public: explicit PresencePlugin(QObject *parent = 0); // ZeiterfassungPlugin interface - void initialize() Q_DECL_OVERRIDE; + void attachTo(MainWindow &mainWindow); }; #endif // PRESENCEPLUGIN_H diff --git a/plugins/presenceplugin/presenceplugin.pro b/plugins/presenceplugin/presenceplugin.pro index 9ad4afb..7767bfe 100644 --- a/plugins/presenceplugin/presenceplugin.pro +++ b/plugins/presenceplugin/presenceplugin.pro @@ -14,8 +14,10 @@ DEPENDPATH += $$PWD/../../zeiterfassunglib DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT -HEADERS += presenceplugin.h +HEADERS += presenceplugin.h \ + presencewidget.h -SOURCES += presenceplugin.cpp +SOURCES += presenceplugin.cpp \ + presencewidget.cpp OTHER_FILES += presenceplugin.json diff --git a/plugins/presenceplugin/presencewidget.cpp b/plugins/presenceplugin/presencewidget.cpp new file mode 100644 index 0000000..05d6223 --- /dev/null +++ b/plugins/presenceplugin/presencewidget.cpp @@ -0,0 +1,77 @@ +#include "presencewidget.h" + +#include +#include +#include +#include +#include + +#include "mainwindow.h" +#include "zeiterfassungapi.h" + +PresenceWidget::PresenceWidget(MainWindow &mainWindow) : + QWidget(&mainWindow), + m_mainWindow(mainWindow) +{ + m_labelAvailable = new QLabel(this); + m_labelAvailable->setFrameShape(QFrame::Panel); + m_labelAvailable->setFrameShadow(QFrame::Sunken); + m_mainWindow.statusBar()->addWidget(m_labelAvailable); + + m_labelNotAvailable = new QLabel(this); + m_labelNotAvailable->setFrameShape(QFrame::Panel); + m_labelNotAvailable->setFrameShadow(QFrame::Sunken); + m_mainWindow.statusBar()->addWidget(m_labelNotAvailable); + + auto timer = new QTimer(this); + timer->setInterval(60000); + connect(timer, &QTimer::timeout, this, &PresenceWidget::timeout); + timer->start(); + + timeout(); +} + +void PresenceWidget::timeout() +{ + if(m_reply) + { + qWarning() << "last request not finished yet!"; + return; + } + + m_labelAvailable->setText(tr("%0: %1").arg(tr("Available")).arg(tr("???"))); + m_labelNotAvailable->setText(tr("%0: %1").arg(tr("Not available")).arg(tr("???"))); + + m_reply = m_mainWindow.erfassung().doGetPresenceStatus(); + connect(m_reply.get(), &ZeiterfassungReply::finished, this, &PresenceWidget::finished); +} + +void PresenceWidget::finished() +{ + if(!m_reply->success()) + { + QMessageBox::warning(&m_mainWindow, tr("Could not get presence status!"), + tr("Could not get presence status!") % "\n\n" % m_reply->message()); + goto after; + } + + { + int available = 0, + notAvailable = 0; + for(const auto &status : m_reply->presenceStatuses()) + { + if(status.presence == QStringLiteral("J")) + available++; + else if(status.presence == QStringLiteral("N")) + notAvailable++; + else + qWarning() << "unknown presence" << status.firstName << status.lastName << status.presence; + } + + m_labelAvailable->setText(tr("%0: %1").arg(tr("Available")).arg(available)); + m_labelNotAvailable->setText(tr("%0: %1").arg(tr("Not available")).arg(notAvailable)); + } + + after: + m_reply = Q_NULLPTR; +} diff --git a/plugins/presenceplugin/presencewidget.h b/plugins/presenceplugin/presencewidget.h new file mode 100644 index 0000000..2c1e578 --- /dev/null +++ b/plugins/presenceplugin/presencewidget.h @@ -0,0 +1,31 @@ +#ifndef PRESENCEWIDGET_H +#define PRESENCEWIDGET_H + +#include + +#include "replies/getpresencestatusreply.h" + +class QLabel; + +class MainWindow; + +class PresenceWidget : public QWidget +{ + Q_OBJECT +public: + explicit PresenceWidget(MainWindow &mainWindow); + +private Q_SLOTS: + void timeout(); + void finished(); + +private: + MainWindow &m_mainWindow; + + QLabel *m_labelAvailable; + QLabel *m_labelNotAvailable; + + std::unique_ptr m_reply; +}; + +#endif // PRESENCEWIDGET_H diff --git a/plugins/weatherplugin/weatherplugin.cpp b/plugins/weatherplugin/weatherplugin.cpp index 1fdfc72..0be043f 100644 --- a/plugins/weatherplugin/weatherplugin.cpp +++ b/plugins/weatherplugin/weatherplugin.cpp @@ -7,8 +7,3 @@ WeatherPlugin::WeatherPlugin(QObject *parent) : { } - -void WeatherPlugin::initialize() -{ - qDebug() << "called"; -} diff --git a/plugins/weatherplugin/weatherplugin.h b/plugins/weatherplugin/weatherplugin.h index 933fdbd..9db873d 100644 --- a/plugins/weatherplugin/weatherplugin.h +++ b/plugins/weatherplugin/weatherplugin.h @@ -15,7 +15,6 @@ public: explicit WeatherPlugin(QObject *parent = 0); // ZeiterfassungPlugin interface - void initialize() Q_DECL_OVERRIDE; }; #endif // WEATHERPLUGIN_H diff --git a/zeiterfassung/main.cpp b/zeiterfassung/main.cpp index b9a2965..4075122 100755 --- a/zeiterfassung/main.cpp +++ b/zeiterfassung/main.cpp @@ -33,6 +33,8 @@ struct { QTranslator zeiterfassunglibTranslator; } translators; +QVector plugins; + bool loadAndInstallTranslator(QTranslator &translator, const QLocale &locale, const QString &filename, @@ -315,7 +317,7 @@ bool loadPlugins(QSplashScreen &splashScreen) continue; } - plugin->initialize(); + plugins.append(plugin); } return ok; @@ -377,6 +379,10 @@ int main(int argc, char *argv[]) MainWindow mainWindow(settings, erfassung, userInfo, stripFactory); splashScreen.finish(&mainWindow); + + for(auto plugin : plugins) + plugin->attachTo(mainWindow); + mainWindow.show(); return app.exec(); diff --git a/zeiterfassunglib/mainwindow.cpp b/zeiterfassunglib/mainwindow.cpp index b1423bb..723cd98 100644 --- a/zeiterfassunglib/mainwindow.cpp +++ b/zeiterfassunglib/mainwindow.cpp @@ -48,8 +48,7 @@ MainWindow::MainWindow(ZeiterfassungSettings &settings, ZeiterfassungApi &erfass m_getAuswertungReply(Q_NULLPTR), m_bookingsModel(new BookingsModel(this)), m_timeAssignmentsModel(new TimeAssignmentsModel(this)), - m_currentStripWidget(Q_NULLPTR), - m_getPresenceStatusReply(Q_NULLPTR) + m_currentStripWidget(Q_NULLPTR) { ui->setupUi(this); @@ -108,10 +107,6 @@ MainWindow::MainWindow(ZeiterfassungSettings &settings, ZeiterfassungApi &erfass connect(m_timeAssignmentsModel, &TimeAssignmentsModel::enabledChanged, ui->treeViewTimeAssignments, &QWidget::setEnabled); connect(ui->treeViewTimeAssignments, &QWidget::customContextMenuRequested, this, &MainWindow::contextMenuTimeAssignment); - ui->statusbar->addWidget(m_presenceLabel = new QLabel(tr("???"), ui->statusbar)); - m_presenceLabel->setFrameShape(QFrame::Panel); - m_presenceLabel->setFrameShadow(QFrame::Sunken); - ui->statusbar->addPermanentWidget(m_balanceLabel = new QLabel(ui->statusbar)); m_balanceLabel->setFrameShape(QFrame::Panel); m_balanceLabel->setFrameShadow(QFrame::Sunken); @@ -121,15 +116,6 @@ MainWindow::MainWindow(ZeiterfassungSettings &settings, ZeiterfassungApi &erfass dateChanged(); - { - auto timer = new QTimer(this); - timer->setInterval(60000); - connect(timer, &QTimer::timeout, this, &MainWindow::refreshPresence); - timer->start(); - } - - refreshPresence(); - if(settings.lastUpdateCheck().isNull() || settings.lastUpdateCheck() < QDate::currentDate()) new UpdateDialog(settings, erfassung.manager(), this); } @@ -139,6 +125,46 @@ MainWindow::~MainWindow() delete ui; } +QMenu *MainWindow::menuFile() const +{ + return ui->menuFile; +} + +QMenu *MainWindow::menuView() const +{ + return ui->menuView; +} + +QMenu *MainWindow::menuTools() const +{ + return ui->menuTools; +} + +QMenu *MainWindow::menuAbout() const +{ + return ui->menuAbout; +} + +ZeiterfassungSettings &MainWindow::settings() const +{ + return m_settings; +} + +ZeiterfassungApi &MainWindow::erfassung() const +{ + return m_erfassung; +} + +const ZeiterfassungApi::UserInfo &MainWindow::userInfo() const +{ + return m_userInfo; +} + +StripFactory &MainWindow::stripFactory() const +{ + return m_stripFactory; +} + void MainWindow::getProjectsFinished() { if(m_getProjectsReply->success()) @@ -663,34 +689,6 @@ void MainWindow::openAuswertung() } } -void MainWindow::refreshPresence() -{ - m_presenceLabel->setText(tr("???")); - - m_getPresenceStatusReply = m_erfassung.doGetPresenceStatus(); - connect(m_getPresenceStatusReply.get(), &ZeiterfassungReply::finished, this, &MainWindow::getPresenceStatusFinished); -} - -void MainWindow::getPresenceStatusFinished() -{ - if(m_getPresenceStatusReply->success()) - { - QMap counts; - for(const auto &presenceStatus : m_getPresenceStatusReply->presenceStatuses()) - counts[presenceStatus.presence]++; - QString text; - for(auto iter = counts.constBegin(); iter != counts.constEnd(); iter++) - { - if(!text.isEmpty()) - text.append(' '); - text.append(QStringLiteral("%0: %1").arg(iter.key()).arg(iter.value())); - } - m_presenceLabel->setText(text); - } - - m_getPresenceStatusReply = Q_NULLPTR; -} - void MainWindow::minimumTimeChanged() { ui->timeEditTime->setMinimumTime(m_currentStripWidget->minimumTime()); diff --git a/zeiterfassunglib/mainwindow.h b/zeiterfassunglib/mainwindow.h index 37817a7..8de3dcd 100644 --- a/zeiterfassunglib/mainwindow.h +++ b/zeiterfassunglib/mainwindow.h @@ -31,6 +31,16 @@ public: StripFactory &stripFactory, QWidget *parent = Q_NULLPTR); ~MainWindow(); + QMenu *menuFile() const; + QMenu *menuView() const; + QMenu *menuTools() const; + QMenu *menuAbout() const; + + ZeiterfassungSettings &settings() const; + ZeiterfassungApi &erfassung() const; + const ZeiterfassungApi::UserInfo &userInfo() const; + StripFactory &stripFactory() const; + private Q_SLOTS: void getProjectsFinished(); void getAuswertungFinished(); @@ -40,8 +50,6 @@ private Q_SLOTS: void pushButtonEndPressed(); void dateChanged(bool force = false); void openAuswertung(); - void refreshPresence(); - void getPresenceStatusFinished(); void minimumTimeChanged(); void refreshingChanged(); @@ -69,15 +77,11 @@ private: QDate m_auswertungDate; QByteArray m_auswertung; - QLabel *m_presenceLabel; - QLabel *m_balanceLabel; QLabel *m_holidaysLabel; std::array m_stripsWidgets; StripsWidget *m_currentStripWidget; - - std::unique_ptr m_getPresenceStatusReply; }; #endif // MAINWINDOW_H diff --git a/zeiterfassunglib/mainwindow.ui b/zeiterfassunglib/mainwindow.ui index 9ea7fe6..1097f45 100644 --- a/zeiterfassunglib/mainwindow.ui +++ b/zeiterfassunglib/mainwindow.ui @@ -251,7 +251,7 @@ - + &About @@ -262,23 +262,23 @@ - + &View - + &Tools - - - + + + diff --git a/zeiterfassunglib/zeiterfassungplugin.h b/zeiterfassunglib/zeiterfassungplugin.h index f893180..33eee20 100644 --- a/zeiterfassunglib/zeiterfassungplugin.h +++ b/zeiterfassunglib/zeiterfassungplugin.h @@ -5,6 +5,9 @@ #include "zeiterfassunglib_global.h" +class MainWindow; +class StripsWidget; + class ZEITERFASSUNGLIBSHARED_EXPORT ZeiterfassungPlugin : public QObject { Q_OBJECT @@ -12,7 +15,8 @@ class ZEITERFASSUNGLIBSHARED_EXPORT ZeiterfassungPlugin : public QObject public: explicit ZeiterfassungPlugin(QObject *parent = 0); - virtual void initialize() = 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")