diff --git a/data/layout.xml b/data/layout.xml
index 4658004..59fa51d 100644
--- a/data/layout.xml
+++ b/data/layout.xml
@@ -238,10 +238,6 @@
-
-
-
-
@@ -483,20 +479,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/app.h b/src/app.h
index 99b1560..a3a0542 100644
--- a/src/app.h
+++ b/src/app.h
@@ -115,7 +115,6 @@ public:
std::shared_ptr grid;
std::shared_ptr presets;
std::shared_ptr animation;
- std::shared_ptr timeline;
NodePanelQuick* quick;
std::map quick_mode_state;
Node* floatings_container;
diff --git a/src/app_layout.cpp b/src/app_layout.cpp
index 24439f2..5aee5fd 100644
--- a/src/app_layout.cpp
+++ b/src/app_layout.cpp
@@ -1014,23 +1014,6 @@ void App::init_menu_tools()
};
}
- if (auto vr_btn = popup_exp->find("tools-timeline"))
- {
- NodeCheckBox* cb = vr_btn->find("tools-timeline-check");
- cb->set_value(timeline->GetVisibility());
-
- vr_btn->on_click = [this, popup_exp, vr_btn](Node* b)
- {
- NodeCheckBox* cb = vr_btn->find("tools-timeline-check");
- cb->set_value(!cb->checked, true);
- };
-
- vr_btn->find("tools-timeline-check")->on_value_changed = [this, main](Node* target, bool checked)
- {
- timeline->SetVisibility(checked);
- };
- }
-
popup_exp->find("clear-grids")->on_click = [this, popup_exp](Node*) {
CanvasModeGrid* mode = (CanvasModeGrid*)Canvas::modes[(int)kCanvasMode::Grid][0];
mode->clear();
@@ -1285,6 +1268,7 @@ void App::initLayout()
{
layers->add_layer("Default", false, true);
Canvas::I->m_unsaved = false;
+ Canvas::I->timelapse_reset_encoder();
}
init_toolbar_draw();
@@ -1354,93 +1338,6 @@ void App::initLayout()
toggle_ui();
};
- timeline = layout[main_id]->find_ref("timeline");
- if (timeline)
- {
- if (auto * slider = layout[main_id]->find("frames-slider"))
- {
- auto frame_text = layout[main_id]->find("timeline-frame");
- slider->on_value_changed = [this, frame_text](Node*, float value)
- {
- auto& l = Canvas::I->layer();
- l.m_frame_index = (int)glm::clamp(
- floor(value * l.frames_count()), 0, l.frames_count() - 1);
-/*
- auto& c = *Canvas::I;
- for (int i = 0; i < c.m_layers.size(); i++)
- {
- auto l = layers->get_layer_at(i);
- layers->handle_layer_opacity(l, .0f);
- }
-
- int current_layer = (int)glm::clamp(
- floor(value * c.m_layers.size()), 1, (int)c.m_layers.size() - 1);
- auto l = layers->get_layer_at(current_layer);
- layers->handle_layer_selected(l);
- layers->handle_layer_opacity(l, 1.f);
- if (current_layer > 0)
- {
- auto l = layers->get_layer_at(current_layer - 1);
- layers->handle_layer_opacity(l, .25f);
- }
-
- // First layer always visible
- {
- auto l = layers->get_layer_at(0);
- layers->handle_layer_opacity(l, 1.0f);
- }
-
- if (frame_text)
- {
- char str[16];
- snprintf(str, sizeof(str), "%02d", current_layer);
- frame_text->set_text(str);
- }
-*/
- };
- if (auto btn_add = timeline->find("btn-add"))
- {
- btn_add->on_click = [this, slider] (Node*) {
- Canvas::I->layer().add_frame();
- slider->set_value(1.f, true);
- };
- }
- }
- }
-
-/*
- // test floating panel
- auto fp_presets = layout[main_id]->add_child();
- floating_presets = fp_presets->m_container->add_child();
- floating_presets->SetHeightP(100);
- floating_presets->on_brush_changed = [this](Node* target, std::shared_ptr& b) {
- auto c = Canvas::I->m_current_brush->m_tip_color;
- *Canvas::I->m_current_brush = *b;
- Canvas::I->m_current_brush->m_tip_color = c;
- Canvas::I->m_current_brush->load();
- brush_update();
- };
-
- auto fp_color = layout[main_id]->add_child();
- floating_color = fp_color->m_container->add_child();
- floating_color->SetHeightP(100);
- floating_color->find("title")->destroy();
- floating_color->on_color_changed = [this](Node* target, glm::vec4 color) {
- Canvas::I->m_current_brush->m_tip_color = color;
- brush_update();
- };
-
- auto fp_picker = layout[main_id]->add_child();
- fp_picker->m_container->SetSize(300, 500);
- floating_picker = fp_picker->m_container->add_child();
- floating_picker->m_autohide = false;
- floating_picker->on_color_change = [this](Node* target, glm::vec3 color) {
- Canvas::I->m_current_brush->m_tip_color = glm::vec4(color, 1.f);
- brush_update();
- };
- //picker->SetHeightP(100);
- //color->find("title")->destroy();
-*/
ui_restore();
redraw = true;
@@ -1538,7 +1435,6 @@ void App::ui_save()
Settings::set("ui", d);
Settings::set("ui-rtl", Serializer::Boolean(ui_rtl));
- Settings::set("timeline-visible", Serializer::Boolean(timeline->GetVisibility()));
#if _WIN32
extern void win32_save_window_state();
@@ -1556,12 +1452,7 @@ void App::ui_restore()
set_ui_rtl(Settings::value("ui-rtl"));
if (!Settings::has("ui"))
- {
- timeline->SetVisibility(false);
return;
- }
-
- timeline->SetVisibility(Settings::value_or("timeline-visible", false));
auto floatings = layout[main_id]->find_ref("floatings");
auto drop_left = layout[main_id]->find_ref("drop-left");
diff --git a/src/canvas.cpp b/src/canvas.cpp
index a5b7abb..d2167d8 100644
--- a/src/canvas.cpp
+++ b/src/canvas.cpp
@@ -2088,7 +2088,8 @@ bool Canvas::project_save_thread(std::string file_path, bool show_progress)
auto start = file_path.rfind('/') + 1;
std::string file_name = file_path.substr(start, file_path.length() - start - strlen(".ppi"));
- std::string tmp_path = App::I->data_path + '/' + file_name + ".tmp.ppi";
+ std::string tmp_path = App::I->data_path + '/' + file_name + ".tmp.ppi";
+ std::string lapse_path = App::I->data_path + '/' + file_name + ".pptl";
LOG("file name %s", file_name.c_str());
LOG("tmp path %s", tmp_path.c_str());
@@ -2225,10 +2226,10 @@ bool Canvas::project_save_thread(std::string file_path, bool show_progress)
Serializer::Descriptor info;
info.class_id = "ppi_info";
info.name = L"info header";
- info.props["has_encoder"] = std::make_shared(m_encoder != nullptr);
+ //info.props["has_encoder"] = std::make_shared(m_encoder != nullptr);
sw << info;
- if (m_encoder != nullptr)
- sw << *m_encoder;
+ //if (m_encoder != nullptr)
+ // sw << *m_encoder;
int bytes = sw.m_data.size();
fwrite(&bytes, sizeof(int), 1, fp);
@@ -2271,6 +2272,16 @@ bool Canvas::project_save_thread(std::string file_path, bool show_progress)
{
m_unsaved = false;
m_newdoc = false;
+
+ // save timelapse
+ if (Canvas::I->m_encoder)
+ {
+ BinaryStreamWriter sw;
+ sw.init(BinaryStream::ByteOrder::LittleEndian);
+ sw << *Canvas::I->m_encoder;
+ if (!sw.save(lapse_path))
+ LOG("cannot save timelase to %s", lapse_path.c_str());
+ }
#if __WEB__
webgl_sync();
#endif
@@ -2448,25 +2459,40 @@ bool Canvas::project_open_thread(std::string file_path)
sr.init(data.data(), data.size(), BinaryStream::ByteOrder::LittleEndian);
Serializer::Descriptor info;
sr >> info;
-
- if (info.value("has_encoder"))
- {
- m_encoder = std::make_unique();
- sr >> *m_encoder;
- m_encoder->init();
- }
- else
- {
- timelapse_reset_encoder();
- }
- }
- else
- {
- timelapse_reset_encoder();
+ //if (info.value("has_encoder"))
+ //{
+ // m_encoder = std::make_unique();
+ // sr >> *m_encoder;
+ // m_encoder->init();
+ //}
+ //else
+ //{
+ // timelapse_reset_encoder();
+ //}
}
+ //else
+ //{
+ // timelapse_reset_encoder();
+ //}
fclose(fp);
LOG("project restore from %s", file_path.c_str());
+
+ auto start = file_path.rfind('/') + 1;
+ std::string file_name = file_path.substr(start, file_path.length() - start - strlen(".ppi"));
+ std::string lapse_path = App::I->data_path + '/' + file_name + ".pptl";
+ if (Asset::exist(lapse_path))
+ {
+ BinaryStreamReader sr;
+ sr.load(lapse_path, BinaryStream::ByteOrder::LittleEndian);
+ m_encoder = std::make_unique();
+ sr >> *m_encoder;
+ m_encoder->init();
+ }
+ else
+ {
+ timelapse_reset_encoder();
+ }
m_current_layer_idx = 0;
m_current_stroke = nullptr;