43 |
|
|
44 |
typedef Cache<px::Surface*, ImageAlloc> ImageCache; |
typedef Cache<px::Surface*, ImageAlloc> ImageCache; |
45 |
|
|
46 |
|
class LevelMenu; |
47 |
|
|
48 |
class LevelWidget : public Widget { |
class LevelWidget : public Widget { |
49 |
public: |
public: |
78 |
void next_unsolved(); |
void next_unsolved(); |
79 |
|
|
80 |
bool on_event(const SDL_Event &e); |
bool on_event(const SDL_Event &e); |
81 |
|
|
82 |
|
LevelMenu *get_menu(); |
83 |
|
|
84 |
private: |
private: |
85 |
// Private functions. |
// Private functions. |
86 |
void scroll_up(int lines); |
void scroll_up(int lines); |
105 |
class LevelMenu : public Menu { |
class LevelMenu : public Menu { |
106 |
public: |
public: |
107 |
LevelMenu(LevelPack *lp, unsigned ilevel_pack); |
LevelMenu(LevelPack *lp, unsigned ilevel_pack); |
108 |
|
|
109 |
|
// rotate through levelpacks |
110 |
|
void next_levelpack() { |
111 |
|
int next_pack = m_ilevelpack+1; |
112 |
|
if (next_pack == enigma::LevelPacks.size()) next_pack = 0; |
113 |
|
set_levelpack(next_pack); |
114 |
|
} |
115 |
|
|
116 |
private: |
private: |
117 |
void set_levelpack (int index); |
void set_levelpack (int index); |
118 |
|
|
134 |
Widget *m_nextlp, *m_prevlp; // Next/previous level pack |
Widget *m_nextlp, *m_prevlp; // Next/previous level pack |
135 |
TextButton *m_lpbutton; // Current level pack |
TextButton *m_lpbutton; // Current level pack |
136 |
LevelWidget *levelwidget; |
LevelWidget *levelwidget; |
137 |
LevelPack *level_pack; |
LevelPack *level_pack; |
138 |
unsigned m_ilevelpack; |
unsigned m_ilevelpack; |
139 |
|
|
140 |
}; |
}; |
141 |
|
|
142 |
class LevelPackMenu : public Menu { |
class LevelPackMenu : public Menu { |
187 |
listener(0) |
listener(0) |
188 |
{} |
{} |
189 |
|
|
190 |
|
LevelMenu * |
191 |
|
LevelWidget::get_menu() { |
192 |
|
Menu *menu = Widget::get_menu(); |
193 |
|
if (menu) return dynamic_cast<LevelMenu*>(menu); |
194 |
|
assert(0); |
195 |
|
return 0; |
196 |
|
} |
197 |
|
|
198 |
void |
void |
199 |
LevelWidget::scroll_up(int nlines) |
LevelWidget::scroll_up(int nlines) |
200 |
{ |
{ |
429 |
// level_pack.init(); |
// level_pack.init(); |
430 |
redraw(); |
redraw(); |
431 |
break; |
break; |
432 |
|
|
433 |
|
case SDLK_n: |
434 |
|
next_unsolved(); |
435 |
|
break; |
436 |
|
|
437 |
case SDLK_o: // Show/hide "todo" levels |
case SDLK_o: // Show/hide "todo" levels |
438 |
break; |
break; |
439 |
|
|
440 |
case SDLK_LEFT: set_current (iselected-1); break; |
case SDLK_LEFT: set_current (iselected-1); break; |
441 |
case SDLK_RIGHT: set_current (iselected+1); break; |
case SDLK_RIGHT: set_current (iselected+1); break; |
442 |
case SDLK_DOWN: set_current (iselected+width); break; |
case SDLK_DOWN: set_current (iselected+width); break; |
446 |
case SDLK_HOME: start(); break; |
case SDLK_HOME: start(); break; |
447 |
case SDLK_END: end(); break; |
case SDLK_END: end(); break; |
448 |
|
|
449 |
|
case SDLK_F1: |
450 |
|
// @@@ FIXME: show help |
451 |
|
break; |
452 |
|
|
453 |
|
case SDLK_SPACE: { |
454 |
|
LevelMenu *lmenu = get_menu(); |
455 |
|
if (lmenu) { |
456 |
|
lmenu->next_levelpack(); |
457 |
|
} |
458 |
|
break; |
459 |
|
} |
460 |
case SDLK_RETURN: |
case SDLK_RETURN: |
461 |
trigger_action(); |
trigger_action(); |
462 |
break; |
break; |
718 |
level_pack (lp), |
level_pack (lp), |
719 |
m_ilevelpack () |
m_ilevelpack () |
720 |
{ |
{ |
721 |
const int |
const int |
722 |
BX=100, // button xsize |
BX=100, // button xsize |
723 |
BY=28, // button ysize |
BY=28, // button ysize |
724 |
SX=5, // x spacing |
SX=5, // x spacing |
809 |
} |
} |
810 |
else if (w == m_prevlp) { |
else if (w == m_prevlp) { |
811 |
set_levelpack (m_ilevelpack-1); |
set_levelpack (m_ilevelpack-1); |
812 |
} |
} |
813 |
else if (w == m_nextlp) { |
else if (w == m_nextlp) { |
814 |
set_levelpack (m_ilevelpack+1); |
set_levelpack (m_ilevelpack+1); |
815 |
} |
} |