1 /* ============================================================
2 *
3 * This file is a part of digiKam project
4 * https://www.digikam.org
5 *
6 * Date : 2008-05-19
7 * Description : Fuzzy search sidebar tab contents - sketch panel.
8 *
9 * Copyright (C) 2016-2018 by Mario Frank <mario dot frank at uni minus potsdam dot de>
10 * Copyright (C) 2008-2021 by Gilles Caulier <caulier dot gilles at gmail dot com>
11 * Copyright (C) 2008-2012 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
12 * Copyright (C) 2012 by Andi Clemens <andi dot clemens at gmail dot com>
13 *
14 * This program is free software; you can redistribute it
15 * and/or modify it under the terms of the GNU General
16 * Public License as published by the Free Software Foundation;
17 * either version 2, or (at your option)
18 * any later version.
19 *
20 * This program is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
24 *
25 * ============================================================ */
26
27 #include "fuzzysearchview_p.h"
28
29 namespace Digikam
30 {
31
setupSketchPanel() const32 QWidget* FuzzySearchView::setupSketchPanel() const
33 {
34 const int spacing = QApplication::style()->pixelMetric(QStyle::PM_DefaultLayoutSpacing);
35
36 DHBox* const drawingBox = new DHBox();
37 d->sketchWidget = new SketchWidget(drawingBox);
38 drawingBox->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken);
39 drawingBox->setLineWidth(1);
40
41 // ---------------------------------------------------------------
42
43 QString tooltip(i18n("Set here the brush color used to draw sketch."));
44
45 d->hsSelector = new DHueSaturationSelector();
46 d->hsSelector->setMinimumSize(200, 96);
47 d->hsSelector->setChooserMode(ChooserValue);
48 d->hsSelector->setColorValue(255);
49 d->hsSelector->setWhatsThis(tooltip);
50
51 d->vSelector = new DColorValueSelector();
52 d->vSelector->setMinimumSize(26, 96);
53 d->vSelector->setChooserMode(ChooserValue);
54 d->vSelector->setIndent(false);
55 d->vSelector->setWhatsThis(tooltip);
56
57 // ---------------------------------------------------------------
58
59 d->undoBtnSketch = new QToolButton();
60 d->undoBtnSketch->setAutoRepeat(true);
61 d->undoBtnSketch->setIcon(QIcon::fromTheme(QLatin1String("edit-undo")));
62 d->undoBtnSketch->setToolTip(i18n("Undo last draw on sketch"));
63 d->undoBtnSketch->setWhatsThis(i18n("Use this button to undo last drawing action on sketch."));
64 d->undoBtnSketch->setEnabled(false);
65
66 d->redoBtnSketch = new QToolButton();
67 d->redoBtnSketch->setAutoRepeat(true);
68 d->redoBtnSketch->setIcon(QIcon::fromTheme(QLatin1String("edit-redo")));
69 d->redoBtnSketch->setToolTip(i18n("Redo last draw on sketch"));
70 d->redoBtnSketch->setWhatsThis(i18n("Use this button to redo last drawing action on sketch."));
71 d->redoBtnSketch->setEnabled(false);
72
73 QLabel* const brushLabel = new QLabel(i18n("Pen:"));
74 d->penSize = new QSpinBox();
75 d->penSize->setRange(1, 64);
76 d->penSize->setSingleStep(1);
77 d->penSize->setValue(10);
78 d->penSize->setWhatsThis(i18n("Set here the brush size in pixels used to draw sketch."));
79
80 QLabel* const resultsLabel = new QLabel(i18n("Items:"));
81 d->resultsSketch = new QSpinBox();
82 d->resultsSketch->setRange(1, 50);
83 d->resultsSketch->setSingleStep(1);
84 d->resultsSketch->setValue(10);
85 d->resultsSketch->setWhatsThis(i18n("Set here the number of items to find using sketch."));
86
87 QGridLayout* const settingsLayout = new QGridLayout();
88 settingsLayout->addWidget(d->undoBtnSketch, 0, 0);
89 settingsLayout->addWidget(d->redoBtnSketch, 0, 1);
90 settingsLayout->addWidget(brushLabel, 0, 2);
91 settingsLayout->addWidget(d->penSize, 0, 3);
92 settingsLayout->addWidget(resultsLabel, 0, 5);
93 settingsLayout->addWidget(d->resultsSketch, 0, 6);
94 settingsLayout->setColumnStretch(4, 10);
95 settingsLayout->setContentsMargins(QMargins());
96 settingsLayout->setSpacing(spacing);
97
98 // ---------------------------------------------------------------
99
100 d->sketchSearchAlbumSelectors = new AlbumSelectors(i18nc("@label",
101 "Search in albums:"),
102 QLatin1String("Sketch Search View"),
103 nullptr, AlbumSelectors::AlbumType::PhysAlbum);
104
105 // ---------------------------------------------------------------
106
107 DHBox* const saveBox = new DHBox();
108 saveBox->setContentsMargins(QMargins());
109 saveBox->setSpacing(spacing);
110
111 d->resetButton = new QToolButton(saveBox);
112 d->resetButton->setIcon(QIcon::fromTheme(QLatin1String("document-revert")));
113 d->resetButton->setToolTip(i18n("Clear sketch"));
114 d->resetButton->setWhatsThis(i18n("Use this button to clear sketch contents."));
115
116 d->nameEditSketch = new QLineEdit(saveBox);
117 d->nameEditSketch->setClearButtonEnabled(true);
118 d->nameEditSketch->setWhatsThis(i18n("Enter the name of the current sketch search to save in the "
119 "\"Similarity Searches\" view."));
120
121 d->saveBtnSketch = new QToolButton(saveBox);
122 d->saveBtnSketch->setIcon(QIcon::fromTheme(QLatin1String("document-save")));
123 d->saveBtnSketch->setEnabled(false);
124 d->saveBtnSketch->setToolTip(i18n("Save current sketch search to a new virtual Album"));
125 d->saveBtnSketch->setWhatsThis(i18n("If you press this button, the current sketch "
126 "fuzzy search will be saved to a new search "
127 "virtual album using the name "
128 "set on the left side."));
129
130 // ---------------------------------------------------------------
131
132 QWidget* const mainWidget = new QWidget;
133 QGridLayout* const mainLayout = new QGridLayout();
134 mainLayout->addWidget(drawingBox, 0, 0, 1, 3);
135 mainLayout->addWidget(d->hsSelector, 1, 0, 1, 2);
136 mainLayout->addWidget(d->vSelector, 1, 2, 1, 1);
137 mainLayout->addLayout(settingsLayout, 2, 0, 1, 3);
138 mainLayout->addWidget(d->sketchSearchAlbumSelectors, 3, 0, 1, 3);
139 mainLayout->addWidget(saveBox, 4, 0, 1, 3);
140 mainLayout->setRowStretch(0, 10);
141 mainLayout->setColumnStretch(1, 10);
142 mainLayout->setContentsMargins(spacing, spacing, spacing, spacing);
143 mainLayout->setSpacing(spacing);
144 mainWidget->setLayout(mainLayout);
145
146 return mainWidget;
147 }
148
slotHSChanged(int h,int s)149 void FuzzySearchView::slotHSChanged(int h, int s)
150 {
151 QColor color;
152
153 int val = d->selColor.value();
154
155 color.setHsv(h, s, val);
156 setColor(color);
157 }
158
slotVChanged(int v)159 void FuzzySearchView::slotVChanged(int v)
160 {
161 QColor color;
162
163 int hue = d->selColor.hue();
164 int sat = d->selColor.saturation();
165
166 color.setHsv(hue, sat, v);
167 setColor(color);
168 }
169
slotPenColorChanged(const QColor & color)170 void FuzzySearchView::slotPenColorChanged(const QColor& color)
171 {
172 slotHSChanged(color.hue(), color.saturation());
173 slotVChanged(color.value());
174 }
175
setColor(QColor c)176 void FuzzySearchView::setColor(QColor c)
177 {
178 if (c.isValid())
179 {
180 d->selColor = c;
181
182 // set values
183
184 d->hsSelector->setValues(c.hue(), c.saturation());
185 d->vSelector->setValue(c.value());
186
187 // set colors
188
189 d->hsSelector->blockSignals(true);
190 d->hsSelector->setHue(c.hue());
191 d->hsSelector->setSaturation(c.saturation());
192 d->hsSelector->setColorValue(c.value());
193 d->hsSelector->updateContents();
194 d->hsSelector->blockSignals(false);
195 d->hsSelector->repaint();
196
197 d->vSelector->blockSignals(true);
198 d->vSelector->setHue(c.hue());
199 d->vSelector->setSaturation(c.saturation());
200 d->vSelector->setColorValue(c.value());
201 d->vSelector->updateContents();
202 d->vSelector->blockSignals(false);
203 d->vSelector->repaint();
204
205 d->sketchWidget->setPenColor(c);
206 }
207 }
208
slotUndoRedoStateChanged(bool hasUndo,bool hasRedo)209 void FuzzySearchView::slotUndoRedoStateChanged(bool hasUndo, bool hasRedo)
210 {
211 d->undoBtnSketch->setEnabled(hasUndo);
212 d->redoBtnSketch->setEnabled(hasRedo);
213 }
214
slotSaveSketchSAlbum()215 void FuzzySearchView::slotSaveSketchSAlbum()
216 {
217 createNewFuzzySearchAlbumFromSketch(d->nameEditSketch->text());
218 }
219
slotDirtySketch()220 void FuzzySearchView::slotDirtySketch()
221 {
222 if (d->active)
223 {
224 d->timerSketch->start();
225 }
226 }
227
slotTimerSketchDone()228 void FuzzySearchView::slotTimerSketchDone()
229 {
230 slotCheckNameEditSketchConditions();
231 createNewFuzzySearchAlbumFromSketch(SAlbum::getTemporaryHaarTitle(DatabaseSearch::HaarSketchSearch), true);
232 }
233
createNewFuzzySearchAlbumFromSketch(const QString & name,bool force)234 void FuzzySearchView::createNewFuzzySearchAlbumFromSketch(const QString& name, bool force)
235 {
236 AlbumManager::instance()->clearCurrentAlbums();
237
238 QList<int> albums = d->sketchSearchAlbumSelectors->selectedAlbumIds();
239
240 d->sketchSAlbum = d->searchModificationHelper->createFuzzySearchFromSketch(name, d->sketchWidget,
241 d->resultsSketch->value(),
242 albums, force);
243 d->searchTreeView->setCurrentAlbums(QList<Album*>() << d->sketchSAlbum);
244 }
245
slotClearSketch()246 void FuzzySearchView::slotClearSketch()
247 {
248 d->sketchWidget->slotClear();
249 slotCheckNameEditSketchConditions();
250 AlbumManager::instance()->clearCurrentAlbums();
251 }
252
slotCheckNameEditSketchConditions()253 void FuzzySearchView::slotCheckNameEditSketchConditions()
254 {
255 if (!d->sketchWidget->isClear())
256 {
257 bool b = d->nameEditSketch->text().isEmpty();
258 d->nameEditSketch->setEnabled(true);
259 d->saveBtnSketch->setEnabled(!b);
260 }
261 else
262 {
263 d->nameEditSketch->setEnabled(false);
264 d->saveBtnSketch->setEnabled(false);
265 }
266 }
267
268 } // namespace Digikam
269