Added context menu to absences view #82
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -19,6 +19,7 @@ public:
|
||||
|
||||
private Q_SLOTS:
|
||||
void errorOccured(const QString &message);
|
||||
void customContextMenuRequested(const QPoint &pos);
|
||||
|
||||
private:
|
||||
Ui::AbsenceDialog *ui;
|
||||
|
@@ -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">
|
||||
|
@@ -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())
|
||||
|
@@ -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:
|
||||
|
@@ -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>
|
||||
|
@@ -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>
|
||||
|
Reference in New Issue
Block a user