Labels menu now can change labels. #102
This commit is contained in:
parent
a4de145449
commit
1ca4ded8fb
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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);
|
||||
|
23
src/librssguard/gui/nonclosablemenu.cpp
Normal file
23
src/librssguard/gui/nonclosablemenu.cpp
Normal 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)
|
||||
}
|
19
src/librssguard/gui/nonclosablemenu.h
Normal file
19
src/librssguard/gui/nonclosablemenu.h
Normal 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
|
@ -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 \
|
||||
|
Loading…
x
Reference in New Issue
Block a user