1
0
forked from 0ad/0ad
0ad/binaries/data/mods/public/gui/session_new/selection.js
WhiteTreePaladin 786bd5d11a New basic GUI designed roughly off of AoE3 - ALPHA 1
Features:
-Basic menu and settings dialog
-New look for panel
-Multiple unit selections are now visible in GUI

This was SVN commit r7635.
2010-06-26 18:10:03 +00:00

164 lines
4.7 KiB
JavaScript

var g_ActiveSelectionColour = { r:1, g:1, b:1, a:1 };
var g_HighlightSelectionColour = { r:1, g:1, b:1, a:0.5 };
var g_InactiveSelectionColour = { r:1, g:1, b:1, a:0 };
function _setHighlight(ents, colour)
{
if (ents.length)
Engine.GuiInterfaceCall("SetSelectionHighlight", { "entities":ents, "colour":colour });
}
function _setMotionOverlay(ents, enabled)
{
if (ents.length)
Engine.GuiInterfaceCall("SetMotionDebugOverlay", { "entities":ents, "enabled":enabled });
}
//-------------------------------- -------------------------------- --------------------------------
// EntityGroups class for ordering / managing entities by their templates
//-------------------------------- -------------------------------- --------------------------------
function EntityGroups()
{
this.primary = 0;
this.groupNumbers = {};
this.firstOfType = {}; // array for holding index to first appearance of a specific unit type in g_Selection
this.groupTypeCount = {}; // format { name:count, name:count, ... } - maps units to the currently selected quantity of that type
this.groupTemplates = [];
}
EntityGroups.prototype.reset = function()
{
getGUIObjectByName("unitSelectionHighlight[" + g_Selection.groups.primary + "]").hidden = true;
this.primary = 0;
this.groupNumbers = {};
this.firstOfType = {};
this.groupTypeCount = {};
this.groupTemplates = [];
};
//-------------------------------- -------------------------------- --------------------------------
// EntitySelection class for managing the entity selection list and the primary selection
//-------------------------------- -------------------------------- --------------------------------
function EntitySelection()
{
// Private properties:
//--------------------------------
this.primary = 0; // The active selection in the unit details panel
this.selected = {}; // { id:id, id:id, ... } for each selected entity ID 'id'
// { id:id, ... } for mouseover-highlighted entity IDs in these, the key is a string and the value is an int;
// we want to use the int form wherever possible since it's more efficient to send to the simulation code)
this.highlighted = {};
this.motionDebugOverlay = false;
// Public properties:
//--------------------------------
this.groups = new EntityGroups(); // the selection entity groups must be reset whenever the selection changes
this.dirty = false; // set whenever the selection has changed
}
EntitySelection.prototype.getPrimary = function()
{
return this.primary;
};
EntitySelection.prototype.setPrimary = function(index)
{
if (g_Selection.toList().length > index)
this.primary = index;
else
console.write("\"index\" is larger than g_Selection.toList().length: Cannot set Primary Selection.");
};
EntitySelection.prototype.resetPrimary = function()
{
this.primary = 0; // the primary selection must be reset whenever the selection changes
};
EntitySelection.prototype.toggle = function(ent)
{
if (this.selected[ent])
{
_setHighlight([ent], g_InactiveSelectionColour);
_setMotionOverlay([ent], false);
delete this.selected[ent];
}
else
{
_setHighlight([ent], g_ActiveSelectionColour);
_setMotionOverlay([ent], this.motionDebugOverlay);
this.selected[ent] = ent;
}
this.dirty = true;
};
EntitySelection.prototype.addList = function(ents)
{
var added = [];
for each (var ent in ents)
{
if (!this.selected[ent])
{
added.push(ent);
this.selected[ent] = ent;
}
}
_setHighlight(added, g_ActiveSelectionColour);
_setMotionOverlay(added, this.motionDebugOverlay);
this.dirty = true;
};
EntitySelection.prototype.reset = function()
{
_setHighlight(this.toList(), g_InactiveSelectionColour);
_setMotionOverlay(this.toList(), false);
this.selected = {};
this.resetPrimary();
this.groups.reset();
this.dirty = true;
};
EntitySelection.prototype.toList = function()
{
var ents = [];
for each (var ent in this.selected)
ents.push(ent);
return ents;
};
EntitySelection.prototype.setHighlightList = function(ents)
{
var removed = [];
var added = [];
// Remove highlighting for the old units (excluding ones that are actively selected too)
for each (var ent in this.highlighted)
if (!this.selected[ent])
removed.push(ent);
// Add new highlighting
for each (var ent in ents)
if (!this.selected[ent])
added.push(ent);
_setHighlight(removed, g_InactiveSelectionColour);
_setHighlight(added, g_HighlightSelectionColour);
// TODO: this could be a bit more efficient by only changing the ones that
// have entered/left the highlight list
// Store the new list
this.highlighted = {};
for each (var ent in ents)
this.highlighted[ent] = ent;
};
EntitySelection.prototype.SetMotionDebugOverlay = function(enabled)
{
this.motionDebugOverlay = enabled;
_setMotionOverlay(this.toList(), enabled);
};
var g_Selection = new EntitySelection();