31
31
#include "abstractsemanticinfobackend.h"
36
36
struct TagModelPrivate {
37
AbstractSemanticInfoBackEnd* mBackEnd;
37
AbstractSemanticInfoBackEnd* mBackEnd;
41
static QStandardItem* createItem(const SemanticInfoTag& tag, const QString& label, TagModel::AssignmentStatus status) {
42
QStandardItem* item = new QStandardItem(label);
43
item->setData(tag, TagModel::TagRole);
44
item->setData(label.toLower(), TagModel::SortRole);
45
item->setData(status, TagModel::AssignmentStatusRole);
46
item->setData(KIcon("mail-tagged.png"), Qt::DecorationRole);
40
static QStandardItem* createItem(const SemanticInfoTag& tag, const QString& label, TagModel::AssignmentStatus status)
42
QStandardItem* item = new QStandardItem(label);
43
item->setData(tag, TagModel::TagRole);
44
item->setData(label.toLower(), TagModel::SortRole);
45
item->setData(status, TagModel::AssignmentStatusRole);
46
item->setData(KIcon("mail-tagged.png"), Qt::DecorationRole);
51
50
TagModel::TagModel(QObject* parent)
52
51
: QStandardItemModel(parent)
53
, d(new TagModelPrivate) {
55
setSortRole(SortRole);
59
TagModel::~TagModel() {
64
void TagModel::setSemanticInfoBackEnd(AbstractSemanticInfoBackEnd* backEnd) {
65
d->mBackEnd = backEnd;
69
void TagModel::setTagSet(const TagSet& set) {
71
Q_FOREACH(const SemanticInfoTag& tag, set) {
72
QString label = d->mBackEnd->labelForTag(tag);
73
QStandardItem* item = createItem(tag, label, TagModel::FullyAssigned);
80
void TagModel::addTag(const SemanticInfoTag& tag, const QString& _label, TagModel::AssignmentStatus status) {
82
QString label = _label.isEmpty() ? d->mBackEnd->labelForTag(tag) : _label;
84
const QString sortLabel = label.toLower();
85
// This is not optimal, implement dichotomic search if necessary
86
for (row=0; row < rowCount(); ++row) {
87
const QModelIndex idx = index(row, 0);
88
if (idx.data(SortRole).toString().compare(sortLabel) > 0) {
93
QStandardItem* _item = item(row - 1);
95
if (_item->data(TagRole).toString() == tag) {
97
_item->setData(label.toLower(), SortRole);
98
_item->setData(status, AssignmentStatusRole);
102
QStandardItem* _item = createItem(tag, label, status);
103
insertRow(row, _item);
107
void TagModel::removeTag(const SemanticInfoTag& tag) {
108
// This is not optimal, implement dichotomic search if necessary
109
for (int row=0; row < rowCount(); ++row) {
110
if (index(row, 0).data(TagRole).toString() == tag) {
118
TagModel* TagModel::createAllTagsModel(QObject* parent, AbstractSemanticInfoBackEnd* backEnd) {
119
TagModel* tagModel = new TagModel(parent);
120
tagModel->setSemanticInfoBackEnd(backEnd);
121
tagModel->setTagSet(backEnd->allTags());
122
connect(backEnd, SIGNAL(tagAdded(const SemanticInfoTag&, const QString&)),
123
tagModel, SLOT(addTag(const SemanticInfoTag&, const QString&)));
52
, d(new TagModelPrivate)
55
setSortRole(SortRole);
63
void TagModel::setSemanticInfoBackEnd(AbstractSemanticInfoBackEnd* backEnd)
65
d->mBackEnd = backEnd;
68
void TagModel::setTagSet(const TagSet& set)
71
Q_FOREACH(const SemanticInfoTag & tag, set) {
72
QString label = d->mBackEnd->labelForTag(tag);
73
QStandardItem* item = createItem(tag, label, TagModel::FullyAssigned);
79
void TagModel::addTag(const SemanticInfoTag& tag, const QString& _label, TagModel::AssignmentStatus status)
82
QString label = _label.isEmpty() ? d->mBackEnd->labelForTag(tag) : _label;
84
const QString sortLabel = label.toLower();
85
// This is not optimal, implement dichotomic search if necessary
86
for (row = 0; row < rowCount(); ++row) {
87
const QModelIndex idx = index(row, 0);
88
if (idx.data(SortRole).toString().compare(sortLabel) > 0) {
93
QStandardItem* _item = item(row - 1);
95
if (_item->data(TagRole).toString() == tag) {
97
_item->setData(label.toLower(), SortRole);
98
_item->setData(status, AssignmentStatusRole);
102
QStandardItem* _item = createItem(tag, label, status);
103
insertRow(row, _item);
106
void TagModel::removeTag(const SemanticInfoTag& tag)
108
// This is not optimal, implement dichotomic search if necessary
109
for (int row = 0; row < rowCount(); ++row) {
110
if (index(row, 0).data(TagRole).toString() == tag) {
117
TagModel* TagModel::createAllTagsModel(QObject* parent, AbstractSemanticInfoBackEnd* backEnd)
119
TagModel* tagModel = new TagModel(parent);
120
tagModel->setSemanticInfoBackEnd(backEnd);
121
tagModel->setTagSet(backEnd->allTags());
122
connect(backEnd, SIGNAL(tagAdded(SemanticInfoTag, QString)),
123
tagModel, SLOT(addTag(SemanticInfoTag, QString)));