model_view_handler: use multiplayer.model + add selection popup
This commit is contained in:
parent
65e4b71406
commit
8bb50c1871
3 changed files with 172 additions and 104 deletions
134
Nasal/view.nas
134
Nasal/view.nas
|
@ -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);
|
||||
},
|
||||
};
|
||||
|
||||
|
|
80
gui/dialogs/model-view-select.xml
Normal file
80
gui/dialogs/model-view-select.xml
Normal 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>
|
|
@ -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><</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>></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>
|
||||
|
|
Loading…
Add table
Reference in a new issue