Changeset View
Changeset View
Standalone View
Standalone View
plugins/tools/basictools/kis_tool_multihand.cpp
Context not available. | |||||
164 | void KisToolMultihand::paint(QPainter& gc, const KoViewConverter &converter) | 164 | void KisToolMultihand::paint(QPainter& gc, const KoViewConverter &converter) | ||
---|---|---|---|---|---|
165 | { | 165 | { | ||
166 | QPainterPath path; | 166 | QPainterPath path; | ||
167 | | ||||
168 | | ||||
167 | if (m_transformMode == COPYTRANSLATE) { | 169 | if (m_transformMode == COPYTRANSLATE) { | ||
170 | | ||||
168 | for (QPointF dPos : m_subbrOriginalLocations) { | 171 | for (QPointF dPos : m_subbrOriginalLocations) { | ||
169 | if (m_addSubbrushesMode) { | 172 | if (m_addSubbrushesMode) { | ||
170 | path.addEllipse(dPos, 10, 10); // Show subbrush reference locations | 173 | path.addEllipse(dPos, 10, 10); // Show subbrush reference locations | ||
Context not available. | |||||
175 | } | 178 | } | ||
176 | else { | 179 | else { | ||
177 | // Show where subbrush strokes are predicted to land | 180 | // Show where subbrush strokes are predicted to land | ||
181 | // QPainterPath::operator += discards open paths | ||||
178 | path += m_currentOutline.translated(dPos - m_axesPoint); | 182 | path += m_currentOutline.translated(dPos - m_axesPoint); | ||
179 | } | 183 | } | ||
180 | } | 184 | } | ||
181 | if (m_addSubbrushesMode) { | 185 | | ||
182 | // add a cross shape to the main tool outline as well | 186 | // add a cross shape to the main tool outline as well | ||
183 | 187 | if (m_addSubbrushesMode) { | |||
184 | path.moveTo(m_lastToolPos.x() - 15, m_lastToolPos.y()); | 188 | path.moveTo(m_lastToolPos.x() - 15, m_lastToolPos.y()); | ||
185 | path.lineTo(m_lastToolPos.x() + 15, m_lastToolPos.y()); | 189 | path.lineTo(m_lastToolPos.x() + 15, m_lastToolPos.y()); | ||
186 | path.moveTo(m_lastToolPos.x(), m_lastToolPos.y() - 15); | 190 | path.moveTo(m_lastToolPos.x(), m_lastToolPos.y() - 15); | ||
187 | path.lineTo(m_lastToolPos.x(), m_lastToolPos.y() + 15); | 191 | path.lineTo(m_lastToolPos.x(), m_lastToolPos.y() + 15); | ||
188 | } | 192 | } | ||
193 | | ||||
194 | paintToolOutline(&gc, pixelToView(path)); | ||||
189 | } | 195 | } | ||
190 | if(m_setupAxesFlag) { | 196 | | ||
197 | if (m_showAxes) { | ||||
191 | int diagonal = (currentImage()->height() + currentImage()->width()); | 198 | int diagonal = (currentImage()->height() + currentImage()->width()); | ||
192 | 199 | | |||
193 | path.moveTo(m_axesPoint.x()-diagonal*cos(m_angle), m_axesPoint.y()-diagonal*sin(m_angle)); | 200 | // add division guide lines if using multiple brushes | ||
194 | path.lineTo(m_axesPoint.x()+diagonal*cos(m_angle), m_axesPoint.y()+diagonal*sin(m_angle)); | 201 | if (m_handsCount > 1 && m_transformMode == SYMMETRY || | ||
195 | path.moveTo(m_axesPoint.x()-diagonal*cos(m_angle+M_PI_2), m_axesPoint.y()-diagonal*sin(m_angle+M_PI_2)); | 202 | m_handsCount > 1 && m_transformMode == SNOWFLAKE ) { | ||
196 | path.lineTo(m_axesPoint.x()+diagonal*cos(m_angle+M_PI_2), m_axesPoint.y()+diagonal*sin(m_angle+M_PI_2)); | | |||
197 | } | | |||
198 | else { | | |||
199 | KisToolFreehand::paint(gc, converter); | | |||
200 | // Force paint axeslines of "origin" point when in COPYTRANSLATE addSubbrushes mode. | | |||
201 | if(m_showAxes || (m_transformMode == COPYTRANSLATE && m_addSubbrushesMode)){ | | |||
202 | int diagonal = (currentImage()->height() + currentImage()->width()); | | |||
203 | 203 | | |||
204 | qreal axesAngle = 360.0 / float(m_handsCount); | ||||
205 | float currentAngle = 0.0; | ||||
206 | float startingInsetLength = 20; // don't start each line at the origin so we can see better when all points converge | ||||
207 | | ||||
208 | // draw lines radiating from the origin | ||||
209 | for( int i=0; i < m_handsCount; i++) { | ||||
210 | | ||||
211 | currentAngle = i*axesAngle; | ||||
212 | | ||||
213 | // convert angles to radians since cos and sin need that | ||||
214 | currentAngle = currentAngle * 0.017453 + m_angle; // m_angle is current rotation set on UI | ||||
215 | | ||||
216 | QPoint startingSpot = QPoint(m_axesPoint.x()+ (cos(currentAngle)*startingInsetLength), m_axesPoint.y()+ (sin(currentAngle))*startingInsetLength ); | ||||
217 | path.moveTo(startingSpot.x(), startingSpot.y()); | ||||
218 | QPointF symmetryLinePoint(m_axesPoint.x()+ (cos(currentAngle)*diagonal), m_axesPoint.y()+ (sin(currentAngle))*diagonal ); | ||||
219 | path.lineTo(symmetryLinePoint); | ||||
220 | } | ||||
221 | | ||||
222 | } | ||||
223 | else if(m_transformMode == MIRROR) { | ||||
224 | | ||||
225 | if (m_mirrorHorizontally) { | ||||
226 | path.moveTo(m_axesPoint.x()-diagonal*cos(m_angle+M_PI_2), m_axesPoint.y()-diagonal*sin(m_angle+M_PI_2)); | ||||
227 | path.lineTo(m_axesPoint.x()+diagonal*cos(m_angle+M_PI_2), m_axesPoint.y()+diagonal*sin(m_angle+M_PI_2)); | ||||
228 | } | ||||
229 | | ||||
230 | if(m_mirrorVertically) { | ||||
231 | path.moveTo(m_axesPoint.x()-diagonal*cos(m_angle), m_axesPoint.y()-diagonal*sin(m_angle)); | ||||
232 | path.lineTo(m_axesPoint.x()+diagonal*cos(m_angle), m_axesPoint.y()+diagonal*sin(m_angle)); | ||||
233 | } | ||||
234 | } | ||||
235 | else { | ||||
236 | | ||||
237 | // draw the horiz/vertical line for axis origin | ||||
204 | path.moveTo(m_axesPoint.x()-diagonal*cos(m_angle), m_axesPoint.y()-diagonal*sin(m_angle)); | 238 | path.moveTo(m_axesPoint.x()-diagonal*cos(m_angle), m_axesPoint.y()-diagonal*sin(m_angle)); | ||
205 | path.lineTo(m_axesPoint.x()+diagonal*cos(m_angle), m_axesPoint.y()+diagonal*sin(m_angle)); | 239 | path.lineTo(m_axesPoint.x()+diagonal*cos(m_angle), m_axesPoint.y()+diagonal*sin(m_angle)); | ||
206 | path.moveTo(m_axesPoint.x()-diagonal*cos(m_angle+M_PI_2), m_axesPoint.y()-diagonal*sin(m_angle+M_PI_2)); | 240 | path.moveTo(m_axesPoint.x()-diagonal*cos(m_angle+M_PI_2), m_axesPoint.y()-diagonal*sin(m_angle+M_PI_2)); | ||
207 | path.lineTo(m_axesPoint.x()+diagonal*cos(m_angle+M_PI_2), m_axesPoint.y()+diagonal*sin(m_angle+M_PI_2)); | 241 | path.lineTo(m_axesPoint.x()+diagonal*cos(m_angle+M_PI_2), m_axesPoint.y()+diagonal*sin(m_angle+M_PI_2)); | ||
208 | } | 242 | } | ||
243 | | ||||
209 | } | 244 | } | ||
245 | | ||||
246 | KisToolFreehand::paint(gc, converter); | ||||
247 | | ||||
248 | // origin point preview line/s | ||||
249 | gc.save(); | ||||
250 | QPen outlinePen; | ||||
251 | outlinePen.setColor(QColor(100,100,100,150)); | ||||
252 | outlinePen.setStyle(Qt::PenStyle::DotLine); | ||||
253 | gc.setPen(outlinePen); | ||||
210 | paintToolOutline(&gc, pixelToView(path)); | 254 | paintToolOutline(&gc, pixelToView(path)); | ||
255 | gc.restore(); | ||||
256 | | ||||
257 | | ||||
258 | // fill in a dot for the origin if showing axis | ||||
259 | if (m_showAxes) { | ||||
260 | // draw a dot at the origin point to help with precisly moving | ||||
261 | QPainterPath dotPath; | ||||
262 | int dotRadius = 4; | ||||
263 | dotPath.moveTo(m_axesPoint.x(), m_axesPoint.y()); | ||||
264 | dotPath.addEllipse(m_axesPoint.x()- dotRadius*0.25, m_axesPoint.y()- dotRadius*0.25, dotRadius, dotRadius); // last 2 parameters are dot's size | ||||
265 | | ||||
266 | QBrush fillBrush; | ||||
267 | fillBrush.setColor(QColor(255, 255, 255, 255)); | ||||
268 | fillBrush.setStyle(Qt::SolidPattern); | ||||
269 | gc.fillPath(pixelToView(dotPath), fillBrush); | ||||
270 | | ||||
271 | | ||||
272 | // add slight offset circle for contrast to help show it on | ||||
273 | dotPath = QPainterPath(); // resets path | ||||
274 | dotPath.addEllipse(m_axesPoint.x() - dotRadius*0.75, m_axesPoint.y()- dotRadius*0.75, dotRadius, dotRadius); // last 2 parameters are dot's size | ||||
275 | fillBrush.setColor(QColor(120, 120, 120, 255)); | ||||
276 | gc.fillPath(pixelToView(dotPath), fillBrush); | ||||
277 | } | ||||
278 | | ||||
211 | } | 279 | } | ||
212 | 280 | | |||
213 | void KisToolMultihand::initTransformations() | 281 | void KisToolMultihand::initTransformations() | ||
Context not available. | |||||
432 | { | 500 | { | ||
433 | m_handsCount = count; | 501 | m_handsCount = count; | ||
434 | m_configGroup.writeEntry("handsCount", count); | 502 | m_configGroup.writeEntry("handsCount", count); | ||
503 | updateCanvas(); | ||||
435 | } | 504 | } | ||
436 | 505 | | |||
437 | void KisToolMultihand::slotSetAxesAngle(qreal angle) | 506 | void KisToolMultihand::slotSetAxesAngle(qreal angle) | ||
Context not available. | |||||
496 | void KisToolMultihand::slotSetMirrorVertically(bool mirror) | 565 | void KisToolMultihand::slotSetMirrorVertically(bool mirror) | ||
497 | { | 566 | { | ||
498 | m_mirrorVertically = mirror; | 567 | m_mirrorVertically = mirror; | ||
568 | updateCanvas(); | ||||
499 | m_configGroup.writeEntry("mirrorVertically", mirror); | 569 | m_configGroup.writeEntry("mirrorVertically", mirror); | ||
500 | } | 570 | } | ||
501 | 571 | | |||
502 | void KisToolMultihand::slotSetMirrorHorizontally(bool mirror) | 572 | void KisToolMultihand::slotSetMirrorHorizontally(bool mirror) | ||
503 | { | 573 | { | ||
504 | m_mirrorHorizontally = mirror; | 574 | m_mirrorHorizontally = mirror; | ||
575 | updateCanvas(); | ||||
505 | m_configGroup.writeEntry("mirrorHorizontally", mirror); | 576 | m_configGroup.writeEntry("mirrorHorizontally", mirror); | ||
506 | } | 577 | } | ||
507 | 578 | | |||
Context not available. |