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 <KLineEditEventHandler>
12 #include <KLocalizedString>
13 #include <KMessageBox>
14 #include <KTreeWidgetSearchLine>
15 #include <QHeaderView>
16 #include <QMenu>
17 #include <QPointer>
18 #include <QTreeWidget>
19 #include <QVBoxLayout>
20 
21 using namespace MessageViewer;
22 
23 RemoteContentWidgetItem::RemoteContentWidgetItem(QTreeWidget *parent)
24  : QTreeWidgetItem(parent)
25  , mStatusTypeCombobox(new RemoteContentStatusTypeComboBox)
26 {
27  treeWidget()->setItemWidget(this, ColumnType::RuleType, mStatusTypeCombobox);
28 }
29 
30 RemoteContentWidgetItem::~RemoteContentWidgetItem() = default;
31 
32 void RemoteContentWidgetItem::setStatus(MessageViewer::RemoteContentInfo::RemoteContentInfoStatus type)
33 {
34  mStatusTypeCombobox->setStatus(type);
35 }
36 
37 RemoteContentInfo::RemoteContentInfoStatus RemoteContentWidgetItem::status() const
38 {
39  return mStatusTypeCombobox->status();
40 }
41 
42 RemoteContentConfigureWidget::RemoteContentConfigureWidget(QWidget *parent)
43  : QWidget(parent)
44  , mTreeWidget(new QTreeWidget(this))
45 {
46  auto mainLayout = new QVBoxLayout(this);
47  mainLayout->setObjectName(QStringLiteral("mainLayout"));
48  mainLayout->setContentsMargins({});
49 
50  mTreeWidget->setObjectName(QStringLiteral("treewidget"));
51  mTreeWidget->setRootIsDecorated(false);
52  mTreeWidget->setHeaderLabels({i18n("Domain"), i18n("Status")});
53  mTreeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
54  mTreeWidget->setAlternatingRowColors(true);
55  mTreeWidget->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
56 
57  auto searchLineEdit = new KTreeWidgetSearchLine(this, mTreeWidget);
58  searchLineEdit->setObjectName(QStringLiteral("searchlineedit"));
59  searchLineEdit->setClearButtonEnabled(true);
60  mainLayout->addWidget(searchLineEdit);
61  KLineEditEventHandler::catchReturnKey(searchLineEdit);
62 
63  mainLayout->addWidget(mTreeWidget);
64  connect(mTreeWidget, &QTreeWidget::customContextMenuRequested, this, &RemoteContentConfigureWidget::slotCustomContextMenuRequested);
65  connect(mTreeWidget, &QTreeWidget::itemDoubleClicked, this, [this](QTreeWidgetItem *item) {
66  if (item) {
67  auto rulesItem = static_cast<RemoteContentWidgetItem *>(item);
68  modifyRemoteContent(rulesItem);
69  }
70  });
71  readSettings();
72 }
73 
74 RemoteContentConfigureWidget::~RemoteContentConfigureWidget() = default;
75 
76 void RemoteContentConfigureWidget::slotCustomContextMenuRequested(const QPoint &pos)
77 {
78  QTreeWidgetItem *item = mTreeWidget->itemAt(pos);
79  QMenu menu(this);
80  menu.addAction(QIcon::fromTheme(QStringLiteral("list-add")), i18n("Add..."), this, &RemoteContentConfigureWidget::slotAdd);
81  if (item) {
82  menu.addSeparator();
83  menu.addAction(QIcon::fromTheme(QStringLiteral("document-edit")), i18n("Modify..."), this, [this, item]() {
84  modifyRemoteContent(static_cast<RemoteContentWidgetItem *>(item));
85  });
86  menu.addSeparator();
87  menu.addAction(QIcon::fromTheme(QStringLiteral("edit-delete")), i18n("Remove Rule"), this, [this, item]() {
88  const int answer = KMessageBox::warningTwoActions(this,
89  i18n("Do you want to delete this rule '%1'?", item->text(0)),
90  i18n("Delete Rule"),
93  if (answer == KMessageBox::ButtonCode::PrimaryAction) {
94  delete item;
95  }
96  });
97  }
98  menu.exec(QCursor::pos());
99 }
100 
101 void RemoteContentConfigureWidget::modifyRemoteContent(RemoteContentWidgetItem *rulesItem)
102 {
103  if (!rulesItem) {
104  return;
105  }
107  dlg->setWindowTitle(i18nc("@title:window", "Edit Remote Content"));
108  RemoteContentInfo info;
109  info.setUrl(rulesItem->text(0));
110  info.setStatus(rulesItem->status());
111  dlg->setInfo(info);
112  if (dlg->exec()) {
113  info = dlg->info();
114  RemoteContentManager::self()->addRemoteContent(info);
115  fillContentInfo(info, rulesItem);
116  }
117  delete dlg;
118 }
119 
120 void RemoteContentConfigureWidget::slotAdd()
121 {
123  dlg->setWindowTitle(i18nc("@title:window", "Add Remote Content"));
124  if (dlg->exec()) {
125  const auto info = dlg->info();
126  const int count = mTreeWidget->topLevelItemCount();
127  bool isUnique = true;
128  for (int i = 0; i < count; ++i) {
129  const auto item = mTreeWidget->topLevelItem(i);
130  if (item->text(0) == info.url()) {
131  isUnique = false;
132  KMessageBox::error(this, i18n("An entry already defines this url. Please modify it."), i18n("Add new Url"));
133  break;
134  }
135  }
136  if (isUnique) {
137  RemoteContentManager::self()->addRemoteContent(info);
138  insertRemoteContentInfo(info);
139  }
140  }
141  delete dlg;
142 }
143 
144 void RemoteContentConfigureWidget::saveSettings()
145 {
147  const int count = mTreeWidget->topLevelItemCount();
148  lst.reserve(count);
149  for (int i = 0; i < count; ++i) {
150  const auto item = static_cast<RemoteContentWidgetItem *>(mTreeWidget->topLevelItem(i));
151  RemoteContentInfo info;
152  info.setUrl(item->text(0));
153  info.setStatus(item->status());
154  lst.append(std::move(info));
155  }
156  RemoteContentManager::self()->setRemoveContentInfo(lst);
157 }
158 
159 void RemoteContentConfigureWidget::readSettings()
160 {
161  const QList<RemoteContentInfo> remoteContentInfos = RemoteContentManager::self()->removeContentInfo();
162  for (const RemoteContentInfo &info : remoteContentInfos) {
163  insertRemoteContentInfo(info);
164  }
165  mTreeWidget->setSortingEnabled(true);
166  mTreeWidget->header()->setSortIndicatorShown(true);
167  mTreeWidget->header()->setSectionsClickable(true);
168  mTreeWidget->sortByColumn(0, Qt::AscendingOrder);
169 }
170 
171 void RemoteContentConfigureWidget::insertRemoteContentInfo(const RemoteContentInfo &info)
172 {
173  auto item = new RemoteContentWidgetItem(mTreeWidget);
174  fillContentInfo(info, item);
175 }
176 
177 void RemoteContentConfigureWidget::fillContentInfo(const RemoteContentInfo &info, RemoteContentWidgetItem *item)
178 {
179  item->setText(0, info.url());
180  item->setToolTip(0, info.url());
181  item->setStatus(info.status());
182 }
183 
184 #include "moc_remotecontentconfigurewidget.cpp"
void setToolTip(int column, const QString &toolTip)
void append(const T &value)
int type() const const
The RemoteContentInfo class.
The RemoteContentDialog class.
void customContextMenuRequested(const QPoint &pos)
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)
void reserve(int alloc)
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 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 Thu Sep 21 2023 03:56:19 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.