You have to solve current level before advance
[vexed] / mainwindow.cpp
1 #include "mainwindow.h"
2 #include "ui_mainwindow.h"
3 #include "preferences.h"
4 #include "howtoplay.h"
5 #include "needadvance.h"
6
7 MainWindow::MainWindow(QWidget *parent) :
8     QMainWindow(parent),
9     levelNo(0),
10     ui(new Ui::MainWindow)
11
12 {
13         ui->setupUi(this);
14 #ifdef Q_WS_MAEMO_5
15         setAttribute(Qt::WA_Maemo5AutoOrientation);
16         QDesktopWidget* q=QApplication::desktop();
17         connect(q,SIGNAL(resized(int)),this,SLOT(reorient()));
18 #endif
19         QDir packDir(":/packs");
20         QStringList packList=packDir.entryList();
21
22         QListIterator<QString> packNamesI(packList);
23         while(packNamesI.hasNext())
24         {
25                 QString packName=packNamesI.next().section(".",0,0);
26                 packNames+=packName;
27         }
28
29         pack=0;
30         loadPack(Settings().savedPackName(),Settings().savedLevelNo());
31 }
32
33 MainWindow::~MainWindow()
34 {
35     delete ui;
36 }
37
38 void MainWindow::changeEvent(QEvent *e)
39 {
40     QMainWindow::changeEvent(e);
41     switch (e->type()) {
42     case QEvent::LanguageChange:
43         ui->retranslateUi(this);
44         break;
45     default:
46         break;
47     }
48 }
49
50 void MainWindow::reorient()
51 {
52
53     ui->buttonsPortrait->removeWidget(ui->prevLevel);
54     ui->buttonsPortrait->removeWidget(ui->nextLevel);
55     ui->buttonsPortrait->removeWidget(ui->reload);
56     ui->buttonsPortrait->removeWidget(ui->undo);
57
58     ui->undoLandscape->removeWidget(ui->undo);
59     ui->buttonsLandscape->removeWidget(ui->prevLevel);
60     ui->buttonsLandscape->removeWidget(ui->nextLevel);
61     ui->buttonsLandscape->removeWidget(ui->reload);
62
63     QDesktopWidget* q=QApplication::desktop();
64     if(q->height()>q->width())
65     {
66         // Portrait mode
67
68         ui->buttonsPortrait->addWidget(ui->prevLevel);
69         ui->buttonsPortrait->addWidget(ui->reload);
70         ui->buttonsPortrait->addWidget(ui->nextLevel);
71         ui->buttonsPortrait->addWidget(ui->undo);
72         //ui->buttonsPortrait->layout();
73     } else
74     {
75         ui->buttonsLandscape->insertWidget(0,ui->nextLevel,1,Qt::AlignLeft);
76         ui->buttonsLandscape->insertWidget(0,ui->reload,1,Qt::AlignLeft);
77         ui->buttonsLandscape->insertWidget(0,ui->prevLevel,1,Qt::AlignLeft);
78         ui->undoLandscape->addWidget(ui->undo);
79         //ui->buttonsLandscape->layout();
80     }
81 }
82
83 void MainWindow::loadLevel()
84 {
85     PlayField *pf=pack->levelAt(levelNo);
86     ui->playwidget->setPlayField(pf);
87     QString title;
88     QTextStream(&title)<<pf->title<<" ("<<levelNo+1<<" of "<<pack->levels.size()<<")";
89     levelHiscore=Settings().getHighscore(pack->getTitle(),pf->title);
90     ui->levelTitle->setText(title);
91     movesChanged(0);
92 }
93
94 void MainWindow::loadPack(const QString& packName, int levelToLoad)
95 {
96         if(pack) delete pack;
97         QString fileName(":/packs/");
98         fileName.append(packName).append(".ini");
99         pack=new LevelPack(fileName);
100         levelNo=levelToLoad;
101         loadLevel();
102 }
103
104 void MainWindow::movesChanged(int moves)
105 {
106     PlayField *pf=pack->levelAt(levelNo);
107     const QString sol=pf->getSolution();
108     int total=sol.length()/2;
109     //int score=Settings().getHighscore(pack->getTitle(),pf->title);
110     QString q;
111     QTextStream movesBanner(&q);
112     movesBanner<<moves<<"/"<<total;
113     if(levelHiscore!=HS::NO_SCORE)
114         movesBanner<<"(<b>"<<levelHiscore<<"</b>)";
115     ui->moves->setText(q);
116 }
117
118 void MainWindow::solved(int moves)
119 {
120     PlayField *pf=pack->levelAt(levelNo);
121     Settings().saveHiscore(pack->getTitle(),pf->title, moves);
122     levelHiscore=moves;
123     loadNextLevel();
124 }
125
126 void MainWindow::openPreferences()
127 {
128     Preferences pref(packNames,pack->getTitle(),this);
129     if(pref.exec()==QDialog::Accepted)
130     {
131         loadPack(pref.getSelectedPack(),0);
132     }
133 }
134
135 void MainWindow::howToPlay()
136 {
137     HowToPlay h(this);
138     h.exec();
139 }
140 // save current pack and level to config
141 // they are used to restore on start
142 // TODO: save playfield (and undo?)
143 void MainWindow::saveState()
144 {
145     Settings().saveGame(pack->getTitle(),levelNo);
146 }
147
148 void MainWindow::loadNextLevel()
149 {
150     if(levelHiscore == HS::NO_SCORE)
151     {
152         needadvance().exec();
153         return;
154     }
155     if(levelNo<(pack->size()-1))
156     {
157         levelNo++;
158         loadLevel();
159     }
160 }