diff --git a/data/layout.xml b/data/layout.xml
index 7eb4928..11b34d2 100644
--- a/data/layout.xml
+++ b/data/layout.xml
@@ -144,7 +144,7 @@
-
+
@@ -152,7 +152,7 @@
-
+
diff --git a/src/app_layout.cpp b/src/app_layout.cpp
index 1cd9991..15bbb8f 100644
--- a/src/app_layout.cpp
+++ b/src/app_layout.cpp
@@ -238,6 +238,7 @@ void App::init_sidebar()
fp->destroy();
}
layout[main_id]->add_child(stroke);
+ stroke->SetSize(350, YGUndefined);
auto tick = layout[main_id]->add_child();
tick->SetPositioning(YGPositionTypeAbsolute);
tick->SetSize(32, 16);
@@ -251,7 +252,7 @@ void App::init_sidebar()
stroke->m_mouse_ignore = false;
stroke->mouse_capture();
auto scroll = stroke->find("scroller");
- scroll->SetMaxHeight(glm::max(100.f, screen.y - pos.y - 200.f));
+ scroll->SetHeight(glm::max(100.f, screen.y - pos.y - 200.f));
layout[main_id]->update();
stroke->on_popup_close = [this, tick](Node*) {
@@ -1179,6 +1180,11 @@ void App::initLayout()
NodeIcon::static_init();
NodeStrokePreview::static_init();
+ layout.on_reloading = [&] {
+ ui_save();
+ NodeStrokePreview::empty_queue();
+ };
+
layout.on_loaded = [&] {
LOG("initializing layout updating after load");
layout[main_id]->update(width, height, zoom);
diff --git a/src/layout.cpp b/src/layout.cpp
index 48adc61..5f0d40e 100644
--- a/src/layout.cpp
+++ b/src/layout.cpp
@@ -32,6 +32,9 @@ bool LayoutManager::load(const char* path)
if (m_loaded)
return true; // already loaded
#endif // __ANDROID__
+
+ if (!m_layouts.empty() && on_reloading)
+ on_reloading();
m_path = path;
diff --git a/src/layout.h b/src/layout.h
index 27ccda6..09f7336 100644
--- a/src/layout.h
+++ b/src/layout.h
@@ -19,6 +19,7 @@ class LayoutManager
public:
bool m_loaded = false;
std::function on_loaded;
+ std::function on_reloading;
void unload();
void create();
bool load(const char* path);
diff --git a/src/node.h b/src/node.h
index 9581384..013cb5d 100644
--- a/src/node.h
+++ b/src/node.h
@@ -92,7 +92,7 @@ enum class kWidget : uint16_t
UserManual = const_hash("usermanual"),
};
-class Node
+class Node : public std::enable_shared_from_this
{
friend class LayoutManager;
public:
diff --git a/src/node_stroke_preview.cpp b/src/node_stroke_preview.cpp
index 28cc514..75c4dd5 100644
--- a/src/node_stroke_preview.cpp
+++ b/src/node_stroke_preview.cpp
@@ -10,7 +10,7 @@
std::atomic_int NodeStrokePreview::s_instances{ 0 };
std::atomic_bool NodeStrokePreview::s_running{ false };
std::thread NodeStrokePreview::s_renderer;
-BlockingQueue NodeStrokePreview::s_queue;
+BlockingQueue> NodeStrokePreview::s_queue;
RTT NodeStrokePreview::m_rtt;
RTT NodeStrokePreview::m_rtt_mixer;
@@ -33,6 +33,11 @@ void NodeStrokePreview::terminate_renderer()
}
}
+void NodeStrokePreview::empty_queue()
+{
+ s_queue.q.clear();
+}
+
Node* NodeStrokePreview::clone_instantiate() const
{
return new NodeStrokePreview();
@@ -548,7 +553,7 @@ void NodeStrokePreview::draw_stroke()
});
}
s_queue.mutex.unlock();
- s_queue.PostUnique(this, m_draw_first);
+ s_queue.PostUnique(std::static_pointer_cast(shared_from_this()), m_draw_first);
}
void NodeStrokePreview::draw()
diff --git a/src/node_stroke_preview.h b/src/node_stroke_preview.h
index da2d153..4e6e76e 100644
--- a/src/node_stroke_preview.h
+++ b/src/node_stroke_preview.h
@@ -29,8 +29,9 @@ public:
static std::atomic_int s_instances;
static std::atomic_bool s_running;
static std::thread s_renderer;
- static BlockingQueue s_queue;
+ static BlockingQueue> s_queue;
static void terminate_renderer();
+ static void empty_queue();
std::shared_ptr m_brush;
std::shared_ptr m_dual_brush;
bool m_draw_first = false;