%% %% %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% -module(tv_pb_funcs). -export([init_btns/10, update_hbtns/3, update_vbtns/5, update_keys/2, set_new_sort_col/2]). -include("tv_int_def.hrl"). -include("tv_pb_int_def.hrl"). %%%********************************************************************* %%% EXTERNAL FUNCTIONS %%%********************************************************************* %%====================================================================== %% Function: %% %% Return Value: %% %% Description: %% %% Parameters: %%====================================================================== init_btns(ParentId, Ypos, HbtnH, VbtnW, ResbtnW, FirstColShown, ColsShown, NofRows, RowH, ProcVars) -> #process_variables{key_numbers = KeyNos, key_ids = KeyIds} = ProcVars, % C = gs:canvas(ParentId, [{width, VbtnW - 1}, % {height, HbtnH}, % {x, 0}, % {y, HbtnH + 1}, % {bg, white} % ]), % gs:create(image, C, [{load_gif, "erlang.gif"}]), {HbtnsShown, ResBtnsShown} = update_hbtns(ColsShown, [], [], FirstColShown, ParentId, Ypos, HbtnH, ResbtnW, VbtnW), NewKeyIds = update_keys(KeyNos, KeyIds, FirstColShown, FirstColShown + length(ColsShown) - 1, HbtnsShown, ParentId, []), VbtnsShown = create_vbtns(ParentId, Ypos, NofRows, RowH, VbtnW, HbtnH), ProcVars#process_variables{grid_frame_id = ParentId, ypos = Ypos, hbtn_height = HbtnH, vbtn_width = VbtnW, resbtn_width = ResbtnW, first_col_shown = FirstColShown, hbtns_shown = HbtnsShown, resbtns_shown = ResBtnsShown, vbtns_shown = VbtnsShown, cols_shown = ColsShown, key_ids = NewKeyIds }. %%====================================================================== %% Function: %% %% Return Value: %% %% Description: %% %% Parameters: %%====================================================================== update_hbtns(FirstColShown, ColsShown, ProcVars) -> #process_variables{grid_frame_id = ParentId, first_col_shown = OldFirstColShown, cols_shown = OldColsShown, ypos = Ypos, hbtn_height = HbtnH, vbtn_width = VbtnW, resbtn_width = ResbtnW, hbtns_shown = HbtnsShown, resbtns_shown = ResbtnsShown, key_numbers = KeyNos, key_ids = KeyIds, col_mark_params = ColMarkP} = ProcVars, % Only if the grid has been scrolled horizontally need we move the % col mark! case FirstColShown of OldFirstColShown -> done; _NewValue -> #col_mark_params{col_btn_id = MarkedBtnId, virtual_col_marked = ColMarked, sort_btn_id = SortBtnId, virtual_sort_col = SortCol} = ColMarkP, unmark_marked_col(MarkedBtnId, ColMarked, SortCol), unmark_sort_col(SortBtnId, ColMarked, SortCol) end, {NewHbtns, NewResbtns, NewKeys} = case {FirstColShown, ColsShown} of {OldFirstColShown, OldColsShown} -> {HbtnsShown, ResbtnsShown, KeyIds}; _Other -> {NewHbtnsShown, NewResbtnsShown} = update_hbtns(ColsShown, HbtnsShown, ResbtnsShown, FirstColShown, ParentId, Ypos, HbtnH, ResbtnW, VbtnW), NewKeyIds = update_keys(KeyNos, KeyIds, FirstColShown, FirstColShown + length(ColsShown) - 1, NewHbtnsShown, ParentId, []), {NewHbtnsShown, NewResbtnsShown, NewKeyIds} end, % Now mark the marked column again! NewColMarkP = mark_marked_col(NewHbtns, FirstColShown, ColMarkP), ProcVars#process_variables{first_col_shown = FirstColShown, hbtns_shown = NewHbtns, resbtns_shown = NewResbtns, cols_shown = ColsShown, key_ids = NewKeys, col_mark_params = NewColMarkP }. %%====================================================================== %% Function: %% %% Return Value: %% %% Description: %% %% Parameters: %%====================================================================== update_vbtns(NofRowsShown, FirstRowShown, Colors, BlinkEnabled, ProcVars) -> #process_variables{vbtns_shown = Vbtns, blink_color_list = BlinkList} = ProcVars, update_vbtns(1, NofRowsShown, FirstRowShown, Vbtns, Colors, BlinkEnabled, BlinkList), NewProcVars = update_sort_btn_mark(ProcVars), NewProcVars. %%====================================================================== %% Function: %% %% Return Value: %% %% Description: %% %% Parameters: %%====================================================================== set_new_sort_col(SortCol, ProcVars) -> #process_variables{hbtns_shown = HbtnsShown, col_mark_params = ColMarkP} = ProcVars, #col_mark_params{col_btn_id = MarkedColBtnId, sort_btn_id = OldSortBtnId} = ColMarkP, % Set the new color of the sort btn, and remove the mark, if it is the same % column! case MarkedColBtnId of undefined -> done; _AnyId -> gs:config(MarkedColBtnId, [{bg, ?DEFAULT_BG_COLOR}, {fg, {0, 0, 0}} ]) end, SortBtnId = get_btn_id(SortCol, HbtnsShown), case SortBtnId of undefined -> % The btn isn't visible, or no sorting shall be performed! gs:config(OldSortBtnId, [{bg, ?DEFAULT_BG_COLOR}, {fg, {0, 0, 0}} ]); _Other -> % Unmark the old sort btn id! gs:config(OldSortBtnId, [{bg, ?DEFAULT_BG_COLOR}, {fg, {0, 0, 0}} ]), gs:config(SortBtnId, [{bg, ?SORT_MARK_COLOR}, {fg, {0, 0, 0}} ]) end, NewColMarkP = ColMarkP#col_mark_params{col_btn_id = undefined, virtual_col_marked = undefined, sort_btn_id = SortBtnId, virtual_sort_col = SortCol }, ProcVars#process_variables{col_mark_params = NewColMarkP}. %%====================================================================== %% Function: %% %% Return Value: %% %% Description: %% %% Parameters: %%====================================================================== update_keys(KeyList, ProcVars) -> #process_variables{key_numbers = OldKeyList, key_ids = KeyIds, first_col_shown = FirstColShown, cols_shown = ColsShown, hbtns_shown = HbtnsShown, grid_frame_id = ParentId} = ProcVars, NewKeyIds = case KeyList of OldKeyList -> KeyIds; NewKeyList -> update_keys(NewKeyList, KeyIds, FirstColShown, FirstColShown + length(ColsShown) - 1, HbtnsShown, ParentId, []) end, ProcVars#process_variables{key_numbers = KeyList, key_ids = NewKeyIds }. %%%********************************************************************* %%% INTERNAL FUNCTIONS %%%********************************************************************* %%====================================================================== %% Function: %% %% Return Value: %% %% Description: %% %% Parameters: %%====================================================================== unmark_sort_col(undefined, _ColMarked, _SortCol) -> done; unmark_sort_col(SortBtnId, _ColMarked, _SortCol) -> gs:config(SortBtnId, [{bg, ?DEFAULT_BG_COLOR}, {fg, {0, 0, 0}} ]). %%====================================================================== %% Function: %% %% Return Value: %% %% Description: %% %% Parameters: %%====================================================================== mark_marked_col(HbtnsShown, _FirstColShown, ColMarkP) -> #col_mark_params{virtual_col_marked = VirtualCol, virtual_sort_col = SortCol} = ColMarkP, {NewMarkBtnId, NewSortBtnId} = case VirtualCol of SortCol -> % Same btn! BtnId = get_btn_id(VirtualCol, HbtnsShown), gs:config(BtnId, [{bg, ?SORT_MARK_COLOR}, {fg, {0, 0, 0}} ]), {BtnId, BtnId}; _OtherCol -> MarkBtnId = get_btn_id(VirtualCol, HbtnsShown), case MarkBtnId of undefined -> done; _Else -> gs:config(MarkBtnId, [{bg, ?COL_MARK_COLOR}, {fg, {255, 255, 255}} ]) end, SortBtnId = get_btn_id(SortCol, HbtnsShown), case SortBtnId of undefined -> done; _OtherId -> gs:config(SortBtnId, [{bg, ?SORT_MARK_COLOR}, {fg, {0, 0, 0}} ]) end, {MarkBtnId, SortBtnId} end, ColMarkP#col_mark_params{col_btn_id = NewMarkBtnId, sort_btn_id = NewSortBtnId}. %%====================================================================== %% Function: %% %% Return Value: %% %% Description: %% %% Parameters: %%====================================================================== unmark_marked_col(undefined, _ColMarked, _SortCol) -> done; unmark_marked_col(BtnId, _ColMarked, _SortCol) -> gs:config(BtnId, [{bg, ?DEFAULT_BG_COLOR}, {fg, {0,0,0}} ]). %%====================================================================== %% Function: %% %% Return Value: %% %% Description: %% %% Parameters: %%====================================================================== update_sort_btn_mark(ProcVars) -> #process_variables{hbtns_shown = HbtnsShown, col_mark_params = ColMarkP} = ProcVars, #col_mark_params{col_btn_id = MarkedColBtnId, virtual_col_marked = ColMarked, sort_btn_id = OldSortBtnId, virtual_sort_col = SortCol} = ColMarkP, {NewMarkedColBtnId, NewColMarked} = case ColMarked of SortCol -> {undefined, undefined}; _Other -> {MarkedColBtnId, ColMarked} end, NewSortBtnId = set_sort_btn_color(OldSortBtnId, SortCol, HbtnsShown), NewColMarkP = ColMarkP#col_mark_params{col_btn_id = NewMarkedColBtnId, virtual_col_marked = NewColMarked, sort_btn_id = NewSortBtnId}, ProcVars#process_variables{col_mark_params = NewColMarkP}. %%====================================================================== %% Function: %% %% Return Value: %% %% Description: %% %% Parameters: %%====================================================================== get_btn_id(VirtualCol, HbtnsShown) -> case lists:keysearch(VirtualCol, #hbtn.virtual_col, HbtnsShown) of false -> undefined; {value, HbtnRec} -> HbtnRec#hbtn.id end. %%====================================================================== %% Function: %% %% Return Value: %% %% Description: %% %% Parameters: %%====================================================================== set_sort_btn_color(undefined, SortCol, HbtnsShown) -> case lists:keysearch(SortCol, #hbtn.virtual_col, HbtnsShown) of false -> undefined; {value, HbtnRec} -> BtnId = HbtnRec#hbtn.id, gs:config(BtnId, [{bg, ?SORT_MARK_COLOR}]), BtnId end; set_sort_btn_color(BtnId, undefined, _HbtnsShown) -> gs:config(BtnId, [{bg, ?DEFAULT_BG_COLOR}]); set_sort_btn_color(OldSortBtnId, SortCol, HbtnsShown) -> case gs:read(OldSortBtnId, bg) of SortCol -> % Btn is already marked! OldSortBtnId; _OtherColor -> % Unmark old btn, mark new btn, if visible. gs:config(OldSortBtnId, [{bg, ?DEFAULT_BG_COLOR}]), case lists:keysearch(SortCol, #hbtn.virtual_col, HbtnsShown) of false -> undefined; {value, HbtnRec} -> BtnId = HbtnRec#hbtn.id, gs:config(BtnId, [{bg, ?SORT_MARK_COLOR}]), BtnId end end. %%====================================================================== %% Function: %% %% Return Value: %% %% Description: %% %% Parameters: %%====================================================================== update_vbtns(N, NofRowsShown, _VirtualRowNo, _Vbtns, _Colors, _BlinkEnabled, _BlinkList) when N > NofRowsShown -> done; update_vbtns(_N, _NofRowsShown, _VirtualRowNo, [], [], _BlinkEnabled, _BlinkList) -> done; update_vbtns(_N, _NofRowsShown, _VirtualRowNo, [], _Colors, _BlinkEnabled, _BlinkList) -> % Right now we don't bother with dynamically creating row buttons: % we ought too know in advance the maximum number of rows that can % be visible. io:format("Configuration error: too few rows in grid.~n"), done; update_vbtns(N, NofRowsShown, VirtualRowNo, [VbtnRec | VT], [], BlinkEnabled, BlinkList) -> VbtnId = VbtnRec#vbtn.id, gs:config(VbtnId, [{bg, ?DEFAULT_BG_COLOR}, {fg, ?BLACK}, {label, {text, integer_to_list(VirtualRowNo)}}, {data, {vbtn, N, VirtualRowNo}} % Real row + virtual row ]), update_vbtns(N + 1, NofRowsShown, VirtualRowNo + 1,VT, [], BlinkEnabled, BlinkList); update_vbtns(N, NofRowsShown, VirtualRowNo, [VbtnRec | VT], [Color | CT], true, BlinkList) -> VbtnId = VbtnRec#vbtn.id, {Text, TextColor} = get_vbtn_text_and_textcolor(Color, VirtualRowNo), case lists:member(Color, BlinkList) of true -> gs:config(VbtnId, [{bg, Color}, {fg, TextColor}, {label, {text, Text}}, {data, {vbtn, N, VirtualRowNo}}, % Real + virtual row flash ]); false -> gs:config(VbtnId, [{bg, Color}, {fg, TextColor}, {label, {text, Text}}, {data, {vbtn, N, VirtualRowNo}} % Real + virtual row ]) end, update_vbtns(N + 1, NofRowsShown, VirtualRowNo + 1, VT, CT, true, BlinkList); update_vbtns(N, NofRowsShown, VirtualRowNo, [VbtnRec | VT], [Color | CT], false, BlinkList) -> VbtnId = VbtnRec#vbtn.id, {Text, TextColor} = get_vbtn_text_and_textcolor(Color, VirtualRowNo), gs:config(VbtnId, [{bg, Color}, {fg, TextColor}, {label, {text, Text}}, {data, {vbtn, N, VirtualRowNo}} % Real row + virtual row ]), update_vbtns(N + 1, NofRowsShown, VirtualRowNo + 1, VT, CT, false, BlinkList). %%====================================================================== %% Function: %% %% Return Value: %% %% Description: %% %% Parameters: %%====================================================================== get_vbtn_text_and_textcolor(?BLACK, N) -> {integer_to_list(N), ?WHITE}; get_vbtn_text_and_textcolor(?RED1, N) -> {integer_to_list(N), ?BLACK}; get_vbtn_text_and_textcolor(?RED2, N) -> {integer_to_list(N), ?BLACK}; get_vbtn_text_and_textcolor(?RED3, N) -> {integer_to_list(N), ?BLACK}; get_vbtn_text_and_textcolor(?RED4, N) -> {integer_to_list(N), ?BLACK}; get_vbtn_text_and_textcolor(?RED5, N) -> {integer_to_list(N), ?BLACK}; get_vbtn_text_and_textcolor(?GREEN1, N) -> {integer_to_list(N), ?BLACK}; get_vbtn_text_and_textcolor(?GREEN2, N) -> {integer_to_list(N), ?BLACK}; get_vbtn_text_and_textcolor(?GREEN3, N) -> {integer_to_list(N), ?BLACK}; get_vbtn_text_and_textcolor(?GREEN4, N) -> {integer_to_list(N), ?BLACK}; get_vbtn_text_and_textcolor(?GREEN5, N) -> {integer_to_list(N), ?BLACK}; get_vbtn_text_and_textcolor(_AnyOtherColor, N) -> {integer_to_list(N), ?BLACK}. %%====================================================================== %% Function: %% %% Return Value: %% %% Description: %% %% Parameters: %%====================================================================== create_vbtns(ParentId, Ypos, NofRows, RowHeight, VbtnW, HbtnH) -> create_vbtns(1, NofRows, RowHeight, ParentId, VbtnW, Ypos + HbtnH, []). %%====================================================================== %% Function: %% %% Return Value: %% %% Description: %% %% Parameters: %%====================================================================== create_vbtns(N, NofRows, _RowHeight, _ParId, _VbtnW, _Ypos, VAcc) when N > NofRows -> lists:reverse(VAcc); create_vbtns(N, NofRows, RowHeight, ParId, VbtnW, Ypos, VAcc) -> VHeight = RowHeight + 1, VInfo = create_one_vbtn(ParId, VHeight, VbtnW, Ypos, N), create_vbtns(N + 1, NofRows, RowHeight, ParId, VbtnW, Ypos + VHeight, [VInfo | VAcc]). %%====================================================================== %% Function: %% %% Return Value: %% %% Description: %% %% Parameters: %%====================================================================== create_one_vbtn(ParentId, Height, VbtnW, Ypos, N) -> Id = gs:button(ParentId, [{width, VbtnW}, {height, Height}, {x, 0}, {y, Ypos}, {font, ?BTN_FONT}, {bg, ?DEFAULT_BG_COLOR}, {align, center}, {label, {text,integer_to_list(N)}}, {data, {vbtn, N, N}} % Real row + virtual row ]), #vbtn{virtual_row = N, real_row = N, id = Id, height = Height, ypos = Ypos}. %%====================================================================== %% Function: %% %% Return Value: %% %% Description: %% %% Parameters: %%====================================================================== update_hbtns([], _HBtnsShown, _ResBtns, _VirtualColNo, _FrId, _Ypos, _HbtnH, _ResBtnW, _VbtnW) -> {[], []}; update_hbtns(ColsShown, HBtns, ResBtns, VirtualColNo, FrId, Ypos, HbtnH, ResBtnW, VbtnW) -> update_hbtns(1, ColsShown, HBtns, ResBtns, HbtnH, ResBtnW, VbtnW, VirtualColNo, FrId, 0, Ypos, [], []). %%====================================================================== %% Function: %% %% Return Value: %% %% Description: %% %% Parameters: %%====================================================================== update_hbtns(_N, [], [], [], _HbtnH, _ResBtnW, _VbtnW, _ColNo, _FrId, _Xpos, _Ypos, HAcc, RAcc) -> {lists:reverse(HAcc), lists:reverse(RAcc)}; update_hbtns(N, [], [HInfo | HT], [RInfo | RT], HbtnH, ResBtnW, VbtnW, ColNo, FrId, Xpos, Ypos, HAcc, RAcc) -> % If too many buttons, i.e., if the ColsShown list % has become empty. gs:destroy(HInfo#hbtn.id), gs:destroy(RInfo#resbtn.id), update_hbtns(N, [], HT, RT, HbtnH, ResBtnW, VbtnW, ColNo, FrId, Xpos, Ypos, HAcc, RAcc); update_hbtns(1, [ColW | T], [], [], HbtnH, ResBtnW, VbtnW, ColNo, FrId, _Xpos, Ypos, HAcc, RAcc) -> % The first button has to be bigger than the others. {HInfo, RInfo} = create_one_hbtn_and_resbtn(FrId, ColW - 2, HbtnH, VbtnW - 1, Ypos, ResBtnW, 1, ColNo), update_hbtns(2, T, [], [], HbtnH, ResBtnW, VbtnW, ColNo + 1, FrId, VbtnW - 1 + ColW - 2 + ResBtnW, Ypos, [HInfo | HAcc], [RInfo | RAcc]); update_hbtns(N, [ColW | T], [], [], HbtnH, ResBtnW, VbtnW, ColNo, FrId, Xpos, Ypos, HAcc, RAcc) -> {HInfo, RInfo} = create_one_hbtn_and_resbtn(FrId, ColW - 4, HbtnH, Xpos, Ypos, ResBtnW, N, ColNo), update_hbtns(N + 1, T, [], [], HbtnH, ResBtnW, VbtnW, ColNo + 1, FrId, Xpos + ColW - 4 + ResBtnW, Ypos, [HInfo | HAcc], [RInfo | RAcc]); update_hbtns(1, [ColW | T], [HInfo | HT], [RInfo | RT], HbtnH, ResBtnW, VbtnW, ColNo, FrId, _Xpos, Ypos, HAcc, RAcc) -> {NewHInfo, NewRInfo} = config_one_hbtn_and_resbtn(HInfo, RInfo, ColW - 2, VbtnW - 1, 1, ColNo), update_hbtns(2, T, HT, RT, HbtnH, ResBtnW, VbtnW, ColNo + 1, FrId, VbtnW - 1 + ColW - 2 + ResBtnW, Ypos, [NewHInfo | HAcc], [NewRInfo | RAcc]); update_hbtns(N, [ColW | T], [HInfo | HT], [RInfo | RT], HbtnH, ResBtnW, VbtnW, ColNo, FrId, Xpos, Ypos, HAcc, RAcc) -> {NewHInfo, NewRInfo} = config_one_hbtn_and_resbtn(HInfo, RInfo, ColW - 4, Xpos, N, ColNo), update_hbtns(N + 1, T, HT, RT, HbtnH, ResBtnW, VbtnW, ColNo + 1, FrId, Xpos + ColW - 4 + ResBtnW, Ypos, [NewHInfo | HAcc], [NewRInfo | RAcc]). %%====================================================================== %% Function: %% %% Return Value: %% %% Description: %% %% Parameters: %%====================================================================== create_one_hbtn_and_resbtn(ParId, HWidth, HHeight, HXpos, Ypos, RWidth, N, ColNo) -> HId = gs:button(ParId, [{width, HWidth}, {height, HHeight}, {x, HXpos}, {y, Ypos}, {font, ?BTN_FONT}, {bg, ?DEFAULT_BG_COLOR}, {data, {hbtn, N, ColNo}}, {label, {text, integer_to_list(ColNo)}} ]), RId = gs:button(ParId, [{width, RWidth}, {height, HHeight}, {x, HXpos + HWidth}, {y, Ypos}, {cursor, resize}, {buttonpress, true}, {buttonrelease, true}, {data, {resbtn, N, ColNo, (HXpos + HWidth + RWidth div 2)}}, {bg, ?BLACK} ]), HInfo = #hbtn{virtual_col = ColNo, real_col = N, id = HId, width = HWidth, xpos = HXpos}, RInfo = #resbtn{virtual_col = ColNo, real_col = N, id = RId, width = RWidth, xpos = HXpos + HWidth}, {HInfo, RInfo}. %%====================================================================== %% Function: %% %% Return Value: %% %% Description: %% %% Parameters: %%====================================================================== config_one_hbtn_and_resbtn(HInfo, RInfo, HWidth, HXpos, N, ColNo) -> gs:config(HInfo#hbtn.id, [{width, HWidth}, {x, HXpos}, {data, {hbtn, N, ColNo}}, {label, {text, integer_to_list(ColNo)}} ]), gs:config(RInfo#resbtn.id, [{x, HXpos + HWidth}, {data, {resbtn, N, ColNo, (HXpos + HWidth + RInfo#resbtn.width div 2)}} ]), NewHInfo = HInfo#hbtn{virtual_col = ColNo, width = HWidth, xpos = HXpos}, NewRInfo = RInfo#resbtn{virtual_col = ColNo, xpos = HXpos + HWidth}, {NewHInfo, NewRInfo}. %%====================================================================== %% Function: %% %% Return Value: %% %% Description: %% %% Parameters: %%====================================================================== update_keys([], [], _FirstCol, _LastCol, _HBtns, _ParentId, KeyIdsAcc) -> lists:reverse(KeyIdsAcc); update_keys([], [KeyId | IdT], FirstCol, LastCol, HBtns, ParentId, KeyIdsAcc) -> gs:config(KeyId, [{x, 1200}]), update_keys([], IdT, FirstCol, LastCol, HBtns, ParentId, [KeyId | KeyIdsAcc]); update_keys([KeyNo | KT], [], FirstCol, LastCol, HBtns,ParentId, KeyIdsAcc) when KeyNo >= FirstCol, KeyNo =< LastCol -> {_Width, Xpos} = get_keywidth_and_pos(KeyNo, FirstCol, HBtns), NewKeyId = create_key(ParentId, Xpos, 1), update_keys(KT, [], FirstCol, LastCol, HBtns, ParentId, [NewKeyId | KeyIdsAcc]); update_keys([_KeyNo | KT], [], FirstCol, LastCol, HBtns, ParentId, KeyIdsAcc) -> update_keys(KT, [], FirstCol, LastCol, HBtns, ParentId, KeyIdsAcc); update_keys([KeyNo | KT], [KeyId | IdT], FirstCol, LastCol, HBtns, ParentId, KeyIdsAcc) when KeyNo >= FirstCol, KeyNo =< LastCol -> {Width, Xpos} = get_keywidth_and_pos(KeyNo, FirstCol, HBtns), gs:config(KeyId, [{width, Width}, {x, Xpos} ]), update_keys(KT, IdT, FirstCol, LastCol, HBtns, ParentId, [KeyId | KeyIdsAcc]); update_keys([_KeyNo | KT], [KeyId | IdT], FirstCol, LastCol, HBtns, ParentId, KeyIdsAcc) -> update_keys(KT, [KeyId | IdT], FirstCol, LastCol, HBtns, ParentId, KeyIdsAcc). %%====================================================================== %% Function: %% %% Return Value: %% %% Description: %% %% Parameters: %%====================================================================== get_keywidth_and_pos(VirtualCol, FirstCol, HBtns) -> RealColNo = VirtualCol - FirstCol + 1, HBtnR = lists:nth(RealColNo, HBtns), #hbtn{width = Width, xpos = Xpos} = HBtnR, KeyWidth = 10, % Compute the x position for the key! KeyXpos = (Xpos + (Width div 2) - (KeyWidth div 2)), {KeyWidth, KeyXpos}. %%====================================================================== %% Function: %% %% Return Value: %% %% Description: %% %% Parameters: %%====================================================================== create_key(ParentId, Xpos, Ypos) -> PicDir = code:priv_dir(tv), C = gs:canvas(ParentId, [{width, 10}, {height, 18}, {x, Xpos}, {y, Ypos}, {bg, ?DEFAULT_BG_COLOR} ]), gs:create(image, C, [{bitmap, PicDir ++ "/key.xbm"}]), C.