Post Reply 
Code snippet: drawmenu with catching user action
03-04-2014, 03:36 PM
Post: #7
RE: Code snippet: drawmenu with catching user action
Thanks everyone for finding the mentioned error sources! Here is the reworked version.

Important note for everyone who has used the code before: I changed the return value for the case where no on-screen button was pressed to "0" instead of "-1", because of the following change:
Now the code also checks whether the button which was pressed is in the list of labels. If this is not the case the negative of the button ID is returned.

Example: DrawMenuSelect({"one", "two"})
If user presses button 4, returns "-4"
If user presses button 2, returns "2"
If user presses none of the on-screen buttons (e.g. by pressing the screen elsewhere, or typing the keyboard) returns "0"

Code:

EXPORT DrawMenuSelect(buttonlabellist)
// Parameters: buttonlabellist is a list which should contain at most 6 strings for the button labels
// Returns: 
//  * If one of the buttons in "buttonlabellist" was pressed returns the ID (1 to 6) of the button.
//  * If a button is pressed which is not labeled by "buttonlabellist" returns negative ID of the button (-6 to -1)
//  * If none of the on screen buttons was pressed returns 0
BEGIN
 LOCAL selection, mouselist;
 DRAWMENU(buttonlabellist);
 selection := 0; //preinitialize with 0 which is returned if none of the buttons is pressed
 mouselist:=WAIT(-1); // Wait until screen is touched
 // Check whether one of the on-screen buttons was pressed:
 IF (TYPE(mouselist)==6) THEN // Check whether we have a touch event (==list)
  IF (mouselist(1)==3) THEN // Check whether a button was pressed
   IF (mouselist(3) >= #DD:-16h) THEN // check whether it was one of the 6 buttons at the bottom
    selection:=CEILING((mouselist(2)+1)*6/320); // Screen is 320px wide. There are six buttons. hence divide
// mouse value by 320/6. To avoid getting a value of zero when the user presses exactly at the left 
//border a 1 is added to the mouse value
    IF (selection > length(buttonlabellist)) THEN // Check whether a valid button was pressed.
     selection := -selection;
    END;
   END;
  END;
 END;

 RETURN selection;
END;

@Han: You mention in your article that a mouse click actually causes three events. Can you explain this a bit more? If I use wait(-1) I only get one list as return value. Are there cases in which I could get a list of lists with more than 1 event? Or is this just an issue if I loop over WAIT(-1), where I would catch the same user action three times?
Find all posts by this user
Quote this message in a reply
Post Reply 


Messages In This Thread
RE: Code snippet: drawmenu with catching user action - Stefan - 03-04-2014 03:36 PM



User(s) browsing this thread: 1 Guest(s)