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