1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the QtQuick module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 3 requirements
23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24 **
25 ** GNU General Public License Usage
26 ** Alternatively, this file may be used under the terms of the GNU
27 ** General Public License version 2.0 or (at your option) the GNU General
28 ** Public license version 3 or any later version approved by the KDE Free
29 ** Qt Foundation. The licenses are as published by the Free Software
30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31 ** included in the packaging of this file. Please review the following
32 ** information to ensure the GNU General Public License requirements will
33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34 ** https://www.gnu.org/licenses/gpl-3.0.html.
35 **
36 ** $QT_END_LICENSE$
37 **
38 ****************************************************************************/
39
40 #include "qquickscalegrid_p_p.h"
41
42 #include <QtQml/qqml.h>
43
44 QT_BEGIN_NAMESPACE
45
46 /*!
47 \internal
48 \class QQuickScaleGrid
49 \brief The QQuickScaleGrid class allows you to specify a 3x3 grid to use in scaling an image.
50 */
51
QQuickScaleGrid(QObject * parent)52 QQuickScaleGrid::QQuickScaleGrid(QObject *parent) : QObject(parent), _left(0), _top(0), _right(0), _bottom(0)
53 {
54 }
55
~QQuickScaleGrid()56 QQuickScaleGrid::~QQuickScaleGrid()
57 {
58 }
59
isNull() const60 bool QQuickScaleGrid::isNull() const
61 {
62 return !_left && !_top && !_right && !_bottom;
63 }
64
setLeft(int pos)65 void QQuickScaleGrid::setLeft(int pos)
66 {
67 if (_left != pos) {
68 _left = pos;
69 emit leftBorderChanged();
70 emit borderChanged();
71 }
72 }
73
setTop(int pos)74 void QQuickScaleGrid::setTop(int pos)
75 {
76 if (_top != pos) {
77 _top = pos;
78 emit topBorderChanged();
79 emit borderChanged();
80 }
81 }
82
setRight(int pos)83 void QQuickScaleGrid::setRight(int pos)
84 {
85 if (_right != pos) {
86 _right = pos;
87 emit rightBorderChanged();
88 emit borderChanged();
89 }
90 }
91
setBottom(int pos)92 void QQuickScaleGrid::setBottom(int pos)
93 {
94 if (_bottom != pos) {
95 _bottom = pos;
96 emit bottomBorderChanged();
97 emit borderChanged();
98 }
99 }
100
QQuickGridScaledImage()101 QQuickGridScaledImage::QQuickGridScaledImage()
102 : _l(-1), _r(-1), _t(-1), _b(-1),
103 _h(QQuickBorderImage::Stretch), _v(QQuickBorderImage::Stretch)
104 {
105 }
106
QQuickGridScaledImage(const QQuickGridScaledImage & o)107 QQuickGridScaledImage::QQuickGridScaledImage(const QQuickGridScaledImage &o)
108 : _l(o._l), _r(o._r), _t(o._t), _b(o._b), _h(o._h), _v(o._v), _pix(o._pix)
109 {
110 }
111
operator =(const QQuickGridScaledImage & o)112 QQuickGridScaledImage &QQuickGridScaledImage::operator=(const QQuickGridScaledImage &o)
113 {
114 _l = o._l;
115 _r = o._r;
116 _t = o._t;
117 _b = o._b;
118 _h = o._h;
119 _v = o._v;
120 _pix = o._pix;
121 return *this;
122 }
123
QQuickGridScaledImage(QIODevice * data)124 QQuickGridScaledImage::QQuickGridScaledImage(QIODevice *data)
125 : _l(-1), _r(-1), _t(-1), _b(-1), _h(QQuickBorderImage::Stretch), _v(QQuickBorderImage::Stretch)
126 {
127 int l = -1;
128 int r = -1;
129 int t = -1;
130 int b = -1;
131 QString imgFile;
132
133 QByteArray raw;
134 while (raw = data->readLine(), !raw.isEmpty()) {
135 QString line = QString::fromUtf8(raw.trimmed());
136 if (line.isEmpty() || line.startsWith(QLatin1Char('#')))
137 continue;
138
139 int colonId = line.indexOf(QLatin1Char(':'));
140 if (colonId <= 0)
141 return;
142
143 const QStringRef property = line.leftRef(colonId).trimmed();
144 QStringRef value = line.midRef(colonId + 1).trimmed();
145
146 if (property == QLatin1String("border.left")) {
147 l = value.toInt();
148 } else if (property == QLatin1String("border.right")) {
149 r = value.toInt();
150 } else if (property == QLatin1String("border.top")) {
151 t = value.toInt();
152 } else if (property == QLatin1String("border.bottom")) {
153 b = value.toInt();
154 } else if (property == QLatin1String("source")) {
155 if (value.startsWith(QLatin1Char('"')) && value.endsWith(QLatin1Char('"')))
156 value = value.mid(1, value.size() - 2); // remove leading/trailing quotes.
157 imgFile = value.toString();
158 } else if (property == QLatin1String("horizontalTileRule") || property == QLatin1String("horizontalTileMode")) {
159 _h = stringToRule(value);
160 } else if (property == QLatin1String("verticalTileRule") || property == QLatin1String("verticalTileMode")) {
161 _v = stringToRule(value);
162 }
163 }
164
165 if (l < 0 || r < 0 || t < 0 || b < 0 || imgFile.isEmpty())
166 return;
167
168 _l = l; _r = r; _t = t; _b = b;
169 _pix = imgFile;
170 }
171
stringToRule(const QStringRef & s)172 QQuickBorderImage::TileMode QQuickGridScaledImage::stringToRule(const QStringRef &s)
173 {
174 QStringRef string = s;
175 if (string.startsWith(QLatin1Char('"')) && string.endsWith(QLatin1Char('"')))
176 string = string.mid(1, string.size() - 2); // remove leading/trailing quotes.
177
178 if (string == QLatin1String("Stretch") || string == QLatin1String("BorderImage.Stretch"))
179 return QQuickBorderImage::Stretch;
180 if (string == QLatin1String("Repeat") || string == QLatin1String("BorderImage.Repeat"))
181 return QQuickBorderImage::Repeat;
182 if (string == QLatin1String("Round") || string == QLatin1String("BorderImage.Round"))
183 return QQuickBorderImage::Round;
184
185 qWarning("QQuickGridScaledImage: Invalid tile rule specified. Using Stretch.");
186 return QQuickBorderImage::Stretch;
187 }
188
isValid() const189 bool QQuickGridScaledImage::isValid() const
190 {
191 return _l >= 0;
192 }
193
gridLeft() const194 int QQuickGridScaledImage::gridLeft() const
195 {
196 return _l;
197 }
198
gridRight() const199 int QQuickGridScaledImage::gridRight() const
200 {
201 return _r;
202 }
203
gridTop() const204 int QQuickGridScaledImage::gridTop() const
205 {
206 return _t;
207 }
208
gridBottom() const209 int QQuickGridScaledImage::gridBottom() const
210 {
211 return _b;
212 }
213
pixmapUrl() const214 QString QQuickGridScaledImage::pixmapUrl() const
215 {
216 return _pix;
217 }
218
219 QT_END_NAMESPACE
220