qBittorrent
TagFilterWidget Class Referencefinal

#include <tagfilterwidget.h>

Inheritance diagram for TagFilterWidget:
Collaboration diagram for TagFilterWidget:

Signals

void tagChanged (const QString &tag)
 
void actionResumeTorrentsTriggered ()
 
void actionPauseTorrentsTriggered ()
 
void actionDeleteTorrentsTriggered ()
 

Public Member Functions

 TagFilterWidget (QWidget *parent=nullptr)
 
QString currentTag () const
 

Private Slots

void onCurrentRowChanged (const QModelIndex &current, const QModelIndex &previous)
 
void showMenu (QPoint)
 
void callUpdateGeometry ()
 
void addTag ()
 
void removeTag ()
 
void removeUnusedTags ()
 

Private Member Functions

QSize sizeHint () const override
 
QSize minimumSizeHint () const override
 
void rowsInserted (const QModelIndex &parent, int start, int end) override
 
QString askTagName ()
 

Detailed Description

Definition at line 33 of file tagfilterwidget.h.

Constructor & Destructor Documentation

◆ TagFilterWidget()

TagFilterWidget::TagFilterWidget ( QWidget *  parent = nullptr)
explicit

Definition at line 58 of file tagfilterwidget.cpp.

59  : QTreeView(parent)
60 {
61  auto *proxyModel = new TagFilterProxyModel(this);
62  proxyModel->setSortCaseSensitivity(Qt::CaseInsensitive);
63  proxyModel->setSourceModel(new TagFilterModel(this));
64  setModel(proxyModel);
65  setFrameShape(QFrame::NoFrame);
66  setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
67  setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
68  setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
69  setUniformRowHeights(true);
70  setHeaderHidden(true);
71  setIconSize(Utils::Gui::smallIconSize());
72 #if defined(Q_OS_MACOS)
73  setAttribute(Qt::WA_MacShowFocusRect, false);
74 #endif
75  setIndentation(0);
76  setContextMenuPolicy(Qt::CustomContextMenu);
77  sortByColumn(0, Qt::AscendingOrder);
78  setCurrentIndex(model()->index(0, 0));
79 
80  connect(this, &TagFilterWidget::collapsed, this, &TagFilterWidget::callUpdateGeometry);
81  connect(this, &TagFilterWidget::expanded, this, &TagFilterWidget::callUpdateGeometry);
82  connect(this, &TagFilterWidget::customContextMenuRequested, this, &TagFilterWidget::showMenu);
83  connect(selectionModel(), &QItemSelectionModel::currentRowChanged, this
85  connect(model(), &QAbstractItemModel::modelReset, this, &TagFilterWidget::callUpdateGeometry);
86 }
void onCurrentRowChanged(const QModelIndex &current, const QModelIndex &previous)
void showMenu(QPoint)
QSize smallIconSize(const QWidget *widget=nullptr)
Definition: utils.cpp:97

References callUpdateGeometry(), onCurrentRowChanged(), showMenu(), and Utils::Gui::smallIconSize().

Here is the call graph for this function:

Member Function Documentation

◆ actionDeleteTorrentsTriggered

void TagFilterWidget::actionDeleteTorrentsTriggered ( )
signal

Referenced by showMenu(), and TransferListFiltersWidget::TransferListFiltersWidget().

Here is the caller graph for this function:

◆ actionPauseTorrentsTriggered

void TagFilterWidget::actionPauseTorrentsTriggered ( )
signal

Referenced by showMenu(), and TransferListFiltersWidget::TransferListFiltersWidget().

Here is the caller graph for this function:

◆ actionResumeTorrentsTriggered

void TagFilterWidget::actionResumeTorrentsTriggered ( )
signal

Referenced by showMenu(), and TransferListFiltersWidget::TransferListFiltersWidget().

Here is the caller graph for this function:

◆ addTag

void TagFilterWidget::addTag ( )
privateslot

Definition at line 187 of file tagfilterwidget.cpp.

188 {
189  const QString tag = askTagName();
190  if (tag.isEmpty()) return;
191 
192  if (BitTorrent::Session::instance()->tags().contains(tag))
193  QMessageBox::warning(this, tr("Tag exists"), tr("Tag name already exists."));
194  else
196 }
static Session * instance()
Definition: session.cpp:997
bool addTag(const QString &tag)
Definition: session.cpp:839

References BitTorrent::Session::addTag(), askTagName(), and BitTorrent::Session::instance().

Referenced by showMenu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ askTagName()

QString TagFilterWidget::askTagName ( )
private

Definition at line 162 of file tagfilterwidget.cpp.

163 {
164  bool ok = false;
165  QString tag = "";
166  bool invalid = true;
167  while (invalid)
168  {
169  invalid = false;
171  this, tr("New Tag"), tr("Tag:"), QLineEdit::Normal, tag, &ok).trimmed();
172  if (ok && !tag.isEmpty())
173  {
175  {
176  QMessageBox::warning(
177  this, tr("Invalid tag name")
178  , tr("Tag name '%1' is invalid").arg(tag));
179  invalid = true;
180  }
181  }
182  }
183 
184  return ok ? tag : QString();
185 }
static QString getText(QWidget *parent, const QString &title, const QString &label, QLineEdit::EchoMode mode=QLineEdit::Normal, const QString &text={}, bool *ok=nullptr, bool excludeExtension=false, Qt::InputMethodHints inputMethodHints=Qt::ImhNone)
static bool isValidTag(const QString &tag)
Definition: session.cpp:829

References AutoExpandableDialog::getText(), and BitTorrent::Session::isValidTag().

Referenced by addTag().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ callUpdateGeometry

void TagFilterWidget::callUpdateGeometry ( )
privateslot

Definition at line 133 of file tagfilterwidget.cpp.

134 {
135  updateGeometry();
136 }

Referenced by TagFilterWidget().

Here is the caller graph for this function:

◆ currentTag()

QString TagFilterWidget::currentTag ( ) const

Definition at line 88 of file tagfilterwidget.cpp.

89 {
90  QModelIndex current;
91  const auto selectedRows = selectionModel()->selectedRows();
92  if (!selectedRows.isEmpty())
93  current = selectedRows.first();
94 
95  return getTagFilter(static_cast<TagFilterProxyModel *>(model()), current);
96 }
QString getTagFilter(const TagFilterProxyModel *const model, const QModelIndex &index)

References anonymous_namespace{tagfilterwidget.cpp}::getTagFilter().

Referenced by TransferListFiltersWidget::toggleTagFilter().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ minimumSizeHint()

QSize TagFilterWidget::minimumSizeHint ( ) const
overrideprivate

Definition at line 149 of file tagfilterwidget.cpp.

150 {
151  QSize size = sizeHint();
152  size.setWidth(6);
153  return size;
154 }
QSize sizeHint() const override

References sizeHint().

Here is the call graph for this function:

◆ onCurrentRowChanged

void TagFilterWidget::onCurrentRowChanged ( const QModelIndex &  current,
const QModelIndex &  previous 
)
privateslot

Definition at line 98 of file tagfilterwidget.cpp.

99 {
100  Q_UNUSED(previous);
101 
102  emit tagChanged(getTagFilter(static_cast<TagFilterProxyModel *>(model()), current));
103 }
void tagChanged(const QString &tag)

References anonymous_namespace{tagfilterwidget.cpp}::getTagFilter(), and tagChanged().

Referenced by TagFilterWidget().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ removeTag

void TagFilterWidget::removeTag ( )
privateslot

Definition at line 198 of file tagfilterwidget.cpp.

199 {
200  const auto selectedRows = selectionModel()->selectedRows();
201  if (!selectedRows.empty() && !TagFilterModel::isSpecialItem(selectedRows.first()))
202  {
204  static_cast<TagFilterProxyModel *>(model())->tag(selectedRows.first()));
205  updateGeometry();
206  }
207 }
bool removeTag(const QString &tag)
Definition: session.cpp:850
static bool isSpecialItem(const QModelIndex &index)

References BitTorrent::Session::instance(), TagFilterModel::isSpecialItem(), and BitTorrent::Session::removeTag().

Referenced by showMenu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ removeUnusedTags

void TagFilterWidget::removeUnusedTags ( )
privateslot

Definition at line 209 of file tagfilterwidget.cpp.

210 {
211  auto session = BitTorrent::Session::instance();
212  for (const QString &tag : asConst(session->tags()))
213  if (model()->data(static_cast<TagFilterProxyModel *>(model())->index(tag), Qt::UserRole) == 0)
214  session->removeTag(tag);
215  updateGeometry();
216 }
constexpr std::add_const_t< T > & asConst(T &t) noexcept
Definition: global.h:42

References asConst(), and BitTorrent::Session::instance().

Referenced by showMenu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ rowsInserted()

void TagFilterWidget::rowsInserted ( const QModelIndex &  parent,
int  start,
int  end 
)
overrideprivate

Definition at line 156 of file tagfilterwidget.cpp.

157 {
158  QTreeView::rowsInserted(parent, start, end);
159  updateGeometry();
160 }

◆ showMenu

void TagFilterWidget::showMenu ( QPoint  )
privateslot

Definition at line 105 of file tagfilterwidget.cpp.

106 {
107  QMenu *menu = new QMenu(this);
108  menu->setAttribute(Qt::WA_DeleteOnClose);
109 
110  menu->addAction(UIThemeManager::instance()->getIcon("list-add"), tr("Add tag...")
111  , this, &TagFilterWidget::addTag);
112 
113  const auto selectedRows = selectionModel()->selectedRows();
114  if (!selectedRows.empty() && !TagFilterModel::isSpecialItem(selectedRows.first()))
115  {
116  menu->addAction(UIThemeManager::instance()->getIcon("list-remove"), tr("Remove tag")
117  , this, &TagFilterWidget::removeTag);
118  }
119 
120  menu->addAction(UIThemeManager::instance()->getIcon("list-remove"), tr("Remove unused tags")
122  menu->addSeparator();
123  menu->addAction(UIThemeManager::instance()->getIcon("media-playback-start"), tr("Resume torrents")
125  menu->addAction(UIThemeManager::instance()->getIcon("media-playback-pause"), tr("Pause torrents")
127  menu->addAction(UIThemeManager::instance()->getIcon("edit-delete"), tr("Delete torrents")
129 
130  menu->popup(QCursor::pos());
131 }
void actionPauseTorrentsTriggered()
void actionResumeTorrentsTriggered()
void actionDeleteTorrentsTriggered()
static UIThemeManager * instance()

References actionDeleteTorrentsTriggered(), actionPauseTorrentsTriggered(), actionResumeTorrentsTriggered(), addTag(), UIThemeManager::instance(), TagFilterModel::isSpecialItem(), removeTag(), and removeUnusedTags().

Referenced by TagFilterWidget().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ sizeHint()

QSize TagFilterWidget::sizeHint ( ) const
overrideprivate

Definition at line 138 of file tagfilterwidget.cpp.

139 {
140  return
141  {
142  // Width should be exactly the width of the content
143  sizeHintForColumn(0),
144  // Height should be exactly the height of the content
145  static_cast<int>(sizeHintForRow(0) * (model()->rowCount() + 0.5)),
146  };
147 }

Referenced by minimumSizeHint().

Here is the caller graph for this function:

◆ tagChanged

void TagFilterWidget::tagChanged ( const QString &  tag)
signal

Referenced by onCurrentRowChanged(), and TransferListFiltersWidget::TransferListFiltersWidget().

Here is the caller graph for this function:

The documentation for this class was generated from the following files: