RE: Input field removal?
(04-07-2022 09:46 PM)matalog Wrote: (04-07-2022 02:53 AM)Jacob Wall Wrote: It appears it is not possible to hide the field completely, like you're trying to do. It is not overly difficult to make your completely custom Input programs, which would give you total control. I can share an example if you're interested.
Yes Jacob, it would be good to see an example if you have one, thanks.
The example below is a stripped down version of something I made a while back. It should at the very least show one way of doing it. I had a bunch of other stuff built into it, like clipboard copy/paste, custom input types that a parser would check for, alpha handling and so forth.
Code:
#pragma mode( separator(.,;) integer(h32) )
// support routines
ResetCMD();
DrawHeaderBg();
GetMK_in();
FlushKeysMouse();
ClearMouse();
InputLine();
ResetTExit();
ResetShift();
UpdateCursorPos();
FlashBtn();
FlashMenu();
// global variables
KS_shift,CMD_cursor_pos,CMD_edit_left,CMD_edit_right;
IL_init,IL_title,IL_prompt,IL_help,IL_menu,IL_result,IL_stat;
MK_in,MK_mx,MK_my;
TExit:=10,TExit_count;
main_color:=#000000h,main_bg:=#FFFFFFh,dark_accent:=#FB0000h,title_color:=#FFFFFFh,invhi_color:=#FB0000h;
num_keys:={42,43,44,37,38,39,32,33,34,47,48,49,50,45,40,35,29};
num_strings:={"1","2","3","4","5","6","7","8","9","0","."," ","+","-","*","/",","};
EXPORT IL()
BEGIN
TExit_count:=0;
IL_init:="123";
IL_title:="Test Me";
IL_prompt:="Prompt";
IL_help:={"Multiple lines","of help text"};
IF InputLine==1 THEN
MSGBOX(IL_result);
END;
END;
ResetCMD()
BEGIN
KS_shift:=0;
CMD_cursor_pos:=0;
CMD_edit_left:="";
CMD_edit_right:="";
END;
// draw title to header
DrawHeaderBg(title_string)
BEGIN
RECT_P(G0,0,0,319,18,dark_accent);
LINE_P(G0,0,19,319,19,main_color);
TEXTOUT_P(title_string,G0,2,1,3,title_color,270);
END;
GetMK_in()
BEGIN
IF TExit_count==TExit THEN
MK_in:=400;
ELSE
REPEAT
IFERR MK_in:=WAIT(-1); THEN
MK_in:=4;
FlushKeysMouse();
END;
UNTIL TYPE(MK_in)==0 OR IFTE(SIZE(MK_in)>1,MK_in(1)==3,0);
ClearMouse();
IF TYPE(MK_in)==6 THEN // list
MK_mx:=MK_in(2);
MK_my:=MK_in(3);
TExit_count:=0;
END;
END;
END;
// get all keys and mouse events out of the system
FlushKeysMouse()
BEGIN
LOCAL j,ksum;
REPEAT
ksum:=0;
FOR j FROM 0 TO 50 DO
ksum:=ksum+ISKEYDOWN(j);
END;
UNTIL ksum==0;
ClearMouse();
END;
ClearMouse()
BEGIN
LOCAL m;
REPEAT
m:=MOUSE();
UNTIL SIZE(m(1))==0;
END;
// single line input
// IL_init is initial edit line value
// IL_title is title of input screen
// IL_prompt is the prompt for input text above input line
// IL_help is multiple lines of help text above the prompt
InputLine()
BEGIN
LOCAL draw_screen:=1,j,exit_IL:=0,max_chars:=32,dim_left,dim_right;
LOCAL dim_str,start_left,cur_item;
IL_stat:=0;
ResetCMD();
CMD_edit_left:=IL_init;
IL_menu:={"","","","","Cancel","OK"};
FlushKeysMouse();
REPEAT
IF draw_screen THEN
DrawHeaderBg(IL_title); // title
RECT_P(G0,0,20,319,175,main_bg); // help
FOR j FROM 1 TO SIZE(IL_help) DO
TEXTOUT_P(IL_help(j),G0,0,40+(j-1)*15,3,main_color,315);
END;
RECT_P(G0,0,176,319,195,main_bg); // prompt
TEXTOUT_P(IL_prompt,G0,0,178,3,invhi_color,315);
LINE_P(G0,0,196,319,196,invhi_color);
DRAWMENU(IL_menu);
draw_screen:=0;
END;
RECT_P(G0,277,0,319,18,dark_accent);
IF KS_shift THEN
TEXTOUT_P("■S",G0,280,4,2,title_color);
END;
RECT_P(G0,0,197,319,219,main_bg);
dim_left:=MAX({28,32-DIM(CMD_edit_left)});
dim_right:=MIN({DIM(CMD_edit_right),dim_left});
dim_left:=MIN({DIM(CMD_edit_left),max_chars-dim_right});
start_left:=MAX({1,DIM(CMD_edit_left)-dim_left+1});
CMD_cursor_pos:=TEXTOUT_P(MID(CMD_edit_left,start_left,IFTE(dim_left,dim_left,1)),G0,0,200,4,main_color);
TEXTOUT_P(CHAR(9615),G0,CMD_cursor_pos,200,4,main_color);
TEXTOUT_P(MID(CMD_edit_right,1,IFTE(dim_right,dim_right,1)),G0,CMD_cursor_pos+1,200,4,main_color);
GetMK_in();
IF TYPE(MK_in)==0 THEN // keyboard
IF MK_in==-1 THEN // timeout after 60 seconds
TExit_count:=TExit_count+1;
ELSE
ResetTExit();
CASE
IF POS({4,46,400},MK_in) THEN // ESC or ON or TExit timeout
IL_stat:=0;
exit_IL:=1;
END;
IF MK_in==7 THEN // LEFT CURSOR
IF KS_shift THEN
CMD_edit_right:=CMD_edit_left+CMD_edit_right;
CMD_edit_left:="";
ELSE
dim_str:=DIM(CMD_edit_left);
IF dim_str>1 THEN
CMD_edit_right:=MID(CMD_edit_left,dim_str)+CMD_edit_right;
CMD_edit_left:=MID(CMD_edit_left,1,DIM(CMD_edit_left)-1);
ELSE
CMD_edit_right:=CMD_edit_left+CMD_edit_right;
CMD_edit_left:="";
END;
END;
END;
IF MK_in==8 THEN // RIGHT CURSOR
IF KS_shift THEN
CMD_edit_left:=CMD_edit_left+CMD_edit_right;
CMD_edit_right:="";
ELSE
dim_str:=DIM(CMD_edit_right);
IF dim_str>1 THEN
CMD_edit_left:=CMD_edit_left+LEFT(CMD_edit_right,1);
CMD_edit_right:=MID(CMD_edit_right,2);
ELSE
CMD_edit_left:=CMD_edit_left+CMD_edit_right;
CMD_edit_right:="";
END;
END;
END;
IF MK_in==19 THEN // backspace
IF KS_shift THEN
CMD_edit_left:="";
ELSE
IF DIM(CMD_edit_left)>1 THEN
CMD_edit_left:=MID(CMD_edit_left,1,DIM(CMD_edit_left)-1);
ELSE
CMD_edit_left:="";
END;
END;
END;
IF MK_in==30 THEN // ENTER
IL_result:=CMD_edit_left+CMD_edit_right;
IL_stat:=1;
exit_IL:=1;
END;
IF MK_in==41 THEN // shift
KS_shift:=IFTE(KS_shift,0,1);
END;
CASE
IF POS(num_keys,MK_in) THEN
CMD_edit_left:=CMD_edit_left+num_strings(POS(num_keys,MK_in));
END;
IF MK_in==27 THEN
dim_str:=DIM(CMD_edit_left);
IF dim_str THEN
IF LEFT(CMD_edit_left,1)=="−" THEN
CMD_edit_left:=IFTE(dim_str>1,MID(CMD_edit_left,2),"");
ELSE
CMD_edit_left:="−"+CMD_edit_left;
END;
ELSE
dim_str:=DIM(CMD_edit_right);
IF dim_str THEN
IF LEFT(CMD_edit_right,1)=="−" THEN
CMD_edit_right:=IFTE(dim_str>1,MID(CMD_edit_right,2),"");
ELSE
CMD_edit_right:="−"+CMD_edit_right;
END;
ELSE
CMD_edit_left:="−";
END;
END;
END;
IF MK_in==28 THEN
CMD_edit_left:=CMD_edit_left+"(";
CMD_edit_right:=")"+CMD_edit_right;
END;
END;
END;
ResetShift();
END;
ELSE // touch events
CASE
IF 196<MK_my<220 THEN // input area
UpdateCursorPos(0);
END;
IF MK_my>219 THEN // menu
FlashMenu();
draw_screen:=1;
CASE
IF 264>MK_mx>211 THEN // Cancel
IL_stat:=0;
exit_IL:=1;
END;
IF MK_mx>264 THEN // OK
IL_result:=CMD_edit_left+CMD_edit_right;
exit_IL:=1;
IL_stat:=1;
END;
END;
END;
END;
END;
UNTIL exit_IL;
RETURN IL_stat;
END;
ResetTExit()
BEGIN
IF TYPE(MK_in)==0 THEN
IF MK_in<>400 THEN
TExit_count:=0;
END;
END;
END;
ResetShift()
BEGIN
IF TYPE(MK_in)==0 THEN
IF MK_in<>41 THEN
KS_shift:=0;
END;
END;
END;
UpdateCursorPos(x1)
BEGIN
LOCAL temp_x;
CASE
IF MK_mx<(x1+4) THEN
CMD_edit_right:=CMD_edit_left+CMD_edit_right;
CMD_edit_left:="";
END;
IF MK_mx<=CMD_cursor_pos THEN
IF DIM(CMD_edit_left) THEN
REPEAT
CMD_edit_right:=RIGHT(CMD_edit_left,1)+CMD_edit_right;
IF DIM(CMD_edit_left)>1 THEN
CMD_edit_left:=MID(CMD_edit_left,1,DIM(CMD_edit_left)-1);
ELSE
CMD_edit_left:="";
END;
temp_x:=TEXTOUT_P(CMD_edit_left,G9,x1,0,5)+1;
UNTIL (temp_x<=MK_mx) OR (DIM(CMD_edit_left)==0);
END;
END;
IF MK_mx>CMD_cursor_pos THEN
IF DIM(CMD_edit_right) THEN
REPEAT
CMD_edit_left:=CMD_edit_left+LEFT(CMD_edit_right,1);
IF DIM(CMD_edit_right)>1 THEN
CMD_edit_right:=MID(CMD_edit_right,2);
ELSE
CMD_edit_right:="";
END;
temp_x:=TEXTOUT_P(CMD_edit_left,G9,x1,0,5)+1;
UNTIL (temp_x>=MK_mx) OR (DIM(CMD_edit_right)==0);
END;
END;
END;
END;
FlashBtn(indx)
BEGIN
LOCAL x1:={0,52,105,158,211,264},x2:={52,105,158,211,264,319};
INVERT_P(G0,x1(indx),219,x2(indx),239);
WAIT(0.1);
END;
FlashMenu()
BEGIN
CASE
IF MK_mx<52 THEN
FlashBtn(1);
END;
IF 105>MK_mx>52 THEN
FlashBtn(2);
END;
IF 158>MK_mx>105 THEN
FlashBtn(3);
END;
IF 211>MK_mx>158 THEN
FlashBtn(4);
END;
IF 264>MK_mx>211 THEN
FlashBtn(5);
END;
IF MK_mx>264 THEN
FlashBtn(6);
END;
END;
END;
|