• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • krita API Reference
  • KDE Home
  • Contact Us
 

libs/ui

  • sources
  • kfour-appscomplete
  • krita
  • libs
  • ui
  • canvas
kis_canvas_widget_base.cpp
Go to the documentation of this file.
1 /*
2  * SPDX-FileCopyrightText: 2007, 2010 Adrian Page <[email protected]>
3  *
4  * SPDX-License-Identifier: GPL-2.0-or-later
5  */
6 
7 #include "kis_canvas_widget_base.h"
8 
9 #include <QImage>
10 #include <QPainter>
11 #include <QTimer>
12 #include <QMenu>
13 
14 #include <KoShapeManager.h>
15 #include <KoToolManager.h>
16 #include <KoViewConverter.h>
17 #include <KoToolProxy.h>
18 #include <KoCanvasController.h>
19 #include <KoShape.h>
20 #include <KoSelection.h>
21 #include <KoShapePaintingContext.h>
22 
23 #include "kis_coordinates_converter.h"
24 #include "kis_canvas_decoration.h"
25 #include "kis_config.h"
26 #include "kis_canvas2.h"
27 #include "KisViewManager.h"
28 #include "kis_selection_manager.h"
29 #include "KisDocument.h"
30 #include "kis_update_info.h"
31 #include "KisQPainterStateSaver.h"
32 
33 
34 struct KisCanvasWidgetBase::Private
35 {
36 public:
37  Private(KisCanvas2 *newCanvas, KisCoordinatesConverter *newCoordinatesConverter)
38  : canvas(newCanvas)
39  , coordinatesConverter(newCoordinatesConverter)
40  , viewConverter(newCanvas->viewConverter())
41  , toolProxy(newCanvas->toolProxy())
42  , ignorenextMouseEventExceptRightMiddleClick(0)
43  , borderColor(Qt::gray)
44  {}
45 
46  QList<KisCanvasDecorationSP> decorations;
47  KisCanvas2 * canvas;
48  KisCoordinatesConverter *coordinatesConverter;
49  const KoViewConverter * viewConverter;
50  KoToolProxy * toolProxy;
51  QTimer blockMouseEvent;
52 
53  bool ignorenextMouseEventExceptRightMiddleClick; // HACK work around Qt bug not sending tablet right/dblclick https://bugreports.qt.io/browse/QTBUG-8598
54  QColor borderColor;
55 };
56 
57 KisCanvasWidgetBase::KisCanvasWidgetBase(KisCanvas2 * canvas, KisCoordinatesConverter *coordinatesConverter)
58  : m_d(new Private(canvas, coordinatesConverter))
59 {
60  m_d->blockMouseEvent.setSingleShot(true);
61 }
62 
63 KisCanvasWidgetBase::~KisCanvasWidgetBase()
64 {
70  //5qDeleteAll(m_d->decorations);
71  m_d->decorations.clear();
72 
73  delete m_d;
74 }
75 
76 void KisCanvasWidgetBase::drawDecorations(QPainter & gc, const QRect &updateWidgetRect) const
77 {
78  if (!m_d->canvas) {
79  dbgFile<<"canvas doesn't exist, in canvas widget base!";
80  return;
81  }
82  gc.save();
83 
84  // Setup the painter to take care of the offset; all that the
85  // classes that do painting need to keep track of is resolution
86  gc.setRenderHint(QPainter::Antialiasing);
87  gc.setRenderHint(QPainter::TextAntialiasing);
88 
89  // This option does not do anything anymore with Qt4.6, so don't re-enable it since it seems to break display
90  // https://lists.qt-project.org/pipermail/qt-interest-old/2009-December/017078.html
91  // gc.setRenderHint(QPainter::HighQualityAntialiasing);
92 
93  gc.setRenderHint(QPainter::SmoothPixmapTransform);
94 
95  {
96  KisQPainterStateSaver paintShapesState(&gc);
97  gc.setTransform(m_d->coordinatesConverter->documentToWidgetTransform());
98 
99  // Paint the shapes (other than the layers)
100  m_d->canvas->globalShapeManager()->paint(gc, false);
101 
102  }
103 
104  // ask the decorations to paint themselves
105  // decorations are painted in "widget" coordinate system
106  Q_FOREACH (KisCanvasDecorationSP deco, m_d->decorations) {
107  if (deco->visible()) {
108  deco->paint(gc, m_d->coordinatesConverter->widgetToDocument(updateWidgetRect), m_d->coordinatesConverter,m_d->canvas);
109  }
110  }
111 
112  {
113  KisQPainterStateSaver paintDecorationsState(&gc);
114  gc.setTransform(m_d->coordinatesConverter->flakeToWidgetTransform());
115 
116  // - some tools do not restore gc, but that is not important here
117  toolProxy()->paint(gc, *m_d->viewConverter);
118  }
119 
120  gc.restore();
121 }
122 
123 void KisCanvasWidgetBase::addDecoration(KisCanvasDecorationSP deco)
124 {
125  m_d->decorations.push_back(deco);
126  std::stable_sort(m_d->decorations.begin(), m_d->decorations.end(), KisCanvasDecoration::comparePriority);
127 }
128 
129 void KisCanvasWidgetBase::removeDecoration(const QString &id)
130 {
131  for (auto it = m_d->decorations.begin(); it != m_d->decorations.end(); ++it) {
132  if ((*it)->id() == id) {
133  it = m_d->decorations.erase(it);
134  break;
135  }
136  }
137 }
138 
139 KisCanvasDecorationSP KisCanvasWidgetBase::decoration(const QString& id) const
140 {
141  Q_FOREACH (KisCanvasDecorationSP deco, m_d->decorations) {
142  if (deco->id() == id) {
143  return deco;
144  }
145  }
146  return 0;
147 }
148 
149 void KisCanvasWidgetBase::setDecorations(const QList<KisCanvasDecorationSP > &decorations)
150 {
151  m_d->decorations=decorations;
152  std::stable_sort(m_d->decorations.begin(), m_d->decorations.end(), KisCanvasDecoration::comparePriority);
153 }
154 
155 QList<KisCanvasDecorationSP > KisCanvasWidgetBase::decorations() const
156 {
157  return m_d->decorations;
158 }
159 
160 void KisCanvasWidgetBase::setWrapAroundViewingMode(bool value)
161 {
162  Q_UNUSED(value);
163 }
164 
165 QImage KisCanvasWidgetBase::createCheckersImage(qint32 checkSize)
166 {
167  KisConfig cfg(true);
168 
169  if(checkSize < 0)
170  checkSize = cfg.checkSize();
171 
172  QColor checkColor1 = cfg.checkersColor1();
173  QColor checkColor2 = cfg.checkersColor2();
174 
175  QImage tile(checkSize * 2, checkSize * 2, QImage::Format_RGB32);
176  QPainter pt(&tile);
177  pt.fillRect(tile.rect(), checkColor2);
178  pt.fillRect(0, 0, checkSize, checkSize, checkColor1);
179  pt.fillRect(checkSize, checkSize, checkSize, checkSize, checkColor1);
180  pt.end();
181 
182  return tile;
183 }
184 
185 void KisCanvasWidgetBase::notifyConfigChanged()
186 {
187  KisConfig cfg(true);
188  m_d->borderColor = cfg.canvasBorderColor();
189 }
190 
191 QColor KisCanvasWidgetBase::borderColor() const
192 {
193  return m_d->borderColor;
194 }
195 
196 KisCanvas2 *KisCanvasWidgetBase::canvas() const
197 {
198  return m_d->canvas;
199 }
200 
201 KisCoordinatesConverter* KisCanvasWidgetBase::coordinatesConverter() const
202 {
203  return m_d->coordinatesConverter;
204 }
205 
206 QVector<QRect> KisCanvasWidgetBase::updateCanvasProjection(const QVector<KisUpdateInfoSP> &infoObjects)
207 {
208  QVector<QRect> dirtyViewRects;
209 
210  Q_FOREACH (KisUpdateInfoSP info, infoObjects) {
211  dirtyViewRects << this->updateCanvasProjection(info);
212  }
213 
214  return dirtyViewRects;
215 }
216 
217 KoToolProxy *KisCanvasWidgetBase::toolProxy() const
218 {
219  return m_d->toolProxy;
220 }
221 
222 QVariant KisCanvasWidgetBase::processInputMethodQuery(Qt::InputMethodQuery query) const
223 {
224  if (query == Qt::ImMicroFocus) {
225  QRectF rect = m_d->toolProxy->inputMethodQuery(query, *m_d->viewConverter).toRectF();
226  return m_d->coordinatesConverter->flakeToWidget(rect);
227  }
228  return m_d->toolProxy->inputMethodQuery(query, *m_d->viewConverter);
229 }
230 
231 void KisCanvasWidgetBase::processInputMethodEvent(QInputMethodEvent *event)
232 {
233  m_d->toolProxy->inputMethodEvent(event);
234 }
kis_update_info.h
KisConfig::checkersColor1
QColor checkersColor1(bool defaultValue=false) const
Definition: kis_config.cc:971
QColor
kis_config.h
QTimer
QRect
KisConfig::checkSize
qint32 checkSize(bool defaultValue=false) const
Definition: kis_config.cc:924
KisCanvasWidgetBase::notifyConfigChanged
void notifyConfigChanged()
Definition: kis_canvas_widget_base.cpp:185
KoViewConverter
KisCanvasWidgetBase::setWrapAroundViewingMode
void setWrapAroundViewingMode(bool value) override
Definition: kis_canvas_widget_base.cpp:160
QImage::rect
QRect rect() const
KisCanvasWidgetBase::~KisCanvasWidgetBase
~KisCanvasWidgetBase() override
Definition: kis_canvas_widget_base.cpp:63
QList
QPainter
QPainter::fillRect
void fillRect(const QRectF &rectangle, const QBrush &brush)
KisConfig
Definition: kis_config.h:28
KisCanvasWidgetBase::processInputMethodQuery
QVariant processInputMethodQuery(Qt::InputMethodQuery query) const
Event handlers to be called by derived canvas event handlers.
Definition: kis_canvas_widget_base.cpp:222
QPainter::end
bool end()
QPainter::setTransform
void setTransform(const QTransform &transform, bool combine)
kis_canvas_decoration.h
QString
KisConfig::checkersColor2
QColor checkersColor2(bool defaultValue=false) const
Definition: kis_config.cc:982
KisCanvasWidgetBase::processInputMethodEvent
void processInputMethodEvent(QInputMethodEvent *event)
Definition: kis_canvas_widget_base.cpp:231
KisCanvasWidgetBase::canvas
KisCanvas2 * canvas() const
Definition: kis_canvas_widget_base.cpp:196
KoToolProxy
KisViewManager.h
KisCanvasWidgetBase::createCheckersImage
static QImage createCheckersImage(qint32 checkSize=-1)
Returns one check of the background checkerboard pattern.
Definition: kis_canvas_widget_base.cpp:165
KisCanvasWidgetBase::drawDecorations
void drawDecorations(QPainter &gc, const QRect &updateWidgetRect) const override
Draw the specified decorations on the view.
Definition: kis_canvas_widget_base.cpp:76
KisCanvasWidgetBase::coordinatesConverter
KisCoordinatesConverter * coordinatesConverter() const
Definition: kis_canvas_widget_base.cpp:201
KisSharedPtr
Definition: kis_ui_types.h:14
KisCanvasWidgetBase::addDecoration
void addDecoration(KisCanvasDecorationSP deco) override
Definition: kis_canvas_widget_base.cpp:123
kis_canvas_widget_base.h
KisCanvasWidgetBase::setDecorations
void setDecorations(const QList< KisCanvasDecorationSP > &) override
Definition: kis_canvas_widget_base.cpp:149
QRectF
KisCanvasWidgetBase::KisCanvasWidgetBase
KisCanvasWidgetBase(KisCanvas2 *canvas, KisCoordinatesConverter *coordinatesConverter)
Definition: kis_canvas_widget_base.cpp:57
QPainter::restore
void restore()
KisCanvasWidgetBase::removeDecoration
void removeDecoration(const QString &id) override
Definition: kis_canvas_widget_base.cpp:129
KisCanvasDecoration::comparePriority
static bool comparePriority(KisCanvasDecorationSP decoration1, KisCanvasDecorationSP decoration2)
Definition: kis_canvas_decoration.cc:84
QPainter::save
void save()
KisDocument.h
KisCoordinatesConverter
Definition: kis_coordinates_converter.h:44
KisCanvasWidgetBase::toolProxy
KoToolProxy * toolProxy() const override
Definition: kis_canvas_widget_base.cpp:217
QVector< QRect >
KisCanvasWidgetBase::borderColor
QColor borderColor() const
Returns the color of the border, i.e.
Definition: kis_canvas_widget_base.cpp:191
QVariant
QInputMethodEvent
QPainter::setRenderHint
void setRenderHint(RenderHint hint, bool on)
KisCanvasWidgetBase::updateCanvasProjection
QVector< QRect > updateCanvasProjection(const QVector< KisUpdateInfoSP > &infoObjects) override
Definition: kis_canvas_widget_base.cpp:206
KisConfig::canvasBorderColor
QColor canvasBorderColor(bool defaultValue=false) const
Definition: kis_config.cc:949
QImage
kis_selection_manager.h
kis_canvas2.h
kis_coordinates_converter.h
KisCanvasWidgetBase::decorations
QList< KisCanvasDecorationSP > decorations() const override
Definition: kis_canvas_widget_base.cpp:155
KisCanvasWidgetBase::decoration
KisCanvasDecorationSP decoration(const QString &id) const override
Definition: kis_canvas_widget_base.cpp:139
This file is part of the KDE documentation.
Documentation copyright © 1996-2021 The KDE developers.
Generated on Thu Mar 4 2021 23:37:22 by doxygen 1.8.16 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

libs/ui

Skip menu "libs/ui"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

krita API Reference

Skip menu "krita API Reference"
  • libs
  •   KritaBasicFlakes
  •   brush
  •   KritaUndo2
  •   KritaFlake
  •   image
  •   KritaPlugin
  •   Krita
  •   KritaPigment
  •   KritaResources
  •   KritaStore
  •   ui
  •   KritaWidgets
  •   KritaWidgetUtils
  • plugins
  •   Assitants
  •   Extensions
  •   Filters
  •   Generators
  •   Formats
  •           src
  •   PaintOps
  •     libpaintop

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal