Messagelib

remotecontentconfigurewidget.cpp
1 /*
2  SPDX-FileCopyrightText: 2020-2023 Laurent Montel <[email protected]>
3 
4  SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6 
7 #include "remotecontentconfigurewidget.h"
8 #include "remotecontentdialog.h"
9 #include "remotecontentmanager.h"
10 #include "remotecontentstatustypecombobox.h"
11 #include <KLocalizedString>
12 #include <KMessageBox>
13 #include <KTreeWidgetSearchLine>
14 #include <QHeaderView>
15 #include <QMenu>
16 #include <QPointer>
17 #include <QTreeWidget>
18 #include <QVBoxLayout>
19 
20 using namespace MessageViewer;
21 
22 RemoteContentWidgetItem::RemoteContentWidgetItem(QTreeWidget *parent)
23  : QTreeWidgetItem(parent)
24  , mStatusTypeCombobox(new RemoteContentStatusTypeComboBox)
25 {
26  treeWidget()->setItemWidget(this, ColumnType::RuleType, mStatusTypeCombobox);
27 }
28 
29 RemoteContentWidgetItem::~RemoteContentWidgetItem() = default;
30 
31 void RemoteContentWidgetItem::setStatus(MessageViewer::RemoteContentInfo::RemoteContentInfoStatus type)
32 {
33  mStatusTypeCombobox->setStatus(type);
34 }
35 
36 RemoteContentInfo::RemoteContentInfoStatus RemoteContentWidgetItem::status() const
37 {
38  return mStatusTypeCombobox->status();
39 }
40 
41 RemoteContentConfigureWidget::RemoteContentConfigureWidget(QWidget *parent)
42  : QWidget(parent)
43  , mTreeWidget(new QTreeWidget(this))
44 {
45  auto mainLayout = new QVBoxLayout(this);
46  mainLayout->setObjectName(QStringLiteral("mainLayout"));
47  mainLayout->setContentsMargins({});
48 
49  mTreeWidget->setObjectName(QStringLiteral("treewidget"));
50  mTreeWidget->setRootIsDecorated(false);
51  mTreeWidget->setHeaderLabels({i18n("Domain"), i18n("Status")});
52  mTreeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
53  mTreeWidget->setAlternatingRowColors(true);
54  mTreeWidget->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
55 
56  auto searchLineEdit = new KTreeWidgetSearchLine(this, mTreeWidget);
57  searchLineEdit->setObjectName(QStringLiteral("searchlineedit"));
58  searchLineEdit->setClearButtonEnabled(true);
59  mainLayout->addWidget(searchLineEdit);
60 
61  mainLayout->addWidget(mTreeWidget);
62  connect(mTreeWidget, &QTreeWidget::customContextMenuRequested, this, &RemoteContentConfigureWidget::slotCustomContextMenuRequested);
63  connect(mTreeWidget, &QTreeWidget::itemDoubleClicked, this, [this](QTreeWidgetItem *item) {
64  if (item) {
65  auto rulesItem = static_cast<RemoteContentWidgetItem *>(item);
66  modifyRemoteContent(rulesItem);
67  }
68  });
69  readSettings();
70 }
71 
72 RemoteContentConfigureWidget::~RemoteContentConfigureWidget() = default;
73 
74 void RemoteContentConfigureWidget::slotCustomContextMenuRequested(const QPoint &pos)
75 {
76  QTreeWidgetItem *item = mTreeWidget->itemAt(pos);
77  QMenu menu(this);
78  menu.addAction(QIcon::fromTheme(QStringLiteral("list-add")), i18n("Add..."), this, &RemoteContentConfigureWidget::slotAdd);
79  if (item) {
80  menu.addSeparator();
81  menu.addAction(QIcon::fromTheme(QStringLiteral("document-edit")), i18n("Modify..."), this, [this, item]() {
82  modifyRemoteContent(static_cast<RemoteContentWidgetItem *>(item));
83  });
84  menu.addSeparator();
85  menu.addAction(QIcon::fromTheme(QStringLiteral("edit-delete")), i18n("Remove Rule"), this, [this, item]() {
86  const int answer = KMessageBox::warningTwoActions(this,
87  i18n("Do you want to delete this rule '%1'?", item->text(0)),
88  i18n("Delete Rule"),
91  if (answer == KMessageBox::ButtonCode::PrimaryAction) {
92  delete item;
93  }
94  });
95  }
96  menu.exec(QCursor::pos());
97 }
98 
99 void RemoteContentConfigureWidget::modifyRemoteContent(RemoteContentWidgetItem *rulesItem)
100 {
101  if (!rulesItem) {
102  return;
103  }
105  dlg->setWindowTitle(i18nc("@title:window", "Edit Remote Content"));
106  RemoteContentInfo info;
107  info.setUrl(rulesItem->text(0));
108  info.setStatus(rulesItem->status());
109  dlg->setInfo(info);
110  if (dlg->exec()) {
111  info = dlg->info();
112  RemoteContentManager::self()->addRemoteContent(info);
113  fillContentInfo(info, rulesItem);
114  }
115  delete dlg;
116 }
117 
118 void RemoteContentConfigureWidget::slotAdd()
119 {
121  dlg->setWindowTitle(i18nc("@title:window", "Add Remote Content"));
122  if (dlg->exec()) {
123  const auto info = dlg->info();
124  const int count = mTreeWidget->topLevelItemCount();
125  bool isUnique = true;
126  for (int i = 0; i < count; ++i) {
127  const auto item = mTreeWidget->topLevelItem(i);
128  if (item->text(0) == info.url()) {
129  isUnique = false;
130  KMessageBox::error(this, i18n("An entry already defines this url. Please modify it."), i18n("Add new Url"));
131  break;
132  }
133  }
134  if (isUnique) {
135  RemoteContentManager::self()->addRemoteContent(info);
136  insertRemoteContentInfo(info);
137  }
138  }
139  delete dlg;
140 }
141 
142 void RemoteContentConfigureWidget::saveSettings()
143 {
145  const int count = mTreeWidget->topLevelItemCount();
146  lst.reserve(count);
147  for (int i = 0; i < count; ++i) {
148  const auto item = static_cast<RemoteContentWidgetItem *>(mTreeWidget->topLevelItem(i));
149  RemoteContentInfo info;
150  info.setUrl(item->text(0));
151  info.setStatus(item->status());
152  lst.append(std::move(info));
153  }
154  RemoteContentManager::self()->setRemoveContentInfo(lst);
155 }
156 
157 void RemoteContentConfigureWidget::readSettings()
158 {
159  const QVector<RemoteContentInfo> remoteContentInfos = RemoteContentManager::self()->removeContentInfo();
160  for (const RemoteContentInfo &info : remoteContentInfos) {
161  insertRemoteContentInfo(info);
162  }
163  mTreeWidget->setSortingEnabled(true);
164  mTreeWidget->header()->setSortIndicatorShown(true);
165  mTreeWidget->header()->setSectionsClickable(true);
166  mTreeWidget->sortByColumn(0, Qt::AscendingOrder);
167 }
168 
169 void RemoteContentConfigureWidget::insertRemoteContentInfo(const RemoteContentInfo &info)
170 {
171  auto item = new RemoteContentWidgetItem(mTreeWidget);
172  fillContentInfo(info, item);
173 }
174 
175 void RemoteContentConfigureWidget::fillContentInfo(const RemoteContentInfo &info, RemoteContentWidgetItem *item)
176 {
177  item->setText(0, info.url());
178  item->setToolTip(0, info.url());
179  item->setStatus(info.status());
180 }
void setToolTip(int column, const QString &toolTip)
int type() const const
The RemoteContentInfo class.
The RemoteContentDialog class.
void customContextMenuRequested(const QPoint &pos)
void append(const T &value)
AscendingOrder
QIcon fromTheme(const QString &name)
CustomContextMenu
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
KGuiItem cancel()
QString i18n(const char *text, const TYPE &arg...)
void setText(int column, const QString &text)
ButtonCode warningTwoActions(QWidget *parent, const QString &text, const QString &title, const KGuiItem &primaryAction, const KGuiItem &secondaryAction, const QString &dontAskAgainName=QString(), Options options=Options(Notify|Dangerous))
QPoint pos()
void reserve(int size)
void error(QWidget *parent, const QString &text, const QString &title, const KGuiItem &buttonOk, Options options=Notify)
KGuiItem del()
QString i18nc(const char *context, const char *text, const TYPE &arg...)
void itemDoubleClicked(QTreeWidgetItem *item, int column)
QString text(int column) const const
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Sun Mar 26 2023 04:08:12 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.