87 |
if (m_widgets.empty()) |
if (m_widgets.empty()) |
88 |
return; |
return; |
89 |
int ncolumns = m_widgets.size() / m_maxheight; |
int ncolumns = m_widgets.size() / m_maxheight; |
90 |
int nrows = m_widgets.size() / ncolumns; |
int nrows = (m_widgets.size() + ncolumns - 1) / ncolumns; |
91 |
int i=0; |
int i=0; |
92 |
int x=0; |
int x=0; |
93 |
for (int col = 0; col < ncolumns; col++) { |
for (int col = 0; col < ncolumns; col++) { |
154 |
LevelPreviewCacheElem& operator = (const LevelPreviewCacheElem& other); |
LevelPreviewCacheElem& operator = (const LevelPreviewCacheElem& other); |
155 |
public: |
public: |
156 |
LevelPreviewCacheElem(LevelPack *lp, unsigned idx_, int xsize, int ysize) |
LevelPreviewCacheElem(LevelPack *lp, unsigned idx_, int xsize, int ysize) |
157 |
: surface(0) , idx(idx_) |
: surface(0) , idx(idx_) |
158 |
{ |
{ |
159 |
surface = LevelPreview(lp, idx); // do not free, points to BackBuffer |
surface = LevelPreview(lp, idx); // do not free, points to BackBuffer |
160 |
if (surface) { |
if (surface) { |
243 |
listener = al; |
listener = al; |
244 |
} |
} |
245 |
void trigger_action() { |
void trigger_action() { |
|
const LevelInfo *levelinfo = level_pack->get_info(iselected); |
|
|
LevelStatus *ls = GetLevelStatus(level_pack->get_name(), levelinfo->filename); |
|
246 |
|
|
247 |
if (iselected <= max_available || (ls && ls->finished >= Difficulty)) { |
cache.clear(); |
248 |
cache.clear(); |
if (listener) { |
249 |
if (listener) { |
listener->on_action(this); |
250 |
listener->on_action(this); |
recalc_available(); |
|
recalc_available(); |
|
|
} |
|
|
} |
|
|
else { |
|
|
show_text("You are not allowed to play this level yet."); |
|
251 |
} |
} |
252 |
} |
} |
253 |
|
|
539 |
const int hgap = Max(0, (get_w() - width*buttonw) / (width-1)); |
const int hgap = Max(0, (get_w() - width*buttonw) / (width-1)); |
540 |
const int vgap = Max(0, (get_h() - height*buttonh)/ (height-1)); |
const int vgap = Max(0, (get_h() - height*buttonh)/ (height-1)); |
541 |
|
|
542 |
Font *smallfnt = enigma::GetFont("levelmenu"); |
Font *smallfnt = enigma::GetFont("levelmenu"); |
543 |
Surface *img_easy = enigma::GetImage("completed-easy"); |
|
544 |
Surface *img_hard = enigma::GetImage("completed"); |
Surface *img_easy = enigma::GetImage("completed-easy"); |
545 |
Surface *img_changed = enigma::GetImage("changed"); |
Surface *img_hard = enigma::GetImage("completed"); |
546 |
Surface *img_error = enigma::GetImage("error"); |
Surface *img_changed = enigma::GetImage("changed"); |
547 |
|
Surface *img_error = enigma::GetImage("error"); |
548 |
Surface *img_unavailable = enigma::GetImage("unavailable"); |
Surface *img_unavailable = enigma::GetImage("unavailable"); |
549 |
Surface *img_unknown = enigma::GetImage("unknown"); |
Surface *img_unknown = enigma::GetImage("unknown"); |
550 |
|
|
551 |
unsigned i=ifirst; // level index |
unsigned i=ifirst; // level index |
552 |
for (int y=0; y<height; y++) |
for (int y=0; y<height; y++) |
608 |
} |
} |
609 |
|
|
610 |
// Shade unavailable levels |
// Shade unavailable levels |
611 |
if (i > (unsigned)max_available && finished<Difficulty) |
if (LevelIsLocked(level_pack, i)) |
612 |
blit (gc, imgx, imgy, img_unavailable); |
blit (gc, imgx, imgy, img_unavailable); |
613 |
|
|
614 |
// Draw solved/changed icons on top of level preview |
// Draw solved/changed icons on top of level preview |
629 |
} |
} |
630 |
} |
} |
631 |
done_painting: |
done_painting: |
632 |
// Remove unused areas (if any) from the list |
m_areas.resize (i-ifirst); // Remove unused areas (if any) from the list |
|
// // `i' is the index of the last displayed level |
|
|
// while (ifirst + areas.size() > i) |
|
|
// areas.pop_back(); |
|
|
m_areas.resize (i-ifirst); |
|
633 |
return; |
return; |
634 |
} |
} |
635 |
|
|
1303 |
{ |
{ |
1304 |
if (w == newgame || w==levelwidget) { |
if (w == newgame || w==levelwidget) { |
1305 |
int ilevel = levelwidget->selected_level(); |
int ilevel = levelwidget->selected_level(); |
1306 |
ilevel = StartGame(enigma::LevelPacks[m_ilevelpack], ilevel); |
|
1307 |
invalidate_all(); |
LevelPack *lp = enigma::LevelPacks[m_ilevelpack]; |
1308 |
levelwidget->set_current(ilevel); |
if (!LevelIsLocked (lp, ilevel)) |
1309 |
|
{ |
1310 |
|
ilevel = StartGame(lp, ilevel); |
1311 |
|
invalidate_all(); |
1312 |
|
levelwidget->set_current(ilevel); |
1313 |
|
} |
1314 |
|
else |
1315 |
|
show_text("You are not allowed to play this level yet."); |
1316 |
} else if (w == back) { |
} else if (w == back) { |
1317 |
Menu::quit(); |
Menu::quit(); |
1318 |
} else if (w == pgup) { |
} else if (w == pgup) { |