mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2026-01-17 20:13:07 +01:00
Better widget behaviour and fixes
- Inset text for disabled labels and values - Spinners can be held down Other fixes: - Use correct types for widget indices - Use WINDOW_MAPGEN_PAGE_COUNT for arrays (when a new page is added in the future, the compiler will warn about all the arrays having an invalid size) - Sort code so that related arrays are placed near each other
This commit is contained in:
committed by
Michał Janiszewski
parent
55c1787a13
commit
c6e3ecd5ed
@@ -228,23 +228,13 @@ static rct_widget HeightmapWidgets[] = {
|
||||
{ WIDGETS_END },
|
||||
};
|
||||
|
||||
static const sint32 TabAnimationDivisor[] = { 1, 1, 1, 1 };
|
||||
static const sint32 TabAnimationFrames[] = { 1, 1, 1, 1 };
|
||||
|
||||
static rct_widget *PageWidgets[] = {
|
||||
static rct_widget *PageWidgets[WINDOW_MAPGEN_PAGE_COUNT] = {
|
||||
BaseWidgets,
|
||||
RandomWidgets,
|
||||
SimplexWidgets,
|
||||
HeightmapWidgets
|
||||
};
|
||||
|
||||
static uint64 PressedWidgets[] = {
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
(1ULL << WIDX_HEIGHTMAP_SMOOTH_TILES)
|
||||
};
|
||||
|
||||
#pragma endregion
|
||||
|
||||
#pragma region Events
|
||||
@@ -271,6 +261,7 @@ static void window_mapgen_simplex_invalidate(rct_window *w);
|
||||
static void window_mapgen_simplex_paint(rct_window *w, rct_drawpixelinfo *dpi);
|
||||
|
||||
static void window_mapgen_heightmap_mouseup(rct_window *w, sint32 widgetIndex);
|
||||
static void window_mapgen_heightmap_mousedown(sint32 widgetIndex, rct_window *w, rct_widget* widget);
|
||||
static void window_mapgen_heightmap_invalidate(rct_window *w);
|
||||
static void window_mapgen_heightmap_paint(rct_window *w, rct_drawpixelinfo *dpi);
|
||||
|
||||
@@ -371,7 +362,7 @@ static rct_window_event_list HeightmapEvents = {
|
||||
NULL,
|
||||
window_mapgen_heightmap_mouseup,
|
||||
NULL,
|
||||
NULL,
|
||||
window_mapgen_heightmap_mousedown,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
@@ -409,7 +400,7 @@ static rct_window_event_list *PageEvents[] = {
|
||||
|
||||
#pragma region Enabled widgets
|
||||
|
||||
static uint32 PageEnabledWidgets[] = {
|
||||
static uint64 PageEnabledWidgets[WINDOW_MAPGEN_PAGE_COUNT] = {
|
||||
(1ULL << WIDX_CLOSE) |
|
||||
(1ULL << WIDX_TAB_1) |
|
||||
(1ULL << WIDX_TAB_2) |
|
||||
@@ -488,36 +479,57 @@ static uint32 PageEnabledWidgets[] = {
|
||||
(1ULL << WIDX_HEIGHTMAP_WATER_LEVEL_DOWN)
|
||||
};
|
||||
|
||||
static uint32 window_mapgen_page_hold_down_widgets[] = {
|
||||
(1 << WIDX_MAP_SIZE_UP) |
|
||||
(1 << WIDX_MAP_SIZE_DOWN) |
|
||||
(1 << WIDX_BASE_HEIGHT_UP) |
|
||||
(1 << WIDX_BASE_HEIGHT_DOWN) |
|
||||
(1 << WIDX_WATER_LEVEL_UP) |
|
||||
(1 << WIDX_WATER_LEVEL_DOWN),
|
||||
static uint64 HoldDownWidgets[WINDOW_MAPGEN_PAGE_COUNT] = {
|
||||
(1ULL << WIDX_MAP_SIZE_UP) |
|
||||
(1ULL << WIDX_MAP_SIZE_DOWN) |
|
||||
(1ULL << WIDX_BASE_HEIGHT_UP) |
|
||||
(1ULL << WIDX_BASE_HEIGHT_DOWN) |
|
||||
(1ULL << WIDX_WATER_LEVEL_UP) |
|
||||
(1ULL << WIDX_WATER_LEVEL_DOWN),
|
||||
|
||||
0,
|
||||
|
||||
(1 << WIDX_SIMPLEX_LOW_UP) |
|
||||
(1 << WIDX_SIMPLEX_LOW_DOWN) |
|
||||
(1 << WIDX_SIMPLEX_HIGH_UP) |
|
||||
(1 << WIDX_SIMPLEX_HIGH_DOWN) |
|
||||
(1 << WIDX_SIMPLEX_BASE_FREQ_UP) |
|
||||
(1 << WIDX_SIMPLEX_BASE_FREQ_DOWN) |
|
||||
(1 << WIDX_SIMPLEX_OCTAVES_UP) |
|
||||
(1 << WIDX_SIMPLEX_OCTAVES_DOWN) |
|
||||
(1 << WIDX_SIMPLEX_MAP_SIZE_UP) |
|
||||
(1 << WIDX_SIMPLEX_MAP_SIZE_DOWN) |
|
||||
(1 << WIDX_SIMPLEX_WATER_LEVEL_UP) |
|
||||
(1 << WIDX_SIMPLEX_WATER_LEVEL_DOWN),
|
||||
(1ULL << WIDX_SIMPLEX_LOW_UP) |
|
||||
(1ULL << WIDX_SIMPLEX_LOW_DOWN) |
|
||||
(1ULL << WIDX_SIMPLEX_HIGH_UP) |
|
||||
(1ULL << WIDX_SIMPLEX_HIGH_DOWN) |
|
||||
(1ULL << WIDX_SIMPLEX_BASE_FREQ_UP) |
|
||||
(1ULL << WIDX_SIMPLEX_BASE_FREQ_DOWN) |
|
||||
(1ULL << WIDX_SIMPLEX_OCTAVES_UP) |
|
||||
(1ULL << WIDX_SIMPLEX_OCTAVES_DOWN) |
|
||||
(1ULL << WIDX_SIMPLEX_MAP_SIZE_UP) |
|
||||
(1ULL << WIDX_SIMPLEX_MAP_SIZE_DOWN) |
|
||||
(1ULL << WIDX_SIMPLEX_WATER_LEVEL_UP) |
|
||||
(1ULL << WIDX_SIMPLEX_WATER_LEVEL_DOWN),
|
||||
|
||||
0
|
||||
(1ULL << WIDX_HEIGHTMAP_STRENGTH_UP) |
|
||||
(1ULL << WIDX_HEIGHTMAP_STRENGTH_DOWN) |
|
||||
(1ULL << WIDX_HEIGHTMAP_LOW_UP) |
|
||||
(1ULL << WIDX_HEIGHTMAP_LOW_DOWN) |
|
||||
(1ULL << WIDX_HEIGHTMAP_HIGH_UP) |
|
||||
(1ULL << WIDX_HEIGHTMAP_HIGH_DOWN) |
|
||||
(1ULL << WIDX_HEIGHTMAP_WATER_LEVEL_UP) |
|
||||
(1ULL << WIDX_HEIGHTMAP_WATER_LEVEL_DOWN)
|
||||
};
|
||||
|
||||
static uint64 PressedWidgets[WINDOW_MAPGEN_PAGE_COUNT] = {
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
(1ULL << WIDX_HEIGHTMAP_SMOOTH_TILES)
|
||||
};
|
||||
|
||||
#pragma endregion
|
||||
|
||||
static const sint32 TabAnimationLoops[] = {
|
||||
16, 16, 16, 16
|
||||
static const sint32 TabAnimationDivisor[WINDOW_MAPGEN_PAGE_COUNT] = {
|
||||
1, 1, 1, 1
|
||||
};
|
||||
static const sint32 TabAnimationFrames[WINDOW_MAPGEN_PAGE_COUNT] = {
|
||||
1, 1, 1, 1
|
||||
};
|
||||
|
||||
static const sint32 TabAnimationLoops[WINDOW_MAPGEN_PAGE_COUNT] = {
|
||||
16, 16, 16, 0
|
||||
};
|
||||
|
||||
#define MINIMUM_MAP_SIZE_TECHNICAL 15
|
||||
@@ -562,7 +574,7 @@ static sint32 _simplex_octaves = 4;
|
||||
|
||||
static bool _heightmapSmoothMap = false;
|
||||
static sint32 _heightmapSmoothStrength = 1;
|
||||
static bool _heightmapNormalize = true;
|
||||
static bool _heightmapNormalize = false;
|
||||
static sint32 _heightmapLow = 6;
|
||||
static sint32 _heightmapHigh = 40;
|
||||
|
||||
@@ -587,7 +599,7 @@ rct_window *window_mapgen_open()
|
||||
window_invalidate(w);
|
||||
w->widgets = PageWidgets[WINDOW_MAPGEN_PAGE_BASE];
|
||||
w->enabled_widgets = PageEnabledWidgets[WINDOW_MAPGEN_PAGE_BASE];
|
||||
w->hold_down_widgets = window_mapgen_page_hold_down_widgets[WINDOW_MAPGEN_PAGE_BASE];
|
||||
w->hold_down_widgets = HoldDownWidgets[WINDOW_MAPGEN_PAGE_BASE];
|
||||
w->event_handlers = PageEvents[WINDOW_MAPGEN_PAGE_BASE];
|
||||
w->pressed_widgets = 0;
|
||||
w->disabled_widgets = 0;
|
||||
@@ -1143,6 +1155,47 @@ static void window_mapgen_simplex_paint(rct_window *w, rct_drawpixelinfo *dpi)
|
||||
|
||||
#pragma region Heightmap page
|
||||
|
||||
static void window_mapgen_heightmap_mousedown(sint32 widgetIndex, rct_window *w, rct_widget* widget)
|
||||
{
|
||||
switch (widgetIndex)
|
||||
{
|
||||
case WIDX_HEIGHTMAP_STRENGTH_UP:
|
||||
_heightmapSmoothStrength = min(_heightmapSmoothStrength + 1, MAX_SMOOTH_ITERATIONS);
|
||||
widget_invalidate(w, WIDX_HEIGHTMAP_STRENGTH);
|
||||
break;
|
||||
case WIDX_HEIGHTMAP_STRENGTH_DOWN:
|
||||
_heightmapSmoothStrength = max(_heightmapSmoothStrength - 1, 1);
|
||||
widget_invalidate(w, WIDX_HEIGHTMAP_STRENGTH);
|
||||
break;
|
||||
case WIDX_HEIGHTMAP_LOW_UP:
|
||||
_heightmapLow = min(_heightmapLow + 1, 142 - 1);
|
||||
_heightmapHigh = max(_heightmapHigh, _heightmapLow + 1);
|
||||
widget_invalidate(w, WIDX_HEIGHTMAP_LOW);
|
||||
break;
|
||||
case WIDX_HEIGHTMAP_LOW_DOWN:
|
||||
_heightmapLow = max(_heightmapLow - 1, 2);
|
||||
widget_invalidate(w, WIDX_HEIGHTMAP_LOW);
|
||||
break;
|
||||
case WIDX_HEIGHTMAP_HIGH_UP:
|
||||
_heightmapHigh = min(_heightmapHigh + 1, 142);
|
||||
widget_invalidate(w, WIDX_HEIGHTMAP_HIGH);
|
||||
break;
|
||||
case WIDX_HEIGHTMAP_HIGH_DOWN:
|
||||
_heightmapHigh = max(_heightmapHigh - 1, 2 + 1);
|
||||
_heightmapLow = min(_heightmapLow, _heightmapHigh - 1);
|
||||
widget_invalidate(w, WIDX_HEIGHTMAP_HIGH);
|
||||
break;
|
||||
case WIDX_HEIGHTMAP_WATER_LEVEL_UP:
|
||||
_waterLevel = min(_waterLevel + 2, 54);
|
||||
widget_invalidate(w, WIDX_HEIGHTMAP_WATER_LEVEL);
|
||||
break;
|
||||
case WIDX_HEIGHTMAP_WATER_LEVEL_DOWN:
|
||||
_waterLevel = max(_waterLevel - 2, 0);
|
||||
widget_invalidate(w, WIDX_HEIGHTMAP_WATER_LEVEL);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void window_mapgen_heightmap_mouseup(rct_window *w, sint32 widgetIndex)
|
||||
{
|
||||
switch (widgetIndex)
|
||||
@@ -1171,14 +1224,6 @@ static void window_mapgen_heightmap_mouseup(rct_window *w, sint32 widgetIndex)
|
||||
widget_invalidate(w, WIDX_HEIGHTMAP_SMOOTH_HEIGHTMAP);
|
||||
widget_invalidate(w, WIDX_HEIGHTMAP_STRENGTH);
|
||||
break;
|
||||
case WIDX_HEIGHTMAP_STRENGTH_UP:
|
||||
_heightmapSmoothStrength = min(_heightmapSmoothStrength + 1, MAX_SMOOTH_ITERATIONS);
|
||||
widget_invalidate(w, WIDX_HEIGHTMAP_STRENGTH);
|
||||
break;
|
||||
case WIDX_HEIGHTMAP_STRENGTH_DOWN:
|
||||
_heightmapSmoothStrength = max(_heightmapSmoothStrength - 1, 0);
|
||||
widget_invalidate(w, WIDX_HEIGHTMAP_STRENGTH);
|
||||
break;
|
||||
case WIDX_HEIGHTMAP_NORMALIZE:
|
||||
_heightmapNormalize = !_heightmapNormalize;
|
||||
widget_set_checkbox_value(w, WIDX_HEIGHTMAP_NORMALIZE, _heightmapNormalize);
|
||||
@@ -1188,32 +1233,6 @@ static void window_mapgen_heightmap_mouseup(rct_window *w, sint32 widgetIndex)
|
||||
widget_set_checkbox_value(w, WIDX_HEIGHTMAP_SMOOTH_TILES, !widget_is_pressed(w, WIDX_HEIGHTMAP_SMOOTH_TILES));
|
||||
widget_invalidate(w, WIDX_HEIGHTMAP_SMOOTH_TILES);
|
||||
break;
|
||||
case WIDX_HEIGHTMAP_LOW_UP:
|
||||
_heightmapLow = min(_heightmapLow + 1, 142 - 1);
|
||||
_heightmapHigh = max(_heightmapHigh, _heightmapLow + 1);
|
||||
window_invalidate(w);
|
||||
break;
|
||||
case WIDX_HEIGHTMAP_LOW_DOWN:
|
||||
_heightmapLow = max(_heightmapLow - 1, 2);
|
||||
window_invalidate(w);
|
||||
break;
|
||||
case WIDX_HEIGHTMAP_HIGH_UP:
|
||||
_heightmapHigh = min(_heightmapHigh + 1, 142);
|
||||
window_invalidate(w);
|
||||
break;
|
||||
case WIDX_HEIGHTMAP_HIGH_DOWN:
|
||||
_heightmapHigh = max(_heightmapHigh - 1, 2 + 1);
|
||||
_heightmapLow = min(_heightmapLow, _heightmapHigh - 1);
|
||||
window_invalidate(w);
|
||||
break;
|
||||
case WIDX_HEIGHTMAP_WATER_LEVEL_UP:
|
||||
_waterLevel = min(_waterLevel + 2, 54);
|
||||
window_invalidate(w);
|
||||
break;
|
||||
case WIDX_HEIGHTMAP_WATER_LEVEL_DOWN:
|
||||
_waterLevel = max(_waterLevel - 2, 0);
|
||||
window_invalidate(w);
|
||||
break;
|
||||
}
|
||||
|
||||
// Always regenerate the map after one of the page widgets has been changed
|
||||
@@ -1240,6 +1259,7 @@ static void window_mapgen_heightmap_invalidate(rct_window *w)
|
||||
window_init_scroll_widgets(w);
|
||||
}
|
||||
|
||||
widget_set_checkbox_value(w, WIDX_HEIGHTMAP_SMOOTH_HEIGHTMAP, _heightmapSmoothMap);
|
||||
widget_set_checkbox_value(w, WIDX_HEIGHTMAP_NORMALIZE, _heightmapNormalize);
|
||||
|
||||
window_mapgen_set_pressed_tab(w);
|
||||
@@ -1251,21 +1271,25 @@ static void window_mapgen_heightmap_paint(rct_window *w, rct_drawpixelinfo *dpi)
|
||||
window_draw_widgets(w, dpi);
|
||||
window_mapgen_draw_tab_images(dpi, w);
|
||||
|
||||
const uint8 enabledColour = w->colours[1];
|
||||
const uint8 disabledColour = enabledColour | COLOUR_FLAG_INSET;
|
||||
|
||||
// Smooth strength label and value
|
||||
gfx_draw_string_left(dpi, STR_MAPGEN_SMOOTH_STRENGTH, NULL, w->colours[1], w->x + 5, w->y + w->widgets[WIDX_HEIGHTMAP_STRENGTH].top + 1);
|
||||
gfx_draw_string_left(dpi, STR_COMMA16, &_heightmapSmoothStrength, w->colours[1], w->x + w->widgets[WIDX_HEIGHTMAP_STRENGTH].left + 1, w->y + w->widgets[WIDX_HEIGHTMAP_STRENGTH].top + 1);
|
||||
const uint8 strengthColour = _heightmapSmoothMap ? enabledColour : disabledColour;
|
||||
gfx_draw_string_left(dpi, STR_MAPGEN_SMOOTH_STRENGTH, NULL, strengthColour, w->x + 5, w->y + w->widgets[WIDX_HEIGHTMAP_STRENGTH].top + 1);
|
||||
gfx_draw_string_left(dpi, STR_COMMA16, &_heightmapSmoothStrength, strengthColour, w->x + w->widgets[WIDX_HEIGHTMAP_STRENGTH].left + 1, w->y + w->widgets[WIDX_HEIGHTMAP_STRENGTH].top + 1);
|
||||
|
||||
// Low label and value
|
||||
gfx_draw_string_left(dpi, STR_MAPGEN_SIMPLEX_NOISE_LOW_, NULL, COLOUR_BLACK, w->x + 5, w->y + w->widgets[WIDX_HEIGHTMAP_LOW].top + 1);
|
||||
gfx_draw_string_left(dpi, STR_COMMA16, &_heightmapLow, w->colours[1], w->x + w->widgets[WIDX_HEIGHTMAP_LOW].left + 1, w->y + w->widgets[WIDX_HEIGHTMAP_LOW].top + 1);
|
||||
gfx_draw_string_left(dpi, STR_COMMA16, &_heightmapLow, enabledColour, w->x + w->widgets[WIDX_HEIGHTMAP_LOW].left + 1, w->y + w->widgets[WIDX_HEIGHTMAP_LOW].top + 1);
|
||||
|
||||
// High label and value
|
||||
gfx_draw_string_left(dpi, STR_MAPGEN_SIMPLEX_NOISE_HIGH, NULL, COLOUR_BLACK, w->x + 5, w->y + w->widgets[WIDX_HEIGHTMAP_HIGH].top + 1);
|
||||
gfx_draw_string_left(dpi, STR_COMMA16, &_heightmapHigh, w->colours[1], w->x + w->widgets[WIDX_HEIGHTMAP_HIGH].left + 1, w->y + w->widgets[WIDX_HEIGHTMAP_HIGH].top + 1);
|
||||
gfx_draw_string_left(dpi, STR_COMMA16, &_heightmapHigh, enabledColour, w->x + w->widgets[WIDX_HEIGHTMAP_HIGH].left + 1, w->y + w->widgets[WIDX_HEIGHTMAP_HIGH].top + 1);
|
||||
|
||||
// Water level label and value
|
||||
gfx_draw_string_left(dpi, STR_WATER_LEVEL_LABEL, NULL, COLOUR_BLACK, w->x + 5, w->y + w->widgets[WIDX_HEIGHTMAP_WATER_LEVEL].top + 1);
|
||||
gfx_draw_string_left(dpi, STR_COMMA16, &_waterLevel, w->colours[1], w->x + w->widgets[WIDX_HEIGHTMAP_WATER_LEVEL].left + 1, w->y + w->widgets[WIDX_HEIGHTMAP_WATER_LEVEL].top + 1);
|
||||
gfx_draw_string_left(dpi, STR_COMMA16, &_waterLevel, enabledColour, w->x + w->widgets[WIDX_HEIGHTMAP_WATER_LEVEL].left + 1, w->y + w->widgets[WIDX_HEIGHTMAP_WATER_LEVEL].top + 1);
|
||||
}
|
||||
|
||||
#pragma endregion
|
||||
@@ -1282,7 +1306,7 @@ static void window_mapgen_set_page(rct_window *w, sint32 page)
|
||||
}
|
||||
|
||||
w->enabled_widgets = PageEnabledWidgets[page];
|
||||
w->hold_down_widgets = window_mapgen_page_hold_down_widgets[page];
|
||||
w->hold_down_widgets = HoldDownWidgets[page];
|
||||
w->event_handlers = PageEvents[page];
|
||||
w->widgets = PageWidgets[page];
|
||||
w->disabled_widgets = 0;
|
||||
|
||||
Reference in New Issue
Block a user