Added context menu to absences view #82
@@ -4,6 +4,8 @@
|
|||||||
#include <QDate>
|
#include <QDate>
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
#include <QStringBuilder>
|
#include <QStringBuilder>
|
||||||
|
#include <QMenu>
|
||||||
|
#include <QAction>
|
||||||
|
|
||||||
#include "absencesmodel.h"
|
#include "absencesmodel.h"
|
||||||
|
|
||||||
@@ -21,6 +23,8 @@ AbsenceDialog::AbsenceDialog(int userId, const QDate &date, ZeiterfassungApi &er
|
|||||||
ui->treeView->setModel(m_model);
|
ui->treeView->setModel(m_model);
|
||||||
ui->treeView->setEnabled(m_model->enabled());
|
ui->treeView->setEnabled(m_model->enabled());
|
||||||
connect(m_model, &AbsencesModel::enabledChanged, ui->treeView, &QWidget::setEnabled);
|
connect(m_model, &AbsencesModel::enabledChanged, ui->treeView, &QWidget::setEnabled);
|
||||||
|
|
||||||
|
connect(ui->treeView, &QWidget::customContextMenuRequested, this, &AbsenceDialog::customContextMenuRequested);
|
||||||
}
|
}
|
||||||
|
|
||||||
AbsenceDialog::~AbsenceDialog()
|
AbsenceDialog::~AbsenceDialog()
|
||||||
@@ -32,3 +36,48 @@ void AbsenceDialog::errorOccured(const QString &message)
|
|||||||
{
|
{
|
||||||
QMessageBox::warning(this, tr("Could not load absences!"), tr("Could not load absences!") % "\n\n" % message);
|
QMessageBox::warning(this, tr("Could not load absences!"), tr("Could not load absences!") % "\n\n" % message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AbsenceDialog::customContextMenuRequested(const QPoint &pos)
|
||||||
|
{
|
||||||
|
auto index = ui->treeView->indexAt(pos);
|
||||||
|
|
||||||
|
if(!index.isValid())
|
||||||
|
{
|
||||||
|
QMenu menu;
|
||||||
|
auto createAction = menu.addAction(tr("Create absence"));
|
||||||
|
auto refreshAction = menu.addAction(QIcon(QPixmap(QStringLiteral(":/zeiterfassungguilib/images/refresh.png"))), tr("Refresh absences"));
|
||||||
|
auto selectedAction = menu.exec(ui->treeView->viewport()->mapToGlobal(pos));
|
||||||
|
if(selectedAction == createAction)
|
||||||
|
{
|
||||||
|
//TODO
|
||||||
|
}
|
||||||
|
else if(selectedAction == refreshAction)
|
||||||
|
{
|
||||||
|
m_model->refresh();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
auto absence = m_model->absences().at(index.row());
|
||||||
|
|
||||||
|
QMenu menu;
|
||||||
|
auto editAction = menu.addAction(tr("Edit absence"));
|
||||||
|
auto deleteAction = menu.addAction(tr("Delete absence"));
|
||||||
|
auto selectedAction = menu.exec(ui->treeView->viewport()->mapToGlobal(pos));
|
||||||
|
if(selectedAction == editAction)
|
||||||
|
{
|
||||||
|
//TODO
|
||||||
|
}
|
||||||
|
else if(selectedAction == deleteAction)
|
||||||
|
{
|
||||||
|
QMessageBox msgBox;
|
||||||
|
msgBox.setText(tr("Do you really want to delete the absence?"));
|
||||||
|
msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel);
|
||||||
|
msgBox.setDefaultButton(QMessageBox::Cancel);
|
||||||
|
if(msgBox.exec() == QMessageBox::Yes)
|
||||||
|
{
|
||||||
|
//TODO
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -19,6 +19,7 @@ public:
|
|||||||
|
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void errorOccured(const QString &message);
|
void errorOccured(const QString &message);
|
||||||
|
void customContextMenuRequested(const QPoint &pos);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::AbsenceDialog *ui;
|
Ui::AbsenceDialog *ui;
|
||||||
|
@@ -27,7 +27,11 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QTreeView" name="treeView"/>
|
<widget class="QTreeView" name="treeView">
|
||||||
|
<property name="contextMenuPolicy">
|
||||||
|
<enum>Qt::CustomContextMenu</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QDialogButtonBox" name="buttonBox">
|
<widget class="QDialogButtonBox" name="buttonBox">
|
||||||
|
@@ -7,6 +7,8 @@ AbsencesModel::AbsencesModel(int userId, const QDate &date, ZeiterfassungApi &er
|
|||||||
m_userId(userId),
|
m_userId(userId),
|
||||||
m_erfassung(erfassung)
|
m_erfassung(erfassung)
|
||||||
{
|
{
|
||||||
|
connect(this, &AbsencesModel::dateChanged, this, &AbsencesModel::refresh);
|
||||||
|
|
||||||
setDate(date);
|
setDate(date);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -15,6 +17,16 @@ bool AbsencesModel::enabled() const
|
|||||||
return m_reply == Q_NULLPTR;
|
return m_reply == Q_NULLPTR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const QDate &AbsencesModel::date() const
|
||||||
|
{
|
||||||
|
return m_date;
|
||||||
|
}
|
||||||
|
|
||||||
|
const QVector<GetAbsencesReply::Absence> &AbsencesModel::absences() const
|
||||||
|
{
|
||||||
|
return m_absences;
|
||||||
|
}
|
||||||
|
|
||||||
int AbsencesModel::rowCount(const QModelIndex &parent) const
|
int AbsencesModel::rowCount(const QModelIndex &parent) const
|
||||||
{
|
{
|
||||||
Q_UNUSED(parent)
|
Q_UNUSED(parent)
|
||||||
@@ -76,10 +88,8 @@ QVariant AbsencesModel::headerData(int section, Qt::Orientation orientation, int
|
|||||||
return QVariant();
|
return QVariant();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AbsencesModel::setDate(const QDate &date)
|
void AbsencesModel::refresh()
|
||||||
{
|
{
|
||||||
m_date = date;
|
|
||||||
|
|
||||||
auto oldEnabled = enabled();
|
auto oldEnabled = enabled();
|
||||||
|
|
||||||
m_reply = m_erfassung.doGetAbsences(m_userId, m_date, m_date);
|
m_reply = m_erfassung.doGetAbsences(m_userId, m_date, m_date);
|
||||||
@@ -89,6 +99,12 @@ void AbsencesModel::setDate(const QDate &date)
|
|||||||
Q_EMIT enabledChanged(enabled());
|
Q_EMIT enabledChanged(enabled());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AbsencesModel::setDate(const QDate &date)
|
||||||
|
{
|
||||||
|
if(m_date != date)
|
||||||
|
Q_EMIT dateChanged(m_date = date);
|
||||||
|
}
|
||||||
|
|
||||||
void AbsencesModel::finished()
|
void AbsencesModel::finished()
|
||||||
{
|
{
|
||||||
if(!m_reply->success())
|
if(!m_reply->success())
|
||||||
|
@@ -13,12 +13,17 @@ class AbsencesModel : public QAbstractListModel
|
|||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_PROPERTY(bool enabled READ enabled NOTIFY enabledChanged)
|
Q_PROPERTY(bool enabled READ enabled NOTIFY enabledChanged)
|
||||||
|
Q_PROPERTY(QDate date READ date WRITE setDate NOTIFY dateChanged)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit AbsencesModel(int userId, const QDate &date, ZeiterfassungApi &erfassung, QObject *parent = Q_NULLPTR);
|
explicit AbsencesModel(int userId, const QDate &date, ZeiterfassungApi &erfassung, QObject *parent = Q_NULLPTR);
|
||||||
|
|
||||||
bool enabled() const;
|
bool enabled() const;
|
||||||
|
|
||||||
|
const QDate &date() const;
|
||||||
|
|
||||||
|
const QVector<GetAbsencesReply::Absence> &absences() const;
|
||||||
|
|
||||||
// QAbstractItemModel interface
|
// QAbstractItemModel interface
|
||||||
int rowCount(const QModelIndex &parent) const Q_DECL_OVERRIDE;
|
int rowCount(const QModelIndex &parent) const Q_DECL_OVERRIDE;
|
||||||
int columnCount(const QModelIndex &parent) const Q_DECL_OVERRIDE;
|
int columnCount(const QModelIndex &parent) const Q_DECL_OVERRIDE;
|
||||||
@@ -27,9 +32,11 @@ public:
|
|||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
void enabledChanged(bool enabled);
|
void enabledChanged(bool enabled);
|
||||||
|
void dateChanged(const QDate &date);
|
||||||
void errorOccured(const QString &message);
|
void errorOccured(const QString &message);
|
||||||
|
|
||||||
public Q_SLOTS:
|
public Q_SLOTS:
|
||||||
|
void refresh();
|
||||||
void setDate(const QDate &date);
|
void setDate(const QDate &date);
|
||||||
|
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
|
@@ -9,20 +9,45 @@
|
|||||||
<translation>Abwesenheiten</translation>
|
<translation>Abwesenheiten</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../absencedialog.cpp" line="16"/>
|
<location filename="../absencedialog.cpp" line="18"/>
|
||||||
<source>Absences for %0</source>
|
<source>Absences for %0</source>
|
||||||
<translation>Abwesenheiten für %0</translation>
|
<translation>Abwesenheiten für %0</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../absencedialog.cpp" line="16"/>
|
<location filename="../absencedialog.cpp" line="18"/>
|
||||||
<source>dd.MM.yyyy</source>
|
<source>dd.MM.yyyy</source>
|
||||||
<translation>dd.MM.yyyy</translation>
|
<translation>dd.MM.yyyy</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../absencedialog.cpp" line="33"/>
|
<location filename="../absencedialog.cpp" line="37"/>
|
||||||
<source>Could not load absences!</source>
|
<source>Could not load absences!</source>
|
||||||
<translation>Konnte Abwesenheiten nicht laden!</translation>
|
<translation>Konnte Abwesenheiten nicht laden!</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../absencedialog.cpp" line="47"/>
|
||||||
|
<source>Create absence</source>
|
||||||
|
<translation>Abwesenheit erstellen</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../absencedialog.cpp" line="48"/>
|
||||||
|
<source>Refresh absences</source>
|
||||||
|
<translation>Abwesenheiten aktualisieren</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../absencedialog.cpp" line="64"/>
|
||||||
|
<source>Edit absence</source>
|
||||||
|
<translation>Abwesenheit bearbeiten</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../absencedialog.cpp" line="65"/>
|
||||||
|
<source>Delete absence</source>
|
||||||
|
<translation>Abwesenheit löschen</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../absencedialog.cpp" line="74"/>
|
||||||
|
<source>Do you really want to delete the absence?</source>
|
||||||
|
<translation>Möchten Sie die Abwesenheit wirklich löschen?</translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>AbsenceWidget</name>
|
<name>AbsenceWidget</name>
|
||||||
@@ -35,27 +60,27 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>AbsencesModel</name>
|
<name>AbsencesModel</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../absencesmodel.cpp" line="65"/>
|
<location filename="../absencesmodel.cpp" line="77"/>
|
||||||
<source>Id</source>
|
<source>Id</source>
|
||||||
<translation>Id</translation>
|
<translation>Id</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../absencesmodel.cpp" line="66"/>
|
<location filename="../absencesmodel.cpp" line="78"/>
|
||||||
<source>Start</source>
|
<source>Start</source>
|
||||||
<translation>Start</translation>
|
<translation>Start</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../absencesmodel.cpp" line="67"/>
|
<location filename="../absencesmodel.cpp" line="79"/>
|
||||||
<source>End</source>
|
<source>End</source>
|
||||||
<translation>Ende</translation>
|
<translation>Ende</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../absencesmodel.cpp" line="68"/>
|
<location filename="../absencesmodel.cpp" line="80"/>
|
||||||
<source>Hour Category</source>
|
<source>Hour Category</source>
|
||||||
<translation>Stunden Kategorie</translation>
|
<translation>Stunden Kategorie</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../absencesmodel.cpp" line="69"/>
|
<location filename="../absencesmodel.cpp" line="81"/>
|
||||||
<source>Text</source>
|
<source>Text</source>
|
||||||
<translation>Text</translation>
|
<translation>Text</translation>
|
||||||
</message>
|
</message>
|
||||||
|
@@ -9,20 +9,45 @@
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../absencedialog.cpp" line="16"/>
|
<location filename="../absencedialog.cpp" line="18"/>
|
||||||
<source>Absences for %0</source>
|
<source>Absences for %0</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../absencedialog.cpp" line="16"/>
|
<location filename="../absencedialog.cpp" line="18"/>
|
||||||
<source>dd.MM.yyyy</source>
|
<source>dd.MM.yyyy</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../absencedialog.cpp" line="33"/>
|
<location filename="../absencedialog.cpp" line="37"/>
|
||||||
<source>Could not load absences!</source>
|
<source>Could not load absences!</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../absencedialog.cpp" line="47"/>
|
||||||
|
<source>Create absence</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../absencedialog.cpp" line="48"/>
|
||||||
|
<source>Refresh absences</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../absencedialog.cpp" line="64"/>
|
||||||
|
<source>Edit absence</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../absencedialog.cpp" line="65"/>
|
||||||
|
<source>Delete absence</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../absencedialog.cpp" line="74"/>
|
||||||
|
<source>Do you really want to delete the absence?</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>AbsenceWidget</name>
|
<name>AbsenceWidget</name>
|
||||||
@@ -35,27 +60,27 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>AbsencesModel</name>
|
<name>AbsencesModel</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../absencesmodel.cpp" line="65"/>
|
<location filename="../absencesmodel.cpp" line="77"/>
|
||||||
<source>Id</source>
|
<source>Id</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../absencesmodel.cpp" line="66"/>
|
<location filename="../absencesmodel.cpp" line="78"/>
|
||||||
<source>Start</source>
|
<source>Start</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../absencesmodel.cpp" line="67"/>
|
<location filename="../absencesmodel.cpp" line="79"/>
|
||||||
<source>End</source>
|
<source>End</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../absencesmodel.cpp" line="68"/>
|
<location filename="../absencesmodel.cpp" line="80"/>
|
||||||
<source>Hour Category</source>
|
<source>Hour Category</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../absencesmodel.cpp" line="69"/>
|
<location filename="../absencesmodel.cpp" line="81"/>
|
||||||
<source>Text</source>
|
<source>Text</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
Reference in New Issue
Block a user