| 1 | /* |
| 2 | SPDX-FileCopyrightText: 2006-2007 Aaron Seigo <aseigo@kde.org> |
| 3 | |
| 4 | SPDX-License-Identifier: LGPL-2.0-or-later |
| 5 | */ |
| 6 | |
| 7 | #ifndef KSVG_SVG_H |
| 8 | #define KSVG_SVG_H |
| 9 | |
| 10 | #include <QObject> |
| 11 | #include <QPixmap> |
| 12 | |
| 13 | #include <ksvg/imageset.h> |
| 14 | #include <ksvg/ksvg_export.h> |
| 15 | |
| 16 | class QPainter; |
| 17 | class QPoint; |
| 18 | class QPointF; |
| 19 | class QRect; |
| 20 | class QRectF; |
| 21 | class QSize; |
| 22 | class QSizeF; |
| 23 | class QMatrix; |
| 24 | |
| 25 | /*! |
| 26 | * \namespace KSvg |
| 27 | * \inmodule KSvg |
| 28 | * \brief The KSvg namespace. |
| 29 | */ |
| 30 | namespace KSvg |
| 31 | { |
| 32 | class FrameSvgPrivate; |
| 33 | class SvgPrivate; |
| 34 | |
| 35 | /*! |
| 36 | * \class KSvg::Svg |
| 37 | * \inheaderfile KSvg/Svg |
| 38 | * \inmodule KSvg |
| 39 | * |
| 40 | * \brief A theme aware image-centric SVG class. |
| 41 | * |
| 42 | * KSvg::Svg provides a class for rendering SVG images to a QPainter in a |
| 43 | * convenient manner. Unless an absolute path to a file is provided, it loads |
| 44 | * the SVG document using KSvg::ImageSet. It also provides a number of internal |
| 45 | * optimizations to help lower the cost of painting SVGs, such as caching. |
| 46 | * |
| 47 | * \sa KSvg::FrameSvg |
| 48 | **/ |
| 49 | class KSVG_EXPORT Svg : public QObject |
| 50 | { |
| 51 | Q_OBJECT |
| 52 | |
| 53 | /*! |
| 54 | * \property KSvg::Svg::size |
| 55 | */ |
| 56 | Q_PROPERTY(QSizeF size READ size WRITE resize NOTIFY sizeChanged) |
| 57 | |
| 58 | /*! |
| 59 | * \property KSvg::Svg::multipleImages |
| 60 | */ |
| 61 | Q_PROPERTY(bool multipleImages READ containsMultipleImages WRITE setContainsMultipleImages) |
| 62 | |
| 63 | /*! |
| 64 | * \property KSvg::Svg::imagePath |
| 65 | */ |
| 66 | Q_PROPERTY(QString imagePath READ imagePath WRITE setImagePath NOTIFY imagePathChanged) |
| 67 | |
| 68 | /*! |
| 69 | * \property KSvg::Svg::usingRenderingCache |
| 70 | */ |
| 71 | Q_PROPERTY(bool usingRenderingCache READ isUsingRenderingCache WRITE setUsingRenderingCache) |
| 72 | |
| 73 | /*! |
| 74 | * \property KSvg::Svg::fromCurrentImageSet |
| 75 | */ |
| 76 | Q_PROPERTY(bool fromCurrentImageSet READ fromCurrentImageSet NOTIFY fromCurrentImageSetChanged) |
| 77 | |
| 78 | /*! |
| 79 | * \property KSvg::Svg::status |
| 80 | */ |
| 81 | Q_PROPERTY(KSvg::Svg::Status status READ status WRITE setStatus NOTIFY statusChanged) |
| 82 | |
| 83 | /*! |
| 84 | * \property KSvg::Svg::colorSet |
| 85 | */ |
| 86 | Q_PROPERTY(KSvg::Svg::ColorSet colorSet READ colorSet WRITE setColorSet NOTIFY colorSetChanged) |
| 87 | |
| 88 | public: |
| 89 | /*! |
| 90 | * \enum KSvg::Svg::Status |
| 91 | * \value Normal |
| 92 | * \value Selected |
| 93 | * \value Inactive |
| 94 | */ |
| 95 | enum Status { |
| 96 | Normal = 0, |
| 97 | Selected, |
| 98 | Inactive, |
| 99 | }; |
| 100 | Q_ENUM(Status) |
| 101 | |
| 102 | // FIXME? Those are copied from KColorScheme because is needed to make it a Q_ENUM |
| 103 | /*! |
| 104 | * \enum KSvg::Svg::ColorSet |
| 105 | * |
| 106 | * \value View |
| 107 | * \value Window |
| 108 | * \value Button |
| 109 | * \value Selection |
| 110 | * \value Tooltip |
| 111 | * \value Complementary |
| 112 | * \value Header |
| 113 | */ |
| 114 | enum ColorSet { View, Window, Button, Selection, Tooltip, Complementary, }; |
| 115 | Q_ENUM(ColorSet) |
| 116 | |
| 117 | /*! |
| 118 | * \enum KSvg::Svg::StyleSheetColor |
| 119 | * \value Text |
| 120 | * \value Background |
| 121 | * \value Highlight |
| 122 | * \value HighlightedText |
| 123 | * \value PositiveText |
| 124 | * \value NeutralText |
| 125 | * \value NegativeText |
| 126 | * \value ButtonText |
| 127 | * \value ButtonBackground |
| 128 | * \value ButtonHover |
| 129 | * \value ButtonFocus |
| 130 | * \value ButtonHighlightedText |
| 131 | * \value ButtonPositiveText |
| 132 | * \value ButtonNeutralText |
| 133 | * \value ButtonNegativeText |
| 134 | * \value ViewText |
| 135 | * \value ViewBackground |
| 136 | * \value ViewHover |
| 137 | * \value ViewFocus |
| 138 | * \value ViewHighlightedText |
| 139 | * \value ViewPositiveText |
| 140 | * \value ViewNeutralText |
| 141 | * \value ViewNegativeText |
| 142 | * \value TooltipText |
| 143 | * \value TooltipBackground |
| 144 | * \value TooltipHover |
| 145 | * \value TooltipFocus |
| 146 | * \value TooltipHighlightedText |
| 147 | * \value TooltipPositiveText |
| 148 | * \value TooltipNeutralText |
| 149 | * \value TooltipNegativeText |
| 150 | * \value ComplementaryText |
| 151 | * \value ComplementaryBackground |
| 152 | * \value ComplementaryHover |
| 153 | * \value ComplementaryFocus |
| 154 | * \value ComplementaryHighlightedText |
| 155 | * \value ComplementaryPositiveText |
| 156 | * \value ComplementaryNeutralText |
| 157 | * \value ComplementaryNegativeText |
| 158 | * \value HeaderText |
| 159 | * \value HeaderBackground |
| 160 | * \value HeaderHover |
| 161 | * \value HeaderFocus |
| 162 | * \value HeaderHighlightedText |
| 163 | * \value HeaderPositiveText |
| 164 | * \value HeaderNeutralText |
| 165 | * \value HeaderNegativeText |
| 166 | */ |
| 167 | enum StyleSheetColor { |
| 168 | Text, |
| 169 | Background, |
| 170 | Highlight, |
| 171 | HighlightedText, |
| 172 | PositiveText, |
| 173 | NeutralText, |
| 174 | NegativeText, |
| 175 | |
| 176 | ButtonText, |
| 177 | ButtonBackground, |
| 178 | ButtonHover, |
| 179 | ButtonFocus, |
| 180 | ButtonHighlightedText, |
| 181 | ButtonPositiveText, |
| 182 | ButtonNeutralText, |
| 183 | ButtonNegativeText, |
| 184 | |
| 185 | ViewText, |
| 186 | ViewBackground, |
| 187 | ViewHover, |
| 188 | ViewFocus, |
| 189 | ViewHighlightedText, |
| 190 | ViewPositiveText, |
| 191 | ViewNeutralText, |
| 192 | ViewNegativeText, |
| 193 | |
| 194 | TooltipText, |
| 195 | TooltipBackground, |
| 196 | TooltipHover, |
| 197 | TooltipFocus, |
| 198 | TooltipHighlightedText, |
| 199 | TooltipPositiveText, |
| 200 | TooltipNeutralText, |
| 201 | TooltipNegativeText, |
| 202 | |
| 203 | ComplementaryText, |
| 204 | ComplementaryBackground, |
| 205 | ComplementaryHover, |
| 206 | ComplementaryFocus, |
| 207 | ComplementaryHighlightedText, |
| 208 | ComplementaryPositiveText, |
| 209 | ComplementaryNeutralText, |
| 210 | ComplementaryNegativeText, |
| 211 | |
| 212 | , |
| 213 | , |
| 214 | , |
| 215 | , |
| 216 | , |
| 217 | , |
| 218 | , |
| 219 | |
| 220 | }; |
| 221 | Q_ENUM(StyleSheetColor); |
| 222 | |
| 223 | /*! |
| 224 | * \brief This method constructs an SVG object that implicitly shares and |
| 225 | * caches rendering. |
| 226 | * |
| 227 | * Unlike QSvgRenderer, which this class uses internally, |
| 228 | * KSvg::Svg represents an image generated from an SVG. As such, it has a |
| 229 | * related size and transform matrix (the latter being provided by the |
| 230 | * painter used to paint the image). |
| 231 | * |
| 232 | * The size is initialized to be the SVG's native size. |
| 233 | * |
| 234 | * \a parent options QObject to parent this to |
| 235 | * |
| 236 | * \sa KSvg::ImageSet |
| 237 | */ |
| 238 | explicit Svg(QObject *parent = nullptr); |
| 239 | ~Svg() override; |
| 240 | |
| 241 | /*! |
| 242 | * \brief This method sets the device pixel ratio for the Svg. |
| 243 | * |
| 244 | * This is the ratio between image pixels and device-independent pixels. The |
| 245 | * SVG will produce pixmaps scaled by devicePixelRatio, but all the sizes |
| 246 | * and element rects will not be altered. The default value is 1.0 and the |
| 247 | * scale will be done rounded to the floor integer. |
| 248 | * |
| 249 | * Setting it to something higher will make all the elements of this SVG |
| 250 | * appear bigger. |
| 251 | */ |
| 252 | void setDevicePixelRatio(qreal factor); |
| 253 | |
| 254 | /*! |
| 255 | * \brief This method returns the device pixel ratio for this Svg. |
| 256 | */ |
| 257 | qreal devicePixelRatio() const; |
| 258 | |
| 259 | /*! |
| 260 | * \brief This method returns a pixmap of the SVG represented by this |
| 261 | * object. |
| 262 | * |
| 263 | * The size of the pixmap will be the size of this Svg object (size()) if |
| 264 | * containsMultipleImages is \c true; otherwise, it will be the size of the |
| 265 | * requested element after the whole SVG has been scaled to size(). |
| 266 | * |
| 267 | * \a elementID the ID string of the element to render, or an empty |
| 268 | * string for the whole SVG (the default) |
| 269 | * |
| 270 | * Returns a QPixmap of the rendered SVG |
| 271 | */ |
| 272 | Q_INVOKABLE QPixmap pixmap(const QString &elementID = QString()); |
| 273 | |
| 274 | /*! |
| 275 | * \brief This method returns an image of the SVG represented by this |
| 276 | * object. |
| 277 | * |
| 278 | * The size of the image will be the size of this Svg object (size()) if |
| 279 | * containsMultipleImages is \c true; otherwise, it will be the size of the |
| 280 | * requested element after the whole SVG has been scaled to size(). |
| 281 | * |
| 282 | * \a elementID the ID string of the element to render, or an empty |
| 283 | * string for the whole SVG (the default) |
| 284 | * |
| 285 | * Returns a QPixmap of the rendered SVG |
| 286 | */ |
| 287 | Q_INVOKABLE QImage image(const QSize &size, const QString &elementID = QString()); |
| 288 | |
| 289 | /*! |
| 290 | * \brief This method paints all or part of the SVG represented by this |
| 291 | * object. |
| 292 | * |
| 293 | * The size of the painted area will be the size of this Svg object (size()) |
| 294 | * if containsMultipleImages is \c true; otherwise, it will be the size of |
| 295 | * the requested element after the whole SVG has been scaled to size(). |
| 296 | * |
| 297 | * \a painter the QPainter to use |
| 298 | * |
| 299 | * \a point the position to start drawing; the entire svg will be |
| 300 | * drawn starting at this point. |
| 301 | * |
| 302 | * \a elementID the ID string of the element to render, or an empty |
| 303 | * string for the whole SVG (the default) |
| 304 | */ |
| 305 | Q_INVOKABLE void paint(QPainter *painter, const QPointF &point, const QString &elementID = QString()); |
| 306 | |
| 307 | /*! |
| 308 | * \brief This method paints all or part of the SVG represented by this |
| 309 | * object. |
| 310 | * |
| 311 | * The size of the painted area will be the size of this Svg object (size()) |
| 312 | * if containsMultipleImages is \c true; otherwise, it will be the size of |
| 313 | * the requested element after the whole SVG has been scaled to size(). |
| 314 | * |
| 315 | * \a painter the QPainter to use |
| 316 | * |
| 317 | * \a x the horizontal coordinate to start painting from |
| 318 | * |
| 319 | * \a y the vertical coordinate to start painting from |
| 320 | * |
| 321 | * \a elementID the ID string of the element to render, or an empty |
| 322 | * string for the whole SVG (the default) |
| 323 | */ |
| 324 | Q_INVOKABLE void paint(QPainter *painter, int x, int y, const QString &elementID = QString()); |
| 325 | |
| 326 | /*! |
| 327 | * \brief This method paints all or part of the SVG represented by this |
| 328 | * object. |
| 329 | * |
| 330 | * \a painter the QPainter to use |
| 331 | * |
| 332 | * \a rect the rect to draw into; if smaller than the current size |
| 333 | * the drawing is starting at this point. |
| 334 | * |
| 335 | * \a elementID the ID string of the element to render, or an empty |
| 336 | * string for the whole SVG (the default) |
| 337 | */ |
| 338 | Q_INVOKABLE void paint(QPainter *painter, const QRectF &rect, const QString &elementID = QString()); |
| 339 | |
| 340 | /*! |
| 341 | * \brief This method paints all or part of the SVG represented by this |
| 342 | * object. |
| 343 | * |
| 344 | * \a painter the QPainter to use |
| 345 | * |
| 346 | * \a x the horizontal coordinate to start painting from |
| 347 | * |
| 348 | * \a y the vertical coordinate to start painting from |
| 349 | * |
| 350 | * \a width the width of the element to draw |
| 351 | * |
| 352 | * \a height the height of the element do draw |
| 353 | * |
| 354 | * \a elementID the ID string of the element to render, or an empty |
| 355 | * string for the whole SVG (the default) |
| 356 | */ |
| 357 | Q_INVOKABLE void paint(QPainter *painter, int x, int y, int width, int height, const QString &elementID = QString()); |
| 358 | |
| 359 | /*! |
| 360 | * \brief This method returns the size of the SVG. |
| 361 | * |
| 362 | * If the SVG has been resized with resize(), that size will be returned; |
| 363 | * otherwise, the natural size of the SVG will be returned. |
| 364 | * |
| 365 | * If containsMultipleImages is \c true, each element of the SVG will be |
| 366 | * rendered at this size by default. |
| 367 | * |
| 368 | * Returns the current size of the SVG |
| 369 | **/ |
| 370 | QSizeF size() const; |
| 371 | |
| 372 | /*! |
| 373 | * \brief This method resizes the rendered image. |
| 374 | * |
| 375 | * Rendering will actually take place on the next call to paint. |
| 376 | * |
| 377 | * If containsMultipleImages is \c true, each element of the SVG will be |
| 378 | * rendered at this size by default; otherwise, the entire image will be |
| 379 | * scaled to this size and each element will be scaled appropriately. |
| 380 | * |
| 381 | * \a width the new width |
| 382 | * |
| 383 | * \a height the new height |
| 384 | **/ |
| 385 | Q_INVOKABLE void resize(qreal width, qreal height); |
| 386 | |
| 387 | /*! |
| 388 | * \brief This method resizes the rendered image. |
| 389 | * |
| 390 | * Rendering will actually take place on the next call to paint. |
| 391 | * |
| 392 | * If containsMultipleImages is \c true, each element of the SVG will be |
| 393 | * rendered at this size by default; otherwise, the entire image will be |
| 394 | * scaled to this size and each element will be scaled appropriately. |
| 395 | * |
| 396 | * \a size the new size of the image |
| 397 | **/ |
| 398 | Q_INVOKABLE void resize(const QSizeF &size); |
| 399 | |
| 400 | /*! |
| 401 | * \brief This method resizes the rendered image to the natural size of the |
| 402 | * SVG. |
| 403 | * |
| 404 | * Rendering will actually take place on the next call to paint. |
| 405 | **/ |
| 406 | Q_INVOKABLE void resize(); |
| 407 | |
| 408 | /*! |
| 409 | * \brief This method returns the size of a given element. |
| 410 | * |
| 411 | * This is the size of the element with ID \a elementId after the SVG |
| 412 | * has been scaled (see resize()). Note that this is unaffected by |
| 413 | * the containsMultipleImages property. |
| 414 | * |
| 415 | * \a elementId the id of the element to check |
| 416 | * |
| 417 | * Returns the size of a given element, given the current size of the SVG |
| 418 | **/ |
| 419 | Q_INVOKABLE QSizeF elementSize(const QString &elementId) const; |
| 420 | |
| 421 | QSizeF elementSize(QStringView elementId) const; |
| 422 | |
| 423 | /*! |
| 424 | * \brief This method returns the bounding rect of a given element. |
| 425 | * |
| 426 | * This is the bounding rect of the element with ID \a elementId after the |
| 427 | * SVG has been scaled (see resize()). Note that this is unaffected by the |
| 428 | * containsMultipleImages property. |
| 429 | * |
| 430 | * \a elementId the id of the element to check |
| 431 | * |
| 432 | * Returns the current rect of a given element, given the current size of the SVG |
| 433 | **/ |
| 434 | Q_INVOKABLE QRectF elementRect(const QString &elementId) const; |
| 435 | |
| 436 | /*! |
| 437 | * |
| 438 | */ |
| 439 | QRectF elementRect(QStringView elementId) const; |
| 440 | |
| 441 | /*! |
| 442 | * \brief This method checks whether an element exists in the loaded SVG. |
| 443 | * |
| 444 | * \a elementId the id of the element to check for |
| 445 | * |
| 446 | * Returns \c true if the element is defined in the SVG, otherwise \c false |
| 447 | **/ |
| 448 | Q_INVOKABLE bool hasElement(const QString &elementId) const; |
| 449 | |
| 450 | /*! |
| 451 | * |
| 452 | */ |
| 453 | bool hasElement(QStringView elementId) const; |
| 454 | |
| 455 | /*! |
| 456 | * \brief This method checks whether this object is backed by a valid SVG |
| 457 | * file. |
| 458 | * |
| 459 | * This method can be expensive as it causes disk access. |
| 460 | * |
| 461 | * Returns \c true if the SVG file exists and the document is valid, |
| 462 | * otherwise \c false. |
| 463 | **/ |
| 464 | Q_INVOKABLE bool isValid() const; |
| 465 | |
| 466 | /*! |
| 467 | * \brief This method sets whether the SVG contains a single image or |
| 468 | * multiple ones. |
| 469 | * |
| 470 | * If this is set to \c true, the SVG will be treated as a collection of |
| 471 | * related images, rather than a consistent drawing. |
| 472 | * |
| 473 | * In particular, when individual elements are rendered, this affects |
| 474 | * whether the elements are resized to size() by default. See paint() and |
| 475 | * pixmap(). |
| 476 | * |
| 477 | * \sa paint() |
| 478 | * \sa pixmap() |
| 479 | * |
| 480 | * \a multiple true if the svg contains multiple images |
| 481 | */ |
| 482 | void setContainsMultipleImages(bool multiple); |
| 483 | |
| 484 | /*! |
| 485 | * \brief This method returns whether the SVG contains multiple images. |
| 486 | * |
| 487 | * If this is \c true, the SVG will be treated as a collection of related |
| 488 | * images, rather than a consistent drawing. |
| 489 | * |
| 490 | * Returns \c true if the SVG will be treated as containing multiple images, |
| 491 | * \c false if it will be treated as a coherent image. |
| 492 | */ |
| 493 | bool containsMultipleImages() const; |
| 494 | |
| 495 | /*! |
| 496 | * \brief This method sets the SVG file to render. |
| 497 | * |
| 498 | * Relative paths are looked for in the current Svg theme, and should not |
| 499 | * include the file extension (.svg and .svgz files will be searched for). |
| 500 | * include the file extension; files with the .svg and .svgz extensions will be |
| 501 | * found automatically. |
| 502 | * |
| 503 | * \sa ImageSet::imagePath() |
| 504 | * |
| 505 | * If the parent object of this Svg is a KSvg::Applet, relative paths will |
| 506 | * be searched for in the applet's package first. |
| 507 | * |
| 508 | * \a svgFilePath either an absolute path to an SVG file, or an image |
| 509 | * name. |
| 510 | */ |
| 511 | virtual void setImagePath(const QString &svgFilePath); |
| 512 | |
| 513 | /*! |
| 514 | * \brief This method returns the SVG file to render. |
| 515 | * |
| 516 | * If this SVG is themed, this will be a relative path, and will not |
| 517 | * include a file extension. |
| 518 | * |
| 519 | * Returns either an absolute path to an SVG file, or an image name |
| 520 | * \sa ImageSet::imagePath() |
| 521 | */ |
| 522 | QString imagePath() const; |
| 523 | |
| 524 | /*! |
| 525 | * \brief This method sets whether or not to cache the results of rendering |
| 526 | * to pixmaps. |
| 527 | * |
| 528 | * If the SVG is resized and re-rendered often (and does not keep using the |
| 529 | * same small set of pixmap dimensions), then it may be less efficient to do |
| 530 | * disk caching. A good example might be a progress meter that uses an Svg |
| 531 | * object to paint itself: the meter will be changing often enough, with |
| 532 | * enough unpredictability and without re-use of the previous pixmaps to |
| 533 | * not get a gain from caching. |
| 534 | * |
| 535 | * Most Svg objects should use the caching feature, however. |
| 536 | * Therefore, the default is to use the render cache. |
| 537 | * |
| 538 | * \a useCache true to cache rendered pixmaps |
| 539 | * \since 4.3 |
| 540 | */ |
| 541 | void setUsingRenderingCache(bool useCache); |
| 542 | |
| 543 | /*! |
| 544 | * Whether the rendering cache is being used. |
| 545 | * |
| 546 | * \brief This method returns whether the Svg object is using caching for |
| 547 | * rendering results. |
| 548 | * |
| 549 | * \since 4.3 |
| 550 | */ |
| 551 | bool isUsingRenderingCache() const; |
| 552 | |
| 553 | /*! |
| 554 | * \brief This method returns whether the current theme has this SVG, |
| 555 | * without having to fall back to the default theme. |
| 556 | * |
| 557 | * Returns true if the svg is loaded from the current theme |
| 558 | * \sa ImageSet::currentImageSetHasImage |
| 559 | */ |
| 560 | bool fromCurrentImageSet() const; |
| 561 | |
| 562 | /*! |
| 563 | * \brief This method sets the KSvg::ImageSet to use with this Svg object. |
| 564 | * |
| 565 | * By default, Svg objects use KSvg::ImageSet::default(). |
| 566 | * |
| 567 | * This determines how relative image paths are interpreted. |
| 568 | * |
| 569 | * \a theme the theme object to use |
| 570 | * \since 4.3 |
| 571 | */ |
| 572 | void setImageSet(KSvg::ImageSet *theme); |
| 573 | |
| 574 | /*! |
| 575 | * \brief This method returns the KSvg::ImageSet used by this Svg object. |
| 576 | * |
| 577 | * This determines how relative image paths are interpreted. |
| 578 | * |
| 579 | * Returns the theme used by this Svg |
| 580 | */ |
| 581 | ImageSet *imageSet() const; |
| 582 | |
| 583 | /*! |
| 584 | * \brief This method sets the image in a selected status. |
| 585 | * |
| 586 | * SVGs can be colored with system color themes. If \a status is selected, |
| 587 | * \c TextColor will become \c HighlightedText color, and \c BackgroundColor will |
| 588 | * become \c HighlightColor. This can be used to make SVG-based graphics such |
| 589 | * as symbolic icons look correct together. Supported statuses are \c Normal |
| 590 | * and \c Selected. |
| 591 | * \since 5.23 |
| 592 | */ |
| 593 | void setStatus(Svg::Status status); |
| 594 | |
| 595 | /*! |
| 596 | * \brief This method returns the Svg object's status. |
| 597 | * \since 5.23 |
| 598 | */ |
| 599 | Svg::Status status() const; |
| 600 | |
| 601 | /*! |
| 602 | * \brief This method sets a color set for the SVG. |
| 603 | * Set a color set for the Svg. |
| 604 | * if the Svg uses stylesheets and has elements |
| 605 | * that are either \c TextColor or \c BackgroundColor class, |
| 606 | * make them use \c ButtonTextColor / \c ButtonBackgroundColor |
| 607 | * or \c ViewTextColor / \c ViewBackgroundColor |
| 608 | */ |
| 609 | void setColorSet(ColorSet colorSet); |
| 610 | |
| 611 | /*! |
| 612 | * Returns the color set for this Svg |
| 613 | */ |
| 614 | KSvg::Svg::ColorSet colorSet() const; |
| 615 | |
| 616 | /*! |
| 617 | * |
| 618 | */ |
| 619 | QColor color(StyleSheetColor colorName) const; |
| 620 | |
| 621 | /*! |
| 622 | * |
| 623 | */ |
| 624 | void setColor(StyleSheetColor colorName, const QColor &color); |
| 625 | |
| 626 | /*! |
| 627 | * Sets the specified stylesheet \a colors. |
| 628 | * |
| 629 | * \sa color(), colorOverrides(), clearColorOverrides() |
| 630 | * \since 6.18 |
| 631 | */ |
| 632 | void setColors(const QMap<StyleSheetColor, QColor> &colors); |
| 633 | |
| 634 | /*! |
| 635 | * Returns the color overrides. |
| 636 | * |
| 637 | * \since 6.18 |
| 638 | */ |
| 639 | QMap<StyleSheetColor, QColor> colorOverrides() const; |
| 640 | |
| 641 | /*! |
| 642 | * |
| 643 | */ |
| 644 | void clearColorOverrides(); |
| 645 | |
| 646 | Q_SIGNALS: |
| 647 | /*! |
| 648 | * \brief This signal is emitted whenever the SVG data has changed in such a |
| 649 | * way that a repaint is required. |
| 650 | * |
| 651 | * Any usage of an SVG object that does the painting itself must connect to |
| 652 | * this signal and respond by updating the painting. Note that connecting to |
| 653 | * ImageSet::imageSetChanged is incorrect in such a use case as the SVG |
| 654 | * itself may not be updated yet nor may theme change be the only case when |
| 655 | * a repaint is needed. Also note that classes or QML code which take Svg |
| 656 | * objects as parameters for their own painting all respond to this signal |
| 657 | * so that in those cases manually responding to the signal is unnecessary; |
| 658 | * ONLY when direct, manual painting with an Svg object is done in |
| 659 | * application code is this signal used. |
| 660 | */ |
| 661 | void repaintNeeded(); |
| 662 | |
| 663 | /*! |
| 664 | * \brief This signal is emitted whenever the size has changed. |
| 665 | * \sa resize() |
| 666 | */ |
| 667 | void sizeChanged(); |
| 668 | |
| 669 | /*! |
| 670 | * \brief This signal is emitted whenever the image path has changed. |
| 671 | */ |
| 672 | void imagePathChanged(); |
| 673 | |
| 674 | /*! |
| 675 | * \brief This signal is emitted whenever the color hint has changed. |
| 676 | */ |
| 677 | void colorHintChanged(); |
| 678 | |
| 679 | /*! |
| 680 | * \brief This signal is emitted when the value of fromCurrentImageSet() |
| 681 | * has changed. |
| 682 | */ |
| 683 | void fromCurrentImageSetChanged(bool fromCurrentImageSet); |
| 684 | |
| 685 | /*! |
| 686 | * \brief This signal is emitted when the status has changed. |
| 687 | */ |
| 688 | void statusChanged(KSvg::Svg::Status status); |
| 689 | |
| 690 | /*! |
| 691 | * \brief This signal is emitted when the color set has changed. |
| 692 | */ |
| 693 | void colorSetChanged(KSvg::Svg::ColorSet colorSet); |
| 694 | |
| 695 | /*! |
| 696 | * \brief This signal is emitted when the image set has changed. |
| 697 | */ |
| 698 | void imageSetChanged(ImageSet *imageSet); |
| 699 | |
| 700 | private: |
| 701 | SvgPrivate *const d; |
| 702 | bool eventFilter(QObject *watched, QEvent *event) override; |
| 703 | |
| 704 | Q_PRIVATE_SLOT(d, void imageSetChanged()) |
| 705 | Q_PRIVATE_SLOT(d, void colorsChanged()) |
| 706 | |
| 707 | friend class SvgPrivate; |
| 708 | friend class FrameSvgPrivate; |
| 709 | friend class FrameSvg; |
| 710 | friend class ImageSetPrivate; |
| 711 | }; |
| 712 | |
| 713 | } // KSvg namespace |
| 714 | |
| 715 | #endif // multiple inclusion guard |
| 716 | |