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