Delete world feature

This commit is contained in:
MihailRis 2024-01-18 04:06:27 +03:00
parent 01344a9d1d
commit 9119caca65
11 changed files with 112 additions and 10 deletions

View File

@ -2,6 +2,7 @@
menu.missing-content=Missing Content! menu.missing-content=Missing Content!
world.convert-request=Content indices have changed! Convert world files? world.convert-request=Content indices have changed! Convert world files?
error.pack-not-found=Could not to find pack error.pack-not-found=Could not to find pack
world.delete-confirm=Do you want to delete world forever?
# Bindings # Bindings
movement.forward=Forward movement.forward=Forward

View File

@ -24,6 +24,7 @@ world.Name=Название
menu.Create World=Создать Мир menu.Create World=Создать Мир
world.convert-request=Есть изменения в индексах! Конвертировать мир? world.convert-request=Есть изменения в индексах! Конвертировать мир?
world.delete-confirm=Удалить мир безвозвратно?
# Настройки # Настройки
settings.Load Distance=Дистанция Загрузки settings.Load Distance=Дистанция Загрузки

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 132 B

After

Width:  |  Height:  |  Size: 132 B

View File

@ -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"/ui3d", "ui3d");
loader.add(ASSET_SHADER, SHADERS_FOLDER"/background", "background"); loader.add(ASSET_SHADER, SHADERS_FOLDER"/background", "background");
loader.add(ASSET_SHADER, SHADERS_FOLDER"/skybox_gen", "skybox_gen"); 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_FONT, FONTS_FOLDER"/font", "normal");
} }
loader.add(ASSET_ATLAS, TEXTURES_FOLDER"/blocks", "blocks"); loader.add(ASSET_ATLAS, TEXTURES_FOLDER"/blocks", "blocks");

View File

@ -62,8 +62,19 @@ void Label::size(vec2 sizenew) {
UINode::size(vec2(UINode::size().x, sizenew.y)); 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::Button(shared_ptr<UINode> content, glm::vec4 padding) : Panel(vec2(32,32), padding, 0) { Button::Button(shared_ptr<UINode> content, glm::vec4 padding) : Panel(vec2(34,32), padding, 0) {
add(content); add(content);
scrollable(false); scrollable(false);
} }
@ -100,6 +111,11 @@ Button* Button::textSupplier(wstringsupplier supplier) {
} }
return this; return this;
} }
void Button::setHoverColor(glm::vec4 color) {
hoverColor = color;
}
void Button::drawBackground(Batch2D* batch, Assets* assets) { void Button::drawBackground(Batch2D* batch, Assets* assets) {
vec2 coord = calcCoord(); vec2 coord = calcCoord();
batch->texture(nullptr); 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::TextBox(wstring placeholder, vec4 padding) TextBox::TextBox(wstring placeholder, vec4 padding)
: Panel(vec2(200,32), padding, 0, false), : Panel(vec2(200,32), padding, 0, false),

View File

@ -43,6 +43,15 @@ namespace gui {
virtual void size(glm::vec2 size) override; 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 { class Button : public Panel {
protected: protected:
glm::vec4 hoverColor {0.05f, 0.1f, 0.15f, 0.75f}; 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 padding=glm::vec4(2.0f),
glm::vec4 margin=glm::vec4(1.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<UINode> getAt(glm::vec2 pos, std::shared_ptr<UINode> self) override; virtual std::shared_ptr<UINode> getAt(glm::vec2 pos, std::shared_ptr<UINode> self) override;
@ -68,6 +77,24 @@ namespace gui {
virtual std::wstring text() const; virtual std::wstring text() const;
virtual Button* textSupplier(wstringsupplier supplier); 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<onaction> 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 { class TextBox : public Panel {

View File

@ -98,6 +98,11 @@ void Container::add(UINode* node) {
add(shared_ptr<UINode>(node)); add(shared_ptr<UINode>(node));
} }
void Container::add(shared_ptr<UINode> node, glm::vec2 coord) {
node->setCoord(coord);
add(node);
}
void Container::remove(shared_ptr<UINode> selected) { void Container::remove(shared_ptr<UINode> selected) {
selected->setParent(nullptr); selected->setParent(nullptr);
nodes.erase(std::remove_if(nodes.begin(), nodes.end(), nodes.erase(std::remove_if(nodes.begin(), nodes.end(),
@ -190,15 +195,12 @@ void Panel::refresh() {
node->refresh(); node->refresh();
maxh = fmax(maxh, y+margin.y+node->size().y+margin.w+padding.w); maxh = fmax(maxh, y+margin.y+node->size().y+margin.w+padding.w);
} }
bool increased = maxh > size.y;
if (resizing_) { if (resizing_) {
if (maxLength_) if (maxLength_)
this->size(vec2(glm::min(maxLength_, (int)(x+padding.z)), size.y)); this->size(vec2(glm::min(maxLength_, (int)(x+padding.z)), size.y));
else else
this->size(vec2(x+padding.z, size.y)); this->size(vec2(x+padding.z, size.y));
} }
if (increased)
refresh();
actualLength = size.y; actualLength = size.y;
} }
} }

View File

@ -39,6 +39,7 @@ namespace gui {
virtual std::shared_ptr<UINode> getAt(glm::vec2 pos, std::shared_ptr<UINode> self) override; virtual std::shared_ptr<UINode> getAt(glm::vec2 pos, std::shared_ptr<UINode> self) override;
virtual void add(std::shared_ptr<UINode> node); virtual void add(std::shared_ptr<UINode> node);
virtual void add(UINode* node); virtual void add(UINode* node);
virtual void add(std::shared_ptr<UINode> node, glm::vec2 coord);
virtual void remove(std::shared_ptr<UINode> node); virtual void remove(std::shared_ptr<UINode> node);
virtual void scrolled(int value) override; virtual void scrolled(int value) override;
virtual void scrollable(bool flag); virtual void scrollable(bool flag);

View File

@ -194,13 +194,37 @@ Panel* create_worlds_panel(Engine* engine) {
if (!entry.is_directory()) { if (!entry.is_directory()) {
continue; continue;
} }
auto name = entry.path().filename().u8string(); auto folder = entry.path();
auto btn = new Button(util::str2wstr_utf8(name), auto name = folder.filename().u8string();
vec4(10.0f, 8.0f, 10.0f, 8.0f)); auto namews = util::str2wstr_utf8(name);
auto btn = std::make_shared<RichButton>(vec2(390, 46));
btn->color(vec4(1.0f, 1.0f, 1.0f, 0.1f)); 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<Label>(namews), vec2(8, 8));
btn->listenAction([=](GUI*) { btn->listenAction([=](GUI*) {
open_world(name, engine); open_world(name, engine);
}); });
auto image = std::make_shared<Image>("gui/delete_icon", vec2(32, 32));
image->color(vec4(1, 1, 1, 0.5f));
auto delbtn = std::make_shared<Button>(image, vec4(2));
delbtn->color(vec4(0.0f));
delbtn->setHoverColor(vec4(1.0f, 1.0f, 1.0f, 0.17f));
btn->add(delbtn, vec2(330, 3));
delbtn->listenAction([=](GUI* gui) {
guiutil::confirm(gui, langs::get(L"delete-confirm", L"world")+
L" ("+util::str2wstr_utf8(folder.u8string())+L")", [=]()
{
std::cout << "deleting " << folder.u8string() << std::endl;
fs::remove_all(folder);
menus::refresh_menus(engine, gui->getMenu());
});
});
panel->add(btn); panel->add(btn);
} }
} }

View File

@ -72,7 +72,7 @@ void MenuScreen::draw(float delta) {
uint height = Window::height; uint height = Window::height;
batch->begin(); batch->begin();
batch->texture(engine->getAssets()->getTexture("menubg")); batch->texture(engine->getAssets()->getTexture("gui/menubg"));
batch->rect(0, 0, batch->rect(0, 0,
width, height, 0, 0, 0, width, height, 0, 0, 0,
UVRegion(0, 0, width/64, height/64), UVRegion(0, 0, width/64, height/64),