Labels menu now can change labels. #102

This commit is contained in:
Martin Rotter 2020-11-01 19:57:14 +01:00
parent a4de145449
commit 1ca4ded8fb
6 changed files with 101 additions and 24 deletions

View File

@ -11,9 +11,9 @@
#include <QKeyEvent>
#include <QPainter>
LabelsMenu::LabelsMenu(const QList<Message>& messages, const QList<Label*>& labels, QWidget* parent) : QMenu(parent) {
LabelsMenu::LabelsMenu(const QList<Message>& messages, const QList<Label*>& labels, QWidget* parent)
: NonClosableMenu(tr("Labels"), parent), m_messages(messages) {
setIcon(qApp->icons()->fromTheme(QSL("tag-folder")));
setTitle(tr("Labels"));
if (labels.isEmpty()) {
QAction* act_not_labels = new QAction("No labels found");
@ -52,9 +52,8 @@ void LabelsMenu::keyPressEvent(QKeyEvent* event) {
if (act != nullptr && event->key() == Qt::Key::Key_Space) {
act->toggle();
}
else {
QMenu::keyPressEvent(event);
}
NonClosableMenu::keyPressEvent(event);
}
void LabelsMenu::mousePressEvent(QMouseEvent* event) {
@ -63,23 +62,41 @@ void LabelsMenu::mousePressEvent(QMouseEvent* event) {
if (act != nullptr) {
act->toggle();
}
else {
QMenu::mousePressEvent(event);
NonClosableMenu::mousePressEvent(event);
}
void LabelsMenu::changeLabelAssignment(Qt::CheckState state) {
LabelAction* origin = qobject_cast<LabelAction*>(sender());
if (origin != nullptr) {
if (state == Qt::CheckState::Checked) {
// Assign this label to selected messages.
for (const auto& msg : m_messages) {
origin->label()->assignToMessage(msg);
}
}
else if (state == Qt::CheckState::Unchecked) {
// Remove label from selected messages.
for (const auto& msg : m_messages) {
origin->label()->deassignFromMessage(msg);
}
}
}
emit labelsChanged();
}
void LabelsMenu::mouseReleaseEvent(QMouseEvent* event) {
Q_UNUSED(event)
}
void LabelsMenu::addLabelAction(const Label* label, Qt::CheckState state) {
void LabelsMenu::addLabelAction(Label* label, Qt::CheckState state) {
auto* act = new LabelAction(label, this, this);
act->setCheckState(state);
addAction(act);
connect(act, &LabelAction::checkStateChanged, this, &LabelsMenu::changeLabelAssignment);
}
LabelAction::LabelAction(const Label* label, QWidget* parent_widget, QObject* parent)
LabelAction::LabelAction(Label* label, QWidget* parent_widget, QObject* parent)
: QAction(parent), m_label(label), m_parentWidget(parent_widget), m_checkState(Qt::CheckState::Unchecked) {
setText(label->title());
setIconVisibleInMenu(true);
@ -100,7 +117,7 @@ void LabelAction::setCheckState(Qt::CheckState state) {
}
}
const Label* LabelAction::label() const {
Label* LabelAction::label() const {
return m_label;
}

View File

@ -3,14 +3,11 @@
#ifndef LABELSMENU_H
#define LABELSMENU_H
#include <QMenu>
#include <QWidgetAction>
#include "gui/nonclosablemenu.h"
#include "services/abstract/label.h"
class QCheckBox;
class LabelsMenu : public QMenu {
class LabelsMenu : public NonClosableMenu {
Q_OBJECT
public:
@ -19,22 +16,30 @@ class LabelsMenu : public QMenu {
protected:
virtual void keyPressEvent(QKeyEvent* event);
virtual void mousePressEvent(QMouseEvent* event);
virtual void mouseReleaseEvent(QMouseEvent* event);
signals:
void labelsChanged();
private slots:
void changeLabelAssignment(Qt::CheckState state);
private:
void addLabelAction(const Label* label, Qt::CheckState state);
void addLabelAction(Label* label, Qt::CheckState state);
private:
QList<Message> m_messages;
};
class LabelAction : public QAction {
Q_OBJECT
public:
explicit LabelAction(const Label* label, QWidget* parent_widget, QObject* parent);
explicit LabelAction(Label* label, QWidget* parent_widget, QObject* parent);
Qt::CheckState checkState() const;
void setCheckState(Qt::CheckState state);
const Label* label() const;
Label* label() const;
public slots:
void toggle();
@ -46,7 +51,7 @@ class LabelAction : public QAction {
void updateActionForState();
private:
const Label* m_label;
Label* m_label;
QWidget* m_parentWidget;
Qt::CheckState m_checkState;
};

View File

@ -236,6 +236,17 @@ void MessagesView::initializeContextMenu() {
: QList<Label*>();
LabelsMenu* menu_labels = new LabelsMenu(selected_messages, labels, m_contextMenu);
connect(menu_labels, &LabelsMenu::labelsChanged, this, [this]() {
QModelIndex current_index = selectionModel()->currentIndex();
if (current_index.isValid()) {
emit currentMessageChanged(m_sourceModel->messageAt(m_proxyModel->mapToSource(current_index).row()), m_sourceModel->loadedItem());
}
else {
emit currentMessageRemoved();
}
});
// Rest.
m_contextMenu->addMenu(menu_ext_tools);
m_contextMenu->addMenu(menu_labels);

View File

@ -0,0 +1,23 @@
// For license of this file, see <project-root-folder>/LICENSE.md.
#include "gui/nonclosablemenu.h"
#include <QKeyEvent>
NonClosableMenu::NonClosableMenu(QWidget* parent) : QMenu(parent) {}
NonClosableMenu::NonClosableMenu(const QString& title, QWidget* parent) : QMenu(title, parent) {}
void NonClosableMenu::keyPressEvent(QKeyEvent* event) {
if (event->key() != Qt::Key::Key_Space) {
QMenu::keyPressEvent(event);
}
}
void NonClosableMenu::mousePressEvent(QMouseEvent* event) {
Q_UNUSED(event)
}
void NonClosableMenu::mouseReleaseEvent(QMouseEvent* event) {
Q_UNUSED(event)
}

View File

@ -0,0 +1,19 @@
// For license of this file, see <project-root-folder>/LICENSE.md.
#include <QMenu>
#ifndef NONCLOSABLEMENU_H
#define NONCLOSABLEMENU_H
class NonClosableMenu : public QMenu {
public:
explicit NonClosableMenu(QWidget* parent = nullptr);
explicit NonClosableMenu(const QString& title, QWidget* parent = nullptr);
protected:
virtual void keyPressEvent(QKeyEvent* event);
virtual void mousePressEvent(QMouseEvent* event);
virtual void mouseReleaseEvent(QMouseEvent* event);
};
#endif // NONCLOSABLEMENU_H

View File

@ -74,6 +74,7 @@ HEADERS += core/feeddownloader.h \
gui/messagessearchlineedit.h \
gui/messagestoolbar.h \
gui/messagesview.h \
gui/nonclosablemenu.h \
gui/plaintoolbutton.h \
gui/settings/settingsbrowsermail.h \
gui/settings/settingsdatabase.h \
@ -226,6 +227,7 @@ SOURCES += core/feeddownloader.cpp \
gui/messagessearchlineedit.cpp \
gui/messagestoolbar.cpp \
gui/messagesview.cpp \
gui/nonclosablemenu.cpp \
gui/plaintoolbutton.cpp \
gui/settings/settingsbrowsermail.cpp \
gui/settings/settingsdatabase.cpp \