Krita Source Code Documentation
Loading...
Searching...
No Matches
HorizontalPaintingStrategy Class Reference

#include <KoRuler_p.h>

+ Inheritance diagram for HorizontalPaintingStrategy:

Public Member Functions

QRectF drawBackground (const KoRulerPrivate *ruler, QPainter &painter) override
 
void drawIndents (const KoRulerPrivate *ruler, QPainter &painter) override
 
void drawMeasurements (const KoRulerPrivate *ruler, QPainter &painter, const QRectF &rectangle) override
 
void drawTabs (const KoRulerPrivate *ruler, QPainter &painter) override
 
 HorizontalPaintingStrategy ()
 
QSize sizeHint () override
 
- Public Member Functions inherited from PaintingStrategy
 PaintingStrategy ()
 constructor
 
virtual ~PaintingStrategy ()
 destructor
 

Private Attributes

qreal lengthInPixel {0.0}
 

Detailed Description

Definition at line 71 of file KoRuler_p.h.

Constructor & Destructor Documentation

◆ HorizontalPaintingStrategy()

HorizontalPaintingStrategy::HorizontalPaintingStrategy ( )
inline

Definition at line 74 of file KoRuler_p.h.

Member Function Documentation

◆ drawBackground()

QRectF HorizontalPaintingStrategy::drawBackground ( const KoRulerPrivate * ruler,
QPainter & painter )
overridevirtual

Draw the background of the ruler.

Parameters
rulerthe ruler to draw on.
painterthe painter we can paint with.

Implements PaintingStrategy.

Definition at line 118 of file KoRuler.cpp.

119{
120 lengthInPixel = d->viewConverter->documentToViewX(d->rulerLength);
121 QRectF rectangle;
122
123 rectangle.setX(qMax(0, d->offset));
124 rectangle.setY(0);
125 rectangle.setWidth(qMin(qreal(d->ruler->width() - 1.0 - rectangle.x()),
126 (d->offset >= 0) ? lengthInPixel : lengthInPixel + d->offset));
127 rectangle.setHeight(d->ruler->height() - 1);
128 QRectF activeRangeRectangle;
129 activeRangeRectangle.setX(qMax(rectangle.x() + 1,
130 d->viewConverter->documentToViewX(d->effectiveActiveRangeStart()) + d->offset));
131 activeRangeRectangle.setY(rectangle.y() + 1);
132 activeRangeRectangle.setRight(qMin(rectangle.right() - 1,
133 d->viewConverter->documentToViewX(d->effectiveActiveRangeEnd()) + d->offset));
134 activeRangeRectangle.setHeight(rectangle.height() - 2);
135
136 painter.setPen(QPen(d->ruler->palette().color(QPalette::Mid), 0));
137
138 painter.fillRect(rectangle,d->ruler->palette().color(QPalette::AlternateBase)); // make background slightly different so it is easier to see
139 painter.drawRect(rectangle);
140
141 if(d->effectiveActiveRangeStart() != d->effectiveActiveRangeEnd())
142 painter.fillRect(activeRangeRectangle, d->ruler->palette().brush(QPalette::Base));
143
144 if(d->showSelectionBorders) {
145 // Draw first selection border
146 if(d->firstSelectionBorder > 0) {
147 qreal border = d->viewConverter->documentToViewX(d->firstSelectionBorder) + d->offset;
148 painter.drawLine(QPointF(border, rectangle.y() + 1), QPointF(border, rectangle.bottom() - 1));
149 }
150 // Draw second selection border
151 if(d->secondSelectionBorder > 0) {
152 qreal border = d->viewConverter->documentToViewX(d->secondSelectionBorder) + d->offset;
153 painter.drawLine(QPointF(border, rectangle.y() + 1), QPointF(border, rectangle.bottom() - 1));
154 }
155 }
156
157 return rectangle;
158}

References lengthInPixel.

◆ drawIndents()

void HorizontalPaintingStrategy::drawIndents ( const KoRulerPrivate * ruler,
QPainter & painter )
overridevirtual

Draw the indicators for the indents of a text paragraph

Parameters
rulerthe ruler to draw on.
painterthe painter we can paint with.

Implements PaintingStrategy.

Definition at line 378 of file KoRuler.cpp.

379{
380 QPolygonF polygon;
381
382 painter.setBrush(d->ruler->palette().brush(QPalette::Base));
383 painter.setRenderHint( QPainter::Antialiasing );
384
385 qreal x;
386 // Draw first line start indent
387 if (d->rightToLeft)
388 x = d->effectiveActiveRangeEnd() - d->firstLineIndent - d->paragraphIndent;
389 else
390 x = d->effectiveActiveRangeStart() + d->firstLineIndent + d->paragraphIndent;
391 // convert and use the +0.5 to go to nearest integer so that the 0.5 added below ensures sharp lines
392 x = int(d->viewConverter->documentToViewX(x) + d->offset + 0.5);
393 polygon << QPointF(x+6.5, 0.5)
394 << QPointF(x+0.5, 8.5)
395 << QPointF(x-5.5, 0.5)
396 << QPointF(x+5.5, 0.5);
397 painter.drawPolygon(polygon);
398
399 // draw the hanging indent.
400 if (d->rightToLeft)
401 x = d->effectiveActiveRangeStart() + d->endIndent;
402 else
403 x = d->effectiveActiveRangeStart() + d->paragraphIndent;
404 // convert and use the +0.5 to go to nearest integer so that the 0.5 added below ensures sharp lines
405 x = int(d->viewConverter->documentToViewX(x) + d->offset + 0.5);
406 const int bottom = d->ruler->height();
407 polygon.clear();
408 polygon << QPointF(x+6.5, bottom - 0.5)
409 << QPointF(x+0.5, bottom - 8.5)
410 << QPointF(x-5.5, bottom - 0.5)
411 << QPointF(x+5.5, bottom - 0.5);
412 painter.drawPolygon(polygon);
413
414 // Draw end-indent or paragraph indent if mode is rightToLeft
415 qreal diff;
416 if (d->rightToLeft)
417 diff = d->viewConverter->documentToViewX(d->effectiveActiveRangeEnd()
418 - d->paragraphIndent) + d->offset - x;
419 else
420 diff = d->viewConverter->documentToViewX(d->effectiveActiveRangeEnd() - d->endIndent)
421 + d->offset - x;
422 polygon.translate(diff, 0);
423 painter.drawPolygon(polygon);
424}

◆ drawMeasurements()

void HorizontalPaintingStrategy::drawMeasurements ( const KoRulerPrivate * ruler,
QPainter & painter,
const QRectF & rectangle )
overridevirtual

Draw the indicators for the measurements which typically are drawn every [unit].

Parameters
rulerthe ruler to draw on.
painterthe painter we can paint with.
rectangle

Implements PaintingStrategy.

Definition at line 248 of file KoRuler.cpp.

249{
250 const QFont font = QFontDatabase::systemFont(QFontDatabase::SmallestReadableFont);
251 const QFontMetrics fontMetrics(font);
252 const QPen numberPen(d->ruler->palette().color(QPalette::Text), 0);
253 const QPen markerPen(d->ruler->palette().color(QPalette::Inactive, QPalette::Text), 0);
254 painter.setPen(markerPen);
255 painter.setFont(font);
256
257 // length of the ruler in pixels
258 const int rulerLengthPixel = d->viewConverter->documentToViewX(d->rulerLength);
259 // length of the ruler in the chosen unit
260 const qreal rulerLengthUnit = d->unit.toUserValue(d->rulerLength);
261 // length of a unit in pixels
262 const qreal unitLength = d->viewConverter->documentToViewX(d->unit.fromUserValue(1.0));
263 // length of the text for longest number with some padding
264 const int textLength = fontMetrics.horizontalAdvance(QString::number(qCeil(rulerLengthUnit))) + 20;
265 // the minimal separation of numbers that won't make the text a mess
266 const qreal minimalNumberSeparation = qCeil(textLength / unitLength);
267 // the chosen separation of numbers so that we have "whole" numbers
268 qreal numberSeparation = minimalNumberSeparation;
269 if (minimalNumberSeparation <= 5) {
270 } else if (minimalNumberSeparation <= 10) {
271 numberSeparation = 10;
272 } else if (minimalNumberSeparation <= 20) {
273 numberSeparation = 20;
274 } else if (minimalNumberSeparation <= 50) {
275 numberSeparation = 50;
276 } else if (minimalNumberSeparation <= 100) {
277 numberSeparation = 100;
278 } else if (minimalNumberSeparation <= 200) {
279 numberSeparation = 200;
280 } else if (minimalNumberSeparation <= 500) {
281 numberSeparation = 500;
282 } else {
283 numberSeparation = qRound(qreal(numberSeparation / 100)) * 100;
284 }
285 // the chosen separation converted to pixel
286 const int pixelSeparation = qRound(d->viewConverter->documentToViewX(d->unit.fromUserValue(numberSeparation)));
287 // the value used to calculate displacement of secondary marks
288 const int secondarydisplacement = d->rightToLeft ? -pixelSeparation : pixelSeparation;
289
290 // Draw the marks
291 int rulerEnd;
292 qreal numberStart, numberEnd;
293 if (d->rightToLeft) {
294 rulerEnd = d->offset;
295 numberStart = d->unit.toUserValue(d->viewConverter->viewToDocumentX(
296 rulerLengthPixel + d->offset - rectangle.right()));
297 // draw the partly hidden mark when the left part of the ruler is
298 // invisible
299 int pixelEnd = rulerLengthPixel + d->offset - rectangle.left();
300 if (rulerEnd + textLength < rectangle.left()) {
301 pixelEnd -= textLength;
302 }
303 numberEnd = d->unit.toUserValue(d->viewConverter->viewToDocumentX(
304 pixelEnd));
305 if (rulerLengthPixel + d->offset > rectangle.right()) {
306 numberStart -= fmod(numberStart, numberSeparation);
307 }
308 } else {
309 rulerEnd = d->offset + rulerLengthPixel;
310 numberStart = d->unit.toUserValue(d->viewConverter->viewToDocumentX(
311 rectangle.left() - d->offset));
312 // draw the partly hidden mark when the right part of the ruler is
313 // invisible
314 int pixelEnd = rectangle.right() - d->offset;
315 if (rulerEnd - textLength > rectangle.right()) {
316 pixelEnd += textLength;
317 }
318 numberEnd = d->unit.toUserValue(d->viewConverter->viewToDocumentX(
319 pixelEnd));
320 if (d->offset < 0) {
321 numberStart -= fmod(numberStart, numberSeparation);
322 }
323 }
324 for(qreal n = numberStart; n < numberEnd; n += numberSeparation) {
325 int posOnRuler = qRound(d->viewConverter->documentToViewX(d->unit.fromUserValue(n)));
326 int x = posOnRuler + d->offset;
327 if (d->rightToLeft) {
328 x = d->offset + rulerLengthPixel - posOnRuler;
329 }
330
331 // to draw the primary mark
332 painter.drawLine(QPointF(x, rectangle.bottom()-1),
333 QPointF(x, rectangle.bottom() - fullStepMarkerLength));
334 QString numberText = QString::number(n);
335 painter.setPen(numberPen);
336 painter.drawText(QPointF(x - fontMetrics.horizontalAdvance(numberText)/2.0,
338 numberText);
339 // start to draw secondary marks following the primary mark
340 painter.setPen(markerPen);
341
342 int xQuarterMark1 = qRound(qreal(x) + qreal(secondarydisplacement) / 4.0);
343 if (d->rightToLeft ? xQuarterMark1 < rulerEnd : xQuarterMark1 > rulerEnd)
344 break;
345 painter.drawLine(QPointF(xQuarterMark1, rectangle.bottom() - 1),
346 QPointF(xQuarterMark1, rectangle.bottom() - quarterStepMarkerLength));
347
348 int xHalfMark = qRound(qreal(x) + qreal(secondarydisplacement) / 2.0);
349 if (d->rightToLeft ? xHalfMark < rulerEnd : xHalfMark > rulerEnd)
350 break;
351 painter.drawLine(QPointF(xHalfMark, rectangle.bottom() - 1),
352 QPointF(xHalfMark, rectangle.bottom() - halfStepMarkerLength));
353
354 int xQuarterMark2 = qRound(qreal(x) + 3.0 * qreal(secondarydisplacement) / 4.0);
355 if (d->rightToLeft ? xQuarterMark2 < rulerEnd : xQuarterMark2 > rulerEnd)
356 break;
357 painter.drawLine(QPointF(xQuarterMark2, rectangle.bottom() - 1),
358 QPointF(xQuarterMark2, rectangle.bottom() - quarterStepMarkerLength));
359 }
360
361 // Draw the mouse indicator
362 const int mouseCoord = d->mouseCoordinate + d->offset;
363 if (d->selected == KoRulerPrivate::None || d->selected == KoRulerPrivate::HotSpot) {
364 const qreal top = rectangle.y() + 1;
365 const qreal bottom = rectangle.bottom() -1;
366 if (d->selected == KoRulerPrivate::None
367 && d->showMousePosition
368 && d->mouseCoordinate > 0
369 && d->mouseCoordinate < rulerLengthPixel)
370 painter.drawLine(QPointF(mouseCoord, top), QPointF(mouseCoord, bottom));
371 foreach (const KoRulerPrivate::HotSpotData & hp, d->hotspots) {
372 const qreal x = d->viewConverter->documentToViewX(hp.position) + d->offset;
373 painter.drawLine(QPointF(x, top), QPointF(x, bottom));
374 }
375 }
376}
static const int measurementTextAboveBelowMargin
Definition KoRuler.cpp:36
static const int halfStepMarkerLength
Definition KoRuler.cpp:34
static const int fullStepMarkerLength
Definition KoRuler.cpp:33
static const int quarterStepMarkerLength
Definition KoRuler.cpp:35

References fullStepMarkerLength, halfStepMarkerLength, KoRulerPrivate::HotSpot, measurementTextAboveBelowMargin, KoRulerPrivate::None, KoRulerPrivate::HotSpotData::position, and quarterStepMarkerLength.

◆ drawTabs()

void HorizontalPaintingStrategy::drawTabs ( const KoRulerPrivate * ruler,
QPainter & painter )
overridevirtual

Draw the indicators for text-tabs.

Parameters
rulerthe ruler to draw on.
painterthe painter we can paint with.

Implements PaintingStrategy.

Definition at line 160 of file KoRuler.cpp.

161{
162 if (! d->showTabs)
163 return;
164 QPolygonF polygon;
165
166 const QColor tabColor = d->ruler->palette().color(QPalette::Text);
167 painter.setPen(QPen(tabColor, 0));
168 painter.setBrush(tabColor);
169 painter.setRenderHint( QPainter::Antialiasing );
170
171 qreal position = -10000;
172
173 foreach (const KoRuler::Tab & t, d->tabs) {
174 qreal x;
175 if (d->rightToLeft) {
176 x = d->viewConverter->documentToViewX(d->effectiveActiveRangeEnd()
177 - (d->relativeTabs ? d->paragraphIndent : 0) - t.position) + d->offset;
178 } else {
179 x = d->viewConverter->documentToViewX(d->effectiveActiveRangeStart()
180 + (d->relativeTabs ? d->paragraphIndent : 0) + t.position) + d->offset;
181 }
182 position = qMax(position, t.position);
183
184 polygon.clear();
185 switch (t.type) {
186 case QTextOption::LeftTab:
187 polygon << QPointF(x+0.5, d->ruler->height() - 6.5)
188 << QPointF(x+6.5, d->ruler->height() - 0.5)
189 << QPointF(x+0.5, d->ruler->height() - 0.5);
190 painter.drawPolygon(polygon);
191 break;
192 case QTextOption::RightTab:
193 polygon << QPointF(x+0.5, d->ruler->height() - 6.5)
194 << QPointF(x-5.5, d->ruler->height() - 0.5)
195 << QPointF(x+0.5, d->ruler->height() - 0.5);
196 painter.drawPolygon(polygon);
197 break;
198 case QTextOption::CenterTab:
199 polygon << QPointF(x+0.5, d->ruler->height() - 6.5)
200 << QPointF(x-5.5, d->ruler->height() - 0.5)
201 << QPointF(x+6.5, d->ruler->height() - 0.5);
202 painter.drawPolygon(polygon);
203 break;
204 case QTextOption::DelimiterTab:
205 polygon << QPointF(x-5.5, d->ruler->height() - 0.5)
206 << QPointF(x+6.5, d->ruler->height() - 0.5);
207 painter.drawPolyline(polygon);
208 polygon << QPointF(x+0.5, d->ruler->height() - 0.5)
209 << QPointF(x+0.5, d->ruler->height() - 6.5);
210 painter.drawPolyline(polygon);
211 break;
212 default:
213 break;
214 }
215 }
216
217 // and also draw the regular interval tab that are non editable
218 if (d->tabDistance > 0.0) {
219 // first possible position
220 position = qMax(position, d->relativeTabs ? 0 : d->paragraphIndent);
221 if (position < 0) {
222 position = int(position / d->tabDistance) * d->tabDistance;
223 } else {
224 position = (int(position / d->tabDistance) + 1) * d->tabDistance;
225 }
226 while (position < d->effectiveActiveRangeEnd() - d->effectiveActiveRangeStart()
227 - d->endIndent) {
228 qreal x;
229 if (d->rightToLeft) {
230 x = d->viewConverter->documentToViewX(d->effectiveActiveRangeEnd()
231 - (d->relativeTabs ? d->paragraphIndent : 0) - position) + d->offset;
232 } else {
233 x = d->viewConverter->documentToViewX(d->effectiveActiveRangeStart()
234 + (d->relativeTabs ? d->paragraphIndent : 0) + position) + d->offset;
235 }
236
237 polygon.clear();
238 polygon << QPointF(x+0.5, d->ruler->height() - 3.5)
239 << QPointF(x+4.5, d->ruler->height() - 0.5)
240 << QPointF(x+0.5, d->ruler->height() - 0.5);
241 painter.drawPolygon(polygon);
242
243 position += d->tabDistance;
244 }
245 }
246}
For paragraphs each tab definition is represented by this struct.
Definition KoRuler.h:43
qreal position
distance in point from the start of the text-shape
Definition KoRuler.h:44
QTextOption::TabType type
Determine which type is used.
Definition KoRuler.h:45

References KoRuler::Tab::position, and KoRuler::Tab::type.

◆ sizeHint()

QSize HorizontalPaintingStrategy::sizeHint ( )
overridevirtual

returns the size suggestion for a ruler with this strategy.

Implements PaintingStrategy.

Definition at line 426 of file KoRuler.cpp.

427{
428 // assumes that digits for the number only use glyphs which do not go below the baseline
429 const QFontMetrics fm(QFontDatabase::systemFont(QFontDatabase::SmallestReadableFont));
430 const int digitsHeight = fm.ascent() + 1; // +1 for baseline
431 const int minimum = digitsHeight + fullStepMarkerLength + 2*measurementTextAboveBelowMargin;
432
433 return QSize(0, minimum);
434}

References fullStepMarkerLength, and measurementTextAboveBelowMargin.

Member Data Documentation

◆ lengthInPixel

qreal HorizontalPaintingStrategy::lengthInPixel {0.0}
private

Definition at line 83 of file KoRuler_p.h.

83{0.0};

The documentation for this class was generated from the following files: