diff --git a/src/librssguard/gui/labelsmenu.cpp b/src/librssguard/gui/labelsmenu.cpp index c0c3b084a..df944bb9d 100644 --- a/src/librssguard/gui/labelsmenu.cpp +++ b/src/librssguard/gui/labelsmenu.cpp @@ -11,9 +11,9 @@ #include #include -LabelsMenu::LabelsMenu(const QList& messages, const QList& labels, QWidget* parent) : QMenu(parent) { +LabelsMenu::LabelsMenu(const QList& messages, const QList& 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(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; } diff --git a/src/librssguard/gui/labelsmenu.h b/src/librssguard/gui/labelsmenu.h index d8fe6c13c..27d545a46 100644 --- a/src/librssguard/gui/labelsmenu.h +++ b/src/librssguard/gui/labelsmenu.h @@ -3,14 +3,11 @@ #ifndef LABELSMENU_H #define LABELSMENU_H -#include -#include +#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 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; }; diff --git a/src/librssguard/gui/messagesview.cpp b/src/librssguard/gui/messagesview.cpp index ff20e37d4..3fd57948c 100644 --- a/src/librssguard/gui/messagesview.cpp +++ b/src/librssguard/gui/messagesview.cpp @@ -236,6 +236,17 @@ void MessagesView::initializeContextMenu() { : QList(); 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); diff --git a/src/librssguard/gui/nonclosablemenu.cpp b/src/librssguard/gui/nonclosablemenu.cpp new file mode 100644 index 000000000..c15b883ee --- /dev/null +++ b/src/librssguard/gui/nonclosablemenu.cpp @@ -0,0 +1,23 @@ +// For license of this file, see /LICENSE.md. + +#include "gui/nonclosablemenu.h" + +#include + +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) +} diff --git a/src/librssguard/gui/nonclosablemenu.h b/src/librssguard/gui/nonclosablemenu.h new file mode 100644 index 000000000..2282313ef --- /dev/null +++ b/src/librssguard/gui/nonclosablemenu.h @@ -0,0 +1,19 @@ +// For license of this file, see /LICENSE.md. + +#include + +#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 diff --git a/src/librssguard/librssguard.pro b/src/librssguard/librssguard.pro index ddabb39af..839d6d970 100644 --- a/src/librssguard/librssguard.pro +++ b/src/librssguard/librssguard.pro @@ -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 \