86 |
return (ifirst << 4) | (iselected-ifirst); |
return (ifirst << 4) | (iselected-ifirst); |
87 |
} |
} |
88 |
void set_position(int pos) { |
void set_position(int pos) { |
89 |
int first = pos >> 4; |
int new_first = pos >> 4; |
90 |
set_selected(first, first+(pos & 0xf)); |
int off = pos&0xf; |
91 |
|
int new_sel = new_first+off; |
92 |
|
assert(off >= 0 && off < 12); // 12 levels per page |
93 |
|
set_selected(new_first, new_sel); |
94 |
} |
} |
95 |
|
|
96 |
private: |
private: |
373 |
LevelWidget::set_selected (int newfirst, int newsel) |
LevelWidget::set_selected (int newfirst, int newsel) |
374 |
{ |
{ |
375 |
int numlevels = static_cast<int>(level_pack->size()); |
int numlevels = static_cast<int>(level_pack->size()); |
376 |
newsel = Clamp(newsel, 0, numlevels-1); |
newsel = Clamp(newsel, 0, numlevels-1); |
377 |
|
|
378 |
if (newsel < newfirst) |
if (newsel < newfirst) |
379 |
newfirst = (newsel/width)*width; |
newfirst = (newsel/width)*width; |
380 |
if (newsel >= newfirst+width*height) |
if (newsel >= newfirst+width*height) |
381 |
newfirst = (newsel/width-2)*width; |
newfirst = (newsel/width-2)*width; |
382 |
|
|
383 |
newfirst = Clamp(newfirst, 0, numlevels-1); |
newfirst = Clamp(newfirst, 0, numlevels-1); |
384 |
|
|
385 |
|
int oldsel = iselected; |
386 |
if (newfirst != ifirst) { |
if (newfirst != ifirst) { |
|
sound::PlaySound("menumove"); |
|
|
if (iselected != newsel) sound::PlaySound("menuswitch"); |
|
387 |
ifirst = newfirst; |
ifirst = newfirst; |
388 |
iselected = newsel; |
iselected = newsel; |
389 |
redraw(); |
|
390 |
|
if (!areas.empty()) { |
391 |
|
sound::PlaySound("menumove"); |
392 |
|
if (oldsel != newsel) sound::PlaySound("menuswitch"); |
393 |
|
redraw(); |
394 |
|
} |
395 |
} |
} |
396 |
else if (newsel != iselected) { |
else if (newsel != iselected) { |
397 |
sound::PlaySound("menuswitch"); |
iselected = newsel; |
|
int oldsel = iselected; |
|
|
iselected = newsel; |
|
398 |
|
|
399 |
redraw(areas[oldsel-ifirst]); // old selection |
if (!areas.empty()) { |
400 |
redraw(areas[iselected-ifirst]); // new selection |
sound::PlaySound("menuswitch"); |
401 |
|
redraw(areas[oldsel-ifirst]); // old selection |
402 |
|
redraw(areas[iselected-ifirst]); // new selection |
403 |
|
} |
404 |
} |
} |
405 |
} |
} |
406 |
|
|
1023 |
levelwidget->set_listener(this); |
levelwidget->set_listener(this); |
1024 |
|
|
1025 |
set_position(pos); |
set_position(pos); |
1026 |
// set_levelpack (ilevel_pack); |
update_info(); |
1027 |
} |
} |
1028 |
|
|
1029 |
bool |
bool |