e4758b1f2cc1451dff6257db205e89713acabbf8
[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         QSettings settings("paul","vexed");
30         settings.beginGroup("save");
31         QString savedTitle=settings.value("pack","Classic Levels").toString();
32         int savedLevelNo=settings.value("level",0).toInt();
33         loadPack(savedTitle,savedLevelNo);
34 }
35
36 MainWindow::~MainWindow()
37 {
38     delete ui;
39 }
40
41 void MainWindow::changeEvent(QEvent *e)
42 {
43     QMainWindow::changeEvent(e);
44     switch (e->type()) {
45     case QEvent::LanguageChange:
46         ui->retranslateUi(this);
47         break;
48     default:
49         break;
50     }
51 }
52
53 void MainWindow::reorient()
54 {
55
56     ui->buttonsPortrait->removeWidget(ui->prevLevel);
57     ui->buttonsPortrait->removeWidget(ui->nextLevel);
58     ui->buttonsPortrait->removeWidget(ui->reload);
59     ui->buttonsPortrait->removeWidget(ui->undo);
60
61     ui->undoLandscape->removeWidget(ui->undo);
62     ui->buttonsLandscape->removeWidget(ui->prevLevel);
63     ui->buttonsLandscape->removeWidget(ui->nextLevel);
64     ui->buttonsLandscape->removeWidget(ui->reload);
65
66     QDesktopWidget* q=QApplication::desktop();
67     if(q->height()>q->width())
68     {
69         // Portrait mode
70
71         ui->buttonsPortrait->addWidget(ui->prevLevel);
72         ui->buttonsPortrait->addWidget(ui->reload);
73         ui->buttonsPortrait->addWidget(ui->nextLevel);
74         ui->buttonsPortrait->addWidget(ui->undo);
75         //ui->buttonsPortrait->layout();
76     } else
77     {
78         ui->buttonsLandscape->insertWidget(0,ui->nextLevel,1,Qt::AlignLeft);
79         ui->buttonsLandscape->insertWidget(0,ui->reload,1,Qt::AlignLeft);
80         ui->buttonsLandscape->insertWidget(0,ui->prevLevel,1,Qt::AlignLeft);
81         ui->undoLandscape->addWidget(ui->undo);
82         //ui->buttonsLandscape->layout();
83     }
84 }
85
86 void MainWindow::loadLevel()
87 {
88     PlayField *pf=pack->levelAt(levelNo);
89     ui->playwidget->setPlayField(pf);
90     QString title;
91     QTextStream(&title)<<pf->title<<" ("<<levelNo+1<<"/"<<pack->levels.size()<<")";
92     ui->levelTitle->setText(title);
93 }
94
95 void MainWindow::loadPack(const QString& packName, int levelToLoad)
96 {
97         if(pack) delete pack;
98         QString fileName(":/packs/");
99         fileName.append(packName).append(".ini");
100         pack=new LevelPack(fileName);
101         levelNo=levelToLoad;
102         loadLevel();
103 }
104
105 void MainWindow::movesChanged(int moves)
106 {
107     PlayField *pf=pack->levelAt(levelNo);
108     const QString sol=pf->getSolution();
109     int total=sol.length()/2;
110     int score=hiscore();
111     QString q;
112     QTextStream movesBanner(&q);
113     movesBanner<<moves<<"/"<<total;
114     if(score!=9999)
115         movesBanner<<"<b>"<<score<<"</b>";
116
117     ui->moves->setText(q);
118 }
119
120 void MainWindow::solved(int moves)
121 {
122     hiscore(moves);
123     loadNextLevel();
124 }
125
126 int MainWindow::hiscore(int score)
127 {
128     QSettings settings("paul","vexed");
129     PlayField *pf=pack->levelAt(levelNo);
130     QString title=pf->title;
131     settings.beginGroup("score");
132     settings.beginGroup(pack->getTitle());
133     QString saved=settings.value(title,"9999").toString();
134     bool ok;
135     int savedMoves=saved.toInt(&ok);
136     if(!ok) savedMoves=9999;
137     if(score == -1)
138         return savedMoves;
139     if(score<savedMoves)
140         settings.setValue(title,score);
141     return score;
142 }
143
144 void MainWindow::openPreferences()
145 {
146     Preferences pref(packNames,pack->getTitle(),this);
147     if(pref.exec()==QDialog::Accepted)
148     {
149         loadPack(pref.getSelectedPack(),0);
150     }
151 }
152
153 void MainWindow::howToPlay()
154 {
155     HowToPlay h(this);
156     h.exec();
157 }
158 // save current pack and level to config
159 // they are used to restore on start
160 // TODO: save playfield (and undo?)
161 void MainWindow::saveState()
162 {
163     QSettings settings("paul","vexed");
164     settings.beginGroup("save");
165     settings.setValue("pack",pack->getTitle());
166     settings.setValue("level",levelNo);
167 }