Formspec: draw order and clipping for all elements (#8740)
parent
15a030ec9f
commit
5506e97ed8
|
@ -178,12 +178,15 @@ LOCAL_SRC_FILES := \
|
||||||
jni/src/filesys.cpp \
|
jni/src/filesys.cpp \
|
||||||
jni/src/genericobject.cpp \
|
jni/src/genericobject.cpp \
|
||||||
jni/src/gettext.cpp \
|
jni/src/gettext.cpp \
|
||||||
|
jni/src/gui/guiBackgroundImage.cpp \
|
||||||
|
jni/src/gui/guiBox.cpp \
|
||||||
jni/src/gui/guiButton.cpp \
|
jni/src/gui/guiButton.cpp \
|
||||||
jni/src/gui/guiChatConsole.cpp \
|
jni/src/gui/guiChatConsole.cpp \
|
||||||
jni/src/gui/guiConfirmRegistration.cpp \
|
jni/src/gui/guiConfirmRegistration.cpp \
|
||||||
jni/src/gui/guiEditBoxWithScrollbar.cpp \
|
jni/src/gui/guiEditBoxWithScrollbar.cpp \
|
||||||
jni/src/gui/guiEngine.cpp \
|
jni/src/gui/guiEngine.cpp \
|
||||||
jni/src/gui/guiFormSpecMenu.cpp \
|
jni/src/gui/guiFormSpecMenu.cpp \
|
||||||
|
jni/src/gui/guiItemImage.cpp \
|
||||||
jni/src/gui/guiKeyChangeMenu.cpp \
|
jni/src/gui/guiKeyChangeMenu.cpp \
|
||||||
jni/src/gui/guiPasswordChange.cpp \
|
jni/src/gui/guiPasswordChange.cpp \
|
||||||
jni/src/gui/guiPathSelectMenu.cpp \
|
jni/src/gui/guiPathSelectMenu.cpp \
|
||||||
|
|
|
@ -1923,6 +1923,11 @@ When displaying text which can contain formspec code, e.g. text set by a player,
|
||||||
use `minetest.formspec_escape`.
|
use `minetest.formspec_escape`.
|
||||||
For coloured text you can use `minetest.colorize`.
|
For coloured text you can use `minetest.colorize`.
|
||||||
|
|
||||||
|
Since formspec version 3, elements drawn in the order they are defined. All
|
||||||
|
background elements are drawn before all other elements.
|
||||||
|
`list` elements are an exception here. They are drawn last. This, however, might
|
||||||
|
be changed at any time.
|
||||||
|
|
||||||
**WARNING**: do _not_ use a element name starting with `key_`; those names are
|
**WARNING**: do _not_ use a element name starting with `key_`; those names are
|
||||||
reserved to pass key press events to formspec!
|
reserved to pass key press events to formspec!
|
||||||
|
|
||||||
|
@ -2032,6 +2037,7 @@ Elements
|
||||||
be shown if the inventory list is of size 0.
|
be shown if the inventory list is of size 0.
|
||||||
* **Note**: With the new coordinate system, the spacing between inventory
|
* **Note**: With the new coordinate system, the spacing between inventory
|
||||||
slots is one-fourth the size of an inventory slot.
|
slots is one-fourth the size of an inventory slot.
|
||||||
|
* **Note**: Lists are drawn after every other element. This might change at any time.
|
||||||
|
|
||||||
### `list[<inventory location>;<list name>;<X>,<Y>;<W>,<H>;<starting item index>]`
|
### `list[<inventory location>;<list name>;<X>,<Y>;<W>,<H>;<starting item index>]`
|
||||||
|
|
||||||
|
@ -2039,6 +2045,7 @@ Elements
|
||||||
be shown if the inventory list is of size 0.
|
be shown if the inventory list is of size 0.
|
||||||
* **Note**: With the new coordinate system, the spacing between inventory
|
* **Note**: With the new coordinate system, the spacing between inventory
|
||||||
slots is one-fourth the size of an inventory slot.
|
slots is one-fourth the size of an inventory slot.
|
||||||
|
* **Note**: Lists are drawn after every other element. This might change at any time.
|
||||||
|
|
||||||
### `listring[<inventory location>;<list name>]`
|
### `listring[<inventory location>;<list name>]`
|
||||||
|
|
||||||
|
|
|
@ -171,7 +171,8 @@ void draw2DImageFilterScaled(video::IVideoDriver *driver, video::ITexture *txr,
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw2DImage9Slice(video::IVideoDriver *driver, video::ITexture *texture,
|
void draw2DImage9Slice(video::IVideoDriver *driver, video::ITexture *texture,
|
||||||
const core::rect<s32> &rect, const core::rect<s32> &middle)
|
const core::rect<s32> &rect, const core::rect<s32> &middle,
|
||||||
|
const core::rect<s32> *cliprect)
|
||||||
{
|
{
|
||||||
const video::SColor color(255,255,255,255);
|
const video::SColor color(255,255,255,255);
|
||||||
const video::SColor colors[] = {color,color,color,color};
|
const video::SColor colors[] = {color,color,color,color};
|
||||||
|
@ -222,9 +223,7 @@ void draw2DImage9Slice(video::IVideoDriver *driver, video::ITexture *texture,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
draw2DImageFilterScaled(driver, texture, dest,
|
draw2DImageFilterScaled(driver, texture, dest, src, cliprect, colors, true);
|
||||||
src,
|
|
||||||
NULL/*&AbsoluteClippingRect*/, colors, true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,4 +53,5 @@ void draw2DImageFilterScaled(video::IVideoDriver *driver, video::ITexture *txr,
|
||||||
* 9-slice / segment drawing
|
* 9-slice / segment drawing
|
||||||
*/
|
*/
|
||||||
void draw2DImage9Slice(video::IVideoDriver *driver, video::ITexture *texture,
|
void draw2DImage9Slice(video::IVideoDriver *driver, video::ITexture *texture,
|
||||||
const core::rect<s32> &rect, const core::rect<s32> &middle);
|
const core::rect<s32> &rect, const core::rect<s32> &middle,
|
||||||
|
const core::rect<s32> *cliprect = nullptr);
|
||||||
|
|
|
@ -1,10 +1,13 @@
|
||||||
set(gui_SRCS
|
set(gui_SRCS
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/guiBackgroundImage.cpp
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/guiBox.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/guiButton.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/guiButton.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/guiChatConsole.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/guiChatConsole.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/guiConfirmRegistration.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/guiConfirmRegistration.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/guiEditBoxWithScrollbar.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/guiEditBoxWithScrollbar.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/guiEngine.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/guiEngine.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/guiFormSpecMenu.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/guiFormSpecMenu.cpp
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/guiItemImage.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/guiKeyChangeMenu.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/guiKeyChangeMenu.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/guiPasswordChange.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/guiPasswordChange.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/guiPathSelectMenu.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/guiPathSelectMenu.cpp
|
||||||
|
|
|
@ -0,0 +1,69 @@
|
||||||
|
/*
|
||||||
|
Part of Minetest
|
||||||
|
Copyright (C) 2013 RealBadAngel, Maciej Kasatkin <mk@realbadangel.pl>
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and distribute this software for any
|
||||||
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
copyright notice and this permission notice appear in all copies.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "guiBackgroundImage.h"
|
||||||
|
#include "client/guiscalingfilter.h"
|
||||||
|
#include "log.h"
|
||||||
|
|
||||||
|
GUIBackgroundImage::GUIBackgroundImage(gui::IGUIEnvironment *env,
|
||||||
|
gui::IGUIElement *parent, s32 id, const core::rect<s32> &rectangle,
|
||||||
|
const std::string &name, const core::rect<s32> &middle,
|
||||||
|
ISimpleTextureSource *tsrc, bool autoclip) :
|
||||||
|
gui::IGUIElement(gui::EGUIET_ELEMENT, env, parent, id, rectangle),
|
||||||
|
m_name(name), m_middle(middle), m_tsrc(tsrc), m_autoclip(autoclip)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void GUIBackgroundImage::draw()
|
||||||
|
{
|
||||||
|
if (!IsVisible)
|
||||||
|
return;
|
||||||
|
|
||||||
|
video::ITexture *texture = m_tsrc->getTexture(m_name);
|
||||||
|
|
||||||
|
if (!texture) {
|
||||||
|
errorstream << "GUIBackgroundImage::draw() Unable to load texture:"
|
||||||
|
<< std::endl;
|
||||||
|
errorstream << "\t" << m_name << std::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
core::rect<s32> rect = AbsoluteRect;
|
||||||
|
if (m_autoclip)
|
||||||
|
rect.LowerRightCorner += Parent->getAbsolutePosition().getSize();
|
||||||
|
|
||||||
|
video::IVideoDriver *driver = Environment->getVideoDriver();
|
||||||
|
|
||||||
|
if (m_middle.getArea() == 0) {
|
||||||
|
const video::SColor color(255, 255, 255, 255);
|
||||||
|
const video::SColor colors[] = {color, color, color, color};
|
||||||
|
draw2DImageFilterScaled(driver, texture, rect,
|
||||||
|
core::rect<s32>(core::position2d<s32>(0, 0),
|
||||||
|
core::dimension2di(texture->getOriginalSize())),
|
||||||
|
nullptr, colors, true);
|
||||||
|
} else {
|
||||||
|
core::rect<s32> middle = m_middle;
|
||||||
|
// `-x` is interpreted as `w - x`
|
||||||
|
if (middle.LowerRightCorner.X < 0)
|
||||||
|
middle.LowerRightCorner.X += texture->getOriginalSize().Width;
|
||||||
|
if (middle.LowerRightCorner.Y < 0)
|
||||||
|
middle.LowerRightCorner.Y += texture->getOriginalSize().Height;
|
||||||
|
draw2DImage9Slice(driver, texture, rect, middle);
|
||||||
|
}
|
||||||
|
|
||||||
|
IGUIElement::draw();
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
Part of Minetest
|
||||||
|
Copyright (C) 2013 RealBadAngel, Maciej Kasatkin <mk@realbadangel.pl>
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and distribute this software for any
|
||||||
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
copyright notice and this permission notice appear in all copies.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "irrlichttypes_extrabloated.h"
|
||||||
|
#include "util/string.h"
|
||||||
|
#include "client/tile.h" // ITextureSource
|
||||||
|
|
||||||
|
class GUIBackgroundImage : public gui::IGUIElement
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GUIBackgroundImage(gui::IGUIEnvironment *env, gui::IGUIElement *parent, s32 id,
|
||||||
|
const core::rect<s32> &rectangle, const std::string &name,
|
||||||
|
const core::rect<s32> &middle, ISimpleTextureSource *tsrc, bool autoclip);
|
||||||
|
|
||||||
|
virtual void draw() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string m_name;
|
||||||
|
core::rect<s32> m_middle;
|
||||||
|
ISimpleTextureSource *m_tsrc;
|
||||||
|
bool m_autoclip;
|
||||||
|
};
|
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
Minetest
|
||||||
|
Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2.1 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "guiBox.h"
|
||||||
|
|
||||||
|
GUIBox::GUIBox(gui::IGUIEnvironment *env, gui::IGUIElement *parent, s32 id,
|
||||||
|
const core::rect<s32> &rectangle, const video::SColor &color) :
|
||||||
|
gui::IGUIElement(gui::EGUIET_ELEMENT, env, parent, id, rectangle),
|
||||||
|
m_color(color)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void GUIBox::draw()
|
||||||
|
{
|
||||||
|
if (!IsVisible)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Environment->getVideoDriver()->draw2DRectangle(m_color, AbsoluteRect,
|
||||||
|
&AbsoluteClippingRect);
|
||||||
|
|
||||||
|
IGUIElement::draw();
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
/*
|
||||||
|
Minetest
|
||||||
|
Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2.1 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "irrlichttypes_extrabloated.h"
|
||||||
|
|
||||||
|
class GUIBox : public gui::IGUIElement
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GUIBox(gui::IGUIEnvironment *env, gui::IGUIElement *parent, s32 id,
|
||||||
|
const core::rect<s32> &rectangle, const video::SColor &color);
|
||||||
|
|
||||||
|
virtual void draw() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
video::SColor m_color;
|
||||||
|
};
|
File diff suppressed because it is too large
Load Diff
|
@ -36,6 +36,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
class InventoryManager;
|
class InventoryManager;
|
||||||
class ISimpleTextureSource;
|
class ISimpleTextureSource;
|
||||||
class Client;
|
class Client;
|
||||||
|
class GUIScrollBar;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
f_Button,
|
f_Button,
|
||||||
|
@ -44,6 +45,8 @@ typedef enum {
|
||||||
f_CheckBox,
|
f_CheckBox,
|
||||||
f_DropDown,
|
f_DropDown,
|
||||||
f_ScrollBar,
|
f_ScrollBar,
|
||||||
|
f_Box,
|
||||||
|
f_ItemImage,
|
||||||
f_Unknown
|
f_Unknown
|
||||||
} FormspecFieldType;
|
} FormspecFieldType;
|
||||||
|
|
||||||
|
@ -101,11 +104,11 @@ class GUIFormSpecMenu : public GUIModalMenu
|
||||||
|
|
||||||
ListDrawSpec(const InventoryLocation &a_inventoryloc,
|
ListDrawSpec(const InventoryLocation &a_inventoryloc,
|
||||||
const std::string &a_listname,
|
const std::string &a_listname,
|
||||||
v2s32 a_pos, v2s32 a_geom, s32 a_start_item_i,
|
IGUIElement *elem, v2s32 a_geom, s32 a_start_item_i,
|
||||||
bool a_real_coordinates):
|
bool a_real_coordinates):
|
||||||
inventoryloc(a_inventoryloc),
|
inventoryloc(a_inventoryloc),
|
||||||
listname(a_listname),
|
listname(a_listname),
|
||||||
pos(a_pos),
|
e(elem),
|
||||||
geom(a_geom),
|
geom(a_geom),
|
||||||
start_item_i(a_start_item_i),
|
start_item_i(a_start_item_i),
|
||||||
real_coordinates(a_real_coordinates)
|
real_coordinates(a_real_coordinates)
|
||||||
|
@ -114,7 +117,7 @@ class GUIFormSpecMenu : public GUIModalMenu
|
||||||
|
|
||||||
InventoryLocation inventoryloc;
|
InventoryLocation inventoryloc;
|
||||||
std::string listname;
|
std::string listname;
|
||||||
v2s32 pos;
|
IGUIElement *e;
|
||||||
v2s32 geom;
|
v2s32 geom;
|
||||||
s32 start_item_i;
|
s32 start_item_i;
|
||||||
bool real_coordinates;
|
bool real_coordinates;
|
||||||
|
@ -135,84 +138,6 @@ class GUIFormSpecMenu : public GUIModalMenu
|
||||||
std::string listname;
|
std::string listname;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ImageDrawSpec
|
|
||||||
{
|
|
||||||
ImageDrawSpec():
|
|
||||||
parent_button(NULL),
|
|
||||||
clip(false)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
ImageDrawSpec(const std::string &a_name,
|
|
||||||
const std::string &a_item_name,
|
|
||||||
gui::IGUIButton *a_parent_button,
|
|
||||||
const v2s32 &a_pos, const v2s32 &a_geom):
|
|
||||||
name(a_name),
|
|
||||||
item_name(a_item_name),
|
|
||||||
parent_button(a_parent_button),
|
|
||||||
pos(a_pos),
|
|
||||||
geom(a_geom),
|
|
||||||
scale(true),
|
|
||||||
clip(false)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
ImageDrawSpec(const std::string &a_name,
|
|
||||||
const std::string &a_item_name,
|
|
||||||
const v2s32 &a_pos, const v2s32 &a_geom):
|
|
||||||
name(a_name),
|
|
||||||
item_name(a_item_name),
|
|
||||||
parent_button(NULL),
|
|
||||||
pos(a_pos),
|
|
||||||
geom(a_geom),
|
|
||||||
scale(true),
|
|
||||||
clip(false)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
ImageDrawSpec(const std::string &a_name,
|
|
||||||
const v2s32 &a_pos, const v2s32 &a_geom, bool clip=false):
|
|
||||||
name(a_name),
|
|
||||||
parent_button(NULL),
|
|
||||||
pos(a_pos),
|
|
||||||
geom(a_geom),
|
|
||||||
scale(true),
|
|
||||||
clip(clip)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
ImageDrawSpec(const std::string &a_name,
|
|
||||||
const v2s32 &a_pos, const v2s32 &a_geom, const core::rect<s32> &middle, bool clip=false):
|
|
||||||
name(a_name),
|
|
||||||
parent_button(NULL),
|
|
||||||
pos(a_pos),
|
|
||||||
geom(a_geom),
|
|
||||||
middle(middle),
|
|
||||||
scale(true),
|
|
||||||
clip(clip)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
ImageDrawSpec(const std::string &a_name,
|
|
||||||
const v2s32 &a_pos):
|
|
||||||
name(a_name),
|
|
||||||
parent_button(NULL),
|
|
||||||
pos(a_pos),
|
|
||||||
scale(false),
|
|
||||||
clip(false)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string name;
|
|
||||||
std::string item_name;
|
|
||||||
gui::IGUIButton *parent_button;
|
|
||||||
v2s32 pos;
|
|
||||||
v2s32 geom;
|
|
||||||
core::rect<s32> middle;
|
|
||||||
bool scale;
|
|
||||||
bool clip;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct FieldSpec
|
struct FieldSpec
|
||||||
{
|
{
|
||||||
FieldSpec() = default;
|
FieldSpec() = default;
|
||||||
|
@ -239,19 +164,6 @@ class GUIFormSpecMenu : public GUIModalMenu
|
||||||
core::rect<s32> rect;
|
core::rect<s32> rect;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct BoxDrawSpec
|
|
||||||
{
|
|
||||||
BoxDrawSpec(v2s32 a_pos, v2s32 a_geom, irr::video::SColor a_color):
|
|
||||||
pos(a_pos),
|
|
||||||
geom(a_geom),
|
|
||||||
color(a_color)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
v2s32 pos;
|
|
||||||
v2s32 geom;
|
|
||||||
irr::video::SColor color;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct TooltipSpec
|
struct TooltipSpec
|
||||||
{
|
{
|
||||||
TooltipSpec() = default;
|
TooltipSpec() = default;
|
||||||
|
@ -397,10 +309,9 @@ protected:
|
||||||
}
|
}
|
||||||
std::wstring getLabelByID(s32 id);
|
std::wstring getLabelByID(s32 id);
|
||||||
std::string getNameByID(s32 id);
|
std::string getNameByID(s32 id);
|
||||||
v2s32 getElementBasePos(bool absolute,
|
FormspecFieldType getTypeByID(s32 id);
|
||||||
const std::vector<std::string> *v_pos);
|
v2s32 getElementBasePos(const std::vector<std::string> *v_pos);
|
||||||
v2s32 getRealCoordinateBasePos(bool absolute,
|
v2s32 getRealCoordinateBasePos(const std::vector<std::string> &v_pos);
|
||||||
const std::vector<std::string> &v_pos);
|
|
||||||
v2s32 getRealCoordinateGeometry(const std::vector<std::string> &v_geom);
|
v2s32 getRealCoordinateGeometry(const std::vector<std::string> &v_geom);
|
||||||
|
|
||||||
std::unordered_map<std::string, StyleSpec> theme_by_type;
|
std::unordered_map<std::string, StyleSpec> theme_by_type;
|
||||||
|
@ -427,19 +338,15 @@ protected:
|
||||||
|
|
||||||
std::vector<ListDrawSpec> m_inventorylists;
|
std::vector<ListDrawSpec> m_inventorylists;
|
||||||
std::vector<ListRingSpec> m_inventory_rings;
|
std::vector<ListRingSpec> m_inventory_rings;
|
||||||
std::vector<ImageDrawSpec> m_backgrounds;
|
std::vector<gui::IGUIElement *> m_backgrounds;
|
||||||
std::vector<ImageDrawSpec> m_images;
|
|
||||||
std::vector<ImageDrawSpec> m_itemimages;
|
|
||||||
std::vector<BoxDrawSpec> m_boxes;
|
|
||||||
std::unordered_map<std::string, bool> field_close_on_enter;
|
std::unordered_map<std::string, bool> field_close_on_enter;
|
||||||
std::vector<FieldSpec> m_fields;
|
std::vector<FieldSpec> m_fields;
|
||||||
std::vector<StaticTextSpec> m_static_texts;
|
std::vector<std::pair<FieldSpec, GUITable *>> m_tables;
|
||||||
std::vector<std::pair<FieldSpec,GUITable*> > m_tables;
|
std::vector<std::pair<FieldSpec, gui::IGUICheckBox *>> m_checkboxes;
|
||||||
std::vector<std::pair<FieldSpec,gui::IGUICheckBox*> > m_checkboxes;
|
|
||||||
std::map<std::string, TooltipSpec> m_tooltips;
|
std::map<std::string, TooltipSpec> m_tooltips;
|
||||||
std::vector<std::pair<irr::core::rect<s32>, TooltipSpec>> m_tooltip_rects;
|
std::vector<std::pair<gui::IGUIElement *, TooltipSpec>> m_tooltip_rects;
|
||||||
std::vector<std::pair<FieldSpec,gui::IGUIScrollBar*> > m_scrollbars;
|
std::vector<std::pair<FieldSpec, GUIScrollBar *>> m_scrollbars;
|
||||||
std::vector<std::pair<FieldSpec, std::vector<std::string> > > m_dropdowns;
|
std::vector<std::pair<FieldSpec, std::vector<std::string>>> m_dropdowns;
|
||||||
|
|
||||||
ItemSpec *m_selected_item = nullptr;
|
ItemSpec *m_selected_item = nullptr;
|
||||||
u16 m_selected_amount = 0;
|
u16 m_selected_amount = 0;
|
||||||
|
@ -480,6 +387,7 @@ private:
|
||||||
typedef struct {
|
typedef struct {
|
||||||
bool explicit_size;
|
bool explicit_size;
|
||||||
bool real_coordinates;
|
bool real_coordinates;
|
||||||
|
u8 simple_field_count;
|
||||||
v2f invsize;
|
v2f invsize;
|
||||||
v2s32 size;
|
v2s32 size;
|
||||||
v2f32 offset;
|
v2f32 offset;
|
||||||
|
@ -555,6 +463,13 @@ private:
|
||||||
void showTooltip(const std::wstring &text, const irr::video::SColor &color,
|
void showTooltip(const std::wstring &text, const irr::video::SColor &color,
|
||||||
const irr::video::SColor &bgcolor);
|
const irr::video::SColor &bgcolor);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* In formspec version < 2 the elements were not ordered properly. Some element
|
||||||
|
* types were drawn before others.
|
||||||
|
* This function sorts the elements in the old order for backwards compatibility.
|
||||||
|
*/
|
||||||
|
void legacySortElements(core::list<IGUIElement *>::Iterator from);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* check if event is part of a double click
|
* check if event is part of a double click
|
||||||
* @param event event to evaluate
|
* @param event event to evaluate
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
/*
|
||||||
|
Minetest
|
||||||
|
Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2.1 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "guiItemImage.h"
|
||||||
|
#include "client/client.h"
|
||||||
|
|
||||||
|
GUIItemImage::GUIItemImage(gui::IGUIEnvironment *env, gui::IGUIElement *parent,
|
||||||
|
s32 id, const core::rect<s32> &rectangle, const std::string &item_name,
|
||||||
|
gui::IGUIFont *font, Client *client) :
|
||||||
|
gui::IGUIElement(gui::EGUIET_ELEMENT, env, parent, id, rectangle),
|
||||||
|
m_item_name(item_name), m_font(font), m_client(client), m_label(core::stringw())
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void GUIItemImage::draw()
|
||||||
|
{
|
||||||
|
if (!IsVisible)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!m_client) {
|
||||||
|
IGUIElement::draw();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
IItemDefManager *idef = m_client->idef();
|
||||||
|
ItemStack item;
|
||||||
|
item.deSerialize(m_item_name, idef);
|
||||||
|
// Viewport rectangle on screen
|
||||||
|
core::rect<s32> rect = core::rect<s32>(AbsoluteRect);
|
||||||
|
if (Parent->getType() == gui::EGUIET_BUTTON &&
|
||||||
|
((irr::gui::IGUIButton *)Parent)->isPressed()) {
|
||||||
|
#if (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 8)
|
||||||
|
rect += core::dimension2d<s32>(0.05 * (float)rect.getWidth(),
|
||||||
|
0.05 * (float)rect.getHeight());
|
||||||
|
#else
|
||||||
|
gui::IGUISkin *skin = Environment->getSkin();
|
||||||
|
rect += core::dimension2d<s32>(
|
||||||
|
skin->getSize(irr::gui::EGDS_BUTTON_PRESSED_IMAGE_OFFSET_X),
|
||||||
|
skin->getSize(irr::gui::EGDS_BUTTON_PRESSED_IMAGE_OFFSET_Y));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
drawItemStack(Environment->getVideoDriver(), m_font, item, rect,
|
||||||
|
&AbsoluteClippingRect, m_client, IT_ROT_NONE);
|
||||||
|
video::SColor color(255, 255, 255, 255);
|
||||||
|
m_font->draw(m_label, rect, color, true, true, &AbsoluteClippingRect);
|
||||||
|
|
||||||
|
IGUIElement::draw();
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
Minetest
|
||||||
|
Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2.1 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "irrlichttypes_extrabloated.h"
|
||||||
|
#include "util/string.h"
|
||||||
|
|
||||||
|
class Client;
|
||||||
|
|
||||||
|
class GUIItemImage : public gui::IGUIElement
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GUIItemImage(gui::IGUIEnvironment *env, gui::IGUIElement *parent, s32 id,
|
||||||
|
const core::rect<s32> &rectangle, const std::string &item_name,
|
||||||
|
gui::IGUIFont *font, Client *client);
|
||||||
|
|
||||||
|
virtual void draw() override;
|
||||||
|
|
||||||
|
virtual void setText(const wchar_t *text) override
|
||||||
|
{
|
||||||
|
m_label = text;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string m_item_name;
|
||||||
|
gui::IGUIFont *m_font;
|
||||||
|
Client *m_client;
|
||||||
|
core::stringw m_label;
|
||||||
|
};
|
|
@ -228,9 +228,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
(too much)
|
(too much)
|
||||||
FORMSPEC VERSION 2:
|
FORMSPEC VERSION 2:
|
||||||
Forced real coordinates
|
Forced real coordinates
|
||||||
background[]: 9-slice scaling parameters
|
background9[]: 9-slice scaling parameters
|
||||||
|
FORMSPEC VERSION 3:
|
||||||
|
Formspec elements are drawn in the order of definition
|
||||||
*/
|
*/
|
||||||
#define FORMSPEC_API_VERSION 2
|
#define FORMSPEC_API_VERSION 3
|
||||||
|
|
||||||
#define TEXTURENAME_ALLOWED_CHARS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.-"
|
#define TEXTURENAME_ALLOWED_CHARS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.-"
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue