Add basic code for widget and screen resize

This commit is contained in:
CodingJellyfish 2024-04-19 13:18:31 +08:00
parent 78c6f16d79
commit 2f87966ff6
8 changed files with 55 additions and 5 deletions

View File

@ -91,6 +91,25 @@ void AbstractTopLevelContainer::addWidgetsRecursively(
} // addWidgetsRecursively } // addWidgetsRecursively
// ----------------------------------------------------------------------------
/** This function invokes resize() of each widgets and its children.
* \param widgets The vector of widgets to resize
* \param parent The parent widget of the vector of widgets */
void AbstractTopLevelContainer::resizeWidgetsRecursively(PtrVector<Widget>& widgets)
{
const unsigned short widgets_amount = widgets.size();
for (int n=0; n<widgets_amount; n++)
{
widgets[n].resize();
if (widgets[n].getType() == WTYPE_DIV)
{
resizeWidgetsRecursively(widgets[n].m_children);
}
} // for n in all widgets
} // resizeWidgetsRecursively
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
/** This function checks recursively if a widget is a child of a vector of widgets /** This function checks recursively if a widget is a child of a vector of widgets

View File

@ -63,6 +63,7 @@ namespace GUIEngine
void addWidgetsRecursively(PtrVector<Widget>& widgets, void addWidgetsRecursively(PtrVector<Widget>& widgets,
Widget* parent=NULL); Widget* parent=NULL);
void resizeWidgetsRecursively(PtrVector<Widget>& widgets);
public: public:
AbstractTopLevelContainer(); AbstractTopLevelContainer();

View File

@ -951,6 +951,8 @@ namespace GUIEngine
} }
Debug::closeDebugMenu(); Debug::closeDebugMenu();
if (!g_current_screen->isLoaded())
g_current_screen->loadFromFile();
g_current_screen->beforeAddingWidget(); g_current_screen->beforeAddingWidget();
// show screen // show screen

View File

@ -102,6 +102,7 @@ namespace GUIEngine
/** Widgets that need to be notified at every frame can add themselves there (FIXME: unclean) */ /** Widgets that need to be notified at every frame can add themselves there (FIXME: unclean) */
extern PtrVector<Widget, REF> needsUpdate; extern PtrVector<Widget, REF> needsUpdate;
extern PtrVector<Screen, REF> g_loaded_screens;
/** /**
* \brief Call this method to init the GUI engine. * \brief Call this method to init the GUI engine.

View File

@ -229,6 +229,17 @@ void Screen::manualRemoveWidget(Widget* w)
m_widgets.remove(w); m_widgets.remove(w);
} // manualRemoveWidget } // manualRemoveWidget
// -----------------------------------------------------------------------------
void Screen::onResize()
{
m_width = irr_driver->getActualScreenSize().Width;
m_height = irr_driver->getActualScreenSize().Height;
calculateLayout();
resizeWidgetsRecursively(m_widgets);
} // onResize
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
#if 0 #if 0

View File

@ -289,6 +289,11 @@ protected:
*/ */
virtual void onDraw(float dt) { }; virtual void onDraw(float dt) { };
/**
* \brief optional callback you can override to be notified at every resize.
*/
virtual void onResize();
/** /**
* \return which music to play at this screen * \return which music to play at this screen
*/ */

View File

@ -299,17 +299,23 @@ bool Widget::isFocusedForPlayer(const int playerID)
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void Widget::move(const int x, const int y, const int w, const int h) void Widget::resize()
{ {
assert(m_magic_number == 0xCAFEC001); assert(m_magic_number == 0xCAFEC001);
if (m_element)
moveIrrlichtElement();
}
// -----------------------------------------------------------------------------
void Widget::move(const int x, const int y, const int w, const int h)
{
m_x = x; m_x = x;
m_y = y; m_y = y;
m_w = w; m_w = w;
m_h = h; m_h = h;
resize();
if (m_element != NULL)
m_element->setRelativePosition( core::rect < s32 > (x, y, x+w, y+h) );
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------

View File

@ -405,7 +405,12 @@ namespace GUIEngine
virtual EventPropagation onActivationInput(const int playerID) { return EVENT_LET; } virtual EventPropagation onActivationInput(const int playerID) { return EVENT_LET; }
/** /**
* Call to resize/move the widget. Not all widgets can resize gracefully. * Call to resize the widget when its coordinations are updated.
*/
virtual void resize();
/**
* Move the widget to the given position.
*/ */
virtual void move(const int x, const int y, const int w, const int h); virtual void move(const int x, const int y, const int w, const int h);