%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
%% compliance with the License. You should have received a copy of the
%% Erlang Public License along with this software. If not, it can be
%% retrieved online at http://www.erlang.org/.
%%
%% Software distributed under the License is distributed on an "AS IS"
%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
%% the License for the specific language governing rights and limitations
%% under the License.
%%
%% %CopyrightEnd%
%%%*********************************************************************
%%%
%%% Description: Part of pd controlling the scale, i.e., the scrollbar
%%% imitation.
%%%
%%%*********************************************************************
-module(tv_pd_scale).
-export([init_scale/2,
resize_scale/2,
set_scale_range/3,
set_scale_pos/3]).
-include("tv_int_def.hrl").
-include("tv_pd_int_def.hrl").
%%%*********************************************************************
%%% EXTERNAL FUNCTIONS
%%%*********************************************************************
%%======================================================================
%% Function:
%%
%% Return Value:
%%
%% Description:
%%
%% Parameters:
%%======================================================================
init_scale(FrameP, ScaleP) ->
#frame_params{sheet_frame_id = SheetFrameId,
sheet_frame_width = SheetFrameWidth,
sheet_frame_height = SheetFrameHeight,
grid_frame_width = GridFrameWidth,
grid_frame_height = GridFrameHeight} = FrameP,
VScaleId = create_scale(vscale, SheetFrameId, SheetFrameWidth, GridFrameHeight),
HScaleId = create_scale(hscale, SheetFrameId, GridFrameWidth, SheetFrameHeight),
ScaleP#scale_params{vscale_id = VScaleId,
vscale_pos = 0,
hscale_id = HScaleId,
hscale_pos = 0
}.
%%======================================================================
%% Function:
%%
%% Return Value:
%%
%% Description:
%%
%% Parameters:
%%======================================================================
resize_scale(FrameP, ScaleP) ->
#frame_params{sheet_frame_width = SheetFrameWidth,
sheet_frame_height = SheetFrameHeight,
grid_frame_width = GridFrameWidth,
grid_frame_height = GridFrameHeight} = FrameP,
#scale_params{vscale_id = VScaleId,
hscale_id = HScaleId} = ScaleP,
config_scale(vscale, VScaleId, SheetFrameWidth, GridFrameHeight),
config_scale(hscale, HScaleId, GridFrameWidth, SheetFrameHeight),
ScaleP.
%%======================================================================
%% Function:
%%
%% Return Value:
%%
%% Description:
%%
%% Parameters:
%%======================================================================
set_scale_range(vscale, Range, ScaleP) ->
{Lo, Hi} = Range,
NewRange = if
Lo > Hi ->
{Hi, Hi};
true ->
Range
end,
VScaleId = ScaleP#scale_params.vscale_id,
gs:config(VScaleId, [{range, NewRange}]);
set_scale_range(hscale, Range, ScaleP) ->
{Lo, Hi} = Range,
NewRange = if
Lo > Hi ->
{Hi, Hi};
true ->
Range
end,
HScaleId = ScaleP#scale_params.hscale_id,
gs:config(HScaleId, [{range, NewRange}]).
%%======================================================================
%% Function:
%%
%% Return Value:
%%
%% Description:
%%
%% Parameters:
%%======================================================================
set_scale_pos(_ScaleName, undefined, ScaleP) ->
ScaleP;
set_scale_pos(vscale, NewPos, ScaleP) ->
ScaleId = ScaleP#scale_params.vscale_id,
gs:config(ScaleId, [{pos, NewPos}]),
ScaleP#scale_params{vscale_pos = NewPos};
set_scale_pos(hscale, NewPos, ScaleP) ->
ScaleId = ScaleP#scale_params.hscale_id,
gs:config(ScaleId, [{pos, NewPos}]),
ScaleP#scale_params{hscale_pos = NewPos}.
%%%********************************************************************
%%% INTERNAL FUNCTIONS
%%%********************************************************************
%%======================================================================
%% Function:
%%
%% Return Value:
%%
%% Description:
%%
%% Parameters:
%%======================================================================
config_scale(ScaleName, ScaleId, FrameWidth, FrameHeight) ->
{Width, Height, Xpos, Ypos} = get_scale_coords(ScaleName,
FrameWidth,
FrameHeight),
gs:config(ScaleId, [{height, Height},
{width, Width},
{x, Xpos},
{y, Ypos}
]).
%%======================================================================
%% Function:
%%
%% Return Value:
%%
%% Description:
%%
%% Parameters:
%%======================================================================
create_scale(ScaleName, FrameId, FrameWidth, FrameHeight) ->
{Width, Height, Xpos, Ypos} = get_scale_coords(ScaleName,
FrameWidth,
FrameHeight),
{Orientation, Range} = case ScaleName of
vscale ->
{vertical, {1, 1}};
hscale ->
{horizontal, {1, 1}}
end,
gs:scale(FrameId, [{data, ScaleName},
{orient, Orientation},
{buttonpress, true},
{buttonrelease, true},
{height, Height},
{width, Width},
{x, Xpos},
{y, Ypos},
{bg, ?DEFAULT_BG_COLOR},
{fg, {0, 0, 0}},
{range, Range}
]).
%%======================================================================
%% Function:
%%
%% Return Value:
%%
%% Description:
%%
%% Parameters:
%%======================================================================
get_scale_coords(hscale, FrameWidth, FrameHeight) ->
Height = ?HSCALE_HEIGHT,
Xpos = ?VBTN_WIDTH - 3, % Subtracting 3 makes it look better!
Ypos = FrameHeight - Height,
Width = FrameWidth - Xpos + 5, % Adding 5 for better look!
{Width, Height, Xpos, Ypos};
get_scale_coords(vscale, FrameWidth, FrameHeight) ->
Width = ?VSCALE_WIDTH,
Xpos = (FrameWidth - Width),
Ypos = ?HBTN_HEIGHT - 3, % Subtracting 3 makes it look better!
Height = FrameHeight - Ypos + 5, % Adding 5 for better look!
{Width, Height, Xpos, Ypos}.