From ef92ce016e328c1270597f2f1627c72bc3490d64 Mon Sep 17 00:00:00 2001 From: Simon Howard Date: Fri, 2 Jun 2006 20:14:39 +0000 Subject: Make mouse button presses on widgets actually do useful things Subversion-branch: /trunk/chocolate-doom Subversion-revision: 553 --- textscreen/txt_button.c | 13 +++++++++++++ textscreen/txt_checkbox.c | 13 +++++++++++++ textscreen/txt_inputbox.c | 20 ++++++++++++++++++++ textscreen/txt_radiobutton.c | 14 ++++++++++++++ textscreen/txt_window.c | 17 +++++++++++++++++ textscreen/txt_window_action.c | 14 ++++++++++++++ 6 files changed, 91 insertions(+) diff --git a/textscreen/txt_button.c b/textscreen/txt_button.c index 8b8e704b..26e148b0 100644 --- a/textscreen/txt_button.c +++ b/textscreen/txt_button.c @@ -64,12 +64,25 @@ static int TXT_ButtonKeyPress(TXT_UNCAST_ARG(button), int key) return 0; } +static void TXT_ButtonMousePress(TXT_UNCAST_ARG(button), int x, int y, int b) +{ + TXT_CAST_ARG(txt_button_t, button); + + if (b == TXT_MOUSE_LEFT) + { + // Equivalent to pressing enter + + TXT_ButtonKeyPress(button, KEY_ENTER); + } +} + txt_widget_class_t txt_button_class = { TXT_ButtonSizeCalc, TXT_ButtonDrawer, TXT_ButtonKeyPress, TXT_ButtonDestructor, + TXT_ButtonMousePress, }; txt_button_t *TXT_NewButton(char *label) diff --git a/textscreen/txt_checkbox.c b/textscreen/txt_checkbox.c index d32a240c..cde095a8 100644 --- a/textscreen/txt_checkbox.c +++ b/textscreen/txt_checkbox.c @@ -82,12 +82,25 @@ static int TXT_CheckBoxKeyPress(TXT_UNCAST_ARG(checkbox), int key) return 0; } +static void TXT_CheckBoxMousePress(TXT_UNCAST_ARG(checkbox), int x, int y, int b) +{ + TXT_CAST_ARG(txt_checkbox_t, checkbox); + + if (b == TXT_MOUSE_LEFT) + { + // Equivalent to pressing enter + + TXT_CheckBoxKeyPress(checkbox, KEY_ENTER); + } +} + txt_widget_class_t txt_checkbox_class = { TXT_CheckBoxSizeCalc, TXT_CheckBoxDrawer, TXT_CheckBoxKeyPress, TXT_CheckBoxDestructor, + TXT_CheckBoxMousePress, }; txt_checkbox_t *TXT_NewCheckBox(char *label, int *variable) diff --git a/textscreen/txt_inputbox.c b/textscreen/txt_inputbox.c index cb7bf4fa..59d62da3 100644 --- a/textscreen/txt_inputbox.c +++ b/textscreen/txt_inputbox.c @@ -188,12 +188,31 @@ static int TXT_IntInputBoxKeyPress(TXT_UNCAST_ARG(inputbox), int key) return 1; } +static void TXT_InputBoxMousePress(TXT_UNCAST_ARG(inputbox), + int x, int y, int b) +{ + TXT_CAST_ARG(txt_inputbox_t, inputbox); + + if (b == TXT_MOUSE_LEFT) + { + // Make mouse clicks start editing the box + + if (!inputbox->editing) + { + // Send a simulated keypress to start editing + + TXT_WidgetKeyPress(inputbox, KEY_ENTER); + } + } +} + txt_widget_class_t txt_inputbox_class = { TXT_InputBoxSizeCalc, TXT_InputBoxDrawer, TXT_InputBoxKeyPress, TXT_InputBoxDestructor, + TXT_InputBoxMousePress, }; txt_widget_class_t txt_int_inputbox_class = @@ -202,6 +221,7 @@ txt_widget_class_t txt_int_inputbox_class = TXT_InputBoxDrawer, TXT_IntInputBoxKeyPress, TXT_InputBoxDestructor, + TXT_InputBoxMousePress, }; static void SetBufferFromValue(txt_inputbox_t *inputbox) diff --git a/textscreen/txt_radiobutton.c b/textscreen/txt_radiobutton.c index d5f694f7..56cec359 100644 --- a/textscreen/txt_radiobutton.c +++ b/textscreen/txt_radiobutton.c @@ -85,12 +85,26 @@ static int TXT_RadioButtonKeyPress(TXT_UNCAST_ARG(radiobutton), int key) return 0; } +static void TXT_RadioButtonMousePress(TXT_UNCAST_ARG(radiobutton), + int x, int y, int b) +{ + TXT_CAST_ARG(txt_radiobutton_t, radiobutton); + + if (b == TXT_MOUSE_LEFT) + { + // Equivalent to pressing enter + + TXT_RadioButtonKeyPress(radiobutton, KEY_ENTER); + } +} + txt_widget_class_t txt_radiobutton_class = { TXT_RadioButtonSizeCalc, TXT_RadioButtonDrawer, TXT_RadioButtonKeyPress, TXT_RadioButtonDestructor, + TXT_RadioButtonMousePress, }; txt_radiobutton_t *TXT_NewRadioButton(char *label, int *variable, int value) diff --git a/textscreen/txt_window.c b/textscreen/txt_window.c index 0cc46308..7481ccfa 100644 --- a/textscreen/txt_window.c +++ b/textscreen/txt_window.c @@ -307,7 +307,9 @@ void TXT_SetWindowPosition(txt_window_t *window, static void MouseButtonPress(txt_window_t *window, int b) { int x, y; + int i; txt_widget_t *widgets; + txt_widget_t *widget; // Lay out the window, set positions and sizes of all widgets @@ -326,6 +328,21 @@ static void MouseButtonPress(txt_window_t *window, int b) { TXT_WidgetMousePress(window, x, y, b); } + + // Was one of the action area buttons pressed? + + for (i=0; i<3; ++i) + { + widget = (txt_widget_t *) window->actions[i]; + + if (widget != NULL + && x >= widget->x && x < widget->x + widget->w + && y >= widget->y && y < widget->y + widget->h) + { + TXT_WidgetMousePress(widget, x, y, b); + break; + } + } } void TXT_WindowKeyPress(txt_window_t *window, int c) diff --git a/textscreen/txt_window_action.c b/textscreen/txt_window_action.c index 727e9b56..a70d0002 100644 --- a/textscreen/txt_window_action.c +++ b/textscreen/txt_window_action.c @@ -58,12 +58,26 @@ static int TXT_WindowActionKeyPress(TXT_UNCAST_ARG(action), int key) return 0; } +static void TXT_WindowActionMousePress(TXT_UNCAST_ARG(action), + int x, int y, int b) +{ + TXT_CAST_ARG(txt_window_action_t, action); + + // Simulate a press of the key + + if (b == TXT_MOUSE_LEFT) + { + TXT_WindowActionKeyPress(action, action->key); + } +} + txt_widget_class_t txt_window_action_class = { TXT_WindowActionSizeCalc, TXT_WindowActionDrawer, TXT_WindowActionKeyPress, TXT_WindowActionDestructor, + TXT_WindowActionMousePress, }; txt_window_action_t *TXT_NewWindowAction(int key, char *label) -- cgit v1.2.3