From 9119caca658ec183356e0a5c52434f071f3a9058 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Thu, 18 Jan 2024 04:06:27 +0300 Subject: [PATCH] Delete world feature --- res/texts/en_US.txt | 1 + res/texts/ru_RU.txt | 1 + res/textures/gui/delete_icon.png | Bin 0 -> 1140 bytes res/textures/{ => gui}/menubg.png | Bin src/assets/AssetsLoader.cpp | 3 +- src/frontend/gui/controls.cpp | 47 +++++++++++++++++++++++++++++- src/frontend/gui/controls.h | 29 +++++++++++++++++- src/frontend/gui/panels.cpp | 8 +++-- src/frontend/gui/panels.h | 1 + src/frontend/menu.cpp | 30 +++++++++++++++++-- src/frontend/screens.cpp | 2 +- 11 files changed, 112 insertions(+), 10 deletions(-) create mode 100644 res/textures/gui/delete_icon.png rename res/textures/{ => gui}/menubg.png (100%) diff --git a/res/texts/en_US.txt b/res/texts/en_US.txt index 71db2ddc..f26803bd 100644 --- a/res/texts/en_US.txt +++ b/res/texts/en_US.txt @@ -2,6 +2,7 @@ menu.missing-content=Missing Content! world.convert-request=Content indices have changed! Convert world files? error.pack-not-found=Could not to find pack +world.delete-confirm=Do you want to delete world forever? # Bindings movement.forward=Forward diff --git a/res/texts/ru_RU.txt b/res/texts/ru_RU.txt index c3b4868a..61a33233 100644 --- a/res/texts/ru_RU.txt +++ b/res/texts/ru_RU.txt @@ -24,6 +24,7 @@ world.Name=Название menu.Create World=Создать Мир world.convert-request=Есть изменения в индексах! Конвертировать мир? +world.delete-confirm=Удалить мир безвозвратно? # Настройки settings.Load Distance=Дистанция Загрузки diff --git a/res/textures/gui/delete_icon.png b/res/textures/gui/delete_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d0584f0daeecc418efe69c61822911bd1842dc3b GIT binary patch literal 1140 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND9B&p z8d2hwnUl(3Q<_(jS(1~QVmEd3^=UvU36PXaVo554k%5tkzJZ~>p@o8hk(G&om7!&b z^&~Z*8Uc`+kj&gv1_J{tC^CF=SnUwVKCsb6iC{^?gMp$-KtW!RpfgacD3Jj|W&D5t z5-7n9k_b*t%}ZqflTQ_6L5>gx2?wR-rKA=itkE+tSYRIK$iTpy?&;zf62ZB3ns5Hu zK!Ia-!}e~8dt}?iA}FME(IqK6Rb8>n%&uwahJ?&s{)EKj%%{u|opW2KdF*mrdChyv zy<0`L`>UU4p8valPPMnM(f^so&u11tJ2TVxyIGj-&{kOj7kFv!V zDcTE><_;6Y|^}#9$t9<{L;!)GmK2OX2@0+za z@uO#9{I1Sp%8!~?t`*-qkva3A^Q`@P_vSqCunhUKc2n~1g}WYPO>@8Xr{hQGkNB63 zVmHFJSFhtZf3oxE@zQg)x4v_hdph0;RC`waB{Fh`+4~jKOTIp`-S+Is2G3Kb9|O4l zdC#@I*O{-y{H5#N5(c&-=Z|Q+K8{-P$)MEKVaaCC74l1)pYmO9`XwR}*Lj&|8sAO@ zvu|tt{)avmy16ph>A`)Yp0J+^wu?9-LDVd05?lA6C1<)+p;ZDYQ)QZ-|h?y38ycvy0DRA$Uw zSU>rXT$R?HmI-<$n=-0%l~1uwaNBEJrp(|MxkNT`!K1&M%2ca%g|+AFG0f}BY@RA* zDN?rXtYi_Rk!xaDkRHRk>B7#{x061W80v7EmABR8iahETGUD0EaOr4_kMXD3>!N+i z=FNLwYf+GLlvQ?_>O}5@pbgg`<7$!8WUY`4^@d)_Lj~w}W!L&$AxzoZ}}h zIs1Q4=(RQ<*ZK42cNb*)_^3NBy)i9Lx?#?xG?Nvr;V0b!Lc<>H65IM1wn&~mBUw~dAzH_}{?PiM67B?@JvZj)aagYSwj#DfZ%?GO>fUcI zN!lyfrm7u!z_uwanf<}pRW);DjT-nvep??%+0JmM$BgT>_1Dt}_IvR0?O|S#>ts>R zec&v|9Puy4ZCO_UD(S_Ow4O&NtOq8q}vK`#ni3iO{rP_|e1SgOT6qV~TgmzOy_F zN!aA8VNkh{^?lbu){iyb(Z3AlMN3UH`2J~i`FVzaf6g|&$aB?7+tBe*TkDr@UpKdo sp9ITX@p`Oy4Q@<)_{U19K#Ur>mdKI;Vst06I_VLjV8( literal 0 HcmV?d00001 diff --git a/res/textures/menubg.png b/res/textures/gui/menubg.png similarity index 100% rename from res/textures/menubg.png rename to res/textures/gui/menubg.png diff --git a/src/assets/AssetsLoader.cpp b/src/assets/AssetsLoader.cpp index 49328351..e5ab0d79 100644 --- a/src/assets/AssetsLoader.cpp +++ b/src/assets/AssetsLoader.cpp @@ -58,7 +58,8 @@ void AssetsLoader::addDefaults(AssetsLoader& loader, bool allAssets) { loader.add(ASSET_SHADER, SHADERS_FOLDER"/ui3d", "ui3d"); loader.add(ASSET_SHADER, SHADERS_FOLDER"/background", "background"); loader.add(ASSET_SHADER, SHADERS_FOLDER"/skybox_gen", "skybox_gen"); - loader.add(ASSET_TEXTURE, TEXTURES_FOLDER"/menubg.png", "menubg"); + loader.add(ASSET_TEXTURE, TEXTURES_FOLDER"/gui/menubg.png", "gui/menubg"); + loader.add(ASSET_TEXTURE, TEXTURES_FOLDER"/gui/delete_icon.png", "gui/delete_icon"); loader.add(ASSET_FONT, FONTS_FOLDER"/font", "normal"); } loader.add(ASSET_ATLAS, TEXTURES_FOLDER"/blocks", "blocks"); diff --git a/src/frontend/gui/controls.cpp b/src/frontend/gui/controls.cpp index 3315912d..65ce5246 100644 --- a/src/frontend/gui/controls.cpp +++ b/src/frontend/gui/controls.cpp @@ -62,8 +62,19 @@ void Label::size(vec2 sizenew) { UINode::size(vec2(UINode::size().x, sizenew.y)); } +// ================================= Image ==================================== +Image::Image(string texture, vec2 size) : UINode(vec2(), size), texture(texture) { +} + +void Image::draw(Batch2D* batch, Assets* assets) { + vec2 coord = calcCoord(); + batch->texture(assets->getTexture(texture)); + batch->color = color_; + batch->rect(coord.x, coord.y, size_.x, size_.y, 0, 0, 0, UVRegion(), false, true, color_); +} + // ================================= Button =================================== -Button::Button(shared_ptr content, glm::vec4 padding) : Panel(vec2(32,32), padding, 0) { +Button::Button(shared_ptr content, glm::vec4 padding) : Panel(vec2(34,32), padding, 0) { add(content); scrollable(false); } @@ -100,6 +111,11 @@ Button* Button::textSupplier(wstringsupplier supplier) { } return this; } + +void Button::setHoverColor(glm::vec4 color) { + hoverColor = color; +} + void Button::drawBackground(Batch2D* batch, Assets* assets) { vec2 coord = calcCoord(); batch->texture(nullptr); @@ -133,6 +149,35 @@ void Button::textAlign(Align align) { } } +// ============================== RichButton ================================== +RichButton::RichButton(vec2 size) : Container(vec2(), size) { +} + +void RichButton::mouseRelease(GUI* gui, int x, int y) { + UINode::mouseRelease(gui, x, y); + if (isInside(vec2(x, y))) { + for (auto callback : actions) { + callback(gui); + } + } +} + +RichButton* RichButton::listenAction(onaction action) { + actions.push_back(action); + return this; +} + +void RichButton::setHoverColor(glm::vec4 color) { + hoverColor = color; +} + +void RichButton::drawBackground(Batch2D* batch, Assets* assets) { + vec2 coord = calcCoord(); + batch->texture(nullptr); + batch->color = (ispressed() ? pressedColor : (hover_ ? hoverColor : color_)); + batch->rect(coord.x, coord.y, size_.x, size_.y); +} + // ================================ TextBox =================================== TextBox::TextBox(wstring placeholder, vec4 padding) : Panel(vec2(200,32), padding, 0, false), diff --git a/src/frontend/gui/controls.h b/src/frontend/gui/controls.h index a78bd587..60587248 100644 --- a/src/frontend/gui/controls.h +++ b/src/frontend/gui/controls.h @@ -43,6 +43,15 @@ namespace gui { virtual void size(glm::vec2 size) override; }; + class Image : public UINode { + protected: + std::string texture; + public: + Image(std::string texture, glm::vec2 size); + + virtual void draw(Batch2D* batch, Assets* assets) override; + }; + class Button : public Panel { protected: glm::vec4 hoverColor {0.05f, 0.1f, 0.15f, 0.75f}; @@ -55,7 +64,7 @@ namespace gui { glm::vec4 padding=glm::vec4(2.0f), glm::vec4 margin=glm::vec4(1.0f)); - virtual void drawBackground(Batch2D* batch, Assets* assets); + virtual void drawBackground(Batch2D* batch, Assets* assets) override; virtual std::shared_ptr getAt(glm::vec2 pos, std::shared_ptr self) override; @@ -68,6 +77,24 @@ namespace gui { virtual std::wstring text() const; virtual Button* textSupplier(wstringsupplier supplier); + + virtual void setHoverColor(glm::vec4 color); + }; + + class RichButton : public Container { + protected: + glm::vec4 hoverColor {0.05f, 0.1f, 0.15f, 0.75f}; + glm::vec4 pressedColor {0.0f, 0.0f, 0.0f, 0.95f}; + std::vector actions; + public: + RichButton(glm::vec2 size); + + virtual void drawBackground(Batch2D* batch, Assets* assets) override; + + virtual void mouseRelease(GUI*, int x, int y) override; + virtual RichButton* listenAction(onaction action); + + virtual void setHoverColor(glm::vec4 color); }; class TextBox : public Panel { diff --git a/src/frontend/gui/panels.cpp b/src/frontend/gui/panels.cpp index 338b7b6d..0fb87277 100644 --- a/src/frontend/gui/panels.cpp +++ b/src/frontend/gui/panels.cpp @@ -98,6 +98,11 @@ void Container::add(UINode* node) { add(shared_ptr(node)); } +void Container::add(shared_ptr node, glm::vec2 coord) { + node->setCoord(coord); + add(node); +} + void Container::remove(shared_ptr selected) { selected->setParent(nullptr); nodes.erase(std::remove_if(nodes.begin(), nodes.end(), @@ -190,15 +195,12 @@ void Panel::refresh() { node->refresh(); maxh = fmax(maxh, y+margin.y+node->size().y+margin.w+padding.w); } - bool increased = maxh > size.y; if (resizing_) { if (maxLength_) this->size(vec2(glm::min(maxLength_, (int)(x+padding.z)), size.y)); else this->size(vec2(x+padding.z, size.y)); } - if (increased) - refresh(); actualLength = size.y; } } diff --git a/src/frontend/gui/panels.h b/src/frontend/gui/panels.h index ab81bbe0..a93773ea 100644 --- a/src/frontend/gui/panels.h +++ b/src/frontend/gui/panels.h @@ -39,6 +39,7 @@ namespace gui { virtual std::shared_ptr getAt(glm::vec2 pos, std::shared_ptr self) override; virtual void add(std::shared_ptr node); virtual void add(UINode* node); + virtual void add(std::shared_ptr node, glm::vec2 coord); virtual void remove(std::shared_ptr node); virtual void scrolled(int value) override; virtual void scrollable(bool flag); diff --git a/src/frontend/menu.cpp b/src/frontend/menu.cpp index b7d395a9..2410b1ef 100644 --- a/src/frontend/menu.cpp +++ b/src/frontend/menu.cpp @@ -194,13 +194,37 @@ Panel* create_worlds_panel(Engine* engine) { if (!entry.is_directory()) { continue; } - auto name = entry.path().filename().u8string(); - auto btn = new Button(util::str2wstr_utf8(name), - vec4(10.0f, 8.0f, 10.0f, 8.0f)); + auto folder = entry.path(); + auto name = folder.filename().u8string(); + auto namews = util::str2wstr_utf8(name); + + auto btn = std::make_shared(vec2(390, 46)); btn->color(vec4(1.0f, 1.0f, 1.0f, 0.1f)); + btn->setHoverColor(vec4(1.0f, 1.0f, 1.0f, 0.17f)); + btn->add(std::make_shared