Krita Source Code Documentation
Loading...
Searching...
No Matches
DlgDbExplorer.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2018 Boudewijn Rempt <boud@valdyas.org>
3 * SPDX-FileCopyrightText: 2023 L. E. Segovia <amy@amyspark.me>
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 */
7
8#include "DlgDbExplorer.h"
9
10#include <klocalizedstring.h>
11#include <kis_debug.h>
12
13#include <QDataWidgetMapper>
14#include <QTableView>
15#include <QSqlRelation>
16#include <QSqlRecord>
17#include <QSqlDatabase>
18
21#include <KisResourceModel.h>
23#include <KisStorageModel.h>
25#include <KisTagModel.h>
26#include <KisTagResourceModel.h>
27
28#include "KisResourceCacheDb.h"
30#include "TableModel.h"
31
33 : KoDialog(parent)
34{
35 setCaption(i18n("Resources Cache Database Explorer"));
36
38
39 m_page = new WdgDbExplorer(this);
40 Q_CHECK_PTR(m_page);
41
43
45 m_tagModel = new KisTagModel("", this);
46
47 {
48 KisStorageModel *model = new KisStorageModel(this);
49 TableDelegate *delegate = new TableDelegate(m_page->tableResources);
50 m_page->tableStorages->setModel(model);
51 delegate->addDateTimeColumn(3); // creation date
52 delegate->addBooleanColumn(4); // preinstalled
53 delegate->addBooleanColumn(5); // active
54 m_page->tableStorages->setItemDelegate(delegate);
55 m_page->tableStorages->hideColumn(0);
56 m_page->tableStorages->setSelectionMode(QAbstractItemView::SingleSelection);
57 m_page->tableStorages->resizeColumnsToContents();
58 }
59
60 {
61 KisResourceModel *resourcesModel = new KisResourceModel(ResourceType::Brushes, this);
62 TableDelegate *resourcesDelegate = new TableDelegate(m_page->tableResources);
63 resourcesDelegate->addBooleanColumn(6); // Status
64 resourcesDelegate->addBooleanColumn(12); // Dirty
65 resourcesDelegate->addBooleanColumn(14); // Active
66 m_page->tableResources->setModel(resourcesModel);
67 m_page->tableResources->setItemDelegate(resourcesDelegate);
68 m_page->tableResources->hideColumn(0);
69 m_page->tableResources->setSelectionMode(QAbstractItemView::SingleSelection);
70
71 m_page->cmbResourceTypes->setModel(m_resourceTypeModel);
72 m_page->cmbResourceTypes->setModelColumn(KisResourceTypeModel::Name);
73
74 connect(m_page->cmbResourceTypes, SIGNAL(activated(int)), SLOT(slotTbResourceTypeSelected(int)));
75 connect(m_page->tableResources, SIGNAL(clicked(QModelIndex)), SLOT(slotTbResourceItemSelected()));
76 }
77
78 {
79 TableModel *resourceVersionsModel = new TableModel(this, QSqlDatabase::database());
80 TableDelegate *versionsDelegate = new TableDelegate(m_page->tableVersions);
81 resourceVersionsModel->setTable("versioned_resources");
82 resourceVersionsModel->setHeaderData(0, Qt::Horizontal, i18n("Id"));
83 resourceVersionsModel->setHeaderData(1, Qt::Horizontal, i18n("Resource ID"));
84 resourceVersionsModel->setHeaderData(2, Qt::Horizontal, i18n("Storage ID"));
85 resourceVersionsModel->setHeaderData(3, Qt::Horizontal, i18n("Version"));
86 resourceVersionsModel->setHeaderData(4, Qt::Horizontal, i18n("File name"));
87 resourceVersionsModel->setHeaderData(5, Qt::Horizontal, i18n("md5sum"));
88 resourceVersionsModel->setHeaderData(6, Qt::Horizontal, i18n("Creation Date"));
89 resourceVersionsModel->addDateTimeColumn(6);
90 versionsDelegate->addDateTimeColumn(6);
91 resourceVersionsModel->select();
92
93 m_page->tableVersions->setModel(resourceVersionsModel);
94 m_page->tableVersions->hideColumn(0);
95 m_page->tableVersions->setItemDelegate(versionsDelegate);
96 m_page->tableVersions->setSelectionMode(QAbstractItemView::NoSelection);
97 m_page->tableVersions->resizeColumnsToContents();
98 }
99
100 {
101 TableModel *tagsModel = new TableModel(this, QSqlDatabase::database());
102 TableDelegate *tagsDelegate = new TableDelegate(m_page->tableStorages);
103 tagsModel->setTable("tags");
104 tagsModel->setHeaderData(0, Qt::Horizontal, i18n("Id"));
105 tagsModel->setHeaderData(1, Qt::Horizontal, i18n("Type"));
106 tagsModel->setRelation(1, QSqlRelation("resource_types", "id", "name"));
107 tagsModel->setHeaderData(2, Qt::Horizontal, i18n("Tag"));
108 tagsModel->setHeaderData(3, Qt::Horizontal, i18n("Name"));
109 tagsModel->setHeaderData(4, Qt::Horizontal, i18n("Comment"));
110 tagsModel->setHeaderData(5, Qt::Horizontal, i18n("File name"));
111 tagsModel->setHeaderData(6, Qt::Horizontal, i18n("Active"));
112 tagsModel->setHeaderData(7, Qt::Horizontal, i18n("Thumbnail"));
113 tagsModel->setHeaderData(8, Qt::Horizontal, i18n("Display Name"));
114 tagsModel->addBooleanColumn(6);
115 tagsDelegate->addBooleanColumn(6);
116 tagsModel->select();
117
118 m_page->tableTags->setModel(tagsModel);
119 m_page->tableTags->hideColumn(0);
120 m_page->tableTags->setItemDelegate(tagsDelegate);
121 m_page->tableTags->setSelectionMode(QAbstractItemView::SingleSelection);
122 m_page->tableTags->resizeColumnsToContents();
123
124 connect(m_page->tableTags, &QTableView::clicked, this, &DlgDbExplorer::slotTbTagSelected);
125 }
126
127 {
129 TableDelegate *delegate = new TableDelegate(m_page->tableTaggedResources);
130 delegate->addBooleanColumn(6); // status
131 delegate->addBooleanColumn(12); // dirty
132 delegate->addBooleanColumn(14); // resource active
133 delegate->addBooleanColumn(15); // storage active
134 delegate->addBooleanColumn(20); // resource active
135 delegate->addBooleanColumn(21); // tag active
136 delegate->addBooleanColumn(22); // storage active
137
138 m_page->tableTaggedResources->setModel(model);
139 m_page->tableTaggedResources->setItemDelegate(delegate);
140 m_page->tableTaggedResources->setSelectionMode(QAbstractItemView::NoSelection);
141 m_page->tableTaggedResources->resizeColumnsToContents();
142 }
143
144 {
145 TableModel *versionModel = new TableModel(this, QSqlDatabase::database());
146 TableDelegate *delegate = new TableDelegate(m_page->tableSchema);
147 versionModel->setTable("version_information");
148 versionModel->setHeaderData(0, Qt::Horizontal, i18n("Id"));
149 versionModel->setHeaderData(1, Qt::Horizontal, i18n("Database version"));
150 versionModel->setHeaderData(2, Qt::Horizontal, i18n("Krita version"));
151 versionModel->setHeaderData(3, Qt::Horizontal, i18n("Upgrade date"));
152 versionModel->addDateTimeColumn(3);
153 delegate->addDateTimeColumn(3);
154 versionModel->select();
155
156 const QSqlRecord r = versionModel->record(0);
157 m_page->lblDatabaseVersion->setText(r.value(1).toString());
158 m_page->lblKritaVersion->setText(r.value(2).toString());
159 m_page->lblCreationDate->setText(QDateTime::fromSecsSinceEpoch(r.value(3).value<int>()).toString());
160
161 m_page->tableSchema->setModel(versionModel);
162 m_page->tableSchema->hideColumn(0);
163 m_page->tableSchema->setItemDelegate(delegate);
164 m_page->tableSchema->setSelectionMode(QAbstractItemView::NoSelection);
165 m_page->tableSchema->resizeColumnsToContents();
166 }
167
168
169 {
170 m_page->cmbRvResourceTypes->setModel(m_resourceTypeModel);
171 m_page->cmbRvResourceTypes->setModelColumn(KisResourceTypeModel::Name);
172 connect(m_page->cmbRvResourceTypes, SIGNAL(activated(int)), SLOT(slotRvResourceTypeSelected(int)));
173
174 m_page->cmbRvTags->setModelColumn(KisAllTagsModel::Name);
175 m_page->cmbRvTags->setModel(m_tagModel);
176 connect(m_page->cmbRvTags, SIGNAL(activated(int)), SLOT(slotRvTagSelected(int)));
177
178 m_page->cmbRvResourceTypes->setCurrentIndex(0);
180
181 m_page->resourceItemView->setItemDelegate(new KisResourceItemDelegate(this));
182 m_page->resourceItemView->setSelectionMode(QAbstractItemView::SingleSelection);
183 }
184
185}
186
190
191void DlgDbExplorer::updateTagModel(const QString& resourceType)
192{
193 m_tagModel = new KisTagModel(resourceType, this);
194 m_page->cmbRvTags->setModelColumn(KisAllTagsModel::Name);
195 m_page->cmbRvTags->setModel(m_tagModel);
196 m_page->cmbRvTags->update();
197 qDebug() << "number of tags in " << resourceType << " tag model: " << m_tagModel->rowCount();
198}
199
201{
202 QModelIndex idx = m_page->cmbResourceTypes->model()->index(index, KisResourceTypeModel::ResourceType);
203 QString resourceType = idx.data(Qt::DisplayRole).toString();
204
205 updateTagModel(resourceType);
206
207 KisTagFilterResourceProxyModel *tagFilterModel = new KisTagFilterResourceProxyModel(resourceType, this);
208
209 m_filterProxyModel = tagFilterModel;
210
211 m_page->resourceItemView->setModel(tagFilterModel);
212}
213
215{
216 QModelIndex idx = m_page->cmbRvResourceTypes->model()->index(index, KisResourceTypeModel::ResourceType);
217 QString resourceType = idx.data(Qt::DisplayRole).toString();
218
219 m_tagModel = new KisTagModel(resourceType, this);
220
221 KisResourceModel *resourceModel = new KisResourceModel(resourceType, this);
222 m_page->tableResources->setModel(resourceModel);
223 m_page->tableResources->setCurrentIndex(m_page->tableResources->model()->index(0, 0));
225 m_page->tableResources->resizeColumnsToContents();
226}
227
229{
230 if (m_page->tableResources->selectionModel()->selectedIndexes().isEmpty()) return;
231
232 QModelIndex idx = m_page->tableResources->selectionModel()->selectedIndexes().first();
233
234 QImage thumb = idx.data(Qt::UserRole + KisAbstractResourceModel::Thumbnail).value<QImage>();
235 Qt::TransformationMode mode = Qt::SmoothTransformation;
236 if (thumb.size().width() < 100 && thumb.size().height() < 100) {
237 mode = Qt::FastTransformation;
238 }
239
240 if (!thumb.isNull()) {
241 m_page->lblThumbnail->setPixmap(QPixmap::fromImage(thumb.scaled(100, 100, Qt::KeepAspectRatio, mode)));
242 } else {
243 m_page->lblThumbnail->setPixmap(QPixmap());
244 }
245
246 TableModel *model = dynamic_cast<TableModel *>(m_page->tableVersions->model());
247
248 if (model) {
249 const QString md5 = idx.data(Qt::UserRole + KisAbstractResourceModel::MD5).value<QString>();
250 model->setFilter(QString("md5sum='%1'").arg(md5));
251 m_page->tableVersions->resizeColumnsToContents();
252 }
253}
254
255void DlgDbExplorer::slotTbTagSelected(const QModelIndex &index)
256{
257 // 0 == tag ID
258 const QModelIndex idx = m_page->tableTags->model()->index(index.row(), 0);
259 // get tag's resource type
260 const QModelIndex idx2 = m_page->tableTags->model()->index(index.row(), 1);
261
262 KisTagResourceModel *newModel = new KisTagResourceModel(idx2.data().value<QString>(), this);
264 newModel->setTagsFilter(QVector<int>{idx.data().value<int>()});
265 QAbstractItemModel *oldModel = m_page->tableTaggedResources->model();
266 m_page->tableTaggedResources->setModel(newModel);
267 m_page->tableTaggedResources->resizeColumnsToContents();
268 oldModel->deleteLater();
269}
270
272{
273 qDebug() << "selected tag" << index;
274 QModelIndex idx = m_tagModel->index(index, 0);
275 KisTagSP tag = m_tagModel->tagForIndex(idx);
276
277 if (m_filterProxyModel && !tag.isNull() && tag->valid()) {
279 m_page->tableTaggedResources->resizeColumnsToContents();
280 }
281}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
KisTagModel * m_tagModel
void updateTagModel(const QString &resourceType)
void slotTbResourceTypeSelected(int index)
KisTagFilterResourceProxyModel * m_filterProxyModel
void slotTbTagSelected(const QModelIndex &index)
DlgDbExplorer(QWidget *parent=0)
void slotRvResourceTypeSelected(int index)
WdgDbExplorer * m_page
void slotTbResourceItemSelected()
~DlgDbExplorer() override
KisResourceTypeModel * m_resourceTypeModel
void slotRvTagSelected(int index)
The resource item delegate for rendering the resource preview.
The KisResourceModel class provides the main access to resources. It is possible to filter the resour...
The KisTagFilterResourceProxyModel class filters the resources by tag or resource name.
void setTagFilter(const KisTagSP tag)
setTagFilter sets the tag to filter with
KisTagSP tagForIndex(QModelIndex index=QModelIndex()) const override
The KisTagResourceModel class makes it possible to retrieve the resources for certain tags or the tag...
void setResourceFilter(ResourceFilter filter) override
void setTagsFilter(const QVector< int > tagIds)
A dialog base class with standard buttons and predefined layouts.
Definition KoDialog.h:116
void setMainWidget(QWidget *widget)
Definition KoDialog.cpp:354
virtual void setCaption(const QString &caption)
Definition KoDialog.cpp:498
void setButtons(ButtonCodes buttonMask)
Definition KoDialog.cpp:195
@ Ok
Show Ok button. (this button accept()s the dialog; result set to QDialog::Accepted)
Definition KoDialog.h:127
void addDateTimeColumn(int column)
void addBooleanColumn(int column)
The TableModel class handles boolean and datetime columns in a custom way.
Definition TableModel.h:41
void addBooleanColumn(int column)
void addDateTimeColumn(int column)
const QString Brushes