mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2025-12-23 07:43:01 +01:00
Start working on exposing ListViewWidget
This commit is contained in:
@@ -26,7 +26,7 @@ namespace OpenRCT2::Scripting
|
|||||||
{
|
{
|
||||||
class ScWidget
|
class ScWidget
|
||||||
{
|
{
|
||||||
private:
|
protected:
|
||||||
rct_windowclass _class{};
|
rct_windowclass _class{};
|
||||||
rct_windownumber _number{};
|
rct_windownumber _number{};
|
||||||
rct_widgetindex _widgetIndex{};
|
rct_widgetindex _widgetIndex{};
|
||||||
@@ -39,6 +39,8 @@ namespace OpenRCT2::Scripting
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static DukValue ToDuk(duk_context* ctx, rct_window* w, rct_widgetindex widgetIndex);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string type_get() const
|
std::string type_get() const
|
||||||
{
|
{
|
||||||
@@ -190,24 +192,6 @@ namespace OpenRCT2::Scripting
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isChecked_get() const
|
|
||||||
{
|
|
||||||
auto w = GetWindow();
|
|
||||||
if (w != nullptr)
|
|
||||||
{
|
|
||||||
return widget_is_pressed(w, _widgetIndex);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
void isChecked_set(bool value)
|
|
||||||
{
|
|
||||||
auto w = GetWindow();
|
|
||||||
if (w != nullptr)
|
|
||||||
{
|
|
||||||
widget_set_checkbox_value(w, _widgetIndex, value ? 1 : 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t image_get() const
|
uint32_t image_get() const
|
||||||
{
|
{
|
||||||
if (IsCustomWindow())
|
if (IsCustomWindow())
|
||||||
@@ -278,11 +262,10 @@ namespace OpenRCT2::Scripting
|
|||||||
// No so common
|
// No so common
|
||||||
dukglue_register_property(ctx, &ScWidget::image_get, &ScWidget::image_set, "image");
|
dukglue_register_property(ctx, &ScWidget::image_get, &ScWidget::image_set, "image");
|
||||||
dukglue_register_property(ctx, &ScWidget::text_get, &ScWidget::text_set, "text");
|
dukglue_register_property(ctx, &ScWidget::text_get, &ScWidget::text_set, "text");
|
||||||
dukglue_register_property(ctx, &ScWidget::isChecked_get, &ScWidget::isChecked_set, "isChecked");
|
|
||||||
dukglue_register_property(ctx, &ScWidget::viewport_get, nullptr, "viewport");
|
dukglue_register_property(ctx, &ScWidget::viewport_get, nullptr, "viewport");
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
protected:
|
||||||
rct_window* GetWindow() const
|
rct_window* GetWindow() const
|
||||||
{
|
{
|
||||||
if (_class == WC_MAIN_WINDOW)
|
if (_class == WC_MAIN_WINDOW)
|
||||||
@@ -316,6 +299,81 @@ namespace OpenRCT2::Scripting
|
|||||||
widget_invalidate_by_number(_class, _number, _widgetIndex);
|
widget_invalidate_by_number(_class, _number, _widgetIndex);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class ScCheckBoxWidget : public ScWidget
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ScCheckBoxWidget(rct_windowclass c, rct_windownumber n, rct_widgetindex widgetIndex)
|
||||||
|
: ScWidget(c, n, widgetIndex)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Register(duk_context* ctx)
|
||||||
|
{
|
||||||
|
dukglue_set_base_class<ScWidget, ScCheckBoxWidget>(ctx);
|
||||||
|
dukglue_register_property(ctx, &ScCheckBoxWidget::isChecked_get, &ScCheckBoxWidget::isChecked_set, "isChecked");
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool isChecked_get() const
|
||||||
|
{
|
||||||
|
auto w = GetWindow();
|
||||||
|
if (w != nullptr)
|
||||||
|
{
|
||||||
|
return widget_is_pressed(w, _widgetIndex);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
void isChecked_set(bool value)
|
||||||
|
{
|
||||||
|
auto w = GetWindow();
|
||||||
|
if (w != nullptr)
|
||||||
|
{
|
||||||
|
widget_set_checkbox_value(w, _widgetIndex, value ? 1 : 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class ScListViewWidget : public ScWidget
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ScListViewWidget(rct_windowclass c, rct_windownumber n, rct_widgetindex widgetIndex)
|
||||||
|
: ScWidget(c, n, widgetIndex)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Register(duk_context* ctx)
|
||||||
|
{
|
||||||
|
dukglue_set_base_class<ScWidget, ScListViewWidget>(ctx);
|
||||||
|
dukglue_register_property(ctx, &ScListViewWidget::isStriped_get, &ScListViewWidget::isStriped_set, "isStriped");
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool isStriped_get() const
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void isStriped_set(bool value)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
inline DukValue ScWidget::ToDuk(duk_context* ctx, rct_window* w, rct_widgetindex widgetIndex)
|
||||||
|
{
|
||||||
|
const auto& widget = w->widgets[widgetIndex];
|
||||||
|
auto c = w->classification;
|
||||||
|
auto n = w->number;
|
||||||
|
switch (widget.type)
|
||||||
|
{
|
||||||
|
case WWT_CHECKBOX:
|
||||||
|
return GetObjectAsDukValue(ctx, std::make_shared<ScCheckBoxWidget>(c, n, widgetIndex));
|
||||||
|
case WWT_SCROLL:
|
||||||
|
return GetObjectAsDukValue(ctx, std::make_shared<ScListViewWidget>(c, n, widgetIndex));
|
||||||
|
default:
|
||||||
|
return GetObjectAsDukValue(ctx, std::make_shared<ScWidget>(c, n, widgetIndex));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace OpenRCT2::Scripting
|
} // namespace OpenRCT2::Scripting
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -177,16 +177,18 @@ namespace OpenRCT2::Scripting
|
|||||||
return (flags & (WF_STICK_TO_BACK | WF_STICK_TO_FRONT)) != 0;
|
return (flags & (WF_STICK_TO_BACK | WF_STICK_TO_FRONT)) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::shared_ptr<ScWidget>> widgets_get() const
|
std::vector<DukValue> widgets_get() const
|
||||||
{
|
{
|
||||||
std::vector<std::shared_ptr<ScWidget>> result;
|
auto ctx = GetContext()->GetScriptEngine().GetContext();
|
||||||
|
|
||||||
|
std::vector<DukValue> result;
|
||||||
auto w = GetWindow();
|
auto w = GetWindow();
|
||||||
if (w != nullptr)
|
if (w != nullptr)
|
||||||
{
|
{
|
||||||
rct_widgetindex widgetIndex = 0;
|
rct_widgetindex widgetIndex = 0;
|
||||||
for (auto widget = w->widgets; widget->type != WWT_LAST; widget++)
|
for (auto widget = w->widgets; widget->type != WWT_LAST; widget++)
|
||||||
{
|
{
|
||||||
result.push_back(std::make_shared<ScWidget>(_class, _number, widgetIndex));
|
result.push_back(ScWidget::ToDuk(ctx, w, widgetIndex));
|
||||||
widgetIndex++;
|
widgetIndex++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -257,18 +259,19 @@ namespace OpenRCT2::Scripting
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<ScWidget> findWidget(std::string name) const
|
DukValue findWidget(std::string name) const
|
||||||
{
|
{
|
||||||
|
auto ctx = GetContext()->GetScriptEngine().GetContext();
|
||||||
auto w = GetWindow();
|
auto w = GetWindow();
|
||||||
if (w != nullptr)
|
if (w != nullptr)
|
||||||
{
|
{
|
||||||
auto widgetIndex = FindWidgetIndexByName(w, name);
|
auto widgetIndex = FindWidgetIndexByName(w, name);
|
||||||
if (widgetIndex)
|
if (widgetIndex)
|
||||||
{
|
{
|
||||||
return std::make_shared<ScWidget>(_class, _number, *widgetIndex);
|
return ScWidget::ToDuk(ctx, w, *widgetIndex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return {};
|
return GetObjectAsDukValue<ScWidget>(ctx, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void bringToFront()
|
void bringToFront()
|
||||||
|
|||||||
@@ -32,6 +32,8 @@ void UiScriptExtensions::Extend(ScriptEngine& scriptEngine)
|
|||||||
ScUi::Register(ctx);
|
ScUi::Register(ctx);
|
||||||
ScViewport::Register(ctx);
|
ScViewport::Register(ctx);
|
||||||
ScWidget::Register(ctx);
|
ScWidget::Register(ctx);
|
||||||
|
ScCheckBoxWidget::Register(ctx);
|
||||||
|
ScListViewWidget::Register(ctx);
|
||||||
ScWindow::Register(ctx);
|
ScWindow::Register(ctx);
|
||||||
|
|
||||||
InitialiseCustomMenuItems(scriptEngine);
|
InitialiseCustomMenuItems(scriptEngine);
|
||||||
|
|||||||
Reference in New Issue
Block a user