author | zecke <zecke> | 2004-07-24 15:02:13 (UTC) |
---|---|---|
committer | zecke <zecke> | 2004-07-24 15:02:13 (UTC) |
commit | c94b8aee4873dc382d3fe2673c7ac1db7080fe0e (patch) (unidiff) | |
tree | da5d98b9e429ad845651e731e93a978cea54a65b | |
parent | 2da1cf47a5c1429d8ad010880ff1da3e97b437ad (diff) | |
download | opie-c94b8aee4873dc382d3fe2673c7ac1db7080fe0e.zip opie-c94b8aee4873dc382d3fe2673c7ac1db7080fe0e.tar.gz opie-c94b8aee4873dc382d3fe2673c7ac1db7080fe0e.tar.bz2 |
Custom Image as the background for the board tiles.
This is later needed for the puzzle game mode
-rw-r--r-- | noncore/games/fifteen/config.in | 2 | ||||
-rw-r--r-- | noncore/games/fifteen/fifteen.cpp | 211 | ||||
-rw-r--r-- | noncore/games/fifteen/fifteen.h | 15 | ||||
-rw-r--r-- | noncore/games/fifteen/fifteen.pro | 12 | ||||
-rw-r--r-- | noncore/games/fifteen/fifteenconfigdialog.cpp | 112 | ||||
-rw-r--r-- | noncore/games/fifteen/fifteenconfigdialog.h | 57 | ||||
-rw-r--r-- | noncore/games/fifteen/fifteenconfigdialogbase.ui | 413 | ||||
-rw-r--r-- | noncore/games/fifteen/opie-fifteen.control | 2 |
8 files changed, 768 insertions, 56 deletions
diff --git a/noncore/games/fifteen/config.in b/noncore/games/fifteen/config.in index 2736d93..904d584 100644 --- a/noncore/games/fifteen/config.in +++ b/noncore/games/fifteen/config.in | |||
@@ -1,4 +1,4 @@ | |||
1 | config FIFTEEN | 1 | config FIFTEEN |
2 | boolean "opie-fifteen (sort fifteen pieces game)" | 2 | boolean "opie-fifteen (sort fifteen pieces game)" |
3 | default "y" | 3 | default "y" |
4 | depends ( LIBQPE || LIBQPE-X11 ) && LIBOPIE2CORE | 4 | depends ( LIBQPE || LIBQPE-X11 ) && LIBOPIE2CORE && LIBOPIE2UI |
diff --git a/noncore/games/fifteen/fifteen.cpp b/noncore/games/fifteen/fifteen.cpp index 506e87a..f425e06 100644 --- a/noncore/games/fifteen/fifteen.cpp +++ b/noncore/games/fifteen/fifteen.cpp | |||
@@ -17,28 +17,35 @@ | |||
17 | ** not clear to you. | 17 | ** not clear to you. |
18 | ** | 18 | ** |
19 | **********************************************************************/ | 19 | **********************************************************************/ |
20 | 20 | ||
21 | #include "fifteen.h" | 21 | #include "fifteen.h" |
22 | 22 | ||
23 | #include "fifteenconfigdialog.h" | ||
24 | |||
25 | #include <opie2/ofileselector.h> | ||
26 | |||
23 | #include <qtopia/resource.h> | 27 | #include <qtopia/resource.h> |
24 | #include <qtopia/config.h> | 28 | #include <qtopia/config.h> |
29 | #include <qtopia/qpeapplication.h> | ||
25 | 30 | ||
26 | #include <qvbox.h> | 31 | #include <qvbox.h> |
27 | #include <qaction.h> | 32 | #include <qaction.h> |
28 | #include <qpainter.h> | 33 | #include <qpainter.h> |
29 | #include <qmessagebox.h> | 34 | #include <qmessagebox.h> |
30 | #include <qtoolbar.h> | 35 | #include <qtoolbar.h> |
31 | #include <qmenubar.h> | 36 | #include <qmenubar.h> |
37 | #include <qimage.h> | ||
32 | 38 | ||
33 | #include <stdlib.h> | 39 | #include <stdlib.h> |
34 | #include <time.h> | 40 | #include <time.h> |
35 | 41 | ||
36 | FifteenMainWindow::FifteenMainWindow(QWidget *parent, const char* name, WFlags fl) | 42 | FifteenMainWindow::FifteenMainWindow(QWidget *parent, const char* name, WFlags fl) |
37 | : QMainWindow( parent, name, fl ) | 43 | : QMainWindow( parent, name, fl ) |
38 | { | 44 | { |
45 | |||
39 | // random seed | 46 | // random seed |
40 | srand(time(0)); | 47 | srand(time(0)); |
41 | setCaption( tr("Fifteen Pieces") ); | 48 | setCaption( tr("Fifteen Pieces") ); |
42 | 49 | ||
43 | QToolBar *toolbar = new QToolBar(this); | 50 | QToolBar *toolbar = new QToolBar(this); |
44 | toolbar->setHorizontalStretchable( FALSE ); | 51 | toolbar->setHorizontalStretchable( FALSE ); |
@@ -61,24 +68,37 @@ FifteenMainWindow::FifteenMainWindow(QWidget *parent, const char* name, WFlags f | |||
61 | QAction *a = new QAction( tr( "Randomize" ), Resource::loadPixmap( "new" ), | 68 | QAction *a = new QAction( tr( "Randomize" ), Resource::loadPixmap( "new" ), |
62 | QString::null, 0, this, 0 ); | 69 | QString::null, 0, this, 0 ); |
63 | connect( a, SIGNAL( activated() ), table, SLOT( slotRandomize() ) ); | 70 | connect( a, SIGNAL( activated() ), table, SLOT( slotRandomize() ) ); |
64 | a->addTo( game ); | 71 | a->addTo( game ); |
65 | a->addTo( toolbar ); | 72 | a->addTo( toolbar ); |
66 | 73 | ||
74 | |||
75 | a = new QAction( tr("Configure"), Resource::loadPixmap( "SettingsIcon" ), | ||
76 | QString::null, 0, this, 0 ); | ||
77 | connect( a, SIGNAL( activated()), table, SLOT( slotConfigure()) ); | ||
78 | a->addTo( game ); | ||
79 | |||
67 | /* This is pointless and confusing. | 80 | /* This is pointless and confusing. |
68 | a = new QAction( tr( "Solve" ), Resource::loadIconSet( "repeat" ), | 81 | a = new QAction( tr( "Solve" ), Resource::loadIconSet( "repeat" ), |
69 | QString::null, 0, this, 0 ); | 82 | QString::null, 0, this, 0 ); |
70 | connect( a, SIGNAL( activated() ), table, SLOT( slotReset() ) ); | 83 | connect( a, SIGNAL( activated() ), table, SLOT( slotReset() ) ); |
71 | a->addTo( game ); | 84 | a->addTo( game ); |
72 | a->addTo( toolbar ); | 85 | a->addTo( toolbar ); |
73 | */ | 86 | */ |
74 | menubar->insertItem( tr( "Game" ), game ); | 87 | menubar->insertItem( tr( "Game" ), game ); |
75 | } | 88 | } |
76 | 89 | ||
90 | |||
91 | |||
92 | |||
93 | /////////////// | ||
94 | /////// Pieces table Implementation | ||
95 | /////// | ||
77 | PiecesTable::PiecesTable(QWidget* parent, const char* name ) | 96 | PiecesTable::PiecesTable(QWidget* parent, const char* name ) |
78 | : QTableView(parent, name), _menu(0), _randomized(false) | 97 | : QTableView(parent, name), _menu(0), _randomized(false), |
98 | _dialog( 0l ) | ||
79 | { | 99 | { |
80 | // setup table view | 100 | // setup table view |
81 | setFrameStyle(StyledPanel | Sunken); | 101 | setFrameStyle(StyledPanel | Sunken); |
82 | setBackgroundMode(NoBackground); | 102 | setBackgroundMode(NoBackground); |
83 | setMouseTracking(true); | 103 | setMouseTracking(true); |
84 | 104 | ||
@@ -87,112 +107,195 @@ PiecesTable::PiecesTable(QWidget* parent, const char* name ) | |||
87 | 107 | ||
88 | // init arrays | 108 | // init arrays |
89 | initMap(); | 109 | initMap(); |
90 | readConfig(); | 110 | readConfig(); |
91 | initColors(); | 111 | initColors(); |
92 | 112 | ||
93 | // set font | ||
94 | QFont f = font(); | ||
95 | f.setPixelSize(18); | ||
96 | f.setBold( TRUE ); | ||
97 | setFont(f); | ||
98 | } | 113 | } |
99 | 114 | ||
115 | |||
100 | PiecesTable::~PiecesTable() | 116 | PiecesTable::~PiecesTable() |
101 | { | 117 | { |
102 | writeConfig(); | 118 | writeConfig(); |
119 | clear(); | ||
103 | } | 120 | } |
104 | 121 | ||
105 | void PiecesTable::writeConfig() | 122 | void PiecesTable::writeConfig() |
106 | { | 123 | { |
107 | Config cfg("Fifteen"); | 124 | Config cfg("Fifteen"); |
108 | cfg.setGroup("Game"); | 125 | cfg.setGroup("Game"); |
109 | QStringList map; | 126 | QStringList map; |
110 | for (int i = 0; i < 16; i++) | 127 | for (int i = 0; i < 16; i++) |
111 | map.append( QString::number( _map[i] ) ); | 128 | map.append( QString::number( _map[i] ) ); |
112 | cfg.writeEntry("Map", map, '-'); | 129 | cfg.writeEntry("Map", map, '-'); |
113 | cfg.writeEntry("Randomized", _randomized ); | 130 | cfg.writeEntry("Randomized", _randomized ); |
131 | cfg.writeEntry("Image", _image ); | ||
114 | } | 132 | } |
115 | 133 | ||
116 | void PiecesTable::readConfig() | 134 | void PiecesTable::readConfig() |
117 | { | 135 | { |
118 | Config cfg("Fifteen"); | 136 | Config cfg("Fifteen"); |
119 | cfg.setGroup("Game"); | 137 | cfg.setGroup("Game"); |
120 | QStringList map = cfg.readListEntry("Map", '-'); | 138 | QStringList map = cfg.readListEntry("Map", '-'); |
121 | _randomized = cfg.readBoolEntry( "Randomized", FALSE ); | 139 | _randomized = cfg.readBoolEntry( "Randomized", FALSE ); |
140 | _image = cfg.readEntry( "Image", QString::null ); | ||
122 | int i = 0; | 141 | int i = 0; |
123 | for ( QStringList::Iterator it = map.begin(); it != map.end(); ++it ) { | 142 | for ( QStringList::Iterator it = map.begin(); it != map.end(); ++it ) { |
124 | _map[i] = (*it).toInt(); | 143 | _map[i] = (*it).toInt(); |
125 | i++; | 144 | i++; |
126 | if ( i > 15 ) break; | 145 | if ( i > 15 ) break; |
127 | } | 146 | } |
147 | |||
148 | } | ||
149 | |||
150 | |||
151 | void PiecesTable::clear() { | ||
152 | /* clean up and resize */ | ||
153 | for (uint i = 0; i < _pixmap.count(); ++i ) | ||
154 | delete _pixmap[i]; | ||
155 | _pixmap.resize( 16 ); | ||
156 | } | ||
157 | |||
158 | /* | ||
159 | * Let us pre-render the tiles. Either we've a Custom Image as | ||
160 | * background or we use the drawRect to fill the background and | ||
161 | * last we put the number on it | ||
162 | */ | ||
163 | void PiecesTable::slotCustomImage( const QString& _str , bool upd ) { | ||
164 | QString str = _str; | ||
165 | |||
166 | |||
167 | /* couldn't load image fall back to plain tiles*/ | ||
168 | QImage img = QImage(str); | ||
169 | if(img.isNull()) | ||
170 | str = QString::null; | ||
171 | else | ||
172 | img = img.smoothScale( width(),height() ); | ||
173 | |||
174 | QPixmap pix; | ||
175 | pix.convertFromImage( img ); | ||
176 | |||
177 | uint image=0; | ||
178 | |||
179 | clear(); | ||
180 | |||
181 | /* used variables */ | ||
182 | int cols = numCols(); | ||
183 | int rows = numRows(); | ||
184 | int cellW = cellWidth(); | ||
185 | int cellH = cellHeight(); | ||
186 | int x2 = cellW-1; | ||
187 | int y2 = cellH-1; | ||
188 | bool empty = str.isEmpty(); | ||
189 | double bw = empty ? 0.9 : 0.98; | ||
190 | int x_offset = cellW - int(cellW * bw);// 10% should be enough | ||
191 | inty_offset = cellH - int(cellH * bw); | ||
192 | |||
193 | /* border polygon */ | ||
194 | initPolygon(cellW, cellH, x_offset, y_offset ); | ||
195 | |||
196 | if ( cellW == 0 || cellH == 0 ) { | ||
197 | _pixmap.resize( 0 ); | ||
198 | return; | ||
199 | } | ||
200 | |||
201 | QFont f = font(); | ||
202 | f.setPixelSize(18); | ||
203 | f.setBold( TRUE ); | ||
204 | |||
205 | /* for every tile */ | ||
206 | for(int row = 0; row < rows; ++row ) { | ||
207 | for(int col= 0; col < cols; ++col) { | ||
208 | QPixmap *pip = new QPixmap(cellW, cellH ); | ||
209 | QPainter *p = new QPainter(pip ); | ||
210 | p->setFont( f ); | ||
211 | |||
212 | /* draw the tradional tile or a part of the pixmap*/ | ||
213 | if(empty) { | ||
214 | p->setBrush(_colors[image]); | ||
215 | p->setPen(NoPen); | ||
216 | p->drawRect(0,0,cellW,cellH); | ||
217 | }else | ||
218 | p->drawPixmap(0, 0, pix,col*cellW, row*cellH, cellW, cellH ); | ||
219 | |||
220 | // draw borders | ||
221 | if (height() > 40) { | ||
222 | p->setBrush(_colors[image].light(130)); | ||
223 | p->drawPolygon(light_border); | ||
224 | |||
225 | p->setBrush(_colors[image].dark(130)); | ||
226 | p->drawPolygon(dark_border); | ||
227 | } | ||
228 | |||
229 | // draw number | ||
230 | p->setPen(black); | ||
231 | p->drawText(0, 0, x2, y2, AlignHCenter | AlignVCenter, QString::number(image+1)); | ||
232 | |||
233 | delete p; | ||
234 | _pixmap[image++] = pip; | ||
235 | } | ||
236 | } | ||
237 | _image = str; | ||
238 | |||
239 | if ( upd ) | ||
240 | update(); | ||
241 | } | ||
242 | |||
243 | /* | ||
244 | * Calculate 3d-effect borders | ||
245 | */ | ||
246 | void PiecesTable::initPolygon(int cell_w, int cell_h, int x_offset, int y_offset ) { | ||
247 | light_border.setPoints(6, | ||
248 | 0, 0, | ||
249 | cell_w, 0, | ||
250 | cell_w - x_offset, y_offset, | ||
251 | x_offset, y_offset, | ||
252 | x_offset, cell_h - y_offset, | ||
253 | 0, cell_h); | ||
254 | |||
255 | dark_border.setPoints(6, | ||
256 | cell_w, 0, | ||
257 | cell_w, cell_h, | ||
258 | 0, cell_h, | ||
259 | x_offset, cell_h - y_offset, | ||
260 | cell_w - x_offset, cell_h - y_offset, | ||
261 | cell_w - x_offset, y_offset); | ||
128 | } | 262 | } |
129 | 263 | ||
130 | void PiecesTable::paintCell(QPainter *p, int row, int col) | 264 | void PiecesTable::paintCell(QPainter *p, int row, int col) |
131 | { | 265 | { |
132 | int w = cellWidth(); | 266 | int w = cellWidth(); |
133 | int h = cellHeight(); | 267 | int h = cellHeight(); |
134 | int x2 = w - 1; | ||
135 | int y2 = h - 1; | ||
136 | 268 | ||
137 | int number = _map[col + row * numCols()] + 1; | 269 | int number = _map[col + row * numCols()] + 1; |
138 | 270 | ||
139 | // draw cell background | 271 | // draw cell background |
140 | if(number == 16) | 272 | if(number == 16) { |
141 | p->setBrush(colorGroup().background()); | 273 | p->setBrush(colorGroup().background()); |
142 | else | 274 | p->setPen(NoPen); |
143 | p->setBrush(_colors[number-1]); | 275 | p->drawRect(0, 0, w, h); |
144 | p->setPen(NoPen); | 276 | return; |
145 | p->drawRect(0, 0, w, h); | ||
146 | |||
147 | if (number == 16) return; | ||
148 | |||
149 | // draw borders | ||
150 | if (height() > 40) { | ||
151 | p->setBrush(_colors[number-1].light(130)); | ||
152 | p->drawPolygon(light_border); | ||
153 | |||
154 | p->setBrush(_colors[number-1].dark(130)); | ||
155 | p->drawPolygon(dark_border); | ||
156 | } | 277 | } |
157 | 278 | ||
158 | // draw number | 279 | if( _pixmap.count() == 0 ) |
159 | p->setPen(black); | 280 | return; |
160 | p->drawText(0, 0, x2, y2, AlignHCenter | AlignVCenter, QString::number(number)); | 281 | |
282 | p->drawPixmap(0, 0, *(_pixmap[(number-1 )]) ); | ||
161 | } | 283 | } |
162 | 284 | ||
163 | void PiecesTable::resizeEvent(QResizeEvent *e) | 285 | void PiecesTable::resizeEvent(QResizeEvent *e) |
164 | { | 286 | { |
165 | QTableView::resizeEvent(e); | 287 | QTableView::resizeEvent(e); |
166 | 288 | ||
167 | setCellWidth(contentsRect().width()/ numRows()); | 289 | setCellWidth(contentsRect().width()/ numRows()); |
168 | setCellHeight(contentsRect().height() / numCols()); | 290 | setCellHeight(contentsRect().height() / numCols()); |
169 | 291 | ||
170 | // | 292 | |
171 | // Calculate 3d-effect borders | 293 | /* update the image and calculate border*/ |
172 | // | 294 | slotCustomImage( _image ); |
173 | intcell_w = cellWidth(); | 295 | |
174 | intcell_h = cellHeight(); | ||
175 | int x_offset = cell_w - int(cell_w * 0.9);// 10% should be enough | ||
176 | inty_offset = cell_h - int(cell_h * 0.9); | ||
177 | |||
178 | light_border.setPoints(6, | ||
179 | 0, 0, | ||
180 | cell_w, 0, | ||
181 | cell_w - x_offset, y_offset, | ||
182 | x_offset, y_offset, | ||
183 | x_offset, cell_h - y_offset, | ||
184 | 0, cell_h); | ||
185 | |||
186 | dark_border.setPoints(6, | ||
187 | cell_w, 0, | ||
188 | cell_w, cell_h, | ||
189 | 0, cell_h, | ||
190 | x_offset, cell_h - y_offset, | ||
191 | cell_w - x_offset, cell_h - y_offset, | ||
192 | cell_w - x_offset, y_offset); | ||
193 | } | 296 | } |
194 | 297 | ||
195 | void PiecesTable::initColors() | 298 | void PiecesTable::initColors() |
196 | { | 299 | { |
197 | _colors.resize(numRows() * numCols()); | 300 | _colors.resize(numRows() * numCols()); |
198 | for (int r = 0; r < numRows(); r++) | 301 | for (int r = 0; r < numRows(); r++) |
@@ -381,6 +484,16 @@ void PiecesTable::mousePressEvent(QMouseEvent* e) | |||
381 | updateCell(row, col, false); | 484 | updateCell(row, col, false); |
382 | 485 | ||
383 | // check if the player wins with this move | 486 | // check if the player wins with this move |
384 | checkwin(); | 487 | checkwin(); |
385 | } | 488 | } |
386 | } | 489 | } |
490 | |||
491 | void PiecesTable::slotConfigure() { | ||
492 | if ( !_dialog ) | ||
493 | _dialog = new FifteenConfigDialog(this, "Fifteen Configure Dialog", true ); | ||
494 | |||
495 | |||
496 | _dialog->setImageSrc( _image ); | ||
497 | if ( QPEApplication::execDialog(_dialog) == QDialog::Accepted ) | ||
498 | slotCustomImage( _dialog->imageSrc(), true ); | ||
499 | } | ||
diff --git a/noncore/games/fifteen/fifteen.h b/noncore/games/fifteen/fifteen.h index 58eb756..4b8702d 100644 --- a/noncore/games/fifteen/fifteen.h +++ b/noncore/games/fifteen/fifteen.h | |||
@@ -22,47 +22,59 @@ | |||
22 | #define __fifteenapplet_h__ | 22 | #define __fifteenapplet_h__ |
23 | 23 | ||
24 | #include <qmainwindow.h> | 24 | #include <qmainwindow.h> |
25 | #include <qtableview.h> | 25 | #include <qtableview.h> |
26 | #include <qarray.h> | 26 | #include <qarray.h> |
27 | #include <qpointarray.h> | 27 | #include <qpointarray.h> |
28 | #include <qpixmap.h> | ||
29 | #include <qvector.h> | ||
28 | 30 | ||
29 | class QPopupMenu; | 31 | class QPopupMenu; |
32 | class FifteenConfigDialog; | ||
30 | 33 | ||
31 | class PiecesTable : public QTableView | 34 | class PiecesTable : public QTableView |
32 | { | 35 | { |
33 | Q_OBJECT | 36 | Q_OBJECT |
34 | 37 | ||
35 | public: | 38 | public: |
36 | PiecesTable(QWidget* parent = 0, const char* name = 0); | 39 | PiecesTable(QWidget* parent = 0, const char* name = 0); |
37 | ~PiecesTable(); | 40 | ~PiecesTable(); |
38 | 41 | ||
39 | protected slots: | 42 | protected slots: |
43 | void slotConfigure(); | ||
44 | void slotCustomImage(const QString &str, bool upd = false); | ||
40 | void slotRandomize(); | 45 | void slotRandomize(); |
41 | void slotReset(); | 46 | void slotReset(); |
42 | 47 | ||
43 | protected: | 48 | protected: |
44 | void resizeEvent(QResizeEvent*); | 49 | void resizeEvent(QResizeEvent*); |
45 | void mousePressEvent(QMouseEvent*); | 50 | void mousePressEvent(QMouseEvent*); |
46 | 51 | ||
47 | void paintCell(QPainter *, int row, int col); | 52 | void paintCell(QPainter *, int row, int col); |
48 | 53 | ||
54 | void initImage(); | ||
49 | void initMap(); | 55 | void initMap(); |
50 | void initColors(); | 56 | void initColors(); |
51 | void randomizeMap(); | 57 | void randomizeMap(); |
52 | void checkwin(); | 58 | void checkwin(); |
53 | void readConfig(); | 59 | void readConfig(); |
54 | void writeConfig(); | 60 | void writeConfig(); |
55 | 61 | ||
62 | void initPolygon(int w, int h, int x_of, int y_of ); | ||
56 | private: | 63 | private: |
64 | void clear(); | ||
65 | QString _image; | ||
57 | QArray<int> _map; | 66 | QArray<int> _map; |
58 | QArray<QColor> _colors; | 67 | QArray<QColor> _colors; |
68 | QArray<QPixmap*> _pixmap; | ||
69 | |||
59 | QPopupMenu *_menu; | 70 | QPopupMenu *_menu; |
60 | bool _randomized; | 71 | bool _randomized; |
61 | QPointArraylight_border; | 72 | QPointArraylight_border; |
62 | QPointArraydark_border; | 73 | QPointArraydark_border; |
74 | FifteenConfigDialog *_dialog; | ||
63 | 75 | ||
64 | enum MenuOp { mRandomize = 1, mReset = 2 }; | 76 | enum MenuOp { mRandomize = 1, mReset = 2 }; |
65 | }; | 77 | }; |
66 | 78 | ||
67 | class FifteenWidget : public QWidget | 79 | class FifteenWidget : public QWidget |
68 | { | 80 | { |
@@ -72,12 +84,13 @@ public: | |||
72 | FifteenWidget(QWidget *parent = 0, const char *name = 0); | 84 | FifteenWidget(QWidget *parent = 0, const char *name = 0); |
73 | 85 | ||
74 | private: | 86 | private: |
75 | PiecesTable *_table; | 87 | PiecesTable *_table; |
76 | }; | 88 | }; |
77 | 89 | ||
90 | |||
78 | class FifteenMainWindow : public QMainWindow | 91 | class FifteenMainWindow : public QMainWindow |
79 | { | 92 | { |
80 | Q_OBJECT | 93 | Q_OBJECT |
81 | 94 | ||
82 | public: | 95 | public: |
83 | static QString appName() { | 96 | static QString appName() { |
diff --git a/noncore/games/fifteen/fifteen.pro b/noncore/games/fifteen/fifteen.pro index 509f106..34058a0 100644 --- a/noncore/games/fifteen/fifteen.pro +++ b/noncore/games/fifteen/fifteen.pro | |||
@@ -1,10 +1,14 @@ | |||
1 | CONFIG = qt warn_on quick-app | 1 | CONFIG = qt warn_on |
2 | HEADERS = fifteen.h | 2 | HEADERS = fifteen.h \ |
3 | SOURCES = fifteen.cpp \ | 3 | fifteenconfigdialog.h |
4 | SOURCES = fifteen.cpp \ | ||
5 | fifteenconfigdialog.cpp \ | ||
4 | main.cpp | 6 | main.cpp |
5 | INCLUDEPATH += $(OPIEDIR)/include | 7 | INCLUDEPATH += $(OPIEDIR)/include |
6 | DEPENDPATH+= $(OPIEDIR)/include | 8 | DEPENDPATH+= $(OPIEDIR)/include |
7 | LIBS += -lqpe -lopiecore2 | 9 | LIBS += -lqpe -lopiecore2 -lopieui2 |
8 | TARGET = fifteen | 10 | TARGET = fifteen |
11 | INTERFACES = fifteenconfigdialogbase.ui | ||
9 | 12 | ||
10 | include ( $(OPIEDIR)/include.pro ) | 13 | include ( $(OPIEDIR)/include.pro ) |
14 | |||
diff --git a/noncore/games/fifteen/fifteenconfigdialog.cpp b/noncore/games/fifteen/fifteenconfigdialog.cpp new file mode 100644 index 0000000..3f974f8 --- a/dev/null +++ b/noncore/games/fifteen/fifteenconfigdialog.cpp | |||
@@ -0,0 +1,112 @@ | |||
1 | /* | ||
2 | =. This file is part of the OPIE Project | ||
3 | .=l. Copyright (c) 2002 <> | ||
4 | .>+-= | ||
5 | _;:, .> :=|. This program is free software; you can | ||
6 | .> <`_, > . <= redistribute it and/or modify it under | ||
7 | :`=1 )Y*s>-.-- : the terms of the GNU General Public | ||
8 | .="- .-=="i, .._ License as published by the Free Software | ||
9 | - . .-<_> .<> Foundation; either version 2 of the License, | ||
10 | ._= =} : or (at your option) any later version. | ||
11 | .%`+i> _;_. | ||
12 | .i_,=:_. -<s. This program is distributed in the hope that | ||
13 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | ||
14 | : .. .:, . . . without even the implied warranty of | ||
15 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | ||
16 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | ||
17 | ..}^=.= = ; Library General Public License for more | ||
18 | ++= -. .` .: details. | ||
19 | : = ...= . :.=- | ||
20 | -. .:....=;==+<; You should have received a copy of the GNU | ||
21 | -_. . . )=. = General Public License along with | ||
22 | -- :-=` this library; see the file COPYING.LIB. | ||
23 | If not, write to the Free Software Foundation, | ||
24 | Inc., 59 Temple Place - Suite 330, | ||
25 | Boston, MA 02111-1307, USA. | ||
26 | |||
27 | */ | ||
28 | |||
29 | |||
30 | #include "fifteenconfigdialog.h" | ||
31 | |||
32 | #include <opie2/ofiledialog.h> | ||
33 | |||
34 | #include <qimage.h> | ||
35 | #include <qlabel.h> | ||
36 | #include <qspinbox.h> | ||
37 | #include <qlineedit.h> | ||
38 | #include <qcheckbox.h> | ||
39 | #include <qgroupbox.h> | ||
40 | |||
41 | |||
42 | using Opie::Ui::OFileSelector; | ||
43 | using Opie::Ui::OFileDialog; | ||
44 | |||
45 | |||
46 | FifteenConfigDialog::FifteenConfigDialog( QWidget* parent, const char* name, bool modal ) | ||
47 | : FifteenConfigDialogBase( parent, name, modal ) | ||
48 | { | ||
49 | grpGameGrid->hide(); | ||
50 | } | ||
51 | |||
52 | FifteenConfigDialog::~FifteenConfigDialog() | ||
53 | {} | ||
54 | |||
55 | /** | ||
56 | * src.isEmpty() means no Custom Image to be set | ||
57 | */ | ||
58 | void FifteenConfigDialog::setImageSrc( const QString& src ) { | ||
59 | ckbCustomImage->setChecked( !src.isEmpty() ); | ||
60 | lneImage->setText( src ); | ||
61 | lblPreview->setPixmap( preview(src ) ); | ||
62 | } | ||
63 | |||
64 | /* | ||
65 | * If the return isEmpty() this means no custom image is wished | ||
66 | */ | ||
67 | QString FifteenConfigDialog::imageSrc()const { | ||
68 | return ckbCustomImage->isChecked() ? lneImage->text() : QString::null; | ||
69 | } | ||
70 | |||
71 | void FifteenConfigDialog::setGameboard( int rows, int columns ) { | ||
72 | spnRow->setValue( rows ); | ||
73 | spnCol->setValue( columns ); | ||
74 | } | ||
75 | |||
76 | |||
77 | int FifteenConfigDialog::columns()const { | ||
78 | return spnCol->value(); | ||
79 | } | ||
80 | |||
81 | int FifteenConfigDialog::rows() const{ | ||
82 | return spnRow->value(); | ||
83 | } | ||
84 | |||
85 | void FifteenConfigDialog::slotLoadImage() { | ||
86 | QStringList lst; | ||
87 | lst << "image/*"; | ||
88 | MimeTypes type; | ||
89 | type.insert( tr("All Images" ), lst ); | ||
90 | type.insert( tr("All Files"), "*/*" ); | ||
91 | |||
92 | |||
93 | QString str = OFileDialog::getOpenFileName(OFileSelector::Normal, | ||
94 | QString::null, QString::null, | ||
95 | type, this, | ||
96 | tr("Select board background") ); | ||
97 | if (!str.isEmpty() ) | ||
98 | setImageSrc( str ); | ||
99 | } | ||
100 | |||
101 | |||
102 | QPixmap FifteenConfigDialog::preview( const QString& file ) { | ||
103 | QPixmap pix; | ||
104 | QImage img( file ); | ||
105 | if( img.isNull() ) | ||
106 | return pix; | ||
107 | |||
108 | img = img.smoothScale(120, 120 ); | ||
109 | pix.convertFromImage( img ); | ||
110 | |||
111 | return pix; | ||
112 | } | ||
diff --git a/noncore/games/fifteen/fifteenconfigdialog.h b/noncore/games/fifteen/fifteenconfigdialog.h new file mode 100644 index 0000000..823a03c --- a/dev/null +++ b/noncore/games/fifteen/fifteenconfigdialog.h | |||
@@ -0,0 +1,57 @@ | |||
1 | /* | ||
2 | =. This file is part of the OPIE Project | ||
3 | .=l. Copyright (c) 2004 Holger Freyther <zecke@handhelds.org> | ||
4 | .>+-= | ||
5 | _;:, .> :=|. This program is free software; you can | ||
6 | .> <`_, > . <= redistribute it and/or modify it under | ||
7 | :`=1 )Y*s>-.-- : the terms of the GNU General Public | ||
8 | .="- .-=="i, .._ License as published by the Free Software | ||
9 | - . .-<_> .<> Foundation; either version 2 of the License, | ||
10 | ._= =} : or (at your option) any later version. | ||
11 | .%`+i> _;_. | ||
12 | .i_,=:_. -<s. This program is distributed in the hope that | ||
13 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | ||
14 | : .. .:, . . . without even the implied warranty of | ||
15 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | ||
16 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | ||
17 | ..}^=.= = ; Library General Public License for more | ||
18 | ++= -. .` .: details. | ||
19 | : = ...= . :.=- | ||
20 | -. .:....=;==+<; You should have received a copy of the GNU | ||
21 | -_. . . )=. = Library General Public License along with | ||
22 | -- :-=` this library; see the file COPYING.LIB. | ||
23 | If not, write to the Free Software Foundation, | ||
24 | Inc., 59 Temple Place - Suite 330, | ||
25 | Boston, MA 02111-1307, USA. | ||
26 | |||
27 | */ | ||
28 | |||
29 | |||
30 | #ifndef FIFTEEN_CONFIG_DIALOG_H | ||
31 | #define FIFTEEN_CONFIG_DIALOG_H | ||
32 | |||
33 | #include "fifteenconfigdialogbase.h" | ||
34 | |||
35 | class FifteenConfigDialog : public FifteenConfigDialogBase { | ||
36 | Q_OBJECT | ||
37 | public: | ||
38 | FifteenConfigDialog( QWidget *parent = 0, const char* name = 0, bool modal =TRUE ); | ||
39 | ~FifteenConfigDialog(); | ||
40 | |||
41 | void setImageSrc( const QString& ); | ||
42 | QString imageSrc()const; | ||
43 | |||
44 | void setGameboard( int rows, int columns ); | ||
45 | int columns()const; | ||
46 | int rows()const; | ||
47 | |||
48 | protected slots: | ||
49 | void slotLoadImage(); | ||
50 | |||
51 | private: | ||
52 | QPixmap preview( const QString& ); | ||
53 | |||
54 | }; | ||
55 | |||
56 | |||
57 | #endif | ||
diff --git a/noncore/games/fifteen/fifteenconfigdialogbase.ui b/noncore/games/fifteen/fifteenconfigdialogbase.ui new file mode 100644 index 0000000..6118ac1 --- a/dev/null +++ b/noncore/games/fifteen/fifteenconfigdialogbase.ui | |||
@@ -0,0 +1,413 @@ | |||
1 | <!DOCTYPE UI><UI> | ||
2 | <class>FifteenConfigDialogBase</class> | ||
3 | <widget> | ||
4 | <class>QDialog</class> | ||
5 | <property stdset="1"> | ||
6 | <name>name</name> | ||
7 | <cstring>FifteenConfigDialogBase</cstring> | ||
8 | </property> | ||
9 | <property stdset="1"> | ||
10 | <name>geometry</name> | ||
11 | <rect> | ||
12 | <x>0</x> | ||
13 | <y>0</y> | ||
14 | <width>430</width> | ||
15 | <height>468</height> | ||
16 | </rect> | ||
17 | </property> | ||
18 | <property stdset="1"> | ||
19 | <name>caption</name> | ||
20 | <string>Configure Fifteen</string> | ||
21 | </property> | ||
22 | <property> | ||
23 | <name>layoutMargin</name> | ||
24 | </property> | ||
25 | <property> | ||
26 | <name>layoutSpacing</name> | ||
27 | </property> | ||
28 | <vbox> | ||
29 | <property stdset="1"> | ||
30 | <name>margin</name> | ||
31 | <number>4</number> | ||
32 | </property> | ||
33 | <property stdset="1"> | ||
34 | <name>spacing</name> | ||
35 | <number>4</number> | ||
36 | </property> | ||
37 | <widget> | ||
38 | <class>QCheckBox</class> | ||
39 | <property stdset="1"> | ||
40 | <name>name</name> | ||
41 | <cstring>ckbCustomImage</cstring> | ||
42 | </property> | ||
43 | <property stdset="1"> | ||
44 | <name>text</name> | ||
45 | <string>Use a Custom Image</string> | ||
46 | </property> | ||
47 | </widget> | ||
48 | <widget> | ||
49 | <class>QGroupBox</class> | ||
50 | <property stdset="1"> | ||
51 | <name>name</name> | ||
52 | <cstring>customBox</cstring> | ||
53 | </property> | ||
54 | <property stdset="1"> | ||
55 | <name>enabled</name> | ||
56 | <bool>false</bool> | ||
57 | </property> | ||
58 | <property stdset="1"> | ||
59 | <name>title</name> | ||
60 | <string>Custom Image</string> | ||
61 | </property> | ||
62 | <property> | ||
63 | <name>layoutMargin</name> | ||
64 | </property> | ||
65 | <property> | ||
66 | <name>layoutSpacing</name> | ||
67 | </property> | ||
68 | <vbox> | ||
69 | <property stdset="1"> | ||
70 | <name>margin</name> | ||
71 | <number>4</number> | ||
72 | </property> | ||
73 | <property stdset="1"> | ||
74 | <name>spacing</name> | ||
75 | <number>4</number> | ||
76 | </property> | ||
77 | <widget> | ||
78 | <class>QLayoutWidget</class> | ||
79 | <property stdset="1"> | ||
80 | <name>name</name> | ||
81 | <cstring>Layout8</cstring> | ||
82 | </property> | ||
83 | <hbox> | ||
84 | <property stdset="1"> | ||
85 | <name>margin</name> | ||
86 | <number>0</number> | ||
87 | </property> | ||
88 | <property stdset="1"> | ||
89 | <name>spacing</name> | ||
90 | <number>6</number> | ||
91 | </property> | ||
92 | <widget> | ||
93 | <class>QLabel</class> | ||
94 | <property stdset="1"> | ||
95 | <name>name</name> | ||
96 | <cstring>lblImage</cstring> | ||
97 | </property> | ||
98 | <property stdset="1"> | ||
99 | <name>text</name> | ||
100 | <string><b>Path:</b></string> | ||
101 | </property> | ||
102 | </widget> | ||
103 | <spacer> | ||
104 | <property> | ||
105 | <name>name</name> | ||
106 | <cstring>Spacer4</cstring> | ||
107 | </property> | ||
108 | <property stdset="1"> | ||
109 | <name>orientation</name> | ||
110 | <enum>Horizontal</enum> | ||
111 | </property> | ||
112 | <property stdset="1"> | ||
113 | <name>sizeType</name> | ||
114 | <enum>Expanding</enum> | ||
115 | </property> | ||
116 | <property> | ||
117 | <name>sizeHint</name> | ||
118 | <size> | ||
119 | <width>20</width> | ||
120 | <height>20</height> | ||
121 | </size> | ||
122 | </property> | ||
123 | </spacer> | ||
124 | <widget> | ||
125 | <class>QLineEdit</class> | ||
126 | <property stdset="1"> | ||
127 | <name>name</name> | ||
128 | <cstring>lneImage</cstring> | ||
129 | </property> | ||
130 | </widget> | ||
131 | <widget> | ||
132 | <class>QToolButton</class> | ||
133 | <property stdset="1"> | ||
134 | <name>name</name> | ||
135 | <cstring>btnImage</cstring> | ||
136 | </property> | ||
137 | <property stdset="1"> | ||
138 | <name>text</name> | ||
139 | <string>...</string> | ||
140 | </property> | ||
141 | </widget> | ||
142 | </hbox> | ||
143 | </widget> | ||
144 | <widget> | ||
145 | <class>QLayoutWidget</class> | ||
146 | <property stdset="1"> | ||
147 | <name>name</name> | ||
148 | <cstring>Layout9</cstring> | ||
149 | </property> | ||
150 | <hbox> | ||
151 | <property stdset="1"> | ||
152 | <name>margin</name> | ||
153 | <number>0</number> | ||
154 | </property> | ||
155 | <property stdset="1"> | ||
156 | <name>spacing</name> | ||
157 | <number>6</number> | ||
158 | </property> | ||
159 | <widget> | ||
160 | <class>QLabel</class> | ||
161 | <property stdset="1"> | ||
162 | <name>name</name> | ||
163 | <cstring>lblPreviewName</cstring> | ||
164 | </property> | ||
165 | <property stdset="1"> | ||
166 | <name>text</name> | ||
167 | <string><b>Preview:</b></string> | ||
168 | </property> | ||
169 | </widget> | ||
170 | <spacer> | ||
171 | <property> | ||
172 | <name>name</name> | ||
173 | <cstring>Spacer5</cstring> | ||
174 | </property> | ||
175 | <property stdset="1"> | ||
176 | <name>orientation</name> | ||
177 | <enum>Horizontal</enum> | ||
178 | </property> | ||
179 | <property stdset="1"> | ||
180 | <name>sizeType</name> | ||
181 | <enum>Expanding</enum> | ||
182 | </property> | ||
183 | <property> | ||
184 | <name>sizeHint</name> | ||
185 | <size> | ||
186 | <width>20</width> | ||
187 | <height>20</height> | ||
188 | </size> | ||
189 | </property> | ||
190 | </spacer> | ||
191 | <widget> | ||
192 | <class>QLabel</class> | ||
193 | <property stdset="1"> | ||
194 | <name>name</name> | ||
195 | <cstring>lblPreview</cstring> | ||
196 | </property> | ||
197 | <property stdset="1"> | ||
198 | <name>pixmap</name> | ||
199 | <pixmap>image0</pixmap> | ||
200 | </property> | ||
201 | <property stdset="1"> | ||
202 | <name>scaledContents</name> | ||
203 | <bool>true</bool> | ||
204 | </property> | ||
205 | </widget> | ||
206 | </hbox> | ||
207 | </widget> | ||
208 | </vbox> | ||
209 | </widget> | ||
210 | <widget> | ||
211 | <class>QGroupBox</class> | ||
212 | <property stdset="1"> | ||
213 | <name>name</name> | ||
214 | <cstring>grpGameGrid</cstring> | ||
215 | </property> | ||
216 | <property stdset="1"> | ||
217 | <name>title</name> | ||
218 | <string>Grid</string> | ||
219 | </property> | ||
220 | <property> | ||
221 | <name>layoutMargin</name> | ||
222 | </property> | ||
223 | <property> | ||
224 | <name>layoutSpacing</name> | ||
225 | </property> | ||
226 | <grid> | ||
227 | <property stdset="1"> | ||
228 | <name>margin</name> | ||
229 | <number>4</number> | ||
230 | </property> | ||
231 | <property stdset="1"> | ||
232 | <name>spacing</name> | ||
233 | <number>4</number> | ||
234 | </property> | ||
235 | <widget row="0" column="0" > | ||
236 | <class>QLayoutWidget</class> | ||
237 | <property stdset="1"> | ||
238 | <name>name</name> | ||
239 | <cstring>Layout5</cstring> | ||
240 | </property> | ||
241 | <hbox> | ||
242 | <property stdset="1"> | ||
243 | <name>margin</name> | ||
244 | <number>0</number> | ||
245 | </property> | ||
246 | <property stdset="1"> | ||
247 | <name>spacing</name> | ||
248 | <number>6</number> | ||
249 | </property> | ||
250 | <widget> | ||
251 | <class>QLabel</class> | ||
252 | <property stdset="1"> | ||
253 | <name>name</name> | ||
254 | <cstring>lblRows</cstring> | ||
255 | </property> | ||
256 | <property stdset="1"> | ||
257 | <name>text</name> | ||
258 | <string><b>Rows:</b></string> | ||
259 | </property> | ||
260 | </widget> | ||
261 | <spacer> | ||
262 | <property> | ||
263 | <name>name</name> | ||
264 | <cstring>Spacer2</cstring> | ||
265 | </property> | ||
266 | <property stdset="1"> | ||
267 | <name>orientation</name> | ||
268 | <enum>Horizontal</enum> | ||
269 | </property> | ||
270 | <property stdset="1"> | ||
271 | <name>sizeType</name> | ||
272 | <enum>Expanding</enum> | ||
273 | </property> | ||
274 | <property> | ||
275 | <name>sizeHint</name> | ||
276 | <size> | ||
277 | <width>20</width> | ||
278 | <height>20</height> | ||
279 | </size> | ||
280 | </property> | ||
281 | </spacer> | ||
282 | <widget> | ||
283 | <class>QSpinBox</class> | ||
284 | <property stdset="1"> | ||
285 | <name>name</name> | ||
286 | <cstring>spnRow</cstring> | ||
287 | </property> | ||
288 | <property stdset="1"> | ||
289 | <name>maxValue</name> | ||
290 | <number>15</number> | ||
291 | </property> | ||
292 | <property stdset="1"> | ||
293 | <name>minValue</name> | ||
294 | <number>1</number> | ||
295 | </property> | ||
296 | <property stdset="1"> | ||
297 | <name>value</name> | ||
298 | <number>4</number> | ||
299 | </property> | ||
300 | </widget> | ||
301 | </hbox> | ||
302 | </widget> | ||
303 | <widget row="1" column="0" > | ||
304 | <class>QLayoutWidget</class> | ||
305 | <property stdset="1"> | ||
306 | <name>name</name> | ||
307 | <cstring>Layout6</cstring> | ||
308 | </property> | ||
309 | <hbox> | ||
310 | <property stdset="1"> | ||
311 | <name>margin</name> | ||
312 | <number>0</number> | ||
313 | </property> | ||
314 | <property stdset="1"> | ||
315 | <name>spacing</name> | ||
316 | <number>6</number> | ||
317 | </property> | ||
318 | <widget> | ||
319 | <class>QLabel</class> | ||
320 | <property stdset="1"> | ||
321 | <name>name</name> | ||
322 | <cstring>TextLabel4</cstring> | ||
323 | </property> | ||
324 | <property stdset="1"> | ||
325 | <name>text</name> | ||
326 | <string><b>Columns:</b></string> | ||
327 | </property> | ||
328 | </widget> | ||
329 | <spacer> | ||
330 | <property> | ||
331 | <name>name</name> | ||
332 | <cstring>Spacer3</cstring> | ||
333 | </property> | ||
334 | <property stdset="1"> | ||
335 | <name>orientation</name> | ||
336 | <enum>Horizontal</enum> | ||
337 | </property> | ||
338 | <property stdset="1"> | ||
339 | <name>sizeType</name> | ||
340 | <enum>Expanding</enum> | ||
341 | </property> | ||
342 | <property> | ||
343 | <name>sizeHint</name> | ||
344 | <size> | ||
345 | <width>20</width> | ||
346 | <height>20</height> | ||
347 | </size> | ||
348 | </property> | ||
349 | </spacer> | ||
350 | <widget> | ||
351 | <class>QSpinBox</class> | ||
352 | <property stdset="1"> | ||
353 | <name>name</name> | ||
354 | <cstring>spnCol</cstring> | ||
355 | </property> | ||
356 | <property stdset="1"> | ||
357 | <name>minValue</name> | ||
358 | <number>1</number> | ||
359 | </property> | ||
360 | <property stdset="1"> | ||
361 | <name>value</name> | ||
362 | <number>4</number> | ||
363 | </property> | ||
364 | </widget> | ||
365 | </hbox> | ||
366 | </widget> | ||
367 | </grid> | ||
368 | </widget> | ||
369 | <spacer> | ||
370 | <property> | ||
371 | <name>name</name> | ||
372 | <cstring>Spacer6</cstring> | ||
373 | </property> | ||
374 | <property stdset="1"> | ||
375 | <name>orientation</name> | ||
376 | <enum>Vertical</enum> | ||
377 | </property> | ||
378 | <property stdset="1"> | ||
379 | <name>sizeType</name> | ||
380 | <enum>Expanding</enum> | ||
381 | </property> | ||
382 | <property> | ||
383 | <name>sizeHint</name> | ||
384 | <size> | ||
385 | <width>20</width> | ||
386 | <height>20</height> | ||
387 | </size> | ||
388 | </property> | ||
389 | </spacer> | ||
390 | </vbox> | ||
391 | </widget> | ||
392 | <images> | ||
393 | <image> | ||
394 | <name>image0</name> | ||
395 | <data format="XPM.GZ" length="27539">789cdd5c577362cb767e3fbf62eaf6db2d571ba148b9fc80028a244584cb0f9d480221b22497ffbb57afd06c103aa399a3721dfb72f7814f9bdddd2b876ee65ffff9a3512bfff8e7bffe31999a69d7fd701d33fef14f3f1b0cdefee33ffffdbffef8c7562ef7235e3b3bdb3ff2fff8973ffea1fc0ff743e5f07f88e7091f20ae09dec2fba69530dd778c77f8f959c274ff40303f7f9730ddb78c0fe879f39e30de770bc1fc7c89b1a3efbb7dc25bbc7ef7ca98d7632e111f24fa7209d3fc8f8279fce384e9fe94b1d0d74c98ee5705f3f36f09d3fd0963a64fd513a6fb05c1f4bced254cf49f09ced3f8278c997e7396307edf68c1349e3b4f18ef7b599fa3f15485b0f0cfdb84697d5b8c857ec398e9f13cdf16afc7aa88b792fcfc8031dff71709d37a5f05d37a7d8fb0ac271405337fde13a6e7f705333d0dc6bcde6004f3f3e78c451e0bc6c2cf36e13ccf6f4e190bfd63c4895e1308cbf77583317f5f3f30e6f9f43d637e3ee0f7f369fc304f98f897eeb37e2d18f378e13061d297316359df3de16dd1ffc098e7f3c78c793c37445c90efeb47c6f2fd66c2a41f79c662bf3dc6629ffcfd1d9127fa8bed2d19cf6e3116fedc3196f5ef254cf21e1296f1743361bc6feb8c793c8bf6b55d90e75d8fb03cefa709e3fdd0144cfc56fb8c65bdc58489fe9160febe622cf39f254ceb97fbc29f838469fd4f11ef6cc9f7435e30db8762cccfabd78489bea260d6774d7857f8759b307e5fe704f3fa5b8c77993faf82e97ea8332e307d57888d3c6f04f3f36e37615a9f15ccfee892318fa7b712267ed404f3fccf09d3fd05e1bd2d9e1fe5b79bdff5ccbf53c1ccbf47c1f902dedf26bcb7c5f33505f37c0f09d3fd57c1e46f429931f3c7dd33e6f92deaf36e5a5f7817bcbd85f79f19f3f3ea21615aff93609acf0e19337f5459303daf6f12a6f90f04f37a2d63e1cf96605eff7bc224afb9607ade05c2fbcc2f7f2698d77f9d30e9fbae607ade9f3016f923fd7bf9bdc236cac37518f3fcbe2d989f2f0ba6efab6dc269be5bc1fcfdd384697ccf98f96dca09d3f345c1fcfc3861d2971a63d6573f17ccfc7a13ccfc427ddb03fa49defe29615a4f9d31cfe74e13a6fb53c1ac2f8631cfa7af05f3f38384f179db15ccf3df244cfc6b3366f99bf384899e1dc1cc8f56c2f8bc1f09e6f12b840f581e6120989f47feed6fcbfabc134ccf872a6399af9330f1e34a30cf774758e6332f82e9799d4f98e84df7e979374a18ef9b29639647d009d3fc15c1f4bc318c999e702298e9a1f1ac3caf3463be6f1e1833bd6a2f6192df9b601eef967081e9f58782e9fbe646308f8ff67fb09dee3f0b667dba60ccf4eaba60e6cf56c2f4fc2363a6576f0be6f9761226f91e1136ec1f2c7fdfb0fd595cff8195f94c25617ade08dea1fb5dc6a2cfa58489ff82995fba9030c9ef52308d175a848df0e74930d37f9c303d9f632cfa712598e5f39830c90ff5adb023e3bb13c6c25f9d30cd5f154cebf3216183fad1616c985fdb09d3f81782e979f79c303e1f468c03eb575e30ebc37ec234dead601acf5608db3cc7f707c1cc8f90303d9f17ccf2d863bcc7cf1f254cfe662698e3a560c3f9ce5dc2a4ffbb82397ea1fc0a4ef8158e19337fc2a560a6679e307edf5e33667ea8ab84493e1dc1fc7c59f02ed6d3a14d38d1bb9330d94b4d30ebf375c224df73c6c28f8260e6877c7f8ffde34c30cf779a30f99b1bc1349fea33667e9a79c2c44f998ff9a95f13a67ce25230fb8b9260e6cf11e3c0f9dc4bc214af268279fc69c2e4bf9d60ce777612267dcd1176ac7fba97308d3f13ccf9c861c2c4cf3bc6ac7ff621618a571dc1fc3cf3d3317f1cd263923d98026191a71a264cfad4174cfae1cf198bfc1e0433ff6a82d97e0f13c6f15c5b308d675b8c595ebe9830c96b2c98f3839b84491f4f04b37e9e0966faea09937ebe09667af619b3bc552f61e29711ccfcdc4998d61704f3faaa09d37a8e05337f6682993f9384717d8671d28f61c2a41f5dc1ac7f8384e9fe5830eb773161f2670dc1ec2f4f13a678f52298d7779d30ae4f5718b3fee99030cdaf04f3fa5cc2747f2498ede32461b28f92608e47321edbbb6e254ce379c13c5f3f61aa2f647cd61f9f672cf23e4a98ec47e86779dbbd8449de587f1827faecbb8c59ffecbd60bedf17ccfa564f98eeef31667d315b8299fe8b84697c2798e4a30f1226fdc90966fb9a12167db1ed84899e8960d697fd84495fb605b37fde4d98d63b12ccf6964f98ec2d7d9fe3cb59c214dfee188b3fab264ceb3b16ccf2b50993fc851ed627bd4898d63716cceb3f4c98ecf34830f3f33c61f27f8f8279fd3b8c25fe0c12a6f518c1b4defa3461badf11ccf9727a9efd455930e7478d84291ebe0be6f55e244cfc147a257ebd254cf3cf05b33f3b4b98ee3f09667ebe274cf9475f30e717c584e93eebbf677fa58e05f37ca58449be0dc15c4fa13ddbe46ffc4430f1df29c62c4feb1326fb1809e6fca693308db710ccf6789030c5a71a6396573817ccfe232798f35f9730e99bac87e5a39e13267d9a09e6f9ab09d3fab6184b3e712198e5514d98e81d0866fdbe4a98f4e55630d70b9384c93e9f088b7cec4dc2a40fcf8239be9513267afb82591ebb09d3fc5dc15c0fdc274cf4ee30667bf55782391e61fcb3deeded917edf3066fe865ec2743f2798edb59230cd772d787f1bf16dc216d77fc458fcef2261a2e75e30fbdb43c1ac9f7b09d37aba82f768bf8ae4e9855fae9430f9dbbe60e6d776c2147f2f05337daf0993fef27c9efda1b18239ff6a0966fd7b4f98d6eb190b7fd17fb85d170e905fe188b08ca72e05f37a860993bedf326679d4a75a69a3d5efbe6bab1d5cebef3fbbe8d9ccf557d781b250dffe725fb8e2cbeb00d737cd4a71eb2ff32464aef477bc677f22d36f92497cff16b904dd42fe662ffafbf74bfc2772f90e9e2439988f57f63ecb6a69376dedbe63fe6fb417a757ed407d90d167df779967be412e7f992719dff4996cf8fa60577f3b7bd9eca33ef29be4d45ab3af6f92cab7d98b179f559fc2a70e6a4e37da027eb6681378c5bfc37b37ce4deff8c4dfc95e94eec1baba280b79efc01c4fbacf36d1d503b82ce027f8348814216dddbf99bd3cc30a15ad0e71570fd10e228543fd827fa35547bf35826ba0c748d184a8fa5bd98b42ad899ae6d1b2e96f434d31e625ca0aa530d05378454a46ac8933d2b7ef92cb5fcec786b0e239fade177c714e86abb7ac631d58fd026818eb57944b9449179f7bfb2e5ff62d7269c18a5ab8a2b8ea77586f115e87f03ad2c7fa4497e03ad567f03ad717fa12fe7ea5cb2897397ab46ff265df622f735dc1f53ce92aacf210565cd3757dad6ff4adbed3f7fa4137e07ad08fbaa9737a4be7f5b6ded1bbf0dd77a067ef7f35be50ec96f8ed327f979831048dd9072a0e74016e28fda88cb2cae1e594cf5cf16f16ee06d5526dd5d147aa8bd633c071b373b8b555ace3dfb21798a105974ffe9572a8aeea69a39e541f3e0dd4b31aaa1735526358ed04d7ecd494df676a0e97c76b4951bc16ea555fab37f5ae8aea500fd5913ad6bd7af40e237502144eb453a54c5da4b2b9c56fd80bc66a758a3c136ac06ed5997e51e7f07ea12ed5952a832c2ab07aafaab0f21a5c73f89cbd3cbed3ab0674d5912aa047dfab6b75a36e61ed33f0e271960efa3c075aabd49dfe4a4ef1557b11b91035f4a4c1d870a5ee754d3de83bd56019444a1ee16ac24aa749361ea98cef39a4845ed524a32d9557604340cf15f839a00238a550fa1d9827238fbf682f3e632f74b540ee4a81f5aa5db5a7f6515f68e5f58c1cdc868b6473c0b4cc819aa62ac0522245c6c4ffdf186b1c7aeb18a7ba20abea4fedf957eca59fb90c7ad117bd301e2ce4c104584513d65480ff3679b5510659b988bd084573a48234112ed382ff16a27c4c5bdf980e8c3c80b9233506e4d2f92cf7fecdf8229ae5c1fbb6c0daabfac874f52de846e428ad26aeb09ef15bcbd52fed67796f96b19d1a3e7f007f07eb313df3a4774d1f5608be0566ec26ddf8495efd257b8916cf323103786f0325cf60eb16f95e4f3cf688a34ce6c96eaa19fba8a17ce691dd20078fa8c074d5f01dbd81199a17333231631b9a81996caa797ed35ec47f88ddb4f5a199ea06f2b7ce16d084753493ad08bfe76bafa52dcdf8bdc0eb772b76e654de1833839cc7821e543ef412c287f57ddd5e3af8fd9656660ee31fe96bb3483e09a831af448179636da921752ef9ae498a9ae01dcc3b0cb9a46f66ded3f78803e4a9c7a6680ed5c01c61be36446d33baa7fa7fd15e623c8959e00bdac9543fe0cc05d40db2802893a8f7c7a0f5d5f4576b4e4c4955c0a21be61424b98008e4e465ced86666186b2cda5a93e509583f9a73b09b0ba026ad247a6af4d6bf6f2f1db0bfa8e451bb9e99921c4ac59b4bd2fb2893a585030d01d67265caa662aaa6069eb66eaee1d38dce9b5b88250b96d3ccdcb1dd57d97eaa38ce0ca9bd370f10bfc65cd57563bc9118b3eedbbe6c2f2fe622d685a6611ec1e21dc77689e59ef9db645dafc01a9ae6d9e44047ee81b35b90332fe055d665d3006ee4cdb6d931bb660f640663997d8c3873b623d2bc038aa1face1ca84ba0c6a5573753ef848f72f999bd809540fe67c6a600c1d7a24c222dde2ab08418556aaa091a833aa5e03fd65a67bddeb7c1b66cbb3e351758c9c42aba873ce9ab5bdb3155db85fc6d413edbf630428907885a3781d1ac7db27dc859c758c175b026edacf7a27fc95ebc99db813eb7cf104f7c8aed31168a078655989259d8a17db1233bb690dfd8b6eeda295a2de5d301fb2f2dc403e38cb7333bb70b8cb61ec79de1b8758eb41e680129db5733b2548f8e309f7ecaf8ae95fedb57ec45c50cefd9bee1ac53f24b682739b217fb1ee7b5457b08741c45dbb2c7f569bc8083167522d4a75c41f771051e32ae437b624bf6d474ec993d477a482ef5943fd4316b58d80b5db6037b895569ac0f36f4e13eb117b782806e73a42e4c07f2aee82b27c94a3cdbc80429b9b265a037d88aad9a23886f437b8cba1d3b16432db943acef6325ed319ebfe8be3a01ddedd81ada8e63bbab27df1865ee6cdd5eeb2b1b50cf62b5bdb63eb19bacbde085392970f5065710b32f63dbf6d6de61e6b8cc5222d7c06ea24c40f3b6ed3dc49d05ca213b16d51d31cf7e025feae0d3dc3ec46aa13ee5ee6bd736ccd83e4234016ae0a1038e4d8e3d74f435d63675940a4818a59d1ddf6fb017d23b8ef178778833e7e0d3425dd92dcce76b1cd5a6999aa4a2ae6d5e455f35415e0f3ff898168cd243b94ce0d55103bb6d77ec2ef0b96ff7e089992eda7d7b80d167b692b771be600b40b882da2f44fdd5215e5a313756ec654d2e0e31d002fc9beba133ea5e95a13e89d1718e71708a7491079e386beaaa68636745adea70b2b73398fd06fe0b3ecc393373def45cd067e09f5ec9c3aa43d7726d18a994ea50d1308cbcf6dc75c01681578e7b6ff529cba5bfc15e967ae770fc1e7e07b206e0770da3ca947936656e45adb6aee79eec295684d421f2cc896c8f1fb20f5582bf4f5ddfe4dc007b010b5384eaa7ab5fcd857d80e7c6fadc3ddbb3186739cecc967251ce0ddd0b649bedfa34c517d6a13f970b522b18aa093742e94f52fd4eb92fe8b11bebbaedb07605f6bea2bfcbdc760e79c80b54f0b76ee2a61851a21731a66867ceb959e401e459afaea5eb6e8c5c9bb3ddd01575a1a25e6ccc36bba05fd9fd9bfea7f642f4ced07b7a908983ec2e0f114d6ac6097b9b98cd3bd08832483ea0a70afa0dac62c8fd61b7d6cf1feaa9eaaa5d37c78a07b2140714b957f7a6cf80db90ed458b5210c3dc3b663712ff4536e0715cd11d02e547988f59b615b936ca85fd4bbf4e7de10e3c7d8cdebf4039125a7d0db2afc8ab7d77e24a9015185809d59b5d8864129703d43a1419a3b4ae6025a75126e6dd9d012de7902958fde006e0c3c6ea10b40c9eb6bbeec2f4909a6ab219cf9e6dec2e21beb6d0fa891aaa799de4672bf145ecc5215fa3d779b7a74ae3c833b5eca550d7a1628d812801f16480eb35dc4319f058ad5883f298637de6aec04e809254db78d6b45b88ff25eca70757d627aec2fd03a973a4d6713aaf9ed5ce8a0f53eb72f910473ba8fd91f6a23e5731ebaaa5de8a64e5608d9076555d6d59f7896fc15a7daedfa25c30aa94ad737594ee2ce5f9527581a69aa2bbb6bb205f18c1dda837f43413c964f81df233b56f3b9019058cc24eabac5c32f6e256628cc34c307e2eba5b1c59b2f959e2a9354dc82027c8a5a5cfa2712287ef7485ec07e27accf31729bf2e485586b137f2bbe1eedd036827f0cf9e981964012798c32efb3971e65803d420cfab6204eb7e2e17d171de59205db4aea1ebe841973279441979a8fb9eadb76d57dbb00719fbcb6ff08a9ea06c46ee1129b1189fb836e14c32c60f882aaee9727680dcacea63b765dae899e7ecc3880b1efcf8237832ca5497e706d6ed45e4d2c2cfb1c3463a79e8de507b853f73aeb840c34c4eef6b6b8f5132ab7b906f6829b11b78a58fcd0b7af45449732e2c7950acdcdacebb3ce8738c155db76deadc1759e6169eba346ec78cd1b2b2f6dd5f938b9c4f21deb6317f0bb1dfa26f60d4a9f229bb8f72c9c1a8bb6e0fbc31ed3d9a9578425e00bc30d46e79b7c3da2575499573e13952073c77fb3aaf4b9003d09eda8b5ec0c89a39982a3ea86f7ccccb20da19b67ee911adc797a55c025acb13e87afc74e40e567af52417c88bc102ee5dc192e7cec679b29b2ec8f6ca4dd4b6a75535590acb6a8b2cda99606ecdcc34ec896ec7c8015135f6fab6d7e432a728e09519a99db59d34af3fb117b81cd6d74394cbb1becb7458a72c97b939f1062aa4367ccbe28e6ad259b4b70e585c19f2ae9d4889b7cc893a6b19ad0ef32c13bc53bb503d2bee21473f02551a58e916e7c9443dd16255de7b1b2be6e8cb643ebfa17e71593f06fcf130fe09772a66ab7251151fa08e076b513de45236fe3a3d76db6ee25bd16b002533b68dd57e7ff44b25df062dbc01bbf290cf4d584307ae01d592e1e82fcf92958e4ddd62ee9ff1639bea4a976229f9ee21c8e5047b7a32a678e48969aba12e9a0bb63ec87780a78677ec604ac856a6c8598b598fc4a41c5b402d5a8a3df71ddf059b8b73cf40effb3cce047cd519cc40f34e1217d17bdb7b4b3eac8d6b0d1fea1791c720c9867cc408c63c5dd55bf29240e10dcc083516e4b8f1bb3daa3fd1c38cad4bf1a4c97ce52e385102763cf73dffe4fbd6c72e2b6618919a58c9f8a8a160416db6fda5adc24b3720c2ecc78a2cee3669c5be73935c9856cedae3b98953d0319f6a71910bd062eae01da98e8f7ade5367aa046b993807d94a9dfb11d2eb9fb34ca2a6e648f7fdc03ffb2154d52dacf97a2897aeba437e2efc4b461fa48e454f01fab0bf2e97157b913c4ce412efcfa2de03171ed2484bb9007fa0a629933470155023c49d39756b6a7e04d98a8508a839ffc8fa2ea9150be065cfcd2de49b55f0b10fee0e2ae7125bcd087c1ae918d9a97468638c825a0a79a878adad757b497d40b297c05d4e17f516339855eb8fef0b53055a869c27807d41a93e55b76ad78f31efaa638ccfc17f0b240b5e158d95c34eba530d73eba3249dcd410c883b54313fef40d6b38d3a3a632d937c3946e83acbc57e622fe27f5cb2178be7572093d2cd157ba1cfb13779631aa0539427f8b8df672c545a735a037ad079eafdcf33cf4b4f7f869da910a95183a8a52ce5ae1e012d076e1f75f380b9d8241efa29d2a230eb77595b59938b4bb4aad8b7859834864a2ec7d5572ee3cbea31ff8648dd055aa29697f42cfa2edb454f1af763a8435e55d2bb8fcf7b257bcbe4639be8e3c6beed67fa1d32cbd8f5807c01e63df473ec95d7388f957cc1aa57bf203f96d9b3db54bf2ce5d283911d8c39d597fe1533d65477630c7e0769cf416633ac5c14f8b227338378829516f7ed675c7bc8cab3fb6213b5dc9d9840ce3f056acae89762ded086d85ec6fe127d676975d6d6a0d619a7b82f76bea9aeb4c98f7571cf6504b9658533a31af590e30c71af543f9a0e64b65849838694637a01df3bf0a45d13f663a4a1d10b8b9cbc92be175dd3989199b27f37635fc4a8d6f11eabfe264b257579210bac9811d475d9b3b59beb7d95b117dec5370d7fc815fa9c77e864d7c5e80258cc007939f347fe1869a69dbc3ad252672df7ecd10a5c8165f7cea4ba5c78a85b629f052365b47c9faa64e9ca38b5e54bd82757985d66fa79abf165ad37d68fbd4b90cec274cc3dcc55e5fdf819f7c8c0e7fa53fb0879ba43af5cf4d18b5ab770e7e47ba09aaf2baa4fd063f91ef277861ca11a556a22f2070bc843176029e7766421073497ac9753e482f717e8c56a2eeabecde8d1267bc9d6d0333c21721673567bea2f15755f97fb8f3eee50983d53852c30d23ef390139b629420dcc18cd8bcb32c3cf2f3c997d5183fcf9092b5fd7fcc3f17a6acdeec0c62ce38555fcd94c94d807f2d88ad7472216b2b7f2e173af91575b7afaf7c85b3f60c35d1fa4dc9767d15e25a0fabb743fbe8c76e1f4fee5074e1fa04f2d09aaffb6b778a6733ea6acedae3d2fe3ff9280bdfbcf1b7306a0f635153e5403a3945f5ce1434e1cef5d50eee1e28aeb33ef6c7a4672972910aab027173e04ed28e025123bbd94e8ddcb32d61efdee9577f6f67a608b907f5b7a4660cfed43f580f1cbd872c6dbc127165af9fb516e4d3f08fbe99bc9dec20e25826b8139f3373bf855c0f18fb47ebf125d593cb33c60ebf1d6bdd01d4eb45b665ca3eb0978275dec22eec29ea63ec09bd9a0664fa1df4159eec4437dc95c9c7fa13f2ae7d3f416a265ca72e7725a29c9b98a7d18eed257cbe54d48bcbb10c27ae683bd8513219b98c3ef493b3bde4e5157c5e57dc91dfc61e9d679b218ecfd4818d7ad68ef991df8138d7d3cf1eaa2afb087562097d53ec16c5ac660faac581df77c6397fe0db2b75aaf4bf3c7a851a72c82305cb1c90bc4705c6b5be907691e39a1dca65a3bd6cdaa385cf45df076bb460d51287a38c649f64df5c9b317ab3987fcf6c09a939053a4e2137385303b641f2a06575032a20fb46b27b2e14496e3157d96c36f62d9c3d33dbfa8af2dfd87f3383a0b006b61ffa637ff61ad911d4df9518f34c4bc9ee1b65215e356c0d328078926dae8e22352e6ada996bfa337d6a77b587ac2066bf3d7c3d417c3f058f07194230187bce56f270c9da9aca67fe6e4d2958882cf184739f7bfbcb9ee807b9fcc97ea573ce1442e464016879645bacb24638a8fddb66dbb5f448f56186b9ee061f426885b67a072f17f78efba1837add03aade4d2374d53558955dd1b666e6dd73dca12bd60f3d7762fa7a6873d807b52b7af32bfbfb56ed849eebe06e528deb7df169b4021b9e5c5b9feb29f66e8399eb4ee81bdac7a65346b1fa2d01277b71efc296628726c656eee8adcb6599937b1e7f003986d395a0300288bffd8dfd7d48f316eec53ee1e892472d3d74ecdb6d8567f71c86601d5d9b8b7d0fdc05838ad3de70b61ac20b5013772fe229bab25fb837f47805ecb77d944d73498b5761e4ca3617c6d80b5dd62ebfb1bf6f0620994998a6ae9d64f39c5721b925b0ce1b90cd15eebf2bac46e26cb1e3d3b20f61861d6a1f6bae1819c0aa0edd34cc39be6f7a516fd341fd59c55c89f60dfccafece87fae567fbfb71d7322cfc83bee13d2d393122d56f3c6b143b9063a804aafac46dc7332c51abc182700737bc207506e51269ecba6a780d6fe11d7de2267bf1d83b77a1180e5ddb35a422c8d84bf8757bb1c7e6c81e83648ec2b1ca533ce6bd07c731146b4d3c256155de55dca18995da3e584bcc32bafa055780792078b436bc16fa085638f5cd0d5e4c2ca5c99fc7e1c4e4819a57aca0973dcb0fbf79fada79fefad419b5e35c28b95e92cc9ce79af0994ad2711b4fe4d82664e707e61032971148097f07a3069081348c371ee27f379cbab18f63e592947dfaafc85cec06e26438d347317fc02cd1a6b812b01a345fb7173d08e71a7b4ce1c2bcd8ad14e99aa2d3c98e6a8c2aba0114695336cfe152efc433fd1025afd49e3f0b6588bc8bf48cf8c58f92c99c35376dd0de9cba05afd1036f223d23957ee7f4e5f8a2db76e26a16f2533bb00e1ea29caac95926adbea9e8ac6e15abcae86d21c241846fd873a0ab611670058c2a48059fa799731ebcecb5f81599905c22c716fe1434f72ae58bcbdfff855f892f404bc0bd6890ae19c77cd70d71451395faf56ad9095cefb92cdfe97301655a4b75e33473afce1ab62a971966070b3f3723dc7fa475498cd9b8bfffd97bb4563c41751cadc6fa5009d598a1a909cc5150cb7d78b9aadcb958e2033eed963d554a19249ddb5ada4a7d835ca0c28b72d60fa16643e63c8c59cd1fbf622fbea0abdac63d1c1bfbfa166c7864e2b9f7e52f0f64cf57e423a73f2406656a5296256a156ada261ff6e1cc39686bcccaeae17a997fadc8e78bf1054f3a44c9c41dbdaaaea8beb90837e600328106dacd2347cfa95a9e4f4ebb79c0d333aa4fb07eab738f46f6da72fc3dde6d0ac58ced64fb01b182e8855bc84d2799fdea5f8e2f7ecbcce17501686826e12edcfb7d888697e63a3c70cd99958bec98644fc4bb957bcb6e77532dbb802ec6f8d0c05f9dacf93188fd25736f20fbd0639685cbd8cb86f3639fdacbeac57b9aaeaa77adb317b68eddc0cc09a9150f2bbb0e2233cab267a95e21ff57c7ce8e3255d78645d1ce4d3afd0bf50664cae1112829c61c2fb3ae95fdeb2f9ee75f3bb31d3bd8e011c67637f4f5692887a69273e475ae1357f6053299bd74a57cc68791fe0cc248175dd5e4cd2e7640cf3cd1037edc28f3a48ff0345c2fed0f7df8bdf3577f2fb67275b1af3982ace215f4f730e440e01d88a10d96411dfbbf55dbb33d3cb79cdd89aae2abee2fc06e2698f954ec59d882faa4e1cab1ea750d7fe0e65177e33da2d31d87219eefefc73317ebb5ef2fc497e52b5b2fe0af0ce31948b8dad1b3854b370879888713deadcdca65dd57f1efc6ccc215a1a2ded6875069c53dd29843bfaa779373733c2361ddbeb977c7fa08aba1e5997197f55f59b9fc3c1f5bf5e37cde78807a06f117a24e0fdeafcca1effb921b28981f4f867ffcf51bfdf22dfef62def2fcd7968d98ebdc53a7e0895d638e0ef4d6d50b790cd9debfb28135d473b19f3391b857d9895dfa4ff4a7cf9c003fa55ee047f6535897591adaa1ee44a4520cb9b43db3135f3e876c2b65790378f3187092083b19faa575bd3795f32b53051b73ea776207ab958c105e5f331b7c21ed54e3c7b126a104f6ea3ef021c6532e49330ebbf25fc157bc9fc1b23743682cf823fc51e22f5055dd75cd8b63ab72d88a9f177ad0b33365e1f796fef21eba9411d5030757de01776663bfad06d836ec62a349e4119d4a7bc52ac47f1f30034f8125e033c011fcf1078f63a935f389fbc49266b1756c05ddd8ffa1b730acbfbfc985f809784881aebad98f18ce115a096d9078ddfc773f121ee52c15ab903c17b5c74ce93cf7ae289e22e563df48bc13ef646e3aed984bbf7abbeecebf165eddf7ff9d4c7595a199f5791735eddcc6f2357ff7d98ecef2557ffeed6f462e5b9cfd6f90bf6b27e65e20ef256f1ea48a387994ba8fbf09e7af6ab7b29ab7d96e59ccbb37c1bedf8977e8fbc41362bbd10e19d4bab240da2dfec679fcbc66b3997b9cc29f8df27d9a013cbded81afe727c59fa8a55b9acc6dde5bdd57f2bc1613f7ef0e1391977d9835cf65696673eb3e76c5c668c0d31e68bf9585897cd8a5c3ef9379236c5e71519b613ffc3fa3cebb12d53e367f1cab85f944b6b03ffb3325bb7a3d51c61f5dcdf92c724afd1da5c9ffd8e72b34c7eadde8fef2dfd718f66c913f99d325db28718dfe9372fd95f00f3fd956bdd6fd17cab72cdcc9be402df0b3be157ed6595a7eb79c0f2f7ca2ef1dcf1af76567fcfbc49861ffd53d66e3eca7e2927f85e50ab72f96a8efc2b79dbbace7ff5fe67f36db4a1aceffb7a7cf93ff1faa67f7fec6ff1feff4a2efffd6f7ffc0f54dd11fd</data> | ||
396 | </image> | ||
397 | </images> | ||
398 | <connections> | ||
399 | <connection> | ||
400 | <sender>ckbCustomImage</sender> | ||
401 | <signal>toggled(bool)</signal> | ||
402 | <receiver>customBox</receiver> | ||
403 | <slot>setEnabled(bool)</slot> | ||
404 | </connection> | ||
405 | <connection> | ||
406 | <sender>btnImage</sender> | ||
407 | <signal>clicked()</signal> | ||
408 | <receiver>FifteenConfigDialogBase</receiver> | ||
409 | <slot>slotLoadImage()</slot> | ||
410 | </connection> | ||
411 | <slot access="protected">slotLoadImage()</slot> | ||
412 | </connections> | ||
413 | </UI> | ||
diff --git a/noncore/games/fifteen/opie-fifteen.control b/noncore/games/fifteen/opie-fifteen.control index 939ab6f..5547bca 100644 --- a/noncore/games/fifteen/opie-fifteen.control +++ b/noncore/games/fifteen/opie-fifteen.control | |||
@@ -2,10 +2,10 @@ Package: opie-fifteen | |||
2 | Files: plugins/application/libfifteen.so* bin/fifteen apps/Games/fifteen.desktop pics/fifteen | 2 | Files: plugins/application/libfifteen.so* bin/fifteen apps/Games/fifteen.desktop pics/fifteen |
3 | Priority: optional | 3 | Priority: optional |
4 | Section: opie/games | 4 | Section: opie/games |
5 | Maintainer: Martin Imobersteg <imm@gmx.ch> | 5 | Maintainer: Martin Imobersteg <imm@gmx.ch> |
6 | Architecture: arm | 6 | Architecture: arm |
7 | Arch: iPAQ | 7 | Arch: iPAQ |
8 | Depends: task-opie-minimal, libopiecore2 | 8 | Depends: task-opie-minimal, libopiecore2, libopieui2 |
9 | Description: Fifteen pieces game | 9 | Description: Fifteen pieces game |
10 | A game for the Opie environment. | 10 | A game for the Opie environment. |
11 | Version: $QPE_VERSION$EXTRAVERSION | 11 | Version: $QPE_VERSION$EXTRAVERSION |