add preset popup menu

This commit is contained in:
2019-08-30 15:32:01 +02:00
parent 462c4a52e1
commit 56bba88c14
7 changed files with 43 additions and 34 deletions

View File

@@ -79,6 +79,9 @@
<button-custom id="btn-remove" thickness="1" color="0 0" border-color=".0" shrink="1" margin="0 10 0 0">
<icon width="30" icon="bin_closed"/>
</button-custom>
<button-custom id="btn-menu" thickness="1" color="0 0" border-color=".0" shrink="1" margin="0 10 0 10">
<icon width="30" icon="resultset_next"/>
</button-custom>
</border>
</node>
</layout>
@@ -94,6 +97,19 @@
<stroke-preview id="canvas" width="1" grow="1" height="60"/>
</button-custom>
</layout>
<layout id="tpl-brush-popup">
<popup-menu positioning="absolute" position="100 100" width="200" thickness="1" border-color=".1" color=".4 .4 .4 .8" dir="col">
<button-custom id="download" height="40" align="center" color=".2" pad="0 0 0 10" dir="row">
<text text="Download Brushes" grow="1" margin="0 0 0 5"/>
</button-custom>
<button-custom id="import" height="40" align="center" color=".2" pad="0 0 0 10" dir="row">
<text text="Import Brushes" grow="1" margin="0 0 0 5"/>
</button-custom>
<button-custom id="export" height="40" align="center" color=".2" pad="0 0 0 10" dir="row">
<text text="Export Brushes" grow="1" margin="0 0 0 5"/>
</button-custom>
</popup-menu>
</layout>
<!-- PANEL TIPS/PATTERN -->
<layout id="tpl-panel-brushes">

View File

@@ -516,10 +516,6 @@ void App::init_menu_file()
popup->SetPosition(pos.x, pos.y);
layout[main_id]->add_child(popup);
layout[main_id]->update();
popup->mouse_capture();
popup->m_mouse_ignore = false;
popup->m_flood_events = true;
popup->m_capture_children = false;
if (auto b = popup->find<NodeButtonCustom>("file-newdoc"))
b->on_click = [this, popup](Node*) {
@@ -621,10 +617,6 @@ void App::init_menu_file()
subpopup->SetPosition(pos.x, pos.y);
layout[main_id]->add_child(subpopup);
layout[main_id]->update();
subpopup->mouse_capture();
subpopup->m_mouse_ignore = false;
subpopup->m_flood_events = true;
subpopup->m_capture_children = false;
subpopup->find<NodeButtonCustom>("file-submenu-export-png")->on_click = [this, subpopup, popup](Node*) {
dialog_export(".png");
subpopup->mouse_release();
@@ -696,10 +688,6 @@ void App::init_menu_edit()
popup->SetPosition(pos.x, pos.y);
layout[main_id]->add_child(popup);
layout[main_id]->update();
popup->mouse_capture();
popup->m_mouse_ignore = false;
popup->m_flood_events = true;
popup->m_capture_children = false;
};
}
}
@@ -720,10 +708,6 @@ void App::init_menu_tools()
popup_exp->SetPosition(pos.x, pos.y);
layout[main_id]->add_child(popup_exp);
layout[main_id]->update();
popup_exp->mouse_capture();
popup_exp->m_mouse_ignore = false;
popup_exp->m_flood_events = true;
popup_exp->m_capture_children = false;
if (auto tick = popup_exp->find<NodeButtonCustom>("tools-timelapse-tick")) tick->on_click = [this, popup_exp](Node* b)
{
@@ -738,10 +722,6 @@ void App::init_menu_tools()
popup_time->SetPosition(pos.x, pos.y);
layout[main_id]->add_child(popup_time);
layout[main_id]->update();
popup_time->mouse_capture();
popup_time->m_mouse_ignore = false;
popup_time->m_flood_events = true;
popup_time->m_capture_children = false;
if (auto item = popup_time->find<NodeButtonCustom>("timelapse-start"))
{
@@ -784,10 +764,6 @@ void App::init_menu_tools()
popup_time->SetPosition(pos.x, pos.y);
layout[main_id]->add_child(popup_time);
layout[main_id]->update();
popup_time->mouse_capture();
popup_time->m_mouse_ignore = false;
popup_time->m_flood_events = true;
popup_time->m_capture_children = false;
auto visible = [this](Node* panel) {
if (!panel)
@@ -1050,10 +1026,6 @@ void App::init_menu_about()
popup->SetPosition(pos.x, pos.y);
layout[main_id]->add_child(popup);
layout[main_id]->update();
popup->mouse_capture();
popup->m_mouse_ignore = false;
popup->m_flood_events = true;
popup->m_capture_children = false;
popup->find<NodeButtonCustom>("about-app")->on_click = [this, popup](Node*) {
dialog_about();
@@ -1171,10 +1143,6 @@ void App::init_menu_layer()
popup->SetPosition(pos.x, pos.y);
layout[main_id]->add_child(popup);
layout[main_id]->update();
popup->mouse_capture();
popup->m_mouse_ignore = false;
popup->m_flood_events = true;
popup->m_capture_children = false;
popup->find<NodeButtonCustom>("layer-clear")->on_click = [this, popup](Node*) {
canvas->m_canvas->clear();

View File

@@ -34,10 +34,16 @@ public:
auto i = m_layouts.find(id);
return i == m_layouts.end() ? nullptr : i->second.get();
}
class std::shared_ptr<Node> get_ref(const char* name)
template<class T = Node> std::shared_ptr<T> get_ref(const char* name)
{
auto i = m_layouts.find(const_hash(name));
return i == m_layouts.end() ? nullptr : i->second;
return i == m_layouts.end() ? nullptr : std::dynamic_pointer_cast<T>(i->second);
}
template<class T = Node> std::shared_ptr<T> instantiate(const char* name)
{
if (auto layout = get_ref(name))
return layout->m_children[0]->clone<T>();
return nullptr;
}
void restore_context();
void clear_context();

View File

@@ -455,6 +455,15 @@ void NodePanelBrushPreset::init()
}
save();
};
m_btn_menu = find<NodeButtonCustom>("btn-menu");
m_btn_menu->on_click = [this](Node* b) {
auto popup = m_manager->instantiate<NodePopupMenu>("tpl-brush-popup");
popup->SetPosition(b->m_pos.x + b->m_size.x, b->m_pos.y);
root()->add_child(popup);
root()->update();
auto bounds = root()->GetSize() - zw(popup->get_children_rect());
popup->SetPosition(glm::clamp(popup->m_pos, { 0, 0 }, bounds));
};
if (Asset::exist(App::I->data_path + "/settings/presets.bin") && !restore())
{

View File

@@ -81,6 +81,7 @@ class NodePanelBrushPreset : public Node
NodeButtonCustom* m_btn_down;
NodeButtonCustom* m_btn_delete;
NodeButtonCustom* m_btn_save;
NodeButtonCustom* m_btn_menu;
public:
Node* m_container;
std::function<void(Node* target, std::shared_ptr<Brush>& brush)> on_brush_changed;

View File

@@ -50,3 +50,11 @@ kEventResult NodePopupMenu::handle_event(Event* e)
}
return kEventResult::Consumed;
}
void NodePopupMenu::added(Node* parent)
{
mouse_capture();
m_mouse_ignore = false;
m_flood_events = true;
m_capture_children = false;
}

View File

@@ -8,4 +8,5 @@ public:
virtual Node* clone_instantiate() const override;
virtual void init() override;
virtual kEventResult handle_event(Event* e) override;
virtual void added(Node* parent) override;
};