~ubuntu-branches/ubuntu/vivid/peg-solitaire/vivid

« back to all changes in this revision

Viewing changes to scr/frmprincipal.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Innocent De Marchi
  • Date: 2011-01-18 18:06:54 UTC
  • Revision ID: james.westby@ubuntu.com-20110118180654-w1yj9he00r65fvxh
Tags: upstream-1.0.2
Import upstream version 1.0.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/***********************************************************************
 
2
 *
 
3
 * Copyright (C) 2010 Innocent De Marchi <tangram.peces@gmail.com>
 
4
 *
 
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.
 
9
 *
 
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.
 
14
 *
 
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/>.
 
17
 *
 
18
 ***********************************************************************/
 
19
#include <QAction>
 
20
#include <QtGui>
 
21
#include <QtCore>
 
22
 
 
23
#include "frmprincipal.h"
 
24
#include "constants.h"
 
25
#include "funcions.h"
 
26
#include "moviment.h"
 
27
 
 
28
extern QTranslator *qt_translator;
 
29
extern QTranslator *appTranslator;
 
30
 
 
31
const int numeroLiniesDadesJoc=3;
 
32
 
 
33
const int alcadaMenuBarraTasques=60;
 
34
 
 
35
QString localePrograma;
 
36
 
 
37
int jocResolt;
 
38
 
 
39
 
 
40
/****************************************
 
41
*
 
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.
 
46
*
 
47
*16/12/10: canviat el sistema per mostrar les
 
48
*solucions. Ara es fa a un Tab i s'ha eliminat
 
49
*l'opció de menú
 
50
*****************************************/
 
51
 
 
52
 
 
53
frmPrincipal::frmPrincipal()
 
54
{
 
55
  localePrograma=QLocale::system().name();
 
56
 
 
57
  //jocResolt=false;
 
58
 
 
59
  setWindowIcon(QIcon(":/peg-solitaire.png"));
 
60
  setWindowTitle( tr("Solitari"));
 
61
  setMinimumSize (QSize(610,380));
 
62
  this->move(300,100);
 
63
 
 
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));
 
68
 
 
69
    //rellotge
 
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");
 
75
 
 
76
    //Tabs
 
77
    tabArbres= new QTabWidget(jocFram);
 
78
    tabArbres->setMinimumSize(QSize(290,250));
 
79
    tabArbres->move(QPoint(0,50));
 
80
    //arbre de figures
 
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()));
 
89
    //S'afegeix a un tab
 
90
    tabArbres->addTab(arbreModalitatsJocTreeWidget, tr("Modalitats del joc"));
 
91
 
 
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)));
 
99
    /*
 
100
    solucionsDockWidget = new QDockWidget(tr("Solucions"));
 
101
    solucionsDockWidget->setWidget(arbreSolucionsTreeWidget);
 
102
    */
 
103
   //S'afegeix a un tab
 
104
    tabArbres->addTab(arbreSolucionsTreeWidget, tr("Solucions"));
 
105
 
 
106
   movimentsUndoStack = new QUndoStack(this);
 
107
   taulerJoc= new Tauler (movimentsUndoStack,rellotgeLabel,this,this);
 
108
   taulerJoc->move(QPoint(300,alcadaMenuBarraTasques));
 
109
 
 
110
   //Rellotge per a les eleccions a l'atzar
 
111
    QTime rellotgeQTime (0,0,0);
 
112
    rellotgeQTime.currentTime();
 
113
    rellotgeQTime.start();
 
114
 
 
115
    creaAcccions();
 
116
    creaMenus();
 
117
    creaBarraTasques();
 
118
 
 
119
    llegeixArxiuData();
 
120
    carregaArbreModalitatsJoc();
 
121
    comprovaDirectoriHome();
 
122
    /* 18/01/11
 
123
       Eliminat (a Debian) per considerar-ho contrari a les
 
124
       "llibertats"
 
125
      */
 
126
    //comprovaRegistre();
 
127
}
 
128
 
 
129
 
 
130
/*
 
131
  Carrega el contingut de l'arxiu data.sol a la
 
132
  llista dadesArxiuData
 
133
  */
 
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) );
 
141
         return ;
 
142
     }
 
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());
 
151
          }
 
152
         }
 
153
       linia0 = entrada.readLine();
 
154
     } //final del while de la lectura de l'arxiu
 
155
}
 
156
 
 
157
void frmPrincipal::carregaArbreModalitatsJoc(){
 
158
 
 
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"),
 
308
        0
 
309
    };
 
310
 
 
311
    QApplication::setOverrideCursor(Qt::WaitCursor);
 
312
     if (dadesArxiuData.size()>0){
 
313
         //netejam
 
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);
 
320
 
 
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);
 
326
 
 
327
 
 
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));
 
337
 
 
338
               itemsArbre.append(item);
 
339
         }
 
340
      arbreModalitatsJocTreeWidget->insertTopLevelItems(0,itemsArbre);
 
341
      arbreModalitatsJocTreeWidget->expandAll();
 
342
      arbreModalitatsJocTreeWidget->sortItems(0,Qt::AscendingOrder);
 
343
      //Seleccionam el darrer joc jugat en tancar el programa
 
344
     QSettings tipusJoc;
 
345
     bool trobat=false;
 
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();
 
354
              trobat=true;
 
355
              break;
 
356
          }
 
357
      }
 
358
      if ((! trobat) && ( arbreModalitatsJocTreeWidget->topLevelItemCount()>0)) {
 
359
          arbreModalitatsJocTreeWidget->topLevelItem(0)->setSelected(true);
 
360
          arbreModalitatsJocTreeWidget->setCurrentItem(arbreModalitatsJocTreeWidget->topLevelItem(0));
 
361
      }
 
362
     item->setText(0,tr(nomModalitatsJoc[0])+" ("+QString::number(
 
363
                arbreModalitatsJocTreeWidget->topLevelItemCount()) +")");
 
364
     }
 
365
     QApplication::setOverrideCursor(Qt::ArrowCursor);
 
366
}
 
367
 
 
368
/*
 
369
Gestiona la selecció de la modalitat de joc
 
370
quan es clica sobre l'arbre de modalitats
 
371
*/
 
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());
 
382
           jocResolt=0;
 
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));
 
385
 
 
386
           QSettings records;
 
387
           QStringList  tipusJoc = item->text(1).split(" ");
 
388
           QString record=records.value( QString("%1/record").arg(tipusJoc.value(0)) ,
 
389
                                                                 QString("0")).toString();
 
390
           if (record != "0"){
 
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();
 
402
 
 
403
           //Si les solucions estan visibles, actualitzam
 
404
          // if( solucionsDockWidget->isVisible()){veureSolucionsSlot();}
 
405
           veureSolucionsSlot();
 
406
       }
 
407
   }
 
408
}
 
409
 
 
410
 
 
411
void frmPrincipal::tradueixGUI(){
 
412
 
 
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"));
 
419
 
 
420
     solucionaJocActual->setText(tr("Resol"));
 
421
 
 
422
 
 
423
     aplicacioMenu->setTitle(tr("Programa"));
 
424
     movimentsMenu->setTitle(tr("&Moviments joc"));
 
425
     idiomaMenu->setTitle(tr("Idioma"));
 
426
     ajudaMenu->setTitle(tr("Ajuda"));
 
427
 
 
428
    setWindowTitle( tr("Solitari"));
 
429
 
 
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"));
 
437
     */
 
438
 
 
439
     tabArbres->setTabText(0,tr("Modalitats del joc"));
 
440
     tabArbres->setTabText(1,tr("Solucions"));
 
441
 
 
442
    carregaArbreModalitatsJoc();
 
443
}
 
444
 
 
445
 
 
446
void frmPrincipal::creaAcccions()
 
447
{
 
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()));
 
452
 
 
453
    veureRecordsPersonalsAction = new QAction(tr("Veure marques personals"), this);
 
454
    connect(veureRecordsPersonalsAction, SIGNAL(triggered()), this, SLOT(veureRecordsPersonals()));
 
455
 
 
456
    eliminaRecordsPersonalsAction = new QAction(tr("Elimina marques personals"), this);
 
457
    connect(eliminaRecordsPersonalsAction, SIGNAL(triggered()), this, SLOT(eliminaRecordsPersonals()));
 
458
 
 
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()));
 
463
 
 
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"));
 
469
 
 
470
    redoAction=movimentsUndoStack->createRedoAction(this);
 
471
    redoAction->setShortcut(tr("Shift+Ctrl+Z"));
 
472
    redoAction->setIcon(QIcon(directoriLinux()+QDir().separator()+DIRECTORI_IMATGES+"/edit-redo.png"));
 
473
 
 
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);
 
478
 
 
479
 
 
480
     creditsPrograma= new QAction(tr("Credits"), this);
 
481
     connect(creditsPrograma, SIGNAL(triggered()), this, SLOT(creditsProgramaSlot()));
 
482
 
 
483
     ajudaAction= new QAction(tr("Ajuda"), this);
 
484
     connect(ajudaAction, SIGNAL(triggered()), this, SLOT(ajudaSlot()));
 
485
 
 
486
 
 
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()));
 
491
 
 
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()));
 
495
     */
 
496
 
 
497
 
 
498
/* 16/10/12 Eliminats
 
499
     veureSolucions= new QAction(tr("Veure solucions"), this);
 
500
     connect(veureSolucions, SIGNAL(triggered()), this, SLOT(veureSolucionsSlot()));
 
501
    */
 
502
}
 
503
 
 
504
 
 
505
void frmPrincipal::creaBarraTasques()
 
506
{
 
507
 
 
508
    aplicacioToolBar = addToolBar("Solitari");
 
509
    aplicacioToolBar->setIconSize(QSize(22,22));
 
510
    aplicacioToolBar->addAction(surtAction);
 
511
 
 
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);
 
520
}
 
521
 
 
522
 
 
523
void frmPrincipal::creaMenus()
 
524
{
 
525
    aplicacioMenu = menuBar()->addMenu(tr("Programa"));
 
526
    aplicacioMenu->addAction(veureRecordsPersonalsAction);
 
527
    aplicacioMenu->addAction(eliminaRecordsPersonalsAction);
 
528
 
 
529
    /* 16/10/12 Eliminats
 
530
    aplicacioMenu->addSeparator();
 
531
    aplicacioMenu->addAction(veureSolucions);
 
532
    */
 
533
 
 
534
    aplicacioMenu->addSeparator();
 
535
    aplicacioMenu->addAction(surtAction);
 
536
 
 
537
    movimentsMenu= menuBar()->addMenu(tr("&Moviments joc"));
 
538
    movimentsMenu->addAction(undoAction);
 
539
    movimentsMenu->addAction(redoAction);
 
540
 
 
541
    idiomaMenu = new QMenu(tr("Idioma"));
 
542
    menuBar()->addMenu(idiomaMenu);
 
543
 
 
544
     ajudaMenu= new QMenu(tr("Ajuda"));
 
545
     menuBar()->addMenu(ajudaMenu);
 
546
     ajudaMenu->addAction(ajudaAction);
 
547
     ajudaMenu->addAction(creditsPrograma);
 
548
 
 
549
 
 
550
    creaIdiomaMenu();
 
551
}
 
552
 
 
553
void frmPrincipal::iniciSolucioSlot(int pmoviment){
 
554
    if (pmoviment>0){
 
555
    while (movimentsUndoStack->canUndo() && movimentsUndoStack->index()> pmoviment ){
 
556
        movimentsUndoStack->undo();
 
557
    }
 
558
}
 
559
    else{
 
560
        while (movimentsUndoStack->canUndo() ){
 
561
        movimentsUndoStack->undo();
 
562
    }
 
563
    }
 
564
statusBar()->clearMessage();
 
565
//iniciSolucioAction->setEnabled(movimentsUndoStack->canUndo());
 
566
}
 
567
 
 
568
//Crea el menú de selecció d'idioma de l'aplicació
 
569
void frmPrincipal::creaIdiomaMenu(){
 
570
 
 
571
    idiomaActionGroup = new QActionGroup(this);
 
572
    connect(idiomaActionGroup, SIGNAL(triggered(QAction *)), this, SLOT(canviaIdioma(QAction *)));
 
573
 
 
574
    QDir dir(directoriLinux()+QDir().separator()+DIRECTORI_LOCALES);
 
575
    QStringList arxiusIdioma = dir.entryList(QStringList("solitari_*.qm"));
 
576
 
 
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('.'));
 
581
 
 
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);
 
588
 
 
589
    idiomaMenu->addAction(action);
 
590
    idiomaActionGroup->addAction(action);
 
591
 
 
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);
 
597
       }
 
598
  }
 
599
}
 
600
 
 
601
 
 
602
void frmPrincipal::canviaIdioma(QAction *action)
 
603
{
 
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));
 
607
     tradueixGUI();
 
608
}
 
609
 
 
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()));
 
618
}
 
619
 
 
620
void frmPrincipal::closeEvent(QCloseEvent* event){
 
621
   QStringList  tipusJoc =   arbreModalitatsJocTreeWidget->selectedItems().first()->text(1).split(" ");
 
622
   QSettings().setValue("General/modalidadJoc",tipusJoc.value(0));
 
623
}
 
624
 
 
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> &copy;  "+QString("2010")+"  I. De Marchi <br/>" ));
 
631
    }
 
632
    else {
 
633
    missatge.append(QString("<p> &copy;  "+QString("2010-%1").arg(avui.year())+"  I. De Marchi" ));
 
634
    }
 
635
    missatge.append(QString(tr("Sota llicència GPL 2.0 o posterior")+"<br/>"));
 
636
 
 
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));
 
640
 
 
641
    QMessageBox::about(this,
 
642
            QString(tr("Credits del %1").arg(qApp->applicationName())),missatge);
 
643
}
 
644
 
 
645
void frmPrincipal::veureRecordsPersonals(){
 
646
    if (arbreModalitatsJocTreeWidget->topLevelItemCount()==0){ return;}
 
647
    QString missatge=QString("<h2>"+ tr("Marques personals")+"</h2>");
 
648
    QSettings records;
 
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)+
 
656
                          "    -> "+record  ))  ;
 
657
       //   missatge.append(QString("<p>"+arbreModalitatsJocTreeWidget->topLevelItem(i)->text(0)+
 
658
         //                 "    -> "+record  ))  ;
 
659
        }
 
660
    }
 
661
    QMessageBox::about(this,QString(tr("Marques personals")),missatge);
 
662
 
 
663
 
 
664
/*
 
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);
 
675
*/
 
676
}
 
677
 
 
678
/*
 
679
  Elimina tots els records personals
 
680
  */
 
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){
 
689
          QSettings records;
 
690
          records.clear();
 
691
        }
 
692
}
 
693
 
 
694
 
 
695
 
 
696
void frmPrincipal::ajudaSlot(){
 
697
 QDir dirArxiu;
 
698
 QString directori=directoriLinux()+
 
699
                            QDir().separator()+
 
700
                            DIR_HELP+
 
701
                            QDir().separator()+
 
702
                            "index.html";
 
703
 
 
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));
 
707
    }
 
708
   else  QDesktopServices::openUrl(QUrl("file:///"+directoriLinux()+
 
709
                            QDir().separator()+
 
710
                            DIR_HELP+
 
711
                            QDir().separator()+
 
712
                            "index.html", QUrl::TolerantMode));
 
713
}
 
714
 
 
715
 
 
716
void frmPrincipal::solucionaJocActual_Inicia(){
 
717
 
 
718
    QApplication::setOverrideCursor(Qt::WaitCursor);
 
719
    statusBar()->clearMessage();
 
720
 
 
721
       jocResolt=0;
 
722
       taulerJoc->solucionaJocActual_CalculaMovimentsPosibles();
 
723
 
 
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();
 
729
          iniciSolucioSlot();          
 
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();
 
737
          }
 
738
       }
 
739
       else {
 
740
           solucioJocActual_configuracioInicial.clear();
 
741
           solucioJocActual_configuracioInicial.append(taulerJoc->configuracioActual(true));
 
742
           retrocedeixMoviment=0;
 
743
           movimentsUndoStack->clear();
 
744
       }
 
745
   //    solucioJocActual_configuracioInicial.append(taulerJoc->configuracioActual(true));
 
746
 
 
747
       solucioJocActual_configuracionsEliminades.clear();
 
748
       solucioJocActual_configuracionsEliminadesPerDesar.clear();
 
749
 
 
750
       solucionaJocActual_movimentsPosiblesActuals.clear();
 
751
       carregaConfiguracionsEliminades();
 
752
 
 
753
    //   movimentsUndoStack->clear();
 
754
       solucionaJocActual_CarregaMovimentsInicialsArbre();
 
755
       qApp->processEvents();
 
756
   }
 
757
 
 
758
 
 
759
void frmPrincipal::solucionaJocActual_CarregaMovimentsInicialsArbre(){
 
760
    rellotgeLabel->iniciaRellotge();
 
761
    solucionaJocActual_comencaRecerca();
 
762
    QApplication::setOverrideCursor(Qt::ArrowCursor);
 
763
}
 
764
 
 
765
 
 
766
void frmPrincipal::solucionaJocActual_comencaRecerca(){
 
767
 
 
768
 
 
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ò
 
773
    //no el rellotge
 
774
    #if defined(Q_OS_WIN32)
 
775
        QProgressDialog progres(tr("Cercant solució"), tr("Atura"), 0,
 
776
                                              taulerJoc->numeroDeMovimentsJoc() ,this,
 
777
                                             Qt::FramelessWindowHint);
 
778
    #else
 
779
        QProgressDialog progres(tr("Cercant solució"), tr("Atura"), 0,
 
780
                                              taulerJoc->numeroDeMovimentsJoc() ,this);
 
781
    #endif
 
782
 
 
783
     progres.setWindowModality(Qt::WindowModal);
 
784
     progres.setValue(movimentsUndoStack->index()-1);
 
785
     progres.setVisible(true);
 
786
     progres.setLabelText(missatgeNumeroMoviments());
 
787
     qApp->processEvents();
 
788
 
 
789
     bool reinicia=false;
 
790
     int numMovimentsPerReiniciar=taulerJoc->numeroDeMovimentsJoc()*3;
 
791
 
 
792
     int numeroFitxesMajorConfigEliminada=0;
 
793
     int numeroMovimentsProvats=0;
 
794
 
 
795
  while (jocResolt !=2){
 
796
      solucionaJocActual_movimentsPosiblesActuals.clear();
 
797
      solucionaJocActual_movimentsPosiblesActuals.append(
 
798
              taulerJoc->solucionaJocActual_CarregaMovimentsArbre(solucionaJocActual_movimentsEliminats,
 
799
                                                               solucionaJocActual_darrerMoviment));
 
800
 
 
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() ) {
 
808
 
 
809
          int numeroItem=0;
 
810
 
 
811
          if (solucionaJocActual_movimentsPosiblesActuals.count()>1){
 
812
                  qsrand(rellotgeQTime.msecsTo(QTime::currentTime()));
 
813
                  numeroItem=qrand() % (solucionaJocActual_movimentsPosiblesActuals.count());
 
814
          }
 
815
 
 
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());
 
820
 
 
821
          ++numeroMovimentsProvats;
 
822
          progres.setValue(movimentsUndoStack->index()-1);
 
823
          progres.setLabelText(missatgeNumeroMoviments());
 
824
          qApp->processEvents();
 
825
 
 
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);
 
830
        }
 
831
      else {
 
832
 
 
833
          if (movimentsUndoStack->index() !=0 ){
 
834
              jocResolt=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);
 
844
                  reinicia=true;
 
845
              }
 
846
 
 
847
              if ( (solucionaJocActual_movimentsEliminats.indexOf(solucionaJocActual_darrerMoviment)==-1 ) &&
 
848
                   !(solucionaJocActual_darrerMoviment.isEmpty()) ){
 
849
                  solucionaJocActual_eliminaMovimentsPosteriors();
 
850
                  solucionaJocActual_movimentsEliminats.append(solucionaJocActual_darrerMoviment);
 
851
              }
 
852
 
 
853
              movimentsUndoStack->undo();
 
854
 
 
855
              progres.setValue(movimentsUndoStack->index()-1);
 
856
              progres.setLabelText(missatgeNumeroMoviments());
 
857
              if (solucionaJocActual_movimentsJaRealitzats.size()>0){
 
858
                  solucionaJocActual_movimentsJaRealitzats.removeAt(solucionaJocActual_movimentsJaRealitzats.size()-1);
 
859
              }
 
860
              solucionaJocActual_darrerMoviment=solucionaJocActual_movimentsJaRealitzats.value(
 
861
                      solucionaJocActual_movimentsJaRealitzats.size()-1);
 
862
 
 
863
 
 
864
             if ( ( ( reinicia ) &&  retrocedeixMoviment==0 &&
 
865
                  (  (numeroMovimentsProvats % numMovimentsPerReiniciar) == 0) )  ){
 
866
                     iniciSolucioSlot();
 
867
                     solucionaJocActual_movimentsJaRealitzats.clear();
 
868
                     solucionaJocActual_darrerMoviment.clear();
 
869
                     progres.setValue(0);
 
870
                     progres.setLabelText(missatgeNumeroMoviments());
 
871
                     reinicia=false;
 
872
                 }
 
873
         }
 
874
 
 
875
          else{
 
876
              rellotgeLabel->aturaRellotge();
 
877
              progres.cancel();
 
878
              desaConfiguracionsEliminades();
 
879
              statusBar()->showMessage(tr("No ha estat possible trobar una solució!"));
 
880
              return;
 
881
          }
 
882
      }
 
883
      if (progres.wasCanceled()){
 
884
           rellotgeLabel->aturaRellotge();
 
885
           desaConfiguracionsEliminades();
 
886
           solucionaJocActual_movimentsJaRealitzats.clear();
 
887
           solucionaJocActual_movimentsEliminats.clear();
 
888
          break;}
 
889
     }//final wihle
 
890
 
 
891
        if (jocResolt==2){
 
892
            progres.cancel();
 
893
            desaSolucions();
 
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();
 
905
                 */
 
906
             return;
 
907
        }
 
908
}
 
909
 
 
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(" "));
 
919
    }
 
920
    delete(darrerMoviment);
 
921
    delete(darrerMovimentEliminat);
 
922
}
 
923
 
 
924
void frmPrincipal::solucionaJocActual_eliminaConfiguracionsPosteriors(QString config){
 
925
 
 
926
   if (solucioJocActual_configuracionsEliminadesPerDesar.count()==0){
 
927
        return;}
 
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();} 
 
934
  }
 
935
  else{
 
936
      while ( (numeroConfiguracio(solucioJocActual_configuracionsEliminadesPerDesar.value(
 
937
            solucioJocActual_configuracionsEliminadesPerDesar.count()-1))>numConfiguracio) &&
 
938
            (solucioJocActual_configuracionsEliminadesPerDesar.count()>0) ){
 
939
    solucioJocActual_configuracionsEliminadesPerDesar.removeLast();}
 
940
  }
 
941
}
 
942
 
 
943
/*
 
944
  Elimina configuracions de solucioJocActual_configuracionsEliminades
 
945
  No es fa servir
 
946
 
 
947
void frmPrincipal::solucionaJocActual_eliminaConfiguracions(){
 
948
    while (solucioJocActual_configuracionsEliminades.count()>10000){
 
949
        solucioJocActual_configuracionsEliminades.removeLast();
 
950
    }
 
951
}
 
952
*/
 
953
 
 
954
 
 
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));
 
961
    }
 
962
    delete (arxiuSolucio);
 
963
    qApp->processEvents();
 
964
 
 
965
}
 
966
*/
 
967
 
 
968
/*
 
969
  Busca una solució ha partir d'una altra solució
 
970
  */
 
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();
 
985
        carregaSolucions();
 
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);
 
994
            QString mov;
 
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());}
 
1001
 
 
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);
 
1009
                 }
 
1010
            }
 
1011
        solucionaJocActual_darrerMoviment.append(mov);
 
1012
        }
 
1013
  }
 
1014
 solucionaJocActual_Inicia();
 
1015
}
 
1016
 
 
1017
 
 
1018
void frmPrincipal::desaConfiguracionsEliminades(int tipus){
 
1019
    if (solucioJocActual_configuracionsEliminadesPerDesar.count()==0){
 
1020
        return;}
 
1021
 
 
1022
    int numero=0;
 
1023
 
 
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();
 
1029
 
 
1030
    comprovaDirectoriHome();
 
1031
 
 
1032
   QString nomArxiu=nomArxiuJoc(1);
 
1033
 
 
1034
    QFile arxiu(nomArxiu);
 
1035
    bool arxiuObert=false;
 
1036
    if (tipus==0){
 
1037
        if (arxiu.open(QIODevice::Append)){arxiuObert=true;}
 
1038
    }
 
1039
    else if (arxiu.open(QIODevice::WriteOnly)){arxiuObert=true;}
 
1040
 
 
1041
      if (arxiuObert){
 
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();
 
1050
          }
 
1051
        }
 
1052
      arxiu.close();
 
1053
     }
 
1054
 
 
1055
 
 
1056
void frmPrincipal::carregaConfiguracionsEliminades(){
 
1057
    int numero=0;
 
1058
 
 
1059
    QString nomArxiu=nomArxiuJoc(1);
 
1060
 
 
1061
    QFile arxiu(nomArxiu);
 
1062
    qint64 tamanyArxiu =arxiu.size()/taulerJoc->numeroDeMovimentsJoc();
 
1063
 
 
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();
 
1069
 
 
1070
   solucioJocActual_configuracionsEliminades.clear();
 
1071
 
 
1072
    if (!arxiu.open(QIODevice::ReadOnly)){
 
1073
         }
 
1074
      else {
 
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));
 
1083
            }
 
1084
            linia0 = entrada.readLine();            
 
1085
            if (progres.wasCanceled())  break;
 
1086
        qApp->processEvents();
 
1087
         }
 
1088
      arxiu.close();
 
1089
      progres.cancel();
 
1090
      desaConfiguracionsEliminades(1);
 
1091
     }
 
1092
}
 
1093
 
 
1094
void frmPrincipal::carregaSolucions(){
 
1095
    QString nomArxiu=nomArxiuJoc(2);
 
1096
 
 
1097
    QFile arxiu(nomArxiu);
 
1098
    solucionsTrobades.clear();
 
1099
   // qDebug("Items in list: %d", solucionsTrobades.size());
 
1100
  /*  if (!arxiu.open(QIODevice::ReadOnly)){
 
1101
         }
 
1102
      else {*/
 
1103
 
 
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();
 
1111
            /* 13/01/11
 
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();
 
1116
         }
 
1117
     // qDebug("Items in list: %d", solucionsTrobades.size());
 
1118
      arxiu.close();
 
1119
     }
 
1120
}
 
1121
 
 
1122
void frmPrincipal::desaSolucions(){
 
1123
     if (solucionaJocActual_movimentsJaRealitzats.count()==0){
 
1124
        return;}
 
1125
   comprovaDirectoriHome();
 
1126
   QString nomArxiu=nomArxiuJoc(2);
 
1127
 
 
1128
    carregaSolucions();
 
1129
    QString solucioActual;
 
1130
         for(int j=0;j<solucionaJocActual_movimentsJaRealitzats.count();j++){
 
1131
            solucioActual.append(QString("%1 ").arg(solucionaJocActual_movimentsJaRealitzats.value(j) )) ;
 
1132
        }
 
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ó!");
 
1140
        }
 
1141
      arxiu.close();
 
1142
     }
 
1143
}
 
1144
 
 
1145
void frmPrincipal::desaSolucions1(){
 
1146
     if (movimentsUndoStack->count()==0){
 
1147
        return;}
 
1148
   comprovaDirectoriHome();
 
1149
   QString nomArxiu=nomArxiuJoc(2);
 
1150
 
 
1151
    carregaSolucions();
 
1152
    QString solucioActual;
 
1153
         for(int j=0;j<movimentsUndoStack->count();j++){
 
1154
            solucioActual.append(QString("%1 %2 ").
 
1155
                                arg(j+1).
 
1156
                                arg(coordenadesAMoviment(movimentsUndoStack->text(j)))) ;
 
1157
        }
 
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ó!");
 
1165
        }
 
1166
      arxiu.close();
 
1167
     }
 
1168
}
 
1169
 
 
1170
void frmPrincipal::veureSolucionsSlot(){
 
1171
 arbreSolucionsTreeWidget->clear();
 
1172
 /*
 
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);
 
1181
 */
 
1182
 
 
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);
 
1190
*/
 
1191
 
 
1192
//Carregam les solucions
 
1193
//solucionsTrobades.clear();
 
1194
carregaSolucions();
 
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();
 
1207
               item->setText(0,
 
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);
 
1213
         }
 
1214
      itemSolucio->insertChildren(0,itemsArbre);
 
1215
      itemSolucio->setText(0,tr("Solució %1").arg(numeroSolucio));
 
1216
      arbreSolucionsTreeWidget->insertTopLevelItem(numeroSolucio-1,itemSolucio);
 
1217
      ++numeroSolucio;
 
1218
      arbreModalitatsJocTreeWidget->expandAll();
 
1219
    }
 
1220
  }
 
1221
}
 
1222
else {
 
1223
    QTreeWidgetItem *itemSolucio=new QTreeWidgetItem();
 
1224
    itemSolucio->setText(0,tr("No hi ha solucions"));
 
1225
    //arbreSolucionsTreeWidget->clear();
 
1226
    arbreSolucionsTreeWidget->insertTopLevelItem(numeroSolucio-1,itemSolucio);
 
1227
}
 
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);
 
1233
}
 
1234
 
 
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);
 
1245
        iniciSolucioSlot();
 
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());
 
1254
        }
 
1255
  /* 13/01/11
 
1256
     Aquest missatge es mostrava encara que la resposta
 
1257
     fos NO*/
 
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ó. "));
 
1261
    }
 
1262
}
 
1263
}
 
1264
 
 
1265
/*
 
1266
  Converteix les dades d'un moviment en número
 
1267
  a coordenades
 
1268
  */
 
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);
 
1274
}
 
1275
 
 
1276
/*
 
1277
  Converteix les dades d'un moviment en coordenades
 
1278
  a números
 
1279
  */
 
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()).
 
1286
          arg(fitxaBotada).
 
1287
          arg(coord.cap(3).toInt()*100+coord.cap(4).toInt());
 
1288
  }
 
1289
  else {
 
1290
      return   QString("");}
 
1291
}
 
1292
 
 
1293
/*
 
1294
  Retorna el nom i directori de l'arxiu de dades/solucions del joc
 
1295
  actual.
 
1296
  tipus=1 -> arxiu amb les configuracions eliminades
 
1297
  tipus=2 -> arxiu amb les solucions
 
1298
   */
 
1299
QString frmPrincipal::nomArxiuJoc(int tipus){
 
1300
   comprovaDirectoriHome();
 
1301
   QString nomArxiu=QDir::homePath ();
 
1302
   QString extensio;
 
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));
 
1310
    return nomArxiu;
 
1311
}
 
1312
 
 
1313
/*
 
1314
  Comprova que existeix el directori /Solitari
 
1315
  en el directori d'usuari
 
1316
  */
 
1317
void frmPrincipal::comprovaDirectoriHome(){
 
1318
    QDir dirArxiu(QDir::homePath ());
 
1319
    if (!dirArxiu.exists(qApp->applicationName())){
 
1320
         dirArxiu.mkdir(qApp->applicationName());
 
1321
      }
 
1322
}
 
1323
 
 
1324
void frmPrincipal::comprovaRegistre(){
 
1325
     QSettings registre;
 
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);
 
1330
     };
 
1331
  }
 
1332
}
 
1333
 
 
1334
/*
 
1335
  Retorna la cadena amb el missatge del número de moviments realitzats
 
1336
  i total
 
1337
  */
 
1338
QString frmPrincipal::missatgeNumeroMoviments(){
 
1339
QString numMovAct=QString("%1").arg(movimentsUndoStack->index()-1);
 
1340
QString totalMovJoc=QString("%1").arg(taulerJoc->numeroDeMovimentsJoc());
 
1341
 
 
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());
 
1346
}
 
1347
 
 
1348
/*
 
1349
  Copia l'arxiu de solucions en el directori
 
1350
  de l'usuari
 
1351
  */
 
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);
 
1362
}
 
1363
 
 
1364
 //Mostra un missatge passat pel tauler del joc
 
1365
void frmPrincipal::mostraMissatge(int codi){
 
1366
    switch (codi) {
 
1367
     case 0:
 
1368
         statusBar()->showMessage(tr("No hi ha més moviments: el joc ha finalitzat!"));
 
1369
         break;
 
1370
     case 1:
 
1371
         statusBar()->showMessage(tr("Joc resolt!"));
 
1372
         break;
 
1373
     case 2:
 
1374
         QMessageBox::information(this,tr("Nova marca personal"),
 
1375
                                 tr("Heu establert un nou record personal en aquesta modalitat de joc"));
 
1376
         break;
 
1377
     case 3:
 
1378
         statusBar()->showMessage(
 
1379
                 QString(tr("Moviment %1 de %2 ")).arg(movimentsUndoStack->index()).
 
1380
                 arg(taulerJoc->numeroDeMovimentsJoc()));
 
1381
         break;
 
1382
     }
 
1383
}