1
/***********************************************************************
3
* Copyright (C) 2010 Innocent De Marchi <tangram.peces@gmail.com>
5
* This program is free software: you can redistribute it and/or modify
6
* it under the terms of the GNU General Public License as published by
7
* the Free Software Foundation, either version 3 of the License, or
8
* (at your option) any later version.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program. If not, see <http://www.gnu.org/licenses/>.
18
***********************************************************************/
23
#include "frmprincipal.h"
24
#include "constants.h"
28
extern QTranslator *qt_translator;
29
extern QTranslator *appTranslator;
31
const int numeroLiniesDadesJoc=3;
33
const int alcadaMenuBarraTasques=60;
35
QString localePrograma;
40
/****************************************
42
*16/12/10: canviat el sistema per mostrar les
43
* marques personals (void veureRecordsPersonals())
44
* Ara es fa amb un diàleg per evitar els problemes
45
* de la finestra flotant.
47
*16/12/10: canviat el sistema per mostrar les
48
*solucions. Ara es fa a un Tab i s'ha eliminat
50
*****************************************/
53
frmPrincipal::frmPrincipal()
55
localePrograma=QLocale::system().name();
59
setWindowIcon(QIcon(":/peg-solitaire.png"));
60
setWindowTitle( tr("Solitari"));
61
setMinimumSize (QSize(610,380));
64
jocFram=new QFrame(this);
65
jocFram->setGeometry(0,alcadaMenuBarraTasques,300,300);
66
jocFram->setFrameStyle(QFrame::WinPanel | QFrame::Raised);
67
jocFram->setMinimumSize(QSize(300,300));
70
rellotgeLabel = new Rellotge(jocFram);
71
rellotgeLabel->setMinimumSize(QSize(300,10));
72
rellotgeLabel->move(QPoint(0,10));
73
rellotgeLabel->setAlignment(Qt::AlignHCenter);
74
rellotgeLabel->estableixTemps("00:00:00");
77
tabArbres= new QTabWidget(jocFram);
78
tabArbres->setMinimumSize(QSize(290,250));
79
tabArbres->move(QPoint(0,50));
81
arbreModalitatsJocTreeWidget= new QTreeWidget(jocFram);
82
arbreModalitatsJocTreeWidget->setMinimumSize(QSize(280,220));
83
// arbreModalitatsJocTreeWidget->move(QPoint(0,70));
84
arbreModalitatsJocTreeWidget->expandAll();
85
// connect(arbreModalitatsJocTreeWidget,SIGNAL(itemClicked(QTreeWidgetItem*, int)),
86
// this,SLOT(seleccioModalitatJoc(QTreeWidgetItem*, int)));
87
connect(arbreModalitatsJocTreeWidget,SIGNAL(itemSelectionChanged()),
88
this,SLOT(seleccioModalitatJoc()));
90
tabArbres->addTab(arbreModalitatsJocTreeWidget, tr("Modalitats del joc"));
92
//Visualitzador de solucions
93
arbreSolucionsTreeWidget= new QTreeWidget(this);
94
arbreSolucionsTreeWidget->setMinimumSize(QSize(280,220));
95
arbreSolucionsTreeWidget->setColumnCount(2) ;
96
arbreSolucionsTreeWidget->setColumnHidden(1,true);
97
connect(arbreSolucionsTreeWidget,SIGNAL(itemDoubleClicked(QTreeWidgetItem*, int)),
98
this,SLOT(carregaSolucio(QTreeWidgetItem*, int)));
100
solucionsDockWidget = new QDockWidget(tr("Solucions"));
101
solucionsDockWidget->setWidget(arbreSolucionsTreeWidget);
104
tabArbres->addTab(arbreSolucionsTreeWidget, tr("Solucions"));
106
movimentsUndoStack = new QUndoStack(this);
107
taulerJoc= new Tauler (movimentsUndoStack,rellotgeLabel,this,this);
108
taulerJoc->move(QPoint(300,alcadaMenuBarraTasques));
110
//Rellotge per a les eleccions a l'atzar
111
QTime rellotgeQTime (0,0,0);
112
rellotgeQTime.currentTime();
113
rellotgeQTime.start();
120
carregaArbreModalitatsJoc();
121
comprovaDirectoriHome();
123
Eliminat (a Debian) per considerar-ho contrari a les
126
//comprovaRegistre();
131
Carrega el contingut de l'arxiu data.sol a la
132
llista dadesArxiuData
134
void frmPrincipal::llegeixArxiuData(){
135
//obrim l'arxiu de jocs
136
QString nomArxiu=directoriLinux()+DIRECTORI_ARXIU_GAMES_SOL;
137
QFile arxiuData(nomArxiu);
138
if (!arxiuData.open(QIODevice::ReadOnly | QIODevice::Text)){
139
QMessageBox::critical(this, tr("Solitari"),
140
QString(tr("No s'ha trobat l'arxiu %1")).arg(nomArxiu) );
143
QTextStream entrada(&arxiuData);
144
QString linia0 = entrada.readLine();
145
dadesArxiuData.clear();
146
while (!linia0.isNull()) {
147
if ( ! (linia0.mid(0,1)=="#") ){
148
dadesArxiuData.append(linia0); //tipus de joc
149
for(int dades=0 ; dades<numeroLiniesDadesJoc-1;++dades){
150
dadesArxiuData.append(entrada.readLine());
153
linia0 = entrada.readLine();
154
} //final del while de la lectura de l'arxiu
157
void frmPrincipal::carregaArbreModalitatsJoc(){
159
//Cadenes amb els noms de les modalitats de joc per a la traducció
160
//El codi de joc de data.sol cal que coincideixi amb l'index a l'array
161
//El primer és el ròtul de l'arbre amb les modalitats del joc
162
static const char * const nomModalitatsJoc[] = {
163
QT_TR_NOOP("Modalitats del joc"),
164
QT_TR_NOOP("Clàssic"),
165
QT_TR_NOOP("Clàssic-simetria"),
166
QT_TR_NOOP("Clàssic-casa"),
167
QT_TR_NOOP("Clàssic-creu petita"),
168
QT_TR_NOOP("Clàssic-creu gran"),
169
QT_TR_NOOP("Clàssic-invers"),
170
QT_TR_NOOP("Clàssic-superior"),
171
QT_TR_NOOP("Clàssic-inferior"),
172
QT_TR_NOOP("Clàssic-fletxa 1"),
173
QT_TR_NOOP("Clàssic-piràmide 15"),
174
QT_TR_NOOP("Clàssic-diamant"),
175
QT_TR_NOOP("Clàssic- 1"),
176
QT_TR_NOOP("Clàssic- 2"),
177
QT_TR_NOOP("Clàssic-rombe"),
178
QT_TR_NOOP("Solitari 3x5"),
179
QT_TR_NOOP("Triangular 4x7"),
180
QT_TR_NOOP("Europeu- 1"),
181
QT_TR_NOOP("Asimètric 8x8"),
182
QT_TR_NOOP("Clàssic-diagonal"),
183
QT_TR_NOOP("Clàssic- 3"),
184
QT_TR_NOOP("Clàssic- 4"),
185
QT_TR_NOOP("Asimètric-superior"),
186
QT_TR_NOOP("Asimètric 8x8- 1"),
187
QT_TR_NOOP("Asimètric 8x8- 2"),
188
QT_TR_NOOP("Clàssic-central"),
189
QT_TR_NOOP("Europeu diagonal- 1"),
190
QT_TR_NOOP("Quadrat 5x5"),
191
QT_TR_NOOP("Quadrat 5x5- 1"),
192
QT_TR_NOOP("Clàssic-quadrat central"),
193
QT_TR_NOOP("Clàssic-rectangle central"),
194
QT_TR_NOOP("Europeu- 3"),
195
QT_TR_NOOP("Clàssic arbre - 1"),
196
QT_TR_NOOP("Clàssic- 5"),
197
QT_TR_NOOP("Quadrat 5x5-central"),
198
QT_TR_NOOP("Quadrat 5x5-H"),
199
QT_TR_NOOP("Wiegleb"),
200
QT_TR_NOOP("Diamant 9x9"),
201
QT_TR_NOOP("Europeu-creu"),
202
QT_TR_NOOP("Wiegleb-clàssic"),
203
QT_TR_NOOP("Clàssic- 6"),
204
QT_TR_NOOP("Clàssic-S"),
205
QT_TR_NOOP("Clàssic- 7"),
206
QT_TR_NOOP("Europeu diagonal"),
207
QT_TR_NOOP("Quadrat 6x6"),
208
QT_TR_NOOP("Diamant 5x5"),
209
QT_TR_NOOP("Diamant 7x7"),
210
QT_TR_NOOP("Anglès antic"),
211
QT_TR_NOOP("Incomplet 6x6"),
212
QT_TR_NOOP("Incomplet 7x7"),
213
QT_TR_NOOP("Wiegleb reduit"),
214
QT_TR_NOOP("Solitari 8x9"),
215
QT_TR_NOOP("Solitari 5x6"),
216
QT_TR_NOOP("Wiegleb-fletxa"),
217
QT_TR_NOOP("Clàssic- 8"),
218
QT_TR_NOOP("Clàssic-E"),
219
QT_TR_NOOP("Clàssic-fletxa 2"),
220
QT_TR_NOOP("Clàssic-piràmide 9"),
221
QT_TR_NOOP("Clàssic- 9"),
222
QT_TR_NOOP("Clàssic- 10"),
223
QT_TR_NOOP("Clàssic-R"),
224
QT_TR_NOOP("Clàssic-T"),
225
QT_TR_NOOP("Diamant 9x9- 1"),
226
QT_TR_NOOP("Solitari 5x6- 1"),
227
QT_TR_NOOP("Quadrat 6x6- 1"),
228
QT_TR_NOOP("Quadrat 5x5- 2"),
229
QT_TR_NOOP("Quadrat 5x5-quadrats"),
230
QT_TR_NOOP("Triangular 4x7- 1"),
231
QT_TR_NOOP("Triangular 4x7- 2"),
232
QT_TR_NOOP("Triangular 4x7- 3"),
233
QT_TR_NOOP("Triangular 4x7- 4"),
234
QT_TR_NOOP("Triangular 4x7- 5"),
235
QT_TR_NOOP("Triangular 4x7-quadrat"),
236
QT_TR_NOOP("Triangular 4x7-piràmide"),
237
QT_TR_NOOP("Wiegleb- 1"),
238
QT_TR_NOOP("Quadrat 5x5-piràmide"),
239
QT_TR_NOOP("Solitari 7x5"),
240
QT_TR_NOOP("Asimètric 6x6"),
241
QT_TR_NOOP("Quadrat 9x9"),
242
QT_TR_NOOP("Anglès antic-diamant"),
243
QT_TR_NOOP("Triangular 5"),
244
QT_TR_NOOP("Triangular 4"),
245
QT_TR_NOOP("Triangular 5-1"),
246
QT_TR_NOOP("Triangular 5-2"),
247
QT_TR_NOOP("Triangular 5-3"),
248
QT_TR_NOOP("Triangular 6"),
249
QT_TR_NOOP("Clàssic- 11"),
250
QT_TR_NOOP("Wiegleb-creu petita"),
251
QT_TR_NOOP("Wiegleb reduit 1"),
252
QT_TR_NOOP("Wiegleb-simetria"),
253
QT_TR_NOOP("Wiegleb diagonal"),
254
QT_TR_NOOP("Wiegleb reduit 2"),
255
QT_TR_NOOP("Wiegleb reduit 3"),
256
QT_TR_NOOP("Wiegleb reduit 4"),
257
QT_TR_NOOP("Asimètric 6x6 invers"),
258
QT_TR_NOOP("Asimètric 8x8 invers"),
259
QT_TR_NOOP("Europeu invers"),
260
QT_TR_NOOP("Wiegleb invers"),
261
QT_TR_NOOP("Wiegleb reduit invers"),
262
QT_TR_NOOP("Solitari 3x5 bis"),
263
QT_TR_NOOP("Solitari 4x4"),
264
QT_TR_NOOP("Solitari 6x5"),
265
QT_TR_NOOP("Solitari 4x5"),
266
QT_TR_NOOP("Solitari 3x5 bis- 1"),
267
QT_TR_NOOP("Solitari 4x5- 1"),
268
QT_TR_NOOP("Solitari 4x5- 2"),
269
QT_TR_NOOP("Triangular 6- 1"),
270
QT_TR_NOOP("Triangular 7"),
271
QT_TR_NOOP("Triangular 8"),
272
QT_TR_NOOP("Triangular 9"),
273
QT_TR_NOOP("Europeu diagonal quadrat"),
274
QT_TR_NOOP("Clàssic-diagonal molinet"),
275
QT_TR_NOOP("Quadrat 5x5- 3"),
276
QT_TR_NOOP("Triangular 10"),
277
QT_TR_NOOP("Quadrat 8x8"),
278
QT_TR_NOOP("Diamant 9x9- 2"),
279
QT_TR_NOOP("Clàssic- 12"),
280
QT_TR_NOOP("Europeu- 4"),
281
QT_TR_NOOP("Clàssic- 13"),
282
QT_TR_NOOP("Clàssic- 14"),
283
QT_TR_NOOP("Clàssic- 15"),
284
QT_TR_NOOP("Clàssic- 16"),
285
QT_TR_NOOP("Clàssic- 17"),
286
QT_TR_NOOP("Clàssic- 18"),
287
QT_TR_NOOP("Clàssic- 19"),
288
QT_TR_NOOP("Circular"),
289
QT_TR_NOOP("Quadrat 7x7"),
290
QT_TR_NOOP("Solitari 7x5 invers"),
291
QT_TR_NOOP("Clàssic diagonal - quadrat central"),
292
QT_TR_NOOP("Quadrat 5x5- 4"),
293
QT_TR_NOOP("Clàssic - O"),
294
QT_TR_NOOP("Clàssic - 20"),
295
QT_TR_NOOP("Clàssic - 21"),
296
QT_TR_NOOP("Clàssic - 22"),
297
QT_TR_NOOP("Clàssic arbre - 2"),
298
QT_TR_NOOP("Clàssic - 23"),
299
QT_TR_NOOP("Clàssic - 24"),
300
QT_TR_NOOP("Clàssic - 25"),
301
QT_TR_NOOP("Clàssic - 26"),
302
QT_TR_NOOP("Clàssic - 27"),
303
QT_TR_NOOP("Clàssic - 28"),
304
QT_TR_NOOP("Clàssic - 29"),
305
QT_TR_NOOP("Clàssic - 30"),
306
QT_TR_NOOP("Clàssic - 31"),
307
QT_TR_NOOP("Clàssic ampliat"),
311
QApplication::setOverrideCursor(Qt::WaitCursor);
312
if (dadesArxiuData.size()>0){
314
arbreModalitatsJocTreeWidget->clear();
315
arbreModalitatsJocTreeWidget->setColumnCount(numeroLiniesDadesJoc);
316
arbreModalitatsJocTreeWidget->setColumnHidden(1,true);
317
arbreModalitatsJocTreeWidget->setColumnHidden(2,true);
318
arbreModalitatsJocTreeWidget->setColumnHidden(3,true);
319
arbreModalitatsJocTreeWidget->setColumnHidden(4,true);
321
//posam la capçalera de l'arbre
322
QTreeWidgetItem *item=new QTreeWidgetItem();
323
item->setIcon(0,QIcon(directoriLinux()+QDir().separator()+DIRECTORI_IMATGES+"/hi_q.png"));
324
item->setText(0,tr(nomModalitatsJoc[0]));
325
arbreModalitatsJocTreeWidget->setHeaderItem(item);
328
QList<QTreeWidgetItem *> itemsArbre;
329
for(int llista=0 ; llista<dadesArxiuData.size()/numeroLiniesDadesJoc;++llista){
330
QTreeWidgetItem *item=new QTreeWidgetItem();
331
QStringList tipusJoc = dadesArxiuData.value(llista*numeroLiniesDadesJoc).split(" ");
332
item->setText(0,tr(nomModalitatsJoc[tipusJoc.value(0).toInt()]));
333
item->setText(1,dadesArxiuData.value(llista*numeroLiniesDadesJoc));
334
item->setText(2,dadesArxiuData.value(llista*numeroLiniesDadesJoc+1));
335
item->setText(3,dadesArxiuData.value(llista*numeroLiniesDadesJoc+2));
336
// item->setText(4,dadesArxiuData.value(llista*numeroLiniesDadesJoc+3));
338
itemsArbre.append(item);
340
arbreModalitatsJocTreeWidget->insertTopLevelItems(0,itemsArbre);
341
arbreModalitatsJocTreeWidget->expandAll();
342
arbreModalitatsJocTreeWidget->sortItems(0,Qt::AscendingOrder);
343
//Seleccionam el darrer joc jugat en tancar el programa
346
int modalidadJoc=tipusJoc.value( QString("General/modalidadJoc"),1).toInt();
347
for(int i=0 ; i<arbreModalitatsJocTreeWidget->topLevelItemCount();++i){
348
QStringList modJoc= arbreModalitatsJocTreeWidget->topLevelItem(i)->text(1).split(" ");
349
if (modJoc.value(0).toInt()==modalidadJoc){
350
arbreModalitatsJocTreeWidget->topLevelItem(i)->setSelected(true);
351
arbreModalitatsJocTreeWidget->setCurrentItem(arbreModalitatsJocTreeWidget->topLevelItem(i));
352
//seleccioModalitatJoc(arbreModalitatsJocTreeWidget->topLevelItem(i),1);
353
//arbreModalitatsJocTreeWidget->clicked();
358
if ((! trobat) && ( arbreModalitatsJocTreeWidget->topLevelItemCount()>0)) {
359
arbreModalitatsJocTreeWidget->topLevelItem(0)->setSelected(true);
360
arbreModalitatsJocTreeWidget->setCurrentItem(arbreModalitatsJocTreeWidget->topLevelItem(0));
362
item->setText(0,tr(nomModalitatsJoc[0])+" ("+QString::number(
363
arbreModalitatsJocTreeWidget->topLevelItemCount()) +")");
365
QApplication::setOverrideCursor(Qt::ArrowCursor);
369
Gestiona la selecció de la modalitat de joc
370
quan es clica sobre l'arbre de modalitats
372
//void frmPrincipal::seleccioModalitatJoc(QTreeWidgetItem *, int){
373
void frmPrincipal::seleccioModalitatJoc(){
374
// if (!arbreModalitatsJocTreeWidget->selectedItems().isEmpty()){
375
if (arbreModalitatsJocTreeWidget->selectedItems().count()==1){
376
QTreeWidgetItem *item;
377
item=arbreModalitatsJocTreeWidget->selectedItems().first();
378
//No s'ha clicat el nus arrel
379
if (item->childCount()==0){
380
movimentsUndoStack->clear();
381
iniciSolucioAction->setEnabled(movimentsUndoStack->canUndo());
383
taulerJoc->joc_CarregaJoc(item->text(1),item->text(2),item->text(3));
384
// taulerJoc->joc_CarregaJoc(item->text(1),item->text(2),item->text(3), item->text(4));
387
QStringList tipusJoc = item->text(1).split(" ");
388
QString record=records.value( QString("%1/record").arg(tipusJoc.value(0)) ,
389
QString("0")).toString();
391
statusBar()->showMessage(QString(tr("Joc carregat. El vostre record actual és: %1")).arg(record));}
392
else statusBar()->clearMessage();
393
//S'ha eliminat perquè causava algún problema
394
//En carregar el joc al taulerJoc, s'ha afegit fitInView(sceneRect(), Qt::KeepAspectRatio);
395
//Això és per obligar a que el tauler de joc "s'ajusti" a les dimensions del joc
396
//seleccionat (sense que disminuexi la finestra)
397
// this->resize(this->size()+QSize(-1,-1)+QSize(1,1));
398
solucioJocActual_configuracioInicial.clear();
399
solucioJocActual_configuracioInicial.append(taulerJoc->configuracioActual(true));
400
//Comprovam l'arxiu de solucions
401
comprovaArxiuSolucions();
403
//Si les solucions estan visibles, actualitzam
404
// if( solucionsDockWidget->isVisible()){veureSolucionsSlot();}
405
veureSolucionsSlot();
411
void frmPrincipal::tradueixGUI(){
413
surtAction->setText(tr("&Surt"));
414
veureRecordsPersonalsAction->setText(tr("Veure records"));
415
ajudaAction->setText(tr("Ajuda"));
416
creditsPrograma->setText(tr("Credits"));
417
// undoAction->setText(tr("&Retrocedeix"));
418
//redoAction->setText(tr("&Avança"));
420
solucionaJocActual->setText(tr("Resol"));
423
aplicacioMenu->setTitle(tr("Programa"));
424
movimentsMenu->setTitle(tr("&Moviments joc"));
425
idiomaMenu->setTitle(tr("Idioma"));
426
ajudaMenu->setTitle(tr("Ajuda"));
428
setWindowTitle( tr("Solitari"));
430
veureRecordsPersonalsAction->setText(tr("Veure marques personals"));
431
eliminaRecordsPersonalsAction->setText(tr("Elimina marques personals"));
432
reiniciaJocActual->setText(tr("Reinicia el joc actual"));
433
iniciSolucioAction->setText(tr("Inici solució"));
434
solucionaJocActual->setText(tr("Resol"));
435
/* 16/10/12 Eliminats
436
veureSolucions->setText(tr("Veure solucions"));
439
tabArbres->setTabText(0,tr("Modalitats del joc"));
440
tabArbres->setTabText(1,tr("Solucions"));
442
carregaArbreModalitatsJoc();
446
void frmPrincipal::creaAcccions()
448
surtAction = new QAction(tr("&Surt"), this);
449
surtAction->setShortcut(tr("Ctrl+S"));
450
surtAction->setIcon(QIcon(directoriLinux()+QDir().separator()+DIRECTORI_IMATGES+"/quit.png"));
451
connect(surtAction, SIGNAL(triggered()), this, SLOT(close()));
453
veureRecordsPersonalsAction = new QAction(tr("Veure marques personals"), this);
454
connect(veureRecordsPersonalsAction, SIGNAL(triggered()), this, SLOT(veureRecordsPersonals()));
456
eliminaRecordsPersonalsAction = new QAction(tr("Elimina marques personals"), this);
457
connect(eliminaRecordsPersonalsAction, SIGNAL(triggered()), this, SLOT(eliminaRecordsPersonals()));
459
reiniciaJocActual = new QAction(tr("Reinicia el joc actual"), this);
460
reiniciaJocActual->setShortcut(tr("Ctrl+R"));
461
reiniciaJocActual->setIcon(QIcon(directoriLinux()+QDir().separator()+DIRECTORI_IMATGES+"/view-refresh.png"));
462
connect(reiniciaJocActual, SIGNAL(triggered()), this, SLOT(seleccioModalitatJoc()));
464
//Això és degut al tema de les traduccions
465
// undoAction=movimentsUndoStack->createUndoAction(this,tr("&Retrocedeix"));
466
undoAction=movimentsUndoStack->createUndoAction(this);
467
undoAction->setShortcut(tr("Ctrl+Z"));
468
undoAction->setIcon(QIcon(directoriLinux()+QDir().separator()+DIRECTORI_IMATGES+"/edit-undo.png"));
470
redoAction=movimentsUndoStack->createRedoAction(this);
471
redoAction->setShortcut(tr("Shift+Ctrl+Z"));
472
redoAction->setIcon(QIcon(directoriLinux()+QDir().separator()+DIRECTORI_IMATGES+"/edit-redo.png"));
474
iniciSolucioAction= new QAction(tr("Inici solució"), this);
475
connect(iniciSolucioAction, SIGNAL(triggered()), this, SLOT(iniciSolucioSlot()));
476
iniciSolucioAction->setIcon(QIcon(directoriLinux()+QDir().separator()+DIRECTORI_IMATGES+"/go-first.png"));
477
iniciSolucioAction->setEnabled(false);
480
creditsPrograma= new QAction(tr("Credits"), this);
481
connect(creditsPrograma, SIGNAL(triggered()), this, SLOT(creditsProgramaSlot()));
483
ajudaAction= new QAction(tr("Ajuda"), this);
484
connect(ajudaAction, SIGNAL(triggered()), this, SLOT(ajudaSlot()));
487
solucionaJocActual = new QAction(tr("Resol"), this);
488
solucionaJocActual->setIcon(QIcon(directoriLinux()+QDir().separator()+DIRECTORI_IMATGES+"/soluciona.png"));
489
//connect(solucionaJocActual, SIGNAL(triggered()), this, SLOT(solucionaJocActual_Inicia()));
490
connect(solucionaJocActual, SIGNAL(triggered()), this, SLOT(solucionaJocRapid()));
492
/* solucionaJocActualRapid = new QAction(tr("Resol ràpid"), this);
493
solucionaJocActualRapid->setIcon(QIcon(directoriLinux()+QDir().separator()+DIRECTORI_IMATGES+"/soluciona.png"));
494
connect(solucionaJocActualRapid, SIGNAL(triggered()), this, SLOT(solucionaJocRapid()));
498
/* 16/10/12 Eliminats
499
veureSolucions= new QAction(tr("Veure solucions"), this);
500
connect(veureSolucions, SIGNAL(triggered()), this, SLOT(veureSolucionsSlot()));
505
void frmPrincipal::creaBarraTasques()
508
aplicacioToolBar = addToolBar("Solitari");
509
aplicacioToolBar->setIconSize(QSize(22,22));
510
aplicacioToolBar->addAction(surtAction);
512
aplicacioToolBar->addAction(reiniciaJocActual);
513
aplicacioToolBar->addSeparator();
514
aplicacioToolBar->addAction(iniciSolucioAction);
515
aplicacioToolBar->addAction(undoAction);
516
aplicacioToolBar->addAction(redoAction);
517
aplicacioToolBar->addSeparator();
518
aplicacioToolBar->addAction(solucionaJocActual);
519
// aplicacioToolBar->addAction(solucionaJocActualRapid);
523
void frmPrincipal::creaMenus()
525
aplicacioMenu = menuBar()->addMenu(tr("Programa"));
526
aplicacioMenu->addAction(veureRecordsPersonalsAction);
527
aplicacioMenu->addAction(eliminaRecordsPersonalsAction);
529
/* 16/10/12 Eliminats
530
aplicacioMenu->addSeparator();
531
aplicacioMenu->addAction(veureSolucions);
534
aplicacioMenu->addSeparator();
535
aplicacioMenu->addAction(surtAction);
537
movimentsMenu= menuBar()->addMenu(tr("&Moviments joc"));
538
movimentsMenu->addAction(undoAction);
539
movimentsMenu->addAction(redoAction);
541
idiomaMenu = new QMenu(tr("Idioma"));
542
menuBar()->addMenu(idiomaMenu);
544
ajudaMenu= new QMenu(tr("Ajuda"));
545
menuBar()->addMenu(ajudaMenu);
546
ajudaMenu->addAction(ajudaAction);
547
ajudaMenu->addAction(creditsPrograma);
553
void frmPrincipal::iniciSolucioSlot(int pmoviment){
555
while (movimentsUndoStack->canUndo() && movimentsUndoStack->index()> pmoviment ){
556
movimentsUndoStack->undo();
560
while (movimentsUndoStack->canUndo() ){
561
movimentsUndoStack->undo();
564
statusBar()->clearMessage();
565
//iniciSolucioAction->setEnabled(movimentsUndoStack->canUndo());
568
//Crea el menú de selecció d'idioma de l'aplicació
569
void frmPrincipal::creaIdiomaMenu(){
571
idiomaActionGroup = new QActionGroup(this);
572
connect(idiomaActionGroup, SIGNAL(triggered(QAction *)), this, SLOT(canviaIdioma(QAction *)));
574
QDir dir(directoriLinux()+QDir().separator()+DIRECTORI_LOCALES);
575
QStringList arxiusIdioma = dir.entryList(QStringList("solitari_*.qm"));
577
for (int i = 0; i < arxiusIdioma.size(); ++i) {
578
QString locale = arxiusIdioma[i];
579
locale.remove(0, locale.indexOf('_') + 1);
580
locale.truncate(locale.lastIndexOf('.'));
582
QTranslator translator;
583
translator.load(arxiusIdioma[i], directoriLinux()+QDir().separator()+DIRECTORI_LOCALES);
584
QString language =translator.translate("Traduccio","English");
585
QAction *action = new QAction(tr("&%1 %2").arg(i + 1).arg(language), this);
586
action->setCheckable(true);
587
action->setData(locale);
589
idiomaMenu->addAction(action);
590
idiomaActionGroup->addAction(action);
592
if (locale == QLocale::system().name()){
593
action->setChecked(true);
594
//a debian, sense això es carregan les cadenes
595
//orginals enlloc de les traduïdes
596
canviaIdioma(action);
602
void frmPrincipal::canviaIdioma(QAction *action)
604
localePrograma = action->data().toString();
605
appTranslator->load("solitari_" + localePrograma, directoriLinux()+QDir().separator()+DIRECTORI_LOCALES);
606
qt_translator->load(QLatin1String("qt_") + localePrograma, QLibraryInfo::location(QLibraryInfo::TranslationsPath));
610
void frmPrincipal::resizeEvent ( QResizeEvent * event ){
611
QSize augment=this->size()-this->minimumSize();
612
taulerJoc->resize(QSize(taulerJoc->minimumSize()+augment));
613
jocFram->resize(QSize(jocFram->minimumSize().width(), jocFram->minimumSize().height()+augment.height()));
614
tabArbres->resize(QSize(tabArbres->minimumSize().width(),
615
tabArbres->minimumSize().height()+augment.height()));
616
arbreModalitatsJocTreeWidget->resize(QSize(arbreModalitatsJocTreeWidget->minimumSize().width(),
617
arbreModalitatsJocTreeWidget->minimumSize().height()+augment.height()));
620
void frmPrincipal::closeEvent(QCloseEvent* event){
621
QStringList tipusJoc = arbreModalitatsJocTreeWidget->selectedItems().first()->text(1).split(" ");
622
QSettings().setValue("General/modalidadJoc",tipusJoc.value(0));
625
void frmPrincipal::creditsProgramaSlot(){
626
QDate avui=QDate::currentDate () ;
627
QString missatge=QString("<h2>"+tr("Solitari")+
628
QString(" v. %1</h2>").arg(qApp->applicationVersion()));
629
if (avui.year()==2010){
630
missatge.append(QString("<p> © "+QString("2010")+" I. De Marchi <br/>" ));
633
missatge.append(QString("<p> © "+QString("2010-%1").arg(avui.year())+" I. De Marchi" ));
635
missatge.append(QString(tr("Sota llicència GPL 2.0 o posterior")+"<br/>"));
637
missatge.append(QString("<a href=\"%1\">%1</a><br/>").arg(ADRECA_WEB_PROGRAMA_1));
638
missatge.append(QString("<a href=\"%1\">%1</a><br/>").arg(ADRECA_WEB_PROGRAMA_2));
639
missatge.append(QString("<a href=mailto:%1>%1</a><br/>").arg(ADRECA_CORREU));
641
QMessageBox::about(this,
642
QString(tr("Credits del %1").arg(qApp->applicationName())),missatge);
645
void frmPrincipal::veureRecordsPersonals(){
646
if (arbreModalitatsJocTreeWidget->topLevelItemCount()==0){ return;}
647
QString missatge=QString("<h2>"+ tr("Marques personals")+"</h2>");
649
for(int i=0;i<=arbreModalitatsJocTreeWidget->topLevelItemCount()-1;i++){
650
QStringList tipusJoc = arbreModalitatsJocTreeWidget->topLevelItem(i)->text(1).split(" ");
651
QString record=records.value( QString("%1/record").
652
arg(tipusJoc.value(0)) ,
653
QString("--")).toString();
654
if( !(record.compare("--")==0)){
655
missatge.append(QString("<br>"+arbreModalitatsJocTreeWidget->topLevelItem(i)->text(0)+
657
// missatge.append(QString("<p>"+arbreModalitatsJocTreeWidget->topLevelItem(i)->text(0)+
658
// " -> "+record )) ;
661
QMessageBox::about(this,QString(tr("Marques personals")),missatge);
665
QTextEdit *texte = new QTextEdit (missatge );
666
texte->setReadOnly(true);
667
QDockWidget *recordsPersonalsDockWidget = new QDockWidget(tr("Marques personals"));
668
recordsPersonalsDockWidget->setWidget(texte);
669
recordsPersonalsDockWidget->setMinimumSize(400,300);
670
recordsPersonalsDockWidget->move(QPoint(this->pos().x()+50,this->pos().y()+200));
671
//solucionsDockWidget->setAllowedAreas(Qt::NoDockWidgetArea);
672
addDockWidget(Qt::BottomDockWidgetArea, recordsPersonalsDockWidget);
673
//addDockWidget(Qt::NoDockWidgetArea, solucionsDockWidget);
674
recordsPersonalsDockWidget->setFloating(false);
679
Elimina tots els records personals
681
void frmPrincipal::eliminaRecordsPersonals(){
682
QMessageBox missatgeBox;
683
missatgeBox.setText(tr("Elimina les marques personals"));
684
missatgeBox.setInformativeText(tr("De debó voleu eliminar les vostres marques?"));
685
missatgeBox.setIcon(QMessageBox::Question);
686
missatgeBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
687
missatgeBox.setDefaultButton(QMessageBox::No);
688
if(missatgeBox.exec()==QMessageBox::Yes){
696
void frmPrincipal::ajudaSlot(){
698
QString directori=directoriLinux()+
704
if (dirArxiu.exists(directori)){
705
//Això evita problemes amb els espais als noms dels directoris
706
QDesktopServices::openUrl(QUrl("file:///"+directori+"#"+localePrograma, QUrl::TolerantMode));
708
else QDesktopServices::openUrl(QUrl("file:///"+directoriLinux()+
712
"index.html", QUrl::TolerantMode));
716
void frmPrincipal::solucionaJocActual_Inicia(){
718
QApplication::setOverrideCursor(Qt::WaitCursor);
719
statusBar()->clearMessage();
722
taulerJoc->solucionaJocActual_CalculaMovimentsPosibles();
724
//Si ja hi ha moviments fets, llavors es "conservan" i es busca
725
//la solució a partir de la situació actual
726
if(movimentsUndoStack->count()>0){
727
retrocedeixMoviment=movimentsUndoStack->index();
728
solucionaJocActual_movimentsJaRealitzats.clear();
730
// solucioJocActual_configuracioInicial.append(taulerJoc->configuracioActual(true));
731
while (movimentsUndoStack->canRedo()){
732
solucionaJocActual_darrerMoviment=QString("%1 ").arg(movimentsUndoStack->index()+1);
733
solucionaJocActual_darrerMoviment.append(
734
coordenadesAMoviment(movimentsUndoStack->text(movimentsUndoStack->index())));
735
solucionaJocActual_movimentsJaRealitzats.append(solucionaJocActual_darrerMoviment);
736
movimentsUndoStack->redo();
740
solucioJocActual_configuracioInicial.clear();
741
solucioJocActual_configuracioInicial.append(taulerJoc->configuracioActual(true));
742
retrocedeixMoviment=0;
743
movimentsUndoStack->clear();
745
// solucioJocActual_configuracioInicial.append(taulerJoc->configuracioActual(true));
747
solucioJocActual_configuracionsEliminades.clear();
748
solucioJocActual_configuracionsEliminadesPerDesar.clear();
750
solucionaJocActual_movimentsPosiblesActuals.clear();
751
carregaConfiguracionsEliminades();
753
// movimentsUndoStack->clear();
754
solucionaJocActual_CarregaMovimentsInicialsArbre();
755
qApp->processEvents();
759
void frmPrincipal::solucionaJocActual_CarregaMovimentsInicialsArbre(){
760
rellotgeLabel->iniciaRellotge();
761
solucionaJocActual_comencaRecerca();
762
QApplication::setOverrideCursor(Qt::ArrowCursor);
766
void frmPrincipal::solucionaJocActual_comencaRecerca(){
769
// QProgressDialog progres(tr("Cercant solució"), tr("Atura"), 0,
770
// taulerJoc->numeroDeMovimentsJoc() ,this);
771
//Això és pel problema a windows en què si es mou
772
//la finestra de diàleg, llavors s'atura la cerca però
774
#if defined(Q_OS_WIN32)
775
QProgressDialog progres(tr("Cercant solució"), tr("Atura"), 0,
776
taulerJoc->numeroDeMovimentsJoc() ,this,
777
Qt::FramelessWindowHint);
779
QProgressDialog progres(tr("Cercant solució"), tr("Atura"), 0,
780
taulerJoc->numeroDeMovimentsJoc() ,this);
783
progres.setWindowModality(Qt::WindowModal);
784
progres.setValue(movimentsUndoStack->index()-1);
785
progres.setVisible(true);
786
progres.setLabelText(missatgeNumeroMoviments());
787
qApp->processEvents();
790
int numMovimentsPerReiniciar=taulerJoc->numeroDeMovimentsJoc()*3;
792
int numeroFitxesMajorConfigEliminada=0;
793
int numeroMovimentsProvats=0;
795
while (jocResolt !=2){
796
solucionaJocActual_movimentsPosiblesActuals.clear();
797
solucionaJocActual_movimentsPosiblesActuals.append(
798
taulerJoc->solucionaJocActual_CarregaMovimentsArbre(solucionaJocActual_movimentsEliminats,
799
solucionaJocActual_darrerMoviment));
801
bool fitxesAIllades=false;
802
fitxesAIllades=taulerJoc->solucionaJocActual_FitxesAillades();
803
QString configAct=taulerJoc->configuracioActual();
804
if ( (solucionaJocActual_movimentsPosiblesActuals.count()>0) && (jocResolt ==0)
805
&& !(solucioJocActual_configuracionsEliminades.contains(configAct))
806
&& !(fitxesAIllades) ){
807
// && taulerJoc->movimentFitxaCentral() ) {
811
if (solucionaJocActual_movimentsPosiblesActuals.count()>1){
812
qsrand(rellotgeQTime.msecsTo(QTime::currentTime()));
813
numeroItem=qrand() % (solucionaJocActual_movimentsPosiblesActuals.count());
816
if (numeroItem>=solucionaJocActual_movimentsPosiblesActuals.count()){ numeroItem=0;}
817
QStringList movimentsItem= QStringList(solucionaJocActual_movimentsPosiblesActuals.value(numeroItem).split(" "));
818
taulerJoc->ferMoviment(movimentsItem.value(0).toInt()
819
,movimentsItem.value(1).toInt(),movimentsItem.value(2).toInt());
821
++numeroMovimentsProvats;
822
progres.setValue(movimentsUndoStack->index()-1);
823
progres.setLabelText(missatgeNumeroMoviments());
824
qApp->processEvents();
826
//int indexmovimentsUndoStack=movimentsUndoStack->index();
827
solucionaJocActual_darrerMoviment=QString("%1 ").arg(movimentsUndoStack->index());
828
solucionaJocActual_darrerMoviment.append(solucionaJocActual_movimentsPosiblesActuals.value(numeroItem));
829
solucionaJocActual_movimentsJaRealitzats.append(solucionaJocActual_darrerMoviment);
833
if (movimentsUndoStack->index() !=0 ){
835
taulerJoc->eliminaFitxesVermelles();
836
// QString configAct=taulerJoc->configuracioActual();
837
numeroFitxesMajorConfigEliminada=qMax(numeroFitxesMajorConfigEliminada,
838
numeroConfiguracio(configAct));
839
if ( (! solucioJocActual_configuracionsEliminades.contains(configAct)) ){
840
//Aqui cal eliminar les configuracions posteriors de solucioJocActual_configuracionsEliminades
841
solucionaJocActual_eliminaConfiguracionsPosteriors(configAct);
842
solucioJocActual_configuracionsEliminadesPerDesar.append(configAct);
843
solucioJocActual_configuracionsEliminades.prepend(configAct);
847
if ( (solucionaJocActual_movimentsEliminats.indexOf(solucionaJocActual_darrerMoviment)==-1 ) &&
848
!(solucionaJocActual_darrerMoviment.isEmpty()) ){
849
solucionaJocActual_eliminaMovimentsPosteriors();
850
solucionaJocActual_movimentsEliminats.append(solucionaJocActual_darrerMoviment);
853
movimentsUndoStack->undo();
855
progres.setValue(movimentsUndoStack->index()-1);
856
progres.setLabelText(missatgeNumeroMoviments());
857
if (solucionaJocActual_movimentsJaRealitzats.size()>0){
858
solucionaJocActual_movimentsJaRealitzats.removeAt(solucionaJocActual_movimentsJaRealitzats.size()-1);
860
solucionaJocActual_darrerMoviment=solucionaJocActual_movimentsJaRealitzats.value(
861
solucionaJocActual_movimentsJaRealitzats.size()-1);
864
if ( ( ( reinicia ) && retrocedeixMoviment==0 &&
865
( (numeroMovimentsProvats % numMovimentsPerReiniciar) == 0) ) ){
867
solucionaJocActual_movimentsJaRealitzats.clear();
868
solucionaJocActual_darrerMoviment.clear();
870
progres.setLabelText(missatgeNumeroMoviments());
876
rellotgeLabel->aturaRellotge();
878
desaConfiguracionsEliminades();
879
statusBar()->showMessage(tr("No ha estat possible trobar una solució!"));
883
if (progres.wasCanceled()){
884
rellotgeLabel->aturaRellotge();
885
desaConfiguracionsEliminades();
886
solucionaJocActual_movimentsJaRealitzats.clear();
887
solucionaJocActual_movimentsEliminats.clear();
894
// qDebug("num conf eliminades %d", solucioJocActual_configuracionsEliminades.count());
895
// qCritical("temps %s ", qPrintable(rellotgeLabel->retornaTemps(1)));
896
desaConfiguracionsEliminades();
897
solucionaJocActual_movimentsJaRealitzats.clear();
898
solucionaJocActual_movimentsEliminats.clear();
899
retrocedeixMoviment=0;
900
veureSolucionsSlot();
901
//Comentar les 3 següents linies per evitar la repetició de recerca de solució
902
/* iniciSolucioSlot();
903
if(taulerJoc->estatDelJoc()==solucio){movimentsUndoStack->clear();}
904
solucionaJocActual_Inicia();
910
void frmPrincipal::solucionaJocActual_eliminaMovimentsPosteriors(){
911
QStringList *darrerMoviment =new QStringList(solucionaJocActual_darrerMoviment.split(" "));
912
QStringList *darrerMovimentEliminat=new QStringList(solucionaJocActual_movimentsEliminats.value(
913
solucionaJocActual_movimentsEliminats.size()-1).split(" "));
914
while (darrerMovimentEliminat->value(0).toInt()>darrerMoviment->value(0).toInt()){
915
solucionaJocActual_movimentsEliminats.removeAt(solucionaJocActual_movimentsEliminats.size()-1);
916
darrerMovimentEliminat->clear();
917
darrerMovimentEliminat->append(solucionaJocActual_movimentsEliminats.value(
918
solucionaJocActual_movimentsEliminats.size()-1).split(" "));
920
delete(darrerMoviment);
921
delete(darrerMovimentEliminat);
924
void frmPrincipal::solucionaJocActual_eliminaConfiguracionsPosteriors(QString config){
926
if (solucioJocActual_configuracionsEliminadesPerDesar.count()==0){
928
int numConfiguracio=numeroConfiguracio(config);
929
if(taulerJoc->p_tipusMoviment !=2){
930
while ( (numeroConfiguracio(solucioJocActual_configuracionsEliminadesPerDesar.value(
931
solucioJocActual_configuracionsEliminadesPerDesar.count()-1))<numConfiguracio) &&
932
(solucioJocActual_configuracionsEliminadesPerDesar.count()>0) ){
933
solucioJocActual_configuracionsEliminadesPerDesar.removeLast();}
936
while ( (numeroConfiguracio(solucioJocActual_configuracionsEliminadesPerDesar.value(
937
solucioJocActual_configuracionsEliminadesPerDesar.count()-1))>numConfiguracio) &&
938
(solucioJocActual_configuracionsEliminadesPerDesar.count()>0) ){
939
solucioJocActual_configuracionsEliminadesPerDesar.removeLast();}
944
Elimina configuracions de solucioJocActual_configuracionsEliminades
947
void frmPrincipal::solucionaJocActual_eliminaConfiguracions(){
948
while (solucioJocActual_configuracionsEliminades.count()>10000){
949
solucioJocActual_configuracionsEliminades.removeLast();
955
/* Aquesta funció no es fa servir
956
void frmPrincipal::escriuArxiuSolucio(){
957
QSettings *arxiuSolucio=new QSettings(QSettings::UserScope,"De Marchi", "solucio");
958
arxiuSolucio->clear();
959
for(int llista=0 ; llista<solucionaJocActual_movimentsJaRealitzats.size();++llista){
960
arxiuSolucio->setValue(QString("solucio/%1").arg(llista+1),solucionaJocActual_movimentsJaRealitzats.value(llista));
962
delete (arxiuSolucio);
963
qApp->processEvents();
969
Busca una solució ha partir d'una altra solució
971
void frmPrincipal::solucionaJocRapid(){
972
solucionaJocActual_movimentsJaRealitzats.clear();
973
solucionaJocActual_darrerMoviment.clear();
974
taulerJoc->setEstatDelJoc(solucio);
975
//Posa a zero el rellotge 01/01/10
976
//Si es clicava una segona vegada desprès d'obtenir
977
//una solució, llavors s'acumulava el temps
978
rellotgeLabel->estableixTemps(QString("00:00:00"));
979
if(movimentsUndoStack->index()==0){
980
movimentsUndoStack->clear();
981
//Primer carregam les solucions disponibles
982
solucioJocActual_configuracioInicial.clear();
983
solucioJocActual_configuracioInicial.append(taulerJoc->configuracioActual(true));
984
comprovaArxiuSolucions();
986
// qDebug("%d",taulerJoc->comptadorFitxesJoc);
987
if (solucionsTrobades.count()>0) {
988
//Seleccionam una solució a l'atzar
989
qsrand(rellotgeQTime.msecsTo(QTime::currentTime()));
990
int selec=qrand() % (solucionsTrobades.count());
991
QStringList movimentsSolucio=solucionsTrobades.value(selec).split(" ");
992
selec=qrand() % ((movimentsSolucio.count()/8));
993
selec=qMax(selec,taulerJoc->p_numMoviments);
995
rellotgeLabel->iniciaRellotge();
996
for(int i=0;i<(movimentsSolucio.count()/4);i++){
997
if(i<(movimentsSolucio.count()/4)-selec){
998
taulerJoc->ferMoviment(movimentsSolucio.value(i*4+1).toInt(),
999
movimentsSolucio.value(i*4+2).toInt(),
1000
movimentsSolucio.value(i*4+3).toInt());}
1002
if(i>taulerJoc->p_numMoviments){
1003
mov=QString("%1 %2 %3 %4").
1004
arg(movimentsSolucio.value(i*4)).
1005
arg(movimentsSolucio.value(i*4+1)).
1006
arg(movimentsSolucio.value(i*4+2)).
1007
arg((movimentsSolucio.value(i*4+3)));
1008
solucionaJocActual_movimentsEliminats.append(mov);
1011
solucionaJocActual_darrerMoviment.append(mov);
1014
solucionaJocActual_Inicia();
1018
void frmPrincipal::desaConfiguracionsEliminades(int tipus){
1019
if (solucioJocActual_configuracionsEliminadesPerDesar.count()==0){
1024
QProgressDialog progres(tr("Desant dades"), tr("Atura"), 0,solucioJocActual_configuracionsEliminadesPerDesar.count() ,this);
1025
progres.setWindowModality(Qt::WindowModal);
1026
progres.setValue(numero);
1027
progres.setVisible(true);
1028
qApp->processEvents();
1030
comprovaDirectoriHome();
1032
QString nomArxiu=nomArxiuJoc(1);
1034
QFile arxiu(nomArxiu);
1035
bool arxiuObert=false;
1037
if (arxiu.open(QIODevice::Append)){arxiuObert=true;}
1039
else if (arxiu.open(QIODevice::WriteOnly)){arxiuObert=true;}
1042
QTextStream entrada(&arxiu);
1043
for(int j=0;j<solucioJocActual_configuracionsEliminadesPerDesar.count();j++){
1044
entrada<<(QString("%1\n").arg(solucioJocActual_configuracionsEliminadesPerDesar.value(j) )) ;
1045
progres.setValue(++numero);
1046
progres.setLabelText(QString("Desant dades: %1 de %2").arg(numero).
1047
arg(solucioJocActual_configuracionsEliminadesPerDesar.count()));
1048
if (progres.wasCanceled()) { break; }
1049
qApp->processEvents();
1056
void frmPrincipal::carregaConfiguracionsEliminades(){
1059
QString nomArxiu=nomArxiuJoc(1);
1061
QFile arxiu(nomArxiu);
1062
qint64 tamanyArxiu =arxiu.size()/taulerJoc->numeroDeMovimentsJoc();
1064
QProgressDialog progres(tr("Carregant dades"), tr("Atura"), 0,tamanyArxiu ,this);
1065
progres.setWindowModality(Qt::WindowModal);
1066
progres.setValue(numero);
1067
progres.setVisible(true);
1068
qApp->processEvents();
1070
solucioJocActual_configuracionsEliminades.clear();
1072
if (!arxiu.open(QIODevice::ReadOnly)){
1075
QTextStream entrada(&arxiu);
1076
QString linia0 = entrada.readLine();
1077
while (!linia0.isNull()) {
1078
if ( ! solucioJocActual_configuracionsEliminadesPerDesar.contains(linia0)){
1079
solucioJocActual_configuracionsEliminades.append(linia0);
1080
solucioJocActual_configuracionsEliminadesPerDesar.append(linia0);
1081
progres.setValue(++numero);
1082
progres.setLabelText(QString("Carregant dades: %1 de %2").arg(numero).arg(tamanyArxiu));
1084
linia0 = entrada.readLine();
1085
if (progres.wasCanceled()) break;
1086
qApp->processEvents();
1090
desaConfiguracionsEliminades(1);
1094
void frmPrincipal::carregaSolucions(){
1095
QString nomArxiu=nomArxiuJoc(2);
1097
QFile arxiu(nomArxiu);
1098
solucionsTrobades.clear();
1099
// qDebug("Items in list: %d", solucionsTrobades.size());
1100
/* if (!arxiu.open(QIODevice::ReadOnly)){
1104
if (arxiu.open(QIODevice::ReadOnly)){
1105
QTextStream entrada(&arxiu);
1106
QString linia0 = entrada.readLine();
1107
while (!linia0.isNull()) {
1108
solucionsTrobades.append(linia0);
1109
// qDebug("llistat: %d", solucionsTrobades.size());
1110
linia0 = entrada.readLine();
1112
Aquesta linea provocava un error en la càrrrega de les
1113
dades de les solucions quan es feia un canvi ràpid en la
1114
selecció de la modalitar de joc*/
1115
//qApp->processEvents();
1117
// qDebug("Items in list: %d", solucionsTrobades.size());
1122
void frmPrincipal::desaSolucions(){
1123
if (solucionaJocActual_movimentsJaRealitzats.count()==0){
1125
comprovaDirectoriHome();
1126
QString nomArxiu=nomArxiuJoc(2);
1129
QString solucioActual;
1130
for(int j=0;j<solucionaJocActual_movimentsJaRealitzats.count();j++){
1131
solucioActual.append(QString("%1 ").arg(solucionaJocActual_movimentsJaRealitzats.value(j) )) ;
1133
if( ! solucionsTrobades.contains(solucioActual)){
1134
QFile arxiu(nomArxiu);
1135
if (arxiu.open(QIODevice::Append)){
1136
QTextStream entrada(&arxiu);
1137
entrada<<(QString("%1\n").arg(solucioActual )) ;
1138
statusBar()->showMessage(tr("S'ha trobat una nova solució!"));
1139
// qDebug("S'ha trobat una nova solució!");
1145
void frmPrincipal::desaSolucions1(){
1146
if (movimentsUndoStack->count()==0){
1148
comprovaDirectoriHome();
1149
QString nomArxiu=nomArxiuJoc(2);
1152
QString solucioActual;
1153
for(int j=0;j<movimentsUndoStack->count();j++){
1154
solucioActual.append(QString("%1 %2 ").
1156
arg(coordenadesAMoviment(movimentsUndoStack->text(j)))) ;
1158
if( ! solucionsTrobades.contains(solucioActual)){
1159
QFile arxiu(nomArxiu);
1160
if (arxiu.open(QIODevice::Append)){
1161
QTextStream entrada(&arxiu);
1162
entrada<<(QString("%1\n").arg(solucioActual )) ;
1163
statusBar()->showMessage(tr("S'ha trobat una nova solució!"));
1164
// qDebug("S'ha trobat una nova solució!");
1170
void frmPrincipal::veureSolucionsSlot(){
1171
arbreSolucionsTreeWidget->clear();
1173
//posam la capçalera de l'arbre
1174
//Això provoca una errada a windows
1175
//quan es navega per l'arbre de modalitats del
1176
//joc. S'ha passat al final del procediment
1177
QTreeWidgetItem *item=new QTreeWidgetItem();
1178
QString textSolucio=arbreModalitatsJocTreeWidget->selectedItems().first()->text(0);
1179
item->setText(0,arbreModalitatsJocTreeWidget->selectedItems().first()->text(0));
1180
arbreSolucionsTreeWidget->setHeaderItem(item);
1183
//solucionsDockWidget->move(QPoint(this->pos().x()+10,this->pos().y()+this->height()/3+40));
1184
/*solucionsDockWidget->move(QPoint(this->pos().x()+10,this->pos().y()+10));
1185
solucionsDockWidget->setAllowedAreas(Qt::LeftDockWidgetArea);
1186
addDockWidget(Qt::LeftDockWidgetArea, solucionsDockWidget);
1187
//addDockWidget(Qt::NoDockWidgetArea, solucionsDockWidget);
1188
solucionsDockWidget->setFloating(true);
1189
solucionsDockWidget->setVisible(true);
1192
//Carregam les solucions
1193
//solucionsTrobades.clear();
1195
int numeroSolucio=1;
1196
if (solucionsTrobades.count()>0){
1197
//qDebug("Items in list: %d", solucionsTrobades.size());
1198
//arbreSolucionsTreeWidget->clear();
1199
for(int i=0;i<solucionsTrobades.count();i++){
1200
if ( ! solucionsTrobades.value(i).mid(0,1).contains("#")){
1201
//afegim un item arrel a l'arbre
1202
QTreeWidgetItem *itemSolucio=new QTreeWidgetItem();
1203
QList<QTreeWidgetItem *> itemsArbre;
1204
QStringList movimentsSolucio=solucionsTrobades.value(i).split(" ");
1205
for(int moviment=0 ; moviment<movimentsSolucio.count()/4;++moviment){
1206
QTreeWidgetItem *item=new QTreeWidgetItem();
1208
movimentACoordenades(movimentsSolucio.value(4*moviment+1),movimentsSolucio.value(4*moviment+3)));
1209
item->setText(1,QString("%1 %2 %3").arg(movimentsSolucio.value(4*moviment+1)).
1210
arg(movimentsSolucio.value(4*moviment+2)).
1211
arg(movimentsSolucio.value(4*moviment+3)) );
1212
itemsArbre.append(item);
1214
itemSolucio->insertChildren(0,itemsArbre);
1215
itemSolucio->setText(0,tr("Solució %1").arg(numeroSolucio));
1216
arbreSolucionsTreeWidget->insertTopLevelItem(numeroSolucio-1,itemSolucio);
1218
arbreModalitatsJocTreeWidget->expandAll();
1223
QTreeWidgetItem *itemSolucio=new QTreeWidgetItem();
1224
itemSolucio->setText(0,tr("No hi ha solucions"));
1225
//arbreSolucionsTreeWidget->clear();
1226
arbreSolucionsTreeWidget->insertTopLevelItem(numeroSolucio-1,itemSolucio);
1228
QTreeWidgetItem *itemCapcalera=new QTreeWidgetItem();
1229
QString textCapcalera=arbreModalitatsJocTreeWidget->selectedItems().first()->text(0);
1230
textCapcalera.append(" ("+QString("%1").arg(numeroSolucio-1)+")");
1231
itemCapcalera->setText(0,textCapcalera);
1232
arbreSolucionsTreeWidget->setHeaderItem(itemCapcalera);
1235
void frmPrincipal::carregaSolucio(QTreeWidgetItem*, int){
1236
if(arbreSolucionsTreeWidget->selectedItems().first()->childCount()>0){
1237
QMessageBox missatgeBox;
1238
missatgeBox.setText(tr("Carregar ")+arbreSolucionsTreeWidget->selectedItems().first()->text(0));
1239
missatgeBox.setInformativeText(tr("De debó voleu carregar la solució? Perdreu els moviments que heu fet!"));
1240
missatgeBox.setIcon(QMessageBox::Question);
1241
missatgeBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
1242
missatgeBox.setDefaultButton(QMessageBox::No);
1243
if(missatgeBox.exec()==QMessageBox::Yes){
1244
taulerJoc->setEstatDelJoc(solucio);
1246
solucioJocActual_configuracioInicial.clear();
1247
solucioJocActual_configuracioInicial.append(taulerJoc->configuracioActual(true));
1248
for(int i=0;i<arbreSolucionsTreeWidget->selectedItems().first()->childCount();i++){
1249
QStringList movimentsSolucio=
1250
arbreSolucionsTreeWidget->selectedItems().first()->child(i)->text(1).split(" ");
1251
taulerJoc->ferMoviment(movimentsSolucio.value(0).toInt(),
1252
movimentsSolucio.value(1).toInt(),
1253
movimentsSolucio.value(2).toInt());
1256
Aquest missatge es mostrava encara que la resposta
1258
// iniciSolucioSlot();
1259
statusBar()->showMessage(tr("S'ha carregat la ")+arbreSolucionsTreeWidget->selectedItems().first()->text(0)+
1260
tr(". Feu servir els botons Avança i Retrocedeix per veure la solució. "));
1266
Converteix les dades d'un moviment en número
1269
QString frmPrincipal::movimentACoordenades(QString inici,QString final){
1270
int numero_inici=inici.toInt();
1271
int numero_final=final.toInt();
1272
return QString("(%1,%2) -> (%3,%4)").arg(numero_inici/100).arg(numero_inici % 100).
1273
arg(numero_final/100).arg(numero_final % 100);
1277
Converteix les dades d'un moviment en coordenades
1280
QString frmPrincipal::coordenadesAMoviment(QString coordenades){
1281
QRegExp coord(".(\\d+),(\\d+). -> .(\\d+),(\\d+).");
1282
if (coord.exactMatch(coordenades)){
1283
int fitxaBotada=((coord.cap(1).toInt()+coord.cap(3).toInt())/2)*100+
1284
((coord.cap(2).toInt()+coord.cap(4).toInt())/2);
1285
return QString("%1 %2 %3").arg(coord.cap(1).toInt()*100+coord.cap(2).toInt()).
1287
arg(coord.cap(3).toInt()*100+coord.cap(4).toInt());
1290
return QString("");}
1294
Retorna el nom i directori de l'arxiu de dades/solucions del joc
1296
tipus=1 -> arxiu amb les configuracions eliminades
1297
tipus=2 -> arxiu amb les solucions
1299
QString frmPrincipal::nomArxiuJoc(int tipus){
1300
comprovaDirectoriHome();
1301
QString nomArxiu=QDir::homePath ();
1303
if (tipus==1){ extensio=".txt";}
1304
else extensio=".sol";
1305
nomArxiu.append (QDir().separator());
1306
nomArxiu.append (qApp->applicationName());
1307
nomArxiu.append (QDir().separator());
1308
nomArxiu.append (QString(solucioJocActual_configuracioInicial+" _"+
1309
QString("%1").arg(taulerJoc->p_modalitatJocActual)+extensio));
1314
Comprova que existeix el directori /Solitari
1315
en el directori d'usuari
1317
void frmPrincipal::comprovaDirectoriHome(){
1318
QDir dirArxiu(QDir::homePath ());
1319
if (!dirArxiu.exists(qApp->applicationName())){
1320
dirArxiu.mkdir(qApp->applicationName());
1324
void frmPrincipal::comprovaRegistre(){
1326
// int reg=registre.value( QString("General/Registre"),0).toInt();
1327
if (registre.value( QString("General/Registre"),0).toInt()==0){
1328
if(QDesktopServices::openUrl(ADRECA_WEB_REGISTRE)){
1329
QSettings().setValue("General/Registre",1);
1335
Retorna la cadena amb el missatge del número de moviments realitzats
1338
QString frmPrincipal::missatgeNumeroMoviments(){
1339
QString numMovAct=QString("%1").arg(movimentsUndoStack->index()-1);
1340
QString totalMovJoc=QString("%1").arg(taulerJoc->numeroDeMovimentsJoc());
1342
while (numMovAct.length()<totalMovJoc.length()){numMovAct.prepend("0");}
1343
return QString(tr("Moviment ")+numMovAct+tr(" de ")+totalMovJoc);
1344
//return QString(tr("Moviment ")+numMovAct+tr(" de ")+totalMovJoc+" config %1 ").
1345
// arg(solucioJocActual_configuracionsEliminades.count());
1349
Copia l'arxiu de solucions en el directori
1352
void frmPrincipal::comprovaArxiuSolucions(){
1353
QString nomArxiuDesti=nomArxiuJoc(2);
1354
QString nomArxiuInicial=directoriLinux();
1355
nomArxiuInicial.append(QDir().separator());
1356
nomArxiuInicial.append(DIRECTORI_DADES);
1357
nomArxiuInicial.append(QDir().separator());
1358
nomArxiuInicial.append(QString(solucioJocActual_configuracioInicial+" _"+
1359
QString("%1").arg(taulerJoc->p_modalitatJocActual)+".sol"));
1360
QFile arxiu(nomArxiuInicial);
1361
arxiu.copy( nomArxiuDesti);
1364
//Mostra un missatge passat pel tauler del joc
1365
void frmPrincipal::mostraMissatge(int codi){
1368
statusBar()->showMessage(tr("No hi ha més moviments: el joc ha finalitzat!"));
1371
statusBar()->showMessage(tr("Joc resolt!"));
1374
QMessageBox::information(this,tr("Nova marca personal"),
1375
tr("Heu establert un nou record personal en aquesta modalitat de joc"));
1378
statusBar()->showMessage(
1379
QString(tr("Moviment %1 de %2 ")).arg(movimentsUndoStack->index()).
1380
arg(taulerJoc->numeroDeMovimentsJoc()));