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