mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
- The editor is accessible via the pause menu and the settings menu. - Buttons can be moved via drag & drop. - Buttons can be added/removed. The grid menu added by #14918 is used to show all buttons not included in the layout. - Custom layouts are responsive and adapt to changed screen size / DPI / hud_scaling. - The layout is saved as JSON in the "touch_layout" setting.
28 lines
1.1 KiB
C++
28 lines
1.1 KiB
C++
// Luanti
|
|
// SPDX-License-Identifier: LGPL-2.1-or-later
|
|
// Copyright (C) 2024 grorp, Gregor Parzefall <grorp@posteo.de>
|
|
|
|
#pragma once
|
|
#include <memory>
|
|
#include "IGUIElement.h"
|
|
|
|
// We cannot use irr_ptr for Irrlicht GUI elements we own.
|
|
// Option 1: Pass IGUIElement* returned by IGUIEnvironment::add* into irr_ptr
|
|
// constructor.
|
|
// -> We steal the reference owned by IGUIEnvironment and drop it later,
|
|
// causing the IGUIElement to be deleted while IGUIEnvironment still
|
|
// references it.
|
|
// Option 2: Pass IGUIElement* returned by IGUIEnvironment::add* into irr_ptr::grab.
|
|
// -> We add another reference and drop it later, but since IGUIEnvironment
|
|
// still references the IGUIElement, it is never deleted.
|
|
// To make IGUIEnvironment drop its reference to the IGUIElement, we have to call
|
|
// IGUIElement::remove, so that's what we'll do.
|
|
template <typename T>
|
|
std::shared_ptr<T> grab_gui_element(T *element)
|
|
{
|
|
static_assert(std::is_base_of_v<irr::gui::IGUIElement, T>,
|
|
"grab_gui_element only works for IGUIElement");
|
|
return std::shared_ptr<T>(element, [](T *e) {
|
|
e->remove();
|
|
});
|
|
}
|