OpenRCT2/src/openrct2-ui/scripting/ScWindow.hpp

207 lines
6.2 KiB
C++
Raw Normal View History

2018-06-17 15:48:42 +02:00
/*****************************************************************************
* Copyright (c) 2014-2018 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
*
* OpenRCT2 is licensed under the GNU General Public License version 3.
*****************************************************************************/
2018-03-24 20:30:10 +01:00
#pragma once
2020-02-23 16:33:01 +01:00
#ifdef __ENABLE_SCRIPTING__
2020-02-15 00:36:24 +01:00
2020-02-23 16:33:01 +01:00
# include "ScWidget.hpp"
# include <openrct2/common.h>
# include <openrct2/interface/Window.h>
# include <openrct2/interface/Window_internal.h>
# include <openrct2/localisation/Language.h>
2020-02-23 16:33:01 +01:00
# include <openrct2/scripting/Duktape.hpp>
2018-03-24 20:30:10 +01:00
namespace OpenRCT2::Scripting
{
using namespace OpenRCT2::Ui::Windows;
2018-03-24 20:30:10 +01:00
class ScWindow
{
private:
rct_windowclass _class;
rct_windownumber _number;
public:
ScWindow(rct_window* w)
2018-05-24 14:49:11 +02:00
: ScWindow(w->classification, w->number)
2018-03-25 19:23:24 +02:00
{
}
2018-03-24 20:30:10 +01:00
ScWindow(rct_windowclass c, rct_windownumber n)
: _class(c)
, _number(n)
2018-03-24 20:30:10 +01:00
{
}
int32_t classification_get()
{
return static_cast<int32_t>(_class);
}
int32_t number_get()
{
return static_cast<int32_t>(_number);
}
int32_t x_get()
{
return GetWindow()->x;
}
2018-07-31 16:25:50 +02:00
void x_set(int32_t value)
2018-03-24 20:30:10 +01:00
{
auto w = GetWindow();
2020-02-01 17:43:00 +01:00
window_set_position(w, { value, w->y });
2018-03-24 20:30:10 +01:00
}
int32_t y_get()
{
return GetWindow()->y;
}
2018-07-31 16:25:50 +02:00
void y_set(int32_t value)
2018-03-24 20:30:10 +01:00
{
auto w = GetWindow();
2020-02-01 17:43:00 +01:00
window_set_position(w, { w->x, value });
2018-03-24 20:30:10 +01:00
}
int32_t width_get()
{
return GetWindow()->width;
}
int32_t height_get()
{
return GetWindow()->height;
}
2018-03-24 20:30:10 +01:00
bool isSticky_get()
{
auto flags = GetWindow()->flags;
return (flags & (WF_STICK_TO_BACK | WF_STICK_TO_FRONT)) != 0;
}
2020-02-15 00:36:24 +01:00
std::vector<std::shared_ptr<ScWidget>> widgets_get()
{
std::vector<std::shared_ptr<ScWidget>> result;
auto w = GetWindow();
if (w != nullptr)
{
rct_widgetindex widgetIndex = 0;
for (auto widget = w->widgets; widget->type != WWT_LAST; widget++)
{
result.push_back(std::make_shared<ScWidget>(_class, _number, widgetIndex));
widgetIndex++;
}
}
return result;
}
2020-02-27 20:59:46 +01:00
std::vector<int32_t> colours_get()
{
std::vector<int32_t> result;
auto w = GetWindow();
if (w != nullptr)
{
result.reserve(std::size(w->colours));
for (auto c : w->colours)
{
result.push_back(c);
}
}
return result;
}
void colours_set(std::vector<int32_t> colours)
{
auto w = GetWindow();
if (w != nullptr)
{
for (int32_t i = 0; i < std::size(w->colours); i++)
{
w->colours[i] = i < colours.size() ? std::clamp<int32_t>(colours[i], COLOUR_BLACK, COLOUR_COUNT - 1)
: COLOUR_BLACK;
}
}
}
std::string title_get()
{
auto w = GetWindow();
if (w != nullptr && w->classification == WC_CUSTOM)
{
2020-02-27 23:25:26 +01:00
return language_convert_string_to_tokens(GetWindowTitle(w));
}
return {};
}
void title_set(std::string value)
{
auto w = GetWindow();
if (w != nullptr && w->classification == WC_CUSTOM)
{
UpdateWindowTitle(w, language_convert_string(value));
}
}
void close()
{
auto w = GetWindow();
if (w != nullptr)
{
window_close(w);
}
}
std::shared_ptr<ScWidget> findWidget(std::string name)
{
auto w = GetWindow();
if (w != nullptr)
{
auto widgetIndex = FindWidgetIndexByName(w, name);
if (widgetIndex)
{
return std::make_shared<ScWidget>(_class, _number, *widgetIndex);
}
}
return {};
}
void bringToFront()
{
auto w = GetWindow();
if (w != nullptr)
{
window_bring_to_front(w);
w->flags |= WF_WHITE_BORDER_MASK;
}
}
static void Register(duk_context* ctx)
2018-03-24 20:30:10 +01:00
{
dukglue_register_property(ctx, &ScWindow::classification_get, nullptr, "classification");
dukglue_register_property(ctx, &ScWindow::number_get, nullptr, "number");
2018-03-24 20:30:10 +01:00
dukglue_register_property(ctx, &ScWindow::x_get, &ScWindow::x_set, "x");
dukglue_register_property(ctx, &ScWindow::y_get, &ScWindow::y_set, "y");
dukglue_register_property(ctx, &ScWindow::width_get, nullptr, "width");
dukglue_register_property(ctx, &ScWindow::height_get, nullptr, "height");
dukglue_register_property(ctx, &ScWindow::isSticky_get, nullptr, "isSticky");
2020-02-15 00:36:24 +01:00
dukglue_register_property(ctx, &ScWindow::widgets_get, nullptr, "widgets");
2020-02-27 20:59:46 +01:00
dukglue_register_property(ctx, &ScWindow::colours_get, &ScWindow::colours_set, "colours");
dukglue_register_property(ctx, &ScWindow::title_get, &ScWindow::title_set, "title");
2020-02-22 19:04:27 +01:00
dukglue_register_method(ctx, &ScWindow::close, "close");
dukglue_register_method(ctx, &ScWindow::findWidget, "findWidget");
dukglue_register_method(ctx, &ScWindow::bringToFront, "bringToFront");
2018-03-24 20:30:10 +01:00
}
private:
rct_window* GetWindow() const
2018-03-24 20:30:10 +01:00
{
return window_find_by_number(_class, _number);
}
};
} // namespace OpenRCT2::Scripting
2020-02-23 16:33:01 +01:00
#endif