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;