fix color picker, add project delete button with message box
This commit is contained in:
@@ -152,13 +152,13 @@
|
|||||||
<border positioning="absolute" position="0 0" color=".4 .4 .4 .8" width="100%" height="100%" align="center" justify="center">
|
<border positioning="absolute" position="0 0" color=".4 .4 .4 .8" width="100%" height="100%" align="center" justify="center">
|
||||||
<border thickness="1" border-color=".2" pad="3">
|
<border thickness="1" border-color=".2" pad="3">
|
||||||
<border width="400" height="30" color=".2 .2 .2 .9" dir="row" align="center" justify="center">
|
<border width="400" height="30" color=".2 .2 .2 .9" dir="row" align="center" justify="center">
|
||||||
<text text="Just a test message" font-face="arial" font-size="11"></text>
|
<text id="title" text="Just a test message" font-face="arial" font-size="11"></text>
|
||||||
</border>
|
</border>
|
||||||
<border width="400" color="0 0 0 .9" pad="10" dir="col">
|
<border width="400" color="0 0 0 .9" pad="10" dir="col">
|
||||||
<text text="Longer description for the error or the message." font-face="arial" font-size="11"></text>
|
<text id="message" text="Longer description for the error or the message." font-face="arial" font-size="11"></text>
|
||||||
<node height="40" grow="1" dir="row" align="flex-end" justify="flex-end">
|
<node height="40" grow="1" dir="row" align="flex-end" justify="flex-end">
|
||||||
<button id="btn-ok" text="Ok" width="50" height="30" margin="0 10 0 0"/>
|
<button id="btn-ok" text="Ok" width="50" height="30" margin="0 10 0 0"/>
|
||||||
<button text="Cancel" width="60" height="30" pad="10"/>
|
<button id="btn-cancel" text="Cancel" width="60" height="30" pad="10"/>
|
||||||
</node>
|
</node>
|
||||||
</border>
|
</border>
|
||||||
</border>
|
</border>
|
||||||
@@ -213,6 +213,7 @@
|
|||||||
</node>
|
</node>
|
||||||
<!--<text-input width="100" height="100" color=".3"/>-->
|
<!--<text-input width="100" height="100" color=".3"/>-->
|
||||||
<node height="40" grow="1" dir="row" align="flex-end" justify="flex-end">
|
<node height="40" grow="1" dir="row" align="flex-end" justify="flex-end">
|
||||||
|
<node grow="1"><button id="btn-delete" text="Delete Project" width="100" height="30" margin="0 10 0 0" color="1 0 0 1"/></node>
|
||||||
<button id="btn-ok" text="Open Project" width="100" height="30" margin="0 10 0 0"/>
|
<button id="btn-ok" text="Open Project" width="100" height="30" margin="0 10 0 0"/>
|
||||||
<button id="btn-cancel" text="Cancel" width="60" height="30" pad="10"/>
|
<button id="btn-cancel" text="Cancel" width="60" height="30" pad="10"/>
|
||||||
</node>
|
</node>
|
||||||
|
|||||||
@@ -10,6 +10,13 @@
|
|||||||
AAssetManager* Asset::m_am;
|
AAssetManager* Asset::m_am;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
bool Asset::delete_file(const std::string& path)
|
||||||
|
{
|
||||||
|
LOG("delete project: %s", path.c_str());
|
||||||
|
std::remove(path.c_str());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<std::string> Asset::list_files(std::string folder, bool is_asset, const std::string& filter_regex)
|
std::vector<std::string> Asset::list_files(std::string folder, bool is_asset, const std::string& filter_regex)
|
||||||
{
|
{
|
||||||
std::vector<std::string> names;
|
std::vector<std::string> names;
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ public:
|
|||||||
AAsset* m_asset = nullptr;
|
AAsset* m_asset = nullptr;
|
||||||
#endif
|
#endif
|
||||||
static std::vector<std::string> list_files(std::string folder, bool is_asset, const std::string& filter_regex);
|
static std::vector<std::string> list_files(std::string folder, bool is_asset, const std::string& filter_regex);
|
||||||
|
static bool delete_file(const std::string& path);
|
||||||
|
|
||||||
std::string m_current_path;
|
std::string m_current_path;
|
||||||
FILE* m_fp = nullptr;
|
FILE* m_fp = nullptr;
|
||||||
|
|||||||
@@ -69,46 +69,43 @@ void ui::Canvas::pick_update(int plane)
|
|||||||
|
|
||||||
// prepare common states
|
// prepare common states
|
||||||
glViewport(0, 0, m_width, m_height);
|
glViewport(0, 0, m_width, m_height);
|
||||||
glDisable(GL_BLEND);
|
glEnable(GL_BLEND);
|
||||||
|
|
||||||
//for (int i = 0; i < 6; i++)
|
int i = plane;
|
||||||
|
m_tmp[i].bindFramebuffer();
|
||||||
|
m_tmp[i].clear({ 1, 1, 1, 1 });
|
||||||
|
|
||||||
|
for (auto layer_index : m_order)
|
||||||
{
|
{
|
||||||
int i = plane;
|
// copy to tmp2 for layer blending
|
||||||
m_tmp[i].bindFramebuffer();
|
glActiveTexture(GL_TEXTURE0); // TODO: maybe remove this line
|
||||||
m_tmp[i].clear({ 1, 1, 1, 1 });
|
// #ifndef __IOS__
|
||||||
|
// m_tex2[i].bind();
|
||||||
|
// glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, m_width, m_height);
|
||||||
|
// m_tex2[i].unbind();
|
||||||
|
// #endif
|
||||||
|
|
||||||
for (auto layer_index : m_order)
|
m_layers[layer_index].m_rtt[i].bindTexture();
|
||||||
{
|
glActiveTexture(GL_TEXTURE1);
|
||||||
// copy to tmp2 for layer blending
|
m_tex2[i].bind();
|
||||||
glActiveTexture(GL_TEXTURE0); // TODO: maybe remove this line
|
m_sampler.bind(0);
|
||||||
// #ifndef __IOS__
|
m_sampler_bg.bind(1);
|
||||||
// m_tex2[i].bind();
|
ShaderManager::use(ui::kShader::TextureAlpha);
|
||||||
// glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, m_width, m_height);
|
ShaderManager::u_int(kShaderUniform::TexBG, 1);
|
||||||
// m_tex2[i].unbind();
|
ShaderManager::u_float(kShaderUniform::Alpha, m_layers[layer_index].m_opacity);
|
||||||
// #endif
|
ShaderManager::u_int(kShaderUniform::Highlight, false);
|
||||||
|
ShaderManager::u_int(kShaderUniform::Tex, 0);
|
||||||
m_layers[layer_index].m_rtt[i].bindTexture();
|
ShaderManager::u_mat4(kShaderUniform::MVP, glm::ortho(-.5f, .5f, -.5f, .5f, -1.f, 1.f));
|
||||||
glActiveTexture(GL_TEXTURE1);
|
m_plane.draw_fill();
|
||||||
m_tex2[i].bind();
|
m_sampler.unbind();
|
||||||
m_sampler.bind(0);
|
m_sampler_bg.unbind();
|
||||||
m_sampler_bg.bind(1);
|
m_tex2[i].unbind();
|
||||||
ShaderManager::use(ui::kShader::TextureAlpha);
|
m_layers[layer_index].m_rtt[i].unbindTexture();
|
||||||
ShaderManager::u_int(kShaderUniform::TexBG, 1);
|
|
||||||
ShaderManager::u_float(kShaderUniform::Alpha, m_layers[layer_index].m_opacity);
|
|
||||||
ShaderManager::u_int(kShaderUniform::Highlight, false);
|
|
||||||
ShaderManager::u_int(kShaderUniform::Tex, 0);
|
|
||||||
ShaderManager::u_mat4(kShaderUniform::MVP, glm::ortho(-.5f, .5f, -.5f, .5f, -1.f, 1.f));
|
|
||||||
m_plane.draw_fill();
|
|
||||||
m_sampler.unbind();
|
|
||||||
m_sampler_bg.unbind();
|
|
||||||
m_tex2[i].unbind();
|
|
||||||
m_layers[layer_index].m_rtt[i].unbindTexture();
|
|
||||||
}
|
|
||||||
if (!m_pick_data[plane])
|
|
||||||
m_pick_data[plane] = std::make_unique<glm::u8vec4[]>(m_width*m_height);
|
|
||||||
glReadPixels(0, 0, m_width, m_height, GL_RGBA, GL_UNSIGNED_BYTE, m_pick_data[plane].get());
|
|
||||||
m_tmp[i].unbindFramebuffer();
|
|
||||||
}
|
}
|
||||||
|
if (!m_pick_data[plane])
|
||||||
|
m_pick_data[plane] = std::make_unique<glm::u8vec4[]>(m_width*m_height);
|
||||||
|
glReadPixels(0, 0, m_width, m_height, GL_RGBA, GL_UNSIGNED_BYTE, m_pick_data[plane].get());
|
||||||
|
m_tmp[i].unbindFramebuffer();
|
||||||
|
|
||||||
// restore viewport and clear color states
|
// restore viewport and clear color states
|
||||||
blend ? glEnable(GL_BLEND) : glDisable(GL_BLEND);
|
blend ? glEnable(GL_BLEND) : glDisable(GL_BLEND);
|
||||||
|
|||||||
@@ -66,10 +66,14 @@ void NodeButton::parse_attributes(kAttribute ka, const tinyxml2::XMLAttribute* a
|
|||||||
{
|
{
|
||||||
switch (ka)
|
switch (ka)
|
||||||
{
|
{
|
||||||
|
case kAttribute::Color:
|
||||||
|
m_border->parse_attributes(ka, attr);
|
||||||
|
color_normal = m_border->m_color;
|
||||||
|
color_hover = glm::clamp(m_border->m_color + glm::vec4(.1, .1, .1, 0), {0,0,0,0}, {1,1,1,1});
|
||||||
|
color_down = glm::clamp(m_border->m_color + glm::vec4(.2, .2, .2, 0), {0,0,0,0}, {1,1,1,1});
|
||||||
case kAttribute::Padding:
|
case kAttribute::Padding:
|
||||||
case kAttribute::Width:
|
case kAttribute::Width:
|
||||||
case kAttribute::Height:
|
case kAttribute::Height:
|
||||||
case kAttribute::Color:
|
|
||||||
case kAttribute::Thickness:
|
case kAttribute::Thickness:
|
||||||
case kAttribute::BorderColor:
|
case kAttribute::BorderColor:
|
||||||
m_border->parse_attributes(ka, attr);
|
m_border->parse_attributes(ka, attr);
|
||||||
|
|||||||
@@ -164,15 +164,16 @@ void NodeCanvas::draw()
|
|||||||
|
|
||||||
// if (m_canvas->m_show_tmp && m_canvas->m_current_layer_idx == layer_index)
|
// if (m_canvas->m_show_tmp && m_canvas->m_current_layer_idx == layer_index)
|
||||||
// {
|
// {
|
||||||
|
// glDisable(GL_BLEND);
|
||||||
// ui::ShaderManager::use(kShader::TextureAlpha);
|
// ui::ShaderManager::use(kShader::TextureAlpha);
|
||||||
// ui::ShaderManager::u_int(kShaderUniform::Tex, 0);
|
// ui::ShaderManager::u_int(kShaderUniform::Tex, 0);
|
||||||
// ui::ShaderManager::u_float(kShaderUniform::Alpha, m_canvas->m_layers[layer_index].m_opacity);
|
// ui::ShaderManager::u_float(kShaderUniform::Alpha, m_canvas->m_layers[layer_index].m_opacity);
|
||||||
// ui::ShaderManager::u_mat4(kShaderUniform::MVP, plane_mvp_z);
|
// ui::ShaderManager::u_mat4(kShaderUniform::MVP, plane_mvp_z);
|
||||||
// ui::ShaderManager::u_float(kShaderUniform::Alpha,
|
// ui::ShaderManager::u_float(kShaderUniform::Alpha, 1);
|
||||||
// m_canvas->m_current_stroke->m_brush.m_tip_opacity * m_canvas->m_layers[layer_index].m_opacity);
|
|
||||||
// m_canvas->m_tmp[plane_index].bindTexture();
|
// m_canvas->m_tmp[plane_index].bindTexture();
|
||||||
// m_face_plane.draw_fill();
|
// m_face_plane.draw_fill();
|
||||||
// m_canvas->m_tmp[plane_index].unbindTexture();
|
// m_canvas->m_tmp[plane_index].unbindTexture();
|
||||||
|
// glEnable(GL_BLEND);
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,8 @@
|
|||||||
#include "canvas.h"
|
#include "canvas.h"
|
||||||
#include "node_image_texture.h"
|
#include "node_image_texture.h"
|
||||||
#include "asset.h"
|
#include "asset.h"
|
||||||
|
#include "node_message_box.h"
|
||||||
|
#include "app.h"
|
||||||
|
|
||||||
Node* NodeDialogOpen::clone_instantiate() const
|
Node* NodeDialogOpen::clone_instantiate() const
|
||||||
{
|
{
|
||||||
@@ -32,6 +34,40 @@ void NodeDialogOpen::init_controls()
|
|||||||
btn_cancel->on_click = [this](Node*) {
|
btn_cancel->on_click = [this](Node*) {
|
||||||
destroy();
|
destroy();
|
||||||
};
|
};
|
||||||
|
btn_delete = find<NodeButton>("btn-delete");
|
||||||
|
btn_delete->on_click = [this](Node*) {
|
||||||
|
if (!current)
|
||||||
|
return;
|
||||||
|
|
||||||
|
auto msgbox = new NodeMessageBox();
|
||||||
|
msgbox->m_manager = m_manager;
|
||||||
|
msgbox->init();
|
||||||
|
msgbox->m_title->set_text("Delete Project");
|
||||||
|
msgbox->m_message->set_text(("Are you sure you want to delete " + current->m_file_name + "?").c_str());
|
||||||
|
msgbox->btn_ok->on_click = [this,msgbox](Node*){
|
||||||
|
auto path = current->m_path;
|
||||||
|
int idx = container->get_child_index(current);
|
||||||
|
container->remove_child(current);
|
||||||
|
if (!container->m_children.empty())
|
||||||
|
{
|
||||||
|
int newidx = std::min<int>(idx, (int)container->m_children.size() - 1);
|
||||||
|
auto next = (NodeDialogOpenItem*)container->get_child_at(newidx);
|
||||||
|
current = nullptr;
|
||||||
|
next->on_selected(next);
|
||||||
|
next->m_selected = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
current = nullptr;
|
||||||
|
auto image_tex = find<NodeImageTexture>("thumb-tex");
|
||||||
|
image_tex->tex.destroy();
|
||||||
|
}
|
||||||
|
Asset::delete_file(path);
|
||||||
|
msgbox->destroy();
|
||||||
|
};
|
||||||
|
root()->add_child(msgbox);
|
||||||
|
root()->update();
|
||||||
|
};
|
||||||
container = find<Node>("files-list");
|
container = find<Node>("files-list");
|
||||||
auto names = Asset::list_files(data_path, false, ".*\\.pano");
|
auto names = Asset::list_files(data_path, false, ".*\\.pano");
|
||||||
for (const auto& n : names)
|
for (const auto& n : names)
|
||||||
@@ -43,7 +79,6 @@ void NodeDialogOpen::init_controls()
|
|||||||
node->m_path = data_path + "/" + n;
|
node->m_path = data_path + "/" + n;
|
||||||
node->m_file_name = n;
|
node->m_file_name = n;
|
||||||
node->on_selected = [&](NodeDialogOpenItem* target) {
|
node->on_selected = [&](NodeDialogOpenItem* target) {
|
||||||
static NodeDialogOpenItem* current = nullptr;
|
|
||||||
if (target == current)
|
if (target == current)
|
||||||
return;
|
return;
|
||||||
ui::Image thumb = ui::Canvas::I->thumbnail_read(target->m_path);
|
ui::Image thumb = ui::Canvas::I->thumbnail_read(target->m_path);
|
||||||
|
|||||||
@@ -31,6 +31,8 @@ class NodeDialogOpen : public NodeBorder
|
|||||||
public:
|
public:
|
||||||
NodeButton* btn_cancel;
|
NodeButton* btn_cancel;
|
||||||
NodeButton* btn_ok;
|
NodeButton* btn_ok;
|
||||||
|
NodeButton* btn_delete;
|
||||||
|
NodeDialogOpenItem* current = nullptr;
|
||||||
Node* container;
|
Node* container;
|
||||||
std::string selected_path;
|
std::string selected_path;
|
||||||
std::string selected_file;
|
std::string selected_file;
|
||||||
|
|||||||
@@ -16,6 +16,10 @@ void NodeMessageBox::init()
|
|||||||
SetPositioning(YGPositionTypeAbsolute);
|
SetPositioning(YGPositionTypeAbsolute);
|
||||||
m_template = (*m_manager)[const_hash("message-box")]->m_children[0]->clone();
|
m_template = (*m_manager)[const_hash("message-box")]->m_children[0]->clone();
|
||||||
add_child(m_template);
|
add_child(m_template);
|
||||||
btnOk = m_template->find<NodeButton>("btn-ok");
|
m_title = m_template->find<NodeText>("title");
|
||||||
btnOk->on_click = [&](Node*) { destroy(); };
|
m_message = m_template->find<NodeText>("message");
|
||||||
|
btn_ok = m_template->find<NodeButton>("btn-ok");
|
||||||
|
btn_ok->on_click = [&](Node*) { destroy(); };
|
||||||
|
btn_cancel = m_template->find<NodeButton>("btn-cancel");
|
||||||
|
btn_cancel->on_click = [&](Node*) { destroy(); };
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,16 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "node.h"
|
#include "node.h"
|
||||||
#include "node_button.h"
|
#include "node_button.h"
|
||||||
|
#include "node_text.h"
|
||||||
|
|
||||||
class NodeMessageBox : public Node
|
class NodeMessageBox : public Node
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Node* m_template;
|
Node* m_template;
|
||||||
NodeButton* btnOk;
|
NodeButton* btn_ok;
|
||||||
|
NodeButton* btn_cancel;
|
||||||
|
NodeText* m_message;
|
||||||
|
NodeText* m_title;
|
||||||
virtual Node* clone_instantiate() const override;
|
virtual Node* clone_instantiate() const override;
|
||||||
virtual void init() override;
|
virtual void init() override;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user