Added context menu to absences view #82

Merged
0xFEEDC0DE64 merged 1 commits from absence-plugin into master 2018-03-24 17:02:36 +01:00
7 changed files with 147 additions and 20 deletions

View File

@@ -4,6 +4,8 @@
#include <QDate>
#include <QMessageBox>
#include <QStringBuilder>
#include <QMenu>
#include <QAction>
#include "absencesmodel.h"
@@ -21,6 +23,8 @@ AbsenceDialog::AbsenceDialog(int userId, const QDate &date, ZeiterfassungApi &er
ui->treeView->setModel(m_model);
ui->treeView->setEnabled(m_model->enabled());
connect(m_model, &AbsencesModel::enabledChanged, ui->treeView, &QWidget::setEnabled);
connect(ui->treeView, &QWidget::customContextMenuRequested, this, &AbsenceDialog::customContextMenuRequested);
}
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);
}
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
}
}
}
}

View File

@@ -19,6 +19,7 @@ public:
private Q_SLOTS:
void errorOccured(const QString &message);
void customContextMenuRequested(const QPoint &pos);
private:
Ui::AbsenceDialog *ui;

View File

@@ -27,7 +27,11 @@
</widget>
</item>
<item>
<widget class="QTreeView" name="treeView"/>
<widget class="QTreeView" name="treeView">
<property name="contextMenuPolicy">
<enum>Qt::CustomContextMenu</enum>
</property>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">

View File

@@ -7,6 +7,8 @@ AbsencesModel::AbsencesModel(int userId, const QDate &date, ZeiterfassungApi &er
m_userId(userId),
m_erfassung(erfassung)
{
connect(this, &AbsencesModel::dateChanged, this, &AbsencesModel::refresh);
setDate(date);
}
@@ -15,6 +17,16 @@ bool AbsencesModel::enabled() const
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
{
Q_UNUSED(parent)
@@ -76,10 +88,8 @@ QVariant AbsencesModel::headerData(int section, Qt::Orientation orientation, int
return QVariant();
}
void AbsencesModel::setDate(const QDate &date)
void AbsencesModel::refresh()
{
m_date = date;
auto oldEnabled = enabled();
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());
}
void AbsencesModel::setDate(const QDate &date)
{
if(m_date != date)
Q_EMIT dateChanged(m_date = date);
}
void AbsencesModel::finished()
{
if(!m_reply->success())

View File

@@ -13,12 +13,17 @@ class AbsencesModel : public QAbstractListModel
{
Q_OBJECT
Q_PROPERTY(bool enabled READ enabled NOTIFY enabledChanged)
Q_PROPERTY(QDate date READ date WRITE setDate NOTIFY dateChanged)
public:
explicit AbsencesModel(int userId, const QDate &date, ZeiterfassungApi &erfassung, QObject *parent = Q_NULLPTR);
bool enabled() const;
const QDate &date() const;
const QVector<GetAbsencesReply::Absence> &absences() const;
// QAbstractItemModel interface
int rowCount(const QModelIndex &parent) const Q_DECL_OVERRIDE;
int columnCount(const QModelIndex &parent) const Q_DECL_OVERRIDE;
@@ -27,9 +32,11 @@ public:
Q_SIGNALS:
void enabledChanged(bool enabled);
void dateChanged(const QDate &date);
void errorOccured(const QString &message);
public Q_SLOTS:
void refresh();
void setDate(const QDate &date);
private Q_SLOTS:

View File

@@ -9,20 +9,45 @@
<translation>Abwesenheiten</translation>
</message>
<message>
<location filename="../absencedialog.cpp" line="16"/>
<location filename="../absencedialog.cpp" line="18"/>
<source>Absences for %0</source>
<translation>Abwesenheiten für %0</translation>
</message>
<message>
<location filename="../absencedialog.cpp" line="16"/>
<location filename="../absencedialog.cpp" line="18"/>
<source>dd.MM.yyyy</source>
<translation>dd.MM.yyyy</translation>
</message>
<message>
<location filename="../absencedialog.cpp" line="33"/>
<location filename="../absencedialog.cpp" line="37"/>
<source>Could not load absences!</source>
<translation>Konnte Abwesenheiten nicht laden!</translation>
</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>
<name>AbsenceWidget</name>
@@ -35,27 +60,27 @@
<context>
<name>AbsencesModel</name>
<message>
<location filename="../absencesmodel.cpp" line="65"/>
<location filename="../absencesmodel.cpp" line="77"/>
<source>Id</source>
<translation>Id</translation>
</message>
<message>
<location filename="../absencesmodel.cpp" line="66"/>
<location filename="../absencesmodel.cpp" line="78"/>
<source>Start</source>
<translation>Start</translation>
</message>
<message>
<location filename="../absencesmodel.cpp" line="67"/>
<location filename="../absencesmodel.cpp" line="79"/>
<source>End</source>
<translation>Ende</translation>
</message>
<message>
<location filename="../absencesmodel.cpp" line="68"/>
<location filename="../absencesmodel.cpp" line="80"/>
<source>Hour Category</source>
<translation>Stunden Kategorie</translation>
</message>
<message>
<location filename="../absencesmodel.cpp" line="69"/>
<location filename="../absencesmodel.cpp" line="81"/>
<source>Text</source>
<translation>Text</translation>
</message>

View File

@@ -9,20 +9,45 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../absencedialog.cpp" line="16"/>
<location filename="../absencedialog.cpp" line="18"/>
<source>Absences for %0</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../absencedialog.cpp" line="16"/>
<location filename="../absencedialog.cpp" line="18"/>
<source>dd.MM.yyyy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../absencedialog.cpp" line="33"/>
<location filename="../absencedialog.cpp" line="37"/>
<source>Could not load absences!</source>
<translation type="unfinished"></translation>
</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>
<name>AbsenceWidget</name>
@@ -35,27 +60,27 @@
<context>
<name>AbsencesModel</name>
<message>
<location filename="../absencesmodel.cpp" line="65"/>
<location filename="../absencesmodel.cpp" line="77"/>
<source>Id</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../absencesmodel.cpp" line="66"/>
<location filename="../absencesmodel.cpp" line="78"/>
<source>Start</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../absencesmodel.cpp" line="67"/>
<location filename="../absencesmodel.cpp" line="79"/>
<source>End</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../absencesmodel.cpp" line="68"/>
<location filename="../absencesmodel.cpp" line="80"/>
<source>Hour Category</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../absencesmodel.cpp" line="69"/>
<location filename="../absencesmodel.cpp" line="81"/>
<source>Text</source>
<translation type="unfinished"></translation>
</message>