/usr/include/KF5/plasma/framesvg.h is in plasma-framework-dev 5.18.0-0ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 | /*
* Copyright 2008 by Aaron Seigo <aseigo@kde.org>
* Copyright 2008 Marco Martin <notmart@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as
* published by the Free Software Foundation; either version 2, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details
*
* You should have received a copy of the GNU Library General Public
* License along with this program; if not, write to the
* Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef PLASMA_FRAMESVG_H
#define PLASMA_FRAMESVG_H
#include <QtCore/QObject>
#include <QPixmap>
#include <plasma/plasma_export.h>
#include <plasma/plasma.h>
#include <plasma/svg.h>
class QPainter;
class QPoint;
class QPointF;
class QRect;
class QRectF;
class QSize;
class QSizeF;
class QMatrix;
namespace Plasma
{
class FrameSvgPrivate;
/**
* @class FrameSvg plasma/framesvg.h <Plasma/FrameSvg>
*
* @short Provides an SVG with borders.
*
* When using SVG images for a background of an object that may change
* its aspect ratio, such as a dialog, simply scaling a single image
* may not be enough.
*
* FrameSvg allows SVGs to provide several elements for borders as well
* as a central element, each of which are scaled individually. These
* elements should be named
*
* - @c center - the central element, which will be scaled in both directions
* - @c top - the top border; the height is fixed, but it will be scaled
* horizontally to the same width as @c center
* - @c bottom - the bottom border; scaled in the same way as @c top
* - @c left - the left border; the width is fixed, but it will be scaled
* vertically to the same height as @c center
* - @c right - the right border; scaled in the same way as @c left
* - @c topleft - fixed size; must be the same height as @c top and the same
* width as @c left
* - @c bottomleft, @c topright, @c bottomright - similar to @c topleft
*
* @c center must exist, but all the others are optional. @c topleft and
* @c topright will be ignored if @c top does not exist, and similarly for
* @c bottomleft and @c bottomright.
*
* @see Plasma::Svg
**/
class PLASMA_EXPORT FrameSvg : public Svg
{
Q_OBJECT
Q_FLAGS(EnabledBorders)
Q_PROPERTY(EnabledBorders enabledBorders READ enabledBorders WRITE setEnabledBorders)
public:
/**
* These flags represents what borders should be drawn
*/
enum EnabledBorder {
NoBorder = 0,
TopBorder = 1,
BottomBorder = 2,
LeftBorder = 4,
RightBorder = 8,
AllBorders = TopBorder | BottomBorder | LeftBorder | RightBorder
};
Q_DECLARE_FLAGS(EnabledBorders, EnabledBorder)
/**
* Constructs a new FrameSvg that paints the proper named subelements
* as borders. It may also be used as a regular Plasma::Svg object
* for direct access to elements in the Svg.
*
* @param parent options QObject to parent this to
*
* @related Plasma::Theme
*/
explicit FrameSvg(QObject *parent = 0);
~FrameSvg();
/**
* Loads a new Svg
* @param imagePath the new file
*/
Q_INVOKABLE void setImagePath(const QString &path) Q_DECL_OVERRIDE;
/**
* Sets what borders should be painted
* @param flags borders we want to paint
*/
void setEnabledBorders(const EnabledBorders borders);
/**
* Convenience method to get the enabled borders
* @return what borders are painted
*/
EnabledBorders enabledBorders() const;
/**
* Resize the frame maintaining the same border size
* @param size the new size of the frame
*/
Q_INVOKABLE void resizeFrame(const QSizeF &size);
/**
* @returns the size of the frame
*/
Q_INVOKABLE QSizeF frameSize() const;
/**
* Returns the margin size given the margin edge we want
* If the given margin is disabled, it will return 0.
* If you don't care about the margin being on or off, use fixedMarginSize()
* @param edge the margin edge we want, top, bottom, left or right
* @return the margin size
*/
Q_INVOKABLE qreal marginSize(const Plasma::Types::MarginEdge edge) const;
/**
* Convenience method that extracts the size of the four margins
* in the four output parameters
* The disabled margins will be 0.
* If you don't care about the margins being on or off, use getFixedMargins()
* @param left left margin size
* @param top top margin size
* @param right right margin size
* @param bottom bottom margin size
*/
Q_INVOKABLE void getMargins(qreal &left, qreal &top, qreal &right, qreal &bottom) const;
/**
* Returns the margin size given the margin edge we want.
* Compared to marginSize(), this doesn't depend whether the margin is enabled or not
* @param edge the margin edge we want, top, bottom, left or right
* @return the margin size
*/
Q_INVOKABLE qreal fixedMarginSize(const Plasma::Types::MarginEdge edge) const;
/**
* Convenience method that extracts the size of the four margins
* in the four output parameters
* Compared to getMargins(), this doesn't depend whether the margins are enabled or not
* @param left left margin size
* @param top top margin size
* @param right right margin size
* @param bottom bottom margin size
*/
Q_INVOKABLE void getFixedMargins(qreal &left, qreal &top, qreal &right, qreal &bottom) const;
/**
* @return the rectangle of the center element, taking the margins into account.
*/
Q_INVOKABLE QRectF contentsRect() const;
/**
* Sets the prefix (@see setElementPrefix) to 'north', 'south', 'west' and 'east'
* when the location is TopEdge, BottomEdge, LeftEdge and RightEdge,
* respectively. Clears the prefix in other cases.
*
* The prefix must exist in the SVG document, which means that this can only be
* called successfully after setImagePath is called.
* @param location location in the UI this frame will be drawn
*/
Q_INVOKABLE void setElementPrefix(Plasma::Types::Location location);
/**
* Sets the prefix for the SVG elements to be used for painting. For example,
* if prefix is 'active', then instead of using the 'top' element of the SVG
* file to paint the top border, 'active-top' element will be used. The same
* goes for other SVG elements.
*
* If the elements with prefixes are not present, the default ones are used.
* (for the sake of speed, the test is present only for the 'center' element)
*
* Setting the prefix manually resets the location to Floating.
*
* The prefix must exist in the SVG document, which means that this can only be
* called successfully after setImagePath is called.
*
* @param prefix prefix for the SVG elements that make up the frame
*/
Q_INVOKABLE void setElementPrefix(const QString &prefix);
/**
* @return true if the svg has the necessary elements with the given prefix
* to draw a frame
* @param prefix the given prefix we want to check if drawable
*/
Q_INVOKABLE bool hasElementPrefix(const QString &prefix) const;
/**
* This is an overloaded method provided for convenience equivalent to
* hasElementPrefix("north"), hasElementPrefix("south")
* hasElementPrefix("west") and hasElementPrefix("east")
* @return true if the svg has the necessary elements with the given prefix
* to draw a frame.
* @param location the given prefix we want to check if drawable
*/
Q_INVOKABLE bool hasElementPrefix(Plasma::Types::Location location) const;
/**
* Returns the prefix for SVG elements of the FrameSvg
* @return the prefix
*/
Q_INVOKABLE QString prefix();
/**
* Returns a mask that tightly contains the fully opaque areas of the svg
* @return a region of opaque areas
*/
Q_INVOKABLE QRegion mask() const;
/**
* @return a pixmap whose alpha channel is the opacity of the frame. It may be the frame itself or a special frame with the mask- prefix
*/
QPixmap alphaMask() const;
/**
* Sets whether saving all the rendered prefixes in a cache or not
* @param cache if use the cache or not
*/
Q_INVOKABLE void setCacheAllRenderedFrames(bool cache);
/**
* @return if all the different prefixes should be kept in a cache when rendered
*/
Q_INVOKABLE bool cacheAllRenderedFrames() const;
/**
* Deletes the internal cache freeing memory: use this if you want to switch the rendered
* element and you don't plan to switch back to the previous one for a long time and you
* used setUsingRenderingCache(true)
*/
Q_INVOKABLE void clearCache();
/**
* Returns a pixmap of the SVG represented by this object.
*
* @param elelementId the ID string of the element to render, or an empty
* string for the whole SVG (the default)
* @return a QPixmap of the rendered SVG
*/
Q_INVOKABLE QPixmap framePixmap();
/**
* Paints the loaded SVG with the elements that represents the border
* @param painter the QPainter to use
* @param target the target rectangle on the paint device
* @param source the portion rectangle of the source image
*/
Q_INVOKABLE void paintFrame(QPainter *painter, const QRectF &target,
const QRectF &source = QRectF());
/**
* Paints the loaded SVG with the elements that represents the border
* This is an overloaded member provided for convenience
* @param painter the QPainter to use
* @param pos where to paint the svg
*/
Q_INVOKABLE void paintFrame(QPainter *painter, const QPointF &pos = QPointF(0, 0));
/**
* @returns the prefix that is actually used
*/
QString actualPrefix() const;
private:
FrameSvgPrivate *const d;
friend class FrameData;
Q_PRIVATE_SLOT(d, void updateSizes())
Q_PRIVATE_SLOT(d, void updateNeeded())
};
} // Plasma namespace
Q_DECLARE_OPERATORS_FOR_FLAGS(Plasma::FrameSvg::EnabledBorders)
#endif // multiple inclusion guard
|