168 lines
4.5 KiB
Lua
168 lines
4.5 KiB
Lua
--
|
|
-- Load a resizable 1-d frame. p contains an odd number of parts.
|
|
-- Even parts are resized; odd parts are not (unless the requested
|
|
-- width is too small). The frame is centered on the midway part
|
|
-- of p; parts to the left and right are anchored on the inside.
|
|
--
|
|
-- A 3-part frame; the center third is dynamic, expanding outwards
|
|
-- in both directions:
|
|
-- p = { 1/3, 1/3, 1/3 };
|
|
-- --oo--
|
|
-- --oooooooooo--
|
|
--
|
|
-- A 2-part frame. The left half is static, the right side dynamic;
|
|
-- the left part stays in place as the right half expands to the right,
|
|
-- with the frame centered on the boundary:
|
|
-- <<--
|
|
-- <<-----------
|
|
-- p = { 1/2, 0, 0, 1/2, 0 };
|
|
--
|
|
-- A 5-part frame, with an anchored center and static caps on each
|
|
-- end, expanding outwards:
|
|
-- <<--oo-->>
|
|
-- <<----------oo---------->>
|
|
-- p = { 1/5, 1/5, 1/10, 0, 1/10, 1/5, 1/5 };
|
|
--
|
|
|
|
local p, a = ...
|
|
assert( (#p%2) == 1 );
|
|
|
|
local t = Def.ActorFrame {
|
|
};
|
|
local Widths = { }
|
|
|
|
local TextureXPos = 0
|
|
for i = 1,#p do
|
|
t[i] = a .. {
|
|
Name = tostring(i);
|
|
InitCommand = function(self)
|
|
if i < math.ceil(#p/2) then self:horizalign("HorizAlign_Right");
|
|
elseif i == math.ceil(#p/2) then self:horizalign("HorizAlign_Center");
|
|
else self:horizalign("HorizAlign_Left");
|
|
end
|
|
|
|
Widths[i] = self:GetWidth();
|
|
end;
|
|
|
|
SetPartSizeCommand = function(self, params)
|
|
self:x( params.XPos[i] );
|
|
self:zoomtowidth( params.Zooms[i] );
|
|
end;
|
|
};
|
|
|
|
local Width = p[i];
|
|
t[i].Frames =
|
|
{
|
|
{ -- state 0
|
|
{ x=TextureXPos, y=0 }, -- top-left
|
|
{ x=(TextureXPos+Width), y=1 } -- bottom-right
|
|
}
|
|
};
|
|
|
|
TextureXPos = TextureXPos + Width;
|
|
end
|
|
|
|
t.InitCommand = function(self, params)
|
|
local Child = self:GetChild("1");
|
|
local Height = Child:GetHeight();
|
|
self:SetHeight(Height);
|
|
end
|
|
|
|
t.SetPartSizeCommand = function(self, params)
|
|
self:zoomx( params.FrameZoom );
|
|
end
|
|
|
|
t.SetSizeCommand = function(self, params)
|
|
local Width = params.Width;
|
|
assert( Width );
|
|
|
|
self:SetWidth( Width );
|
|
|
|
if params.tween then
|
|
params.tween(self);
|
|
self:RunCommandsOnChildren( params.tween );
|
|
end;
|
|
|
|
local UnscaledPartWidth = 0;
|
|
local ScaledPartWidth = 0;
|
|
for i = 1,#p do
|
|
if(i%2)==0 then
|
|
ScaledPartWidth = ScaledPartWidth + Widths[i];
|
|
else
|
|
UnscaledPartWidth = UnscaledPartWidth + Widths[i];
|
|
end
|
|
end
|
|
|
|
local WidthToScale = Width - UnscaledPartWidth;
|
|
local CurrentScaledPartWidth = math.max( WidthToScale, 0 );
|
|
|
|
params.Zooms = {};
|
|
params.XPos = {};
|
|
local pos = 0;
|
|
for i = math.ceil(#p/2),1,-1 do
|
|
local ThisScaledPartWidth = Widths[i];
|
|
if (i % 2) == 0 then
|
|
ThisScaledPartWidth = scale( CurrentScaledPartWidth, 0, ScaledPartWidth, 0, Widths[i] );
|
|
end
|
|
|
|
params.XPos[i] = pos;
|
|
|
|
if i == math.ceil(#p/2) then
|
|
pos = pos - ThisScaledPartWidth/2;
|
|
else
|
|
pos = pos - ThisScaledPartWidth;
|
|
end
|
|
|
|
params.Zooms[i] = ThisScaledPartWidth;
|
|
end
|
|
pos = 0;
|
|
for i = math.ceil(#p/2),#p do
|
|
local ThisScaledPartWidth = Widths[i];
|
|
if (i % 2) == 0 then
|
|
ThisScaledPartWidth = scale( CurrentScaledPartWidth, 0, ScaledPartWidth, 0, Widths[i] );
|
|
end
|
|
|
|
params.XPos[i] = pos;
|
|
|
|
if i == math.ceil(#p/2) then
|
|
pos = pos + ThisScaledPartWidth/2;
|
|
else
|
|
pos = pos + ThisScaledPartWidth;
|
|
end
|
|
|
|
params.Zooms[i] = ThisScaledPartWidth;
|
|
end
|
|
|
|
params.FrameZoom = math.min(Width / UnscaledPartWidth, 1);
|
|
|
|
self:playcommand("SetPartSize", params);
|
|
end
|
|
|
|
return t;
|
|
|
|
--
|
|
-- (c) 2007 Glenn Maynard
|
|
-- All rights reserved.
|
|
--
|
|
-- Permission is hereby granted, free of charge, to any person obtaining a
|
|
-- copy of this software and associated documentation files (the
|
|
-- "Software"), to deal in the Software without restriction, including
|
|
-- without limitation the rights to use, copy, modify, merge, publish,
|
|
-- distribute, and/or sell copies of the Software, and to permit persons to
|
|
-- whom the Software is furnished to do so, provided that the above
|
|
-- copyright notice(s) and this permission notice appear in all copies of
|
|
-- the Software and that both the above copyright notice(s) and this
|
|
-- permission notice appear in supporting documentation.
|
|
--
|
|
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
|
|
-- THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
|
|
-- INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
|
|
-- OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
|
|
-- OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
-- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
-- PERFORMANCE OF THIS SOFTWARE.
|
|
--
|
|
|