33{
34 QImage image = resource->image();
35 QIcon icon(QPixmap::fromImage(image));
36 QAction *label = new QAction(resource->name(), this);
37 label->setIcon(icon);
38
39 addAction(label);
40
41 QMenu *removableTagsMenu;
42 QMenu *assignableTagsMenu;
43
48
51
53 for (int i = 0; i < tagResourceModel.rowCount(); ++i) {
55 if (!tag.isNull() && tag->valid() && !
isSpecialTag(tag)) {
56 removableTags << tag;
57 }
58 }
59
61 for (
int i = 0; i <
m_tagModel->rowCount(); i++) {
64 if (!tag.isNull() && tag->valid() && !
isSpecialTag(tag)) {
65 assignableTags << tag;
66 }
67 }
68
70
71 bool currentTagInRemovables = !currentlySelectedTag.isNull();
72 currentTagInRemovables = currentTagInRemovables
73 && (std::find_if(removableTags.begin(), removableTags.end(), comparer) != removableTags.end());
74
75 assignableTagsMenu = addMenu(
koIcon(
"list-add"),i18n(
"Assign to tag"));
76
77 if (!removableTags.isEmpty()) {
78 addSeparator();
79 KisTagSP currentTag = currentlySelectedTag;
80
81 if (!currentTag.isNull() && currentTagInRemovables) {
82
83 removableTags.erase(std::remove_if(removableTags.begin(),
84 removableTags.end(),
85 comparer),
86 removableTags.end());
87 assignableTags.erase(std::remove_if(assignableTags.begin(),
88 assignableTags.end(),
89 comparer),
90 assignableTags.end());
91
93 removeTagAction->setText(i18n("Remove from this tag"));
94 removeTagAction->setIcon(
koIcon(
"list-remove"));
95
98 addAction(removeTagAction);
99 }
100
101 if (!removableTags.isEmpty()) {
102 removableTagsMenu = addMenu(
koIcon(
"list-remove"),i18n(
"Remove from other tag"));
103
106 foreach (
const KisTagSP tag, removableTags) {
107
108 if (tag.isNull()) {
109 continue;
110 }
111
112 compareWithRemovable.setReferenceTag(tag);
113 assignableTags.erase(std::remove_if(assignableTags.begin(),
114 assignableTags.end(),
115 compareWithRemovable),
116 assignableTags.end());
117
119
122 removableTagsMenu->addAction(removeTagAction);
123 }
124 }
125
126 }
127
128 foreach (
const KisTagSP &tag, assignableTags) {
129 if (tag.isNull()) {
130 continue;
131 }
132
134
137
138 assignableTagsMenu->addAction(addTagAction);
139 }
140
141 assignableTagsMenu->addSeparator();
142
145
146 assignableTagsMenu->addAction(addNewTagAction);
147
148}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
The CompareWithOtherTagFunctor class defines a comparer for tags.
The KisResourceModel class provides the main access to resources. It is possible to filter the resour...
KisTagSP tagForIndex(QModelIndex index=QModelIndex()) const override
The KisTagResourceModel class makes it possible to retrieve the resources for certain tags or the tag...
The NewTagResourceAction class defines an action that sends a signal with QString and a saved resourc...
The SimpleExistingTagAction class defines an action that holds a resource and a tag.
#define koIcon(name)
Use these macros for icons without any issues.