diff --git a/distribution/openrct2.d.ts b/distribution/openrct2.d.ts index 0c2abd31a2..5dc75f276b 100644 --- a/distribution/openrct2.d.ts +++ b/distribution/openrct2.d.ts @@ -1881,9 +1881,9 @@ declare global { * By default, text buttons have borders and image buttons do not but it can be overridden. */ border?: boolean; - image: number; - isPressed: boolean; - text: string; + image?: number; + isPressed?: boolean; + text?: string; onClick: () => void; } @@ -1946,8 +1946,8 @@ declare global { readonly highlightedCell?: RowColumn; canSelect?: boolean; - onHighlight: (item: number, column: number) => void; - onClick: (item: number, column: number) => void; + onHighlight?: (item: number, column: number) => void; + onClick?: (item: number, column: number) => void; } interface SpinnerWidget extends Widget { diff --git a/src/openrct2-ui/scripting/CustomListView.cpp b/src/openrct2-ui/scripting/CustomListView.cpp index 40605cb418..06bf610779 100644 --- a/src/openrct2-ui/scripting/CustomListView.cpp +++ b/src/openrct2-ui/scripting/CustomListView.cpp @@ -497,7 +497,7 @@ void CustomListView::MouseDown(const ScreenCoordsXY& pos) auto hitResult = GetItemIndexAt(pos); if (hitResult) { - if (hitResult->Row != HEADER_ROW && OnClick.context() != nullptr && OnClick.is_function()) + if (hitResult->Row != HEADER_ROW) { if (CanSelect) { @@ -506,12 +506,15 @@ void CustomListView::MouseDown(const ScreenCoordsXY& pos) } auto ctx = OnClick.context(); - duk_push_int(ctx, static_cast(hitResult->Row)); - auto dukRow = DukValue::take_from_stack(ctx, -1); - duk_push_int(ctx, static_cast(hitResult->Column)); - auto dukColumn = DukValue::take_from_stack(ctx, -1); - auto& scriptEngine = GetContext()->GetScriptEngine(); - scriptEngine.ExecutePluginCall(Owner, OnClick, { dukRow, dukColumn }, false); + if (ctx != nullptr && OnClick.is_function()) + { + duk_push_int(ctx, static_cast(hitResult->Row)); + auto dukRow = DukValue::take_from_stack(ctx, -1); + duk_push_int(ctx, static_cast(hitResult->Column)); + auto dukColumn = DukValue::take_from_stack(ctx, -1); + auto& scriptEngine = GetContext()->GetScriptEngine(); + scriptEngine.ExecutePluginCall(Owner, OnClick, { dukRow, dukColumn }, false); + } } } if (hitResult && hitResult->Row == HEADER_ROW) @@ -597,11 +600,14 @@ void CustomListView::Paint(rct_window* w, rct_drawpixelinfo* dpi, const rct_scro // Columns if (Columns.size() == 0) { - const auto& text = item.Cells[0]; - if (!text.empty()) + if (item.Cells.size() != 0) { - ScreenSize cellSize = { std::numeric_limits::max(), LIST_ROW_HEIGHT }; - PaintCell(dpi, { 0, y }, cellSize, text.c_str(), isHighlighted); + const auto& text = item.Cells[0]; + if (!text.empty()) + { + ScreenSize cellSize = { std::numeric_limits::max(), LIST_ROW_HEIGHT }; + PaintCell(dpi, { 0, y }, cellSize, text.c_str(), isHighlighted); + } } } else diff --git a/src/openrct2-ui/scripting/CustomWindow.cpp b/src/openrct2-ui/scripting/CustomWindow.cpp index b267545e30..1e12909f3a 100644 --- a/src/openrct2-ui/scripting/CustomWindow.cpp +++ b/src/openrct2-ui/scripting/CustomWindow.cpp @@ -164,12 +164,15 @@ namespace OpenRCT2::Ui::Windows } else if (result.Type == "dropdown") { - auto dukItems = desc["items"].as_array(); - for (const auto& dukItem : dukItems) + if (desc["items"].is_array()) { - result.Items.push_back(ProcessString(dukItem)); + auto dukItems = desc["items"].as_array(); + for (const auto& dukItem : dukItems) + { + result.Items.push_back(ProcessString(dukItem)); + } } - result.SelectedIndex = desc["selectedIndex"].as_int(); + result.SelectedIndex = AsOrDefault(desc["selectedIndex"], 0); result.OnChange = desc["onChange"]; } else if (result.Type == "groupbox" || result.Type == "label")