|
|
|
@ -21,34 +21,34 @@
|
|
|
|
|
#include <openrct2/sprites.h>
|
|
|
|
|
#include <openrct2/util/Util.h>
|
|
|
|
|
|
|
|
|
|
static void WidgetFrameDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetIndex);
|
|
|
|
|
static void WidgetResizeDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetIndex);
|
|
|
|
|
static void WidgetButtonDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetIndex);
|
|
|
|
|
static void WidgetTabDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetIndex);
|
|
|
|
|
static void WidgetFlatButtonDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetIndex);
|
|
|
|
|
static void WidgetTextButton(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetIndex);
|
|
|
|
|
static void WidgetTextCentred(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetIndex);
|
|
|
|
|
static void WidgetText(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetIndex);
|
|
|
|
|
static void WidgetTextInset(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetIndex);
|
|
|
|
|
static void WidgetTextBoxDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetIndex);
|
|
|
|
|
static void WidgetGroupboxDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetIndex);
|
|
|
|
|
static void WidgetCaptionDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetIndex);
|
|
|
|
|
static void WidgetCheckboxDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetIndex);
|
|
|
|
|
static void WidgetCloseboxDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetIndex);
|
|
|
|
|
static void WidgetScrollDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetIndex);
|
|
|
|
|
static void WidgetFrameDraw(rct_drawpixelinfo* dpi, rct_window& w, rct_widgetindex widgetIndex);
|
|
|
|
|
static void WidgetResizeDraw(rct_drawpixelinfo* dpi, rct_window& w, rct_widgetindex widgetIndex);
|
|
|
|
|
static void WidgetButtonDraw(rct_drawpixelinfo* dpi, rct_window& w, rct_widgetindex widgetIndex);
|
|
|
|
|
static void WidgetTabDraw(rct_drawpixelinfo* dpi, rct_window& w, rct_widgetindex widgetIndex);
|
|
|
|
|
static void WidgetFlatButtonDraw(rct_drawpixelinfo* dpi, rct_window& w, rct_widgetindex widgetIndex);
|
|
|
|
|
static void WidgetTextButton(rct_drawpixelinfo* dpi, rct_window& w, rct_widgetindex widgetIndex);
|
|
|
|
|
static void WidgetTextCentred(rct_drawpixelinfo* dpi, rct_window& w, rct_widgetindex widgetIndex);
|
|
|
|
|
static void WidgetText(rct_drawpixelinfo* dpi, rct_window& w, rct_widgetindex widgetIndex);
|
|
|
|
|
static void WidgetTextInset(rct_drawpixelinfo* dpi, rct_window& w, rct_widgetindex widgetIndex);
|
|
|
|
|
static void WidgetTextBoxDraw(rct_drawpixelinfo* dpi, rct_window& w, rct_widgetindex widgetIndex);
|
|
|
|
|
static void WidgetGroupboxDraw(rct_drawpixelinfo* dpi, rct_window& w, rct_widgetindex widgetIndex);
|
|
|
|
|
static void WidgetCaptionDraw(rct_drawpixelinfo* dpi, rct_window& w, rct_widgetindex widgetIndex);
|
|
|
|
|
static void WidgetCheckboxDraw(rct_drawpixelinfo* dpi, rct_window& w, rct_widgetindex widgetIndex);
|
|
|
|
|
static void WidgetCloseboxDraw(rct_drawpixelinfo* dpi, rct_window& w, rct_widgetindex widgetIndex);
|
|
|
|
|
static void WidgetScrollDraw(rct_drawpixelinfo* dpi, rct_window& w, rct_widgetindex widgetIndex);
|
|
|
|
|
static void WidgetHScrollbarDraw(
|
|
|
|
|
rct_drawpixelinfo* dpi, const rct_scroll& scroll, int32_t l, int32_t t, int32_t r, int32_t b, int32_t colour);
|
|
|
|
|
static void WidgetVScrollbarDraw(
|
|
|
|
|
rct_drawpixelinfo* dpi, const rct_scroll& scroll, int32_t l, int32_t t, int32_t r, int32_t b, int32_t colour);
|
|
|
|
|
static void WidgetDrawImage(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetIndex);
|
|
|
|
|
static void WidgetDrawImage(rct_drawpixelinfo* dpi, rct_window& w, rct_widgetindex widgetIndex);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
|
* rct2: 0x006EB2A8
|
|
|
|
|
*/
|
|
|
|
|
void WidgetDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetIndex)
|
|
|
|
|
void WidgetDraw(rct_drawpixelinfo* dpi, rct_window& w, rct_widgetindex widgetIndex)
|
|
|
|
|
{
|
|
|
|
|
const auto* widget = GetWidgetByIndex(*w, widgetIndex);
|
|
|
|
|
const auto* widget = GetWidgetByIndex(w, widgetIndex);
|
|
|
|
|
if (widget == nullptr)
|
|
|
|
|
{
|
|
|
|
|
log_error("Tried drawing an out-of-bounds widget index!");
|
|
|
|
@ -116,33 +116,33 @@ void WidgetDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetInd
|
|
|
|
|
*
|
|
|
|
|
* rct2: 0x006EB6CE
|
|
|
|
|
*/
|
|
|
|
|
static void WidgetFrameDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetIndex)
|
|
|
|
|
static void WidgetFrameDraw(rct_drawpixelinfo* dpi, rct_window& w, rct_widgetindex widgetIndex)
|
|
|
|
|
{
|
|
|
|
|
// Get the widget
|
|
|
|
|
const auto& widget = w->widgets[widgetIndex];
|
|
|
|
|
const auto& widget = w.widgets[widgetIndex];
|
|
|
|
|
|
|
|
|
|
// Resolve the absolute ltrb
|
|
|
|
|
auto leftTop = w->windowPos + ScreenCoordsXY{ widget.left, widget.top };
|
|
|
|
|
int32_t r = w->windowPos.x + widget.right;
|
|
|
|
|
int32_t b = w->windowPos.y + widget.bottom;
|
|
|
|
|
auto leftTop = w.windowPos + ScreenCoordsXY{ widget.left, widget.top };
|
|
|
|
|
int32_t r = w.windowPos.x + widget.right;
|
|
|
|
|
int32_t b = w.windowPos.y + widget.bottom;
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
uint8_t press = ((w->flags & WF_10) ? INSET_RECT_FLAG_FILL_MID_LIGHT : 0);
|
|
|
|
|
uint8_t press = ((w.flags & WF_10) ? INSET_RECT_FLAG_FILL_MID_LIGHT : 0);
|
|
|
|
|
|
|
|
|
|
// Get the colour
|
|
|
|
|
uint8_t colour = w->colours[widget.colour];
|
|
|
|
|
uint8_t colour = w.colours[widget.colour];
|
|
|
|
|
|
|
|
|
|
// Draw the frame
|
|
|
|
|
gfx_fill_rect_inset(dpi, { leftTop, { r, b } }, colour, press);
|
|
|
|
|
|
|
|
|
|
// Check if the window can be resized
|
|
|
|
|
if (!(w->flags & WF_RESIZABLE))
|
|
|
|
|
if (!(w.flags & WF_RESIZABLE))
|
|
|
|
|
return;
|
|
|
|
|
if (w->min_width == w->max_width && w->min_height == w->max_height)
|
|
|
|
|
if (w.min_width == w.max_width && w.min_height == w.max_height)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
// Draw the resize sprite at the bottom right corner
|
|
|
|
|
leftTop = w->windowPos + ScreenCoordsXY{ widget.right - 18, widget.bottom - 18 };
|
|
|
|
|
leftTop = w.windowPos + ScreenCoordsXY{ widget.right - 18, widget.bottom - 18 };
|
|
|
|
|
gfx_draw_sprite(dpi, ImageId(SPR_RESIZE, colour & 0x7F), leftTop);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -150,30 +150,30 @@ static void WidgetFrameDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetind
|
|
|
|
|
*
|
|
|
|
|
* rct2: 0x006EB765
|
|
|
|
|
*/
|
|
|
|
|
static void WidgetResizeDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetIndex)
|
|
|
|
|
static void WidgetResizeDraw(rct_drawpixelinfo* dpi, rct_window& w, rct_widgetindex widgetIndex)
|
|
|
|
|
{
|
|
|
|
|
// Get the widget
|
|
|
|
|
const auto& widget = w->widgets[widgetIndex];
|
|
|
|
|
const auto& widget = w.widgets[widgetIndex];
|
|
|
|
|
|
|
|
|
|
// Resolve the absolute ltrb
|
|
|
|
|
auto leftTop = w->windowPos + ScreenCoordsXY{ widget.left, widget.top };
|
|
|
|
|
int32_t r = w->windowPos.x + widget.right;
|
|
|
|
|
int32_t b = w->windowPos.y + widget.bottom;
|
|
|
|
|
auto leftTop = w.windowPos + ScreenCoordsXY{ widget.left, widget.top };
|
|
|
|
|
int32_t r = w.windowPos.x + widget.right;
|
|
|
|
|
int32_t b = w.windowPos.y + widget.bottom;
|
|
|
|
|
|
|
|
|
|
// Get the colour
|
|
|
|
|
uint8_t colour = w->colours[widget.colour];
|
|
|
|
|
uint8_t colour = w.colours[widget.colour];
|
|
|
|
|
|
|
|
|
|
// Draw the panel
|
|
|
|
|
gfx_fill_rect_inset(dpi, { leftTop, { r, b } }, colour, 0);
|
|
|
|
|
|
|
|
|
|
// Check if the window can be resized
|
|
|
|
|
if (!(w->flags & WF_RESIZABLE))
|
|
|
|
|
if (!(w.flags & WF_RESIZABLE))
|
|
|
|
|
return;
|
|
|
|
|
if (w->min_width == w->max_width && w->min_height == w->max_height)
|
|
|
|
|
if (w.min_width == w.max_width && w.min_height == w.max_height)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
// Draw the resize sprite at the bottom right corner
|
|
|
|
|
leftTop = w->windowPos + ScreenCoordsXY{ widget.right - 18, widget.bottom - 18 };
|
|
|
|
|
leftTop = w.windowPos + ScreenCoordsXY{ widget.right - 18, widget.bottom - 18 };
|
|
|
|
|
gfx_draw_sprite(dpi, ImageId(SPR_RESIZE, colour & 0x7F), leftTop);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -181,20 +181,20 @@ static void WidgetResizeDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetin
|
|
|
|
|
*
|
|
|
|
|
* rct2: 0x006EB8E5
|
|
|
|
|
*/
|
|
|
|
|
static void WidgetButtonDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetIndex)
|
|
|
|
|
static void WidgetButtonDraw(rct_drawpixelinfo* dpi, rct_window& w, rct_widgetindex widgetIndex)
|
|
|
|
|
{
|
|
|
|
|
// Get the widget
|
|
|
|
|
const auto& widget = w->widgets[widgetIndex];
|
|
|
|
|
const auto& widget = w.widgets[widgetIndex];
|
|
|
|
|
|
|
|
|
|
// Resolve the absolute ltrb
|
|
|
|
|
ScreenRect rect{ w->windowPos + ScreenCoordsXY{ widget.left, widget.top },
|
|
|
|
|
w->windowPos + ScreenCoordsXY{ widget.right, widget.bottom } };
|
|
|
|
|
ScreenRect rect{ w.windowPos + ScreenCoordsXY{ widget.left, widget.top },
|
|
|
|
|
w.windowPos + ScreenCoordsXY{ widget.right, widget.bottom } };
|
|
|
|
|
|
|
|
|
|
// Check if the button is pressed down
|
|
|
|
|
uint8_t press = WidgetIsPressed(*w, widgetIndex) || WidgetIsActiveTool(*w, widgetIndex) ? INSET_RECT_FLAG_BORDER_INSET : 0;
|
|
|
|
|
uint8_t press = WidgetIsPressed(w, widgetIndex) || WidgetIsActiveTool(w, widgetIndex) ? INSET_RECT_FLAG_BORDER_INSET : 0;
|
|
|
|
|
|
|
|
|
|
// Get the colour
|
|
|
|
|
uint8_t colour = w->colours[widget.colour];
|
|
|
|
|
uint8_t colour = w.colours[widget.colour];
|
|
|
|
|
|
|
|
|
|
if (static_cast<int32_t>(widget.image) == -2)
|
|
|
|
|
{
|
|
|
|
@ -213,17 +213,17 @@ static void WidgetButtonDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetin
|
|
|
|
|
*
|
|
|
|
|
* rct2: 0x006EB806
|
|
|
|
|
*/
|
|
|
|
|
static void WidgetTabDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetIndex)
|
|
|
|
|
static void WidgetTabDraw(rct_drawpixelinfo* dpi, rct_window& w, rct_widgetindex widgetIndex)
|
|
|
|
|
{
|
|
|
|
|
// Get the widget
|
|
|
|
|
auto& widget = w->widgets[widgetIndex];
|
|
|
|
|
auto& widget = w.widgets[widgetIndex];
|
|
|
|
|
|
|
|
|
|
if (widget.type != WindowWidgetType::Tab && static_cast<int32_t>(widget.image) == -1)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if (widget.type == WindowWidgetType::Tab)
|
|
|
|
|
{
|
|
|
|
|
if (WidgetIsDisabled(*w, widgetIndex))
|
|
|
|
|
if (WidgetIsDisabled(w, widgetIndex))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if (widget.image == static_cast<uint32_t>(SPR_NONE))
|
|
|
|
@ -234,7 +234,7 @@ static void WidgetTabDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Draw widgets that aren't explicitly disabled.
|
|
|
|
|
if (!WidgetIsDisabled(*w, widgetIndex))
|
|
|
|
|
if (!WidgetIsDisabled(w, widgetIndex))
|
|
|
|
|
{
|
|
|
|
|
WidgetDrawImage(dpi, w, widgetIndex);
|
|
|
|
|
return;
|
|
|
|
@ -247,10 +247,10 @@ static void WidgetTabDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Resolve the absolute ltrb
|
|
|
|
|
auto leftTop = w->windowPos + ScreenCoordsXY{ widget.left, widget.top };
|
|
|
|
|
auto leftTop = w.windowPos + ScreenCoordsXY{ widget.left, widget.top };
|
|
|
|
|
|
|
|
|
|
// Get the colour and disabled image
|
|
|
|
|
auto colour = w->colours[widget.colour] & 0x7F;
|
|
|
|
|
auto colour = w.colours[widget.colour] & 0x7F;
|
|
|
|
|
auto image = ImageId::FromUInt32(widget.image + 2).WithPrimary(colour);
|
|
|
|
|
|
|
|
|
|
// Draw disabled image
|
|
|
|
@ -261,26 +261,26 @@ static void WidgetTabDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex
|
|
|
|
|
*
|
|
|
|
|
* rct2: 0x006EB861
|
|
|
|
|
*/
|
|
|
|
|
static void WidgetFlatButtonDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetIndex)
|
|
|
|
|
static void WidgetFlatButtonDraw(rct_drawpixelinfo* dpi, rct_window& w, rct_widgetindex widgetIndex)
|
|
|
|
|
{
|
|
|
|
|
if (!WidgetIsDisabled(*w, widgetIndex) && WidgetIsHighlighted(*w, widgetIndex))
|
|
|
|
|
if (!WidgetIsDisabled(w, widgetIndex) && WidgetIsHighlighted(w, widgetIndex))
|
|
|
|
|
{
|
|
|
|
|
WidgetButtonDraw(dpi, w, widgetIndex);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Get the widget
|
|
|
|
|
const auto& widget = w->widgets[widgetIndex];
|
|
|
|
|
const auto& widget = w.widgets[widgetIndex];
|
|
|
|
|
|
|
|
|
|
// Resolve the absolute ltrb
|
|
|
|
|
ScreenRect rect{ w->windowPos + ScreenCoordsXY{ widget.left, widget.top },
|
|
|
|
|
w->windowPos + ScreenCoordsXY{ widget.right, widget.bottom } };
|
|
|
|
|
ScreenRect rect{ w.windowPos + ScreenCoordsXY{ widget.left, widget.top },
|
|
|
|
|
w.windowPos + ScreenCoordsXY{ widget.right, widget.bottom } };
|
|
|
|
|
|
|
|
|
|
// Get the colour
|
|
|
|
|
uint8_t colour = w->colours[widget.colour];
|
|
|
|
|
uint8_t colour = w.colours[widget.colour];
|
|
|
|
|
|
|
|
|
|
// Check if the button is pressed down
|
|
|
|
|
if (WidgetIsPressed(*w, widgetIndex) || WidgetIsActiveTool(*w, widgetIndex))
|
|
|
|
|
if (WidgetIsPressed(w, widgetIndex) || WidgetIsActiveTool(w, widgetIndex))
|
|
|
|
|
{
|
|
|
|
|
if (static_cast<int32_t>(widget.image) == -2)
|
|
|
|
|
{
|
|
|
|
@ -301,20 +301,20 @@ static void WidgetFlatButtonDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widg
|
|
|
|
|
*
|
|
|
|
|
* rct2: 0x006EBBEB
|
|
|
|
|
*/
|
|
|
|
|
static void WidgetTextButton(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetIndex)
|
|
|
|
|
static void WidgetTextButton(rct_drawpixelinfo* dpi, rct_window& w, rct_widgetindex widgetIndex)
|
|
|
|
|
{
|
|
|
|
|
// Get the widget
|
|
|
|
|
const auto& widget = w->widgets[widgetIndex];
|
|
|
|
|
const auto& widget = w.widgets[widgetIndex];
|
|
|
|
|
|
|
|
|
|
// Resolve the absolute ltrb
|
|
|
|
|
ScreenRect rect{ w->windowPos + ScreenCoordsXY{ widget.left, widget.top },
|
|
|
|
|
w->windowPos + ScreenCoordsXY{ widget.right, widget.bottom } };
|
|
|
|
|
ScreenRect rect{ w.windowPos + ScreenCoordsXY{ widget.left, widget.top },
|
|
|
|
|
w.windowPos + ScreenCoordsXY{ widget.right, widget.bottom } };
|
|
|
|
|
|
|
|
|
|
// Get the colour
|
|
|
|
|
uint8_t colour = w->colours[widget.colour];
|
|
|
|
|
uint8_t colour = w.colours[widget.colour];
|
|
|
|
|
|
|
|
|
|
// Border
|
|
|
|
|
uint8_t press = WidgetIsPressed(*w, widgetIndex) || WidgetIsActiveTool(*w, widgetIndex) ? INSET_RECT_FLAG_BORDER_INSET : 0;
|
|
|
|
|
uint8_t press = WidgetIsPressed(w, widgetIndex) || WidgetIsActiveTool(w, widgetIndex) ? INSET_RECT_FLAG_BORDER_INSET : 0;
|
|
|
|
|
gfx_fill_rect_inset(dpi, rect, colour, press);
|
|
|
|
|
|
|
|
|
|
// Button caption
|
|
|
|
@ -332,23 +332,23 @@ static void WidgetTextButton(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetin
|
|
|
|
|
*
|
|
|
|
|
* rct2: 0x006EBC41
|
|
|
|
|
*/
|
|
|
|
|
static void WidgetTextCentred(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetIndex)
|
|
|
|
|
static void WidgetTextCentred(rct_drawpixelinfo* dpi, rct_window& w, rct_widgetindex widgetIndex)
|
|
|
|
|
{
|
|
|
|
|
// Get the widget
|
|
|
|
|
const auto& widget = w->widgets[widgetIndex];
|
|
|
|
|
const auto& widget = w.widgets[widgetIndex];
|
|
|
|
|
|
|
|
|
|
if (widget.text == STR_NONE)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
// Get the colour
|
|
|
|
|
colour_t colour = w->colours[widget.colour];
|
|
|
|
|
colour_t colour = w.colours[widget.colour];
|
|
|
|
|
colour &= ~(COLOUR_FLAG_TRANSLUCENT);
|
|
|
|
|
if (WidgetIsDisabled(*w, widgetIndex))
|
|
|
|
|
if (WidgetIsDisabled(w, widgetIndex))
|
|
|
|
|
colour |= COLOUR_FLAG_INSET;
|
|
|
|
|
|
|
|
|
|
// Resolve the absolute ltrb
|
|
|
|
|
auto topLeft = w->windowPos + ScreenCoordsXY{ widget.left, 0 };
|
|
|
|
|
int32_t r = w->windowPos.x + widget.right;
|
|
|
|
|
auto topLeft = w.windowPos + ScreenCoordsXY{ widget.left, 0 };
|
|
|
|
|
int32_t r = w.windowPos.x + widget.right;
|
|
|
|
|
|
|
|
|
|
if (widget.type == WindowWidgetType::Button || widget.type == WindowWidgetType::TableHeader)
|
|
|
|
|
topLeft.y += widget.textTop();
|
|
|
|
@ -378,31 +378,31 @@ static void WidgetTextCentred(rct_drawpixelinfo* dpi, rct_window* w, rct_widgeti
|
|
|
|
|
*
|
|
|
|
|
* rct2: 0x006EBD52
|
|
|
|
|
*/
|
|
|
|
|
static void WidgetText(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetIndex)
|
|
|
|
|
static void WidgetText(rct_drawpixelinfo* dpi, rct_window& w, rct_widgetindex widgetIndex)
|
|
|
|
|
{
|
|
|
|
|
// Get the widget
|
|
|
|
|
const auto& widget = w->widgets[widgetIndex];
|
|
|
|
|
const auto& widget = w.widgets[widgetIndex];
|
|
|
|
|
|
|
|
|
|
if (widget.text == STR_NONE || widget.text == STR_VIEWPORT)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
// Get the colour
|
|
|
|
|
uint8_t colour = w->colours[widget.colour];
|
|
|
|
|
if (WidgetIsDisabled(*w, widgetIndex))
|
|
|
|
|
uint8_t colour = w.colours[widget.colour];
|
|
|
|
|
if (WidgetIsDisabled(w, widgetIndex))
|
|
|
|
|
colour |= COLOUR_FLAG_INSET;
|
|
|
|
|
|
|
|
|
|
// Resolve the absolute ltrb
|
|
|
|
|
int32_t l = w->windowPos.x + widget.left;
|
|
|
|
|
int32_t r = w->windowPos.x + widget.right;
|
|
|
|
|
int32_t l = w.windowPos.x + widget.left;
|
|
|
|
|
int32_t r = w.windowPos.x + widget.right;
|
|
|
|
|
int32_t t;
|
|
|
|
|
|
|
|
|
|
if (widget.type == WindowWidgetType::Button || widget.type == WindowWidgetType::DropdownMenu
|
|
|
|
|
|| widget.type == WindowWidgetType::Spinner || widget.type == WindowWidgetType::TableHeader)
|
|
|
|
|
{
|
|
|
|
|
t = w->windowPos.y + widget.textTop();
|
|
|
|
|
t = w.windowPos.y + widget.textTop();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
t = w->windowPos.y + widget.top;
|
|
|
|
|
t = w.windowPos.y + widget.top;
|
|
|
|
|
|
|
|
|
|
auto stringId = widget.text;
|
|
|
|
|
auto ft = Formatter::Common();
|
|
|
|
@ -427,17 +427,17 @@ static void WidgetText(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex wi
|
|
|
|
|
*
|
|
|
|
|
* rct2: 0x006EBD1F
|
|
|
|
|
*/
|
|
|
|
|
static void WidgetTextInset(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetIndex)
|
|
|
|
|
static void WidgetTextInset(rct_drawpixelinfo* dpi, rct_window& w, rct_widgetindex widgetIndex)
|
|
|
|
|
{
|
|
|
|
|
// Get the widget
|
|
|
|
|
const auto& widget = w->widgets[widgetIndex];
|
|
|
|
|
const auto& widget = w.widgets[widgetIndex];
|
|
|
|
|
|
|
|
|
|
// Resolve the absolute ltrb
|
|
|
|
|
ScreenRect rect{ w->windowPos + ScreenCoordsXY{ widget.left, widget.top },
|
|
|
|
|
w->windowPos + ScreenCoordsXY{ widget.right, widget.bottom } };
|
|
|
|
|
ScreenRect rect{ w.windowPos + ScreenCoordsXY{ widget.left, widget.top },
|
|
|
|
|
w.windowPos + ScreenCoordsXY{ widget.right, widget.bottom } };
|
|
|
|
|
|
|
|
|
|
// Get the colour
|
|
|
|
|
uint8_t colour = w->colours[widget.colour];
|
|
|
|
|
uint8_t colour = w.colours[widget.colour];
|
|
|
|
|
|
|
|
|
|
gfx_fill_rect_inset(dpi, rect, colour, INSET_RECT_F_60);
|
|
|
|
|
WidgetText(dpi, w, widgetIndex);
|
|
|
|
@ -467,22 +467,22 @@ static std::pair<rct_string_id, void*> WidgetGetStringidAndArgs(const rct_widget
|
|
|
|
|
*
|
|
|
|
|
* rct2: 0x006EB535
|
|
|
|
|
*/
|
|
|
|
|
static void WidgetGroupboxDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetIndex)
|
|
|
|
|
static void WidgetGroupboxDraw(rct_drawpixelinfo* dpi, rct_window& w, rct_widgetindex widgetIndex)
|
|
|
|
|
{
|
|
|
|
|
// Get the widget
|
|
|
|
|
const auto& widget = w->widgets[widgetIndex];
|
|
|
|
|
const auto& widget = w.widgets[widgetIndex];
|
|
|
|
|
|
|
|
|
|
// Resolve the absolute ltrb
|
|
|
|
|
auto l = w->windowPos.x + widget.left + 5;
|
|
|
|
|
auto t = w->windowPos.y + widget.top;
|
|
|
|
|
auto l = w.windowPos.x + widget.left + 5;
|
|
|
|
|
auto t = w.windowPos.y + widget.top;
|
|
|
|
|
auto textRight = l;
|
|
|
|
|
|
|
|
|
|
// Text
|
|
|
|
|
auto [stringId, formatArgs] = WidgetGetStringidAndArgs(widget);
|
|
|
|
|
if (stringId != STR_NONE)
|
|
|
|
|
{
|
|
|
|
|
uint8_t colour = w->colours[widget.colour] & 0x7F;
|
|
|
|
|
if (WidgetIsDisabled(*w, widgetIndex))
|
|
|
|
|
uint8_t colour = w.colours[widget.colour] & 0x7F;
|
|
|
|
|
if (WidgetIsDisabled(w, widgetIndex))
|
|
|
|
|
colour |= COLOUR_FLAG_INSET;
|
|
|
|
|
|
|
|
|
|
utf8 buffer[512] = { 0 };
|
|
|
|
@ -495,13 +495,13 @@ static void WidgetGroupboxDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widget
|
|
|
|
|
|
|
|
|
|
// Border
|
|
|
|
|
// Resolve the absolute ltrb
|
|
|
|
|
l = w->windowPos.x + widget.left;
|
|
|
|
|
t = w->windowPos.y + widget.top + 4;
|
|
|
|
|
const auto r = w->windowPos.x + widget.right;
|
|
|
|
|
const auto b = w->windowPos.y + widget.bottom;
|
|
|
|
|
l = w.windowPos.x + widget.left;
|
|
|
|
|
t = w.windowPos.y + widget.top + 4;
|
|
|
|
|
const auto r = w.windowPos.x + widget.right;
|
|
|
|
|
const auto b = w.windowPos.y + widget.bottom;
|
|
|
|
|
|
|
|
|
|
// Get the colour
|
|
|
|
|
uint8_t colour = w->colours[widget.colour] & 0x7F;
|
|
|
|
|
uint8_t colour = w.colours[widget.colour] & 0x7F;
|
|
|
|
|
|
|
|
|
|
// Border left of text
|
|
|
|
|
gfx_fill_rect(dpi, { { l, t }, { l + 4, t } }, ColourMapA[colour].mid_dark);
|
|
|
|
@ -528,20 +528,20 @@ static void WidgetGroupboxDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widget
|
|
|
|
|
*
|
|
|
|
|
* rct2: 0x006EB2F9
|
|
|
|
|
*/
|
|
|
|
|
static void WidgetCaptionDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetIndex)
|
|
|
|
|
static void WidgetCaptionDraw(rct_drawpixelinfo* dpi, rct_window& w, rct_widgetindex widgetIndex)
|
|
|
|
|
{
|
|
|
|
|
// Get the widget
|
|
|
|
|
const auto* widget = &w->widgets[widgetIndex];
|
|
|
|
|
const auto* widget = &w.widgets[widgetIndex];
|
|
|
|
|
|
|
|
|
|
// Resolve the absolute ltrb
|
|
|
|
|
auto topLeft = w->windowPos + ScreenCoordsXY{ widget->left, widget->top };
|
|
|
|
|
auto bottomRight = w->windowPos + ScreenCoordsXY{ widget->right, widget->bottom };
|
|
|
|
|
auto topLeft = w.windowPos + ScreenCoordsXY{ widget->left, widget->top };
|
|
|
|
|
auto bottomRight = w.windowPos + ScreenCoordsXY{ widget->right, widget->bottom };
|
|
|
|
|
|
|
|
|
|
// Get the colour
|
|
|
|
|
uint8_t colour = w->colours[widget->colour];
|
|
|
|
|
uint8_t colour = w.colours[widget->colour];
|
|
|
|
|
|
|
|
|
|
uint8_t press = INSET_RECT_F_60;
|
|
|
|
|
if (w->flags & WF_10)
|
|
|
|
|
if (w.flags & WF_10)
|
|
|
|
|
press |= INSET_RECT_FLAG_FILL_MID_LIGHT;
|
|
|
|
|
|
|
|
|
|
gfx_fill_rect_inset(dpi, { topLeft, bottomRight }, colour, press);
|
|
|
|
@ -559,7 +559,7 @@ static void WidgetCaptionDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgeti
|
|
|
|
|
if (widget->text == STR_NONE)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
topLeft = w->windowPos + ScreenCoordsXY{ widget->left + 2, widget->top + 1 };
|
|
|
|
|
topLeft = w.windowPos + ScreenCoordsXY{ widget->left + 2, widget->top + 1 };
|
|
|
|
|
int32_t width = widget->width() - 4;
|
|
|
|
|
if ((widget + 1)->type == WindowWidgetType::CloseBox)
|
|
|
|
|
{
|
|
|
|
@ -576,24 +576,24 @@ static void WidgetCaptionDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgeti
|
|
|
|
|
*
|
|
|
|
|
* rct2: 0x006EBB85
|
|
|
|
|
*/
|
|
|
|
|
static void WidgetCloseboxDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetIndex)
|
|
|
|
|
static void WidgetCloseboxDraw(rct_drawpixelinfo* dpi, rct_window& w, rct_widgetindex widgetIndex)
|
|
|
|
|
{
|
|
|
|
|
// Get the widget
|
|
|
|
|
const auto& widget = w->widgets[widgetIndex];
|
|
|
|
|
const auto& widget = w.widgets[widgetIndex];
|
|
|
|
|
|
|
|
|
|
// Resolve the absolute ltrb
|
|
|
|
|
auto topLeft = w->windowPos + ScreenCoordsXY{ widget.left, widget.top };
|
|
|
|
|
auto bottomRight = w->windowPos + ScreenCoordsXY{ widget.right, widget.bottom };
|
|
|
|
|
auto topLeft = w.windowPos + ScreenCoordsXY{ widget.left, widget.top };
|
|
|
|
|
auto bottomRight = w.windowPos + ScreenCoordsXY{ widget.right, widget.bottom };
|
|
|
|
|
|
|
|
|
|
// Check if the button is pressed down
|
|
|
|
|
uint8_t press = 0;
|
|
|
|
|
if (w->flags & WF_10)
|
|
|
|
|
if (w.flags & WF_10)
|
|
|
|
|
press |= INSET_RECT_FLAG_FILL_MID_LIGHT;
|
|
|
|
|
if (WidgetIsPressed(*w, widgetIndex) || WidgetIsActiveTool(*w, widgetIndex))
|
|
|
|
|
if (WidgetIsPressed(w, widgetIndex) || WidgetIsActiveTool(w, widgetIndex))
|
|
|
|
|
press |= INSET_RECT_FLAG_BORDER_INSET;
|
|
|
|
|
|
|
|
|
|
// Get the colour
|
|
|
|
|
uint8_t colour = w->colours[widget.colour];
|
|
|
|
|
uint8_t colour = w.colours[widget.colour];
|
|
|
|
|
|
|
|
|
|
// Draw the button
|
|
|
|
|
gfx_fill_rect_inset(dpi, { topLeft, bottomRight }, colour, press);
|
|
|
|
@ -601,9 +601,9 @@ static void WidgetCloseboxDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widget
|
|
|
|
|
if (widget.text == STR_NONE)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
topLeft = w->windowPos + ScreenCoordsXY{ widget.midX() - 1, std::max<int32_t>(widget.top, widget.midY() - 5) };
|
|
|
|
|
topLeft = w.windowPos + ScreenCoordsXY{ widget.midX() - 1, std::max<int32_t>(widget.top, widget.midY() - 5) };
|
|
|
|
|
|
|
|
|
|
if (WidgetIsDisabled(*w, widgetIndex))
|
|
|
|
|
if (WidgetIsDisabled(w, widgetIndex))
|
|
|
|
|
colour |= COLOUR_FLAG_INSET;
|
|
|
|
|
|
|
|
|
|
DrawTextEllipsised(dpi, topLeft, widget.width() - 2, widget.text, Formatter::Common(), { colour, TextAlignment::CENTRE });
|
|
|
|
@ -613,29 +613,29 @@ static void WidgetCloseboxDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widget
|
|
|
|
|
*
|
|
|
|
|
* rct2: 0x006EBAD9
|
|
|
|
|
*/
|
|
|
|
|
static void WidgetCheckboxDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetIndex)
|
|
|
|
|
static void WidgetCheckboxDraw(rct_drawpixelinfo* dpi, rct_window& w, rct_widgetindex widgetIndex)
|
|
|
|
|
{
|
|
|
|
|
// Get the widget
|
|
|
|
|
const auto& widget = w->widgets[widgetIndex];
|
|
|
|
|
const auto& widget = w.widgets[widgetIndex];
|
|
|
|
|
|
|
|
|
|
// Resolve the absolute ltb
|
|
|
|
|
ScreenCoordsXY topLeft = w->windowPos + ScreenCoordsXY{ widget.left, widget.top };
|
|
|
|
|
ScreenCoordsXY bottomRight = w->windowPos + ScreenCoordsXY{ widget.right, widget.bottom };
|
|
|
|
|
ScreenCoordsXY topLeft = w.windowPos + ScreenCoordsXY{ widget.left, widget.top };
|
|
|
|
|
ScreenCoordsXY bottomRight = w.windowPos + ScreenCoordsXY{ widget.right, widget.bottom };
|
|
|
|
|
ScreenCoordsXY midLeft = { topLeft.x, (topLeft.y + bottomRight.y) / 2 };
|
|
|
|
|
|
|
|
|
|
// Get the colour
|
|
|
|
|
colour_t colour = w->colours[widget.colour];
|
|
|
|
|
colour_t colour = w.colours[widget.colour];
|
|
|
|
|
|
|
|
|
|
// checkbox
|
|
|
|
|
gfx_fill_rect_inset(dpi, { midLeft - ScreenCoordsXY{ 0, 5 }, midLeft + ScreenCoordsXY{ 9, 4 } }, colour, INSET_RECT_F_60);
|
|
|
|
|
|
|
|
|
|
if (WidgetIsDisabled(*w, widgetIndex))
|
|
|
|
|
if (WidgetIsDisabled(w, widgetIndex))
|
|
|
|
|
{
|
|
|
|
|
colour |= COLOUR_FLAG_INSET;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// fill it when checkbox is pressed
|
|
|
|
|
if (WidgetIsPressed(*w, widgetIndex))
|
|
|
|
|
if (WidgetIsPressed(w, widgetIndex))
|
|
|
|
|
{
|
|
|
|
|
gfx_draw_string(
|
|
|
|
|
dpi, { midLeft - ScreenCoordsXY{ 0, 5 } }, static_cast<const char*>(CheckBoxMarkString),
|
|
|
|
@ -654,19 +654,19 @@ static void WidgetCheckboxDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widget
|
|
|
|
|
*
|
|
|
|
|
* rct2: 0x006EBD96
|
|
|
|
|
*/
|
|
|
|
|
static void WidgetScrollDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetIndex)
|
|
|
|
|
static void WidgetScrollDraw(rct_drawpixelinfo* dpi, rct_window& w, rct_widgetindex widgetIndex)
|
|
|
|
|
{
|
|
|
|
|
// Get the widget
|
|
|
|
|
int32_t scrollIndex = window_get_scroll_data_index(w, widgetIndex);
|
|
|
|
|
const auto& widget = w->widgets[widgetIndex];
|
|
|
|
|
const auto& scroll = w->scrolls[scrollIndex];
|
|
|
|
|
int32_t scrollIndex = window_get_scroll_data_index(&w, widgetIndex);
|
|
|
|
|
const auto& widget = w.widgets[widgetIndex];
|
|
|
|
|
const auto& scroll = w.scrolls[scrollIndex];
|
|
|
|
|
|
|
|
|
|
// Resolve the absolute ltrb
|
|
|
|
|
ScreenCoordsXY topLeft = w->windowPos + ScreenCoordsXY{ widget.left, widget.top };
|
|
|
|
|
ScreenCoordsXY bottomRight = w->windowPos + ScreenCoordsXY{ widget.right, widget.bottom };
|
|
|
|
|
ScreenCoordsXY topLeft = w.windowPos + ScreenCoordsXY{ widget.left, widget.top };
|
|
|
|
|
ScreenCoordsXY bottomRight = w.windowPos + ScreenCoordsXY{ widget.right, widget.bottom };
|
|
|
|
|
|
|
|
|
|
// Get the colour
|
|
|
|
|
uint8_t colour = w->colours[widget.colour];
|
|
|
|
|
uint8_t colour = w.colours[widget.colour];
|
|
|
|
|
|
|
|
|
|
// Draw the border
|
|
|
|
|
gfx_fill_rect_inset(dpi, { topLeft, bottomRight }, colour, INSET_RECT_F_60);
|
|
|
|
@ -719,7 +719,7 @@ static void WidgetScrollDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetin
|
|
|
|
|
|
|
|
|
|
// Draw the scroll contents
|
|
|
|
|
if (scroll_dpi.width > 0 && scroll_dpi.height > 0)
|
|
|
|
|
window_event_scroll_paint_call(w, &scroll_dpi, scrollIndex);
|
|
|
|
|
window_event_scroll_paint_call(&w, &scroll_dpi, scrollIndex);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void WidgetHScrollbarDraw(
|
|
|
|
@ -796,10 +796,10 @@ static void WidgetVScrollbarDraw(
|
|
|
|
|
*
|
|
|
|
|
* rct2: 0x006EB951
|
|
|
|
|
*/
|
|
|
|
|
static void WidgetDrawImage(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetIndex)
|
|
|
|
|
static void WidgetDrawImage(rct_drawpixelinfo* dpi, rct_window& w, rct_widgetindex widgetIndex)
|
|
|
|
|
{
|
|
|
|
|
// Get the widget
|
|
|
|
|
const auto& widget = w->widgets[widgetIndex];
|
|
|
|
|
const auto& widget = w.widgets[widgetIndex];
|
|
|
|
|
|
|
|
|
|
// Get the image
|
|
|
|
|
int32_t image = widget.image;
|
|
|
|
@ -807,25 +807,25 @@ static void WidgetDrawImage(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetind
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
// Resolve the absolute ltrb
|
|
|
|
|
auto screenCoords = w->windowPos + ScreenCoordsXY{ widget.left, widget.top };
|
|
|
|
|
auto screenCoords = w.windowPos + ScreenCoordsXY{ widget.left, widget.top };
|
|
|
|
|
|
|
|
|
|
// Get the colour
|
|
|
|
|
uint8_t colour = NOT_TRANSLUCENT(w->colours[widget.colour]);
|
|
|
|
|
uint8_t colour = NOT_TRANSLUCENT(w.colours[widget.colour]);
|
|
|
|
|
|
|
|
|
|
if (widget.type == WindowWidgetType::ColourBtn || widget.type == WindowWidgetType::TrnBtn
|
|
|
|
|
|| widget.type == WindowWidgetType::Tab)
|
|
|
|
|
if (WidgetIsPressed(*w, widgetIndex) || WidgetIsActiveTool(*w, widgetIndex))
|
|
|
|
|
if (WidgetIsPressed(w, widgetIndex) || WidgetIsActiveTool(w, widgetIndex))
|
|
|
|
|
image++;
|
|
|
|
|
|
|
|
|
|
if (WidgetIsDisabled(*w, widgetIndex))
|
|
|
|
|
if (WidgetIsDisabled(w, widgetIndex))
|
|
|
|
|
{
|
|
|
|
|
// Draw greyed out (light border bottom right shadow)
|
|
|
|
|
colour = w->colours[widget.colour];
|
|
|
|
|
colour = w.colours[widget.colour];
|
|
|
|
|
colour = ColourMapA[NOT_TRANSLUCENT(colour)].lighter;
|
|
|
|
|
gfx_draw_sprite_solid(dpi, image, screenCoords + ScreenCoordsXY{ 1, 1 }, colour);
|
|
|
|
|
|
|
|
|
|
// Draw greyed out (dark)
|
|
|
|
|
colour = w->colours[widget.colour];
|
|
|
|
|
colour = w.colours[widget.colour];
|
|
|
|
|
colour = ColourMapA[NOT_TRANSLUCENT(colour)].mid_light;
|
|
|
|
|
gfx_draw_sprite_solid(dpi, image, screenCoords, colour);
|
|
|
|
|
}
|
|
|
|
@ -932,11 +932,11 @@ bool WidgetIsActiveTool(const rct_window& w, rct_widgetindex widgetIndex)
|
|
|
|
|
* edi: widget
|
|
|
|
|
*/
|
|
|
|
|
void WidgetScrollGetPart(
|
|
|
|
|
rct_window* w, const rct_widget* widget, const ScreenCoordsXY& screenCoords, ScreenCoordsXY& retScreenCoords,
|
|
|
|
|
rct_window& w, const rct_widget* widget, const ScreenCoordsXY& screenCoords, ScreenCoordsXY& retScreenCoords,
|
|
|
|
|
int32_t* output_scroll_area, int32_t* scroll_id)
|
|
|
|
|
{
|
|
|
|
|
*scroll_id = 0;
|
|
|
|
|
for (rct_widget* iterator = w->widgets; iterator != widget; iterator++)
|
|
|
|
|
for (rct_widget* iterator = w.widgets; iterator != widget; iterator++)
|
|
|
|
|
{
|
|
|
|
|
if (iterator->type == WindowWidgetType::Scroll)
|
|
|
|
|
{
|
|
|
|
@ -944,13 +944,13 @@ void WidgetScrollGetPart(
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const auto& scroll = w->scrolls[*scroll_id];
|
|
|
|
|
if ((scroll.flags & HSCROLLBAR_VISIBLE) && screenCoords.y >= (w->windowPos.y + widget->bottom - (SCROLLBAR_WIDTH + 1)))
|
|
|
|
|
const auto& scroll = w.scrolls[*scroll_id];
|
|
|
|
|
if ((scroll.flags & HSCROLLBAR_VISIBLE) && screenCoords.y >= (w.windowPos.y + widget->bottom - (SCROLLBAR_WIDTH + 1)))
|
|
|
|
|
{
|
|
|
|
|
// horizontal scrollbar
|
|
|
|
|
int32_t rightOffset = 0;
|
|
|
|
|
int32_t iteratorLeft = widget->left + w->windowPos.x + SCROLLBAR_WIDTH;
|
|
|
|
|
int32_t iteratorRight = widget->right + w->windowPos.x - SCROLLBAR_WIDTH;
|
|
|
|
|
int32_t iteratorLeft = widget->left + w.windowPos.x + SCROLLBAR_WIDTH;
|
|
|
|
|
int32_t iteratorRight = widget->right + w.windowPos.x - SCROLLBAR_WIDTH;
|
|
|
|
|
if (!(scroll.flags & VSCROLLBAR_VISIBLE))
|
|
|
|
|
{
|
|
|
|
|
rightOffset = SCROLLBAR_WIDTH + 1;
|
|
|
|
@ -968,11 +968,11 @@ void WidgetScrollGetPart(
|
|
|
|
|
{
|
|
|
|
|
*output_scroll_area = SCROLL_PART_HSCROLLBAR_RIGHT;
|
|
|
|
|
}
|
|
|
|
|
else if (screenCoords.x < (widget->left + w->windowPos.x + scroll.h_thumb_left))
|
|
|
|
|
else if (screenCoords.x < (widget->left + w.windowPos.x + scroll.h_thumb_left))
|
|
|
|
|
{
|
|
|
|
|
*output_scroll_area = SCROLL_PART_HSCROLLBAR_LEFT_TROUGH;
|
|
|
|
|
}
|
|
|
|
|
else if (screenCoords.x > (widget->left + w->windowPos.x + scroll.h_thumb_right))
|
|
|
|
|
else if (screenCoords.x > (widget->left + w.windowPos.x + scroll.h_thumb_right))
|
|
|
|
|
{
|
|
|
|
|
*output_scroll_area = SCROLL_PART_HSCROLLBAR_RIGHT_TROUGH;
|
|
|
|
|
}
|
|
|
|
@ -981,12 +981,12 @@ void WidgetScrollGetPart(
|
|
|
|
|
*output_scroll_area = SCROLL_PART_HSCROLLBAR_THUMB;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if ((scroll.flags & VSCROLLBAR_VISIBLE) && (screenCoords.x >= w->windowPos.x + widget->right - (SCROLLBAR_WIDTH + 1)))
|
|
|
|
|
else if ((scroll.flags & VSCROLLBAR_VISIBLE) && (screenCoords.x >= w.windowPos.x + widget->right - (SCROLLBAR_WIDTH + 1)))
|
|
|
|
|
{
|
|
|
|
|
// vertical scrollbar
|
|
|
|
|
int32_t bottomOffset = 0;
|
|
|
|
|
int32_t iteratorTop = widget->top + w->windowPos.y + SCROLLBAR_WIDTH;
|
|
|
|
|
int32_t iteratorBottom = widget->bottom + w->windowPos.y;
|
|
|
|
|
int32_t iteratorTop = widget->top + w.windowPos.y + SCROLLBAR_WIDTH;
|
|
|
|
|
int32_t iteratorBottom = widget->bottom + w.windowPos.y;
|
|
|
|
|
if (scroll.flags & HSCROLLBAR_VISIBLE)
|
|
|
|
|
{
|
|
|
|
|
bottomOffset = (SCROLLBAR_WIDTH + 1);
|
|
|
|
@ -1004,11 +1004,11 @@ void WidgetScrollGetPart(
|
|
|
|
|
{
|
|
|
|
|
*output_scroll_area = SCROLL_PART_VSCROLLBAR_BOTTOM;
|
|
|
|
|
}
|
|
|
|
|
else if (screenCoords.y < (widget->top + w->windowPos.y + scroll.v_thumb_top))
|
|
|
|
|
else if (screenCoords.y < (widget->top + w.windowPos.y + scroll.v_thumb_top))
|
|
|
|
|
{
|
|
|
|
|
*output_scroll_area = SCROLL_PART_VSCROLLBAR_TOP_TROUGH;
|
|
|
|
|
}
|
|
|
|
|
else if (screenCoords.y > (widget->top + w->windowPos.y + scroll.v_thumb_bottom))
|
|
|
|
|
else if (screenCoords.y > (widget->top + w.windowPos.y + scroll.v_thumb_bottom))
|
|
|
|
|
{
|
|
|
|
|
*output_scroll_area = SCROLL_PART_VSCROLLBAR_BOTTOM_TROUGH;
|
|
|
|
|
}
|
|
|
|
@ -1023,7 +1023,7 @@ void WidgetScrollGetPart(
|
|
|
|
|
*output_scroll_area = SCROLL_PART_VIEW;
|
|
|
|
|
retScreenCoords.x = screenCoords.x - widget->left;
|
|
|
|
|
retScreenCoords.y = screenCoords.y - widget->top;
|
|
|
|
|
retScreenCoords -= w->windowPos;
|
|
|
|
|
retScreenCoords -= w.windowPos;
|
|
|
|
|
if (retScreenCoords.x <= 0 || retScreenCoords.y <= 0)
|
|
|
|
|
{
|
|
|
|
|
*output_scroll_area = SCROLL_PART_NONE;
|
|
|
|
@ -1118,29 +1118,29 @@ void WidgetSetCheckboxValue(rct_window& w, rct_widgetindex widgetIndex, bool val
|
|
|
|
|
WidgetSetPressed(w, widgetIndex, value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void WidgetTextBoxDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgetindex widgetIndex)
|
|
|
|
|
static void WidgetTextBoxDraw(rct_drawpixelinfo* dpi, rct_window& w, rct_widgetindex widgetIndex)
|
|
|
|
|
{
|
|
|
|
|
int32_t no_lines = 0;
|
|
|
|
|
char wrapped_string[TEXT_INPUT_SIZE];
|
|
|
|
|
|
|
|
|
|
// Get the widget
|
|
|
|
|
const auto& widget = w->widgets[widgetIndex];
|
|
|
|
|
const auto& widget = w.widgets[widgetIndex];
|
|
|
|
|
|
|
|
|
|
// Resolve the absolute ltrb
|
|
|
|
|
ScreenCoordsXY topLeft{ w->windowPos + ScreenCoordsXY{ widget.left, widget.top } };
|
|
|
|
|
ScreenCoordsXY bottomRight{ w->windowPos + ScreenCoordsXY{ widget.right, widget.bottom } };
|
|
|
|
|
ScreenCoordsXY topLeft{ w.windowPos + ScreenCoordsXY{ widget.left, widget.top } };
|
|
|
|
|
ScreenCoordsXY bottomRight{ w.windowPos + ScreenCoordsXY{ widget.right, widget.bottom } };
|
|
|
|
|
|
|
|
|
|
// Get the colour
|
|
|
|
|
uint8_t colour = w->colours[widget.colour];
|
|
|
|
|
uint8_t colour = w.colours[widget.colour];
|
|
|
|
|
|
|
|
|
|
bool active = w->classification == gCurrentTextBox.window.classification && w->number == gCurrentTextBox.window.number
|
|
|
|
|
bool active = w.classification == gCurrentTextBox.window.classification && w.number == gCurrentTextBox.window.number
|
|
|
|
|
&& widgetIndex == gCurrentTextBox.widget_index;
|
|
|
|
|
|
|
|
|
|
// gfx_fill_rect_inset(dpi, l, t, r, b, colour, 0x20 | (!active ? 0x40 : 0x00));
|
|
|
|
|
gfx_fill_rect_inset(dpi, { topLeft, bottomRight }, colour, INSET_RECT_F_60);
|
|
|
|
|
|
|
|
|
|
// Figure out where the text should be positioned vertically.
|
|
|
|
|
topLeft.y = w->windowPos.y + widget.textTop();
|
|
|
|
|
topLeft.y = w.windowPos.y + widget.textTop();
|
|
|
|
|
|
|
|
|
|
if (!active || gTextInput == nullptr)
|
|
|
|
|
{
|
|
|
|
@ -1149,7 +1149,7 @@ static void WidgetTextBoxDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgeti
|
|
|
|
|
safe_strcpy(wrapped_string, widget.string, 512);
|
|
|
|
|
gfx_wrap_string(wrapped_string, bottomRight.x - topLeft.x - 5, FontSpriteBase::MEDIUM, &no_lines);
|
|
|
|
|
gfx_draw_string_no_formatting(
|
|
|
|
|
dpi, { topLeft.x + 2, topLeft.y }, wrapped_string, { w->colours[1], FontSpriteBase::MEDIUM });
|
|
|
|
|
dpi, { topLeft.x + 2, topLeft.y }, wrapped_string, { w.colours[1], FontSpriteBase::MEDIUM });
|
|
|
|
|
}
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
@ -1160,7 +1160,7 @@ static void WidgetTextBoxDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgeti
|
|
|
|
|
// +13 for cursor when max length.
|
|
|
|
|
gfx_wrap_string(wrapped_string, bottomRight.x - topLeft.x - 5 - 6, FontSpriteBase::MEDIUM, &no_lines);
|
|
|
|
|
|
|
|
|
|
gfx_draw_string_no_formatting(dpi, { topLeft.x + 2, topLeft.y }, wrapped_string, { w->colours[1], FontSpriteBase::MEDIUM });
|
|
|
|
|
gfx_draw_string_no_formatting(dpi, { topLeft.x + 2, topLeft.y }, wrapped_string, { w.colours[1], FontSpriteBase::MEDIUM });
|
|
|
|
|
|
|
|
|
|
size_t string_length = get_string_size(wrapped_string) - 1;
|
|
|
|
|
|
|
|
|
@ -1181,7 +1181,7 @@ static void WidgetTextBoxDraw(rct_drawpixelinfo* dpi, rct_window* w, rct_widgeti
|
|
|
|
|
|
|
|
|
|
if (gTextBoxFrameNo <= 15)
|
|
|
|
|
{
|
|
|
|
|
colour = ColourMapA[w->colours[1]].mid_light;
|
|
|
|
|
colour = ColourMapA[w.colours[1]].mid_light;
|
|
|
|
|
auto y = topLeft.y + (widget.height() - 1);
|
|
|
|
|
gfx_fill_rect(dpi, { { cur_x, y }, { cur_x + width, y } }, colour + 5);
|
|
|
|
|
}
|
|
|
|
|