2016-05-04 19:24:41 +02:00
|
|
|
#pragma region Copyright (c) 2014-2016 OpenRCT2 Developers
|
2014-04-09 15:43:27 +02:00
|
|
|
/*****************************************************************************
|
|
|
|
* OpenRCT2, an open source clone of Roller Coaster Tycoon 2.
|
|
|
|
*
|
2016-05-04 19:24:41 +02:00
|
|
|
* OpenRCT2 is the work of many authors, a full list can be found in contributors.md
|
|
|
|
* For more information, visit https://github.com/OpenRCT2/OpenRCT2
|
2014-04-09 15:43:27 +02:00
|
|
|
*
|
|
|
|
* OpenRCT2 is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
|
|
* (at your option) any later version.
|
2016-05-04 19:24:41 +02:00
|
|
|
*
|
|
|
|
* A full copy of the GNU General Public License can be found in licence.txt
|
2014-04-09 15:43:27 +02:00
|
|
|
*****************************************************************************/
|
2016-05-04 19:24:41 +02:00
|
|
|
#pragma endregion
|
2014-04-09 15:43:27 +02:00
|
|
|
|
2014-10-15 23:59:26 +02:00
|
|
|
#include "../input.h"
|
2014-10-06 18:36:58 +02:00
|
|
|
#include "../interface/widget.h"
|
|
|
|
#include "../interface/window.h"
|
|
|
|
#include "../localisation/localisation.h"
|
2016-12-01 15:05:00 +01:00
|
|
|
#include "../rct2.h"
|
2016-12-14 13:13:52 +01:00
|
|
|
#include "../scenario/scenario.h"
|
2014-10-06 18:36:58 +02:00
|
|
|
#include "../sprites.h"
|
|
|
|
#include "dropdown.h"
|
2014-04-09 15:43:27 +02:00
|
|
|
|
2017-01-04 22:17:08 +01:00
|
|
|
sint32 gAppropriateImageDropdownItemsPerRow[] = {
|
2014-04-18 20:00:27 +02:00
|
|
|
1, 1, 1, 1, 2, 2, 3, 3, 4,
|
|
|
|
3, 5, 4, 4, 5, 5, 5, 4, 5,
|
|
|
|
6, 5, 5, 7, 4, 5, 6, 5, 6,
|
|
|
|
6, 6, 6, 6, 8, 8, 0
|
|
|
|
};
|
|
|
|
|
2014-04-09 15:43:27 +02:00
|
|
|
enum {
|
|
|
|
WIDX_BACKGROUND,
|
|
|
|
};
|
|
|
|
|
|
|
|
static rct_widget window_dropdown_widgets[] = {
|
2016-05-19 08:55:41 +02:00
|
|
|
{ WWT_IMGBTN, 0, 0, 0, 0, 0, SPR_NONE, STR_NONE },
|
2014-04-09 15:43:27 +02:00
|
|
|
{ WIDGETS_END },
|
|
|
|
};
|
|
|
|
|
2017-01-04 22:17:08 +01:00
|
|
|
sint32 _dropdown_num_columns;
|
|
|
|
sint32 _dropdown_num_rows;
|
|
|
|
sint32 _dropdown_item_width;
|
|
|
|
sint32 _dropdown_item_height;
|
2014-04-09 15:43:27 +02:00
|
|
|
|
2017-01-04 22:17:08 +01:00
|
|
|
sint32 gDropdownNumItems;
|
2016-07-14 14:07:49 +02:00
|
|
|
rct_string_id gDropdownItemsFormat[64];
|
2014-05-11 17:50:29 +02:00
|
|
|
sint64 gDropdownItemsArgs[64];
|
2015-10-14 16:19:50 +02:00
|
|
|
uint64 gDropdownItemsChecked;
|
|
|
|
uint64 gDropdownItemsDisabled;
|
2015-09-01 08:08:28 +02:00
|
|
|
bool gDropdownIsColour;
|
2017-01-04 22:17:08 +01:00
|
|
|
sint32 gDropdownLastColourHover;
|
|
|
|
sint32 gDropdownHighlightedIndex;
|
|
|
|
sint32 gDropdownDefaultIndex;
|
2015-10-14 21:54:02 +02:00
|
|
|
|
2017-01-04 22:17:08 +01:00
|
|
|
bool dropdown_is_checked(sint32 index)
|
2015-10-14 21:54:02 +02:00
|
|
|
{
|
|
|
|
return gDropdownItemsChecked & (1ULL << index);
|
|
|
|
}
|
|
|
|
|
2017-01-04 22:17:08 +01:00
|
|
|
bool dropdown_is_disabled(sint32 index)
|
2016-01-18 00:37:14 +01:00
|
|
|
{
|
|
|
|
return gDropdownItemsDisabled & (1ULL << index);
|
|
|
|
}
|
|
|
|
|
2017-01-04 22:17:08 +01:00
|
|
|
void dropdown_set_checked(sint32 index, bool value)
|
2015-10-14 21:54:02 +02:00
|
|
|
{
|
|
|
|
if (value) {
|
|
|
|
gDropdownItemsChecked |= 1ULL << index;
|
|
|
|
} else {
|
|
|
|
gDropdownItemsChecked &= ~(1ULL << index);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-01-04 22:17:08 +01:00
|
|
|
void dropdown_set_disabled(sint32 index, bool value)
|
2015-10-14 21:54:02 +02:00
|
|
|
{
|
|
|
|
if (value) {
|
|
|
|
gDropdownItemsDisabled |= 1ULL << index;
|
|
|
|
} else {
|
|
|
|
gDropdownItemsDisabled &= ~(1ULL << index);
|
|
|
|
}
|
|
|
|
}
|
2014-04-09 15:43:27 +02:00
|
|
|
|
2015-07-10 02:39:16 +02:00
|
|
|
static void window_dropdown_paint(rct_window *w, rct_drawpixelinfo *dpi);
|
|
|
|
|
|
|
|
static rct_window_event_list window_dropdown_events = {
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
2014-04-09 15:43:27 +02:00
|
|
|
window_dropdown_paint,
|
2015-07-10 02:39:16 +02:00
|
|
|
NULL
|
2014-04-09 15:43:27 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Shows a text dropdown menu.
|
|
|
|
* rct2: 0x006ECFB9
|
|
|
|
*
|
|
|
|
* @param x (cx)
|
|
|
|
* @param y (dx)
|
|
|
|
* @param extray (di)
|
|
|
|
* @param flags (bh)
|
|
|
|
* @param num_items (bx)
|
|
|
|
* @param colour (al)
|
|
|
|
*/
|
2017-01-13 20:28:02 +01:00
|
|
|
void window_dropdown_show_text(sint32 x, sint32 y, sint32 extray, uint8 colour, uint8 flags, size_t num_items)
|
2014-04-20 04:31:54 +02:00
|
|
|
{
|
2017-01-13 20:28:02 +01:00
|
|
|
sint32 string_width, max_string_width;
|
2014-04-20 04:31:54 +02:00
|
|
|
char buffer[256];
|
|
|
|
|
|
|
|
// Calculate the longest string width
|
|
|
|
max_string_width = 0;
|
2017-01-13 20:28:02 +01:00
|
|
|
for (size_t i = 0; i < num_items; i++) {
|
2016-09-26 04:24:29 +02:00
|
|
|
format_string(buffer, 256, gDropdownItemsFormat[i], (void*)(&gDropdownItemsArgs[i]));
|
2016-04-26 00:00:58 +02:00
|
|
|
gCurrentFontSpriteBase = FONT_SPRITE_BASE_MEDIUM;
|
2014-04-20 04:31:54 +02:00
|
|
|
string_width = gfx_get_string_width(buffer);
|
|
|
|
max_string_width = max(string_width, max_string_width);
|
|
|
|
}
|
|
|
|
|
|
|
|
window_dropdown_show_text_custom_width(x, y, extray, colour, flags, num_items, max_string_width + 3);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Shows a text dropdown menu.
|
|
|
|
* rct2: 0x006ECFB9, although 0x006ECE50 is real version
|
|
|
|
*
|
|
|
|
* @param x (cx)
|
|
|
|
* @param y (dx)
|
|
|
|
* @param extray (di)
|
|
|
|
* @param flags (bh)
|
|
|
|
* @param num_items (bx)
|
|
|
|
* @param colour (al)
|
|
|
|
*/
|
2017-01-13 20:28:02 +01:00
|
|
|
void window_dropdown_show_text_custom_width(sint32 x, sint32 y, sint32 extray, uint8 colour, uint8 flags, size_t num_items, sint32 width)
|
2014-04-09 15:43:27 +02:00
|
|
|
{
|
|
|
|
rct_window* w;
|
|
|
|
|
2016-01-04 23:53:03 +01:00
|
|
|
gInputFlags &= ~(INPUT_FLAG_DROPDOWN_STAY_OPEN | INPUT_FLAG_DROPDOWN_MOUSE_UP);
|
2015-05-07 20:31:11 +02:00
|
|
|
if (flags & DROPDOWN_FLAG_STAY_OPEN)
|
2016-01-04 23:53:03 +01:00
|
|
|
gInputFlags |= INPUT_FLAG_DROPDOWN_STAY_OPEN;
|
2014-04-09 15:43:27 +02:00
|
|
|
|
|
|
|
window_dropdown_close();
|
|
|
|
_dropdown_num_columns = 1;
|
2014-04-20 04:31:54 +02:00
|
|
|
_dropdown_item_width = width;
|
2014-04-09 15:43:27 +02:00
|
|
|
_dropdown_item_height = 10;
|
|
|
|
if (flags & 0x40)
|
|
|
|
_dropdown_item_height = flags & 0x3F;
|
2015-10-20 20:16:30 +02:00
|
|
|
|
2014-04-09 15:43:27 +02:00
|
|
|
// Set the widgets
|
2017-01-13 20:28:02 +01:00
|
|
|
gDropdownNumItems = (sint32)num_items;
|
|
|
|
_dropdown_num_rows = (sint32)num_items;
|
2015-01-17 10:14:17 +01:00
|
|
|
|
|
|
|
width = _dropdown_item_width * _dropdown_num_columns + 3;
|
2017-01-04 22:17:08 +01:00
|
|
|
sint32 height = _dropdown_item_height * _dropdown_num_rows + 3;
|
2016-04-24 01:36:39 +02:00
|
|
|
if (x + width > gScreenWidth)
|
|
|
|
x = max(0, gScreenWidth - width);
|
|
|
|
if (y + height > gScreenHeight)
|
|
|
|
y = max(0, gScreenHeight - height);
|
2015-01-17 10:14:17 +01:00
|
|
|
|
2017-01-13 20:28:02 +01:00
|
|
|
window_dropdown_widgets[WIDX_BACKGROUND].bottom = (sint16)(_dropdown_item_height * num_items + 3);
|
|
|
|
window_dropdown_widgets[WIDX_BACKGROUND].right = (sint16)(_dropdown_item_width + 3);
|
2014-04-09 15:43:27 +02:00
|
|
|
|
|
|
|
// Create the window
|
|
|
|
w = window_create(
|
|
|
|
x, y + extray,
|
|
|
|
window_dropdown_widgets[WIDX_BACKGROUND].right + 1,
|
|
|
|
window_dropdown_widgets[WIDX_BACKGROUND].bottom + 1,
|
2015-07-10 02:39:16 +02:00
|
|
|
&window_dropdown_events,
|
2014-04-09 15:43:27 +02:00
|
|
|
WC_DROPDOWN,
|
2016-11-13 23:29:03 +01:00
|
|
|
WF_STICK_TO_FRONT
|
2014-04-09 15:43:27 +02:00
|
|
|
);
|
|
|
|
w->widgets = window_dropdown_widgets;
|
2016-11-13 23:29:03 +01:00
|
|
|
if (colour & COLOUR_FLAG_TRANSLUCENT)
|
2014-04-09 15:43:27 +02:00
|
|
|
w->flags |= WF_TRANSPARENT;
|
|
|
|
w->colours[0] = colour;
|
|
|
|
|
|
|
|
// Input state
|
2015-10-14 21:54:02 +02:00
|
|
|
gDropdownHighlightedIndex = -1;
|
2015-10-14 16:19:50 +02:00
|
|
|
gDropdownItemsDisabled = 0;
|
2014-04-11 03:42:39 +02:00
|
|
|
gDropdownItemsChecked = 0;
|
2015-09-01 08:08:28 +02:00
|
|
|
gDropdownIsColour = false;
|
2016-01-18 00:37:14 +01:00
|
|
|
gDropdownDefaultIndex = -1;
|
2016-01-04 23:45:51 +01:00
|
|
|
gInputState = INPUT_STATE_DROPDOWN_ACTIVE;
|
2014-04-09 15:43:27 +02:00
|
|
|
}
|
|
|
|
|
2014-04-18 20:00:27 +02:00
|
|
|
/**
|
2014-04-20 04:31:54 +02:00
|
|
|
* Shows an image dropdown menu.
|
2014-04-18 20:00:27 +02:00
|
|
|
* rct2: 0x006ECFB9
|
|
|
|
*
|
|
|
|
* @param x (cx)
|
|
|
|
* @param y (dx)
|
|
|
|
* @param extray (di)
|
|
|
|
* @param flags (bh)
|
|
|
|
* @param numItems (bx)
|
|
|
|
* @param colour (al)
|
|
|
|
* @param itemWidth (bp)
|
|
|
|
* @param itemHeight (ah)
|
|
|
|
* @param numColumns (bl)
|
|
|
|
*/
|
2017-01-04 22:17:08 +01:00
|
|
|
void window_dropdown_show_image(sint32 x, sint32 y, sint32 extray, uint8 colour, uint8 flags, sint32 numItems, sint32 itemWidth, sint32 itemHeight, sint32 numColumns)
|
2014-04-18 20:00:27 +02:00
|
|
|
{
|
2017-01-04 22:17:08 +01:00
|
|
|
sint32 width, height;
|
2014-04-18 20:00:27 +02:00
|
|
|
rct_window* w;
|
|
|
|
|
2016-01-04 23:53:03 +01:00
|
|
|
gInputFlags &= ~(INPUT_FLAG_DROPDOWN_STAY_OPEN | INPUT_FLAG_DROPDOWN_MOUSE_UP);
|
2015-05-07 20:31:11 +02:00
|
|
|
if (flags & DROPDOWN_FLAG_STAY_OPEN)
|
2016-01-04 23:53:03 +01:00
|
|
|
gInputFlags |= INPUT_FLAG_DROPDOWN_STAY_OPEN;
|
2014-04-18 20:00:27 +02:00
|
|
|
|
|
|
|
// Close existing dropdown
|
|
|
|
window_dropdown_close();
|
|
|
|
|
|
|
|
// Set and calculate num items, rows and columns
|
|
|
|
_dropdown_item_width = itemWidth;
|
|
|
|
_dropdown_item_height = itemHeight;
|
2014-09-01 15:06:21 +02:00
|
|
|
gDropdownNumItems = numItems;
|
2014-04-18 20:00:27 +02:00
|
|
|
_dropdown_num_columns = numColumns;
|
2014-09-01 15:06:21 +02:00
|
|
|
_dropdown_num_rows = gDropdownNumItems / _dropdown_num_columns;
|
|
|
|
if (gDropdownNumItems % _dropdown_num_columns != 0)
|
2014-04-18 20:00:27 +02:00
|
|
|
_dropdown_num_rows++;
|
|
|
|
|
|
|
|
// Calculate position and size
|
|
|
|
width = _dropdown_item_width * _dropdown_num_columns + 3;
|
|
|
|
height = _dropdown_item_height * _dropdown_num_rows + 3;
|
2016-04-24 01:36:39 +02:00
|
|
|
if (x + width > gScreenWidth)
|
|
|
|
x = max(0, gScreenWidth - width);
|
|
|
|
if (y + height > gScreenHeight)
|
|
|
|
y = max(0, gScreenHeight - height);
|
2014-04-18 20:00:27 +02:00
|
|
|
window_dropdown_widgets[WIDX_BACKGROUND].right = width;
|
|
|
|
window_dropdown_widgets[WIDX_BACKGROUND].bottom = height;
|
|
|
|
|
|
|
|
// Create the window
|
|
|
|
w = window_create(
|
|
|
|
x, y + extray,
|
|
|
|
window_dropdown_widgets[WIDX_BACKGROUND].right + 1,
|
|
|
|
window_dropdown_widgets[WIDX_BACKGROUND].bottom + 1,
|
2015-07-10 02:39:16 +02:00
|
|
|
&window_dropdown_events,
|
2014-04-18 20:00:27 +02:00
|
|
|
WC_DROPDOWN,
|
2014-04-24 21:26:05 +02:00
|
|
|
WF_STICK_TO_FRONT
|
2014-04-18 20:00:27 +02:00
|
|
|
);
|
|
|
|
w->widgets = window_dropdown_widgets;
|
2016-11-13 23:29:03 +01:00
|
|
|
if (colour & COLOUR_FLAG_TRANSLUCENT)
|
2014-04-18 20:00:27 +02:00
|
|
|
w->flags |= WF_TRANSPARENT;
|
|
|
|
w->colours[0] = colour;
|
|
|
|
|
|
|
|
// Input state
|
2015-10-14 21:54:02 +02:00
|
|
|
gDropdownHighlightedIndex = -1;
|
2015-10-14 16:19:50 +02:00
|
|
|
gDropdownItemsDisabled = 0;
|
2014-04-18 20:00:27 +02:00
|
|
|
gDropdownItemsChecked = 0;
|
2015-09-01 08:08:28 +02:00
|
|
|
gDropdownIsColour = false;
|
2016-01-18 00:37:14 +01:00
|
|
|
gDropdownDefaultIndex = -1;
|
|
|
|
gInputState = INPUT_STATE_DROPDOWN_ACTIVE;
|
2014-04-18 20:00:27 +02:00
|
|
|
}
|
|
|
|
|
2014-04-09 15:43:27 +02:00
|
|
|
void window_dropdown_close()
|
|
|
|
{
|
2014-10-16 03:02:43 +02:00
|
|
|
window_close_by_class(WC_DROPDOWN);
|
2014-04-09 15:43:27 +02:00
|
|
|
}
|
|
|
|
|
2015-07-10 02:39:16 +02:00
|
|
|
static void window_dropdown_paint(rct_window *w, rct_drawpixelinfo *dpi)
|
2014-04-09 15:43:27 +02:00
|
|
|
{
|
2017-01-04 22:17:08 +01:00
|
|
|
sint32 cell_x, cell_y, l, t, r, b, item, image, colour;
|
2014-04-09 15:43:27 +02:00
|
|
|
|
|
|
|
window_draw_widgets(w, dpi);
|
|
|
|
|
2017-01-04 22:17:08 +01:00
|
|
|
sint32 highlightedIndex = gDropdownHighlightedIndex;
|
|
|
|
for (sint32 i = 0; i < gDropdownNumItems; i++) {
|
2015-07-10 02:39:16 +02:00
|
|
|
cell_x = i % _dropdown_num_columns;
|
|
|
|
cell_y = i / _dropdown_num_columns;
|
|
|
|
|
|
|
|
if (gDropdownItemsFormat[i] == DROPDOWN_SEPARATOR) {
|
|
|
|
l = w->x + 2 + (cell_x * _dropdown_item_width);
|
|
|
|
t = w->y + 2 + (cell_y * _dropdown_item_height);
|
|
|
|
r = l + _dropdown_item_width - 1;
|
|
|
|
t += (_dropdown_item_height / 2);
|
|
|
|
b = t;
|
|
|
|
|
2016-08-06 19:47:55 +02:00
|
|
|
if (w->colours[0] & COLOUR_FLAG_TRANSLUCENT) {
|
2016-11-10 13:20:47 +01:00
|
|
|
translucent_window_palette palette = TranslucentWindowPalettes[BASE_COLOUR(w->colours[0])];
|
|
|
|
gfx_filter_rect(dpi, l, t, r, b, palette.highlight);
|
|
|
|
gfx_filter_rect(dpi, l, t + 1, r, b + 1, palette.shadow);
|
2015-07-10 02:39:16 +02:00
|
|
|
} else {
|
2015-11-08 19:55:32 +01:00
|
|
|
gfx_fill_rect(dpi, l, t, r, b, ColourMapA[w->colours[0]].mid_dark);
|
|
|
|
gfx_fill_rect(dpi, l, t + 1, r, b + 1, ColourMapA[w->colours[0]].lightest);
|
2015-07-10 02:39:16 +02:00
|
|
|
}
|
|
|
|
} else {
|
2015-10-20 20:16:30 +02:00
|
|
|
//
|
2016-01-18 00:37:14 +01:00
|
|
|
if (i == highlightedIndex) {
|
2014-04-09 15:43:27 +02:00
|
|
|
l = w->x + 2 + (cell_x * _dropdown_item_width);
|
|
|
|
t = w->y + 2 + (cell_y * _dropdown_item_height);
|
|
|
|
r = l + _dropdown_item_width - 1;
|
2015-07-10 02:39:16 +02:00
|
|
|
b = t + _dropdown_item_height - 1;
|
2016-11-10 00:03:12 +01:00
|
|
|
gfx_filter_rect(dpi, l, t, r, b, PALETTE_DARKEN_3);
|
2015-07-10 02:39:16 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
item = gDropdownItemsFormat[i];
|
|
|
|
if (item == (uint16)-1 || item == (uint16)-2) {
|
|
|
|
// Image item
|
2015-12-31 09:16:44 +01:00
|
|
|
image = (uint32)gDropdownItemsArgs[i];
|
2016-01-18 00:37:14 +01:00
|
|
|
if (item == (uint16)-2 && highlightedIndex == i)
|
2015-07-10 02:39:16 +02:00
|
|
|
image++;
|
|
|
|
|
|
|
|
gfx_draw_sprite(
|
|
|
|
dpi,
|
|
|
|
image,
|
|
|
|
w->x + 2 + (cell_x * _dropdown_item_width),
|
|
|
|
w->y + 2 + (cell_y * _dropdown_item_height), 0
|
|
|
|
);
|
2014-04-09 15:43:27 +02:00
|
|
|
} else {
|
2015-07-10 02:39:16 +02:00
|
|
|
// Text item
|
2015-10-14 21:54:02 +02:00
|
|
|
if (i < 64) {
|
|
|
|
if (dropdown_is_checked(i)) {
|
2015-07-10 02:39:16 +02:00
|
|
|
item++;
|
2015-10-14 21:54:02 +02:00
|
|
|
}
|
|
|
|
}
|
2015-07-10 02:39:16 +02:00
|
|
|
|
|
|
|
// Calculate colour
|
2016-08-06 19:47:55 +02:00
|
|
|
colour = NOT_TRANSLUCENT(w->colours[0]);
|
2016-01-18 00:37:14 +01:00
|
|
|
if (i == highlightedIndex)
|
2016-11-13 18:44:34 +01:00
|
|
|
colour = COLOUR_WHITE;
|
2016-01-18 00:37:14 +01:00
|
|
|
if (dropdown_is_disabled(i))
|
2015-10-14 16:19:50 +02:00
|
|
|
if (i < 64)
|
2016-11-13 18:44:34 +01:00
|
|
|
colour = NOT_TRANSLUCENT(w->colours[0]) | COLOUR_FLAG_INSET;
|
2015-07-10 02:39:16 +02:00
|
|
|
|
|
|
|
// Draw item string
|
|
|
|
gfx_draw_string_left_clipped(
|
|
|
|
dpi,
|
|
|
|
item,
|
|
|
|
(void*)(&gDropdownItemsArgs[i]), colour,
|
|
|
|
w->x + 2 + (cell_x * _dropdown_item_width),
|
|
|
|
w->y + 1 + (cell_y * _dropdown_item_height),
|
|
|
|
w->width - 5
|
|
|
|
);
|
2014-04-09 15:43:27 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2014-04-21 11:27:48 +02:00
|
|
|
}
|
2014-09-13 09:29:27 +02:00
|
|
|
|
2015-12-11 16:38:37 +01:00
|
|
|
/**
|
|
|
|
* New function based on 6e914e
|
2014-09-13 09:29:27 +02:00
|
|
|
* returns -1 if index is invalid
|
|
|
|
*/
|
2017-01-04 22:17:08 +01:00
|
|
|
sint32 dropdown_index_from_point(sint32 x, sint32 y, rct_window *w)
|
2015-10-14 21:54:02 +02:00
|
|
|
{
|
2017-01-04 22:17:08 +01:00
|
|
|
sint32 top = y - w->y - 2;
|
2014-09-13 09:29:27 +02:00
|
|
|
if (top < 0) return -1;
|
|
|
|
|
2017-01-04 22:17:08 +01:00
|
|
|
sint32 left = x - w->x;
|
2014-09-13 09:29:27 +02:00
|
|
|
if (left >= w->width) return -1;
|
|
|
|
left -= 2;
|
|
|
|
if (left < 0) return -1;
|
|
|
|
|
2017-01-04 22:17:08 +01:00
|
|
|
sint32 column_no = left / _dropdown_item_width;
|
2015-10-14 21:54:02 +02:00
|
|
|
if (column_no >= _dropdown_num_columns) return -1;
|
|
|
|
|
2017-01-04 22:17:08 +01:00
|
|
|
sint32 row_no = top / _dropdown_item_height;
|
2015-10-14 21:54:02 +02:00
|
|
|
if (row_no >= _dropdown_num_rows) return -1;
|
2014-09-13 09:29:27 +02:00
|
|
|
|
2017-01-04 22:17:08 +01:00
|
|
|
sint32 dropdown_index = row_no * _dropdown_num_columns + column_no;
|
2015-10-14 21:54:02 +02:00
|
|
|
if (dropdown_index >= gDropdownNumItems) return -1;
|
2014-09-13 09:29:27 +02:00
|
|
|
|
|
|
|
return dropdown_index;
|
|
|
|
}
|
2014-09-14 19:43:36 +02:00
|
|
|
|
2014-09-23 22:22:14 +02:00
|
|
|
void window_dropdown_show_colour(rct_window *w, rct_widget *widget, uint8 dropdownColour, uint8 selectedColour)
|
|
|
|
{
|
|
|
|
window_dropdown_show_colour_available(w, widget, dropdownColour, selectedColour, 0xFFFFFFFF);
|
|
|
|
}
|
|
|
|
|
2014-09-14 19:43:36 +02:00
|
|
|
/**
|
2015-12-11 16:38:37 +01:00
|
|
|
*
|
2014-09-14 19:43:36 +02:00
|
|
|
* rct2: 0x006ED43D
|
|
|
|
* al: dropdown colour
|
|
|
|
* ah: selected colour
|
|
|
|
* esi: window
|
|
|
|
* edi: widget
|
|
|
|
* ebp: unknown
|
|
|
|
*/
|
2014-09-23 22:22:14 +02:00
|
|
|
void window_dropdown_show_colour_available(rct_window *w, rct_widget *widget, uint8 dropdownColour, uint8 selectedColour,
|
|
|
|
uint32 availableColours)
|
2014-09-14 19:43:36 +02:00
|
|
|
{
|
2017-01-04 22:17:08 +01:00
|
|
|
sint32 i, numItems;
|
2015-10-20 20:16:30 +02:00
|
|
|
|
2014-09-23 22:22:14 +02:00
|
|
|
// Count number of available colours
|
|
|
|
numItems = 0;
|
|
|
|
for (i = 0; i < 32; i++)
|
|
|
|
if (availableColours & (1 << i))
|
|
|
|
numItems++;
|
|
|
|
|
2017-01-04 22:17:08 +01:00
|
|
|
sint32 defaultIndex = -1;
|
2015-04-23 21:40:53 +02:00
|
|
|
// Set items
|
|
|
|
for (i = 0; i < 32; i++) {
|
|
|
|
if (availableColours & (1 << i)) {
|
|
|
|
if (selectedColour == i)
|
2016-01-24 20:10:26 +01:00
|
|
|
defaultIndex = i;
|
2015-04-23 21:40:53 +02:00
|
|
|
|
|
|
|
gDropdownItemsFormat[i] = 0xFFFE;
|
2016-07-14 14:07:49 +02:00
|
|
|
gDropdownItemsArgs[i] = ((uint64)i << 32) | (0x20000000 | (i << 19) | SPR_PALETTE_BTN);
|
2015-04-23 21:40:53 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-09-23 22:22:14 +02:00
|
|
|
// Show dropdown
|
|
|
|
window_dropdown_show_image(
|
|
|
|
w->x + widget->left,
|
|
|
|
w->y + widget->top,
|
|
|
|
widget->bottom - widget->top + 1,
|
|
|
|
dropdownColour,
|
2015-05-07 20:31:11 +02:00
|
|
|
DROPDOWN_FLAG_STAY_OPEN,
|
2014-09-23 22:22:14 +02:00
|
|
|
numItems,
|
|
|
|
12,
|
|
|
|
12,
|
|
|
|
gAppropriateImageDropdownItemsPerRow[numItems]
|
|
|
|
);
|
|
|
|
|
2015-09-01 08:08:28 +02:00
|
|
|
gDropdownIsColour = true;
|
|
|
|
gDropdownLastColourHover = -1;
|
2016-01-24 20:10:26 +01:00
|
|
|
gDropdownDefaultIndex = defaultIndex;
|
2014-09-14 19:43:36 +02:00
|
|
|
}
|