1 |
/* |
/* |
2 |
* Copyright (C) 2002 Daniel Heck |
* Copyright (C) 2002,2003 Daniel Heck |
3 |
* |
* |
4 |
* This program is free software; you can redistribute it and/or |
* This program is free software; you can redistribute it and/or |
5 |
* modify it under the terms of the GNU General Public License |
* modify it under the terms of the GNU General Public License |
14 |
* You should have received a copy of the GNU General Public License along |
* You should have received a copy of the GNU General Public License along |
15 |
* with this program; if not, write to the Free Software Foundation, Inc., |
* with this program; if not, write to the Free Software Foundation, Inc., |
16 |
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. |
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. |
17 |
|
* |
18 |
|
* $Id$ |
19 |
*/ |
*/ |
20 |
#include "video.hh" |
#include "video.hh" |
21 |
#include "menus.hh" |
#include "menus.hh" |
102 |
public: |
public: |
103 |
LevelMenu(LevelPack *lp, unsigned ilevel_pack); |
LevelMenu(LevelPack *lp, unsigned ilevel_pack); |
104 |
private: |
private: |
105 |
|
void set_levelpack (int index); |
106 |
|
|
107 |
// Menu interface. |
// Menu interface. |
108 |
void draw_background(px::GC &gc); |
void draw_background(px::GC &gc); |
109 |
|
|
120 |
Widget *newgame; |
Widget *newgame; |
121 |
Widget *back; |
Widget *back; |
122 |
Widget *m_nextlp, *m_prevlp; // Next/previous level pack |
Widget *m_nextlp, *m_prevlp; // Next/previous level pack |
123 |
Widget *m_lpbutton; // Current level pack |
TextButton *m_lpbutton; // Current level pack |
124 |
LevelWidget *levelwidget; |
LevelWidget *levelwidget; |
125 |
LevelPack *level_pack; |
LevelPack *level_pack; |
126 |
unsigned m_ilevelpack; |
unsigned m_ilevelpack; |
213 |
void |
void |
214 |
LevelWidget::next_unsolved() |
LevelWidget::next_unsolved() |
215 |
{ |
{ |
216 |
int curr = iselected; |
unsigned curr = iselected; |
217 |
int next = curr+1; |
unsigned next = curr+1; |
218 |
bool found = false; |
bool found = false; |
219 |
|
|
220 |
while (next != curr) { |
while (next != curr) { |
221 |
if (next >= level_pack->size()) next = 0; |
if (next >= level_pack->size()) next = 0; |
616 |
r.x += r.w+skip; |
r.x += r.w+skip; |
617 |
return w; |
return w; |
618 |
} |
} |
619 |
|
Widget *add (Widget *w, int width) { |
620 |
|
px::Rect rr(r.x, r.y, width, r.h); |
621 |
|
container->add(w, rr); |
622 |
|
r.x += width + skip; |
623 |
|
return w; |
624 |
|
} |
625 |
}; |
}; |
626 |
} |
} |
627 |
|
|
673 |
LevelMenu::LevelMenu(LevelPack *lp, unsigned ilevel_pack) |
LevelMenu::LevelMenu(LevelPack *lp, unsigned ilevel_pack) |
674 |
: newgame (new TextButton("Start Game", this)), |
: newgame (new TextButton("Start Game", this)), |
675 |
back (new TextButton("Back", this)), |
back (new TextButton("Back", this)), |
676 |
m_nextlp (new TextButton("Next", this)), |
m_nextlp (new TextButton(">", this)), |
677 |
m_prevlp (new TextButton("Prev", this)), |
m_prevlp (new TextButton("<", this)), |
678 |
m_lpbutton (new TextButton("Game: ", this)), |
m_lpbutton (new TextButton("Game: ", this)), |
679 |
levelwidget (new LevelWidget(lp, 4, 3)), |
levelwidget (new LevelWidget(lp, 4, 3)), |
680 |
level_pack (lp), |
level_pack (lp), |
681 |
m_ilevelpack (ilevel_pack) |
m_ilevelpack () |
682 |
{ |
{ |
683 |
|
const int |
684 |
#define BX 100 // button xsize |
BX=100, // button xsize |
685 |
#define BY 28 // button ysize |
BY=28, // button ysize |
686 |
#define SX 5 // x spacing |
SX=5, // x spacing |
687 |
#define SY 2 // y spacing |
SY=2, // y spacing |
688 |
#define OX (BX+SX) |
OX=(BX+SX), |
689 |
#define OY (BY+SY) |
OY=(BY+SY), |
690 |
#define RJ (605+SX) // right justification |
RJ=(605+SX), // right justification |
691 |
#define Y1 15 // y position for top button row |
Y1=15, // y position for top button row |
692 |
#define Y2 410 // y position for bottom button row |
Y2=410; // y position for bottom button row |
|
|
|
693 |
{ |
{ |
694 |
BuildHList hlist(this, Rect(RJ-3*OX, Y1, BX, BY), 5); |
BuildHList hlist(this, Rect(RJ-370, Y1, BX, BY), 5); |
695 |
|
hlist.add (m_prevlp, 30); |
696 |
hlist.add (m_prevlp); |
hlist.add (m_lpbutton, 300); |
697 |
hlist.add (m_lpbutton); |
hlist.add (m_nextlp, 30); |
|
hlist.add (m_nextlp); |
|
698 |
} |
} |
699 |
|
|
700 |
{ |
{ |
729 |
// add(levelwidget, Rect(10,10,600,480)); |
// add(levelwidget, Rect(10,10,600,480)); |
730 |
levelwidget->set_listener(this); |
levelwidget->set_listener(this); |
731 |
|
|
732 |
#undef BX |
set_levelpack (ilevel_pack); |
|
#undef BY |
|
|
#undef SX |
|
|
#undef SY |
|
|
#undef OX |
|
|
#undef OY |
|
|
#undef RJ |
|
|
#undef Y1 |
|
|
#undef Y2 |
|
733 |
} |
} |
734 |
|
|
735 |
bool |
bool |
770 |
levelwidget->next_unsolved(); |
levelwidget->next_unsolved(); |
771 |
} |
} |
772 |
else if (w == m_prevlp) { |
else if (w == m_prevlp) { |
773 |
if (m_ilevelpack > 0) { |
set_levelpack (m_ilevelpack-1); |
774 |
m_ilevelpack -= 1; |
} |
|
levelwidget->change_levelpack (enigma::LevelPacks[m_ilevelpack]); |
|
|
} |
|
|
} |
|
775 |
else if (w == m_nextlp) { |
else if (w == m_nextlp) { |
776 |
if (m_ilevelpack < enigma::LevelPacks.size() - 1) { |
set_levelpack (m_ilevelpack+1); |
|
m_ilevelpack += 1; |
|
|
levelwidget->change_levelpack (enigma::LevelPacks[m_ilevelpack]); |
|
|
} |
|
777 |
} |
} |
778 |
} |
} |
779 |
|
|
780 |
void |
void |
781 |
|
LevelMenu::set_levelpack (int index) |
782 |
|
{ |
783 |
|
if (index >= 0 && index < enigma::LevelPacks.size()) { |
784 |
|
m_ilevelpack = index; |
785 |
|
levelwidget->change_levelpack (enigma::LevelPacks[m_ilevelpack]); |
786 |
|
|
787 |
|
char txt[100]; |
788 |
|
snprintf (txt, sizeof(txt), "Level pack: %s", |
789 |
|
enigma::LevelPacks[index]->name().c_str()); |
790 |
|
m_lpbutton->set_text (txt); |
791 |
|
} |
792 |
|
} |
793 |
|
|
794 |
|
|
795 |
|
void |
796 |
LevelMenu::draw_background(px::GC &gc) |
LevelMenu::draw_background(px::GC &gc) |
797 |
{ |
{ |
798 |
video::SetCaption("Enigma - Level Menu"); |
video::SetCaption("Enigma - Level Menu"); |
834 |
invalidate_all(); |
invalidate_all(); |
835 |
} |
} |
836 |
|
|
837 |
if( w == back) |
if (w == back) |
838 |
Menu::quit(); |
Menu::quit(); |
839 |
} |
} |
840 |
|
|
841 |
void |
void |