summaryrefslogtreecommitdiff
authorzecke <zecke>2004-07-24 15:02:13 (UTC)
committer zecke <zecke>2004-07-24 15:02:13 (UTC)
commitc94b8aee4873dc382d3fe2673c7ac1db7080fe0e (patch) (unidiff)
treeda5d98b9e429ad845651e731e93a978cea54a65b
parent2da1cf47a5c1429d8ad010880ff1da3e97b437ad (diff)
downloadopie-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
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/games/fifteen/config.in2
-rw-r--r--noncore/games/fifteen/fifteen.cpp211
-rw-r--r--noncore/games/fifteen/fifteen.h15
-rw-r--r--noncore/games/fifteen/fifteen.pro12
-rw-r--r--noncore/games/fifteen/fifteenconfigdialog.cpp112
-rw-r--r--noncore/games/fifteen/fifteenconfigdialog.h57
-rw-r--r--noncore/games/fifteen/fifteenconfigdialogbase.ui413
-rw-r--r--noncore/games/fifteen/opie-fifteen.control2
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
36FifteenMainWindow::FifteenMainWindow(QWidget *parent, const char* name, WFlags fl) 42FifteenMainWindow::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///////
77PiecesTable::PiecesTable(QWidget* parent, const char* name ) 96PiecesTable::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
100PiecesTable::~PiecesTable() 116PiecesTable::~PiecesTable()
101{ 117{
102 writeConfig(); 118 writeConfig();
119 clear();
103} 120}
104 121
105void PiecesTable::writeConfig() 122void 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
116void PiecesTable::readConfig() 134void 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
151void 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 */
163void 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 */
246void 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
130void PiecesTable::paintCell(QPainter *p, int row, int col) 264void 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
163void PiecesTable::resizeEvent(QResizeEvent *e) 285void 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
195void PiecesTable::initColors() 298void 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
491void 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
29class QPopupMenu; 31class QPopupMenu;
32class FifteenConfigDialog;
30 33
31class PiecesTable : public QTableView 34class 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
67class FifteenWidget : public QWidget 79class 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
74private: 86private:
75 PiecesTable *_table; 87 PiecesTable *_table;
76}; 88};
77 89
90
78class FifteenMainWindow : public QMainWindow 91class FifteenMainWindow : public QMainWindow
79{ 92{
80 Q_OBJECT 93 Q_OBJECT
81 94
82public: 95public:
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
5INCLUDEPATH += $(OPIEDIR)/include 7INCLUDEPATH += $(OPIEDIR)/include
6 DEPENDPATH+= $(OPIEDIR)/include 8 DEPENDPATH+= $(OPIEDIR)/include
7LIBS += -lqpe -lopiecore2 9LIBS += -lqpe -lopiecore2 -lopieui2
8 TARGET = fifteen 10 TARGET = fifteen
11INTERFACES = fifteenconfigdialogbase.ui
9 12
10include ( $(OPIEDIR)/include.pro ) 13include ( $(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
42using Opie::Ui::OFileSelector;
43using Opie::Ui::OFileDialog;
44
45
46FifteenConfigDialog::FifteenConfigDialog( QWidget* parent, const char* name, bool modal )
47 : FifteenConfigDialogBase( parent, name, modal )
48{
49 grpGameGrid->hide();
50}
51
52FifteenConfigDialog::~FifteenConfigDialog()
53{}
54
55/**
56 * src.isEmpty() means no Custom Image to be set
57 */
58void 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 */
67QString FifteenConfigDialog::imageSrc()const {
68 return ckbCustomImage->isChecked() ? lneImage->text() : QString::null;
69}
70
71void FifteenConfigDialog::setGameboard( int rows, int columns ) {
72 spnRow->setValue( rows );
73 spnCol->setValue( columns );
74}
75
76
77int FifteenConfigDialog::columns()const {
78 return spnCol->value();
79}
80
81int FifteenConfigDialog::rows() const{
82 return spnRow->value();
83}
84
85void 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
102QPixmap 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
35class FifteenConfigDialog : public FifteenConfigDialogBase {
36 Q_OBJECT
37public:
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
48protected slots:
49 void slotLoadImage();
50
51private:
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>&lt;b&gt;Path:&lt;/b&gt;</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>&lt;b&gt;Preview:&lt;/b&gt;</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>&lt;b&gt;Rows:&lt;/b&gt;</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>&lt;b&gt;Columns:&lt;/b&gt;</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
2Files: plugins/application/libfifteen.so* bin/fifteen apps/Games/fifteen.desktop pics/fifteen 2Files: plugins/application/libfifteen.so* bin/fifteen apps/Games/fifteen.desktop pics/fifteen
3Priority: optional 3Priority: optional
4Section: opie/games 4Section: opie/games
5Maintainer: Martin Imobersteg <imm@gmx.ch> 5Maintainer: Martin Imobersteg <imm@gmx.ch>
6Architecture: arm 6Architecture: arm
7Arch: iPAQ 7Arch: iPAQ
8Depends: task-opie-minimal, libopiecore2 8Depends: task-opie-minimal, libopiecore2, libopieui2
9Description: Fifteen pieces game 9Description: Fifteen pieces game
10 A game for the Opie environment. 10 A game for the Opie environment.
11Version: $QPE_VERSION$EXTRAVERSION 11Version: $QPE_VERSION$EXTRAVERSION