Labels menu now can change labels. #102
This commit is contained in:
parent
a4de145449
commit
1ca4ded8fb
@ -11,9 +11,9 @@
|
|||||||
#include <QKeyEvent>
|
#include <QKeyEvent>
|
||||||
#include <QPainter>
|
#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")));
|
setIcon(qApp->icons()->fromTheme(QSL("tag-folder")));
|
||||||
setTitle(tr("Labels"));
|
|
||||||
|
|
||||||
if (labels.isEmpty()) {
|
if (labels.isEmpty()) {
|
||||||
QAction* act_not_labels = new QAction("No labels found");
|
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) {
|
if (act != nullptr && event->key() == Qt::Key::Key_Space) {
|
||||||
act->toggle();
|
act->toggle();
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
QMenu::keyPressEvent(event);
|
NonClosableMenu::keyPressEvent(event);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void LabelsMenu::mousePressEvent(QMouseEvent* event) {
|
void LabelsMenu::mousePressEvent(QMouseEvent* event) {
|
||||||
@ -63,23 +62,41 @@ void LabelsMenu::mousePressEvent(QMouseEvent* event) {
|
|||||||
if (act != nullptr) {
|
if (act != nullptr) {
|
||||||
act->toggle();
|
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) {
|
void LabelsMenu::addLabelAction(Label* label, Qt::CheckState state) {
|
||||||
Q_UNUSED(event)
|
|
||||||
}
|
|
||||||
|
|
||||||
void LabelsMenu::addLabelAction(const Label* label, Qt::CheckState state) {
|
|
||||||
auto* act = new LabelAction(label, this, this);
|
auto* act = new LabelAction(label, this, this);
|
||||||
|
|
||||||
act->setCheckState(state);
|
act->setCheckState(state);
|
||||||
addAction(act);
|
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) {
|
: QAction(parent), m_label(label), m_parentWidget(parent_widget), m_checkState(Qt::CheckState::Unchecked) {
|
||||||
setText(label->title());
|
setText(label->title());
|
||||||
setIconVisibleInMenu(true);
|
setIconVisibleInMenu(true);
|
||||||
@ -100,7 +117,7 @@ void LabelAction::setCheckState(Qt::CheckState state) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const Label* LabelAction::label() const {
|
Label* LabelAction::label() const {
|
||||||
return m_label;
|
return m_label;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,14 +3,11 @@
|
|||||||
#ifndef LABELSMENU_H
|
#ifndef LABELSMENU_H
|
||||||
#define LABELSMENU_H
|
#define LABELSMENU_H
|
||||||
|
|
||||||
#include <QMenu>
|
#include "gui/nonclosablemenu.h"
|
||||||
#include <QWidgetAction>
|
|
||||||
|
|
||||||
#include "services/abstract/label.h"
|
#include "services/abstract/label.h"
|
||||||
|
|
||||||
class QCheckBox;
|
class LabelsMenu : public NonClosableMenu {
|
||||||
|
|
||||||
class LabelsMenu : public QMenu {
|
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -19,22 +16,30 @@ class LabelsMenu : public QMenu {
|
|||||||
protected:
|
protected:
|
||||||
virtual void keyPressEvent(QKeyEvent* event);
|
virtual void keyPressEvent(QKeyEvent* event);
|
||||||
virtual void mousePressEvent(QMouseEvent* event);
|
virtual void mousePressEvent(QMouseEvent* event);
|
||||||
virtual void mouseReleaseEvent(QMouseEvent* event);
|
|
||||||
|
signals:
|
||||||
|
void labelsChanged();
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void changeLabelAssignment(Qt::CheckState state);
|
||||||
|
|
||||||
private:
|
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 {
|
class LabelAction : public QAction {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit LabelAction(const Label* label, QWidget* parent_widget, QObject* parent);
|
explicit LabelAction(Label* label, QWidget* parent_widget, QObject* parent);
|
||||||
|
|
||||||
Qt::CheckState checkState() const;
|
Qt::CheckState checkState() const;
|
||||||
void setCheckState(Qt::CheckState state);
|
void setCheckState(Qt::CheckState state);
|
||||||
|
|
||||||
const Label* label() const;
|
Label* label() const;
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void toggle();
|
void toggle();
|
||||||
@ -46,7 +51,7 @@ class LabelAction : public QAction {
|
|||||||
void updateActionForState();
|
void updateActionForState();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const Label* m_label;
|
Label* m_label;
|
||||||
QWidget* m_parentWidget;
|
QWidget* m_parentWidget;
|
||||||
Qt::CheckState m_checkState;
|
Qt::CheckState m_checkState;
|
||||||
};
|
};
|
||||||
|
@ -236,6 +236,17 @@ void MessagesView::initializeContextMenu() {
|
|||||||
: QList<Label*>();
|
: QList<Label*>();
|
||||||
LabelsMenu* menu_labels = new LabelsMenu(selected_messages, labels, m_contextMenu);
|
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.
|
// Rest.
|
||||||
m_contextMenu->addMenu(menu_ext_tools);
|
m_contextMenu->addMenu(menu_ext_tools);
|
||||||
m_contextMenu->addMenu(menu_labels);
|
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/messagessearchlineedit.h \
|
||||||
gui/messagestoolbar.h \
|
gui/messagestoolbar.h \
|
||||||
gui/messagesview.h \
|
gui/messagesview.h \
|
||||||
|
gui/nonclosablemenu.h \
|
||||||
gui/plaintoolbutton.h \
|
gui/plaintoolbutton.h \
|
||||||
gui/settings/settingsbrowsermail.h \
|
gui/settings/settingsbrowsermail.h \
|
||||||
gui/settings/settingsdatabase.h \
|
gui/settings/settingsdatabase.h \
|
||||||
@ -226,6 +227,7 @@ SOURCES += core/feeddownloader.cpp \
|
|||||||
gui/messagessearchlineedit.cpp \
|
gui/messagessearchlineedit.cpp \
|
||||||
gui/messagestoolbar.cpp \
|
gui/messagestoolbar.cpp \
|
||||||
gui/messagesview.cpp \
|
gui/messagesview.cpp \
|
||||||
|
gui/nonclosablemenu.cpp \
|
||||||
gui/plaintoolbutton.cpp \
|
gui/plaintoolbutton.cpp \
|
||||||
gui/settings/settingsbrowsermail.cpp \
|
gui/settings/settingsbrowsermail.cpp \
|
||||||
gui/settings/settingsdatabase.cpp \
|
gui/settings/settingsdatabase.cpp \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user