LeechCraft  0.6.70-18450-gabe19ee3b0
Modular cross-platform feature rich live environment.
tagsfiltermodel.cpp
Go to the documentation of this file.
1 /**********************************************************************
2  * LeechCraft - modular cross-platform feature rich internet client.
3  * Copyright (C) 2006-2014 Georg Rudoy
4  *
5  * Distributed under the Boost Software License, Version 1.0.
6  * (See accompanying file LICENSE or copy at https://www.boost.org/LICENSE_1_0.txt)
7  **********************************************************************/
8 
9 #include "tagsfiltermodel.h"
10 #include <QRegularExpression>
11 #include <QStringList>
12 #include <util/sll/unreachable.h>
13 #include "util.h"
14 
15 namespace LC::Util
16 {
18  : FixedStringFilterProxyModel { parent }
19  , Separator_ { GetDefaultTagsSeparator () }
20  {
21  }
22 
23  void TagsFilterModel::SetFilterString (const QString& string)
24  {
25  FilterTags_.clear ();
26  for (const auto& s : string.split (Separator_, Qt::SkipEmptyParts))
27  FilterTags_ << s.trimmed ();
28 
30  }
31 
33  {
34  TagsRole_ = role;
35  invalidateFilter ();
36  }
37 
38  void TagsFilterModel::SetSeparator (const QString& separator)
39  {
40  Separator_ = separator;
41  invalidateFilter ();
42  }
43 
45  {
46  TagsMode_ = mode;
47  invalidateFilter ();
48  }
49 
51  {
52  NormalMode_ = !tags;
53  invalidateFilter ();
54  }
55 
56  bool TagsFilterModel::filterAcceptsRow (int sourceRow, const QModelIndex& index) const
57  {
58  if (NormalMode_)
59  return FixedStringFilterProxyModel::filterAcceptsRow (sourceRow, index);
60 
61  return FilterTagsMode (sourceRow, index);
62  }
63 
64  QStringList TagsFilterModel::GetTagsForIndex (int row) const
65  {
66  if (TagsRole_ < 0)
67  throw std::runtime_error { "no tags role for the default TagsFilterModel::GetTagsForIndex() implementation" };
68 
69  const auto model = sourceModel ();
70  if (!model)
71  return {};
72 
73  return model->index (row, 0).data (TagsRole_).toStringList ();
74  }
75 
76  bool TagsFilterModel::FilterTagsMode (int sourceRow, const QModelIndex&) const
77  {
78  if (FilterTags_.isEmpty ())
79  return true;
80 
81  const auto& itemTags = GetTagsForIndex (sourceRow);
82  const auto hasTag = [&] (const QString& tag) { return itemTags.contains (tag); };
83  switch (TagsMode_)
84  {
86  return std::ranges::any_of (FilterTags_, hasTag);
88  return std::ranges::all_of (FilterTags_, hasTag);
89  }
90 
91  Unreachable ();
92  }
93 }
QString GetDefaultTagsSeparator()
Definition: util.cpp:14
void SetSeparator(const QString &separator)
Sets the separator for the tags.
void SetTagsMode(bool enabled)
Sets whether the tags filtering mode is enabled.
void SetTagsInclusionMode(TagsInclusionMode mode)
Sets the tags inclusion mode.
TagsFilterModel(QObject *parent=nullptr)
Creates the model with the given parent.
void Unreachable()
Definition: unreachable.h:15
Filter string tags should be a subset of row tags.
bool filterAcceptsRow(int row, const QModelIndex &parent) const override
virtual QStringList GetTagsForIndex(int row) const
Returns the list of tags for the given row.
Tags intersection should be non-empty.
void SetFilterString(const QString &) override
TagsInclusionMode
Describes the modes of matching two sets of tags.
bool filterAcceptsRow(int, const QModelIndex &) const override
Reimplemented from QSortFilterProxyModel::filterAcceptsRow().