Scenario Editor: allow to edit (all) scenario timers...

This commit is contained in:
ALONSO Laurent
2021-10-07 09:40:55 +02:00
committed by Celtic Minstrel
parent a66d6ccb99
commit 3c5f828274
2 changed files with 76 additions and 18 deletions

View File

@@ -11,7 +11,6 @@
<field name='time7' top='301' left='130' width='67' height='16'/>
<field name='time8' top='329' left='130' width='67' height='16'/>
<field name='time9' top='357' left='130' width='67' height='16'/>
<field name='time10' top='385' left='130' width='67' height='16'/>
<field name='node1' top='133' left='270' width='39' height='16'/>
<field name='node2' top='161' left='270' width='39' height='16'/>
<field name='node3' top='189' left='270' width='39' height='16'/>
@@ -21,8 +20,11 @@
<field name='node7' top='301' left='270' width='39' height='16'/>
<field name='node8' top='329' left='270' width='39' height='16'/>
<field name='node9' top='357' left='270' width='39' height='16'/>
<field name='node10' top='385' left='270' width='39' height='16'/>
<button name='okay' type='regular' top='383' left='431'>OK</button>
<text framed='true' top='125' left='120' width='310' height='252'/>
<button name='up' type='up' def-key='up' top='100' left='342'/>
<button name='down' type='down' def-key='down' top='380' left='342'/>
<button name='cancel' type='regular' top='410' left='340'>Cancel</button>
<button name='okay' type='regular' top='410' left='406'>OK</button>
<pict type='dlog' num='16' top='8' left='8'/>
<text size='large' top='6' left='50' width='256' height='17'>Scenario event timers</text>
<text top='25' left='50' width='438' height='55'>
@@ -48,7 +50,6 @@
<button name='edit7' type='large' top='299' left='324'>Create/Edit</button>
<button name='edit8' type='large' top='327' left='324'>Create/Edit</button>
<button name='edit9' type='large' top='355' left='324'>Create/Edit</button>
<button name='edit10' type='large' top='383' left='324'>Create/Edit</button>
<text top='353' left='2' width='119' height='52'>
Also, the time between events must be a multiple of 10.
</text>

View File

@@ -3102,14 +3102,64 @@ bool build_scenario() {
return true;
}
static bool save_scenario_events(cDialog& me, std::string, eKeyMod) {
if(!me.toast(true)) return true;
for(short i = 0; i < scenario.scenario_timers.size(); i++) {
std::string id = std::to_string(i + 1);
scenario.scenario_timers[i].time = me["time" + id].getTextAsNum();
scenario.scenario_timers[i].node = me["node" + id].getTextAsNum();
namespace {
struct cTimersState {
cTimersState(size_t numItems=9)
: first_item(0)
, num_items(numItems)
{
}
size_t first_item;
size_t num_items;
std::vector<cTimer> timers;
};
}
static void put_scenario_events(cDialog& me, ::cTimersState const &state)
{
size_t first_item=state.first_item;
if (first_item==0)
me["up"].hide();
else
me["up"].show();
if (first_item+state.num_items>=state.timers.size())
me["down"].hide();
else
me["down"].show();
for(size_t i = 0; first_item+i < state.timers.size() && i < state.num_items; i++) {
std::string id = std::to_string(i + 1);
me["time" + id].setTextToNum(state.timers[first_item+i].time);
me["node" + id].setTextToNum(state.timers[first_item+i].node);
}
}
static bool display_scenario_events(cDialog& me, ::cTimersState &state, std::string item, eKeyMod) {
for(size_t i = 0; state.first_item+i < state.timers.size() && i < state.num_items; i++) {
std::string id = std::to_string(i + 1);
state.timers[state.first_item+i].time = me["time" + id].getTextAsNum();
state.timers[state.first_item+i].node = me["node" + id].getTextAsNum();
}
if (item=="up") {
if (state.first_item<=0)
return false;
--state.first_item;
put_scenario_events(me, state);
return true;
}
if (item=="down") {
if (state.first_item+state.num_items>=state.timers.size())
return false;
++state.first_item;
put_scenario_events(me, state);
return true;
}
me.toast(true);
if (item!="okay")
return true;
for(size_t i = 0; i < scenario.scenario_timers.size() && i < state.timers.size(); i++)// OSNOLA
scenario.scenario_timers[i]=state.timers[i];
return true;
}
@@ -3136,19 +3186,26 @@ static bool edit_scenario_events_event_filter(cDialog& me, std::string item_hit,
void edit_scenario_events() {
using namespace std::placeholders;
size_t first_item = 0;
size_t const num_items=9;
::cTimersState state(9);
state.timers.insert(state.timers.begin(), scenario.scenario_timers.begin(), scenario.scenario_timers.end());
cDialog evt_dlg("edit-scenario-events");
evt_dlg["okay"].attachClickHandler(save_scenario_events);
// TODO: There are 20 events, not 10; allow editing the rest?
for(int i = 0; i < scenario.scenario_timers.size() && i < 10; i++) {
evt_dlg.attachClickHandlers(std::bind(display_scenario_events, _1, std::ref(state), _2, _3), {"okay", "cancel", "up", "down"});
for(int i = 0; i < scenario.scenario_timers.size() && i < num_items; i++) {
std::string id = std::to_string(i + 1);
evt_dlg["time" + id].attachFocusHandler(check_scenario_timer_time);
evt_dlg["node" + id].attachFocusHandler(std::bind(check_range_msg, _1, _2, _3, -1, scenario.scen_specials.size(), "The scenario special node", "-1 for no special"));
evt_dlg["edit" + id].attachClickHandler(edit_scenario_events_event_filter);
evt_dlg["time" + id].setTextToNum(scenario.scenario_timers[i].time);
evt_dlg["node" + id].setTextToNum(scenario.scenario_timers[i].node);
}
for(int i = state.timers.size(); i < num_items; i++) {
std::string id = std::to_string(i + 1);
evt_dlg["edit" + id].hide();
evt_dlg["time" + id].hide();
evt_dlg["node" + id].hide();
}
put_scenario_events(evt_dlg, state);
evt_dlg.run();
}