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 00000000..d0584f0d Binary files /dev/null and b/res/textures/gui/delete_icon.png differ 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