mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2026-01-27 08:45:00 +01:00
View clipping window fixes.
Cleaned up widget positions - looks like a proper interface now. Remaining Issues: - Window only displays correctly every second time it is opened; - Clip height in Units (ft/m) is displayed without the decimal point; - Scroll bar is not working; - Decide how the View menu entry should work.
This commit is contained in:
@@ -24,7 +24,7 @@
|
||||
#include "supports.h"
|
||||
|
||||
// zax: globals for paint clipping height
|
||||
uint8 gClipHeight = 255;
|
||||
uint8 gClipHeight = 128; // Default to middle value
|
||||
bool gClipHeightEnable = false;
|
||||
|
||||
const uint32 construction_markers[] = {
|
||||
|
||||
@@ -21,25 +21,26 @@
|
||||
#include "../interface/viewport.h"
|
||||
#include "../localisation/localisation.h"
|
||||
#include "../paint/paint.h"
|
||||
#include "../rct2.h"
|
||||
|
||||
enum WINDOW_VIEW_CLIPPING_WIDGET_IDX {
|
||||
WIDX_BACKGROUND,
|
||||
WIDX_TITLE,
|
||||
WIDX_CLOSE,
|
||||
WIDX_CLIP_HEIGHT_CHECKBOX,
|
||||
WIDX_CLIP_HEIGHT_SLIDER,
|
||||
WIDX_CLIP_HEIGHT_VALUE
|
||||
WIDX_CLIP_HEIGHT_VALUE,
|
||||
WIDX_CLIP_HEIGHT_SLIDER
|
||||
};
|
||||
|
||||
#pragma region Widgets
|
||||
|
||||
rct_widget window_view_clipping_widgets[] = {
|
||||
{ WWT_FRAME, 0, 0, 99, 0, 49, 0xFFFFFFFF, STR_NONE }, // panel / background
|
||||
{ WWT_CAPTION, 0, 1, 98, 1, 14, STR_VIEW_CLIPPING, STR_WINDOW_TITLE_TIP }, // title bar
|
||||
{ WWT_CLOSEBOX, 0, 87, 97, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close x button
|
||||
{ WWT_FRAME, 0, 0, 159, 0, 64, 0xFFFFFFFF, STR_NONE }, // panel / background
|
||||
{ WWT_CAPTION, 0, 1, 158, 1, 14, STR_VIEW_CLIPPING, STR_WINDOW_TITLE_TIP }, // title bar
|
||||
{ WWT_CLOSEBOX, 0, 147, 157, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close x button
|
||||
{ WWT_CHECKBOX, 1, 11, 89, 19, 29, STR_VIEW_CLIPPING_HEIGHT_ENABLE, STR_VIEW_CLIPPING_HEIGHT_ENABLE_TIP }, // clip height enable/disable check box
|
||||
{ WWT_SPINNER, 1, 11, 89, 34, 44, STR_VIEW_CLIPPING_HEIGHT_VALUE, STR_VIEW_CLIPPING_HEIGHT_SPINNER_TIP }, // clip height value spinner
|
||||
{ WWT_SCROLL, 1, 11, 89, 49, 59, SCROLL_HORIZONTAL, STR_VIEW_CLIPPING_HEIGHT_SCROLL_TIP }, // clip height scrollbar
|
||||
{ WWT_SPINNER, 1, 81, 139, 34, 44, STR_NONE, STR_NONE }, // clip height value spinner
|
||||
{ WWT_SCROLL, 1, 11, 149, 49, 59, SCROLL_HORIZONTAL, STR_VIEW_CLIPPING_HEIGHT_SCROLL_TIP }, // clip height scrollbar
|
||||
// Future: add checkbox(es) to only clip height in front of the cursor position; behind the cursor position is rendered normally.
|
||||
|
||||
{ WIDGETS_END }
|
||||
@@ -96,15 +97,17 @@ void window_view_clipping_open()
|
||||
{
|
||||
rct_window* window;
|
||||
|
||||
fprintf(stderr, "Open start\n");
|
||||
// Check if window is already open
|
||||
if (window_find_by_class(WC_VIEW_CLIPPING) != NULL)
|
||||
return;
|
||||
|
||||
window = window_create(gScreenWidth - 98, 29, 98, 94, &window_view_clipping_events, WC_VIEW_CLIPPING, 0);
|
||||
window = window_create(32, 32, 160, 65, &window_view_clipping_events, WC_VIEW_CLIPPING, 0);
|
||||
window->widgets = window_view_clipping_widgets;
|
||||
window->enabled_widgets = (1 << WIDX_CLOSE) |
|
||||
(1 << WIDX_CLIP_HEIGHT_CHECKBOX); //| (1 << WIDX_CLIP_HEIGHT_SLIDER);
|
||||
(1 << WIDX_CLIP_HEIGHT_CHECKBOX) |
|
||||
(1 << WIDX_CLIP_HEIGHT_VALUE) |
|
||||
(1 << WIDX_CLIP_HEIGHT_SLIDER);
|
||||
window->frame_no = 0; // Needed for scroll widgets to function?
|
||||
window_init_scroll_widgets(window);
|
||||
window_push_others_below(window);
|
||||
|
||||
@@ -132,7 +135,6 @@ void window_view_clipping_open()
|
||||
mainWindow->viewport->flags |= VIEWPORT_FLAG_PAINT_CLIP_TO_HEIGHT;
|
||||
window_invalidate(mainWindow);
|
||||
}
|
||||
fprintf(stderr, "Open end\n");
|
||||
}
|
||||
|
||||
void window_view_clipping_close()
|
||||
@@ -200,6 +202,7 @@ static void window_view_clipping_update(rct_window *w)
|
||||
}
|
||||
}
|
||||
widget_invalidate(w, WIDX_CLIP_HEIGHT_SLIDER);
|
||||
fprintf(stderr, "Update end\n");
|
||||
}
|
||||
|
||||
static void window_view_clipping_invalidate(rct_window *w)
|
||||
@@ -212,15 +215,15 @@ static void window_view_clipping_invalidate(rct_window *w)
|
||||
w->disabled_widgets = 0;
|
||||
// Disable the height slider and height value according to the height checkbox.
|
||||
rct_window *mainWindow = window_get_main();
|
||||
if (mainWindow != NULL) {
|
||||
if ((mainWindow->viewport->flags & VIEWPORT_FLAG_PAINT_CLIP_TO_HEIGHT) == 0) {
|
||||
w->disabled_widgets |= (1 << WIDX_CLIP_HEIGHT_SLIDER);
|
||||
w->disabled_widgets |= (1 << WIDX_CLIP_HEIGHT_VALUE);
|
||||
}
|
||||
}
|
||||
//if (mainWindow != NULL) {
|
||||
// if ((mainWindow->viewport->flags & VIEWPORT_FLAG_PAINT_CLIP_TO_HEIGHT) == 0) {
|
||||
// w->disabled_widgets |= (1 << WIDX_CLIP_HEIGHT_SLIDER);
|
||||
// w->disabled_widgets |= (1 << WIDX_CLIP_HEIGHT_VALUE);
|
||||
// }
|
||||
//}
|
||||
|
||||
// Set the clip height slider value.
|
||||
if (w->frame_no == 0) {
|
||||
if (w->frame_no == 0) { // No animation in this windows so should not be needed?
|
||||
widget = &window_view_clipping_widgets[WIDX_CLIP_HEIGHT_SLIDER];
|
||||
w->scrolls[0].h_left = (sint16)ceil((gClipHeight / 255.0f) * (w->scrolls[0].h_right - ((widget->right - widget->left) - 1)));
|
||||
}
|
||||
@@ -242,11 +245,7 @@ static void window_view_clipping_paint(rct_window *w, rct_drawpixelinfo *dpi)
|
||||
{
|
||||
window_draw_widgets(w, dpi);
|
||||
|
||||
// Clip height checkbox text
|
||||
// TODO: Adjust string position
|
||||
gfx_draw_string_left(dpi, STR_VIEW_CLIPPING_HEIGHT_ENABLE, w, w->colours[1], w->x + 10, w->y + window_view_clipping_widgets[WIDX_CLIP_HEIGHT_CHECKBOX].top + 1);
|
||||
|
||||
// TODO: Clip height value
|
||||
// Clip height value
|
||||
// Currently as a spinner.
|
||||
// Alternately could try putting the value on the scrollbar.
|
||||
int x;
|
||||
@@ -254,24 +253,25 @@ static void window_view_clipping_paint(rct_window *w, rct_drawpixelinfo *dpi)
|
||||
if (w->widgets[WIDX_CLIP_HEIGHT_VALUE].type != WWT_EMPTY) {
|
||||
x = w->x + 8;
|
||||
y = w->y + w->widgets[WIDX_CLIP_HEIGHT_VALUE].top;
|
||||
gfx_draw_string_left(dpi, STR_VIEW_CLIPPING_HEIGHT_VALUE, NULL, 0, x, y);
|
||||
gfx_draw_string_left(dpi, STR_VIEW_CLIPPING_HEIGHT_VALUE, NULL, w->colours[1], x, y);
|
||||
|
||||
x = w->x + w->widgets[WIDX_CLIP_HEIGHT_VALUE].left + 1;
|
||||
y = w->y + w->widgets[WIDX_CLIP_HEIGHT_VALUE].top;
|
||||
gfx_draw_string_left(dpi, STR_CURRENCY_FORMAT_LABEL, &gClipHeight, 0, x, y);
|
||||
gfx_draw_string_left(dpi, STR_FORMAT_INTEGER, &gClipHeight, w->colours[1], x, y); //Printing the raw value.
|
||||
|
||||
fixed8_1dp clipHeightValueInUnits; // The clip height in the unit type - feet or meters. TODO: value in meters needs to be a fixed point number w/ 1DP!
|
||||
fixed16_1dp clipHeightValueInUnits; // The clip height in the unit type - feet or meters. For value in meters a fixed point number is needed.
|
||||
switch (clipHeight_Units_StringId) {
|
||||
case STR_UNIT_SUFFIX_FEET:
|
||||
clipHeightValueInUnits = gClipHeight * 10 / 2 * 5 - 35 * 10; // The "* 10" shifts the decimal as appropriate for fixed8_1dp.
|
||||
clipHeightValueInUnits = FIXED_1DP(gClipHeight, 0) / 2 * 5 - FIXED_1DP(35,0);
|
||||
break;
|
||||
case STR_UNIT_SUFFIX_METRES:
|
||||
default:
|
||||
clipHeightValueInUnits = gClipHeight * 10 / 2 * 1.5 - 10.5; // The "* 10" shifts the decimal as appropriate for fixed8_1dp.
|
||||
clipHeightValueInUnits = FIXED_1DP(gClipHeight, 0) / 2 * 1.5 - FIXED_1DP(10,5);
|
||||
fprintf(stderr, "Meters: %d\n", clipHeightValueInUnits);
|
||||
break;
|
||||
}
|
||||
// TODO: Adjust string position
|
||||
gfx_draw_string_left(dpi, clipHeight_Units_StringId, &clipHeightValueInUnits, w->colours[1], w->x + 10, w->y + window_view_clipping_widgets[WIDX_CLIP_HEIGHT_VALUE].top + 1);
|
||||
// TODO: Display fixed point value correctly.
|
||||
gfx_draw_string_left(dpi, clipHeight_Units_StringId, &clipHeightValueInUnits, w->colours[1], x + 30, y);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user