38 |
using namespace px; |
using namespace px; |
39 |
using namespace OxydLib; |
using namespace OxydLib; |
40 |
|
|
41 |
|
|
42 |
|
//---------------------------------------------------------------------- |
43 |
|
// Helper classes |
44 |
|
//---------------------------------------------------------------------- |
45 |
|
namespace |
46 |
|
{ |
47 |
|
class BuildVList { |
48 |
|
Rect r; |
49 |
|
Menu *container; |
50 |
|
int skip; |
51 |
|
public: |
52 |
|
BuildVList(Menu *cc, const px::Rect &rr, int s) |
53 |
|
: r(rr), container(cc), skip(s) |
54 |
|
{} |
55 |
|
|
56 |
|
Widget *add(Widget *w) { |
57 |
|
container->add(w, r); |
58 |
|
r.y += r.h+skip; |
59 |
|
return w; |
60 |
|
} |
61 |
|
|
62 |
|
Rect pos() const { return r; } |
63 |
|
}; |
64 |
|
|
65 |
|
class VTableBuilder { |
66 |
|
Menu *m_menu; |
67 |
|
px::Rect m_widgetsize; |
68 |
|
int m_hspacing, m_vspacing; |
69 |
|
vector<Widget *> m_widgets; |
70 |
|
int m_maxheight; |
71 |
|
public: |
72 |
|
VTableBuilder (Menu *menu, const px::Rect &widgetsize, |
73 |
|
int vspacing, int hspacing, int max_height) |
74 |
|
: m_menu(menu), m_widgetsize(widgetsize) |
75 |
|
{ |
76 |
|
m_hspacing = hspacing; |
77 |
|
m_vspacing = vspacing; |
78 |
|
m_maxheight = max_height; |
79 |
|
} |
80 |
|
|
81 |
|
Widget *add (Widget *w) { |
82 |
|
m_widgets.push_back(w); |
83 |
|
return w; |
84 |
|
} |
85 |
|
|
86 |
|
void finish() { |
87 |
|
if (m_widgets.empty()) |
88 |
|
return; |
89 |
|
int ncolumns = m_widgets.size() / m_maxheight; |
90 |
|
int nrows = m_widgets.size() / ncolumns; |
91 |
|
int i=0; |
92 |
|
int x=0; |
93 |
|
for (int col = 0; col < ncolumns; col++) { |
94 |
|
int y=0; |
95 |
|
for (int row=0; row < nrows; row++, i++) { |
96 |
|
if (i == (int)m_widgets.size()) |
97 |
|
goto done; |
98 |
|
px::Rect rr(x, y, m_widgetsize.w, m_widgetsize.h); |
99 |
|
m_menu->add(m_widgets[i], rr); |
100 |
|
// m_widgets[i]->move (x, y); |
101 |
|
y += m_widgetsize.h + m_vspacing; |
102 |
|
} |
103 |
|
x += m_widgetsize.w + m_hspacing; |
104 |
|
} |
105 |
|
done: |
106 |
|
return; |
107 |
|
} |
108 |
|
}; |
109 |
|
|
110 |
|
class BuildHList { |
111 |
|
Rect r; |
112 |
|
Menu *container; |
113 |
|
int skip; |
114 |
|
public: |
115 |
|
BuildHList(Menu *cc, const px::Rect &rr, int s) |
116 |
|
: r(rr), container(cc), skip(s) |
117 |
|
{} |
118 |
|
|
119 |
|
Widget * add(Widget *w) { |
120 |
|
container->add(w, r); |
121 |
|
r.x += r.w+skip; |
122 |
|
return w; |
123 |
|
} |
124 |
|
Widget *add (Widget *w, int width) { |
125 |
|
px::Rect rr(r.x, r.y, width, r.h); |
126 |
|
container->add(w, rr); |
127 |
|
r.x += width + skip; |
128 |
|
return w; |
129 |
|
} |
130 |
|
|
131 |
|
Rect pos() const { return r; } |
132 |
|
}; |
133 |
|
} |
134 |
|
|
135 |
namespace |
namespace |
136 |
{ |
{ |
137 |
|
|
214 |
}; |
}; |
215 |
|
|
216 |
|
|
217 |
|
class LevelPackMenu : public Menu { |
218 |
|
public: |
219 |
|
LevelPackMenu(); |
220 |
|
|
221 |
|
void on_action(Widget *w); |
222 |
|
void draw_background(px::GC &gc); |
223 |
|
int get_selection() const { return m_selection; } |
224 |
|
|
225 |
|
private: |
226 |
|
vector<Widget *> buttons; |
227 |
|
int m_selection; |
228 |
|
}; |
229 |
|
|
230 |
|
|
231 |
class LevelMenu; |
class LevelMenu; |
232 |
|
|
233 |
class LevelWidget : public Widget { |
class LevelWidget : public Widget { |
400 |
}; |
}; |
401 |
} |
} |
402 |
|
|
403 |
|
|
404 |
|
//---------------------------------------------------------------------- |
405 |
|
// Level pack menu |
406 |
|
//---------------------------------------------------------------------- |
407 |
|
|
408 |
|
LevelPackMenu::LevelPackMenu() |
409 |
|
: m_selection(-1) |
410 |
|
{ |
411 |
|
VTableBuilder builder(this, Rect(0,0,150,40), 5,5, 4); |
412 |
|
|
413 |
|
for (unsigned i=0; i<enigma::LevelPacks.size(); ++i) { |
414 |
|
LevelPack *lp = enigma::LevelPacks[i]; |
415 |
|
buttons.push_back(builder.add(new TextButton(lp->get_name(), this))); |
416 |
|
} |
417 |
|
builder.finish(); |
418 |
|
} |
419 |
|
|
420 |
|
void |
421 |
|
LevelPackMenu::on_action(Widget *w) |
422 |
|
{ |
423 |
|
for (unsigned i=0; i<buttons.size(); ++i) |
424 |
|
if (buttons[i]==w) { |
425 |
|
m_selection = i; |
426 |
|
Menu::quit(); |
427 |
|
} |
428 |
|
} |
429 |
|
|
430 |
|
void |
431 |
|
LevelPackMenu::draw_background(px::GC &gc) |
432 |
|
{ |
433 |
|
video::SetCaption("Enigma - Level Pack Menu"); |
434 |
|
// sound::PlayMusic("sound/menu.s3m"); |
435 |
|
|
436 |
|
blit(gc, 0,0, enigma::GetImage("menu_bg")); |
437 |
|
} |
438 |
|
|
439 |
|
|
440 |
//---------------------------------------------------------------------- |
//---------------------------------------------------------------------- |
441 |
// LevelWidget implementation |
// LevelWidget implementation |
442 |
//---------------------------------------------------------------------- |
//---------------------------------------------------------------------- |
1119 |
|
|
1120 |
|
|
1121 |
//---------------------------------------------------------------------- |
//---------------------------------------------------------------------- |
|
// Helper classes |
|
|
//---------------------------------------------------------------------- |
|
|
namespace |
|
|
{ |
|
|
class BuildVList { |
|
|
Rect r; |
|
|
Menu *container; |
|
|
int skip; |
|
|
public: |
|
|
BuildVList(Menu *cc, const px::Rect &rr, int s) |
|
|
: r(rr), container(cc), skip(s) |
|
|
{} |
|
|
|
|
|
Widget * add(Widget *w) { |
|
|
container->add(w, r); |
|
|
r.y += r.h+skip; |
|
|
return w; |
|
|
} |
|
|
|
|
|
Rect pos() const { return r; } |
|
|
}; |
|
|
|
|
|
class BuildHList { |
|
|
Rect r; |
|
|
Menu *container; |
|
|
int skip; |
|
|
public: |
|
|
BuildHList(Menu *cc, const px::Rect &rr, int s) |
|
|
: r(rr), container(cc), skip(s) |
|
|
{} |
|
|
|
|
|
Widget * add(Widget *w) { |
|
|
container->add(w, r); |
|
|
r.x += r.w+skip; |
|
|
return w; |
|
|
} |
|
|
Widget *add (Widget *w, int width) { |
|
|
px::Rect rr(r.x, r.y, width, r.h); |
|
|
container->add(w, rr); |
|
|
r.x += width + skip; |
|
|
return w; |
|
|
} |
|
|
|
|
|
Rect pos() const { return r; } |
|
|
}; |
|
|
} |
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------- |
|
1122 |
// Options menu |
// Options menu |
1123 |
//---------------------------------------------------------------------- |
//---------------------------------------------------------------------- |
1124 |
OptionsMenu::OptionsMenu(px::Surface *background_) |
OptionsMenu::OptionsMenu(px::Surface *background_) |
1333 |
} else if (w == m_nextlp) { |
} else if (w == m_nextlp) { |
1334 |
set_levelpack (m_ilevelpack+1); |
set_levelpack (m_ilevelpack+1); |
1335 |
} else if (w == m_lpbutton) { |
} else if (w == m_lpbutton) { |
1336 |
set_levelpack ((m_ilevelpack+1) % enigma::LevelPacks.size()); |
LevelPackMenu lpm; |
1337 |
|
lpm.center(video::GetScreen()); |
1338 |
|
if (lpm.manage(video::GetScreen())) { |
1339 |
|
set_levelpack(lpm.get_selection()); |
1340 |
|
} |
1341 |
|
invalidate_all(); |
1342 |
|
// set_levelpack ((m_ilevelpack+1) % enigma::LevelPacks.size()); |
1343 |
} |
} |
1344 |
} |
} |
1345 |
|
|