1
0
Fork 0

model_view_handler: use multiplayer.model + add selection popup

This commit is contained in:
mfranz 2009-01-31 19:30:31 +00:00
parent 65e4b71406
commit 8bb50c1871
3 changed files with 172 additions and 104 deletions

View file

@ -324,98 +324,80 @@ var fly_by_view_handler = {
var model_view_handler = {
init: func(node) {
me.lnr = [];
me.viewN = node;
me.list = [];
me.current = 0;
me.active = 0;
me.current = nil;
me.legendN = props.globals.initNode("/sim/current-view/model-view", "");
me.dialog = props.Node.new({ "dialog-name": "model-view" });
},
start: func {
me.lnr = [];
append(me.lnr, setlistener("/ai/models/model-added", func me.update_list()));
append(me.lnr, setlistener("/ai/models/model-removed", func me.update_list()));
me.update_list();
me.active = 1;
append(me.lnr, setlistener("/sim/signals/multiplayer-updated", func me._update_(), 1));
append(me.lnr, setlistener("/sim/signals/screenshot", func(n) {
n.getValue() ? me.dialog_close() : me.dialog_open();
}));
me.reset();
fgcommand("dialog-show", props.Node.new({ "dialog-name": "model-view" }));
me.open_dialog();
},
stop: func {
fgcommand("dialog-close", props.Node.new({ "dialog-name": "model-view" }));
me.active = 0;
me.close_dialog();
foreach (var l; me.lnr)
removelistener(l);
},
reset: func {
me.next(me.current = 0);
me.select(0);
},
update_list: func {
me.models = { "/": { node: props.globals, id: "[" ~ getprop("/sim/multiplay/callsign")~ "]" } };
foreach (var n; props.globals.getNode("/ai/models", 1).getChildren("multiplayer")) {
if (!n.getNode("valid", 1).getValue())
continue;
me.models[n.getPath()] = { node: n, id: "" };
me.scan_ident(n);
}
me.list = sort(keys(me.models), string.icmp);
},
scan_ident: func(n) {
if ((var cs = n.getNode("callsign")) == nil or !(cs = cs.getValue()))
return settimer(func me.scan_ident(n, data), 1);
var path = n.getPath();
if (contains(me.models, path)) {
me.models[path] = { node: n, id: me.ident(n) };
me.list = sort(keys(me.models), string.icmp);
}
},
next: func(v) {
me.legendN.setValue("");
if (!me.active or size(me.models) < 1)
return;
if (v)
me.current += v;
else
me.current = 0;
if (me.current < 0)
me.current = size(me.list) - 1;
elsif (me.current >= size(me.list))
me.current = 0;
var conf = me.viewN.getNode("config");
var path = me.list[me.current];
conf.getNode("eye-lat-deg-path", 1).setValue(path ~ "/position/latitude-deg");
conf.getNode("eye-lon-deg-path", 1).setValue(path ~ "/position/longitude-deg");
conf.getNode("eye-alt-ft-path", 1).setValue(path ~ "/position/altitude-ft");
conf.getNode("target-lat-deg-path", 1).setValue(path ~ "/position/latitude-deg");
conf.getNode("target-lon-deg-path", 1).setValue(path ~ "/position/longitude-deg");
conf.getNode("target-alt-ft-path", 1).setValue(path ~ "/position/altitude-ft");
me.legendN.setValue(me.models[path].id);
},
select: func(id) {
debug.dump(["select", id]);
find: func(callsign) {
forindex (var i; me.list)
if (me.models[me.list[i]].id == id)
me.current = i;
me.next(0);
me.next(i);
if (me.list[i].callsign == callsign)
return i;
return nil;
},
ident: func(n) {
var type = n.getName();
if (type == "") {
var z = getprop("/sim/chase-distance-m");
var name = getprop("/sim/multiplay/callsign");
} else {
var z = type == "carrier" ? 350 : 70;
var name = n.initNode("name", "").getValue() or n.initNode("callsign", "").getValue();
}
name = '"' ~ name ~ '"';
select: func(which) {
if (num(which) == nil)
which = me.find(which) or 0; # turn callsign into index
setprop("/sim/current-view/z-offset-m", me.offs = z);
var ac = n.getNode("sim/model/path", 1).getValue() or "";
if (ac = split(".", split("/", ac)[-1])[0])
name ~= " (" ~ ac ~ ")";
return name;
me.setup(me.list[which]);
},
next: func(step) {
var i = me.find(me.current);
i = i == nil ? 0 : math.mod(i + step, size(me.list));
me.setup(me.list[i]);
},
_update_: func {
var self = { callsign: getprop("/sim/multiplay/callsign"), model:,
node: props.globals, path: '/' };
me.list = [self] ~ multiplayer.model.list;
if (!me.find(me.current))
me.select(0);
},
setup: func(data) {
if (data.path == '/') {
var zoffset = getprop("/sim/chase-distance-m");
var ident = '[' ~ data.callsign ~ ']';
} else {
var zoffset = 70;
var ident = '"' ~ data.callsign ~ '" (' ~ data.model ~ ')';
}
me.current = data.callsign;
me.legendN.setValue(ident);
setprop("/sim/current-view/z-offset-m", zoffset);
me.viewN.getNode("config").setValues({
"eye-lat-deg-path": data.path ~ "/position/latitude-deg",
"eye-lon-deg-path": data.path ~ "/position/longitude-deg",
"eye-alt-ft-path": data.path ~ "/position/altitude-ft",
"target-lat-deg-path": data.path ~ "/position/latitude-deg",
"target-lon-deg-path": data.path ~ "/position/longitude-deg",
"target-alt-ft-path": data.path ~ "/position/altitude-ft",
});
},
open_dialog: func {
fgcommand("dialog-show", me.dialog);
},
close_dialog: func {
fgcommand("dialog-close", me.dialog);
},
};

View file

@ -0,0 +1,80 @@
<?xml version="1.0"?>
<PropertyList>
<name>model-view-select</name>
<x>46</x>
<y>33</y>
<layout>hbox</layout>
<default-padding>0</default-padding>
<nasal>
<open>
var dlg = props.globals.getNode("sim/gui/dialogs/model-view-select", 1);
dlg.getNode("open", 1).setBoolValue(1);
var maxh = getprop("sim/startup/ysize") - 50;
var gui = getprop("sim/gui/current-style");
var baseline = getprop("/sim/gui/style[" ~ gui ~ "]/fonts/gui/baseline-height") or 21;
var list = cmdarg().getNode("list");
var data = view.model_view_handler.list;
var height = size(data) * baseline;
if (height > maxh)
height = maxh;
list.getNode("pref-height").setValue(height);
list.removeChildren("value");
var entries = {};
forindex (var i; data) {
if (i == 0) {
var ident = '[' ~ data[i].callsign ~ ']';
list.getChild("value", size(data), 1).setValue(ident);
} else {
var ident = '"' ~ data[i].callsign ~ '" (' ~ data[i].model ~ ')';
list.getChild("value", i - 1, 1).setValue(ident);
}
entries[ident] = data[i].callsign;
}
var select = func {
var e = dlg.initNode("choice", "").getValue();
view.model_view_handler.select(entries[e]);
}
</open>
<close>
dlg.getNode("open").setValue(0);
</close>
</nasal>
<color>
<enabled>false</enabled>
<red>0.5</red>
<green>0.5</green>
<blue>0.5</blue>
<alpha>0.5</alpha>
</color>
<list>
<legend/>
<pref-height>100</pref-height>
<pref-width>200</pref-width>
<border>0</border>
<color>
<red>1</red>
<green>1</green>
<blue>1</blue>
<alpha>0</alpha>
</color>
<property>/sim/gui/dialogs/model-view-select/choice</property>
<binding>
<command>dialog-apply</command>
</binding>
<binding>
<command>nasal</command>
<script>select()</script>
</binding>
<binding>
<command>dialog-close</command>
</binding>
</list>
</PropertyList>

View file

@ -3,16 +3,10 @@
<PropertyList>
<name>model-view</name>
<x>5</x>
<y>5</y>
<y>3</y>
<layout>hbox</layout>
<default-padding>0</default-padding>
<params>
<enabled>false</enabled>
<width>20</width>
<height>20</height>
</params>
<color>
<enabled>false</enabled>
<red>0</red>
@ -21,23 +15,15 @@
<alpha>0</alpha>
</color>
<button-color>
<enabled>false</enabled>
<red>0.5</red>
<green>0.5</green>
<blue>0.5</blue>
<alpha>0.3</alpha>
</button-color>
<button>
<legend>&lt;</legend>
<pref-width alias="../../params/width"/>
<pref-height alias="../../params/height"/>
<pref-width>20</pref-width>
<pref-height>20</pref-height>
<color>
<red alias="../../../button-color/red"/>
<green alias="../../../button-color/green"/>
<blue alias="../../../button-color/blue"/>
<alpha alias="../../../button-color/alpha"/>
<red>0.5</red>
<green>0.5</green>
<blue>0.5</blue>
<alpha>0.3</alpha>
</color>
<binding>
<command>nasal</command>
@ -47,13 +33,13 @@
<button>
<legend>&gt;</legend>
<pref-width alias="../../params/width"/>
<pref-height alias="../../params/height"/>
<pref-width>20</pref-width>
<pref-height>20</pref-height>
<color>
<red alias="../../../button-color/red"/>
<green alias="../../../button-color/green"/>
<blue alias="../../../button-color/blue"/>
<alpha alias="../../../button-color/alpha"/>
<red>0.5</red>
<green>0.5</green>
<blue>0.5</blue>
<alpha>0.3</alpha>
</color>
<binding>
<command>nasal</command>
@ -66,7 +52,7 @@
</whatever>
<text>
<pref-width>200</pref-width>
<pref-width>0</pref-width>
<live>1</live>
<property>/sim/current-view/model-view</property>
<color>
@ -79,4 +65,24 @@
<name>HELVETICA_14</name>
</font>
</text>
<button>
<legend/>
<pref-width>200</pref-width>
<border>0</border>
<color>
<red>1</red>
<green>1</green>
<blue>1</blue>
<alpha>0</alpha>
</color>
<binding>
<command>nasal</command>
<script>
var isopen = !!getprop("sim/gui/dialogs/model-view-select/open");
var toggle = isopen ? "dialog-close" : "dialog-show";
fgcommand(toggle, props.Node.new({ "dialog-name": "model-view-select" }));
</script>
</binding>
</button>
</PropertyList>