Beispiel #1
0
/**
 *
 *  rct2: 0x006E99A9
 */
static void input_scroll_part_update_vthumb(rct_window *w, rct_widgetindex widgetIndex, sint32 y, sint32 scroll_id)
{
	assert(w != NULL);
	rct_widget *widget = &w->widgets[widgetIndex];

	if (window_find_by_number(w->classification, w->number)) {
		sint32 newTop;
		newTop = w->scrolls[scroll_id].v_bottom;
		newTop *= y;
		y = widget->bottom - widget->top - 21;
		if (w->scrolls[scroll_id].flags & HSCROLLBAR_VISIBLE)
			y -= 11;
		newTop /= y;
		y = newTop;
		w->scrolls[scroll_id].flags |= VSCROLLBAR_THUMB_PRESSED;
		newTop = w->scrolls[scroll_id].v_top;
		newTop += y;
		if (newTop < 0)
			newTop = 0;
		y = widget->bottom - widget->top - 1;
		if (w->scrolls[scroll_id].flags & HSCROLLBAR_VISIBLE)
			y -= 11;
		y *= -1;
		y += w->scrolls[scroll_id].v_bottom;
		if (y < 0)
			y = 0;
		if (newTop > y)
			newTop = y;
		w->scrolls[scroll_id].v_top = newTop;
		widget_scroll_update_thumbs(w, widgetIndex);
		widget_invalidate_by_number(w->classification, w->number, widgetIndex);
	}
}
Beispiel #2
0
static void window_text_input_mouseup(){
	short widgetIndex;
	rct_window *w;
	rct_window *calling_w;
	window_widget_get_registers(w, widgetIndex);

	calling_w = window_find_by_number(calling_class, calling_number);

	switch (widgetIndex){
	case WIDX_CANCEL:
	case WIDX_CLOSE:
		platform_stop_text_input();
		// Pass back the text that has been entered.
		// ecx when zero means text input failed
		if (calling_w != NULL)
			window_event_textinput_call(calling_w, calling_widget, NULL);
		window_close(w);
		break;
	case WIDX_OKAY:
		platform_stop_text_input();
		// Pass back the text that has been entered.
		// ecx when none zero means text input success
		if (calling_w != NULL)
			window_event_textinput_call(calling_w, calling_widget, text_input);
		window_close(w);
	}
}
Beispiel #3
0
/**
 *
 *  rct2: 0x006E98F2
 */
static void input_scroll_part_update_hthumb(rct_window *w, rct_widgetindex widgetIndex, sint32 x, sint32 scroll_id)
{
	rct_widget *widget = &w->widgets[widgetIndex];

	if (window_find_by_number(w->classification, w->number)) {
		sint32 newLeft;
		newLeft = w->scrolls[scroll_id].h_right;
		newLeft *= x;
		x = widget->right - widget->left - 21;
		if (w->scrolls[scroll_id].flags & VSCROLLBAR_VISIBLE)
			x -= 11;
		newLeft /= x;
		x = newLeft;
		w->scrolls[scroll_id].flags |= HSCROLLBAR_THUMB_PRESSED;
		newLeft = w->scrolls[scroll_id].h_left;
		newLeft += x;
		if (newLeft < 0)
			newLeft = 0;
		x = widget->right - widget->left - 1;
		if (w->scrolls[scroll_id].flags & VSCROLLBAR_VISIBLE)
			x -= 11;
		x *= -1;
		x += w->scrolls[scroll_id].h_right;
		if (x < 0)
			x = 0;
		if (newLeft > x)
			newLeft = x;
		w->scrolls[scroll_id].h_left = newLeft;
		widget_scroll_update_thumbs(w, widgetIndex);
		widget_invalidate_by_number(w->classification, w->number, widgetIndex);
	}
}
Beispiel #4
0
/**
 *
 *  rct2: 0x006E876D
 */
void invalidate_scroll()
{
	rct_window* w = window_find_by_number(gPressedWidget.window_classification, gPressedWidget.window_number);
	if (w != NULL) {
		// Reset to basic scroll
		w->scrolls[_currentScrollIndex].flags &= 0xFF11;
		window_invalidate_by_number(gPressedWidget.window_classification, gPressedWidget.window_number);
	}
}
Beispiel #5
0
/* move to ride.c */
void sub_6b2fa9(rct_windownumber number){
	rct_window* w;

	w = window_find_by_number(WC_RIDE, number);
	if (w){
		if (w->page == 1){
			window_close(w);
		}
	}
}
Beispiel #6
0
/**
 *
 *  rct2: 0x006E9A60
 */
static void input_scroll_part_update_hleft(rct_window *w, int widgetIndex, int scroll_id)
{
	assert(w != NULL);
	if (window_find_by_number(w->classification, w->number)) {
		w->scrolls[scroll_id].flags |= HSCROLLBAR_LEFT_PRESSED;
		if (w->scrolls[scroll_id].h_left >= 3)
			w->scrolls[scroll_id].h_left -= 3;
		widget_scroll_update_thumbs(w, widgetIndex);
		widget_invalidate_by_number(w->classification, w->number, widgetIndex);
	}
}
Beispiel #7
0
/**
 *
 *  rct2: 0x006E9C37
 */
static void input_scroll_part_update_vtop(rct_window *w, rct_widgetindex widgetIndex, sint32 scroll_id)
{
	assert(w != NULL);
	if (window_find_by_number(w->classification, w->number)) {
		w->scrolls[scroll_id].flags |= VSCROLLBAR_UP_PRESSED;
		if (w->scrolls[scroll_id].v_top >= 3)
			w->scrolls[scroll_id].v_top -= 3;
		widget_scroll_update_thumbs(w, widgetIndex);
		widget_invalidate_by_number(w->classification, w->number, widgetIndex);
	}
}
Beispiel #8
0
void window_text_input_update7(rct_window *w)
{
	rct_window* calling_w = window_find_by_number(calling_class, calling_number);
	// If the calling window is closed then close the text
	// input window.
	if (!calling_w){
		window_close(w);
	}

	// Used to blink the cursor.
	w->frame_no++;
	if (w->frame_no > 30) w->frame_no = 0;
	window_invalidate(w);
}
Beispiel #9
0
/**
 * Used to invalidate flat button widgets when the mouse leaves and enters them. This should be generalised so that all widgets
 * can use this in the future.
 */
static void input_widget_over_flatbutton_invalidate()
{
	rct_window *w = window_find_by_number(gHoverWidget.window_classification, gHoverWidget.window_number);
	if (w != NULL) {
		window_event_invalidate_call(w);
		if (w->widgets[gHoverWidget.widget_index].type == WWT_FLATBTN) {
			widget_invalidate_by_number(
				gHoverWidget.window_classification,
				gHoverWidget.window_number,
				gHoverWidget.widget_index
			);
		}
	}
}
Beispiel #10
0
/**
 *
 *  rct2: 0x006ED801
 */
void process_mouse_tool(int x, int y)
{
	if (gInputFlags & INPUT_FLAG_TOOL_ACTIVE)
	{
		rct_window* w = window_find_by_number(
			RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, rct_windowclass),
			RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWNUMBER, rct_windownumber)
			);

		if (!w)
			tool_cancel();
		else
			window_event_tool_update_call(w, RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WIDGETINDEX, uint16), x, y);

	}
}
Beispiel #11
0
/**
 *
 *  rct2: 0x006ED801
 */
void process_mouse_tool(sint32 x, sint32 y)
{
	if (_inputFlags & INPUT_FLAG_TOOL_ACTIVE)
	{
		rct_window* w = window_find_by_number(
			gCurrentToolWidget.window_classification,
			gCurrentToolWidget.window_number
			);

		if (!w)
			tool_cancel();
		else
			window_event_tool_update_call(w, gCurrentToolWidget.widget_index, x, y);

	}
}
Beispiel #12
0
void window_text_input_key(rct_window* w, sint32 key)
{
	char new_char = platform_scancode_to_rct_keycode(0xFF&key);

	// If the return button is pressed stop text input
	if (new_char == '\r'){
		platform_stop_text_input();
		window_close(w);
		rct_window* calling_w = window_find_by_number(calling_class, calling_number);
		// Pass back the text that has been entered.
		// ecx when none zero means text input success
		if (calling_w)
			window_event_textinput_call(calling_w, calling_widget, text_input);
	}

	window_invalidate(w);
}
Beispiel #13
0
static void input_viewport_drag_continue()
{
	sint32 dx, dy, newDragX, newDragY;
	rct_window *w;
	rct_viewport *viewport;

	platform_get_cursor_position(&newDragX, &newDragY);

	dx = newDragX - gInputDragLastX;
	dy = newDragY - gInputDragLastY;
	w = window_find_by_number(_dragWidget.window_classification, _dragWidget.window_number);

	// #3294: Window can be closed during a drag session, so just finish
	//        the session if the window no longer exists
	if (w == NULL) {
		input_viewport_drag_end();
		return;
	}

	viewport = w->viewport;
	_ticksSinceDragStart += gTicksSinceLastUpdate;
	if (viewport == NULL) {
		platform_show_cursor();
		_inputState = INPUT_STATE_RESET;
	} else if (dx != 0 || dy != 0) {
		if (!(w->flags & WF_NO_SCROLLING)) {
			// User dragged a scrollable viewport

			// If the drag time is less than 500 the "drag" is usually interpreted as a right click.
			// As the user moved the mouse, don't interpret it as right click in any case.
			_ticksSinceDragStart = 1000;

			dx *= 1 << (viewport->zoom + 1);
			dy *= 1 << (viewport->zoom + 1);
			if (gConfigGeneral.invert_viewport_drag){
				w->saved_view_x -= dx;
				w->saved_view_y -= dy;
			} else {
				w->saved_view_x += dx;
				w->saved_view_y += dy;
			}
		}
	}

	platform_set_cursor_position(gInputDragLastX, gInputDragLastY);
}
Beispiel #14
0
/**
 *
 *  rct2: 0x006E9C96
 */
static void input_scroll_part_update_vbottom(rct_window *w, rct_widgetindex widgetIndex, sint32 scroll_id)
{
	assert(w != NULL);
	rct_widget *widget = &w->widgets[widgetIndex];
	if (window_find_by_number(w->classification, w->number)) {
		w->scrolls[scroll_id].flags |= VSCROLLBAR_DOWN_PRESSED;
		w->scrolls[scroll_id].v_top += 3;
		sint32 newTop = widget->bottom - widget->top - 1;
		if (w->scrolls[scroll_id].flags & HSCROLLBAR_VISIBLE)
			newTop -= 11;
		newTop *= -1;
		newTop += w->scrolls[scroll_id].v_bottom;
		if (newTop < 0)
			newTop = 0;
		if (w->scrolls[scroll_id].v_top > newTop)
			w->scrolls[scroll_id].v_top = newTop;
		widget_scroll_update_thumbs(w, widgetIndex);
		widget_invalidate_by_number(w->classification, w->number, widgetIndex);
	}
}
Beispiel #15
0
/**
 *
 *  rct2: 0x006E9ABF
 */
static void input_scroll_part_update_hright(rct_window *w, rct_widgetindex widgetIndex, sint32 scroll_id)
{
	assert(w != NULL);
	rct_widget *widget = &w->widgets[widgetIndex];
	if (window_find_by_number(w->classification, w->number)) {
		w->scrolls[scroll_id].flags |= HSCROLLBAR_RIGHT_PRESSED;
		w->scrolls[scroll_id].h_left += 3;
		sint32 newLeft = widget->right - widget->left - 1;
		if (w->scrolls[scroll_id].flags & VSCROLLBAR_VISIBLE)
			newLeft -= 11;
		newLeft *= -1;
		newLeft += w->scrolls[scroll_id].h_right;
		if (newLeft < 0)
			newLeft = 0;
		if (w->scrolls[scroll_id].h_left > newLeft)
			w->scrolls[scroll_id].h_left = newLeft;
		widget_scroll_update_thumbs(w, widgetIndex);
		widget_invalidate_by_number(w->classification, w->number, widgetIndex);
	}
}
Beispiel #16
0
/**
 *
 *  rct2: 0x006E8ACB
 */
static void input_scroll_right(int x, int y, int state)
{
	rct_window* w = window_find_by_number(_dragWidget.window_classification, _dragWidget.window_number);
	if (w == NULL) {
		platform_show_cursor();
		gInputState = INPUT_STATE_RESET;
		return;
	}

	switch (state) {
	case MOUSE_STATE_RELEASED:
		_ticksSinceDragStart += RCT2_GLOBAL(RCT2_ADDRESS_TICKS_SINCE_LAST_UPDATE, sint16);
		if (x != 0 || y != 0) {
			_ticksSinceDragStart = 1000;
			input_scroll_drag_continue(x, y, w);
		}
		break;
	case MOUSE_STATE_RIGHT_RELEASE:
		gInputState = INPUT_STATE_RESET;
		platform_show_cursor();
		break;
	}
}
Beispiel #17
0
/**
 *
 *  rct2: 0x006E8ACB
 */
static void input_scroll_right(sint32 x, sint32 y, sint32 state)
{
	rct_window* w = window_find_by_number(_dragWidget.window_classification, _dragWidget.window_number);
	if (w == NULL) {
		platform_show_cursor();
		_inputState = INPUT_STATE_RESET;
		return;
	}

	switch (state) {
	case MOUSE_STATE_RELEASED:
		_ticksSinceDragStart += gTicksSinceLastUpdate;
		if (x != 0 || y != 0) {
			_ticksSinceDragStart = 1000;
			input_scroll_drag_continue(x, y, w);
		}
		break;
	case MOUSE_STATE_RIGHT_RELEASE:
		_inputState = INPUT_STATE_RESET;
		platform_show_cursor();
		break;
	}
}
Beispiel #18
0
/**
 *
*  rct2: 0x006ED833
 */
void process_mouse_over(int x, int y)
{
	rct_window* window;
	rct_window* subWindow;

	int widgetId;
	int cursorId;
	int ebx, esi, edi, ebp;

	cursorId = CURSOR_ARROW;
	RCT2_GLOBAL(RCT2_ADDRESS_MAP_TOOLTIP_ARGS, sint16) = -1;
	window = window_find_from_point(x, y);

	if (window != NULL) {
		widgetId = window_find_widget_from_point(window, x, y);
		RCT2_GLOBAL(0x1420046, sint16) = (widgetId & 0xFFFF);
		if (widgetId != -1) {
			switch (window->widgets[widgetId].type){

			case WWT_VIEWPORT:
				if (!(gInputFlags & INPUT_FLAG_TOOL_ACTIVE)) {
					if (viewport_interaction_left_over(x, y)) {
						sub_6ED990(CURSOR_HAND_POINT);
						return;
					}
					break;
				}
				cursorId = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TOOL, uint8);
				subWindow = window_find_by_number(
					RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, rct_windowclass),
					RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWNUMBER, rct_windownumber)
					);
				ebp = (int)subWindow;
				if (subWindow == NULL)
					break;

				ebx = 0;
				edi = cursorId;
				esi = (int)subWindow;
				// Window event WE_UNKNOWN_0E was called here, but no windows actually implemented a handler and
				// its not known what it was for
				cursorId = edi;
				if ((ebx & 0xFF) != 0)
				{
					sub_6ED990(cursorId);
					return;
				}
				break;

			case WWT_FRAME:
			case WWT_RESIZE:
				if (!(window->flags & 0x100))
					break;

				if (window->min_width == window->max_width && window->min_height == window->max_height)
					break;

				if (x < window->x + window->width - 0x13)
					break;

				if (y < window->y + window->height - 0x13)
					break;

				cursorId = CURSOR_DIAGONAL_ARROWS;
				break;

			case WWT_SCROLL:
				RCT2_GLOBAL(0x9DE558, uint16) = x;
				RCT2_GLOBAL(0x9DE55A, uint16) = y;
				int output_scroll_area, scroll_id;
				int scroll_x, scroll_y;
				widget_scroll_get_part(window, &window->widgets[widgetId], x, y, &scroll_x, &scroll_y, &output_scroll_area, &scroll_id);
				cursorId = scroll_id;
				if (output_scroll_area != SCROLL_PART_VIEW)
				{
					cursorId = CURSOR_ARROW;
					break;
				}
				// Same as default but with scroll_x/y
				cursorId = window_event_cursor_call(window, widgetId, scroll_x, scroll_y);
				if (cursorId == -1)
					cursorId = CURSOR_ARROW;
				break;
			default:
				cursorId = window_event_cursor_call(window, widgetId, x, y);
				if (cursorId == -1)
					cursorId = CURSOR_ARROW;
				break;
			}
		}
	}

	viewport_interaction_right_over(x, y);
	sub_6ED990(cursorId);
}
Beispiel #19
0
/**
 *
 *  rct2: 0x006E95F9
 */
static void input_widget_left(sint32 x, sint32 y, rct_window *w, rct_widgetindex widgetIndex)
{
	rct_windowclass windowClass = 255;
	rct_windownumber windowNumber = 0;
	rct_widget *widget;

	if (w != NULL) {
		windowClass = w->classification;
		windowNumber = w->number;
	}

	window_close_by_class(WC_ERROR);
	window_close_by_class(WC_TOOLTIP);

	// Window might have changed position in the list, therefore find it again
	w = window_find_by_number(windowClass, windowNumber);
	if (w == NULL)
		return;

	w = window_bring_to_front(w);
	if (widgetIndex == -1)
		return;

	if (windowClass != gCurrentTextBox.window.classification ||
		windowNumber != gCurrentTextBox.window.number ||
		widgetIndex != gCurrentTextBox.widget_index) {
		window_cancel_textbox();
	}

	widget = &w->widgets[widgetIndex];

	switch (widget->type) {
	case WWT_FRAME:
	case WWT_RESIZE:
		if (window_can_resize(w) && (x >= w->x + w->width - 19 && y >= w->y + w->height - 19))
			input_window_resize_begin(w, widgetIndex, x, y);
		break;
	case WWT_VIEWPORT:
		_inputState = INPUT_STATE_VIEWPORT_LEFT;
		gInputDragLastX = x;
		gInputDragLastY = y;
		_dragWidget.window_classification = windowClass;
		_dragWidget.window_number = windowNumber;
		if (_inputFlags & INPUT_FLAG_TOOL_ACTIVE) {
			w = window_find_by_number(
				gCurrentToolWidget.window_classification,
				gCurrentToolWidget.window_number
				);
			if (w != NULL) {
				window_event_tool_down_call(w, gCurrentToolWidget.widget_index, x, y);
				_inputFlags |= INPUT_FLAG_4;
			}
		}
		break;
	case WWT_CAPTION:
		input_window_position_begin(w, widgetIndex, x, y);
		break;
	case WWT_SCROLL:
		input_scroll_begin(w, widgetIndex, x, y);
		break;
	default:
		if (widget_is_enabled(w, widgetIndex) && !widget_is_disabled(w, widgetIndex)) {
			audio_play_sound_panned(SOUND_CLICK_1, w->x + (widget->left + widget->right) / 2, 0, 0, 0);

			// Set new cursor down widget
			gPressedWidget.window_classification = windowClass;
			gPressedWidget.window_number = windowNumber;
			gPressedWidget.widget_index = widgetIndex;
			_inputFlags |= INPUT_FLAG_WIDGET_PRESSED;
			_inputState = INPUT_STATE_WIDGET_PRESSED;
			_clickRepeatTicks = 1;

			widget_invalidate_by_number(windowClass, windowNumber, widgetIndex);
			window_event_mouse_down_call(w, widgetIndex);
		}
		break;
	}
}
Beispiel #20
0
/**
 *
 *  rct2: 0x006E8DA7
 */
void input_state_widget_pressed(int x, int y, int state, int widgetIndex, rct_window *w, rct_widget *widget)
{
	RCT2_GLOBAL(0x1420054, uint16) = x;
	RCT2_GLOBAL(0x1420056, uint16) = y;

	rct_windowclass cursor_w_class;
	rct_windownumber cursor_w_number;
	cursor_w_class = gPressedWidget.window_classification;
	cursor_w_number = gPressedWidget.window_number;
	int cursor_widgetIndex = gPressedWidget.widget_index;

	rct_window *cursor_w = window_find_by_number(cursor_w_class, cursor_w_number);
	if (cursor_w == NULL) {
		gInputState = INPUT_STATE_RESET;
		return;
	}

	switch (state) {
	case MOUSE_STATE_RELEASED:
		if (!w || cursor_w_class != w->classification || cursor_w_number != w->number || widgetIndex != cursor_widgetIndex)
			break;

		if (w->disabled_widgets & (1ULL << widgetIndex))
			break;

		if (RCT2_GLOBAL(0x009DE528, uint16) != 0)
			RCT2_GLOBAL(0x009DE528, uint16)++;

		if (w->hold_down_widgets & (1ULL << widgetIndex) &&
			RCT2_GLOBAL(0x009DE528, uint16) >= 16 &&
			!(RCT2_GLOBAL(0x009DE528, uint16) & 3)
			) {
			window_event_mouse_down_call(w, widgetIndex);
		}

		if (gInputFlags & INPUT_FLAG_WIDGET_PRESSED) {
			if (gInputState == INPUT_STATE_DROPDOWN_ACTIVE) {
				gDropdownHighlightedIndex = gDropdownDefaultIndex;
				window_invalidate_by_class(WC_DROPDOWN);
			}
			return;
		}

		gInputFlags |= INPUT_FLAG_WIDGET_PRESSED;
		widget_invalidate_by_number(cursor_w_class, cursor_w_number, widgetIndex);
		return;
	case MOUSE_STATE_LEFT_RELEASE:
	case MOUSE_STATE_RIGHT_PRESS:
		if (gInputState == INPUT_STATE_DROPDOWN_ACTIVE) {
			if (w) {
				int dropdown_index = 0;

				if (w->classification == WC_DROPDOWN) {
					dropdown_index = dropdown_index_from_point(x, y, w);
					if (dropdown_index == -1) {
						goto dropdown_cleanup;
					}

					if (dropdown_index < 64 && gDropdownItemsDisabled & (1ULL << dropdown_index)) {
						goto dropdown_cleanup;
					}

					if (gDropdownItemsFormat[dropdown_index] == 0) {
						goto dropdown_cleanup;
					}
				}
				else {
					if (cursor_w_class != w->classification || cursor_w_number != w->number || widgetIndex != cursor_widgetIndex)
						goto dropdown_cleanup;
					dropdown_index = -1;
					if (gInputFlags & INPUT_FLAG_DROPDOWN_STAY_OPEN){
						if (!(gInputFlags & INPUT_FLAG_DROPDOWN_MOUSE_UP)){
							gInputFlags |= INPUT_FLAG_DROPDOWN_MOUSE_UP;
							return;
						}
					}
				}

				window_close_by_class(WC_DROPDOWN);
				cursor_w = window_find_by_number(cursor_w_class, cursor_w_number);
				if (gInputFlags & INPUT_FLAG_WIDGET_PRESSED) {
					gInputFlags &= ~INPUT_FLAG_WIDGET_PRESSED;
					widget_invalidate_by_number(cursor_w_class, cursor_w_number, cursor_widgetIndex);
				}

				gInputState = INPUT_STATE_NORMAL;
				gTooltipTimeout = 0;
				gTooltipWidget.widget_index = cursor_widgetIndex;
				gTooltipWidget.window_classification = cursor_w_class;
				gTooltipWidget.window_number = cursor_w_number;

				if (dropdown_index == -1) {
					if (!dropdown_is_disabled(gDropdownDefaultIndex)) {
						dropdown_index = gDropdownDefaultIndex;
					}
				}
				window_event_dropdown_call(cursor_w, cursor_widgetIndex, dropdown_index);
			}
		dropdown_cleanup:
			window_close_by_class(WC_DROPDOWN);
		}
		if (state == MOUSE_STATE_RIGHT_PRESS) {
			return;
		}

		gInputState = INPUT_STATE_NORMAL;
		gTooltipTimeout = 0;
		gTooltipWidget.widget_index = cursor_widgetIndex;

		if (!w)
			break;

		if (!widget)
			break;

		int mid_point_x = (widget->left + widget->right) / 2 + w->x;
		audio_play_sound_panned(5, mid_point_x, 0, 0, 0);
		if (cursor_w_class != w->classification || cursor_w_number != w->number || widgetIndex != cursor_widgetIndex)
			break;

		if (w->disabled_widgets & (1ULL << widgetIndex))
			break;

		widget_invalidate_by_number(cursor_w_class, cursor_w_number, widgetIndex);
		window_event_mouse_up_call(w, widgetIndex);
	default:
		return;
	}

	RCT2_GLOBAL(0x009DE528, uint16) = 0;
	if (gInputState != INPUT_STATE_DROPDOWN_ACTIVE){
		// Hold down widget and drag outside of area??
		if (gInputFlags & INPUT_FLAG_WIDGET_PRESSED){
			gInputFlags &= ~INPUT_FLAG_WIDGET_PRESSED;
			widget_invalidate_by_number(cursor_w_class, cursor_w_number, cursor_widgetIndex);
		}
		return;
	}

	gDropdownHighlightedIndex = -1;
	window_invalidate_by_class(WC_DROPDOWN);
	if (w == NULL) {
		return;
	}

	if (w->classification == WC_DROPDOWN){
		int dropdown_index = dropdown_index_from_point(x, y, w);
		if (dropdown_index == -1) {
			return;
		}

		if (gDropdownIsColour && gDropdownLastColourHover != dropdown_index) {
			gDropdownLastColourHover = dropdown_index;
			window_tooltip_close();
			window_tooltip_show(STR_COLOUR_NAMES_START + dropdown_index, x, y);
		}

		if (dropdown_index < 64 && gDropdownItemsDisabled & (1ULL << dropdown_index)) {
			return;
		}

		if (gDropdownItemsFormat[dropdown_index] == 0) {
			return;
		}

		gDropdownHighlightedIndex = dropdown_index;
		window_invalidate_by_class(WC_DROPDOWN);
	} else {
		gDropdownLastColourHover = -1;
		window_tooltip_close();
	}
}
Beispiel #21
0
/**
 *
 *  rct2: 0x006E8655
 */
static void game_handle_input_mouse(sint32 x, sint32 y, sint32 state)
{
	rct_window *w;
	rct_widget *widget;
	rct_widgetindex widgetIndex;

	// Get window and widget under cursor position
	w = window_find_from_point(x, y);
	widgetIndex = w == NULL ? -1 : window_find_widget_from_point(w, x, y);
	widget = widgetIndex == -1 ? 0 : &w->widgets[widgetIndex];

	switch (_inputState) {
	case INPUT_STATE_RESET:
		window_tooltip_reset(x, y);
		// fall-through
	case INPUT_STATE_NORMAL:
		switch (state) {
		case MOUSE_STATE_RELEASED:
			input_widget_over(x, y, w, widgetIndex);
			break;
		case MOUSE_STATE_LEFT_PRESS:
			input_widget_left(x, y, w, widgetIndex);
			break;
		case MOUSE_STATE_RIGHT_PRESS:
			window_close_by_class(WC_TOOLTIP);

			if (w != NULL) {
				w = window_bring_to_front(w);
			}

			if (widgetIndex != -1) {
				switch (widget->type) {
				case WWT_VIEWPORT:
					if (!(gScreenFlags & (SCREEN_FLAGS_TRACK_MANAGER | SCREEN_FLAGS_TITLE_DEMO))) {
						input_viewport_drag_begin(w, x, y);
					}
					break;
				case WWT_SCROLL:
					input_scroll_drag_begin(x, y, w, widget, widgetIndex);
					break;
				}
			}
			break;
		}
		break;
	case INPUT_STATE_WIDGET_PRESSED:
		input_state_widget_pressed(x, y, state, widgetIndex, w, widget);
		break;
	case INPUT_STATE_POSITIONING_WINDOW:
		w = window_find_by_number(_dragWidget.window_classification, _dragWidget.window_number);
		if (w == NULL) {
			_inputState = INPUT_STATE_RESET;
		} else {
			input_window_position_continue(w, gInputDragLastX, gInputDragLastY, x, y);
			if (state == MOUSE_STATE_LEFT_RELEASE) {
				input_window_position_end(w, x, y);
			}
		}
		break;
	case INPUT_STATE_VIEWPORT_RIGHT:
		if (state == MOUSE_STATE_RELEASED) {
			input_viewport_drag_continue();
		} else if (state == MOUSE_STATE_RIGHT_RELEASE) {
			input_viewport_drag_end();
			if (_ticksSinceDragStart < 500) {
				// If the user pressed the right mouse button for less than 500 ticks, interpret as right click
				viewport_interaction_right_click(x, y);
			}
		}
		break;
	case INPUT_STATE_DROPDOWN_ACTIVE:
		input_state_widget_pressed(x, y, state, widgetIndex, w, widget);
		break;
	case INPUT_STATE_VIEWPORT_LEFT:
		w = window_find_by_number(_dragWidget.window_classification, _dragWidget.window_number);
		if (w == NULL) {
			_inputState = INPUT_STATE_RESET;
			break;
		}

		switch (state) {
		case MOUSE_STATE_RELEASED:
			if (w->viewport == NULL) {
				_inputState = INPUT_STATE_RESET;
				break;
			}

			if (w->classification != _dragWidget.window_classification ||
				w->number != _dragWidget.window_number ||
				!(_inputFlags & INPUT_FLAG_TOOL_ACTIVE)
			) {
				break;
			}

			w = window_find_by_number(
				gCurrentToolWidget.window_classification,
				gCurrentToolWidget.window_number
			);
			if (w == NULL) {
				break;
			}

			window_event_tool_drag_call(w, gCurrentToolWidget.widget_index, x, y);
			break;
		case MOUSE_STATE_LEFT_RELEASE:
			_inputState = INPUT_STATE_RESET;
			if (_dragWidget.window_number == w->number) {
				if ((_inputFlags & INPUT_FLAG_TOOL_ACTIVE)) {
					w = window_find_by_number(
						gCurrentToolWidget.window_classification,
						gCurrentToolWidget.window_number
						);
					if (w != NULL) {
						window_event_tool_up_call(w, gCurrentToolWidget.widget_index, x, y);
					}
				} else if (!(_inputFlags & INPUT_FLAG_4)) {
					viewport_interaction_left_click(x, y);
				}
			}
			break;
		}
		break;
	case INPUT_STATE_SCROLL_LEFT:
		switch (state) {
		case MOUSE_STATE_RELEASED:
			input_scroll_continue(w, widgetIndex, state, x, y);
			break;
		case MOUSE_STATE_LEFT_RELEASE:
			input_scroll_end();
			break;
		}
		break;
	case INPUT_STATE_RESIZING:
		w = window_find_by_number(_dragWidget.window_classification, _dragWidget.window_number);
		if (w == NULL) {
			_inputState = INPUT_STATE_RESET;
		} else {
			if (state == MOUSE_STATE_LEFT_RELEASE) {
				input_window_resize_end();
			}
			if (state == MOUSE_STATE_RELEASED || state == MOUSE_STATE_LEFT_RELEASE) {
				input_window_resize_continue(w, x, y);
			}
		}
		break;
	case INPUT_STATE_SCROLL_RIGHT:
		input_scroll_right(x, y, state);
		break;
	}
}
Beispiel #22
0
/**
 *
 *  rct2: 0x006E8DA7
 */
void input_state_widget_pressed(sint32 x, sint32 y, sint32 state, rct_widgetindex widgetIndex, rct_window *w, rct_widget *widget)
{
	rct_windowclass cursor_w_class;
	rct_windownumber cursor_w_number;
	cursor_w_class = gPressedWidget.window_classification;
	cursor_w_number = gPressedWidget.window_number;
	rct_widgetindex cursor_widgetIndex = gPressedWidget.widget_index;

	rct_window *cursor_w = window_find_by_number(cursor_w_class, cursor_w_number);
	if (cursor_w == NULL) {
		_inputState = INPUT_STATE_RESET;
		return;
	}

	switch (state) {
	case MOUSE_STATE_RELEASED:
		if (!w || cursor_w_class != w->classification || cursor_w_number != w->number || widgetIndex != cursor_widgetIndex)
			break;

		if (w->disabled_widgets & (1ULL << widgetIndex))
			break;

		if (_clickRepeatTicks != 0) {
			_clickRepeatTicks++;

			// Handle click repeat
			if (_clickRepeatTicks >= 16 && (_clickRepeatTicks & 3) != 0) {
				if (w->hold_down_widgets & (1ULL << widgetIndex)) {
					window_event_mouse_down_call(w, widgetIndex);
				}
			}
		}

		if (_inputFlags & INPUT_FLAG_WIDGET_PRESSED) {
			if (_inputState == INPUT_STATE_DROPDOWN_ACTIVE) {
				gDropdownHighlightedIndex = gDropdownDefaultIndex;
				window_invalidate_by_class(WC_DROPDOWN);
			}
			return;
		}

		_inputFlags |= INPUT_FLAG_WIDGET_PRESSED;
		widget_invalidate_by_number(cursor_w_class, cursor_w_number, widgetIndex);
		return;
	case MOUSE_STATE_LEFT_RELEASE:
	case MOUSE_STATE_RIGHT_PRESS:
		if (_inputState == INPUT_STATE_DROPDOWN_ACTIVE) {
			if (w) {
				sint32 dropdown_index = 0;

				if (w->classification == WC_DROPDOWN) {
					dropdown_index = dropdown_index_from_point(x, y, w);
					if (dropdown_index == -1) {
						goto dropdown_cleanup;
					}

					if (dropdown_index < 64 && gDropdownItemsDisabled & (1ULL << dropdown_index)) {
						goto dropdown_cleanup;
					}

					if (gDropdownItemsFormat[dropdown_index] == 0) {
						goto dropdown_cleanup;
					}
				}
				else {
					if (cursor_w_class != w->classification || cursor_w_number != w->number || widgetIndex != cursor_widgetIndex)
						goto dropdown_cleanup;
					dropdown_index = -1;
					if (_inputFlags & INPUT_FLAG_DROPDOWN_STAY_OPEN){
						if (!(_inputFlags & INPUT_FLAG_DROPDOWN_MOUSE_UP)){
							_inputFlags |= INPUT_FLAG_DROPDOWN_MOUSE_UP;
							return;
						}
					}
				}

				window_close_by_class(WC_DROPDOWN);
				cursor_w = window_find_by_number(cursor_w_class, cursor_w_number);
				if (_inputFlags & INPUT_FLAG_WIDGET_PRESSED) {
					_inputFlags &= ~INPUT_FLAG_WIDGET_PRESSED;
					widget_invalidate_by_number(cursor_w_class, cursor_w_number, cursor_widgetIndex);
				}

				_inputState = INPUT_STATE_NORMAL;
				gTooltipTimeout = 0;
				gTooltipWidget.widget_index = cursor_widgetIndex;
				gTooltipWidget.window_classification = cursor_w_class;
				gTooltipWidget.window_number = cursor_w_number;

				if (dropdown_index == -1) {
					if (!dropdown_is_disabled(gDropdownDefaultIndex)) {
						dropdown_index = gDropdownDefaultIndex;
					}
				}
				window_event_dropdown_call(cursor_w, cursor_widgetIndex, dropdown_index);
			}
		dropdown_cleanup:
			window_close_by_class(WC_DROPDOWN);
		}
		if (state == MOUSE_STATE_RIGHT_PRESS) {
			return;
		}

		_inputState = INPUT_STATE_NORMAL;
		gTooltipTimeout = 0;
		gTooltipWidget.widget_index = cursor_widgetIndex;

		if (!w)
			break;

		if (!widget)
			break;

		sint32 mid_point_x = (widget->left + widget->right) / 2 + w->x;
		audio_play_sound_panned(5, mid_point_x, 0, 0, 0);
		if (cursor_w_class != w->classification || cursor_w_number != w->number || widgetIndex != cursor_widgetIndex)
			break;

		if (w->disabled_widgets & (1ULL << widgetIndex))
			break;

		widget_invalidate_by_number(cursor_w_class, cursor_w_number, widgetIndex);
		window_event_mouse_up_call(w, widgetIndex);
	default:
		return;
	}

	_clickRepeatTicks = 0;
	if (_inputState != INPUT_STATE_DROPDOWN_ACTIVE){
		// Hold down widget and drag outside of area??
		if (_inputFlags & INPUT_FLAG_WIDGET_PRESSED){
			_inputFlags &= ~INPUT_FLAG_WIDGET_PRESSED;
			widget_invalidate_by_number(cursor_w_class, cursor_w_number, cursor_widgetIndex);
		}
		return;
	}

	gDropdownHighlightedIndex = -1;
	window_invalidate_by_class(WC_DROPDOWN);
	if (w == NULL) {
		return;
	}

	if (w->classification == WC_DROPDOWN){
		sint32 dropdown_index = dropdown_index_from_point(x, y, w);
		if (dropdown_index == -1) {
			return;
		}

		if (gDropdownIsColour && gDropdownLastColourHover != dropdown_index) {
			gDropdownLastColourHover = dropdown_index;
			window_tooltip_close();

			static const rct_string_id colourTooltips[] = {
				STR_COLOUR_BLACK_TIP,
				STR_COLOUR_GREY_TIP,
				STR_COLOUR_WHITE_TIP,
				STR_COLOUR_DARK_PURPLE_TIP,
				STR_COLOUR_LIGHT_PURPLE_TIP,
				STR_COLOUR_BRIGHT_PURPLE_TIP,
				STR_COLOUR_DARK_BLUE_TIP,
				STR_COLOUR_LIGHT_BLUE_TIP,
				STR_COLOUR_ICY_BLUE_TIP,
				STR_COLOUR_TEAL_TIP,
				STR_COLOUR_AQUAMARINE_TIP,
				STR_COLOUR_SATURATED_GREEN_TIP,
				STR_COLOUR_DARK_GREEN_TIP,
				STR_COLOUR_MOSS_GREEN_TIP,
				STR_COLOUR_BRIGHT_GREEN_TIP,
				STR_COLOUR_OLIVE_GREEN_TIP,
				STR_COLOUR_DARK_OLIVE_GREEN_TIP,
				STR_COLOUR_BRIGHT_YELLOW_TIP,
				STR_COLOUR_YELLOW_TIP,
				STR_COLOUR_DARK_YELLOW_TIP,
				STR_COLOUR_LIGHT_ORANGE_TIP,
				STR_COLOUR_DARK_ORANGE_TIP,
				STR_COLOUR_LIGHT_BROWN_TIP,
				STR_COLOUR_SATURATED_BROWN_TIP,
				STR_COLOUR_DARK_BROWN_TIP,
				STR_COLOUR_SALMON_PINK_TIP,
				STR_COLOUR_BORDEAUX_RED_TIP,
				STR_COLOUR_SATURATED_RED_TIP,
				STR_COLOUR_BRIGHT_RED_TIP,
				STR_COLOUR_DARK_PINK_TIP,
				STR_COLOUR_BRIGHT_PINK_TIP,
				STR_COLOUR_LIGHT_PINK_TIP,
			};

			window_tooltip_show(colourTooltips[dropdown_index], x, y);
		}

		if (dropdown_index < 64 && gDropdownItemsDisabled & (1ULL << dropdown_index)) {
			return;
		}

		if (gDropdownItemsFormat[dropdown_index] == 0) {
			return;
		}

		gDropdownHighlightedIndex = dropdown_index;
		window_invalidate_by_class(WC_DROPDOWN);
	} else {
		gDropdownLastColourHover = -1;
		window_tooltip_close();
	}
}
Beispiel #23
0
/**
 *
*  rct2: 0x006ED833
 */
void process_mouse_over(sint32 x, sint32 y)
{
	rct_window* window;

	sint32 cursorId;

	cursorId = CURSOR_ARROW;
	set_map_tooltip_format_arg(0, rct_string_id, STR_NONE);
	window = window_find_from_point(x, y);

	if (window != NULL) {
		sint32 ebx, edi;
		rct_window* subWindow;
		rct_widgetindex widgetId = window_find_widget_from_point(window, x, y);
		if (widgetId != -1) {
			switch (window->widgets[widgetId].type){

			case WWT_VIEWPORT:
				if (!(_inputFlags & INPUT_FLAG_TOOL_ACTIVE)) {
					if (viewport_interaction_left_over(x, y)) {
						sub_6ED990(CURSOR_HAND_POINT);
						return;
					}
					break;
				}
				cursorId = gCurrentToolId;
				subWindow = window_find_by_number(
					gCurrentToolWidget.window_classification,
					gCurrentToolWidget.window_number
					);
				if (subWindow == NULL)
					break;

				ebx = 0;
				edi = cursorId;
				// Window event WE_UNKNOWN_0E was called here, but no windows actually implemented a handler and
				// its not known what it was for
				cursorId = edi;
				if ((ebx & 0xFF) != 0)
				{
					sub_6ED990(cursorId);
					return;
				}
				break;

			case WWT_FRAME:
			case WWT_RESIZE:
				if (!(window->flags & WF_RESIZABLE))
					break;

				if (window->min_width == window->max_width && window->min_height == window->max_height)
					break;

				if (x < window->x + window->width - 0x13)
					break;

				if (y < window->y + window->height - 0x13)
					break;

				cursorId = CURSOR_DIAGONAL_ARROWS;
				break;

			case WWT_SCROLL:
			{
				sint32 output_scroll_area, scroll_id;
				sint32 scroll_x, scroll_y;
				widget_scroll_get_part(window, &window->widgets[widgetId], x, y, &scroll_x, &scroll_y, &output_scroll_area, &scroll_id);
				cursorId = scroll_id;
				if (output_scroll_area != SCROLL_PART_VIEW)
				{
					cursorId = CURSOR_ARROW;
					break;
				}
				// Same as default but with scroll_x/y
				cursorId = window_event_cursor_call(window, widgetId, scroll_x, scroll_y);
				if (cursorId == -1)
					cursorId = CURSOR_ARROW;
				break;
			}
			default:
				cursorId = window_event_cursor_call(window, widgetId, x, y);
				if (cursorId == -1)
					cursorId = CURSOR_ARROW;
				break;
			}
		}
	}

	viewport_interaction_right_over(x, y);
	sub_6ED990(cursorId);
}