1 /*
2 * Copyright (c) 2015 Boudewijn Rempt <boud@valdyas.org>
3 *
4 * This library is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU Lesser General Public License as published by
6 * the Free Software Foundation; version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 */
18
19 #include "presethistory_dock.h"
20
21 #include <QHBoxLayout>
22 #include <QPushButton>
23 #include <QListWidget>
24 #include <QImage>
25
26 #include <klocalizedstring.h>
27
28 #include <KoCanvasResourceProvider.h>
29 #include <KoCanvasBase.h>
30
31 #include "kis_config.h"
32 #include "kis_canvas2.h"
33 #include "KisViewManager.h"
34 #include "kis_paintop_box.h"
35 #include "kis_paintop_presets_chooser_popup.h"
36 #include "kis_canvas_resource_provider.h"
37 #include "KisResourceServerProvider.h"
38 #include <KisKineticScroller.h>
39 #include <brushengine/kis_paintop_preset.h>
40 #include <kis_types.h>
41
42 #define ICON_SIZE 48
43
PresetHistoryDock()44 PresetHistoryDock::PresetHistoryDock( )
45 : QDockWidget(i18n("Brush Preset History"))
46 , m_canvas(0)
47 , m_block(false)
48 , m_initialized(false)
49 {
50 m_presetHistory = new QListWidget(this);
51 m_presetHistory->setIconSize(QSize(ICON_SIZE, ICON_SIZE));
52 m_presetHistory->setDragEnabled(false);
53 m_presetHistory->setSelectionBehavior(QAbstractItemView::SelectRows);
54 m_presetHistory->setSelectionMode(QAbstractItemView::SingleSelection);
55 m_presetHistory->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
56 setWidget(m_presetHistory);
57
58 QScroller* scroller = KisKineticScroller::createPreconfiguredScroller(m_presetHistory);
59 if( scroller ) {
60 connect(scroller, SIGNAL(stateChanged(QScroller::State)), this, SLOT(slotScrollerStateChanged(QScroller::State)));
61 }
62
63 connect(m_presetHistory, SIGNAL(itemClicked(QListWidgetItem*)), SLOT(presetSelected(QListWidgetItem*)));
64 }
65
setCanvas(KoCanvasBase * canvas)66 void PresetHistoryDock::setCanvas(KoCanvasBase * canvas)
67 {
68 setEnabled(canvas != 0);
69
70 if (m_canvas) {
71 m_canvas->disconnectCanvasObserver(this);
72 disconnect(m_canvas->resourceManager());
73 }
74
75 m_canvas = dynamic_cast<KisCanvas2*>(canvas);
76
77 if (!m_canvas || !m_canvas->viewManager() || !m_canvas->resourceManager()) return;
78
79 connect(m_canvas->resourceManager(), SIGNAL(canvasResourceChanged(int,QVariant)), SLOT(canvasResourceChanged(int,QVariant)));
80
81 if (!m_initialized) {
82 KisConfig cfg(true);
83 QStringList presetHistory = cfg.readEntry<QString>("presethistory", "").split(",", QString::SkipEmptyParts);
84 KisPaintOpPresetResourceServer * rserver = KisResourceServerProvider::instance()->paintOpPresetServer();
85 Q_FOREACH (const QString &p, presetHistory) {
86 KisPaintOpPresetSP preset = rserver->resourceByName(p);
87 addPreset(preset);
88 }
89 m_initialized = true;
90 }
91 }
92
unsetCanvas()93 void PresetHistoryDock::unsetCanvas()
94 {
95 m_canvas = 0;
96 setEnabled(false);
97 QStringList presetHistory;
98 for(int i = m_presetHistory->count() -1; i >=0; --i) {
99 QListWidgetItem *item = m_presetHistory->item(i);
100 QVariant v = item->data(Qt::UserRole);
101 KisPaintOpPresetSP preset = v.value<KisPaintOpPresetSP>();
102 presetHistory << preset->name();
103 }
104 KisConfig cfg(false);
105 cfg.writeEntry("presethistory", presetHistory.join(","));
106 }
107
presetSelected(QListWidgetItem * item)108 void PresetHistoryDock::presetSelected(QListWidgetItem *item)
109 {
110 if (item) {
111 QVariant v = item->data(Qt::UserRole);
112 KisPaintOpPresetSP preset = v.value<KisPaintOpPresetSP>();
113 m_block = true;
114 m_canvas->viewManager()->paintOpBox()->resourceSelected(preset.data());
115 m_block = false;
116 }
117 }
118
canvasResourceChanged(int key,const QVariant &)119 void PresetHistoryDock::canvasResourceChanged(int key, const QVariant& /*v*/)
120 {
121 if (m_block) return;
122
123 if (m_canvas && key == KisCanvasResourceProvider::CurrentPaintOpPreset) {
124 KisPaintOpPresetSP preset = m_canvas->resourceManager()->resource(KisCanvasResourceProvider::CurrentPaintOpPreset).value<KisPaintOpPresetSP>();
125 if (preset) {
126 for (int i = 0; i < m_presetHistory->count(); ++i) {
127 if (preset->name() == m_presetHistory->item(i)->text()) {
128 m_presetHistory->setCurrentRow(i);
129 return;
130 }
131 }
132 addPreset(preset);
133 }
134 }
135 }
136
addPreset(KisPaintOpPresetSP preset)137 void PresetHistoryDock::addPreset(KisPaintOpPresetSP preset)
138 {
139 if (preset) {
140 QListWidgetItem *item = new QListWidgetItem(QPixmap::fromImage(preset->image()), preset->name());
141 QVariant v = QVariant::fromValue<KisPaintOpPresetSP>(preset);
142 item->setData(Qt::UserRole, v);
143 m_presetHistory->insertItem(0, item);
144 m_presetHistory->setCurrentRow(0);
145 if (m_presetHistory->count() > 10) {
146 delete m_presetHistory->takeItem(10);
147 }
148 }
149
150 }
151
152