implemented [partialresolution] for theme inheritance;

use it to define 800x600 in a much more compact way
This commit is contained in:
Yann Dirson 2004-12-11 01:27:22 +00:00
parent 9ea68c4a61
commit c93222e8bd
3 changed files with 121 additions and 350 deletions

View file

@ -1,5 +1,7 @@
CVS HEAD:
* added support for specifying a reference rectangle when using relative-positionning syntax in themes
* theme syntax improvements:
* added support for specifying a reference rectangle when using relative-positionning syntax
* added support for theme inheritance, to avoid duplicating mostly-unchanged code
* updated translations:
* catalan
* italian

View file

@ -10,6 +10,7 @@ height=1
name=Default
[resolution]
id=1024x768
width=1024
height=768
@ -58,6 +59,7 @@ height=768
[/panel]
[menu]
id=menu-main
title= _ "Menu"
image=lite
items=objectives,statistics,unitlist,separator,statustable,save,load,preferences,chatlog,help,quit
@ -257,6 +259,7 @@ height=768
prefix_literal=""
[/num_units]
[upkeep]
id=status-upkeep
font_size=12
ref=upkeep-icon
rect=+4,=,+40,+16
@ -266,6 +269,7 @@ height=768
prefix_literal=""
[/upkeep]
[income]
id=status-income
font_size=12
ref=income-icon
rect=+4,=,+40,+16
@ -275,12 +279,14 @@ height=768
prefix_literal=""
[/income]
[terrain]
id=status-terrain
font_size=12
rect=+5,=,+120,+16
xanchor=proportional
yanchor=fixed
[/terrain]
[position]
id=status-position
font_size=12
rect=+5,=,+105,+16
xanchor=proportional
@ -377,349 +383,51 @@ height=768
yanchor=fixed
[/unit_weapons]
[/status]
[dummy]
id=dummy2
[/dummy]
[/resolution]
[resolution]
[partialresolution]
id=800x600
inherits=1024x768
width=800
height=600
# top panel
[panel]
image=misc/top-bg.png
rect=0,0,1024,26
xanchor=top
yanchor=fixed
[/panel]
[main_map]
rect=0,26,882,768
xanchor=left
yanchor=top
[/main_map]
# rightside panel
[panel]
image=misc/rightside.png
rect=882,25,1024,309
xanchor=right
yanchor=fixed
[/panel]
[panel]
image=misc/rightside-bg.png
rect=882,309,1024,730
xanchor=right
yanchor=top
[/panel]
[panel]
image=misc/rightside-bottom.png
rect=882,730,0,768
xanchor=right
yanchor=bottom
[/panel]
[menu]
title= _ "Menu"
image=lite
[change]
id=menu-main
items=objectives,statistics,unitlist,statustable,save,load,preferences,chatlog,help,quit
rect=3,1,103,22
xanchor=fixed
yanchor=fixed
[/menu]
[/change]
[menu]
title= _ "Actions"
image=lite
items=undo,redo,cycle,speak,recruit,recall,showenemymoves,bestenemymoves,delayshroud,updateshroud,endturn
rect=105,1,205,22
xanchor=fixed
yanchor=fixed
[/menu]
[change]
id=turn-panel
rect=+65,=+1,+95,+19
[/change]
[menu]
is_context_menu=true
items=undo,redo,describeunit,renameunit,createunit,changeside,labelterrain,speak,continue,recruit,recall,delayshroud,updateshroud,cycle,endturn
[/menu]
[mini_map]
rect=892,32,1017,175
xanchor=right
yanchor=fixed
[/mini_map]
[change]
id=upkeep-panel
rect=+5,=,+100,=
[/change]
[change]
id=income-panel
rect=+5,=,+89,=
[/change]
[menu]
title= _ "End Turn"
items=endturn
rect=900,737
xanchor=right
yanchor=bottom
[/menu]
[change]
id=status-upkeep
rect=+4,=,+55,+16
[/change]
[change]
id=status-income
rect=+3,=,+45,+16
[/change]
[panel]
image=misc/status-bg.png
rect=270,2,365,21
xanchor=proportional
yanchor=fixed
[/panel]
[panel]
image=misc/status-bg.png
rect=370,2,465,21
xanchor=proportional
yanchor=fixed
[/panel]
[panel]
image=misc/status-bg.png
rect=470,2,555,21
xanchor=proportional
yanchor=fixed
[/panel]
[panel]
image=misc/status-bg.png
rect=560,2,645,21
xanchor=proportional
yanchor=fixed
[/panel]
[panel]
image=misc/status-bg.png
rect=650,2,750,21
xanchor=proportional
yanchor=fixed
[/panel]
[panel]
image=misc/status-bg.png
rect=755,2,844,21
xanchor=proportional
yanchor=fixed
[/panel]
[remove]
id=status-terrain
[/remove]
# HP/XP
[label]
font_size=10
text= _ "HP"
rect=967,234,1022,246
xanchor=right
yanchor=fixed
[/label]
[label]
font_size=10
text= _ "XP"
rect=967,260,1022,272
xanchor=right
yanchor=fixed
[/label]
# gold icon
[label]
icon=misc/gold.png
text= _ "gold"
rect=375,3,391,19
xanchor=proportional
yanchor=fixed
[/label]
# villages icon
[label]
icon=misc/villages.png
text= _ "villages"
rect=475,3,491,19
xanchor=proportional
yanchor=fixed
[/label]
# units icon
[label]
icon=misc/units.png
text= _ "units"
rect=565,3,581,19
xanchor=proportional
yanchor=fixed
[/label]
# upkeep icon
[label]
icon=misc/upkeep.png
text= _ "upkeep"
rect=655,3,687,19
xanchor=proportional
yanchor=fixed
[/label]
# income icon
[label]
icon=misc/income.png
text= _ "income"
rect=760,3,792,19
xanchor=proportional
yanchor=fixed
[/label]
[status]
# the time of day image
[time_of_day]
rect=892,184,1017,223
xanchor=right
yanchor=fixed
[/time_of_day]
[observers]
font_size=12
rect=1004,3,1020,19
xanchor=proportional
yanchor=fixed
[/observers]
#put the side playing indicator next to the turn indicator
[side_playing]
rect=273,4,288,20
xanchor=proportional
yanchor=fixed
[/side_playing]
# the game status
[turn]
font_size=12
rect=292,4,360,20
xanchor=proportional
yanchor=fixed
prefix=
prefix_literal=""
[/turn]
[gold]
font_size=12
rect=395,4,460,20
xanchor=proportional
yanchor=fixed
prefix=
prefix_literal=""
[/gold]
[villages]
font_size=12
rect=495,4,550,20
xanchor=proportional
yanchor=fixed
prefix=
prefix_literal=""
[/villages]
[num_units]
font_size=12
rect=585,4,640,20
xanchor=proportional
yanchor=fixed
prefix=
prefix_literal=""
[/num_units]
[upkeep]
font_size=12
rect=690,4,745,20
xanchor=proportional
yanchor=fixed
prefix=
prefix_literal=""
[/upkeep]
[income]
font_size=12
rect=795,4,840,20
xanchor=proportional
yanchor=fixed
prefix=
prefix_literal=""
[/income]
[comment]
[terrain]
font_size=12
rect=770,4,890,20
xanchor=proportional
yanchor=fixed
[/terrain]
[/comment]
[position]
font_size=12
rect=855,4,1000,20
xanchor=proportional
yanchor=fixed
[/position]
#unit stats here
[unit_image]
rect=891,235,963,307
xanchor=right
yanchor=fixed
[/unit_image]
[unit_description]
font_size=14
rect=891,312,1022,330
xanchor=right
yanchor=fixed
[/unit_description]
[unit_type]
font_size=12
rect=891,330,1022,346
xanchor=right
yanchor=fixed
[/unit_type]
[unit_level]
font_size=12
rect=891,346,1022,362
prefix= _ "statuspanel^level"
prefix_literal=" "
xanchor=right
yanchor=fixed
[/unit_level]
[unit_alignment]
font_size=12
rect=891,362,1022,378
xanchor=right
yanchor=fixed
[/unit_alignment]
[unit_traits]
font_size=12
rect=891,378,1022,394
xanchor=right
yanchor=fixed
[/unit_traits]
[unit_abilities]
font_size=12
rect=891,394,1022,410
xanchor=right
yanchor=fixed
[/unit_abilities]
[unit_status]
font_size=12
rect=968,289,1020,305
xanchor=right
yanchor=fixed
[/unit_status]
[unit_moves]
font_size=12
rect=891,410,1022,426
prefix= _ "statuspanel^movement"
prefix_literal=": "
xanchor=right
yanchor=fixed
[/unit_moves]
[unit_hp]
font_size=12
rect=967,246,1022,260
#prefix=hp
#prefix_literal=" "
xanchor=right
yanchor=fixed
[/unit_hp]
[unit_xp]
font_size=12
rect=967,272,1022,286
#prefix=xp
#prefix_literal=" "
xanchor=right
yanchor=fixed
[/unit_xp]
[unit_weapons]
font_size=12
#rect=900,452,1020,620
rect=891,426,1022,594
xanchor=right
yanchor=fixed
[/unit_weapons]
[/status]
[/resolution]
[change]
id=status-position
rect=+15,=,+145,+16
[/change]
[/partialresolution]
[resolution]
width=320

View file

@ -90,32 +90,93 @@ namespace {
return resolved.str();
}
const config find_ref(const std::string& id, const config& resol_cfg) {
for(config::all_children_iterator i = resol_cfg.ordered_begin();
i != resol_cfg.ordered_end(); i++) {
if ((*(*i).second)["id"] == id) {
//std::cerr << "Found a " << *(*i).first << "\n";
return *(*i).second;
}
// recursively look in children
const config c = find_ref(id, *(*i).second);
if (!c["id"].empty()) {
return c;
config empty_config = config();
config& find_ref(const std::string& id, config& cfg, bool remove = false) {
for(config::child_map::const_iterator i = cfg.all_children().begin();
i != cfg.all_children().end(); i++) {
for (config::child_list::const_iterator j = i->second.begin();
j != i->second.end(); j++) {
if ((**j)["id"] == id) {
//std::cerr << "Found a " << *(*i).first << "\n";
if (remove) {
const config* const res = cfg.find_child((*i).first,"id",id);
const size_t index = std::find((*i).second.begin(), (*i).second.end(),
res) - (*i).second.begin();
cfg.remove_child((*i).first,index);
return empty_config;
} else {
return **j;
}
}
// recursively look in children
config& c = find_ref(id, **j, remove);
if (!c["id"].empty()) {
return c;
}
}
}
// not found
return config();
return empty_config;
}
#ifdef DEBUG
// to be called from gdb
config& find_ref(const char* id, config& cfg) {
return find_ref(std::string(id),cfg);
}
#endif
config* expand_partialresolution(const config& cfg, const config& topcfg) {
// start with a copy of the declared parent
config* outcfg = new config(*topcfg.find_child("resolution", "id", cfg["inherits"]));
// override attributes
for(string_map::const_iterator j = cfg.values.begin(); j != cfg.values.end(); ++j) {
outcfg->values[j->first] = j->second;
}
// apply operations
{
const config::child_list& c = cfg.get_children("remove");
for(config::child_list::const_iterator i = c.begin(); i != c.end(); ++i) {
const config* parent;
config& target = find_ref ((**i)["id"], *outcfg, true);
}
}
{
const config::child_list& c = cfg.get_children("change");
for(config::child_list::const_iterator i = c.begin(); i != c.end(); ++i) {
config& target = find_ref ((**i)["id"], *outcfg);
for(string_map::iterator j = (**i).values.begin();
j != (**i).values.end(); ++j) {
target.values[j->first] = j->second;
}
}
}
return outcfg;
}
void do_resolve_rects(const config& cfg, config& resolved_config,
config* resol_cfg = NULL) {
const config& topcfg, config* resol_cfg = NULL) {
// recursively resolve children
for(config::all_children_iterator i = cfg.ordered_begin(); i != cfg.ordered_end(); ++i) {
const std::pair<const std::string*,const config*>& value = *i;
config& childcfg = resolved_config.add_child(*value.first);
do_resolve_rects(*value.second, childcfg,
(*value.first=="resolution") ? &childcfg : resol_cfg);
const std::string* childname = value.first;
const config* sourceconfig = value.second;
if (*value.first == "partialresolution") {
childname = new std::string("resolution");
sourceconfig = expand_partialresolution (*sourceconfig, topcfg);
//std::cerr << sourceconfig->write();
}
config& childcfg = resolved_config.add_child(*childname);
do_resolve_rects(*sourceconfig, childcfg, topcfg,
(*childname=="resolution") ? &childcfg : resol_cfg);
if (childname != value.first) delete childname;
}
// copy all key/values
@ -150,7 +211,7 @@ namespace {
config& resolve_rects(const config& cfg) {
config* newcfg = new config();
do_resolve_rects(cfg, *newcfg);
do_resolve_rects(cfg, *newcfg, cfg);
return *newcfg;
}