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

KritaWidgets

  • sources
  • kfour-appscomplete
  • krita
  • libs
  • widgets
KisVisualEllipticalSelectorShape.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) Wolthera van Hovell tot Westerflier <[email protected]>, (C) 2016
3  *
4  * SPDX-License-Identifier: GPL-2.0-or-later
5  */
6 #include "KisVisualEllipticalSelectorShape.h"
7 
8 #include <QColor>
9 #include <QPainter>
10 #include <QRect>
11 #include <QLineF>
12 #include <QtMath>
13 
14 #include "kis_debug.h"
15 #include "kis_global.h"
16 
17 KisVisualEllipticalSelectorShape::KisVisualEllipticalSelectorShape(QWidget *parent,
18  Dimensions dimension,
19  const KoColorSpace *cs,
20  int channel1, int channel2,
21  const KoColorDisplayRendererInterface *displayRenderer,
22  int barWidth,
23  singelDTypes d)
24  : KisVisualColorSelectorShape(parent, dimension, cs, channel1, channel2, displayRenderer)
25 {
26  //qDebug() << "creating KisVisualEllipticalSelectorShape" << this;
27  m_type = d;
28  m_barWidth = barWidth;
29 }
30 
31 KisVisualEllipticalSelectorShape::~KisVisualEllipticalSelectorShape()
32 {
33  //qDebug() << "deleting KisVisualEllipticalSelectorShape" << this;
34 }
35 
36 QSize KisVisualEllipticalSelectorShape::sizeHint() const
37 {
38  return QSize(180,180);
39 }
40 
41 void KisVisualEllipticalSelectorShape::setBorderWidth(int width)
42 {
43  m_barWidth = width;
44  forceImageUpdate();
45  update();
46 }
47 
48 QRect KisVisualEllipticalSelectorShape::getSpaceForSquare(QRect geom)
49 {
50  int sizeValue = qMin(width(),height());
51  QRect b(geom.left(), geom.top(), sizeValue, sizeValue);
52  QLineF radius(b.center(), QPointF(b.left()+m_barWidth, b.center().y()) );
53  radius.setAngle(135);
54  QPointF tl = radius.p2();
55  radius.setAngle(315);
56  QPointF br = radius.p2();
57  QRect r(tl.toPoint(), br.toPoint());
58  return r;
59 }
60 
61 QRect KisVisualEllipticalSelectorShape::getSpaceForCircle(QRect geom)
62 {
63  int sizeValue = qMin(width(),height());
64  QRect b(geom.left(), geom.top(), sizeValue, sizeValue);
65  QPointF tl = QPointF (b.topLeft().x()+m_barWidth, b.topLeft().y()+m_barWidth);
66  QPointF br = QPointF (b.bottomRight().x()-m_barWidth, b.bottomRight().y()-m_barWidth);
67  QRect r(tl.toPoint(), br.toPoint());
68  return r;
69 }
70 
71 QRect KisVisualEllipticalSelectorShape::getSpaceForTriangle(QRect geom)
72 {
73  int sizeValue = qMin(width(),height());
74  QPointF center(0.5 * width(), 0.5 * height());
75  qreal radius = 0.5 * sizeValue - (m_barWidth + 4);
76  QLineF rLine(center, QPointF(center.x() + radius, center.y()));
77  rLine.setAngle(330);
78  QPoint br(rLine.p2().toPoint());
79  //QPoint br(qCeil(rLine.p2().x()), qCeil(rLine.p2().y()));
80  QPoint tl(width() - br.x(), m_barWidth + 4);
81  QRect bound(tl, br);
82  // adjust with triangle default margin for cursor rendering
83  // it's not +5 because above calculation is for pixel center and ignores
84  // the fact that dimensions are then effectively 1px smaller...
85  bound.adjust(-5, -5, 4, 4);
86  return bound.intersected(geom);
87 }
88 
89 QPointF KisVisualEllipticalSelectorShape::convertShapeCoordinateToWidgetCoordinate(QPointF coordinate) const
90 {
91  qreal offset = 7.0;
92  qreal a = (qreal)width()*0.5;
93  QPointF center(a, a);
94  QLineF line(center, QPoint((m_barWidth*0.5),a));
95  qreal angle = coordinate.x()*360.0;
96  angle = 360.0 - fmod(angle+180.0, 360.0);
97  if (m_type==KisVisualEllipticalSelectorShape::borderMirrored) {
98  angle = (coordinate.x()/2)*360.0;
99  angle = fmod((angle+270.0), 360.0);
100  }
101  line.setAngle(angle);
102  if (getDimensions()!=KisVisualColorSelectorShape::onedimensional) {
103  line.setLength(qMin(coordinate.y()*(a-offset), a-offset));
104  }
105  return line.p2();
106 }
107 
108 QPointF KisVisualEllipticalSelectorShape::convertWidgetCoordinateToShapeCoordinate(QPointF coordinate) const
109 {
110  //default implementation:
111  qreal x = 0.5;
112  qreal y = 1.0;
113  qreal offset = 7.0;
114  QPointF center = QRectF(QPointF(0.0, 0.0), this->size()).center();
115  qreal a = (qreal(this->width()) / qreal(2));
116  qreal xRel = center.x()-coordinate.x();
117  qreal yRel = center.y()-coordinate.y();
118  qreal radius = sqrt(xRel*xRel+yRel*yRel);
119 
120  if (m_type!=KisVisualEllipticalSelectorShape::borderMirrored){
121  qreal angle = atan2(yRel, xRel);
122  angle = kisRadiansToDegrees(angle);
123  angle = fmod(angle+360, 360.0);
124  x = angle/360.0;
125  if (getDimensions()==KisVisualColorSelectorShape::twodimensional) {
126  y = qBound(0.0,radius/(a-offset), 1.0);
127  }
128 
129  } else {
130  qreal angle = atan2(xRel, yRel);
131  angle = kisRadiansToDegrees(angle);
132  angle = fmod(angle+180, 360.0);
133  if (angle>180.0) {
134  angle = 360.0-angle;
135  }
136  x = (angle/360.0)*2;
137  if (getDimensions()==KisVisualColorSelectorShape::twodimensional) {
138  y = qBound(0.0,(radius+offset)/a, 1.0);
139  }
140  }
141 
142  return QPointF(x, y);
143 }
144 
145 QPointF KisVisualEllipticalSelectorShape::mousePositionToShapeCoordinate(const QPointF &pos, const QPointF &dragStart) const
146 {
147  QPointF pos2(pos);
148  if (m_type == KisVisualEllipticalSelectorShape::borderMirrored) {
149  qreal h_center = width()/2.0;
150  bool start_left = dragStart.x() < h_center;
151  bool cursor_left = pos.x() < h_center;
152  if (start_left != cursor_left) {
153  pos2.setX(h_center);
154  }
155  }
156  return convertWidgetCoordinateToShapeCoordinate(pos2);
157 }
158 
159 QRegion KisVisualEllipticalSelectorShape::getMaskMap()
160 {
161  QRegion mask = QRegion(0,0,width(),height(), QRegion::Ellipse);
162  if (getDimensions()==KisVisualColorSelectorShape::onedimensional) {
163  mask = mask.subtracted(QRegion(m_barWidth, m_barWidth, width()-(m_barWidth*2), height()-(m_barWidth*2), QRegion::Ellipse));
164  }
165  return mask;
166 }
167 
168 QImage KisVisualEllipticalSelectorShape::renderAlphaMask() const
169 {
170  // Hi-DPI aware rendering requires that we determine the device pixel dimension;
171  // actual widget size in device pixels is not accessible unfortunately, it might be 1px smaller...
172  const int deviceWidth = qCeil(width() * devicePixelRatioF());
173  const int deviceHeight = qCeil(height() * devicePixelRatioF());
174 
175  QImage alphaMask(deviceWidth, deviceHeight, QImage::Format_Alpha8);
176  alphaMask.fill(0);
177  alphaMask.setDevicePixelRatio(devicePixelRatioF());
178  QPainter painter(&alphaMask);
179  painter.setRenderHint(QPainter::Antialiasing);
180  painter.setBrush(Qt::white);
181  painter.setPen(Qt::NoPen);
182  painter.drawEllipse(2, 2, width() - 4, height() - 4);
183  //painter.setBrush(Qt::black);
184  if (getDimensions() == KisVisualColorSelectorShape::onedimensional) {
185  painter.setCompositionMode(QPainter::CompositionMode_Clear);
186  painter.drawEllipse(m_barWidth - 2, m_barWidth - 2, width() - 2*(m_barWidth-2), height() - 2*(m_barWidth-2));
187  }
188  return alphaMask;
189 }
190 
191 void KisVisualEllipticalSelectorShape::drawCursor()
192 {
193  //qDebug() << this << "KisVisualEllipticalSelectorShape::drawCursor: image needs update" << imagesNeedUpdate();
194  QPointF cursorPoint = convertShapeCoordinateToWidgetCoordinate(getCursorPosition());
195  QImage fullSelector = getImageMap();
196  QColor col = getColorFromConverter(getCurrentColor());
197  QPainter painter;
198  painter.begin(&fullSelector);
199  painter.setRenderHint(QPainter::Antialiasing);
200  QBrush fill;
201  fill.setStyle(Qt::SolidPattern);
202 
203  int cursorwidth = 5;
204 
205  if (m_type==KisVisualEllipticalSelectorShape::borderMirrored) {
206  painter.setPen(Qt::white);
207  fill.setColor(Qt::white);
208  painter.setBrush(fill);
209  painter.drawEllipse(cursorPoint, cursorwidth, cursorwidth);
210  QPointF mirror(width() - cursorPoint.x(), cursorPoint.y());
211  painter.drawEllipse(mirror, cursorwidth, cursorwidth);
212  fill.setColor(col);
213  painter.setPen(Qt::black);
214  painter.setBrush(fill);
215  painter.drawEllipse(cursorPoint, cursorwidth-1, cursorwidth-1);
216  painter.drawEllipse(mirror, cursorwidth-1, cursorwidth-1);
217 
218  } else {
219  painter.setPen(Qt::white);
220  fill.setColor(Qt::white);
221  painter.setBrush(fill);
222  painter.drawEllipse(cursorPoint, cursorwidth, cursorwidth);
223  fill.setColor(col);
224  painter.setPen(Qt::black);
225  painter.setBrush(fill);
226  painter.drawEllipse(cursorPoint, cursorwidth-1.0, cursorwidth-1.0);
227  }
228  painter.end();
229  setFullImage(fullSelector);
230 }
KisVisualColorSelectorShape::getDimensions
Dimensions getDimensions() const
getDimensions
Definition: KisVisualColorSelectorShape.cpp:345
QColor
QWidget::y
int y() const
QPainter::setPen
void setPen(const QColor &color)
QRegion
KisVisualEllipticalSelectorShape::getSpaceForCircle
QRect getSpaceForCircle(QRect geom) override
Definition: KisVisualEllipticalSelectorShape.cpp:61
QWidget::pos
QPoint pos() const
QImage::fill
void fill(uint pixelValue)
QPainter::drawEllipse
void drawEllipse(const QRectF &rectangle)
QRect
KisVisualColorSelectorShape::getCurrentColor
KoColor getCurrentColor()
getCurrentColor
Definition: KisVisualColorSelectorShape.cpp:354
KisVisualColorSelectorShape::onedimensional
Definition: KisVisualColorSelectorShape.h:45
QWidget::update
void update()
KisVisualColorSelectorShape::Dimensions
Dimensions
The Dimensions enum Whether or not the shape is single or two dimensional.
Definition: KisVisualColorSelectorShape.h:45
QWidget
KisVisualColorSelectorShape::getImageMap
QImage getImageMap()
Definition: KisVisualColorSelectorShape.cpp:156
QSize
QWidget::x
int x() const
QPoint::x
int x() const
KisVisualColorSelectorShape::setFullImage
void setFullImage(QImage full)
setFullImage Set the full widget image to be painted.
Definition: KisVisualColorSelectorShape.cpp:350
QPainter
QPointF
QRect::left
int left() const
KisVisualEllipticalSelectorShape::~KisVisualEllipticalSelectorShape
~KisVisualEllipticalSelectorShape() override
Definition: KisVisualEllipticalSelectorShape.cpp:31
QPainter::begin
bool begin(QPaintDevice *device)
QRect::top
int top() const
QPainter::end
bool end()
QPointF::setX
void setX(qreal x)
QBrush::setStyle
void setStyle(Qt::BrushStyle style)
KisVisualEllipticalSelectorShape::KisVisualEllipticalSelectorShape
KisVisualEllipticalSelectorShape(QWidget *parent, Dimensions dimension, const KoColorSpace *cs, int channel1, int channel2, const KoColorDisplayRendererInterface *displayRenderer=KoDumbColorDisplayRenderer::instance(), int barWidth=20, KisVisualEllipticalSelectorShape::singelDTypes d=KisVisualEllipticalSelectorShape::border)
Definition: KisVisualEllipticalSelectorShape.cpp:17
KisVisualEllipticalSelectorShape::borderMirrored
Definition: KisVisualEllipticalSelectorShape.h:15
KisVisualColorSelectorShape::getCursorPosition
QPointF getCursorPosition()
getCursorPosition
Definition: KisVisualColorSelectorShape.cpp:67
KisVisualEllipticalSelectorShape::getSpaceForSquare
QRect getSpaceForSquare(QRect geom) override
getSpaceForSquare
Definition: KisVisualEllipticalSelectorShape.cpp:48
QLineF
QBrush
QPainter::setBrush
void setBrush(const QBrush &brush)
KisVisualColorSelectorShape
The KisVisualColorSelectorShape class A 2d widget can represent at maximum 2 coordinates.
Definition: KisVisualColorSelectorShape.h:37
KisVisualEllipticalSelectorShape::setBorderWidth
void setBorderWidth(int width) override
setBorderWidth set the border of the single dimensional selector.
Definition: KisVisualEllipticalSelectorShape.cpp:41
QPainter::setCompositionMode
void setCompositionMode(CompositionMode mode)
QRectF::center
QPointF center() const
QWidget::height
int height() const
QPointF::x
qreal x() const
QPointF::y
qreal y() const
QWidget::mask
QRegion mask() const
QBrush::setColor
void setColor(const QColor &color)
QPointF::toPoint
QPoint toPoint() const
QRectF
KisVisualEllipticalSelectorShape::renderAlphaMask
QImage renderAlphaMask() const override
render the alpha mask for the widget background the returned image is expected to be QImage::Format_A...
Definition: KisVisualEllipticalSelectorShape.cpp:168
KisVisualColorSelectorShape::forceImageUpdate
void forceImageUpdate()
forceImageUpdate force the image to recache.
Definition: KisVisualColorSelectorShape.cpp:122
KisVisualEllipticalSelectorShape::singelDTypes
singelDTypes
Definition: KisVisualEllipticalSelectorShape.h:15
KisVisualColorSelectorShape::twodimensional
Definition: KisVisualColorSelectorShape.h:45
KisVisualEllipticalSelectorShape::getSpaceForTriangle
QRect getSpaceForTriangle(QRect geom) override
Definition: KisVisualEllipticalSelectorShape.cpp:71
QRegion::subtracted
QRegion subtracted(const QRegion &r) const
QPainter::setRenderHint
void setRenderHint(RenderHint hint, bool on)
QWidget::width
int width() const
KisVisualEllipticalSelectorShape.h
QImage
QWidget::size
QSize size() const
KisVisualEllipticalSelectorShape::mousePositionToShapeCoordinate
QPointF mousePositionToShapeCoordinate(const QPointF &pos, const QPointF &dragStart) const override
default implementation just calls convertWidgetCoordinateToShapeCoordinate(pos)
Definition: KisVisualEllipticalSelectorShape.cpp:145
QPoint
KisVisualColorSelectorShape::getColorFromConverter
QColor getColorFromConverter(KoColor c)
getColorFromConverter
Definition: KisVisualColorSelectorShape.cpp:129
This file is part of the KDE documentation.
Documentation copyright © 1996-2021 The KDE developers.
Generated on Tue Jan 19 2021 23:44:00 by doxygen 1.8.16 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

KritaWidgets

Skip menu "KritaWidgets"
  • Main Page
  • Namespace List
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

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