diff --git a/studio/Makefile.gnu b/studio/Makefile.gnu index fb898fd..8faa408 100644 --- a/studio/Makefile.gnu +++ b/studio/Makefile.gnu @@ -13,7 +13,6 @@ SOURCES = \ ./kage/timeline/layers.cpp \ ./kage/timeline/scenes.cpp \ ./kage/timeline/timeline.cpp \ - ./kage/unre/kagedo.cpp \ ./kage/unre/unre.cpp \ ./kage/stage/stage.cpp \ ./kage/stage/node.cpp \ @@ -36,6 +35,7 @@ SOURCES = \ ./kage/data/layer.cpp \ ./kage/data/scene.cpp \ ./kage/document.cpp \ + ./kage/project.cpp \ ./util/xml/xmltoken.cpp \ ./util/xml/xmltagproperty.cpp \ ./util/xml/xmltag.cpp \ diff --git a/studio/Makefile.mac b/studio/Makefile.mac index db84a33..d414b68 100644 --- a/studio/Makefile.mac +++ b/studio/Makefile.mac @@ -13,7 +13,6 @@ SOURCES = \ ./kage/timeline/layers.cpp \ ./kage/timeline/scenes.cpp \ ./kage/timeline/timeline.cpp \ - ./kage/unre/kagedo.cpp \ ./kage/unre/unre.cpp \ ./kage/stage/stage.cpp \ ./kage/stage/node.cpp \ @@ -36,6 +35,7 @@ SOURCES = \ ./kage/data/layer.cpp \ ./kage/data/scene.cpp \ ./kage/document.cpp \ + ./kage/project.cpp \ ./util/xml/xmltoken.cpp \ ./util/xml/xmltagproperty.cpp \ ./util/xml/xmltag.cpp \ diff --git a/studio/Makefile.win b/studio/Makefile.win index 52e4cf0..05725a6 100644 --- a/studio/Makefile.win +++ b/studio/Makefile.win @@ -18,7 +18,6 @@ SOURCES = \ ./kage/timeline/layers.cpp \ ./kage/timeline/scenes.cpp \ ./kage/timeline/timeline.cpp \ - ./kage/unre/kagedo.cpp \ ./kage/unre/unre.cpp \ ./kage/stage/stage.cpp \ ./kage/stage/node.cpp \ @@ -41,6 +40,7 @@ SOURCES = \ ./kage/data/layer.cpp \ ./kage/data/scene.cpp \ ./kage/document.cpp \ + ./kage/project.cpp \ ./util/xml/xmltoken.cpp \ ./util/xml/xmltagproperty.cpp \ ./util/xml/xmltag.cpp \ diff --git a/studio/README.txt b/studio/README.txt index d449153..23e7829 100644 --- a/studio/README.txt +++ b/studio/README.txt @@ -1,4 +1,4 @@ -Current version is v0.7.240121 +Current version is v0.8.240210 Kage Studio is a simple, Free and Open Source 2D Animation Software written by Mj Mendoza IV diff --git a/studio/about.cpp b/studio/about.cpp index a2d9599..934d6f9 100644 --- a/studio/about.cpp +++ b/studio/about.cpp @@ -1,6 +1,6 @@ /* * Kage Studio - a simple free and open source vector-based 2D animation software - * Copyright (C) 2011~2023 Mj Mendoza IV + * Copyright (C) 2011~2024 Mj Mendoza IV * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,13 +21,13 @@ #include "about.h" -string KageAbout::app_title = "Kage Studio"; -string KageAbout::app_version = "0.7.240121"; -string KageAbout::app_author = "Mj Mendoza IV"; -string KageAbout::app_contact = "mj.mendoza.iv@gmail.com"; -string KageAbout::app_website = "https://kage.sourceforge.io"; -string KageAbout::app_copyright = "Copyleft 2011~2023"; -string KageAbout::app_comment = "A Simple Free and Open Source vector-based 2D Animation Software."; +std::string KageAbout::app_title = "Kage Studio"; +std::string KageAbout::app_version = "0.8.240210"; +std::string KageAbout::app_author = "Mj Mendoza IV"; +std::string KageAbout::app_contact = "mj.mendoza.iv@gmail.com"; +std::string KageAbout::app_website = "https://kage.sourceforge.io"; +std::string KageAbout::app_copyright = "Copyleft 2011~2024"; +std::string KageAbout::app_comment = "A Simple Free and Open Source vector-based 2D Animation Software."; Glib::RefPtr KageAbout::imageABOUT; KageAbout::KageAbout(Gtk::Window& parent) @@ -37,7 +37,7 @@ KageAbout::KageAbout(Gtk::Window& parent) m_Label1("", true), m_Label2("", true), m_Image(Gtk::Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG) { - string l_license = string("") + + std::string l_license = std::string("") + "This program is free software: you can redistribute it and/or modify\n" + "it under the terms of the GNU General Public License as published by\n" + "the Free Software Foundation, either version 3 of the License, or\n" + diff --git a/studio/about.h b/studio/about.h index d943ec4..cb8a2df 100644 --- a/studio/about.h +++ b/studio/about.h @@ -1,6 +1,6 @@ /* * Kage Studio - a simple free and open source vector-based 2D animation software - * Copyright (C) 2011~2022 Mj Mendoza IV + * Copyright (C) 2011~2024 Mj Mendoza IV * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -30,19 +30,17 @@ #include #include - using namespace std; - class KageAbout : public Gtk::Dialog { public: KageAbout(Gtk::Window& parent); virtual ~KageAbout(); - static string app_version; - static string app_title; - static string app_author; - static string app_contact; - static string app_website; - static string app_copyright; - static string app_comment; + static std::string app_version; + static std::string app_title; + static std::string app_author; + static std::string app_contact; + static std::string app_website; + static std::string app_copyright; + static std::string app_comment; static Glib::RefPtr imageABOUT; protected: diff --git a/studio/kage.cpp b/studio/kage.cpp index 3ce2eca..7b2940a 100644 --- a/studio/kage.cpp +++ b/studio/kage.cpp @@ -1,6 +1,6 @@ /* * Kage Studio - a simple free and open source vector-based 2D animation software - * Copyright (C) 2011~2023 Mj Mendoza IV + * Copyright (C) 2011~2024 Mj Mendoza IV * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -29,8 +29,11 @@ unsigned int VectorDataManager::idmaker; unsigned int Kage::TAB_COUNT = 0; -Kage::Kage(string p_filePath) : - _layerManager(this), +unsigned int g_layerSelectIndex; +unsigned int g_frameSelectIndex; + +Kage::Kage(std::string p_filePath) : + _layers(this), _timeline(this), m_PropStage(this), m_propLocationSize(this), @@ -40,12 +43,17 @@ Kage::Kage(string p_filePath) : m_propFrameTween(this), _assetManager(this), _library(this), + _scenes(this), m_LabelProp("Properties"), + m_LabelScene(" Scene "), + m_Timeline_Layer_Label(" Layer "), + m_Timeline_Label(" Timeline "), m_LabelLibrary("Library"), m_LblHolder_Toolbar("Toolbar"), _stage(this), _undoRedoManager(), - _document(this) { + _document(this), + _documentCopyBuffer() { m_ContextId = m_Statusbar.get_context_id(KageAbout::app_title); KageFrame::_gotFocus = false; set_title(KageAbout::app_title); @@ -63,8 +71,9 @@ Kage::Kage(string p_filePath) : m_refActionGroup->add( Gtk::Action::create("ExportPNGMenu", "_PNG...") ); m_refActionGroup->add( Gtk::Action::create("EditMenu", "_Edit") ); m_refActionGroup->add( Gtk::Action::create("ViewMenu", "_View") ); - m_refActionGroup->add( Gtk::Action::create("LayerMenu", "_Layer") ); m_refActionGroup->add( Gtk::Action::create("ObjectMenu", "_Object") ); + m_refActionGroup->add( Gtk::Action::create("SceneMenu", "_Scene") ); + m_refActionGroup->add( Gtk::Action::create("LayerMenu", "_Layer") ); m_refActionGroup->add( Gtk::Action::create("TimelineMenu", "_Timeline") ); m_refActionGroup->add( Gtk::Action::create("ToolsMenu", "T_ools") ); m_refActionGroup->add( Gtk::Action::create("HelpMenu", "_Help") ); @@ -73,8 +82,8 @@ Kage::Kage(string p_filePath) : sigc::mem_fun(*this, &Kage::New_onClick) ); m_refActionGroup->add( - Gtk::Action::create("OpenKSF", Gtk::Stock::OPEN, "_Open", "Open KSF file"), - sigc::mem_fun(*this, &Kage::OpenKSF_onClick) + Gtk::Action::create("OpenKSF", Gtk::Stock::OPEN, "_Open", "Open KAGE file"), + sigc::mem_fun(*this, &Kage::OpenKAGE_onClick) ); m_refActionGroup->add( Gtk::Action::create("SaveProject", Gtk::Stock::SAVE, "_Save", "Save Project"), @@ -208,6 +217,35 @@ Kage::Kage(string p_filePath) : sigc::mem_fun(*this, &Kage::ToggleDarkTheme_onClick) ); //================================================================== + m_refActionGroup->add( + Gtk::Action::create("SceneAdd", "_Add Scene", "Add New Scene"), + sigc::mem_fun(*this, &Kage::SceneAdd_onClick) + ); + m_refActionGroup->add( + Gtk::Action::create("SceneDelete", "_Delete Scene", "Delete Scene"), + sigc::mem_fun(*this, &Kage::SceneDel_onClick) + ); + m_refActionGroup->add( + Gtk::Action::create("SceneRename", "Re_name Scene", "Rename Current Scene"), + sigc::mem_fun(*this, &Kage::SceneRename_onClick) + ); + m_refActionGroup->add( + Gtk::Action::create("SceneToNext", "Move to Next", "Move Current Scene to Next"), + sigc::mem_fun(*this, &Kage::SceneMoveToNext_onClick) + ); + m_refActionGroup->add( + Gtk::Action::create("SceneToPrevious", "Move to Previous", "Move Current Scene to Previous"), + sigc::mem_fun(*this, &Kage::SceneMoveToPrevious_onClick) + ); + m_refActionGroup->add( + Gtk::Action::create("SceneToLast", "Move to Last", "Move Current Scene to Last"), + sigc::mem_fun(*this, &Kage::SceneMoveToLast_onClick) + ); + m_refActionGroup->add( + Gtk::Action::create("SceneToFirst", "Move to First", "Move Current Scene to First"), + sigc::mem_fun(*this, &Kage::SceneMoveToFirst_onClick) + ); + //================================================================== m_refActionGroup->add( Gtk::Action::create("LayerAdd", "_Add Layer", "Add New Layer"), Gtk::AccelKey("F7"), @@ -523,6 +561,30 @@ Kage::Kage(string p_filePath) : " " " " " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " " " " " " " @@ -539,20 +601,6 @@ Kage::Kage(string p_filePath) : " " " " " " - " " - " " - " " - " " - " " - " " - " " - " " - " " - " " - " " - " " - " " - " " " " " " " " @@ -637,18 +685,17 @@ Kage::Kage(string p_filePath) : m_Timeline_HBox.pack_start(m_Timeline_HPaned); m_Timeline_HPaned.set_size_request(100, 100); m_Timeline_HPaned.add1(m_Timeline_Layer_VBox1); - m_Timeline_Layer_VBox1.pack_start(m_Timeline_Layer_VBox2, Gtk::PACK_EXPAND_WIDGET); - m_Timeline_Layer_VBox2.pack_start(m_Timeline_Layer_ScrolledWindow);//, Gtk::PACK_SHRINK); - m_Timeline_Layer_ScrolledWindow.set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_EXTERNAL); - m_Timeline_Layer_ScrolledWindow.add(_layerManager); - m_Timeline_Layer_ScrolledWindow.set_border_width(0); - m_Timeline_Layer_ScrolledWindow.set_shadow_type(Gtk::SHADOW_NONE); - cout << "layer count " << _layerManager.layerCount() << endl; - m_Timeline_Layer_VBox2.pack_start(m_Timeline_Layer_HScrollbar, Gtk::PACK_SHRINK); - m_Timeline_Layer_HScrollbar.set_adjustment(m_Timeline_Layer_ScrolledWindow.get_hadjustment()); - m_Timeline_Layer_VBox1.pack_start(m_Timeline_Layer_Controls_HBox, Gtk::PACK_SHRINK); + m_Timeline_Layer_VBox1.pack_start(m_Timeline_Scene_HBox, Gtk::PACK_EXPAND_WIDGET); + m_Timeline_Scene_HBox.pack_start(m_Timeline_Scene_ScrolledWindow, Gtk::PACK_EXPAND_WIDGET); + m_Timeline_Scene_HBox.pack_start(m_Timeline_Scene_VScrollbar, Gtk::PACK_SHRINK); + m_Timeline_Scene_VScrollbar.set_adjustment(m_Timeline_Scene_ScrolledWindow.get_vadjustment()); + m_Timeline_Scene_ScrolledWindow.set_policy(Gtk::POLICY_EXTERNAL , Gtk::POLICY_EXTERNAL); + //m_Timeline_Scene_ScrolledWindow.set_border_width(0); + m_Timeline_Scene_ScrolledWindow.add(_scenes); + m_Timeline_Scene_ScrolledWindow.set_shadow_type(Gtk::SHADOW_NONE); + m_Timeline_Scene_ScrolledWindow.set_kinetic_scrolling(true); + m_Timeline_Layer_VBox1.pack_start(m_Timeline_Scene_Controls_HBox, Gtk::PACK_SHRINK); m_Timeline_Layer_Controls_HBox.pack_start(m_Timeline_Layer_Label, Gtk::PACK_EXPAND_WIDGET); - m_Timeline_Layer_Label.set_label(" Layer "); m_Timeline_Layer_Controls_HBox.pack_start(_btnLayerAdd, Gtk::PACK_SHRINK); _btnLayerAdd_pixbuf = Gdk::Pixbuf::create_from_resource("/kage/share/layer/layer_add.png"); _btnLayerAdd_img = Gtk::Image(_btnLayerAdd_pixbuf); @@ -659,11 +706,10 @@ Kage::Kage(string p_filePath) : Glib::ustring data = "#gtkbutton {padding: 0;}"; auto css = Gtk::CssProvider::create(); if(!css->load_from_data(data)) { - cerr << "Failed to load css\n"; + std::cerr << "Failed to load css\n"; } auto screen = Gdk::Screen::get_default(); auto ctx = _btnLayerAdd.get_style_context(); - //ctx->add_provider_for_screen(screen, css, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); _btnLayerAdd.set_name("gtkbutton"); _btnLayerAdd.set_size_request(16, 16); @@ -676,7 +722,6 @@ Kage::Kage(string p_filePath) : _btnLayerDelete.show(); ctx = _btnLayerDelete.get_style_context(); - //ctx->add_provider_for_screen(screen, css, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); _btnLayerDelete.set_name("gtkbutton"); _btnLayerDelete.set_size_request(16, 16); @@ -691,7 +736,6 @@ Kage::Kage(string p_filePath) : _btnLayerMoveTop.show(); ctx = _btnLayerMoveTop.get_style_context(); - //ctx->add_provider_for_screen(screen, css, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); _btnLayerMoveTop.set_name("gtkbutton"); _btnLayerMoveTop.set_size_request(16, 16); @@ -706,7 +750,6 @@ Kage::Kage(string p_filePath) : _btnLayerMoveUp.show(); ctx = _btnLayerMoveUp.get_style_context(); - //ctx->add_provider_for_screen(screen, css, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); _btnLayerMoveUp.set_name("gtkbutton"); _btnLayerMoveUp.set_size_request(16, 16); @@ -721,7 +764,6 @@ Kage::Kage(string p_filePath) : _btnLayerMoveDown.show(); ctx = _btnLayerMoveDown.get_style_context(); - //ctx->add_provider_for_screen(screen, css, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); _btnLayerMoveDown.set_name("gtkbutton"); _btnLayerMoveDown.set_size_request(16, 16); @@ -736,7 +778,6 @@ Kage::Kage(string p_filePath) : _btnLayerMoveBottom.show(); ctx = _btnLayerMoveBottom.get_style_context(); - //ctx->add_provider_for_screen(screen, css, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); _btnLayerMoveBottom.set_name("gtkbutton"); _btnLayerMoveBottom.set_size_request(16, 16); @@ -751,7 +792,6 @@ Kage::Kage(string p_filePath) : _toggleOnion.show(); ctx = _toggleOnion.get_style_context(); - //ctx->add_provider_for_screen(screen, css, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); _toggleOnion.set_name("gtkbutton"); _toggleOnion.set_size_request(16, 16); @@ -766,212 +806,295 @@ Kage::Kage(string p_filePath) : _toggleOnionLayer.show(); ctx = _toggleOnionLayer.get_style_context(); - //ctx->add_provider_for_screen(screen, css, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); _toggleOnionLayer.set_name("gtkbutton"); _toggleOnionLayer.set_size_request(16, 16); _toggleOnionLayer.signal_clicked().connect(sigc::mem_fun(*this, &Kage::ToggleOnion_onClick)); - m_Timeline_HPaned.add2(m_Timeline_Frame_VBox1); - m_Timeline_Frame_VBox1.pack_start(m_Timeline_Frame_VBox2, Gtk::PACK_EXPAND_WIDGET); - m_Timeline_Frame_VBox2.pack_start(m_Timeline_Frame_ScrolledWindow);//, Gtk::PACK_SHRINK); - m_Timeline_Frame_ScrolledWindow.set_policy(Gtk::POLICY_EXTERNAL , Gtk::POLICY_EXTERNAL); - m_Timeline_Frame_ScrolledWindow.set_border_width(0); - m_Timeline_Frame_ScrolledWindow.add(_timeline); - m_Timeline_Frame_ScrolledWindow.set_shadow_type(Gtk::SHADOW_NONE); - m_Timeline_Frame_ScrolledWindow.set_kinetic_scrolling(true); - m_Timeline_Frame_VBox2.pack_start(m_Timeline_HScrollbar, Gtk::PACK_SHRINK); - m_Timeline_HScrollbar.set_adjustment(m_Timeline_Frame_ScrolledWindow.get_hadjustment()); - m_Timeline_Frame_VBox1.pack_start(m_Timeline_Controls_HBox, Gtk::PACK_SHRINK); - m_Timeline_Controls_HBox.pack_start(m_Timeline_Label, Gtk::PACK_EXPAND_PADDING); - m_Timeline_Label.set_label("Timeline"); - m_Timeline_Label.set_size_request(22, 22); - - m_Timeline_Controls_HBox.pack_start(_btnTimelineFrameAdd, Gtk::PACK_SHRINK); - _btnTimelineFrameAdd_pixbuf = Gdk::Pixbuf::create_from_resource("/kage/share/frame/add.png"); - _btnTimelineFrameAdd_img = Gtk::Image(_btnTimelineFrameAdd_pixbuf); - _btnTimelineFrameAdd.set_image(_btnTimelineFrameAdd_img); - _btnTimelineFrameAdd.property_always_show_image(); - _btnTimelineFrameAdd.set_tooltip_text("Add Frame (F7)"); - _btnTimelineFrameAdd.set_focus_on_click(false); - _btnTimelineFrameAdd.show(); - - ctx = _btnTimelineFrameAdd.get_style_context(); - //ctx->add_provider_for_screen(screen, css, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); - _btnTimelineFrameAdd.set_name("gtkbutton"); - - _btnTimelineFrameAdd.set_size_request(16, 16); - _btnTimelineFrameAdd.signal_clicked().connect(sigc::mem_fun(*this, &Kage::AddFrame_onClick)); - m_Timeline_Controls_HBox.pack_start(_btnTimelineFrameRemove, Gtk::PACK_SHRINK); - _btnTimelineFrameRemove_pixbuf = Gdk::Pixbuf::create_from_resource("/kage/share/frame/remove.png"); - _btnTimelineFrameRemove_img = Gtk::Image(_btnTimelineFrameRemove_pixbuf); - _btnTimelineFrameRemove.set_image(_btnTimelineFrameRemove_img); - _btnTimelineFrameRemove.property_always_show_image(); - _btnTimelineFrameRemove.set_tooltip_text("Remove Frame (Shift+F7)"); - _btnTimelineFrameRemove.set_focus_on_click(false); - _btnTimelineFrameRemove.show(); - - ctx = _btnTimelineFrameRemove.get_style_context(); - //ctx->add_provider_for_screen(screen, css, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); - _btnTimelineFrameRemove.set_name("gtkbutton"); - - _btnTimelineFrameRemove.set_size_request(16, 16); - _btnTimelineFrameRemove.signal_clicked().connect(sigc::mem_fun(*this, &Kage::RemoveFrame_onClick)); - m_Timeline_Controls_HBox.pack_start(_btnTimelineFrameCut, Gtk::PACK_SHRINK); - _btnTimelineFrameCut_pixbuf = Gdk::Pixbuf::create_from_resource("/kage/share/frame/cut.png"); - _btnTimelineFrameCut_img = Gtk::Image(_btnTimelineFrameCut_pixbuf); - _btnTimelineFrameCut.set_image(_btnTimelineFrameCut_img); - _btnTimelineFrameCut.property_always_show_image(); - _btnTimelineFrameCut.set_tooltip_text("Cut Frame (Ctrl+Shift+X)"); - _btnTimelineFrameCut.set_focus_on_click(false); - _btnTimelineFrameCut.show(); - - ctx = _btnTimelineFrameCut.get_style_context(); - //ctx->add_provider_for_screen(screen, css, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); - _btnTimelineFrameCut.set_name("gtkbutton"); - - _btnTimelineFrameCut.set_size_request(16, 16); - _btnTimelineFrameCut.signal_clicked().connect(sigc::mem_fun(*this, &Kage::CutFrame_onClick)); - m_Timeline_Controls_HBox.pack_start(_btnTimelineFrameCopy, Gtk::PACK_SHRINK); - _btnTimelineFrameCopy_pixbuf = Gdk::Pixbuf::create_from_resource("/kage/share/frame/copy.png"); - _btnTimelineFrameCopy_img = Gtk::Image(_btnTimelineFrameCopy_pixbuf); - _btnTimelineFrameCopy.set_image(_btnTimelineFrameCopy_img); - _btnTimelineFrameCopy.property_always_show_image(); - _btnTimelineFrameCopy.set_tooltip_text("Copy Frame (Ctrl+Shift+C)"); - _btnTimelineFrameCopy.set_focus_on_click(false); - _btnTimelineFrameCopy.show(); - - ctx = _btnTimelineFrameCopy.get_style_context(); - //ctx->add_provider_for_screen(screen, css, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); - _btnTimelineFrameCopy.set_name("gtkbutton"); - - _btnTimelineFrameCopy.set_size_request(16, 16); - _btnTimelineFrameCopy.signal_clicked().connect(sigc::mem_fun(*this, &Kage::CopyFrame_onClick)); - m_Timeline_Controls_HBox.pack_start(_btnTimelineFramePaste, Gtk::PACK_SHRINK); - _btnTimelineFramePaste_pixbuf = Gdk::Pixbuf::create_from_resource("/kage/share/frame/paste.png"); - _btnTimelineFramePaste_img = Gtk::Image(_btnTimelineFramePaste_pixbuf); - _btnTimelineFramePaste.set_image(_btnTimelineFramePaste_img); - _btnTimelineFramePaste.property_always_show_image(); - _btnTimelineFramePaste.set_tooltip_text("Paste Frame (Ctrl+Shift+V)"); - _btnTimelineFramePaste.set_focus_on_click(false); - _btnTimelineFramePaste.show(); - - ctx = _btnTimelineFramePaste.get_style_context(); - //ctx->add_provider_for_screen(screen, css, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); - _btnTimelineFramePaste.set_name("gtkbutton"); - - _btnTimelineFramePaste.set_size_request(16, 16); - _btnTimelineFramePaste.signal_clicked().connect(sigc::mem_fun(*this, &Kage::PasteFrame_onClick)); - m_Timeline_Controls_HBox.pack_start(_btnTimelineFrameClear, Gtk::PACK_SHRINK); - _btnTimelineFrameClear_pixbuf = Gdk::Pixbuf::create_from_resource("/kage/share/frame/clear.png"); - _btnTimelineFrameClear_img = Gtk::Image(_btnTimelineFrameClear_pixbuf); - _btnTimelineFrameClear.set_image(_btnTimelineFrameClear_img); - _btnTimelineFrameClear.property_always_show_image(); - _btnTimelineFrameClear.set_tooltip_text("Clear Frame (Ctrl+Shift+Del)"); - _btnTimelineFrameClear.set_focus_on_click(false); - _btnTimelineFrameClear.show(); - - ctx = _btnTimelineFrameClear.get_style_context(); - //ctx->add_provider_for_screen(screen, css, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); - _btnTimelineFrameClear.set_name("gtkbutton"); - - _btnTimelineFrameClear.set_size_request(16, 16); - _btnTimelineFrameClear.signal_clicked().connect(sigc::mem_fun(*this, &Kage::DeleteFrame_onClick)); - - m_Timeline_Controls_HBox.pack_start(m_Timeline_Playback_Label, Gtk::PACK_EXPAND_PADDING); - m_Timeline_Playback_Label.set_label("Playback"); - m_Timeline_Playback_Label.set_size_request(22, 22); - m_Timeline_Controls_HBox.pack_start(_btnTimelineRewind, Gtk::PACK_SHRINK); - _btnTimelineRewind_pixbuf = Gdk::Pixbuf::create_from_resource("/kage/share/timeline/rewind.png"); - _btnTimelineRewind_img = Gtk::Image(_btnTimelineRewind_pixbuf); - _btnTimelineRewind.set_image(_btnTimelineRewind_img); - _btnTimelineRewind.property_always_show_image(); - _btnTimelineRewind.set_tooltip_text("Play from Start (F9)"); - _btnTimelineRewind.set_focus_on_click(false); - _btnTimelineRewind.show(); - - ctx = _btnTimelineRewind.get_style_context(); - //ctx->add_provider_for_screen(screen, css, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); - _btnTimelineRewind.set_name("gtkbutton"); - - _btnTimelineRewind.set_size_request(16, 16); - _btnTimelineRewind.signal_clicked().connect(sigc::mem_fun(*this, &Kage::Play_onClick)); - m_Timeline_Controls_HBox.pack_start(_btnTimelinePrevious, Gtk::PACK_SHRINK); - _btnTimelinePrevious_pixbuf = Gdk::Pixbuf::create_from_resource("/kage/share/timeline/previous.png"); - _btnTimelinePrevious_img = Gtk::Image(_btnTimelinePrevious_pixbuf); - _btnTimelinePrevious.set_image(_btnTimelinePrevious_img); - _btnTimelinePrevious.property_always_show_image(); - _btnTimelinePrevious.set_tooltip_text("Previous Frame"); - _btnTimelinePrevious.set_focus_on_click(false); - _btnTimelinePrevious.show(); - - ctx = _btnTimelinePrevious.get_style_context(); - //ctx->add_provider_for_screen(screen, css, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); - _btnTimelinePrevious.set_name("gtkbutton"); - - _btnTimelinePrevious.set_size_request(16, 16); - _btnTimelinePrevious.signal_clicked().connect(sigc::mem_fun(*this, &Kage::PreviousFrame_onClick)); - m_Timeline_Controls_HBox.pack_start(_btnTimelinePlay, Gtk::PACK_SHRINK); - _btnTimelinePlay_pixbuf = Gdk::Pixbuf::create_from_resource("/kage/share/timeline/play.png"); - _btnTimelinePlay_img = Gtk::Image(_btnTimelinePlay_pixbuf); - _btnTimelinePlay.set_image(_btnTimelinePlay_img); - _btnTimelinePlay.property_always_show_image(); - _btnTimelinePlay.set_tooltip_text("Play on Current Frame (Ctrl+F9)"); - _btnTimelinePlay.set_focus_on_click(false); - _btnTimelinePlay.show(); - - ctx = _btnTimelinePlay.get_style_context(); - //ctx->add_provider_for_screen(screen, css, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); - _btnTimelinePlay.set_name("gtkbutton"); - - _btnTimelinePlay.set_size_request(16, 16); - _btnTimelinePlay.signal_clicked().connect(sigc::mem_fun(*this, &Kage::PlayFrame_onClick)); - m_Timeline_Controls_HBox.pack_start(_btnTimelineNext, Gtk::PACK_SHRINK); - _btnTimelineNext_pixbuf = Gdk::Pixbuf::create_from_resource("/kage/share/timeline/next.png"); - _btnTimelineNext_img = Gtk::Image(_btnTimelineNext_pixbuf); - _btnTimelineNext.set_image(_btnTimelineNext_img); - _btnTimelineNext.property_always_show_image(); - _btnTimelineNext.set_tooltip_text("Next Frame"); - _btnTimelineNext.set_focus_on_click(false); - _btnTimelineNext.show(); - - ctx = _btnTimelineNext.get_style_context(); - //ctx->add_provider_for_screen(screen, css, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); - _btnTimelineNext.set_name("gtkbutton"); - - _btnTimelineNext.set_size_request(16, 16); - _btnTimelineNext.signal_clicked().connect(sigc::mem_fun(*this, &Kage::NextFrame_onClick)); - m_Timeline_Controls_HBox.pack_start(_btnTimelineStop, Gtk::PACK_SHRINK); - _btnTimelineStop_pixbuf = Gdk::Pixbuf::create_from_resource("/kage/share/timeline/stop.png"); - _btnTimelineStop_img = Gtk::Image(_btnTimelineStop_pixbuf); - _btnTimelineStop.set_image(_btnTimelineStop_img); - _btnTimelineStop.property_always_show_image(); - _btnTimelineStop.set_tooltip_text("Stop Playback (Escape)"); - _btnTimelineStop.set_focus_on_click(false); - _btnTimelineStop.show(); - - ctx = _btnTimelineStop.get_style_context(); - //ctx->add_provider_for_screen(screen, css, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); - _btnTimelineStop.set_name("gtkbutton"); - - _btnTimelineStop.set_size_request(16, 16); - _btnTimelineStop.signal_clicked().connect(sigc::mem_fun(*this, &Kage::Stop_onClick)); - m_Timeline_Controls_HBox.pack_start(_btnTimelineLoop, Gtk::PACK_SHRINK); - _btnTimelineLoop_pixbuf = Gdk::Pixbuf::create_from_resource("/kage/share/timeline/loop.png"); - _btnTimelineLoop_img = Gtk::Image(_btnTimelineLoop_pixbuf); - _btnTimelineLoop.set_image(_btnTimelineLoop_img); - _btnTimelineLoop.property_always_show_image(); - _btnTimelineLoop.set_tooltip_text("Toggle Loop"); - _btnTimelineLoop.set_focus_on_click(false); - _btnTimelineLoop.show(); - - ctx = _btnTimelineLoop.get_style_context(); - //ctx->add_provider_for_screen(screen, css, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); - _btnTimelineLoop.set_name("gtkbutton"); - - _btnTimelineLoop.set_size_request(16, 16); - //_btnTimelineLoop.signal_clicked().connect(sigc::mem_fun(*this, &Kage::ToggleLoop_onClick)); - + m_Timeline_HPaned.add2(m_Timeline_Scene_HPaned); + m_Timeline_Scene_HPaned.add1(m_Timeline_Frame_VBox1); + m_Timeline_Scene_HPaned.set_size_request(100, 100); //get remaining width, then allocate for _scenes + m_Timeline_Frame_VBox1.pack_start(m_Timeline_Layer_VBox2, Gtk::PACK_EXPAND_WIDGET); + m_Timeline_Layer_VBox2.pack_start(m_Timeline_Layer_ScrolledWindow);//, Gtk::PACK_SHRINK); + m_Timeline_Layer_ScrolledWindow.set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_EXTERNAL); + m_Timeline_Layer_ScrolledWindow.add(_layers); + m_Timeline_Layer_ScrolledWindow.set_border_width(0); + m_Timeline_Layer_ScrolledWindow.set_shadow_type(Gtk::SHADOW_NONE); + m_Timeline_Layer_VBox2.pack_start(m_Timeline_Layer_HScrollbar, Gtk::PACK_SHRINK); + m_Timeline_Layer_HScrollbar.set_adjustment(m_Timeline_Layer_ScrolledWindow.get_hadjustment()); + m_Timeline_Frame_VBox2.pack_start(m_Timeline_Frame_ScrolledWindow);//, Gtk::PACK_SHRINK); + m_Timeline_Frame_ScrolledWindow.set_policy(Gtk::POLICY_EXTERNAL , Gtk::POLICY_EXTERNAL); + m_Timeline_Frame_ScrolledWindow.set_border_width(0); + m_Timeline_Frame_ScrolledWindow.add(_timeline); + m_Timeline_Frame_ScrolledWindow.set_shadow_type(Gtk::SHADOW_NONE); + m_Timeline_Frame_ScrolledWindow.set_kinetic_scrolling(true); + m_Timeline_Frame_VBox2.pack_start(m_Timeline_HScrollbar, Gtk::PACK_SHRINK); + m_Timeline_HScrollbar.set_adjustment(m_Timeline_Frame_ScrolledWindow.get_hadjustment()); + m_Timeline_Frame_VBox1.pack_start(m_Timeline_Layer_Controls_HBox, Gtk::PACK_SHRINK); + m_Timeline_Controls_HBox.pack_start(m_Timeline_Label, Gtk::PACK_EXPAND_PADDING); + m_Timeline_Label.set_size_request(22, 22); + + m_Timeline_Controls_HBox.pack_start(_btnTimelineFrameAdd, Gtk::PACK_SHRINK); + _btnTimelineFrameAdd_pixbuf = Gdk::Pixbuf::create_from_resource("/kage/share/layer/layer_add.png"); + _btnTimelineFrameAdd_img = Gtk::Image(_btnTimelineFrameAdd_pixbuf); + _btnTimelineFrameAdd.set_image(_btnTimelineFrameAdd_img); + _btnTimelineFrameAdd.property_always_show_image(); + _btnTimelineFrameAdd.set_tooltip_text("Add Frame (F7)"); + _btnTimelineFrameAdd.set_focus_on_click(false); + _btnTimelineFrameAdd.show(); + + ctx = _btnTimelineFrameAdd.get_style_context(); + _btnTimelineFrameAdd.set_name("gtkbutton"); + + _btnTimelineFrameAdd.set_size_request(16, 16); + _btnTimelineFrameAdd.signal_clicked().connect(sigc::mem_fun(*this, &Kage::AddFrame_onClick)); + m_Timeline_Controls_HBox.pack_start(_btnTimelineFrameRemove, Gtk::PACK_SHRINK); + _btnTimelineFrameRemove_pixbuf = Gdk::Pixbuf::create_from_resource("/kage/share/layer/layer_delete.png"); + _btnTimelineFrameRemove_img = Gtk::Image(_btnTimelineFrameRemove_pixbuf); + _btnTimelineFrameRemove.set_image(_btnTimelineFrameRemove_img); + _btnTimelineFrameRemove.property_always_show_image(); + _btnTimelineFrameRemove.set_tooltip_text("Remove Frame (Shift+F7)"); + _btnTimelineFrameRemove.set_focus_on_click(false); + _btnTimelineFrameRemove.show(); + + ctx = _btnTimelineFrameRemove.get_style_context(); + _btnTimelineFrameRemove.set_name("gtkbutton"); + + _btnTimelineFrameRemove.set_size_request(16, 16); + _btnTimelineFrameRemove.signal_clicked().connect(sigc::mem_fun(*this, &Kage::RemoveFrame_onClick)); + m_Timeline_Controls_HBox.pack_start(_btnTimelineFrameCut, Gtk::PACK_SHRINK); + _btnTimelineFrameCut_pixbuf = Gdk::Pixbuf::create_from_resource("/kage/share/frame/cut.png"); + _btnTimelineFrameCut_img = Gtk::Image(_btnTimelineFrameCut_pixbuf); + _btnTimelineFrameCut.set_image(_btnTimelineFrameCut_img); + _btnTimelineFrameCut.property_always_show_image(); + _btnTimelineFrameCut.set_tooltip_text("Cut Frame (Ctrl+Shift+X)"); + _btnTimelineFrameCut.set_focus_on_click(false); + _btnTimelineFrameCut.show(); + + ctx = _btnTimelineFrameCut.get_style_context(); + _btnTimelineFrameCut.set_name("gtkbutton"); + + _btnTimelineFrameCut.set_size_request(16, 16); + _btnTimelineFrameCut.signal_clicked().connect(sigc::mem_fun(*this, &Kage::CutFrame_onClick)); + m_Timeline_Controls_HBox.pack_start(_btnTimelineFrameCopy, Gtk::PACK_SHRINK); + _btnTimelineFrameCopy_pixbuf = Gdk::Pixbuf::create_from_resource("/kage/share/frame/copy.png"); + _btnTimelineFrameCopy_img = Gtk::Image(_btnTimelineFrameCopy_pixbuf); + _btnTimelineFrameCopy.set_image(_btnTimelineFrameCopy_img); + _btnTimelineFrameCopy.property_always_show_image(); + _btnTimelineFrameCopy.set_tooltip_text("Copy Frame (Ctrl+Shift+C)"); + _btnTimelineFrameCopy.set_focus_on_click(false); + _btnTimelineFrameCopy.show(); + + ctx = _btnTimelineFrameCopy.get_style_context(); + _btnTimelineFrameCopy.set_name("gtkbutton"); + + _btnTimelineFrameCopy.set_size_request(16, 16); + _btnTimelineFrameCopy.signal_clicked().connect(sigc::mem_fun(*this, &Kage::CopyFrame_onClick)); + m_Timeline_Controls_HBox.pack_start(_btnTimelineFramePaste, Gtk::PACK_SHRINK); + _btnTimelineFramePaste_pixbuf = Gdk::Pixbuf::create_from_resource("/kage/share/frame/paste.png"); + _btnTimelineFramePaste_img = Gtk::Image(_btnTimelineFramePaste_pixbuf); + _btnTimelineFramePaste.set_image(_btnTimelineFramePaste_img); + _btnTimelineFramePaste.property_always_show_image(); + _btnTimelineFramePaste.set_tooltip_text("Paste Frame (Ctrl+Shift+V)"); + _btnTimelineFramePaste.set_focus_on_click(false); + _btnTimelineFramePaste.show(); + + ctx = _btnTimelineFramePaste.get_style_context(); + _btnTimelineFramePaste.set_name("gtkbutton"); + + _btnTimelineFramePaste.set_size_request(16, 16); + _btnTimelineFramePaste.signal_clicked().connect(sigc::mem_fun(*this, &Kage::PasteFrame_onClick)); + m_Timeline_Controls_HBox.pack_start(_btnTimelineFrameClear, Gtk::PACK_SHRINK); + _btnTimelineFrameClear_pixbuf = Gdk::Pixbuf::create_from_resource("/kage/share/frame/clear.png"); + _btnTimelineFrameClear_img = Gtk::Image(_btnTimelineFrameClear_pixbuf); + _btnTimelineFrameClear.set_image(_btnTimelineFrameClear_img); + _btnTimelineFrameClear.property_always_show_image(); + _btnTimelineFrameClear.set_tooltip_text("Clear Frame (Ctrl+Shift+Del)"); + _btnTimelineFrameClear.set_focus_on_click(false); + _btnTimelineFrameClear.show(); + + ctx = _btnTimelineFrameClear.get_style_context(); + _btnTimelineFrameClear.set_name("gtkbutton"); + + _btnTimelineFrameClear.set_size_request(16, 16); + _btnTimelineFrameClear.signal_clicked().connect(sigc::mem_fun(*this, &Kage::DeleteFrame_onClick)); + + m_Timeline_Controls_HBox.pack_start(m_Timeline_Playback_Label, Gtk::PACK_EXPAND_PADDING); + m_Timeline_Playback_Label.set_label("Playback"); + m_Timeline_Playback_Label.set_size_request(22, 22); + m_Timeline_Controls_HBox.pack_start(_btnTimelineRewind, Gtk::PACK_SHRINK); + _btnTimelineRewind_pixbuf = Gdk::Pixbuf::create_from_resource("/kage/share/timeline/rewind.png"); + _btnTimelineRewind_img = Gtk::Image(_btnTimelineRewind_pixbuf); + _btnTimelineRewind.set_image(_btnTimelineRewind_img); + _btnTimelineRewind.property_always_show_image(); + _btnTimelineRewind.set_tooltip_text("Play from Start (F9)"); + _btnTimelineRewind.set_focus_on_click(false); + _btnTimelineRewind.show(); + + ctx = _btnTimelineRewind.get_style_context(); + _btnTimelineRewind.set_name("gtkbutton"); + + _btnTimelineRewind.set_size_request(16, 16); + _btnTimelineRewind.signal_clicked().connect(sigc::mem_fun(*this, &Kage::Play_onClick)); + m_Timeline_Controls_HBox.pack_start(_btnTimelinePrevious, Gtk::PACK_SHRINK); + _btnTimelinePrevious_pixbuf = Gdk::Pixbuf::create_from_resource("/kage/share/timeline/previous.png"); + _btnTimelinePrevious_img = Gtk::Image(_btnTimelinePrevious_pixbuf); + _btnTimelinePrevious.set_image(_btnTimelinePrevious_img); + _btnTimelinePrevious.property_always_show_image(); + _btnTimelinePrevious.set_tooltip_text("Previous Frame"); + _btnTimelinePrevious.set_focus_on_click(false); + _btnTimelinePrevious.show(); + + ctx = _btnTimelinePrevious.get_style_context(); + _btnTimelinePrevious.set_name("gtkbutton"); + + _btnTimelinePrevious.set_size_request(16, 16); + _btnTimelinePrevious.signal_clicked().connect(sigc::mem_fun(*this, &Kage::PreviousFrame_onClick)); + m_Timeline_Controls_HBox.pack_start(_btnTimelinePlay, Gtk::PACK_SHRINK); + _btnTimelinePlay_pixbuf = Gdk::Pixbuf::create_from_resource("/kage/share/timeline/play.png"); + _btnTimelinePlay_img = Gtk::Image(_btnTimelinePlay_pixbuf); + _btnTimelinePlay.set_image(_btnTimelinePlay_img); + _btnTimelinePlay.property_always_show_image(); + _btnTimelinePlay.set_tooltip_text("Play on Current Frame (Ctrl+F9)"); + _btnTimelinePlay.set_focus_on_click(false); + _btnTimelinePlay.show(); + + ctx = _btnTimelinePlay.get_style_context(); + _btnTimelinePlay.set_name("gtkbutton"); + + _btnTimelinePlay.set_size_request(16, 16); + _btnTimelinePlay.signal_clicked().connect(sigc::mem_fun(*this, &Kage::PlayFrame_onClick)); + m_Timeline_Controls_HBox.pack_start(_btnTimelineNext, Gtk::PACK_SHRINK); + _btnTimelineNext_pixbuf = Gdk::Pixbuf::create_from_resource("/kage/share/timeline/next.png"); + _btnTimelineNext_img = Gtk::Image(_btnTimelineNext_pixbuf); + _btnTimelineNext.set_image(_btnTimelineNext_img); + _btnTimelineNext.property_always_show_image(); + _btnTimelineNext.set_tooltip_text("Next Frame"); + _btnTimelineNext.set_focus_on_click(false); + _btnTimelineNext.show(); + + ctx = _btnTimelineNext.get_style_context(); + _btnTimelineNext.set_name("gtkbutton"); + + _btnTimelineNext.set_size_request(16, 16); + _btnTimelineNext.signal_clicked().connect(sigc::mem_fun(*this, &Kage::NextFrame_onClick)); + m_Timeline_Controls_HBox.pack_start(_btnTimelineStop, Gtk::PACK_SHRINK); + _btnTimelineStop_pixbuf = Gdk::Pixbuf::create_from_resource("/kage/share/timeline/stop.png"); + _btnTimelineStop_img = Gtk::Image(_btnTimelineStop_pixbuf); + _btnTimelineStop.set_image(_btnTimelineStop_img); + _btnTimelineStop.property_always_show_image(); + _btnTimelineStop.set_tooltip_text("Stop Playback (Escape)"); + _btnTimelineStop.set_focus_on_click(false); + _btnTimelineStop.show(); + + ctx = _btnTimelineStop.get_style_context(); + _btnTimelineStop.set_name("gtkbutton"); + + _btnTimelineStop.set_size_request(16, 16); + _btnTimelineStop.signal_clicked().connect(sigc::mem_fun(*this, &Kage::Stop_onClick)); + m_Timeline_Controls_HBox.pack_start(_btnTimelineLoop, Gtk::PACK_SHRINK); + _btnTimelineLoop_pixbuf = Gdk::Pixbuf::create_from_resource("/kage/share/timeline/loop.png"); + _btnTimelineLoop_img = Gtk::Image(_btnTimelineLoop_pixbuf); + _btnTimelineLoop.set_image(_btnTimelineLoop_img); + _btnTimelineLoop.property_always_show_image(); + _btnTimelineLoop.set_tooltip_text("Toggle Loop"); + _btnTimelineLoop.set_focus_on_click(false); + _btnTimelineLoop.show(); + + ctx = _btnTimelineLoop.get_style_context(); + _btnTimelineLoop.set_name("gtkbutton"); + + _btnTimelineLoop.set_size_request(16, 16); + m_Timeline_Scene_HPaned.add2(m_Timeline_Scene_VBox); + m_Timeline_Scene_VBox.pack_start(m_Timeline_Frame_VBox2);//, Gtk::PACK_SHRINK); + m_Timeline_Scene_VBox.pack_start(m_Timeline_Controls_HBox, Gtk::PACK_SHRINK); + m_Timeline_Scene_Controls_HBox.pack_start(m_LabelScene, Gtk::PACK_EXPAND_WIDGET); + + m_Timeline_Scene_Controls_HBox.pack_start(_btnSceneAdd, Gtk::PACK_SHRINK); + _btnSceneAdd_pixbuf = Gdk::Pixbuf::create_from_resource("/kage/share/layer/layer_add.png"); + _btnSceneAdd_img = Gtk::Image(_btnSceneAdd_pixbuf); + _btnSceneAdd.set_image(_btnSceneAdd_img); + _btnSceneAdd.property_always_show_image(); + _btnSceneAdd.set_tooltip_text("Add Scene"); + _btnSceneAdd.set_focus_on_click(false); + _btnSceneAdd.show(); + + ctx = _btnSceneAdd.get_style_context(); + _btnSceneAdd.set_name("gtkbutton"); + + _btnSceneAdd.set_size_request(16, 16); + _btnSceneAdd.signal_clicked().connect(sigc::mem_fun(*this, &Kage::SceneAdd_onClick)); + m_Timeline_Scene_Controls_HBox.pack_start(_btnSceneRemove, Gtk::PACK_SHRINK); + _btnSceneRemove_pixbuf = Gdk::Pixbuf::create_from_resource("/kage/share/layer/layer_delete.png"); + _btnSceneRemove_img = Gtk::Image(_btnSceneRemove_pixbuf); + _btnSceneRemove.set_image(_btnSceneRemove_img); + _btnSceneRemove.property_always_show_image(); + _btnSceneRemove.set_tooltip_text("Remove Scene"); + _btnSceneRemove.set_focus_on_click(false); + _btnSceneRemove.show(); + + ctx = _btnSceneRemove.get_style_context(); + _btnSceneRemove.set_name("gtkbutton"); + + _btnSceneRemove.set_size_request(16, 16); + _btnSceneRemove.signal_clicked().connect(sigc::mem_fun(*this, &Kage::SceneDel_onClick)); + m_Timeline_Scene_Controls_HBox.pack_start(_btnSceneToFirst, Gtk::PACK_SHRINK); + _btnSceneToFirst_pixbuf = Gdk::Pixbuf::create_from_resource("/kage/share/layer/move_top.png"); + _btnSceneToFirst_img = Gtk::Image(_btnSceneToFirst_pixbuf); + _btnSceneToFirst.set_image(_btnSceneToFirst_img); + _btnSceneToFirst.property_always_show_image(); + _btnSceneToFirst.set_tooltip_text("Move Scene To First"); + _btnSceneToFirst.set_focus_on_click(false); + _btnSceneToFirst.show(); + + ctx = _btnSceneToFirst.get_style_context(); + _btnSceneToFirst.set_name("gtkbutton"); + + _btnSceneToFirst.set_size_request(16, 16); + _btnSceneToFirst.signal_clicked().connect(sigc::mem_fun(*this, &Kage::SceneMoveToFirst_onClick)); + m_Timeline_Scene_Controls_HBox.pack_start(_btnSceneToPrevious, Gtk::PACK_SHRINK); + _btnSceneToPrevious_pixbuf = Gdk::Pixbuf::create_from_resource("/kage/share/layer/move_up.png"); + _btnSceneToPrevious_img = Gtk::Image(_btnSceneToPrevious_pixbuf); + _btnSceneToPrevious.set_image(_btnSceneToPrevious_img); + _btnSceneToPrevious.property_always_show_image(); + _btnSceneToPrevious.set_tooltip_text("Move Scene To Previous"); + _btnSceneToPrevious.set_focus_on_click(false); + _btnSceneToPrevious.show(); + + ctx = _btnSceneToPrevious.get_style_context(); + _btnSceneToPrevious.set_name("gtkbutton"); + + _btnSceneToPrevious.set_size_request(16, 16); + _btnSceneToPrevious.signal_clicked().connect(sigc::mem_fun(*this, &Kage::SceneMoveToPrevious_onClick)); + m_Timeline_Scene_Controls_HBox.pack_start(_btnSceneToNext, Gtk::PACK_SHRINK); + _btnSceneToNext_pixbuf = Gdk::Pixbuf::create_from_resource("/kage/share/layer/move_down.png"); + _btnSceneToNext_img = Gtk::Image(_btnSceneToNext_pixbuf); + _btnSceneToNext.set_image(_btnSceneToNext_img); + _btnSceneToNext.property_always_show_image(); + _btnSceneToNext.set_tooltip_text("Move Scene To Next"); + _btnSceneToNext.set_focus_on_click(false); + _btnSceneToNext.show(); + + ctx = _btnSceneToNext.get_style_context(); + _btnSceneToNext.set_name("gtkbutton"); + + _btnSceneToNext.set_size_request(16, 16); + _btnSceneToNext.signal_clicked().connect(sigc::mem_fun(*this, &Kage::SceneMoveToNext_onClick)); + m_Timeline_Scene_Controls_HBox.pack_start(_btnSceneToLast, Gtk::PACK_SHRINK); + _btnSceneToLast_pixbuf = Gdk::Pixbuf::create_from_resource("/kage/share/layer/move_bottom.png"); + _btnSceneToLast_img = Gtk::Image(_btnSceneToLast_pixbuf); + _btnSceneToLast.set_image(_btnSceneToLast_img); + _btnSceneToLast.property_always_show_image(); + _btnSceneToLast.set_tooltip_text("Move Scene To Last"); + _btnSceneToLast.set_focus_on_click(false); + _btnSceneToLast.show(); + + ctx = _btnSceneToLast.get_style_context(); + _btnSceneToLast.set_name("gtkbutton"); + + _btnSceneToLast.set_size_request(16, 16); + _btnSceneToLast.signal_clicked().connect(sigc::mem_fun(*this, &Kage::SceneMoveToLast_onClick)); + m_Timeline_HBox.pack_start(m_Timeline_VScrollbar, Gtk::PACK_SHRINK); m_Timeline_VScrollbar.set_adjustment(m_Timeline_Frame_ScrolledWindow.get_vadjustment()); m_Timeline_Layer_ScrolledWindow.set_vadjustment(m_Timeline_Frame_ScrolledWindow.get_vadjustment()); @@ -983,7 +1106,7 @@ Kage::Kage(string p_filePath) : m_Stage_Pane_ScrolledWindow.set_shadow_type(Gtk::SHADOW_NONE); _stage.set_size_request(1280, 700); _stage.show(); - m_HPane_DrawingArea.add2(m_Box1); + m_HPane_DrawingArea.add2(m_Box1); m_Box1.pack_start(m_Property_Pane_ScrolledWindow, Gtk::PACK_EXPAND_WIDGET); @@ -1032,7 +1155,8 @@ Kage::Kage(string p_filePath) : m_PropertyBox.pack_start(_assetManager, Gtk::PACK_SHRINK); New_onClick(); - + ToggleLoop_onClick(); + registerPropertiesPane(); m_HPane_DrawingArea.property_position() = _area_properties_pane2; @@ -1054,16 +1178,16 @@ Kage::Kage(string p_filePath) : } bool Kage::m_LabelLibrary_onClick(GdkEventButton *event) {//}, gpointer user_data) { - cout << "Kage::m_LabelLibrary_onClick " << event->button << " " << event->state << endl; + std::cout << "Kage::m_LabelLibrary_onClick " << event->button << " " << event->state << std::endl; return false; } bool Kage::on_key_press_event(GdkEventKey *e) { - cout << "Kage::on_key_press_event " << e->keyval << " " << e->state << endl; + std::cout << "Kage::on_key_press_event " << e->keyval << " " << e->state << std::endl; return Gtk::Window::on_key_press_event(e); } bool Kage::on_key_release_event(GdkEventKey *e) { - cout << "Kage::on_key_release_event" << e->keyval << " " << e->state << endl; + std::cout << "Kage::on_key_release_event" << e->keyval << " " << e->state << std::endl; return Gtk::Window::on_key_release_event(e); } @@ -1083,54 +1207,70 @@ void Kage::updateStatus(Glib::ustring status_msg) { m_Statusbar.push(status_msg, m_ContextId); } -void Kage::stackDoZoom(PointData p_originBefore, PointData p_originAfter, PointData p_zoomReference, double p_zoomRatio) { - _undoRedoManager.applyZoom(p_originBefore, p_originAfter, p_zoomReference, p_zoomRatio); -} - void Kage::Undo_onClick() { - KageDo l_kageDo = _undoRedoManager.undo(); - if (l_kageDo._layer != -1 && l_kageDo._frame != -1) { - _document.Scenes[_document.getActiveSceneID()].setCurrentLayer(l_kageDo._layer); - _document.Scenes[_document.getActiveSceneID()].setCurrentFrame(l_kageDo._frame); //<-- causes to lose focus on KageStage - setFrameData(l_kageDo.getVectorData(), true); - + _document = _undoRedoManager.undoDocument(); + + unsigned int l_currentScene = getDocumentCurrentScene(); + //not sure why stage/timeline doesnt reflect previously selected scene/layer/frame but let's explicitly tell Kage + if (setDocumentCurrentScene(l_currentScene) == false) { forceRenderFrames(); - set_focus(_stage); //return focus on KageStage; should be fixed better when Frame is rewritten + _timeline.forceRender(); + _layers.forceRender(); + _scenes.forceRender(); + } else { + setDocumentSceneCurrentLayer(getDocumentSceneCurrentLayer(), false); + setDocumentSceneLayerCurrentFrame(getDocumentSceneLayerCurrentFrame(), false); } + set_focus(_stage); //return focus on KageStage } void Kage::Redo_onClick() { - KageDo l_kageDo = _undoRedoManager.redo(); - if (l_kageDo._layer != -1 && l_kageDo._frame != -1) { - _document.Scenes[_document.getActiveSceneID()].setCurrentLayer(l_kageDo._layer); - _document.Scenes[_document.getActiveSceneID()].setCurrentFrame(l_kageDo._frame); //<-- causes to lose focus on KageStage - setFrameData(l_kageDo.getVectorData(), true); - + _document = _undoRedoManager.redoDocument(); + if (setDocumentCurrentScene(getDocumentCurrentScene()) == false) { forceRenderFrames(); - set_focus(_stage); //return focus on KageStage; should be fixed better when Frame is rewritten + _timeline.forceRender(); + _layers.forceRender(); + _scenes.forceRender(); + } else { + setDocumentSceneCurrentLayer(getDocumentSceneCurrentLayer(), false); + setDocumentSceneLayerCurrentFrame(getDocumentSceneLayerCurrentFrame(), false); } + set_focus(_stage); //return focus on KageStage } void Kage::Cut_onClick() { Kage::timestamp_IN(); std::cout << " Kage::Cut_onClick " << KageFrame::_gotFocus << std::endl; if (KageFrame::_gotFocus == true) { - //handle Timeline Cut + //TODO: handle Timeline Cut } else { if (_stage.cutSelectedShapes() == true) { forceRenderFrames(); + stackDo(); } } Kage::timestamp_OUT(); } void Kage::Copy_onClick() { Kage::timestamp_IN(); std::cout << " Kage::Copy_onClick " << KageFrame::_gotFocus << std::endl; - if (_stage.copySelectedShapes() == true) { - forceRenderFrames(); + try { + g_copiedData = _document.getScene()->getLayer()->getFrame()->copySelectedShapes(_stage.selectedShapes); + if (g_copiedData.size() > 0) { + //if ( _stage.copySelectedShapes() == true) { + //forceRenderFrames(); //why re-render the frames? + } + } catch (std::exception& e) { + std::cout << "Kage::Copy_onClick Exception : " << e.what() << std::endl; } Kage::timestamp_OUT(); } void Kage::Paste_onClick() { Kage::timestamp_IN(); std::cout << " Kage::Paste_onClick " << KageFrame::_gotFocus << std::endl; - if (_stage.pasteSelectedShapes() == true) { - forceRenderFrames(); + try { + g_selectedItems = _document.getScene()->getLayer()->getFrame()->pasteSelectedShapes(g_copiedData); + if (g_selectedItems.size() > 0) { + forceRenderFrames(); + stackDo(); + } + } catch (std::exception& e) { + std::cout << "Kage::Paste_onClick Exception : " << e.what() << std::endl; } Kage::timestamp_OUT(); } @@ -1138,11 +1278,15 @@ void Kage::Duplicate_onClick() { if (KageStage::toolMode == KageStage::MODE_SELECT) { Kage::timestamp_IN(); std::cout << " Kage::Duplicate_onClick" << std::endl; if (isLayerLocked() == false) { - vector l_selectedShapes = _document.Scenes[_document.getActiveSceneID()].duplicateShapes(_stage.getSelectedShapes()); - if (l_selectedShapes.size() > 0) { - _stage.setSelectedShapes(l_selectedShapes); - stackDo(); - forceRenderFrames(); + try { + std::vector l_selectedShapes = _document.getScene()->duplicateShapes(_stage.getSelectedShapes()); + if (l_selectedShapes.size() > 0) { + _stage.setSelectedShapes(l_selectedShapes); + forceRenderFrames(); + stackDo(); + } + } catch (std::exception& e) { + std::cout << "Kage::Duplicate_onClick Exception : " << e.what() << std::endl; } } Kage::timestamp_OUT(); @@ -1215,19 +1359,23 @@ void Kage::ToggleDarkTheme_onClick() { gtk_settings_get_default(), "gtk-application-prefer-dark-theme", Kage::NotDarkMode, NULL); - cout << "NotDarkMode " << NotDarkMode; + std::cout << "NotDarkMode " << NotDarkMode << std::endl; NotDarkMode = !NotDarkMode; } void Kage::ShapeGroup_onClick() { if (KageStage::toolMode == KageStage::MODE_SELECT) { if (isLayerLocked() == false) { - vector l_selectedShapes = _document.Scenes[_document.getActiveSceneID()].groupSelectedShapes(_stage.getSelectedShapes()); - if (l_selectedShapes.size() > 0) { - _stage.setSelectedShapes(l_selectedShapes); - _document.Scenes[_document.getActiveSceneID()].recenterRotationPoint(l_selectedShapes); - stackDo(); - forceRenderFrames(); + try { + std::vector l_selectedShapes = _document.getScene()->groupSelectedShapes(_stage.getSelectedShapes()); + if (l_selectedShapes.size() > 0) { + _stage.setSelectedShapes(l_selectedShapes); + _document.getScene()->recenterRotationPoint(l_selectedShapes); + forceRenderFrames(); + stackDo(); + } + } catch (std::exception& e) { + std::cout << "Kage::ShapeGroup_onClick Exception : " << e.what() << std::endl; } } } @@ -1237,12 +1385,16 @@ void Kage::ShapeUngroup_onClick() { Kage::timestamp_IN(); std::cout << " Kage::ShapeUngroup_onClick" << std::endl; if (isLayerLocked() == false) { - vector l_selectedShapes = _document.Scenes[_document.getActiveSceneID()].ungroupSelectedShapes(_stage.getSelectedShapes()); - if (l_selectedShapes.size() > 0) { - _stage.setSelectedShapes(l_selectedShapes); - _document.Scenes[_document.getActiveSceneID()].recenterRotationPoint(l_selectedShapes); - stackDo(); - forceRenderFrames(); + try { + std::vector l_selectedShapes = _document.getScene()->ungroupSelectedShapes(_stage.getSelectedShapes()); + if (l_selectedShapes.size() > 0) { + _stage.setSelectedShapes(l_selectedShapes); + _document.getScene()->recenterRotationPoint(l_selectedShapes); + forceRenderFrames(); + stackDo(); + } + } catch (std::exception& e) { + std::cout << "Kage::ShapeUngroup_onClick Exception : " << e.what() << std::endl; } } Kage::timestamp_OUT(); @@ -1254,11 +1406,15 @@ void Kage::Raise_onClick() { Kage::timestamp_IN(); std::cout << " Kage::Raise_onClick" << std::endl; if (isLayerLocked() == false) { - vector l_selectedShapes = _document.Scenes[_document.getActiveSceneID()].raiseSelectedShape(_stage.getSelectedShapes()); - if (l_selectedShapes.size() > 0) { - _stage.setSelectedShapes(l_selectedShapes); - stackDo(); - forceRenderFrames(); + try { + std::vector l_selectedShapes = _document.getScene()->raiseSelectedShape(_stage.getSelectedShapes()); + if (l_selectedShapes.size() > 0) { + _stage.setSelectedShapes(l_selectedShapes); + forceRenderFrames(); + stackDo(); + } + } catch (std::exception& e) { + std::cout << "Kage::Raise_onClick Exception : " << e.what() << std::endl; } } Kage::timestamp_OUT(); @@ -1269,11 +1425,15 @@ void Kage::Lower_onClick() { Kage::timestamp_IN(); std::cout << " Kage::Lower_onClick" << std::endl; if (isLayerLocked() == false) { - vector l_selectedShapes = _document.Scenes[_document.getActiveSceneID()].lowerSelectedShape(_stage.getSelectedShapes()); - if (l_selectedShapes.size() > 0) { - _stage.setSelectedShapes(l_selectedShapes); - stackDo(); - forceRenderFrames(); + try { + std::vector l_selectedShapes = _document.getScene()->lowerSelectedShape(_stage.getSelectedShapes()); + if (l_selectedShapes.size() > 0) { + _stage.setSelectedShapes(l_selectedShapes); + forceRenderFrames(); + stackDo(); + } + } catch (std::exception& e) { + std::cout << "Kage::Lower_onClick Exception : " << e.what() << std::endl; } } Kage::timestamp_OUT(); @@ -1284,11 +1444,15 @@ void Kage::RaiseToTop_onClick() { Kage::timestamp_IN(); std::cout << " Kage::RaiseToTop_onClick" << std::endl; if (isLayerLocked() == false) { - vector l_selectedShapes = _document.Scenes[_document.getActiveSceneID()].raiseToTopSelectedShape(_stage.getSelectedShapes()); - if (l_selectedShapes.size() > 0) { - _stage.setSelectedShapes(l_selectedShapes); - stackDo(); - forceRenderFrames(); + try { + std::vector l_selectedShapes = _document.getScene()->raiseToTopSelectedShape(_stage.getSelectedShapes()); + if (l_selectedShapes.size() > 0) { + _stage.setSelectedShapes(l_selectedShapes); + forceRenderFrames(); + stackDo(); + } + } catch (std::exception& e) { + std::cout << "Kage::RaiseToTop_onClick Exception : " << e.what() << std::endl; } } Kage::timestamp_OUT(); @@ -1299,11 +1463,15 @@ void Kage::LowerToBottom_onClick() { Kage::timestamp_IN(); std::cout << " Kage::LowerToBottom_onClick" << std::endl; if (isLayerLocked() == false) { - vector l_selectedShapes = _document.Scenes[_document.getActiveSceneID()].lowerToBottomSelectedShape(_stage.getSelectedShapes()); - if (l_selectedShapes.size() > 0) { - _stage.setSelectedShapes(l_selectedShapes); - stackDo(); - forceRenderFrames(); + try { + std::vector l_selectedShapes = _document.getScene()->lowerToBottomSelectedShape(_stage.getSelectedShapes()); + if (l_selectedShapes.size() > 0) { + _stage.setSelectedShapes(l_selectedShapes); + forceRenderFrames(); + stackDo(); + } + } catch (std::exception& e) { + std::cout << "Kage::LowerToBottom_onClick Exception : " << e.what() << std::endl; } } Kage::timestamp_OUT(); @@ -1315,9 +1483,13 @@ void Kage::FlipHorizontal_onClick() { Kage::timestamp_IN(); std::cout << " Kage::FlipHorizontal_onClick" << std::endl; if (isLayerLocked() == false) { - if (_document.Scenes[_document.getActiveSceneID()].flipHorizontalSelectedShape(_stage.getSelectedShapes()) == true) { - stackDo(); - forceRenderFrames(); + try { + if (_document.getScene()->flipHorizontalSelectedShape(_stage.getSelectedShapes()) == true) { + forceRenderFrames(); + stackDo(); + } + } catch (std::exception& e) { + std::cout << "Kage::FlipHorizontal_onClick Exception : " << e.what() << std::endl; } } @@ -1329,9 +1501,13 @@ void Kage::FlipVertical_onClick() { Kage::timestamp_IN(); std::cout << " Kage::FlipVertical_onClick" << std::endl; if (isLayerLocked() == false) { - if (_document.Scenes[_document.getActiveSceneID()].flipVerticalSelectedShape(_stage.getSelectedShapes()) == true) { - stackDo(); - forceRenderFrames(); + try { + if (_document.getScene()->flipVerticalSelectedShape(_stage.getSelectedShapes()) == true) { + forceRenderFrames(); + stackDo(); + } + } catch (std::exception& e) { + std::cout << "Kage::FlipVertical_onClick Exception : " << e.what() << std::endl; } } @@ -1344,9 +1520,13 @@ void Kage::RecenterRotationPoint_onClick() { Kage::timestamp_IN(); std::cout << " Kage::RecenterRotationPoint_onClick" << std::endl; if (isLayerLocked() == false) { - if (_document.Scenes[_document.getActiveSceneID()].recenterRotationPoint(_stage.getSelectedShapes()) == true) { - stackDo(); - forceRenderFrames(); + try { + if (_document.getScene()->recenterRotationPoint(_stage.getSelectedShapes()) == true) { + forceRenderFrames(); + stackDo(); + } + } catch (std::exception& e) { + std::cout << "Kage::RecenterRotationPoint_onClick Exception : " << e.what() << std::endl; } } @@ -1357,9 +1537,13 @@ void Kage::RecenterRotationPoint_onClick() { void Kage::Delete_onClick() { if (KageStage::toolMode == KageStage::MODE_SELECT) { Kage::timestamp_IN(); std::cout << " Kage::Delete_onClick SHAPE" << std::endl; - if (_stage.deleteSelectedShapes() == true) { - stackDo(); - forceRenderFrames(); + try { + if (_document.getScene()->getLayer()->getFrame()->deleteSelectedShapes(_stage.selectedShapes) == true) { + forceRenderFrames(); + stackDo(); + } + } catch (std::exception& e) { + std::cout << "Kage::Delete_onClick Exception : " << e.what() << std::endl; } Kage::timestamp_OUT(); } else if (KageStage::toolMode == KageStage::MODE_NODE) { @@ -1372,43 +1556,66 @@ void Kage::Delete_onClick() { } void Kage::PreviousFrame_onClick() { Stop_onClick(); - switchToPreviousFrame(); + sceneLayerSwitchToPreviousFrame(); } void Kage::NextFrame_onClick() { Stop_onClick(); - switchToNextFrame(); + sceneLayerSwitchToNextFrame(); } void Kage::ToggleLoop_onClick() { _btnTimelineLoop.clicked(); } void Kage::AddFrame_onClick() { - _document.Scenes[_document.getActiveSceneID()].addFrame(); - - refreshUI(); + try { + if (_document.getScene()->addLayerFrame() == true) { + doDeleteFrame(); ///see addLayerFrame + _timeline.forceRender(); + forceRenderFrames(); + stackDo(); + } + } catch (std::exception& e) { + std::cout << "Kage::AddFrame_onClick Exception : " << e.what() << std::endl; + } } void Kage::ExtendFrame_onClick() { - _document.Scenes[_document.getActiveSceneID()].extendFrame(); - switchToNextFrame(); - - //refreshUI(); + //TODO: try rewrite to extend only currently selected Layer's frame? + try { + _document.getScene()->extendLayerFrame(); + + sceneLayerSwitchToNextFrame(); + stackDo(); + } catch (std::exception& e) { + std::cout << "Kage::ExtendFrame_onClick Exception : " << e.what() << std::endl; + } } void Kage::DuplicateFrame_onClick() { - _document.Scenes[_document.getActiveSceneID()].duplicateFrame(); - - refreshUI(); + try { + _document.getScene()->duplicateLayerFrame(); + + refreshUI(); + _timeline.forceRender(); + stackDo(); + } catch (std::exception& e) { + std::cout << "Kage::DuplicateFrame_onClick Exception : " << e.what() << std::endl; + } } void Kage::RemoveFrame_onClick() { - _document.Scenes[_document.getActiveSceneID()].removeFrame(); + try { + _document.getScene()->removeLayerFrame(); forceRenderFrames(); - - refreshUI(); + refreshUI(); + _timeline.forceRender(); + stackDo(); + } catch (std::exception& e) { + std::cout << "Kage::RemoveFrame_onClick Exception : " << e.what() << std::endl; + } } void Kage::refreshUI() { if (KageScene::LOADING_MODE == true) { return; } - show_all(); + //show_all(); ///try selective show of UI instead of showing all if (KageStage::toolMode == KageStage::MODE_SELECT || KageStage::toolMode == KageStage::ToolMode::MODE_DRAW_RECT || KageStage::toolMode == KageStage::ToolMode::MODE_DRAW_OVAL @@ -1426,7 +1633,6 @@ void Kage::refreshUI() { propDisplayObjectPropertiesSetVisible(false); } - unsigned int l_tween = getTween(); if (l_tween > 0) { unsigned int l_tweenX = l_tween / 10; @@ -1452,78 +1658,268 @@ void Kage::refreshUI() { } else { propFrameTweenSetVisible(false); } - - _timeline.forceRender(); } /** * Deletes a Frame via Selecting All then Deleting selected shapes */ void Kage::CutFrame_onClick() { - if (_stage.selectAllShapes() == true) { - if (_stage.cutSelectedShapes() == true) { - stackDo(); - forceRenderFrames(); + bool l_existingLayerBufferUsed = false; + _documentCopyBuffer.removeAllScenes(); + _documentCopyBuffer.addScene("Scene 1"); + //for (unsigned int l_sceneIndex = 0; l_sceneIndex < _document.Scenes.size(); ++l_sceneIndex) { + unsigned int l_sceneIndex = _document.getCurrentScene()-1; + unsigned int l_layerBufferCount = 0; + unsigned int l_frameBufferCount = 0; + //count all selected frames/layers + for (unsigned int l_layerIndex = 0; l_layerIndex < _document.Scenes[l_sceneIndex]->Layers.size(); ++l_layerIndex) { + for (unsigned int l_frameIndex = 0; l_frameIndex < _document.Scenes[l_sceneIndex]->Layers[l_layerIndex]->Frames.size(); ++l_frameIndex) { + if (_document.Scenes[l_sceneIndex]->Layers[l_layerIndex]->Frames[l_frameIndex]->isSelected()) { + l_existingLayerBufferUsed = true; + ++l_frameBufferCount; + } + } + if (l_existingLayerBufferUsed == true) { + l_existingLayerBufferUsed = false; + ++l_layerBufferCount; + } } - } + l_frameBufferCount = l_frameBufferCount / l_layerBufferCount; + //resize copybuffer + for (unsigned int l_layerIndex = 0; l_layerIndex < l_layerBufferCount; ++l_layerIndex) { + if (_documentCopyBuffer.Scenes[l_sceneIndex]->Layers.size() < l_layerIndex+1) { + _documentCopyBuffer.Scenes[l_sceneIndex]->addLayer(); + } + for (unsigned int l_frameIndex = 0; l_frameIndex < l_frameBufferCount; ++l_frameIndex) { + if (_documentCopyBuffer.Scenes[l_sceneIndex]->Layers[l_layerIndex]->Frames.size() < l_frameIndex+1) { + _documentCopyBuffer.Scenes[l_sceneIndex]->Layers[l_layerIndex]->addFrame(); + } + } + } + unsigned int l_sceneBufferIndex = 0; + unsigned int l_layerBufferIndex = 0; + unsigned int l_frameBufferIndex = 0; + //copy selected frame/layer + for (unsigned int l_layerIndex = 0; l_layerIndex < _document.Scenes[l_sceneIndex]->Layers.size(); ++l_layerIndex) { + for (unsigned int l_frameIndex = 0; l_frameIndex < _document.Scenes[l_sceneIndex]->Layers[l_layerIndex]->Frames.size(); ++l_frameIndex) { + if (_document.Scenes[l_sceneIndex]->Layers[l_layerIndex]->Frames[l_frameIndex]->isSelected()) { + l_existingLayerBufferUsed = true; + if (_documentCopyBuffer.Scenes[l_sceneBufferIndex]->Layers[l_layerBufferIndex]->Frames.size() > 1) { + _documentCopyBuffer.Scenes[l_sceneBufferIndex]->Layers[l_layerBufferIndex]->Frames[l_frameBufferIndex]->setExtension( + _document.Scenes[l_sceneIndex]->Layers[l_layerIndex]->Frames[l_frameIndex]->getExtension() + ); + } else { + _documentCopyBuffer.Scenes[l_sceneBufferIndex]->Layers[l_layerBufferIndex]->Frames[l_frameBufferIndex]->setExtension( + KageFrame::extension::EXTENSION_NOT + ); + } + _documentCopyBuffer.Scenes[l_sceneBufferIndex]->Layers[l_layerBufferIndex]->Frames[l_frameBufferIndex]->setTween( + _document.Scenes[l_sceneIndex]->Layers[l_layerIndex]->Frames[l_frameIndex]->getTween() + ); + _documentCopyBuffer.Scenes[l_sceneBufferIndex]->Layers[l_layerBufferIndex]->Frames[l_frameBufferIndex]->setFrameData( + _document.Scenes[l_sceneIndex]->Layers[l_layerIndex]->Frames[l_frameIndex]->getFrameData() + ); + std::cout << "Frames.size() " + << _documentCopyBuffer.Scenes[l_sceneBufferIndex]->Layers[l_layerBufferIndex]->Frames.size() + << " ? " << l_frameIndex << " " << l_frameBufferIndex << " " + << _documentCopyBuffer.Scenes[l_sceneBufferIndex]->Layers[l_layerBufferIndex]->Frames[l_frameBufferIndex] << std::endl; + ++l_frameBufferIndex; + + std::vector l_selectedItems = _document.Scenes[l_sceneIndex]->Layers[l_layerIndex]->Frames[l_frameIndex]->vectorsData.selectAllShapes(); + if (l_selectedItems.size() > 0) { + if (_document.Scenes[l_sceneIndex]->Layers[l_layerIndex]->Frames[l_frameIndex]->deleteSelectedShapes(l_selectedItems) == true) { + l_selectedItems.clear(); + } + } + } + } + if (l_existingLayerBufferUsed == true) { +// _documentCopyBuffer.Scenes[l_sceneBufferIndex]->addLayer(); + l_existingLayerBufferUsed = false; + ++l_layerBufferIndex; + l_frameBufferIndex = 0; + } + } + //} + stackDo(); } /** * Copies Frame's full content */ void Kage::CopyFrame_onClick() { - if (_stage.selectAllShapes() == true) { - if (_stage.copySelectedShapes() == true) { - forceRenderFrames(); + bool l_existingLayerBufferUsed = false; + _documentCopyBuffer.removeAllScenes(); + _documentCopyBuffer.addScene("Scene 1"); + //for (unsigned int l_sceneIndex = 0; l_sceneIndex < _document.Scenes.size(); ++l_sceneIndex) { + unsigned int l_sceneIndex = _document.getCurrentScene()-1; + unsigned int l_layerBufferCount = 0; + unsigned int l_frameBufferCount = 0; + //count all selected frames/layers + for (unsigned int l_layerIndex = 0; l_layerIndex < _document.Scenes[l_sceneIndex]->Layers.size(); ++l_layerIndex) { + for (unsigned int l_frameIndex = 0; l_frameIndex < _document.Scenes[l_sceneIndex]->Layers[l_layerIndex]->Frames.size(); ++l_frameIndex) { + if (_document.Scenes[l_sceneIndex]->Layers[l_layerIndex]->Frames[l_frameIndex]->isSelected()) { + l_existingLayerBufferUsed = true; + ++l_frameBufferCount; + } + } + if (l_existingLayerBufferUsed == true) { + l_existingLayerBufferUsed = false; + ++l_layerBufferCount; + } } - } + l_frameBufferCount = l_frameBufferCount / l_layerBufferCount; + //resize copybuffer + for (unsigned int l_layerIndex = 0; l_layerIndex < l_layerBufferCount; ++l_layerIndex) { + if (_documentCopyBuffer.Scenes[l_sceneIndex]->Layers.size() < l_layerIndex+1) { + _documentCopyBuffer.Scenes[l_sceneIndex]->addLayer(); + } + for (unsigned int l_frameIndex = 0; l_frameIndex < l_frameBufferCount; ++l_frameIndex) { + if (_documentCopyBuffer.Scenes[l_sceneIndex]->Layers[l_layerIndex]->Frames.size() < l_frameIndex+1) { + _documentCopyBuffer.Scenes[l_sceneIndex]->Layers[l_layerIndex]->addFrame(); + } + } + } + unsigned int l_sceneBufferIndex = 0; + unsigned int l_layerBufferIndex = 0; + unsigned int l_frameBufferIndex = 0; + //copy selected frame/layer + for (unsigned int l_layerIndex = 0; l_layerIndex < _document.Scenes[l_sceneIndex]->Layers.size(); ++l_layerIndex) { + for (unsigned int l_frameIndex = 0; l_frameIndex < _document.Scenes[l_sceneIndex]->Layers[l_layerIndex]->Frames.size(); ++l_frameIndex) { + if (_document.Scenes[l_sceneIndex]->Layers[l_layerIndex]->Frames[l_frameIndex]->isSelected()) { + l_existingLayerBufferUsed = true; + if (_documentCopyBuffer.Scenes[l_sceneBufferIndex]->Layers[l_layerBufferIndex]->Frames.size() > 1) { + _documentCopyBuffer.Scenes[l_sceneBufferIndex]->Layers[l_layerBufferIndex]->Frames[l_frameBufferIndex]->setExtension( + _document.Scenes[l_sceneIndex]->Layers[l_layerIndex]->Frames[l_frameIndex]->getExtension() + ); + } else { + _documentCopyBuffer.Scenes[l_sceneBufferIndex]->Layers[l_layerBufferIndex]->Frames[l_frameBufferIndex]->setExtension( + KageFrame::extension::EXTENSION_NOT + ); + } + _documentCopyBuffer.Scenes[l_sceneBufferIndex]->Layers[l_layerBufferIndex]->Frames[l_frameBufferIndex]->setTween( + _document.Scenes[l_sceneIndex]->Layers[l_layerIndex]->Frames[l_frameIndex]->getTween() + ); + _documentCopyBuffer.Scenes[l_sceneBufferIndex]->Layers[l_layerBufferIndex]->Frames[l_frameBufferIndex]->setFrameData( + _document.Scenes[l_sceneIndex]->Layers[l_layerIndex]->Frames[l_frameIndex]->getFrameData() + ); + std::cout << "Frames.size() " + << _documentCopyBuffer.Scenes[l_sceneBufferIndex]->Layers[l_layerBufferIndex]->Frames.size() + << " ? " << l_frameIndex << " " << l_frameBufferIndex << " " + << _documentCopyBuffer.Scenes[l_sceneBufferIndex]->Layers[l_layerBufferIndex]->Frames[l_frameBufferIndex] << std::endl; + ++l_frameBufferIndex; + } + } + if (l_existingLayerBufferUsed == true) { +// _documentCopyBuffer.Scenes[l_sceneBufferIndex]->addLayer(); + l_existingLayerBufferUsed = false; + ++l_layerBufferIndex; + l_frameBufferIndex = 0; + } + } + //} } /** * Overwrites Frame's current content via Selecting All then * Deleting selected shapes then pasting buffer */ void Kage::PasteFrame_onClick() { - if (_stage.selectAllShapes() == true) { - _stage.deleteSelectedShapes(); - } - if (_stage.pasteSelectedShapes() == true) { + bool l_existingLayerBufferUsed = false; + //for (unsigned int l_sceneIndex = 0; l_sceneIndex < _document.Scenes.size(); ++l_sceneIndex) { + int l_sceneIndex = _document.getCurrentScene()-1; + int l_currentLayerIndex = getDocumentSceneCurrentLayer() - _documentCopyBuffer.Scenes[l_sceneIndex]->Layers.size(); + int l_currentFrameIndex = getDocumentSceneLayerCurrentFrame()-1; + + try { + int layerDiff = l_currentLayerIndex + _documentCopyBuffer.Scenes[l_sceneIndex]->Layers.size() - _document.getScene()->Layers.size(); + //add layer if layer count is not enough + for (int l_layerCount = 0; l_layerCount < layerDiff; ++l_layerCount) { + _document.getScene()->addLayer(); + } + int frameDiff = l_currentFrameIndex + 1 + _documentCopyBuffer.Scenes[l_sceneIndex]->Layers[0]->Frames.size() - _document.getScene()->Layers[0]->Frames.size(); + //add layer if layer count is not enough + for (int l_frameCount = 1; l_frameCount < frameDiff; ++l_frameCount) { + for (int l_layerIndex = 0; l_layerIndex < _document.getScene()->Layers.size(); ++l_layerIndex) { + _document.getScene()->Layers[l_layerIndex]->addFrame(); + } + } + + for (int l_layerIndex = 0; l_layerIndex < _documentCopyBuffer.Scenes[l_sceneIndex]->Layers.size(); ++l_layerIndex) { + if ((l_currentLayerIndex+l_layerIndex) < 0) { + continue; + } + for (int l_frameIndex = 0; l_frameIndex < _documentCopyBuffer.Scenes[l_sceneIndex]->Layers[l_layerIndex]->Frames.size(); ++l_frameIndex) { + if ((l_currentFrameIndex+l_frameIndex) < 0) { + continue; + } + //paste copied frames + std::cout << "l_currentLayerIndex+l_layerIndex " + << (l_currentLayerIndex+l_layerIndex) + << " = " << l_currentLayerIndex << " + " << l_layerIndex << "\t" + << "l_currentFrameIndex+l_frameIndex " + << (l_currentFrameIndex+l_frameIndex) + << " = " << l_currentFrameIndex << " + " << l_frameIndex << std::endl; + _document.getScene()->Layers[l_currentLayerIndex+l_layerIndex]->Frames[l_currentFrameIndex+l_frameIndex]->setExtension( + _documentCopyBuffer.Scenes[l_sceneIndex]->Layers[l_layerIndex]->Frames[l_frameIndex]->getExtension() + ); + _document.getScene()->Layers[l_currentLayerIndex+l_layerIndex]->Frames[l_currentFrameIndex+l_frameIndex]->setTween( + _documentCopyBuffer.Scenes[l_sceneIndex]->Layers[l_layerIndex]->Frames[l_frameIndex]->getTween() + ); + _document.getScene()->Layers[l_currentLayerIndex+l_layerIndex]->Frames[l_currentFrameIndex+l_frameIndex]->setFrameData( + _documentCopyBuffer.Scenes[l_sceneIndex]->Layers[l_layerIndex]->Frames[l_frameIndex]->getFrameData() + ); + } + } stackDo(); - forceRenderFrames(); + } catch (std::exception& e) { + std::cout << "Kage::PasteFrame_onClick Exception : " << e.what() << std::endl; + } catch (...) { + std::cout << "Kage::PasteFrame_onClick Exception : " << std::endl; } + //} } /** * Deletes a Frame via Selecting All then Deleting selected shapes */ void Kage::DeleteFrame_onClick() { if (doDeleteFrame() == true) { - stackDo(); forceRenderFrames(); + stackDo(); } } bool Kage::doDeleteFrame() { - if (_stage.selectAllShapes() == true) { - return _stage.deleteSelectedShapes(); + try { + std::vector l_selectedShapes = _document.getScene()->getLayer()->getFrame()->vectorsData.selectAllShapes(); + if (l_selectedShapes.size() > 0) { + return _document.getScene()->getLayer()->getFrame()->deleteSelectedShapes(l_selectedShapes); + } + } catch (std::exception& e) { + std::cout << "Kage::doDeleteFrame Exception : " << e.what() << std::endl; } return false; } void Kage::Tween_onClick() { /* Kage::timestamp_IN(); std::cout << " Kage::Tween_onClick" << std::endl; if (isLayerLocked() == false) { - if (_document.Scenes[_document.getActiveSceneID()].getTween() != 0) { - //set tween - unsigned int l_tweenType = 11; - m_ComboX.set_active_text("Linear"); - m_ComboY.set_active_text("Linear"); - if (_document.Scenes[_document.getActiveSceneID()].setTween(l_tweenType) == true) { -// stackDo(); - propFrameTweenSetVisible(true); - - forceRenderFrames(); - } - } else if (_document.Scenes[_document.getActiveSceneID()].setTween(0) == true) { -// stackDo(); - propFrameTweenSetVisible(false); - forceRenderFrames(); + try { + if (_document.getScene()->getTween() != 0) { + //set tween + unsigned int l_tweenType = 11; + m_ComboX.set_active_text("Linear"); + m_ComboY.set_active_text("Linear"); + if (_document.getScene()->setTween(l_tweenType) == true) { +// stackDo(); + propFrameTweenSetVisible(true); + + forceRenderFrames(); + } + } else if (_document.getScene()->setTween(0) == true) { +// stackDo(); + propFrameTweenSetVisible(false); + forceRenderFrames(); + } } + } catch (std::exception& e) { + std::cout << "Kage::Tween_onClick Exception : " << e.what() << std::endl; } } @@ -1535,11 +1931,15 @@ void Kage::TweenFrame_onClick() { m_propFrameTween.setTweenXText("Linear"); m_propFrameTween.setTweenYText("Linear"); if (isLayerLocked() == false) { - if (_document.Scenes[_document.getActiveSceneID()].setTween(l_tweenType) == true) { -// stackDo(); - propFrameTweenSetVisible(true); - forceRenderFrames(); - _timeline.forceRender(); + try { + if (_document.getScene()->setTween(l_tweenType) == true) { + propFrameTweenSetVisible(true); + forceRenderFrames(); + _timeline.forceRender(); + stackDo(); + } + } catch (std::exception& e) { + std::cout << "Kage::TweenFrame_onClick Exception : " << e.what() << std::endl; } } @@ -1550,104 +1950,205 @@ void Kage::RemoveTweenFrame_onClick() { Kage::timestamp_IN(); std::cout << " Kage::RemoveTweenFrame_onClick" << std::endl; if (isLayerLocked() == false) { - if (_document.Scenes[_document.getActiveSceneID()].setTween(0) == true) { -// stackDo(); - propFrameTweenSetVisible(false); - forceRenderFrames(); - _timeline.forceRender(); + try { + if (_document.getScene()->setTween(0) == true) { + propFrameTweenSetVisible(false); + forceRenderFrames(); + _timeline.forceRender(); + stackDo(); + } + } catch (std::exception& e) { + std::cout << "Kage::RemoveTweenFrame_onClick Exception : " << e.what() << std::endl; } } Kage::timestamp_OUT(); } -bool Kage::switchToPreviousFrame() { - bool l_return = _document.Scenes[_document.getActiveSceneID()].switchToPreviousFrame(); - _document.Scenes[_document.getActiveSceneID()].setCurrentLayer(getCurrentLayer()); +bool Kage::sceneLayerSwitchToPreviousFrame() { + bool l_return = false; + try { + l_return = _document.getScene()->layerSwitchToPreviousFrame(); forceRenderFrames(); + } catch (std::exception& e) { + std::cout << "Kage::sceneLayerSwitchToPreviousFrame Exception : " << e.what() << std::endl; + } - refreshUI(); + //refreshUI(); + _timeline.forceRender(); return l_return; } -bool Kage::switchToNextFrame() { - bool l_return = _document.Scenes[_document.getActiveSceneID()].switchToNextFrame(); - _document.Scenes[_document.getActiveSceneID()].setCurrentLayer(getCurrentLayer()); +bool Kage::sceneLayerSwitchToNextFrame() { + bool l_return = false; + try { + l_return = _document.getScene()->layerSwitchToNextFrame(); forceRenderFrames(); + } catch (std::exception& e) { + std::cout << "Kage::sceneLayerSwitchToNextFrame Exception : " << e.what() << std::endl; + } - refreshUI(); + //refreshUI(); + _timeline.forceRender(); return l_return; } +void Kage::SceneAdd_onClick() { + _document.addScene("Scene " + StringHelper::integerToString(_document.Scenes.size()+1)); + setDocumentSceneCurrentLayer(1, false); + setDocumentSceneLayerCurrentFrame(1, false); + std::cout << "Scene Count: " << _document.Scenes.size() << std::endl; + updateStatus("New Scene Added"); + forceRenderFrames(); + stackDo(); + _timeline.forceRender(); + _layers.forceRender(); + _scenes.forceRender(); + refreshUI(); +} +void Kage::SceneDel_onClick() { + unsigned int l_currentScene = _document.getCurrentScene(); + if (_document.Scenes.size() > 1) { + _document.removeSceneAt(l_currentScene-1); + } + _document.setCurrentScene(l_currentScene); + forceRenderFrames(); + stackDo(); + _timeline.forceRender(); + _layers.forceRender(); + _scenes.forceRender(); +// refreshUI();//TODO: limit force-render on Timeline/Layer/Stage/Property +} +void Kage::SceneRename_onClick() { + _document.renameScene(); + stackDo(); +} +void Kage::SceneMoveToNext_onClick() { + if (_document.moveSceneUp() == true) { + forceRenderFrames(); + _scenes.forceRender(); + stackDo(); + } +} +void Kage::SceneMoveToPrevious_onClick() { + if (_document.moveSceneDown() == true) { + forceRenderFrames(); + _scenes.forceRender(); + stackDo(); + } +} +void Kage::SceneMoveToLast_onClick() { + if (_document.moveSceneToTop() == true) { + forceRenderFrames(); + _scenes.forceRender(); + stackDo(); + } +} +void Kage::SceneMoveToFirst_onClick() { + if (_document.moveSceneToBottom() == true) { + forceRenderFrames(); + _scenes.forceRender(); + stackDo(); + } +} void Kage::LayerAdd_onClick() { - _document.Scenes[_document.getActiveSceneID()].addLayer(_layerManager.addLayer()); - std::cout << "Layer Count: " << _layerManager.layerCount() << std::endl; - setCurrentFrame(getCurrentFrame()); - updateStatus("New Layer Added"); + try { + _document.getScene()->addLayer(); + stackDo(); + std::cout << "Layer Count: " << _document.getScene()->Layers.size() << std::endl; + setDocumentSceneLayerCurrentFrame(getDocumentSceneLayerCurrentFrame(), false); + updateStatus("New Layer Added"); + } catch (std::exception& e) { + std::cout << "Kage::LayerAdd_onClick Exception : " << e.what() << std::endl; + } + _timeline.forceRender(); + _layers.forceRender(); refreshUI(); } void Kage::LayerRename_onClick() { - _layerManager.renameLayer(); + _document.renameLayer(); + stackDo(); } void Kage::ShowHideLayer_onClick() { - _layerManager.toggleVisibility(); - refreshUI();//TODO: update frames as shown/hidden + _document.toggleLayerVisibility(); + forceRenderFrames(); + _timeline.forceRender(); + _layers.forceRender(); + stackDo(); + //refreshUI();//TODO: limit force-render on Timeline/Layer/Stage } void Kage::LockUnlockLayer_onClick() { - _layerManager.toggleLock(); - refreshUI();//TODO: update frames as locked/unlocked + _document.toggleLayerLock(); + forceRenderFrames(); + _timeline.forceRender(); + _layers.forceRender(); + stackDo(); + //refreshUI();//TODO: limit force-render on Timeline/Layer/Stage } void Kage::LayerDel_onClick() { - if (_layerManager.layerCount() > 1) { - _document.Scenes[_document.getActiveSceneID()].deleteLayer(getCurrentLayer()); - _layerManager.deleteLayer(); + try { + if (_document.getScene()->Layers.size() > 1) { + _document.getScene()->deleteLayer(getDocumentSceneCurrentLayer()); + } + } catch (std::exception& e) { + std::cout << "Kage::LayerDel_onClick Exception : " << e.what() << std::endl; } - - refreshUI(); - std::cout << "Layer Delete Button clicked." << std::endl; + forceRenderFrames(); + _timeline.forceRender(); + _layers.forceRender(); + stackDo(); + refreshUI();//TODO: limit force-render on Timeline/Layer/Stage/Property } -/** - * NOTE: It's important that we rearrange FramesMananger first before - * LayerManager because Current Layer is being referenced by FramesManager - * from LayerManager. - */ void Kage::LayerMoveTop_onClick() { - if (_document.Scenes[_document.getActiveSceneID()].moveToTop() == true && _layerManager.moveToTop() == true) { - forceRenderFrames(); - refreshUI(); + try { + if (_document.getScene()->moveToTop() == true) { + forceRenderFrames(); + _timeline.forceRender(); + _layers.forceRender(); + stackDo(); + //refreshUI(); limit force-render on Timeline/Layer/Stage + } + } catch (std::exception& e) { + std::cout << "Kage::LayerMoveTop_onClick Exception : " << e.what() << std::endl; } } -/** - * NOTE: It's important that we rearrange FramesMananger first before - * LayerManager because Current Layer is being referenced by FramesManager - * from LayerManager. - */ void Kage::LayerMoveUp_onClick() { - if (_document.Scenes[_document.getActiveSceneID()].moveUp() == true && _layerManager.moveUp() == true) { - forceRenderFrames(); - refreshUI(); + try { + if (_document.getScene()->moveUp() == true) { + forceRenderFrames(); + _timeline.forceRender(); + _layers.forceRender(); + stackDo(); + //refreshUI(); limit force-render on Timeline/Layer/Stage + } + } catch (std::exception& e) { + std::cout << "Kage::LayerMoveUp_onClick Exception : " << e.what() << std::endl; } } -/** - * NOTE: It's important that we rearrange FramesMananger first before - * LayerManager because Current Layer is being referenced by FramesManager - * from LayerManager. - */ void Kage::LayerMoveDown_onClick() { - if (_document.Scenes[_document.getActiveSceneID()].moveDown() == true && _layerManager.moveDown() == true) { - forceRenderFrames(); - refreshUI(); + try { + if (_document.getScene()->moveDown() == true) { + forceRenderFrames(); + _timeline.forceRender(); + _layers.forceRender(); + stackDo(); + //refreshUI(); limit force-render on Timeline/Layer/Stage + } + } catch (std::exception& e) { + std::cout << "Kage::LayerMoveDown_onClick Exception : " << e.what() << std::endl; } } -/** - * NOTE: It's important that we rearrange FramesMananger first before - * LayerManager because Current Layer is being referenced by FramesManager - * from LayerManager. - */ void Kage::LayerMoveBottom_onClick() { - if (_document.Scenes[_document.getActiveSceneID()].moveToBottom() == true && _layerManager.moveToBottom() == true) { - forceRenderFrames(); - refreshUI(); + try { + if (_document.getScene()->moveToBottom() == true) { + forceRenderFrames(); + _timeline.forceRender(); + _layers.forceRender(); + stackDo(); + //refreshUI(); limit force-render on Timeline/Layer/Stage + } + } catch (std::exception& e) { + std::cout << "Kage::LayerMoveBottom_onClick Exception : " << e.what() << std::endl; } } @@ -1667,7 +2168,7 @@ void Kage::ToggleOnion_onClick() { refreshUI();//TODO: update frames to indicate which frames are shown as onion } -void Kage::toolsButtonToggle(string p_toolTip) { +void Kage::toolsButtonToggle(std::string p_toolTip) { //toggleButtons is vector unsigned int tsize = toggleButtons.size(); unsigned int i; @@ -1850,7 +2351,7 @@ void Kage::propFillStrokeSetVisible(bool p_visible) { } void Kage::propDisplayObjectPropertiesSetVisible(bool p_visible) { - cout << "_displayObjectIsShape " << _displayObjectIsShape << " p_visible " << p_visible << endl; + std::cout << std::endl << std::endl << std::endl << std::endl << "_displayObjectIsShape " << _displayObjectIsShape << " p_visible " << p_visible << " propAlpha " << _stage.propAlpha << std::endl << std::endl << std::endl << std::endl; propShapePropertiesSetVisible(false); propAssetPropertiesSetVisible(false); if (p_visible == true) { @@ -1894,7 +2395,7 @@ void Kage::updateColors() { _UPDATE_SHAPE_COLORS = true; } -string sanitizeToZero(double p_value) { +std::string sanitizeToZero(double p_value) { if (p_value > -0.001 && p_value < 0.001) { return "0"; } else { @@ -1930,19 +2431,7 @@ void Kage::updateNodeXY() { } void Kage::stackDo() { - KageDo l_kageDo = _undoRedoManager.previewUndo(); - unsigned int l_layer = l_kageDo._layer; - unsigned int l_frame = l_kageDo._frame; - if (l_layer != -1 && l_frame != -1) { - if ( l_layer != getCurrentLayer() - || l_frame != getCurrentFrame()) { - _undoRedoManager.stackDo(getCurrentLayer(), getCurrentFrame(), _undoBase); - } - } else { - _undoRedoManager.stackDo(getCurrentLayer(), getCurrentFrame(), _undoBase); - } - - _undoRedoManager.stackDo(getCurrentLayer(), getCurrentFrame(), getFrameData().getVectorData()); + _undoRedoManager.stackDocument(_document); set_title("*" + kagePath + " - " + KageAbout::app_title); } @@ -1970,8 +2459,12 @@ bool Kage::on_delete_event(GdkEventAny* any_event) { } void Kage::addDataToFrame(VectorDataManager v, bool p_force) { - if (p_force || _layerManager.getLayer()->isLocked() == false) { - _document.Scenes[_document.getActiveSceneID()].addDataToFrame(v); + if (p_force || _document.isLayerLocked() == false) { + try { + _document.getScene()->addDataToFrame(v); + } catch (std::exception& e) { + std::cout << "Kage::addDataToFrame Exception : " << e.what() << std::endl; + } _timeline.forceRender(); } } @@ -1981,12 +2474,15 @@ void Kage::addDataToFrame(VectorDataManager v, bool p_force) { * \return Frame's VectorDataManager. */ VectorDataManager Kage::getFrameData(bool p_force) { - if (p_force || _layerManager.getLayer()->isVisible()) { - return _document.Scenes[_document.getActiveSceneID()].getFrameData(); - } else { - VectorDataManager l_nullReturn; - return l_nullReturn; + if (p_force || _document.isLayerVisible()) { + try { + return _document.getScene()->getFrameData(); + } catch (std::exception& e) { + std::cout << "Kage::getFrameData Exception : " << e.what() << std::endl; + } } + VectorDataManager l_nullReturn; + return l_nullReturn; } /** @@ -1996,71 +2492,93 @@ VectorDataManager Kage::getFrameData(bool p_force) { * \return Frame's VectorDataManager. */ VectorDataManager Kage::getFrameDataAt(unsigned int p_frame) { - if (_layerManager.getLayer()->isVisible()) { - return _document.Scenes[_document.getActiveSceneID()].getFrameDataAt(p_frame); - } else { - VectorDataManager l_nullReturn; - return l_nullReturn; + if (_document.isLayerVisible()) { + try { + return _document.getScene()->getFrameDataAt( + p_frame, + _toggleOnion.get_active(), + _toggleOnionLayer.get_active() + ); + } catch (std::exception& e) { + std::cout << "Kage::getFrameDataAt Exception : " << e.what() << std::endl; + } } + VectorDataManager l_nullReturn; + return l_nullReturn; } void Kage::setFrameData(VectorDataManager p_vectorsData) { setFrameData(p_vectorsData, false); } void Kage::setFrameData(VectorDataManager p_vectorsData, bool p_force) { - if (p_force == true - || _layerManager.getLayer()->isLocked() == false) { - _document.Scenes[_document.getActiveSceneID()].setFrameData(p_vectorsData); + try { + if (p_force == true + || _document.isLayerLocked() == false) { + _document.getScene()->setFrameData(p_vectorsData); + } + } catch (std::exception& e) { + std::cout << "Kage::setFrameData Exception : " << e.what() << std::endl; } } unsigned int Kage::getTween() { - return _document.Scenes[_document.getActiveSceneID()].getTween(); + try { + return _document.getScene()->getTween(); + } catch (std::exception& e) { + std::cout << "Kage::getTween Exception : " << e.what() << std::endl; + return 0; + } } bool Kage::isFrameEmpty() { - return (_document.Scenes[_document.getActiveSceneID()].getFrameData().getVectorData().size() > 0); + try { + return (_document.getScene()->getFrameData().getVectorData().size() > 0); + } catch (std::exception& e) { + std::cout << "Kage::isFrameEmpty Exception : " << e.what() << std::endl; + return false; + } } void Kage::forceRenderFrames() { if (KageScene::LOADING_MODE == true) { return; } - Kage::timestamp_IN(); cout << " Kage::forceRenderFrames " << endl; _stage.invalidateToRender(); renderFrames(); - - Kage::timestamp_OUT(); } void Kage::renderOnionFrames() { Kage::timestamp_IN(); std::cout << " Kage::renderOnionFrames" << std::endl; - unsigned int l_layerCount = _layerManager.layerCount(); - unsigned int l_frameCount = _document.Scenes[_document.getActiveSceneID()].frameCount(); - - unsigned int l_currentLayer = getCurrentLayer(); - unsigned int l_currentFrame = getCurrentFrame(); - double l_alpha[5] = {0.07, 0.12, 1.0, 0.12, 0.07}; - for (int f = (int)l_currentFrame-2; f <= (int)l_currentFrame+2; ++f) { - if (f < 1) { - continue; - } else if (f > l_frameCount) { - continue; - } - - unsigned int l_frame = (unsigned int) f; - for (unsigned int i = 1; i <= l_layerCount; ++i) { - _document.Scenes[_document.getActiveSceneID()].setCurrentLayer(i); - if (l_frame == l_currentFrame) { - _stage.renderFrame(_stage.cr); - } else { - vector l_vectorData = getFrameDataAt(l_frame).getVectorData(); - _stage.renderOnionFrame(_stage.cr, l_vectorData, l_alpha[f-(l_currentFrame-2)]); + unsigned int l_currentLayer = getDocumentSceneCurrentLayer(); + unsigned int l_currentFrame = getDocumentSceneLayerCurrentFrame(); + try { + unsigned int l_layerCount = _document.getScene()->Layers.size(); + unsigned int l_frameCount = _document.getScene()->frameCount(); + + double l_alpha[5] = {0.07, 0.12, 1.0, 0.12, 0.07}; + for (int f = (int)l_currentFrame-2; f <= (int)l_currentFrame+2; ++f) { + if (f < 1) { + continue; + } else if (f > l_frameCount) { + continue; + } + + unsigned int l_frame = (unsigned int) f; + for (unsigned int i = 1; i <= l_layerCount; ++i) { + _document.getScene()->setCurrentLayer(i, false); + if (l_frame == l_currentFrame) { + _stage.renderFrame(_stage.cr); + } else { + std::vector l_vectorData = getFrameDataAt(l_frame).getVectorData(); + _stage.renderOnionFrame(_stage.cr, l_vectorData, l_alpha[f-(l_currentFrame-2)]); + } } } - } - setCurrentLayer(l_currentLayer); + } catch (std::exception& e) { + std::cout << "Kage::renderOnionFrames Exception : " << e.what() << std::endl; + } + setDocumentSceneCurrentLayer(l_currentLayer, false); Kage::timestamp_OUT(); } /** @@ -2071,9 +2589,6 @@ void Kage::renderFrames() { if (KageScene::LOADING_MODE == true) { return; } - Kage::timestamp_IN(); cout << " Kage::renderFrames" << endl; - - _stage.clearScreen(_stage.cr); if (_toggleOnion.get_active() == true) { renderOnionFrames(); @@ -2081,87 +2596,132 @@ void Kage::renderFrames() { return; } - unsigned int l_layerCount = _layerManager.layerCount(); - unsigned int l_currentLayer = getCurrentLayer(); - for (unsigned int i = 1; i <= l_layerCount; ++i) { - _document.Scenes[_document.getActiveSceneID()].setCurrentLayer(i); - _stage.renderFrame(_stage.cr); - } - setCurrentLayer(l_currentLayer); - - Kage::timestamp_OUT(); + unsigned int l_layerCount = 0; + unsigned int l_currentLayer = 0; + try { + l_layerCount = _document.getScene()->Layers.size(); + l_currentLayer = getDocumentSceneCurrentLayer(); + for (unsigned int i = 1; i <= l_layerCount; ++i) { + _document.getScene()->setCurrentLayer(i, false); + _stage.renderFrame(_stage.cr); + } + } catch (std::exception& e) { + std::cout << "Kage::renderFrames Exception : " << e.what() << std::endl; + } + setDocumentSceneCurrentLayer(l_currentLayer, false); } void Kage::renderFramesBelowCurrentLayer() { - Kage::timestamp_IN(); cout << " Kage::renderFramesBelowCurrentLayer" << endl; - _stage.clearScreen(_stage.cr); - if (_toggleOnion.get_active() == true) { renderOnionFrames(); Kage::timestamp_OUT(); return; } - unsigned int l_currentLayer = getCurrentLayer(); + unsigned int l_currentLayer = getDocumentSceneCurrentLayer(); + try { for (unsigned int i = 1; i < l_currentLayer; ++i) { - _document.Scenes[_document.getActiveSceneID()].setCurrentLayer(i); + _document.getScene()->setCurrentLayer(i, false); if (_toggleOnionLayer.get_active() == false) { _stage.renderFrame(_stage.cr); } else { - vector l_vectorData = getFrameData().getVectorData(); + std::vector l_vectorData = getFrameData().getVectorData(); _stage.renderOnionFrame(_stage.cr, l_vectorData, 0.25); } } - setCurrentLayer(l_currentLayer); - - Kage::timestamp_OUT(); + setDocumentSceneCurrentLayer(l_currentLayer, false); + } catch (std::exception& e) { + std::cout << "Kage::renderFramesBelowCurrentLayer Exception : " << e.what() << std::endl; + } } void Kage::renderFramesAboveCurrentLayer() { - Kage::timestamp_IN(); cout << " Kage::renderFramesAboveCurrentLayer" << endl; - unsigned int l_layerCount = _layerManager.layerCount(); - unsigned int l_currentLayer = getCurrentLayer(); - for (unsigned int i = (l_currentLayer + 1); i <= l_layerCount; ++i) { - _document.Scenes[_document.getActiveSceneID()].setCurrentLayer(i); - if (_toggleOnionLayer.get_active() == false) { - _stage.renderFrame(_stage.cr); - } else { - vector l_vectorData = getFrameData().getVectorData(); - _stage.renderOnionFrame(_stage.cr, l_vectorData, 0.25); + try { + unsigned int l_layerCount = _document.getScene()->Layers.size(); + unsigned int l_currentLayer = getDocumentSceneCurrentLayer(); + for (unsigned int i = (l_currentLayer + 1); i <= l_layerCount; ++i) { + _document.getScene()->setCurrentLayer(i, false); + if (_toggleOnionLayer.get_active() == false) { + _stage.renderFrame(_stage.cr); + } else { + std::vector l_vectorData = getFrameData().getVectorData(); + _stage.renderOnionFrame(_stage.cr, l_vectorData, 0.25); + } } - } - setCurrentLayer(l_currentLayer); - Kage::timestamp_OUT(); + setDocumentSceneCurrentLayer(l_currentLayer, false); + } catch (std::exception& e) { + std::cout << "Kage::renderFramesAboveCurrentLayer Exception : " << e.what() << std::endl; + } } bool Kage::isLayerLocked() { - return _layerManager.isLayerLocked(); + return _document.isLayerLocked(); +} +unsigned int Kage::getDocumentCurrentScene() { + return _document.getCurrentScene(); +} +bool Kage::setDocumentCurrentScene(unsigned int p_scene) { + if (_document.getCurrentScene() != p_scene) { + _document.setCurrentScene(p_scene); + _timeline.forceRender(); + _layers.forceRender(); + _scenes.forceRender(); + forceRenderFrames(); + return true; + } + return false; } -unsigned int Kage::getCurrentLayer() { - return _layerManager.getCurrentLayer(); + +unsigned int Kage::getDocumentSceneCurrentLayer() { + try { + return _document.getScene()->getCurrentLayer(); + } catch (std::exception& e) { + std::cout << "Kage::getDocumentSceneCurrentLayer Exception : " << e.what() << std::endl; + return 0; + } } -void Kage::setCurrentLayer(unsigned int p_layer) { - if (_layerManager.getCurrentLayer() != p_layer) { - _undoBase = getFrameData(true).getVectorData(); //for use later by stackDo() - _layerManager.setCurrentLayer(p_layer); - _document.Scenes[_document.getActiveSceneID()].setActiveLayerID(p_layer); +void Kage::setDocumentSceneCurrentLayer(unsigned int p_layer, bool p_addSelected) { + try { + if (_document.getScene()->getCurrentLayer() != p_layer) { + _document.getScene()->setCurrentLayer(p_layer, p_addSelected); + _timeline.forceRender(); + _layers.forceRender(); + } + } catch (std::exception& e) { + std::cout << "Kage::setDocumentSceneCurrentLayer Exception : " << e.what() << std::endl; } } -unsigned int Kage::getCurrentFrame() { - return _document.Scenes[_document.getActiveSceneID()].getCurrentFrame(); +unsigned int Kage::getDocumentSceneLayerCurrentFrame() { + try { + return _document.getScene()->getCurrentFrame(); + } catch (std::exception& e) { + std::cout << "Kage::getDocumentSceneLayerCurrentFrame Exception : " << e.what() << std::endl; + return 0; + } } void Kage::setCurrentLayerByID(unsigned int p_layerID) { - cout << "setting undoBase B setCurrentLayerByID " << p_layerID << endl; - _undoBase = getFrameData(true).getVectorData(); //for use later by stackDo() - _layerManager.setCurrentLayerByID(p_layerID); + try { + _document.getScene()->setCurrentLayerByID(p_layerID); + } catch (std::exception& e) { + std::cout << "Kage::setCurrentLayerByID Exception : " << e.what() << std::endl; + } } -void Kage::setCurrentFrame(unsigned int p_layer) { - cout << "setting undoBase C setCurrentFrame " << endl; - _undoBase = getFrameData(true).getVectorData(); //for use later by stackDo() - _document.Scenes[_document.getActiveSceneID()].setCurrentFrame(p_layer); +void Kage::setDocumentSceneLayerCurrentFrame(unsigned int p_frame, bool p_addSelected) { + try { + _document.getScene()->setLayerCurrentFrame(p_frame, p_addSelected); + } catch (std::exception& e) { + std::cout << "Kage::setDocumentSceneLayerCurrentFrame Exception : " << e.what() << std::endl; + } + + forceRenderFrames(); + _timeline.forceRender(); + //refreshUI(); } +bool gotWidth = false; +bool gotHeight = false; + void Kage::New_onClick() { if (continueNewFileWithUnsavedWork() == false) { return; @@ -2170,17 +2730,24 @@ void Kage::New_onClick() { _library.resetAssetID(); _assetManager.removeAllAssets(); - _layerManager.removeAllLayers(); - _document.Scenes[_document.getActiveSceneID()].removeAllFrames(); - _document.Scenes[_document.getActiveSceneID()].addLayer(_layerManager.addLayer()); - _undoRedoManager.clear(); + _document.removeAllScenes(); + + _document.addScene("Scene 1"); + try { + _document.getScene()->setCurrentLayer(1, false); + _document.getScene()->setLayerCurrentFrame(1, false); + } catch (std::exception& e) { + std::cout << "Kage::New_onClick Exception : " << e.what() << std::endl; + } + stackDo(); + show_all(); refreshUI(); - - _document.Scenes[_document.getActiveSceneID()].setCurrentLayer(1); - _document.Scenes[_document.getActiveSceneID()].setCurrentFrame(1); + _timeline.forceRender(); + _layers.forceRender(); + _scenes.forceRender(); currentTool = toggleButtons[0]; currentTool->set_active(true); @@ -2192,13 +2759,15 @@ void Kage::New_onClick() { kagePath = "Untitled"; ksfPath = "Untitled"; - m_PropStage.setWidthText(_document.Project._width); - m_PropStage.setHeightText(_document.Project._height); - m_PropStage.setFPSText(_document.Project._fps); + m_PropStage.setWidthText(_document._width); + m_PropStage.setHeightText(_document._height); + m_PropStage.setFPSText(_document._fps); m_PropStage.setBackgroundColor(getStageBG()); set_title(kagePath + " - " + KageAbout::app_title); updateStatus("Ready"); + gotWidth = false; + gotHeight = false; } bool Kage::continueNewFileWithUnsavedWork() { @@ -2217,7 +2786,7 @@ bool Kage::continueNewFileWithUnsavedWork() { return false; } -void Kage::OpenKSF_onClick() { +void Kage::OpenKAGE_onClick() { Gtk::FileChooserDialog dialog("Open Kage Studio File", Gtk::FILE_CHOOSER_ACTION_OPEN); dialog.set_transient_for( * this); dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); @@ -2237,10 +2806,11 @@ void Kage::OpenKSF_onClick() { case Gtk::RESPONSE_OK: New_onClick(); kagePath = dialog.get_filename(); - cout << "uri:" << dialog.get_uri() << endl; + std::cout << "uri:" << dialog.get_uri() << std::endl; int l_len = strlen(kagePath.c_str()) - 5; if (StringHelper::toLower(kagePath).substr(l_len, 5) == ".kage") { + _document.removeSceneAt(0); //clear added scene by New_onClick doOpenKAGE(); } else { l_len = strlen(kagePath.c_str()) - 4; @@ -2250,6 +2820,10 @@ void Kage::OpenKSF_onClick() { doOpenKSF(); } } + if (_document.Scenes.size() > 0) { + //TODO: store session's current scene/layer/frame on KAGE file to restore upon loading + setDocumentCurrentScene(1); + } break; } } @@ -2259,7 +2833,7 @@ void Kage::doOpenKAGE() { kagePath = kagePath + ".kage"; } - string l_kageContent = BasicXml::openXMLFile(kagePath); + std::string l_kageContent = BasicXml::openXMLFile(kagePath); parseKAGE(l_kageContent); _undoRedoManager.clear(); @@ -2271,12 +2845,15 @@ void Kage::doOpenKAGE() { } void Kage::doOpenKSF() { int l_len = strlen(ksfPath.c_str()) - 4; + std::string l_sceneName = std::filesystem::path(ksfPath).filename().u8string(); if (StringHelper::toLower(ksfPath).substr(l_len, 4) != ".ksf") { ksfPath = ksfPath + ".ksf"; + } else { + l_sceneName = l_sceneName.substr(0, l_sceneName.size()-4); } - string l_ksfContent = BasicXml::openXMLFile(ksfPath); - + std::string l_ksfContent = BasicXml::openXMLFile(ksfPath); + _document.addScene(l_sceneName); parseKSF(l_ksfContent); _undoRedoManager.clear(); stackDo(); @@ -2303,12 +2880,12 @@ void Kage::doSaveDialog(string p_title) { switch (result) { case Gtk::RESPONSE_OK: - cout << "uri:" << dialog.get_uri() << endl; + std::cout << "uri:" << dialog.get_uri() << std::endl; doSaveKSF(dialog.get_filename()); break; } } -bool Kage::doSaveKSF(string p_filename) { +bool Kage::doSaveKSF(std::string p_filename) { int l_len = strlen(p_filename.c_str()) - 4; if (StringHelper::toLower(p_filename).substr(l_len, 4) != ".ksf") { p_filename = p_filename + ".ksf"; @@ -2316,46 +2893,55 @@ bool Kage::doSaveKSF(string p_filename) { ksfPath = p_filename; ksfInited = false; ksfFile.close(); - - unsigned int l_lMax = _layerManager.layerCount(); + unsigned int l_lMax = 0; + unsigned int l_fMax = 0; + try { + l_lMax = _document.getScene()->Layers.size(); + l_fMax = _document.getScene()->frameCount(); + } catch (std::exception& e) { + std::cout << "Kage::doSaveKSF Exception : " << e.what() << std::endl; + } unsigned int i; - unsigned int l_fMax = _document.Scenes[_document.getActiveSceneID()].frameCount(); unsigned int j; unsigned int l_currentLayer; unsigned int l_currentFrame; saveKageStudioFile(ksfPath, ""); saveKageStudioFile(ksfPath, ""); - l_currentLayer = getCurrentLayer(); - l_currentFrame = getCurrentFrame(); + l_currentLayer = getDocumentSceneCurrentLayer(); + l_currentFrame = getDocumentSceneLayerCurrentFrame(); + try { for (i = 1; i <= l_lMax; i++) { - _document.Scenes[_document.getActiveSceneID()].setCurrentLayer(i); - saveKageStudioFile(ksfPath, ""); + _document.getScene()->setCurrentLayer(i, false); + saveKageStudioFile(ksfPath, ""); for (j = 1; j <= l_fMax; ++j) { - KageFrame *l_frame = _document.Scenes[_document.getActiveSceneID()].getFrameAt(j); + KageFrame *l_frame = _document.getScene()->getFrameAt(j); KageFrame::extension l_extension = l_frame->getExtension(); - string l_tween = ""; + std::string l_tween = ""; if (l_frame->getTween() > 0) { l_tween = " tween=\"" + StringHelper::unsignedIntegerToString(l_frame->getTween()) + "\""; } - if (l_extension == KageFrame::EXTENSION_NOT) { + if (l_extension == KageFrame::extension::EXTENSION_NOT) { saveKageStudioFile(ksfPath, ""); - _document.Scenes[_document.getActiveSceneID()].setCurrentFrame(j); + _document.getScene()->setLayerCurrentFrame(j, false); saveKageStudioFile(ksfPath, saveFrame() + ""); - } else if (l_extension == KageFrame::EXTENSION_START) { + } else if (l_extension == KageFrame::extension::EXTENSION_START) { saveKageStudioFile(ksfPath, ""); - _document.Scenes[_document.getActiveSceneID()].setCurrentFrame(j); + _document.getScene()->setLayerCurrentFrame(j, false); saveKageStudioFile(ksfPath, saveFrame() + ""); - } else if (l_extension == KageFrame::EXTENSION_MID) { + } else if (l_extension == KageFrame::extension::EXTENSION_MID) { saveKageStudioFile(ksfPath, ""); - } else if (l_extension == KageFrame::EXTENSION_END) { + } else if (l_extension == KageFrame::extension::EXTENSION_END) { saveKageStudioFile(ksfPath, ""); } } saveKageStudioFile(ksfPath, ""); } - setCurrentLayer(l_currentLayer); - _document.Scenes[_document.getActiveSceneID()].setCurrentFrame(l_currentFrame); + setDocumentSceneCurrentLayer(l_currentLayer, false); + _document.getScene()->setLayerCurrentFrame(l_currentFrame, false); + } catch (std::exception& e) { + std::cout << "Kage::doSaveKSF Exception : " << e.what() << std::endl; + } if (saveKageStudioFile(ksfPath, "") == true) { return true; } else { @@ -2382,13 +2968,13 @@ void Kage::ExportKS_onClick() { switch (result) { case Gtk::RESPONSE_OK: - string ksPath = dialog.get_filename(); + std::string ksPath = dialog.get_filename(); ksfInited = false; ksfFile.close(); exportKonsolScript(ksPath, "Var:Number bgcolor;\n"); exportKonsolScript(ksPath, "function kagestudio_screencls() {"); - exportKonsolScript(ksPath, "\tDraw:RectFill(0, 0, " + StringHelper::StringHelper::doubleToString(_document.Project._width) + ", " + StringHelper::StringHelper::doubleToString(_document.Project._height) + ", bgcolor, screen)"); + exportKonsolScript(ksPath, "\tDraw:RectFill(0, 0, " + StringHelper::StringHelper::doubleToString(_document._width) + ", " + StringHelper::StringHelper::doubleToString(_document._height) + ", bgcolor, screen)"); exportKonsolScript(ksPath, "}"); exportKonsolScript(ksPath, "function render() {"); exportKonsolScript(ksPath, "\tkagestudio_screencls()"); @@ -2399,7 +2985,7 @@ void Kage::ExportKS_onClick() { exportKonsolScript(ksPath, "}"); exportKonsolScript(ksPath, "function main() {"); exportKonsolScript(ksPath, "\t//add variable initialization..."); - exportKonsolScript(ksPath, "\tKonsol:RGB(" + StringHelper::integerToString(_document.Project._backgroundColor.getR()) + ", " + StringHelper::integerToString(_document.Project._backgroundColor.getG()) + "," + StringHelper::integerToString(_document.Project._backgroundColor.getB()) + ", bgcolor)"); + exportKonsolScript(ksPath, "\tKonsol:RGB(" + StringHelper::integerToString(_document._backgroundColor.getR()) + ", " + StringHelper::integerToString(_document._backgroundColor.getG()) + "," + StringHelper::integerToString(_document._backgroundColor.getB()) + ", bgcolor)"); if (exportKonsolScript(ksPath, "}") == true) { updateStatus("Exported to " + ksPath); } else { @@ -2427,13 +3013,18 @@ void Kage::ExportHTML5_onClick() { switch (result) { case Gtk::RESPONSE_OK: expPath = dialog.get_filename(); - cout << "uri:" << dialog.get_uri() << endl; + std::cout << "uri:" << dialog.get_uri() << std::endl; expInited = false; expFile.close(); - - unsigned int l_lMax = _layerManager.layerCount(); + unsigned int l_lMax = 0; + unsigned int l_fMax = 0; + try { + l_lMax = _document.getScene()->Layers.size(); + l_fMax = _document.getScene()->frameCount(); + } catch (std::exception& e) { + std::cout << "Kage::ExportHTML5_onClick Exception : " << e.what() << std::endl; + } unsigned int i; - unsigned int l_fMax = _document.Scenes[_document.getActiveSceneID()].frameCount(); unsigned int j; unsigned int t; @@ -2445,11 +3036,11 @@ void Kage::ExportHTML5_onClick() { exportHtml5(expPath, "\tmain();"); exportHtml5(expPath, "\tscreen = document.getElementById('screen').getContext('2d');"); if (l_fMax > 1) { - exportHtml5(expPath, "\tsetInterval(kagestudio_loop, " + StringHelper::integerToString(1000/_document.Project._fps) + ");"); + exportHtml5(expPath, "\tsetInterval(kagestudio_loop, " + StringHelper::integerToString(1000/_document._fps) + ");"); exportHtml5(expPath, "}"); exportHtml5(expPath, "function kagestudio_screencls() {"); - exportHtml5(expPath, "\tscreen.fillStyle = \"rgb(" + StringHelper::integerToString(_document.Project._backgroundColor.getR()) + ", " + StringHelper::integerToString(_document.Project._backgroundColor.getG()) + "," + StringHelper::integerToString(_document.Project._backgroundColor.getB()) + ")\";"); - exportHtml5(expPath, "\tscreen.fillRect(0, 0, " + StringHelper::doubleToString(_document.Project._width) + ", " + StringHelper::doubleToString(_document.Project._height) + ");"); + exportHtml5(expPath, "\tscreen.fillStyle = \"rgb(" + StringHelper::integerToString(_document._backgroundColor.getR()) + ", " + StringHelper::integerToString(_document._backgroundColor.getG()) + "," + StringHelper::integerToString(_document._backgroundColor.getB()) + ")\";"); + exportHtml5(expPath, "\tscreen.fillRect(0, 0, " + StringHelper::doubleToString(_document._width) + ", " + StringHelper::doubleToString(_document._height) + ");"); exportHtml5(expPath, "}"); exportHtml5(expPath, "function kagestudio_loop() {"); exportHtml5(expPath, "\tkagestudio_screencls()"); @@ -2458,26 +3049,30 @@ void Kage::ExportHTML5_onClick() { exportHtml5(expPath, "\tif (frame > frameMax) { frame = 1; }"); exportHtml5(expPath, "}"); } else { - exportHtml5(expPath, "\tscreen.fillStyle = \"rgb(" + StringHelper::integerToString(_document.Project._backgroundColor.getR()) + ", " + StringHelper::integerToString(_document.Project._backgroundColor.getG()) + "," + StringHelper::integerToString(_document.Project._backgroundColor.getB()) + ")\";"); - exportHtml5(expPath, "\tscreen.fillRect(0, 0, " + StringHelper::doubleToString(_document.Project._width) + ", " + StringHelper::doubleToString(_document.Project._height) + ");"); + exportHtml5(expPath, "\tscreen.fillStyle = \"rgb(" + StringHelper::integerToString(_document._backgroundColor.getR()) + ", " + StringHelper::integerToString(_document._backgroundColor.getG()) + "," + StringHelper::integerToString(_document._backgroundColor.getB()) + ")\";"); + exportHtml5(expPath, "\tscreen.fillRect(0, 0, " + StringHelper::doubleToString(_document._width) + ", " + StringHelper::doubleToString(_document._height) + ");"); exportHtml5(expPath, "\tks_f1();"); exportHtml5(expPath, "}"); } - t = getCurrentLayer(); - unsigned int f = getCurrentFrame(); + t = getDocumentSceneCurrentLayer(); + unsigned int f = getDocumentSceneLayerCurrentFrame(); + try { for (j = 1; j <= l_fMax; ++j) { - _document.Scenes[_document.getActiveSceneID()].setCurrentFrame(j); + _document.getScene()->setLayerCurrentFrame(j, false); exportHtml5(expPath, "function ks_f" + StringHelper::unsignedIntegerToString(j) + "() {"); for (i = 1; i <= l_lMax; i++) { - _document.Scenes[_document.getActiveSceneID()].setCurrentLayer(i); + _document.getScene()->setCurrentLayer(i, false); exportHtml5(expPath, dumpFrame(false)); } exportHtml5(expPath, "}\n"); } - setCurrentFrame(f); - setCurrentLayer(t); + } catch (std::exception& e) { + std::cout << "Kage::ExportHTML5_onClick Exception : " << e.what() << std::endl; + } + setDocumentSceneCurrentLayer(t, false); + setDocumentSceneLayerCurrentFrame(f, false); exportHtml5(expPath, "function main() {\n\t//add variable initialization...\n}"); - if (exportHtml5(expPath, "\n\n\n\n\n") == true) { + if (exportHtml5(expPath, "\n\n\n\n\n") == true) { updateStatus("Exported to " + expPath); } else { updateStatus("Unable to export! Please try a different directory."); @@ -2505,37 +3100,46 @@ void Kage::ExportSVG_onClick() { switch (result) { case Gtk::RESPONSE_OK: expPath = dialog.get_filename(); - cout << "uri:" << dialog.get_uri() << endl; + std::cout << "uri:" << dialog.get_uri() << std::endl; expInited = false; expFile.close(); - - unsigned int l_lMax = _layerManager.layerCount(); + unsigned int l_lMax = 0; + unsigned int l_fMax = 0; + try { + l_lMax = _document.getScene()->Layers.size(); + l_fMax = _document.getScene()->frameCount(); + } catch (std::exception& e) { + std::cout << "Kage::ExportSVG_onClick Exception : " << e.what() << std::endl; + } unsigned int i; - unsigned int l_fMax = _document.Scenes[_document.getActiveSceneID()].frameCount(); unsigned int j; unsigned int t; exportSvg(expPath, ""); exportSvg(expPath, "\n"); - exportSvg(expPath, ""); + exportSvg(expPath, ""); - t = getCurrentLayer(); - string l_layerToSVG = ""; - string l_frameToSVG = ""; - unsigned int f = getCurrentFrame(); + t = getDocumentSceneCurrentLayer(); + std::string l_layerToSVG = ""; + std::string l_frameToSVG = ""; + unsigned int f = getDocumentSceneLayerCurrentFrame(); //for (j = 1; j <= l_fMax; ++j) { - // _document.Scenes[_document.getActiveSceneID()].setCurrentFrame(j); + // _document.getScene()->setLayerCurrentFrame(j, false); + try { for (i = 1; i <= l_lMax; i++) { - _document.Scenes[_document.getActiveSceneID()].setCurrentLayer(i); + _document.getScene()->setCurrentLayer(i, false); - l_layerToSVG = "\n"; l_frameToSVG = "\t\t\n" + dumpFrameToSvg(); exportSvg(expPath, l_layerToSVG + l_frameToSVG + "\n"); } + } catch (std::exception& e) { + std::cout << "Kage::ExportSVG_onClick Exception : " << e.what() << std::endl; + } //} - setCurrentLayer(t); + setDocumentSceneCurrentLayer(t, false); if (exportSvg(expPath, "") == true) { updateStatus("Exported to " + expPath); @@ -2554,7 +3158,7 @@ void Kage::ExportPNGTransparent_onClick() { doExportPNGDialog("Export to PNG (Transparent)", true); } -void Kage::doExportPNGDialog(string p_title, bool p_transparent) { +void Kage::doExportPNGDialog(std::string p_title, bool p_transparent) { Gtk::FileChooserDialog dialog(p_title, Gtk::FILE_CHOOSER_ACTION_SAVE); dialog.set_transient_for( * this); //Add response buttons the the dialog: @@ -2562,10 +3166,10 @@ void Kage::doExportPNGDialog(string p_title, bool p_transparent) { dialog.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_OK); dialog.set_do_overwrite_confirmation(true); - string l_exportPNG = ""; + std::string l_exportPNG = ""; int l_len = strlen(ksfPath.c_str()) - 4; l_exportPNG = StringHelper::toLower(ksfPath).substr(0, l_len) + ".png"; - cout << " setting to " << l_exportPNG << endl; + std::cout << " setting to " << l_exportPNG << std::endl; dialog.set_filename(l_exportPNG); auto filter_png = Gtk::FileFilter::create(); @@ -2577,8 +3181,8 @@ void Kage::doExportPNGDialog(string p_title, bool p_transparent) { switch (result) { case Gtk::RESPONSE_OK: - string l_pngPath = dialog.get_filename(); - cout << "uri:" << dialog.get_uri() << endl; + std::string l_pngPath = dialog.get_filename(); + std::cout << "uri:" << dialog.get_uri() << std::endl; int l_len = strlen(l_pngPath.c_str()) - 4; if (StringHelper::toLower(l_pngPath).substr(l_len, 4) != ".png") { @@ -2610,17 +3214,22 @@ void Kage::ExportPNGSpritesheet_onClick() { switch (result) { case Gtk::RESPONSE_OK: - string l_pngPath = dialog.get_filename(); - cout << "uri:" << dialog.get_uri() << endl; - string l_pngSpritesheetPath; + std::string l_pngPath = dialog.get_filename(); + std::cout << "uri:" << dialog.get_uri() << std::endl; + std::string l_pngSpritesheetPath; int l_len = strlen(l_pngPath.c_str()) - 4; if (StringHelper::toLower(l_pngPath).substr(l_len, 4) == ".png") { l_pngPath = l_pngPath.substr(0, l_len); } - - unsigned int l_lMax = _layerManager.layerCount(); + unsigned int l_lMax = 0; + unsigned int l_fMax = 0; + try { + l_lMax = _document.getScene()->Layers.size(); + l_fMax = _document.getScene()->frameCount(); + } catch (std::exception& e) { + std::cout << "Kage::ExportPNGSpritesheet_onClick Exception : " << e.what() << std::endl; + } unsigned int i; - unsigned int l_fMax = _document.Scenes[_document.getActiveSceneID()].frameCount(); unsigned int j; unsigned int t; unsigned int f; @@ -2634,24 +3243,27 @@ void Kage::ExportPNGSpritesheet_onClick() { double l_zoomValue = _stage._zoomValue; _stage._zoomValue = 1.0f; - t = getCurrentLayer(); - f = getCurrentFrame(); + t = getDocumentSceneCurrentLayer(); + f = getDocumentSceneLayerCurrentFrame(); - Cairo::RefPtr surface = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, _document.Project._width * l_fMax, _document.Project._height); + Cairo::RefPtr surface = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, _document._width * l_fMax, _document._height); Cairo::RefPtr l_context = Cairo::Context::create(surface); - + try { for (j = 1; j <= l_fMax; ++j) { - _document.Scenes[_document.getActiveSceneID()].setCurrentFrame(j); + _document.getScene()->setLayerCurrentFrame(j, false); for (i = 1; i <= l_lMax; i++) { - _document.Scenes[_document.getActiveSceneID()].setCurrentLayer(i); - _stage.renderFrameOffset(l_context, true, _document.Project._width*(j-1)); + _document.getScene()->setCurrentLayer(i, false); + _stage.renderFrameOffset(l_context, true, _document._width*(j-1)); } } + } catch (std::exception& e) { + std::cout << "Kage::ExportPNGSpritesheet_onClick Exception : " << e.what() << std::endl; + } CairoKage::writeToPNG(l_pngPath + ".png", surface); - setCurrentFrame(f); - setCurrentLayer(t); + setDocumentSceneCurrentLayer(t, false); + setDocumentSceneLayerCurrentFrame(f, false); _stage.origin.x = l_tempOrigin.x; _stage.origin.y = l_tempOrigin.y; @@ -2678,17 +3290,22 @@ void Kage::ExportPNGSequence_onClick() { switch (result) { case Gtk::RESPONSE_OK: - string l_pngPath = dialog.get_filename(); - cout << "uri:" << dialog.get_uri() << endl; - string l_pngSequencePath; + std::string l_pngPath = dialog.get_filename(); + std::cout << "uri:" << dialog.get_uri() << std::endl; + std::string l_pngSequencePath; int l_len = strlen(l_pngPath.c_str()) - 4; if (StringHelper::toLower(l_pngPath).substr(l_len, 4) == ".png") { l_pngPath = l_pngPath.substr(0, l_len); } - - unsigned int l_lMax = _layerManager.layerCount(); + unsigned int l_lMax = 0; + unsigned int l_fMax = 0; + try { + int l_lMax = _document.getScene()->Layers.size(); + int l_fMax = _document.getScene()->frameCount(); + } catch (std::exception& e) { + std::cout << "Kage::ExportPNGSequence_onClick Exception : " << e.what() << std::endl; + } unsigned int i; - unsigned int l_fMax = _document.Scenes[_document.getActiveSceneID()].frameCount(); unsigned int j; unsigned int t; unsigned int f; @@ -2702,36 +3319,40 @@ void Kage::ExportPNGSequence_onClick() { double l_zoomValue = _stage._zoomValue; _stage._zoomValue = 1.0f; - t = getCurrentLayer(); - f = getCurrentFrame(); - - for (j = 1; j <= l_fMax; ++j) { - _document.Scenes[_document.getActiveSceneID()].setCurrentFrame(j); - - Cairo::RefPtr surface = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, _document.Project._width, _document.Project._height); - Cairo::RefPtr l_context = Cairo::Context::create(surface); - - for (i = 1; i <= l_lMax; i++) { - _document.Scenes[_document.getActiveSceneID()].setCurrentLayer(i); - _stage.renderFrame(l_context); + t = getDocumentSceneCurrentLayer(); + f = getDocumentSceneLayerCurrentFrame(); + try { + for (j = 1; j <= l_fMax; ++j) { + _document.getScene()->setLayerCurrentFrame(j, false); + + Cairo::RefPtr surface = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, _document._width, _document._height); + Cairo::RefPtr l_context = Cairo::Context::create(surface); + + for (i = 1; i <= l_lMax; i++) { + _document.getScene()->setCurrentLayer(i, false); + _stage.renderFrame(l_context); + } + + if (j < 10) { + l_pngSequencePath = l_pngPath + "0000" + StringHelper::unsignedIntegerToString(j) + ".png"; + } else if (j < 100) { + l_pngSequencePath = l_pngPath + "000" + StringHelper::unsignedIntegerToString(j) + ".png"; + } else if (j < 1000) { + l_pngSequencePath = l_pngPath + "00" + StringHelper::unsignedIntegerToString(j) + ".png"; + } else if (j < 10000) { + l_pngSequencePath = l_pngPath + "0" + StringHelper::unsignedIntegerToString(j) + ".png"; + } else if (j < 100000) { + l_pngSequencePath = l_pngPath + StringHelper::unsignedIntegerToString(j) + ".png"; } - - if (j < 10) { - l_pngSequencePath = l_pngPath + "0000" + StringHelper::unsignedIntegerToString(j) + ".png"; - } else if (j < 100) { - l_pngSequencePath = l_pngPath + "000" + StringHelper::unsignedIntegerToString(j) + ".png"; - } else if (j < 1000) { - l_pngSequencePath = l_pngPath + "00" + StringHelper::unsignedIntegerToString(j) + ".png"; - } else if (j < 10000) { - l_pngSequencePath = l_pngPath + "0" + StringHelper::unsignedIntegerToString(j) + ".png"; - } else if (j < 100000) { - l_pngSequencePath = l_pngPath + StringHelper::unsignedIntegerToString(j) + ".png"; + CairoKage::writeToPNG(l_pngSequencePath, surface); } - CairoKage::writeToPNG(l_pngSequencePath, surface); + } catch (std::exception& e) { + std::cout << "Kage::ExportPNGSequence_onClick Exception : " << e.what() << std::endl; } - setCurrentFrame(f); - setCurrentLayer(t); - + + setDocumentSceneCurrentLayer(t, false); + setDocumentSceneLayerCurrentFrame(f, false); + _stage.origin.x = l_tempOrigin.x; _stage.origin.y = l_tempOrigin.y; _stage._zoomValue = l_zoomValue; @@ -2780,21 +3401,28 @@ void Kage::ImportAsset_onClick() { //Handle the response: switch(result) { case Gtk::RESPONSE_OK: - string l_importPath = dialog.get_filename(); - cout << "File selected: " << l_importPath << endl; - cout << "uri:" << dialog.get_uri() << endl; + std::string l_importPath = dialog.get_filename(); + std::cout << "File selected: " << l_importPath << std::endl; + std::cout << "uri:" << dialog.get_uri() << std::endl; if (_assetManager.exists(l_importPath) == false) { int l_len = strlen(l_importPath.c_str()) - 4; if (StringHelper::toLower(l_importPath).substr(l_len, 4) == ".ksf") { - updateStatus("Importing of KSF is still under consideration"); + unsigned int l_image = _assetManager.addAsset(l_importPath); + if (l_image != UINT_MAX) { + _assetManager.setAssetType(KageAsset::AssetType::ASSET_KAGE); + updateStatus("Importing of KSF is under construction " + l_importPath); + } else { + updateStatus("Failed to import " + l_importPath); + } } else if (StringHelper::toLower(l_importPath).substr(l_len, 4) == ".png") { unsigned int l_image = _assetManager.addAsset(l_importPath); - cout << "l_image " << l_image << endl; + std::cout << "l_image " << l_image << std::endl; if (l_image != UINT_MAX) { _assetManager.setAssetType(KageAsset::AssetType::ASSET_IMAGE); - cout << " " << _assetManager.getImagePathByID(l_image); + std::cout << " " << _assetManager.getImagePathByID(l_image); unsigned int l_cairoIndex = _stage.addImage(l_image); + std::cout << "l_cairoIndex " << l_cairoIndex << std::endl; _assetManager.render(l_cairoIndex); updateStatus("Imported " + l_importPath); } else { @@ -2829,10 +3457,10 @@ void Kage::ExportVideo_onClick() { dialog.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_OK); dialog.set_do_overwrite_confirmation(true); - string l_exportVideo = ""; + std::string l_exportVideo = ""; int l_len = strlen(ksfPath.c_str()) - 4; l_exportVideo = StringHelper::toLower(ksfPath).substr(0, l_len) + ".mp4"; - cout << " setting to " << l_exportVideo << endl; + std::cout << " setting to " << l_exportVideo << std::endl; dialog.set_filename(l_exportVideo); auto filter_avi = Gtk::FileFilter::create(); @@ -2863,13 +3491,13 @@ void Kage::ExportVideo_onClick() { int result = dialog.run(); - string l_extension = ""; - string l_format = ""; + std::string l_extension = ""; + std::string l_format = ""; switch (result) { case Gtk::RESPONSE_OK: - string l_pngPath = dialog.get_filename(); - cout << "uri:" << dialog.get_uri() << endl; - string l_pngSequencePath; + std::string l_pngPath = dialog.get_filename(); + std::cout << "uri:" << dialog.get_uri() << std::endl; + std::string l_pngSequencePath; int l_len = strlen(l_pngPath.c_str()) - 4; if (StringHelper::toLower(l_pngPath).substr(l_len, 4) == ".avi") { l_pngPath = l_pngPath.substr(0, l_len); @@ -2900,17 +3528,17 @@ void Kage::ExportVideo_onClick() { openWebsite("https://www.ffmpeg.org/download.html"); return; } + unsigned int l_scenesMax = _document.Scenes.size(); + unsigned int l_layersMax = 1; + unsigned int l_framesMax = 1; - unsigned int l_lMax = _layerManager.layerCount(); - unsigned int i; - unsigned int l_fMax = _document.Scenes[_document.getActiveSceneID()].frameCount(); - unsigned int j; - unsigned int t; - unsigned int f; - unsigned int l_FPS = _document.Project._fps; - if (l_fMax < _document.Project._fps) { - l_FPS = l_fMax; - } + unsigned int l_sceneCounter = 1; + unsigned int l_layerCounter = 1; + unsigned int l_frameCounter = 1; + unsigned int l_videoFrameCounter = 1; + unsigned int l_currentScene = 1; + unsigned int l_currentLayer = 1; + unsigned int l_currentFrame = 1; GdkPoint l_tempOrigin; l_tempOrigin.x = _stage.origin.x; @@ -2918,68 +3546,105 @@ void Kage::ExportVideo_onClick() { _stage.origin.x = 0; _stage.origin.y = 0; - - t = getCurrentLayer(); - f = getCurrentFrame(); + + l_currentScene = getDocumentCurrentScene(); + l_currentLayer = getDocumentSceneCurrentLayer(); + l_currentFrame = getDocumentSceneLayerCurrentFrame(); double l_zoomValue = _stage._zoomValue; _stage._zoomValue = 1.0f; - for (j = 1; j <= l_fMax; ++j) { - _document.Scenes[_document.getActiveSceneID()].setCurrentFrame(j); - - Cairo::RefPtr surface = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, _document.Project._width, _document.Project._height); - Cairo::RefPtr l_context = Cairo::Context::create(surface); - - _stage.clearScreen(l_context); - for (i = 1; i <= l_lMax; i++) { - _document.Scenes[_document.getActiveSceneID()].setCurrentLayer(i); - _stage.renderFrame(l_context, true); + int l_width = _document._width; + if (l_width % 2 == 1) { + ++l_width; + } + int l_height = _document._height; + if (l_height % 2 == 1) { + ++l_height; + } + try { + for (l_sceneCounter = 1; l_sceneCounter <= l_scenesMax; ++l_sceneCounter) { + //NOTE: updateStatus is not working while going thru this export; need to rewrite the code to export in batch -- low prio + updateStatus("Exporting Scene " + StringHelper::unsignedIntegerToString(l_sceneCounter) + " of " + StringHelper::unsignedIntegerToString(l_scenesMax)); + _document.setCurrentScene(l_sceneCounter); + + l_layersMax = _document.getScene()->Layers.size(); + l_framesMax = _document.getScene()->frameCount(); + + for (l_frameCounter = 1; l_frameCounter <= l_framesMax; ++l_frameCounter) { + _document.getScene()->setLayerCurrentFrame(l_frameCounter, false); + + Cairo::RefPtr surface = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, l_width, l_height); + Cairo::RefPtr l_context = Cairo::Context::create(surface); + + _stage.clearScreen(l_context); + for (l_layerCounter = 1; l_layerCounter <= l_layersMax; ++l_layerCounter) { + _document.getScene()->setCurrentLayer(l_layerCounter, false); + _stage.renderFrame(l_context, true); + } + + if (l_videoFrameCounter < 10) { + l_pngSequencePath = l_pngPath + "0000" + StringHelper::unsignedIntegerToString(l_videoFrameCounter) + ".png"; + } else if (l_videoFrameCounter < 100) { + l_pngSequencePath = l_pngPath + "000" + StringHelper::unsignedIntegerToString(l_videoFrameCounter) + ".png"; + } else if (l_videoFrameCounter < 1000) { + l_pngSequencePath = l_pngPath + "00" + StringHelper::unsignedIntegerToString(l_videoFrameCounter) + ".png"; + } else if (l_videoFrameCounter < 10000) { + l_pngSequencePath = l_pngPath + "0" + StringHelper::unsignedIntegerToString(l_videoFrameCounter) + ".png"; + } else if (l_videoFrameCounter < 100000) { + l_pngSequencePath = l_pngPath + StringHelper::unsignedIntegerToString(l_videoFrameCounter) + ".png"; + } + CairoKage::writeToPNG(l_pngSequencePath, surface); + ++l_videoFrameCounter; } - - if (j < 10) { - l_pngSequencePath = l_pngPath + "0000" + StringHelper::unsignedIntegerToString(j) + ".png"; - } else if (j < 100) { - l_pngSequencePath = l_pngPath + "000" + StringHelper::unsignedIntegerToString(j) + ".png"; - } else if (j < 1000) { - l_pngSequencePath = l_pngPath + "00" + StringHelper::unsignedIntegerToString(j) + ".png"; - } else if (j < 10000) { - l_pngSequencePath = l_pngPath + "0" + StringHelper::unsignedIntegerToString(j) + ".png"; - } else if (j < 100000) { - l_pngSequencePath = l_pngPath + StringHelper::unsignedIntegerToString(j) + ".png"; } - CairoKage::writeToPNG(l_pngSequencePath, surface); + } catch (std::exception& e) { + std::cout << "Kage::ExportVideo_onClick Exception : " << e.what() << std::endl; } //workaround to FFMPEG-bug: see https://sourceforge.net/p/kage/tickets/25/ - if ((l_fMax % l_FPS) != 0) { - unsigned int l_padding = l_FPS - ((l_fMax % l_FPS)); - for (j = 1; j <= l_padding; ++j) { - _document.Scenes[_document.getActiveSceneID()].setCurrentFrame(l_fMax); - - Cairo::RefPtr surface = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, _document.Project._width, _document.Project._height); - Cairo::RefPtr l_context = Cairo::Context::create(surface); - _stage.clearScreen(l_context); - for (i = 1; i <= l_lMax; i++) { - _document.Scenes[_document.getActiveSceneID()].setCurrentLayer(i); - _stage.renderFrame(l_context, true); + unsigned int l_FPS = _document._fps; + if (l_videoFrameCounter < _document._fps) { + l_FPS = l_framesMax; + } + if ((l_framesMax % l_FPS) != 0) { + unsigned int l_padding = l_FPS - ((l_framesMax % l_FPS)); + try { + for (l_sceneCounter = 1; l_sceneCounter <= l_scenesMax; ++l_sceneCounter) { + _document.setCurrentScene(l_sceneCounter); + + for (l_frameCounter = 1; l_frameCounter <= l_padding; ++l_frameCounter) { + _document.getScene()->setLayerCurrentFrame(l_framesMax, false); + + Cairo::RefPtr surface = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, _document._width, _document._height); + Cairo::RefPtr l_context = Cairo::Context::create(surface); + _stage.clearScreen(l_context); + for (l_layerCounter = 1; l_layerCounter <= l_layersMax; ++l_layerCounter) { + _document.getScene()->setCurrentLayer(l_layerCounter, false); + _stage.renderFrame(l_context, true); + } + if (l_framesMax+l_videoFrameCounter < 10) { + l_pngSequencePath = l_pngPath + "0000" + StringHelper::unsignedIntegerToString(l_framesMax+l_videoFrameCounter) + ".png"; + } else if (l_framesMax+l_videoFrameCounter < 100) { + l_pngSequencePath = l_pngPath + "000" + StringHelper::unsignedIntegerToString(l_framesMax+l_videoFrameCounter) + ".png"; + } else if (l_framesMax+l_videoFrameCounter < 1000) { + l_pngSequencePath = l_pngPath + "00" + StringHelper::unsignedIntegerToString(l_framesMax+l_videoFrameCounter) + ".png"; + } else if (l_framesMax+l_videoFrameCounter < 10000) { + l_pngSequencePath = l_pngPath + "0" + StringHelper::unsignedIntegerToString(l_framesMax+l_videoFrameCounter) + ".png"; + } else if (l_framesMax+l_videoFrameCounter < 100000) { + l_pngSequencePath = l_pngPath + StringHelper::unsignedIntegerToString(l_framesMax+l_videoFrameCounter) + ".png"; + } + CairoKage::writeToPNG(l_pngSequencePath, surface); + ++l_videoFrameCounter; } - if (l_fMax+j < 10) { - l_pngSequencePath = l_pngPath + "0000" + StringHelper::unsignedIntegerToString(l_fMax+j) + ".png"; - } else if (l_fMax+j < 100) { - l_pngSequencePath = l_pngPath + "000" + StringHelper::unsignedIntegerToString(l_fMax+j) + ".png"; - } else if (l_fMax+j < 1000) { - l_pngSequencePath = l_pngPath + "00" + StringHelper::unsignedIntegerToString(l_fMax+j) + ".png"; - } else if (l_fMax+j < 10000) { - l_pngSequencePath = l_pngPath + "0" + StringHelper::unsignedIntegerToString(l_fMax+j) + ".png"; - } else if (l_fMax+j < 100000) { - l_pngSequencePath = l_pngPath + StringHelper::unsignedIntegerToString(l_fMax+j) + ".png"; } - CairoKage::writeToPNG(l_pngSequencePath, surface); + } catch (std::exception& e) { + std::cout << "Kage::ExportVideo_onClick Exception : " << e.what() << std::endl; } } _stage._zoomValue = l_zoomValue; //end of workaround - setCurrentFrame(f); - setCurrentLayer(t); + setDocumentCurrentScene(l_currentScene); + setDocumentSceneCurrentLayer(l_currentLayer, false); + setDocumentSceneLayerCurrentFrame(l_currentFrame, false); _stage.origin.x = l_tempOrigin.x; _stage.origin.y = l_tempOrigin.y; @@ -3011,41 +3676,41 @@ void Kage::ProjectSaveAs_onClick() { doSaveProjectDialog("Save File As"); } -void Kage::doSaveProject(string p_filename) { +void Kage::doSaveProject(std::string p_filename) { #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - const string l_directory = "\\"; + const std::string l_directory = "\\"; #else - const string l_directory = "/"; + const std::string l_directory = "/"; #endif int l_len = strlen(p_filename.c_str()) - 5; /*if (StringHelper::toLower(p_filename).substr(l_len, 5) == ".kage") { - p_filename = filesystem::path(p_filename).remove_filename().u8string(); + p_filename = std::filesystem::path(p_filename).remove_filename().u8string(); p_filename = p_filename.substr(0, l_len); }*/ - filesystem::path l_projectName = filesystem::path(p_filename).filename(); - filesystem::path l_projectFileName { p_filename }; + std::filesystem::path l_projectName = std::filesystem::path(p_filename).filename(); + std::filesystem::path l_projectFileName { p_filename }; - cout << "l_projectName " << l_projectName << endl; - cout << "l_projectFileName " << l_projectFileName << endl; + std::cout << "l_projectName " << l_projectName << std::endl; + std::cout << "l_projectFileName " << l_projectFileName << std::endl; - filesystem::file_status l_fileStatus = filesystem::file_status{}; - if(filesystem::status_known(l_fileStatus) ? filesystem::exists(l_fileStatus) : filesystem::exists(l_projectFileName)) { - cout << "//TODO: prompt if user want to overwrite" << endl; - //filesystem::remove_all(l_projectFileName); + std::filesystem::file_status l_fileStatus = std::filesystem::file_status{}; + if(std::filesystem::status_known(l_fileStatus) ? std::filesystem::exists(l_fileStatus) : std::filesystem::exists(l_projectFileName)) { + std::cout << "//TODO: prompt if user want to overwrite" << std::endl; + //std::filesystem::remove_all(l_projectFileName); } else { - filesystem::create_directory(l_projectFileName); - //system(("mkdir " + l_projectFileName.u8string()).c_str()); //above causes locked-access on directory; study filesystem::permissions/perms + std::filesystem::create_directory(l_projectFileName); + //system(("mkdir " + l_projectFileName.u8string()).c_str()); //above causes locked-access on directory; study std::filesystem::permissions/perms } - string l_filename = l_projectFileName.u8string(); + std::string l_filename = l_projectFileName.u8string(); //ofstream{l_projectFileName/l_projectName+".kage"}; l_len = strlen(p_filename.c_str()) - 5; if (StringHelper::toLower(p_filename).substr(l_len, 5) != ".kage") { p_filename += (l_directory + l_projectName.u8string() + ".kage"); } - cout << "l_filename " << l_filename << endl; - cout << "p_filename " << p_filename << endl; + std::cout << "l_filename " << l_filename << std::endl; + std::cout << "p_filename " << p_filename << std::endl; kagePath = l_filename;//p_filename; kageInited = false; kageFile.close(); @@ -3056,26 +3721,30 @@ void Kage::doSaveProject(string p_filename) { unsigned int l_currentScene; saveKageStudio(p_filename, ""); - saveKageStudio(p_filename, ""); saveKageStudio(p_filename, _assetManager.saveAssetsTo(l_filename + l_directory)); - l_currentScene = _document.getActiveSceneID(); - string l_sceneName; + l_currentScene = _document.getCurrentScene(); + std::string l_sceneName; bool l_saved = false; - for (i = 0; i < l_sceneMax; ++i) { - //TODO: get name of scene from AssetManager - l_sceneName = "scene" + StringHelper::unsignedIntegerToString(i); - saveKageStudio(p_filename, ""); - _document.setActiveSceneID(i); - l_saved = doSaveKSF(l_filename + l_directory + l_sceneName); + + std::string l_ksfPath = l_projectFileName.parent_path().u8string(); + try { + for (i = 1; i <= l_sceneMax; ++i) { + _document.setCurrentScene(i); + l_sceneName = _document.getScene()->getLabel(); + saveKageStudio(p_filename, ""); + l_saved = doSaveKSF(l_ksfPath + l_directory + l_sceneName); + } + } catch (std::exception& e) { + std::cout << "Kage::doSaveProject Exception : " << e.what() << std::endl; } - - _document.setActiveSceneID(l_currentScene); + _document.setCurrentScene(l_currentScene); if (saveKageStudio(p_filename, "") == true) { updateStatus("Saved to " + p_filename); @@ -3085,7 +3754,7 @@ void Kage::doSaveProject(string p_filename) { updateStatus("Unable to save project! Try saving to a different location"); } } -void Kage::doSaveProjectDialog(string p_title) { +void Kage::doSaveProjectDialog(std::string p_title) { // Gtk::FileChooserDialog dialog(p_title, Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER); Gtk::FileChooserDialog dialog(p_title, Gtk::FILE_CHOOSER_ACTION_SAVE); dialog.set_transient_for( * this); @@ -3103,7 +3772,7 @@ void Kage::doSaveProjectDialog(string p_title) { switch (result) { case(Gtk::RESPONSE_OK): - cout << "uri:" << dialog.get_uri() << endl; + std::cout << "uri:" << dialog.get_uri() << std::endl; doSaveProject(dialog.get_filename()); break; case(Gtk::RESPONSE_CANCEL): @@ -3121,14 +3790,14 @@ void Kage::Play_onClick() { frameCounter = 0; m_start_time = 0; _isPlaying = true; - _stage.fpsElapse = (double)(45/_document.Project._fps); //compensate for processing time -- aiming for 60Hz compatibility + _stage.fpsElapse = (double)(45/_document._fps); //compensate for processing time -- aiming for 60Hz compatibility m_tick_id = _stage.add_tick_callback( sigc::mem_fun(*this, &Kage::on_tick) ); } void Kage::PlayFrame_onClick() { Play_onClick(); tickCounter = 0; - frameCounter = getCurrentFrame()-1; + frameCounter = getDocumentSceneLayerCurrentFrame()-1; } void Kage::Stop_onClick() { @@ -3158,17 +3827,24 @@ bool Kage::on_tick(const Glib::RefPtr& frame_clock) { ++frameCounter; if (frameCounter > _document.frameCount()) { frameCounter = _document.frameCount(); - if (_btnTimelineLoop.get_active()) { + if (_document.Scenes.size() > 1) { + if (_document.getCurrentScene() < _document.Scenes.size()) { + _document.setCurrentScene(_document.getCurrentScene()+1); //go to Next Scene + } else { + _document.setCurrentScene(1); //go to First Scene + } + _scenes.forceRender(); + } frameCounter = 1; } else { _stage.remove_tick_callback(m_tick_id); _isPlaying = false; } } - - _document.setCurrentFrame(frameCounter); - //renderFrames(); ^setCurrentFrame automatically calls renderFrames, somehow + _timeline.forceRender(); + _document.setSceneLayerCurrentFrame(frameCounter); + forceRenderFrames(); } return true; @@ -3195,8 +3871,13 @@ void Kage::addToolButton(const Glib::ustring &label) { } void Kage::btnDebug_onClick() { - //print vectors in Stage - _stage.printVectors(); + //print vectors on Stage + //_stage.printVectors(); + std::cout << "\nDEBUG _document.Scenes.size() " << _document.Scenes.size() << std::endl; + for (unsigned int l_sceneCount = 0; l_sceneCount < _document.Scenes.size(); ++l_sceneCount) { + std::cout << "\nDEBUG\t " << l_sceneCount << " " << _document.Scenes[l_sceneCount] << "\t?" << _document.getScene() << " == Layers[0]->getScene() " << _document.Scenes[l_sceneCount]->Layers[0]->getScene() << std::endl; + } + std::cout << std::endl << std::endl; } void Kage::btnAbout_onClick() { @@ -3214,23 +3895,23 @@ void Kage::Website_onClick() { openWebsite(KageAbout::app_website); } -void Kage::openWebsite(string p_url) { +void Kage::openWebsite(std::string p_url) { GError *error = NULL; gtk_show_uri_on_window(NULL, p_url.c_str(), gtk_get_current_event_time(), &error); if (error) { - cout << error->message << endl; - cout << "Launching default web browser..." << endl; + std::cout << error->message << std::endl; + std::cout << "Launching default web browser..." << std::endl; runExternal("start", p_url); } } bool Kage::fileWrite(std::string p_path, std::string p_msg, std::ofstream &p_file, bool &p_flag) { if (p_flag == false) { - p_file.open(p_path.c_str(), ios::trunc); + p_file.open(p_path.c_str(), std::ios::trunc); p_flag = true; } else { if (p_file.is_open() == false) { - p_file.open(p_path.c_str(), ios::app); + p_file.open(p_path.c_str(), std::ios::app); } } @@ -3243,10 +3924,10 @@ bool Kage::fileWrite(std::string p_path, std::string p_msg, std::ofstream &p_fil return true; } -bool Kage::dump(string p_path, string p_msg) { +bool Kage::dump(std::string p_path, std::string p_msg) { return fileWrite(p_path, p_msg, ksfFile, ksfInited); } -bool Kage::saveKageStudio(string p_path, string p_msg) { +bool Kage::saveKageStudio(std::string p_path, std::string p_msg) { int l_len = strlen(p_path.c_str()) - 5; if (StringHelper::toLower(p_path).substr(l_len, 5) != ".kage") { p_path = p_path + ".kage"; @@ -3254,7 +3935,7 @@ bool Kage::saveKageStudio(string p_path, string p_msg) { return fileWrite(p_path, p_msg, kageFile, kageInited); } -bool Kage::saveKageStudioFile(string p_path, string p_msg) { +bool Kage::saveKageStudioFile(std::string p_path, std::string p_msg) { int l_len = strlen(p_path.c_str()) - 4; if (StringHelper::toLower(p_path).substr(l_len, 4) != ".ksf") { p_path = p_path + ".ksf"; @@ -3263,7 +3944,7 @@ bool Kage::saveKageStudioFile(string p_path, string p_msg) { return fileWrite(p_path, p_msg, ksfFile, ksfInited); } -bool Kage::exportHtml5(string p_path, string p_msg) { +bool Kage::exportHtml5(std::string p_path, std::string p_msg) { int l_len = strlen(p_path.c_str()) - 5; if (StringHelper::toLower(p_path).substr(l_len, 5) != ".html") { p_path = p_path + ".html"; @@ -3271,7 +3952,7 @@ bool Kage::exportHtml5(string p_path, string p_msg) { return fileWrite(p_path, p_msg, expFile, expInited); } -bool Kage::exportSvg(string p_path, string p_msg) { +bool Kage::exportSvg(std::string p_path, std::string p_msg) { int l_len = strlen(p_path.c_str()) - 4; if (StringHelper::toLower(p_path).substr(l_len, 4) != ".svg") { p_path = p_path + ".svg"; @@ -3280,7 +3961,7 @@ bool Kage::exportSvg(string p_path, string p_msg) { return fileWrite(p_path, p_msg, expFile, expInited); } -bool Kage::exportKonsolScript(string p_path, string p_msg) { +bool Kage::exportKonsolScript(std::string p_path, std::string p_msg) { int l_len = strlen(p_path.c_str()) - 3; if (StringHelper::toLower(p_path).substr(l_len, 3) != ".ks") { p_path = p_path + ".ks"; @@ -3289,7 +3970,7 @@ bool Kage::exportKonsolScript(string p_path, string p_msg) { return fileWrite(p_path, p_msg, ksfFile, ksfInited); } -bool Kage::dtrace(string p_msg) { +bool Kage::dtrace(std::string p_msg) { return dump(ksfPath, p_msg); } @@ -3321,10 +4002,10 @@ void Kage::updateSelectedShapeColor(bool p_doFill, bool p_doStroke) { _stage.updateShapeColor(p_doFill, p_doStroke); } -string Kage::saveFrame() { - vector v = getFrameData(true).getVectorData(); +std::string Kage::saveFrame() { + std::vector v = getFrameData(true).getVectorData(); - ostringstream l_ostringstream; + std::ostringstream l_ostringstream; unsigned int vsize = v.size();//-1; unsigned int fillCtr = 0; ColorData fcolor; @@ -3383,11 +4064,12 @@ string Kage::saveFrame() { //p4 IMAGE_SCALEX_SCALEY x/y == scaleX / scaleY //p5 IMAGE_ROTATE_ALPHA x/y == rotate / alpha l_ostringstream << "\t\n"; break; } @@ -3395,10 +4077,10 @@ string Kage::saveFrame() { return l_ostringstream.str(); } -string Kage::dumpFrame(bool bKS) { - vector v = getFrameData(true).getVectorData(); +std::string Kage::dumpFrame(bool bKS) { + std::vector v = getFrameData(true).getVectorData(); - ostringstream l_ostringstream; + std::ostringstream l_ostringstream; unsigned int vsize = v.size();//-1; unsigned int fillCtr = 0; ColorData fcolor; @@ -3537,10 +4219,10 @@ string Kage::dumpFrame(bool bKS) { return l_ostringstream.str(); } -string Kage::dumpFrameToSvg() { - vector v = getFrameData(true).getVectorData(); +std::string Kage::dumpFrameToSvg() { + std::vector v = getFrameData(true).getVectorData(); - ostringstream l_ostringstream; + std::ostringstream l_ostringstream; unsigned int vsize = v.size(); unsigned int fillCtr = 0; ColorData fcolor; @@ -3646,10 +4328,10 @@ string Kage::dumpFrameToSvg() { return l_ostringstream.str(); } -string Kage::int255ToHex(unsigned int p) { +std::string Kage::int255ToHex(unsigned int p) { int l; - string r = ""; - string rr = ""; + std::string r = ""; + std::string rr = ""; l = ((int)p / 16); if (l > 0) { rr = int15ToHex(l); @@ -3661,12 +4343,12 @@ string Kage::int255ToHex(unsigned int p) { return rr + r; } -unsigned int Kage::hexToInt255(string p) { +unsigned int Kage::hexToInt255(std::string p) { unsigned int l_A = 0; unsigned int l_B = 0; - string r = "0"; - string rr = "0"; + std::string r = "0"; + std::string rr = "0"; if (p.length() > 1) { rr = p.substr(0,1); //if AB rr gets A @@ -3675,10 +4357,10 @@ unsigned int Kage::hexToInt255(string p) { if (p.length() == 1) { r = p; } - cout << "\n\t A " << rr << "\t" << r << endl; + std::cout << "\n\t A " << rr << "\t" << r << std::endl; l_A = hexToInt15(rr[0]) * 16; l_B = hexToInt15(r[0]); - cout << "\t B " << l_A << "\t" << l_B << "\t" << (l_A + l_B) << endl; + std::cout << "\t B " << l_A << "\t" << l_B << "\t" << (l_A + l_B) << std::endl; return l_A + l_B; } @@ -3725,63 +4407,65 @@ unsigned int Kage::hexToInt15(char p) { return 0; } -string Kage::openTextFile(string p_path) { +std::string Kage::openTextFile(std::string p_path) { char ch; - string l_string = ""; - fstream fin(p_path, fstream::in); - while (fin >> noskipws >> ch) { + std::string l_string = ""; + std::fstream fin(p_path, std::fstream::in); + while (fin >> std::noskipws >> ch) { l_string += ch; } return l_string; } -vector Kage::parseNumbers(string p_numbers) { - vector l_XYs = StringHelper::split(p_numbers, " "); - vector l_numbers; +std::vector Kage::parseNumbers(std::string p_numbers) { + std::vector l_XYs = StringHelper::split(p_numbers, " "); + std::vector l_numbers; for (unsigned int i = 0; i < l_XYs.size(); ++i) { l_numbers.push_back(StringHelper::toDouble(l_XYs[i])); } return l_numbers; } -vector Kage::parseColorString(string p_color) { - vector l_colors; +std::vector Kage::parseColorString(std::string p_color) { + std::vector l_colors; if (p_color.length() > 4 && p_color.substr(0, 5) == "rgba(") { - vector l_rgba = StringHelper::split(p_color.substr(5), ", "); + std::vector l_rgba = StringHelper::split(p_color.substr(5), ", "); l_colors.push_back(StringHelper::toInteger(l_rgba[0])); l_colors.push_back(StringHelper::toInteger(l_rgba[1])); l_colors.push_back(StringHelper::toInteger(l_rgba[2])); l_colors.push_back(StringHelper::toInteger(StringHelper::split(l_rgba[3], ")")[0])); } else if (p_color.length() > 3 && p_color.substr(0, 4) == "rgb(") { - vector l_rgb = StringHelper::split(p_color.substr(4), ", "); + std::vector l_rgb = StringHelper::split(p_color.substr(4), ", "); l_colors.push_back(StringHelper::toInteger(l_rgb[0])); l_colors.push_back(StringHelper::toInteger(l_rgb[1])); l_colors.push_back(StringHelper::toInteger(StringHelper::split(l_rgb[2], ")")[0])); } else { - cout << "?!?" << p_color << "\n"; + std::cout << "?!?" << p_color << "\n"; } return l_colors; } -void Kage::parseKAGE_Children(vector p_children) { - unsigned int l_sceneCount = UINT_MAX; - unsigned int l_assetCount = UINT_MAX; +void Kage::parseKAGE_Children(std::vector p_children) { + int l_sceneCount = 0; + int l_assetCount = 0; for (unsigned int i = 0; i < p_children.size(); ++i) { - string l_tagname = p_children[i].getName(); - vector l_properties = p_children[i].getProperties(); - cout << "\tl_tagname " << l_tagname << " l_properties " << l_properties.size() << " ? " << p_children[i]._value << endl; + std::string l_tagname = p_children[i].getName(); + std::vector l_properties = p_children[i].getProperties(); + std::cout << "\tl_tagname " << l_tagname << " l_properties " << l_properties.size() << " ? " << p_children[i]._value << std::endl; if (l_tagname.substr(0, 5) == "scene") { bool l_active = false; unsigned int l_sceneID = UINT_MAX; + std::string l_label = "scene"; for (unsigned int l_propertyIndex = 0; l_propertyIndex < l_properties.size(); ++l_propertyIndex) { - cout << "\t\tA [" << l_propertyIndex << "] " << l_properties[l_propertyIndex].getName() << " = " << l_properties[l_propertyIndex].getValue() << " ? " << StringHelper::toBoolean(l_properties[l_propertyIndex].getValue()) << endl; + std::cout << "\t\tA [" << l_propertyIndex << "] " << l_properties[l_propertyIndex].getName() << " = " << l_properties[l_propertyIndex].getValue() << " ? " << StringHelper::toBoolean(l_properties[l_propertyIndex].getValue()) << std::endl; if (l_properties[l_propertyIndex].getName() == "label") { + l_label = l_properties[l_propertyIndex].getValue(); + //TODO: review if better to use path.parent_path #if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) - ksfPath = filesystem::path(kagePath).remove_filename().u8string() + "\\" + l_properties[l_propertyIndex].getValue(); + ksfPath = std::filesystem::path(kagePath).remove_filename().u8string() + "\\" + l_label; #else - ksfPath = filesystem::path(kagePath).remove_filename().u8string() + "/" + l_properties[l_propertyIndex].getValue(); + ksfPath = std::filesystem::path(kagePath).remove_filename().u8string() + "/" + l_label; #endif doOpenKSF(); - //l_sceneID = _document.Scenes[_document.Scenes.size()-1].ID; //get newly added Scene's ID } else if (l_properties[l_propertyIndex].getName() == "active") { if (l_properties[l_propertyIndex].getValue() == "true") { l_active = true; @@ -3795,12 +4479,12 @@ void Kage::parseKAGE_Children(vector p_children) { //TODO: add to AssetManager --l_sceneCount; } else if (l_tagname.substr(0, 5) == "asset") { - string l_assetLabel = "Asset"; - string l_hash; - string l_originalFileName; - string l_assetFilePath; + std::string l_assetLabel = "Asset"; + std::string l_hash; + std::string l_originalFileName; + std::string l_assetFilePath; for (unsigned int l_propertyIndex = 0; l_propertyIndex < l_properties.size(); ++l_propertyIndex) { - cout << "\t\tB [" << l_propertyIndex << "] " << l_properties[l_propertyIndex].getName() << " = " << l_properties[l_propertyIndex].getValue() << endl; + std::cout << "\t\tB [" << l_propertyIndex << "] " << l_properties[l_propertyIndex].getName() << " = " << l_properties[l_propertyIndex].getValue() << std::endl; if (l_properties[l_propertyIndex].getName() == "label") { l_assetLabel = l_properties[l_propertyIndex].getValue(); } else if (l_properties[l_propertyIndex].getName() == "hash") { @@ -3813,44 +4497,46 @@ void Kage::parseKAGE_Children(vector p_children) { int l_len = strlen(l_originalFileName.c_str()) - 4; if (StringHelper::toLower(l_originalFileName).substr(l_len, 4) == ".png") { //add PNG Asset - l_assetFilePath = filesystem::path(kagePath).remove_filename().u8string() + l_hash; + l_assetFilePath = std::filesystem::path(kagePath).remove_filename().u8string() + l_hash; unsigned int l_image = _assetManager.addImageAsset(l_assetFilePath); - cout << "l_image " << l_image << endl; + std::cout << "l_image " << l_image << std::endl; if (l_image != UINT_MAX) { _assetManager.setAssetType(KageAsset::AssetType::ASSET_IMAGE); - cout << " " << _assetManager.getImagePathByID(l_image); + std::cout << " " << _assetManager.getImagePathByID(l_image); //unsigned int l_cairoIndex = _stage.addImage(l_image); //DO NOT ADD to Stage, just add to AssetManager Cairo::RefPtr l_tmp; _stage.cairoPNG.push_back(l_tmp); - //cout << "l_cairoIndex " << l_cairoIndex << endl; + //std::cout << "l_cairoIndex " << l_cairoIndex << std::endl; _assetManager.setLabel(l_assetLabel); //TODO: should we add previous info of asset; is it cross-platform proof? - _assetManager.setFilePathAt(_assetManager.assetCount()-1, filesystem::path(l_originalFileName).remove_filename().u8string()); //TODO: remove last slash - _assetManager.setFileNameAt(_assetManager.assetCount()-1, filesystem::path(l_originalFileName).filename().u8string()); + _assetManager.setFilePathAt(_assetManager.assetCount()-1, std::filesystem::path(l_originalFileName).remove_filename().u8string()); //TODO: remove last slash + _assetManager.setFileNameAt(_assetManager.assetCount()-1, std::filesystem::path(l_originalFileName).filename().u8string()); _assetManager.setHashAt(_assetManager.assetCount()-1, l_hash); _assetManager.render(_stage.cairoPNG.size()-1); } else { - cout << "Failed to import " << l_assetFilePath << endl; + std::cout << "Failed to import " << l_assetFilePath << std::endl; } } } else { - cout << "hash " << l_hash << "\t" << StringHelper::kHash(l_originalFileName, 24) << endl; + std::cout << "hash " << l_hash << "\t" << StringHelper::kHash(l_originalFileName, 24) << std::endl; } --l_assetCount; } else if (l_tagname == "stage") { for (unsigned int j = 0; j < l_properties.size(); ++j) { if (l_properties[j].getName() == "width") { - _document.Project._width = StringHelper::toUnsignedInteger(l_properties[j].getValue()); - m_PropStage.setWidthText(_document.Project._width); + _document._width = StringHelper::toUnsignedInteger(l_properties[j].getValue()); + gotWidth = true; + m_PropStage.setWidthText(_document._width); } else if (l_properties[j].getName() == "height") { - _document.Project._height = StringHelper::toUnsignedInteger(l_properties[j].getValue()); - m_PropStage.setHeightText(_document.Project._height); + _document._height = StringHelper::toUnsignedInteger(l_properties[j].getValue()); + gotHeight = true; + m_PropStage.setHeightText(_document._height); } else if (l_properties[j].getName() == "fps") { - _document.Project._fps = StringHelper::toUnsignedInteger(l_properties[j].getValue()); - m_PropStage.setFPSText(_document.Project._fps); + _document._fps = StringHelper::toUnsignedInteger(l_properties[j].getValue()); + m_PropStage.setFPSText(_document._fps); } else if (l_properties[j].getName() == "background") { - vector l_colors = parseColorString(l_properties[j].getValue()); - _document.Project._backgroundColor = ColorData(l_colors[0], l_colors[1], l_colors[2]); + std::vector l_colors = parseColorString(l_properties[j].getValue()); + _document._backgroundColor = ColorData(l_colors[0], l_colors[1], l_colors[2]); m_PropStage.setBackgroundColor(getStageBG()); } else if (l_properties[j].getName() == "scenes") { l_sceneCount = StringHelper::toUnsignedInteger(l_properties[j].getValue()); @@ -3861,23 +4547,26 @@ void Kage::parseKAGE_Children(vector p_children) { } parseKSF_Children(p_children[i]._children); } - if (l_sceneCount != UINT_MAX && l_sceneCount != 0) { - cout << "missing " << l_sceneCount << " scene/s" << endl; + if (l_sceneCount != 0) { + std::cout << "missing " << l_sceneCount << " scene/s" << std::endl; } - if (l_assetCount != UINT_MAX && l_assetCount != 0) { - cout << "missing " << l_assetCount << " asset/s" << endl; + if (l_assetCount != 0) { + std::cout << "missing " << l_assetCount << " asset/s" << std::endl; } _stage.invalidateToRender(); + _timeline.forceRender(); + _layers.forceRender(); + _scenes.forceRender(); refreshUI(); } -void Kage::parseKAGE(string p_content) { +void Kage::parseKAGE(std::string p_content) { BasicXml _xml; std::cout << "parsing... " << p_content.length() << std::endl; if (_xml.parse(p_content)) { if (_xml.tokenize()) { XmlTag l_root = _xml.getRoot(); if (l_root.getName() == "KageStudio") { - vector l_xmlTagProperties = l_root.getProperties(); + std::vector l_xmlTagProperties = l_root.getProperties(); if (l_xmlTagProperties.size() > 0 && l_xmlTagProperties[0].getName() == "version" && l_xmlTagProperties[0].getValue() == "2023.06.24" @@ -3897,198 +4586,214 @@ void Kage::parseKAGE(string p_content) { updateStatus("Loading Error 2: Unabe to load " + kagePath); } } -void Kage::parseKSF_Children(vector p_children) { +void Kage::parseKSF_Children(std::vector p_children) { unsigned int l_layerCount = UINT_MAX; unsigned int l_frameCount = UINT_MAX; unsigned int l_frameCounter = UINT_MAX; - for (unsigned int i = 0; i < p_children.size(); ++i) { - string l_tagname = p_children[i].getName(); - vector l_properties = p_children[i].getProperties(); - if (l_tagname.substr(0, 5) == "layer") { - unsigned int l_layer = StringHelper::toUnsignedInteger(l_tagname.substr(5)); - cout << "\t\t\t\t\tl_tagname LAYER\t" << l_layer << "\t" << l_properties.size() << endl; - while (l_layer > _document.Scenes[_document.getActiveSceneID()].layerCount()) { - _document.Scenes[_document.getActiveSceneID()].addLayer(_layerManager.addLayer()); - _document.Scenes[_document.getActiveSceneID()].setCurrentLayer(_layerManager.layerCount()); - } - - for (unsigned int l_propertyIndex = 0; l_propertyIndex < l_properties.size(); ++l_propertyIndex) { - cout << "\t\t\t\t\t\tA l_properties[" << l_propertyIndex << "].getName() " << l_properties[l_propertyIndex].getName() << " = " << l_properties[l_propertyIndex].getValue() << " ? " << StringHelper::toBoolean(l_properties[l_propertyIndex].getValue()) << endl; - if (l_properties[l_propertyIndex].getName() == "label") { - _layerManager.setLabel(l_properties[l_propertyIndex].getValue()); - } else if (l_properties[l_propertyIndex].getName() == "visible") { - _layerManager.setVisible(StringHelper::toBoolean(l_properties[l_propertyIndex].getValue())); - } else if (l_properties[l_propertyIndex].getName() == "locked") { - _layerManager.setLock(StringHelper::toBoolean(l_properties[l_propertyIndex].getValue())); + try { + for (unsigned int i = 0; i < p_children.size(); ++i) { + std::string l_tagname = p_children[i].getName(); + std::vector l_properties = p_children[i].getProperties(); + if (l_tagname.substr(0, 5) == "layer") { + unsigned int l_layer = StringHelper::toUnsignedInteger(l_tagname.substr(5)); + std::cout << "\t\t\t\t\tl_tagname LAYER\t" << l_layer << "\t" << l_properties.size() << std::endl; + while (l_layer > _document.getScene()->Layers.size()) { + _document.getScene()->addLayer(); + _document.getScene()->setCurrentLayer(_document.getScene()->Layers.size(), false); } - } - _document.Scenes[_document.getActiveSceneID()].setCurrentLayer(l_layer); - --l_layerCount; - l_frameCounter = l_frameCount; - } else if (l_tagname.substr(0, 5) == "frame") { - unsigned int l_frame = StringHelper::toUnsignedInteger(l_tagname.substr(5)); - while (l_frame > _document.Scenes[_document.getActiveSceneID()].frameCount()) { - _document.Scenes[_document.getActiveSceneID()].addFrame(); - } - _document.Scenes[_document.getActiveSceneID()].setCurrentFrame(l_frame); - for (unsigned int l_propertyIndex = 0; l_propertyIndex < l_properties.size(); ++l_propertyIndex) { - if (l_properties[l_propertyIndex].getName() == "extend") { - if (l_properties[l_propertyIndex].getValue() == "start") { - _document.Scenes[_document.getActiveSceneID()].setFrameExtension(KageFrame::EXTENSION_START); - } else if (l_properties[l_propertyIndex].getValue() == "mid") { - _document.Scenes[_document.getActiveSceneID()].setFrameExtension(KageFrame::EXTENSION_MID); - } else if (l_properties[l_propertyIndex].getValue() == "end") { - _document.Scenes[_document.getActiveSceneID()].setFrameExtension(KageFrame::EXTENSION_END); + + for (unsigned int l_propertyIndex = 0; l_propertyIndex < l_properties.size(); ++l_propertyIndex) { + std::cout << "\t\t\t\t\t\tA l_properties[" << l_propertyIndex << "].getName() " << l_properties[l_propertyIndex].getName() << " = " << l_properties[l_propertyIndex].getValue() << " ? " << StringHelper::toBoolean(l_properties[l_propertyIndex].getValue()) << std::endl; + if (l_properties[l_propertyIndex].getName() == "label") { + _document.setLayerLabel(l_properties[l_propertyIndex].getValue()); + } else if (l_properties[l_propertyIndex].getName() == "visible") { + _document.setLayerVisible(StringHelper::toBoolean(l_properties[l_propertyIndex].getValue())); + } else if (l_properties[l_propertyIndex].getName() == "locked") { + _document.setLayerLocked(StringHelper::toBoolean(l_properties[l_propertyIndex].getValue())); } - } else if (l_properties[l_propertyIndex].getName() == "tween") { - string l_tweenValue = l_properties[l_propertyIndex].getValue(); - if (l_tweenValue == "true") { - _document.Scenes[_document.getActiveSceneID()].forceSetTween(11); - } else if (l_tweenValue == "false") { - _document.Scenes[_document.getActiveSceneID()].forceSetTween(0); - } else { - _document.Scenes[_document.getActiveSceneID()].forceSetTween(StringHelper::toUnsignedInteger(l_tweenValue)); + } + _document.getScene()->setCurrentLayer(l_layer, false); + --l_layerCount; + l_frameCounter = l_frameCount; + } else if (l_tagname.substr(0, 5) == "frame") { + unsigned int l_frame = StringHelper::toUnsignedInteger(l_tagname.substr(5)); + while (l_frame > _document.getScene()->frameCount()) { + if (_document.getScene()->addLayerFrame() == true) { + doDeleteFrame(); ///see addLayerFrame } } - } - --l_frameCounter; - } else if (l_tagname == "init") { - VectorDataManager v; - - vector l_numbers = parseNumbers(p_children[i]._value); //XY for rotation anchor - if (l_numbers.size() == 2) { - v.addInit(PointData(l_numbers[0]/_stage.currentScale, l_numbers[1]/_stage.currentScale)); - } else { - v.addInit(); - } - addDataToFrame(v, true); - } else if (l_tagname == "fill") { - VectorDataManager v; - string l_color = l_properties[0].getValue(); - if (l_color.length() > 3 && l_color.substr(0, 3) == "rgb") { - //RGB/RGBA - vector l_colors = parseColorString(l_properties[0].getValue()); //color - v.addFill(ColorData(l_colors[0], l_colors[1], l_colors[2], l_colors[3])); - } else { - //possible gradient ID - v.addFill(l_color); - } - addDataToFrame(v, true); - } else if (l_tagname == "stroke") { - VectorDataManager v; - vector l_colors = parseColorString(l_properties[0].getValue()); //color - StrokeColorData l_stroke = StrokeColorData(l_colors[0], l_colors[1], l_colors[2], l_colors[3]); - l_stroke.setThickness(StringHelper::toDouble(l_properties[1].getValue()));//thickness - v.addLineStyle(l_stroke); - addDataToFrame(v, true); - } else if (l_tagname == "move") { - VectorDataManager v; - vector l_numbers = parseNumbers(p_children[i]._value); //XY - v.addMove(PointData(l_numbers[0]/_stage.currentScale, l_numbers[1]/_stage.currentScale)); - addDataToFrame(v, true); - } else if (l_tagname == "cubiccurve" || l_tagname == "curve") { - VectorDataManager v; - vector l_numbers = parseNumbers(p_children[i]._value); //XYs - v.addCubic( - PointData(l_numbers[0]/_stage.currentScale, l_numbers[1]/_stage.currentScale), - PointData(l_numbers[2]/_stage.currentScale, l_numbers[3]/_stage.currentScale), - PointData(l_numbers[4]/_stage.currentScale, l_numbers[5]/_stage.currentScale)); - addDataToFrame(v, true); - } else if (l_tagname == "closepath") { - VectorDataManager v; - v.addClosePath(); - addDataToFrame(v, true); - } else if (l_tagname == "image") { - cout << "\n\n\tIMAGE " << endl; - double l_ID, l_buff; - double l_x = 0.0f; - double l_y = 0.0f; - double l_width = 0.0f, l_height = 0.0f; - double l_scaleX = 1.0f, l_scaleY = 1.0f; - double l_rotate = 0.0f, l_alpha = 1.0f; - for (unsigned int j = 0; j < l_properties.size(); ++j) { - if (l_properties[j].getName() == "id") { - l_ID = StringHelper::toDouble(l_properties[j].getValue()); - cout << "\tid " << l_ID << endl; - } else if (l_properties[j].getName() == "buff") { //placeholder -- not actually used - l_buff = StringHelper::toDouble(l_properties[j].getValue()); - cout << "\tbuff " << l_properties[j].getValue() << endl; - } else if (l_properties[j].getName() == "x") { - l_x = StringHelper::toDouble(l_properties[j].getValue())/_stage.currentScale; - cout << "\tx " << l_x << endl; - } else if (l_properties[j].getName() == "y") { - l_y = StringHelper::toDouble(l_properties[j].getValue())/_stage.currentScale; - cout << "\ty " << l_y << "\t" << l_y << endl; - } else if (l_properties[j].getName() == "width") { - l_width = StringHelper::toDouble(l_properties[j].getValue())/_stage.currentScale; - cout << "\twidth " << l_width << endl; - } else if (l_properties[j].getName() == "height") { - l_height = StringHelper::toDouble(l_properties[j].getValue())/_stage.currentScale; - cout << "\theight " << l_height << endl; - } else if (l_properties[j].getName() == "scaleX") { - l_scaleX = StringHelper::toDouble(l_properties[j].getValue()); - cout << "\tscaleX " << l_scaleX << endl; - } else if (l_properties[j].getName() == "scaleY") { - l_scaleY = StringHelper::toDouble(l_properties[j].getValue()); - cout << "\tscaleY " << l_scaleY << endl; - } else if (l_properties[j].getName() == "scale") { - l_scaleX = StringHelper::toDouble(l_properties[j].getValue()); - l_scaleY = StringHelper::toDouble(l_properties[j].getValue()); - cout << "\tscale " << l_scaleX << "\t" << l_scaleY << endl; - } else if (l_properties[j].getName() == "rotate") { - l_rotate = StringHelper::toDouble(l_properties[j].getValue()); - cout << "\trotate " << l_rotate << endl; - } else if (l_properties[j].getName() == "alpha") { - l_alpha = StringHelper::toDouble(l_properties[j].getValue()); - cout << "\talpha " << l_alpha << endl; - } else if (l_properties[j].getName() == "hash") { - //hash = l_properties[j].getValue(); - cout << "\thash " << l_properties[j].getValue() << endl; + _document.getScene()->setLayerCurrentFrame(l_frame, false); + for (unsigned int l_propertyIndex = 0; l_propertyIndex < l_properties.size(); ++l_propertyIndex) { + if (l_properties[l_propertyIndex].getName() == "extend") { + if (l_properties[l_propertyIndex].getValue() == "start") { + _document.getScene()->setFrameExtension(KageFrame::extension::EXTENSION_START); + } else if (l_properties[l_propertyIndex].getValue() == "mid") { + _document.getScene()->setFrameExtension(KageFrame::extension::EXTENSION_MID); + } else if (l_properties[l_propertyIndex].getValue() == "end") { + _document.getScene()->setFrameExtension(KageFrame::extension::EXTENSION_END); + } + } else if (l_properties[l_propertyIndex].getName() == "tween") { + std::string l_tweenValue = l_properties[l_propertyIndex].getValue(); + if (l_tweenValue == "true") { + _document.getScene()->forceSetTween(11); + } else if (l_tweenValue == "false") { + _document.getScene()->forceSetTween(0); + } else { + _document.getScene()->forceSetTween(StringHelper::toUnsignedInteger(l_tweenValue)); + } + } } - } - cout << endl << endl << endl; - //TODO: if width/height is 0/0, get actual width height from loaded image resource - PointData p1( l_ID, l_buff); - PointData p2( l_x, l_y); - PointData p3( l_width, l_height); - PointData p4( l_scaleX, l_scaleY); - PointData p5( l_rotate, l_alpha); - VectorDataManager v; - v.addImage(p1, p2, p3, p4, p5); - addDataToFrame(v, true); - } else if (l_tagname == "stage") { - for (unsigned int j = 0; j < l_properties.size(); ++j) { - if (l_properties[j].getName() == "layers") { - l_layerCount = StringHelper::toUnsignedInteger(l_properties[j].getValue()); - } else if (l_properties[j].getName() == "frames") { - l_frameCount = StringHelper::toUnsignedInteger(l_properties[j].getValue()); + --l_frameCounter; + } else if (l_tagname == "init") { + VectorDataManager v; + + std::vector l_numbers = parseNumbers(p_children[i]._value); //XY for rotation anchor + if (l_numbers.size() == 2) { + v.addInit(PointData(l_numbers[0]/_stage.currentScale, l_numbers[1]/_stage.currentScale)); + } else { + v.addInit(); + } + addDataToFrame(v, true); + } else if (l_tagname == "fill") { + VectorDataManager v; + std::string l_color = l_properties[0].getValue(); + if (l_color.length() > 3 && l_color.substr(0, 3) == "rgb") { + //RGB/RGBA + std::vector l_colors = parseColorString(l_properties[0].getValue()); //color + v.addFill(ColorData(l_colors[0], l_colors[1], l_colors[2], l_colors[3])); + } else { + //possible gradient ID + v.addFill(l_color); + } + addDataToFrame(v, true); + } else if (l_tagname == "stroke") { + VectorDataManager v; + std::vector l_colors = parseColorString(l_properties[0].getValue()); //color + StrokeColorData l_stroke = StrokeColorData(l_colors[0], l_colors[1], l_colors[2], l_colors[3]); + l_stroke.setThickness(StringHelper::toDouble(l_properties[1].getValue()));//thickness + v.addLineStyle(l_stroke); + addDataToFrame(v, true); + } else if (l_tagname == "move") { + VectorDataManager v; + std::vector l_numbers = parseNumbers(p_children[i]._value); //XY + v.addMove(PointData(l_numbers[0]/_stage.currentScale, l_numbers[1]/_stage.currentScale)); + addDataToFrame(v, true); + } else if (l_tagname == "cubiccurve" || l_tagname == "curve") { + VectorDataManager v; + std::vector l_numbers = parseNumbers(p_children[i]._value); //XYs + v.addCubic( + PointData(l_numbers[0]/_stage.currentScale, l_numbers[1]/_stage.currentScale), + PointData(l_numbers[2]/_stage.currentScale, l_numbers[3]/_stage.currentScale), + PointData(l_numbers[4]/_stage.currentScale, l_numbers[5]/_stage.currentScale)); + addDataToFrame(v, true); + } else if (l_tagname == "closepath") { + VectorDataManager v; + v.addClosePath(); + addDataToFrame(v, true); + } else if (l_tagname == "image") { + std::cout << "\n\n\tIMAGE " << std::endl; + double l_ID, l_buff; + double l_x = 0.0f; + double l_y = 0.0f; + double l_width = 0.0f, l_height = 0.0f; + double l_scaleX = 1.0f, l_scaleY = 1.0f; + double l_rotate = 0.0f, l_alpha = 1.0f; + for (unsigned int j = 0; j < l_properties.size(); ++j) { + if (l_properties[j].getName() == "id") { + l_ID = StringHelper::toDouble(l_properties[j].getValue()); + std::cout << "\tid " << l_ID << std::endl; + } else if (l_properties[j].getName() == "buff") { //placeholder -- not actually used + l_buff = StringHelper::toDouble(l_properties[j].getValue()); + std::cout << "\tbuff " << l_properties[j].getValue() << std::endl; + } else if (l_properties[j].getName() == "x") { + l_x = StringHelper::toDouble(l_properties[j].getValue())/_stage.currentScale; + std::cout << "\tx " << l_x << std::endl; + } else if (l_properties[j].getName() == "y") { + l_y = StringHelper::toDouble(l_properties[j].getValue())/_stage.currentScale; + std::cout << "\ty " << l_y << "\t" << l_y << std::endl; + } else if (l_properties[j].getName() == "width") { + l_width = StringHelper::toDouble(l_properties[j].getValue())/_stage.currentScale; + std::cout << "\twidth " << l_width << std::endl; + } else if (l_properties[j].getName() == "height") { + l_height = StringHelper::toDouble(l_properties[j].getValue())/_stage.currentScale; + std::cout << "\theight " << l_height << std::endl; + } else if (l_properties[j].getName() == "scaleX") { + l_scaleX = StringHelper::toDouble(l_properties[j].getValue()); + std::cout << "\tscaleX " << l_scaleX << std::endl; + } else if (l_properties[j].getName() == "scaleY") { + l_scaleY = StringHelper::toDouble(l_properties[j].getValue()); + std::cout << "\tscaleY " << l_scaleY << std::endl; + } else if (l_properties[j].getName() == "scale") { + l_scaleX = StringHelper::toDouble(l_properties[j].getValue()); + l_scaleY = StringHelper::toDouble(l_properties[j].getValue()); + std::cout << "\tscale " << l_scaleX << "\t" << l_scaleY << std::endl; + } else if (l_properties[j].getName() == "rotate") { + l_rotate = StringHelper::toDouble(l_properties[j].getValue()); + std::cout << "\trotate " << l_rotate << std::endl; + } else if (l_properties[j].getName() == "alpha") { + l_alpha = StringHelper::toDouble(l_properties[j].getValue()); + std::cout << "\talpha " << l_alpha << std::endl; + } else if (l_properties[j].getName() == "hash") { + //hash = l_properties[j].getValue(); + std::cout << "\thash " << l_properties[j].getValue() << std::endl; + } + } + std::cout << std::endl << std::endl << std::endl; + //TODO: if width/height is 0/0, get actual width height from loaded image resource + PointData p1( l_ID, l_buff); + PointData p2( l_x, l_y); + PointData p3( l_width, l_height); + PointData p4( l_scaleX, l_scaleY); + PointData p5( l_rotate, l_alpha); + VectorDataManager v; + v.addImage(p1, p2, p3, p4, p5); + addDataToFrame(v, true); + } else if (l_tagname == "stage") { + for (unsigned int j = 0; j < l_properties.size(); ++j) { + if (l_properties[j].getName() == "width" && gotWidth == false) { + _document._width = StringHelper::toUnsignedInteger(l_properties[j].getValue()); + m_PropStage.setWidthText(_document._width); + } else if (l_properties[j].getName() == "height" && gotHeight == false) { + _document._height = StringHelper::toUnsignedInteger(l_properties[j].getValue()); + m_PropStage.setHeightText(_document._height); + } else if (l_properties[j].getName() == "layers") { + l_layerCount = StringHelper::toUnsignedInteger(l_properties[j].getValue()); + } else if (l_properties[j].getName() == "frames") { + l_frameCount = StringHelper::toUnsignedInteger(l_properties[j].getValue()); + } } } + + parseKSF_Children(p_children[i]._children); + if (l_tagname == "fill") { //what's this for? + VectorDataManager v; + v.addEndFill(); + addDataToFrame(v, true); + } } - parseKSF_Children(p_children[i]._children); - if (l_tagname == "fill") { //what's this for? - VectorDataManager v; - v.addEndFill(); - addDataToFrame(v, true); + if (l_layerCount != UINT_MAX && l_layerCount != 0) { + std::cout << "missing " << l_layerCount << " layer/s" << std::endl; } - } - if (l_layerCount != UINT_MAX && l_layerCount != 0) { - cout << "missing " << l_layerCount << " layer/s" << endl; - } - if (l_frameCount != UINT_MAX && l_frameCounter != 0) { - cout << "missing " << l_frameCounter << " frame/s" << endl; + if (l_frameCount != UINT_MAX && l_frameCounter != 0) { + std::cout << "missing " << l_frameCounter << " frame/s" << std::endl; + } + } catch (std::exception& e) { + std::cout << "Kage::parseKSF_Children Exception : " << e.what() << std::endl; } _stage.invalidateToRender(); + _timeline.forceRender(); + _layers.forceRender(); + _scenes.forceRender(); refreshUI(); } -void Kage::parseKSF(string p_content) { +void Kage::parseKSF(std::string p_content) { BasicXml _xml; std::cout << "parsing... " << p_content.length() << std::endl; if (_xml.parse(p_content)) { if (_xml.tokenize()) { XmlTag l_root = _xml.getRoot(); if (l_root.getName() == "KageStudio") { - vector l_xmlTagProperties = l_root.getProperties(); + std::vector l_xmlTagProperties = l_root.getProperties(); if (l_xmlTagProperties.size() > 0 && l_xmlTagProperties[0].getName() == "version" && @@ -4197,17 +4902,17 @@ void Kage::focusOnStage() { void Kage::setStageBG(Gdk::Color p_c) { - _document.Project._backgroundColor.setR(p_c.get_red() / 255); - _document.Project._backgroundColor.setG(p_c.get_green() / 255); - _document.Project._backgroundColor.setB(p_c.get_blue() / 255); + _document._backgroundColor.setR(p_c.get_red() / 255); + _document._backgroundColor.setG(p_c.get_green() / 255); + _document._backgroundColor.setB(p_c.get_blue() / 255); _stage.invalidateToRender(); } Gdk::Color Kage::getStageBG() { Gdk::Color l_c; - l_c.set_red((gushort)_document.Project._backgroundColor.getR() * 255); - l_c.set_green((gushort)_document.Project._backgroundColor.getG() * 255); - l_c.set_blue((gushort)_document.Project._backgroundColor.getB() * 255); + l_c.set_red((gushort)_document._backgroundColor.getR() * 255); + l_c.set_green((gushort)_document._backgroundColor.getG() * 255); + l_c.set_blue((gushort)_document._backgroundColor.getB() * 255); return l_c; } \ No newline at end of file diff --git a/studio/kage.h b/studio/kage.h index 8e23abf..b43d585 100644 --- a/studio/kage.h +++ b/studio/kage.h @@ -49,10 +49,10 @@ #include "kage/data/layer.h" #include "kage/data/scene.h" #include "kage/document.h" + #include "kage/project.h" #include "about.h" // #include "register.h" -- not implemented yet; this is to gather users for support group - #include "kage/unre/kagedo.h" #include "kage/unre/unre.h" #include "util/xml/xmltoken.h" @@ -71,7 +71,7 @@ class Kage : public Gtk::Window { public: - Kage(string p_filePath); + Kage(std::string p_filePath); virtual ~Kage(); void addDataToFrame(VectorDataManager v, bool p_force = false); @@ -85,15 +85,15 @@ void renderFrames(); void renderFramesBelowCurrentLayer(); void renderFramesAboveCurrentLayer(); - string saveFrame(); - string dumpFrame(bool bKS); - string dumpFrameToSvg(); + std::string saveFrame(); + std::string dumpFrame(bool bKS); + std::string dumpFrameToSvg(); unsigned int getTween(); - string int255ToHex(unsigned int p); + std::string int255ToHex(unsigned int p); char int15ToHex(unsigned int p); - unsigned int hexToInt255(string p); + unsigned int hexToInt255(std::string p); unsigned int hexToInt15(char p); KageScenesUI _scenes; @@ -187,12 +187,12 @@ void doOpenKAGE(); void doOpenKSF(); - void doSaveProjectDialog(string p_title); - void doSaveProject(string p_filename); - void doSaveDialog(string p_title); - bool doSaveKSF(string p_filename); + void doSaveProjectDialog(std::string p_title); + void doSaveProject(std::string p_filename); + void doSaveDialog(std::string p_title); + bool doSaveKSF(std::string p_filename); - void doExportPNGDialog(string p_title, bool p_transparent); + void doExportPNGDialog(std::string p_title, bool p_transparent); //Member widgets: Gtk::VBox m_VBoxRoot; @@ -339,7 +339,7 @@ void btnAbout_onClick(); void CheckUpdate_onClick(); void Website_onClick(); - void openWebsite(string p_url); + void openWebsite(std::string p_url); std::vector toggleButtons; std::vector> toggleButtons_pixbuf; std::vector toggleButtons_img; @@ -359,33 +359,34 @@ unsigned m_ContextId; bool kageInited; - string kagePath; + std::string kagePath; std::ofstream kageFile; bool ksfInited; - string ksfPath; + std::string ksfPath; std::ofstream ksfFile; bool expInited; - string expPath; + std::string expPath; std::ofstream expFile; - bool dtrace(string p_msg); - bool saveKageStudio(string p_path, string p_msg); - bool saveKageStudioFile(string p_path, string p_msg); - bool exportHtml5(string p_path, string p_msg); - bool exportSvg(string p_path, string p_msg); - bool exportKonsolScript(string p_path, string p_msg); - bool dump(string p_path, string p_msg); - bool fileWrite(string p_path, string p_msg, std::ofstream &p_file, bool &p_flag); - - string openTextFile(string p_path); - std::vector parseNumbers(string p_numbers); - std::vector parseColorString(string p_color); - void parseKAGE_Children(vector p_children); - void parseKAGE(string p_content); - void parseKSF_Children(vector p_children); - void parseKSF(string p_content); - bool runExternal(string p_cmd, string p_param); + bool dtrace(std::string p_msg); + bool saveKageStudio(std::string p_path, std::string p_msg); + bool saveKageStudioFile(std::string p_path, std::string p_msg); + bool exportHtml5(std::string p_path, std::string p_msg); + bool exportSvg(std::string p_path, std::string p_msg); + bool exportKonsolScript(std::string p_path, std::string p_msg); + bool dump(std::string p_path, std::string p_msg); + bool fileWrite(std::string p_path, std::string p_msg, std::ofstream &p_file, bool &p_flag); + + std::string openTextFile(std::string p_path); + std::vector parseNumbers(std::string p_numbers); + std::vector parseColorString(std::string p_color); + void parseKAGE_Children(std::vector p_children); + void parseKAGE(std::string p_content); + void parseKSF_Children(std::vector p_children); + void parseKSF(std::string p_content); + std::string runExternalGetResult(std::string p_cmd, std::string p_param); + bool runExternal(std::string p_cmd, std::string p_param); void Play_onClick(); void PlayFrame_onClick(); @@ -418,7 +419,6 @@ int _area_properties_pane1; int _area_properties_pane2; - bool m_LabelScene_onClick(GdkEventButton *event);//, gpointer user_data); bool m_LabelLibrary_onClick(GdkEventButton *event);//, gpointer user_data); public: KageStage _stage; @@ -438,7 +438,7 @@ void Stop_onClick(); bool _isPlaying; - void toolsButtonToggle(string p_toolTip); + void toolsButtonToggle(std::string p_toolTip); void ToolSelect_onClick(); @@ -474,7 +474,7 @@ bool isLayerLocked(); unsigned int getDocumentCurrentScene(); - void setDocumentCurrentScene(unsigned int p_scene); + bool setDocumentCurrentScene(unsigned int p_scene); unsigned int getDocumentSceneCurrentLayer(); void setDocumentSceneCurrentLayer(unsigned int p_layer, bool p_addSelected); unsigned int getDocumentSceneLayerCurrentFrame(); @@ -488,7 +488,7 @@ void refreshUI(); void focusOnStage(); - KageDocument _document; + KageProject _document; KageDocument _documentCopyBuffer; ///will contain copied Scene/s, its Layer/s, it's Frames std::vector g_copiedData; std::vector g_selectedItems; diff --git a/studio/kage/data/frame.cpp b/studio/kage/data/frame.cpp index e2e9d36..fe44e30 100644 --- a/studio/kage/data/frame.cpp +++ b/studio/kage/data/frame.cpp @@ -31,11 +31,46 @@ KageFrame::KageFrame(KageLayer *p_layer, unsigned int p_frameID) : setCurrent(false); forceSetTween(false); setNull(false); - setExtension(KageFrame::EXTENSION_NOT); + setExtension(KageFrame::extension::EXTENSION_NOT); +} + +KageFrame KageFrame::operator=(const KageFrame &p_frame) { + if (this == &p_frame) { + return *this; + } + KageScene::LOADING_MODE = true; + + this->data = p_frame.data; + this->frameID = p_frame.frameID; + this->_null = p_frame._null; + this->_selected = p_frame._selected; + this->_current = p_frame._current; + this->_tweenX = p_frame._tweenX; + this->_tweenY = p_frame._tweenY; + this->_extension = p_frame._extension; + + this->vectorsData._selectedNodes.clear(); + this->vectorsData._selectedNodes = p_frame.vectorsData._selectedNodes; + + this->vectorsData._selectedShapes.clear(); + this->vectorsData._selectedShapes = p_frame.vectorsData._selectedShapes; + this->vectorsData.vectorData.clear(); + //std::cout << "\t\t\t\tKageFrame KageFrame::operator= vectorData || " << p_frame.vectorsData.vectorData.size() << std::endl; + for (unsigned int l_vectorIndex = 0; l_vectorIndex < p_frame.vectorsData.vectorData.size(); ++l_vectorIndex) { + this->vectorsData.vectorData.push_back( + p_frame.vectorsData.vectorData[l_vectorIndex] + ); + //TODO: make sure X/Y of all vector data are copied over + //std::cout << "\t\t\t\tKageFrame KageFrame::operator= vectorData || " << this->vectorsData.vectorData.size() << std::endl; + } + KageScene::LOADING_MODE = false; + //std::cout << "\t\t\tKageFrame KageFrame::operator= >> " << this << "\t" << this->frameID << std::endl; + return *this; } KageFrame::~KageFrame() { - vectorsData.clear(); + //TODO: revisit +// vectorsData.clear(); } void KageFrame::setSelected(bool p_selected) { @@ -68,9 +103,9 @@ void KageFrame::setTween(unsigned int p_tween) { return; } std::cout << " KageFrame::setTween() @ " << frameID << " " << p_tween << std::endl; - if ( _extension == KageFrame::EXTENSION_NOT) { + if ( _extension == KageFrame::extension::EXTENSION_NOT) { forceSetTween(p_tween); - } else if (_extension == KageFrame::EXTENSION_START) { + } else if (_extension == KageFrame::extension::EXTENSION_START) { forceSetTween(p_tween); _layer->setExtendedFrameTween(frameID, p_tween); } else { @@ -91,12 +126,12 @@ bool KageFrame::isCurrent() { VectorDataManager KageFrame::getFrameData() { if (_null == true) { - std::cout << "KageFrame::getFrameData is returning empty" << std::endl; VectorDataManager l_nullReturn; return l_nullReturn; } - if ( _extension == KageFrame::EXTENSION_NOT - || _extension == KageFrame::EXTENSION_START) { + + if ( _extension == KageFrame::extension::EXTENSION_NOT + || _extension == KageFrame::extension::EXTENSION_START) { return vectorsData; } else { return _layer->getPreviousFrameData(frameID); @@ -106,8 +141,8 @@ void KageFrame::setFrameData(VectorDataManager p_vectorsData) { if (_null == true) { setNull(false); } - if ( _extension == KageFrame::EXTENSION_NOT - || _extension == KageFrame::EXTENSION_START) { + if ( _extension == KageFrame::extension::EXTENSION_NOT + || _extension == KageFrame::extension::EXTENSION_START) { vectorsData.setVectorData(p_vectorsData.getVectorData()); } else { _layer->setFrameDataToPreviousFrame(p_vectorsData, frameID); @@ -115,17 +150,17 @@ void KageFrame::setFrameData(VectorDataManager p_vectorsData) { } bool KageFrame::isEmpty() { - if ( _extension == KageFrame::EXTENSION_NOT - || _extension == KageFrame::EXTENSION_START) { + if ( _extension == KageFrame::extension::EXTENSION_NOT + || _extension == KageFrame::extension::EXTENSION_START) { return (vectorsData.getVectorData().size() == 0); } else { return (_layer->getPreviousFrameData(frameID).getVectorData().size() <= 1); } } -vector KageFrame::raiseSelectedShape(vector p_selectedShapes) { - if ( _extension == KageFrame::EXTENSION_NOT - || _extension == KageFrame::EXTENSION_START) { +std::vector KageFrame::raiseSelectedShape(std::vector p_selectedShapes) { + if ( _extension == KageFrame::extension::EXTENSION_NOT + || _extension == KageFrame::extension::EXTENSION_START) { return vectorsData.raiseSelectedShape(p_selectedShapes); } else { VectorDataManager l_vectorData = _layer->getPreviousFrameData(frameID); @@ -134,9 +169,9 @@ vector KageFrame::raiseSelectedShape(vector p_select return l_selectedShapes; } } -vector KageFrame::lowerSelectedShape(vector p_selectedShapes) { - if ( _extension == KageFrame::EXTENSION_NOT - || _extension == KageFrame::EXTENSION_START) { +std::vector KageFrame::lowerSelectedShape(std::vector p_selectedShapes) { + if ( _extension == KageFrame::extension::EXTENSION_NOT + || _extension == KageFrame::extension::EXTENSION_START) { return vectorsData.lowerSelectedShape(p_selectedShapes); } else { VectorDataManager l_vectorData = _layer->getPreviousFrameData(frameID); @@ -145,9 +180,9 @@ vector KageFrame::lowerSelectedShape(vector p_select return l_selectedShapes; } } -vector KageFrame::raiseToTopSelectedShape(vector p_selectedShapes) { - if ( _extension == KageFrame::EXTENSION_NOT - || _extension == KageFrame::EXTENSION_START) { +std::vector KageFrame::raiseToTopSelectedShape(std::vector p_selectedShapes) { + if ( _extension == KageFrame::extension::EXTENSION_NOT + || _extension == KageFrame::extension::EXTENSION_START) { return vectorsData.raiseToTopSelectedShape(p_selectedShapes); } else { VectorDataManager l_vectorData = _layer->getPreviousFrameData(frameID); @@ -156,9 +191,9 @@ vector KageFrame::raiseToTopSelectedShape(vector p_s return l_selectedShapes; } } -vector KageFrame::lowerToBottomSelectedShape(vector p_selectedShapes) { - if ( _extension == KageFrame::EXTENSION_NOT - || _extension == KageFrame::EXTENSION_START) { +std::vector KageFrame::lowerToBottomSelectedShape(std::vector p_selectedShapes) { + if ( _extension == KageFrame::extension::EXTENSION_NOT + || _extension == KageFrame::extension::EXTENSION_START) { return vectorsData.lowerToBottomSelectedShape(p_selectedShapes); } else { VectorDataManager l_vectorData = _layer->getPreviousFrameData(frameID); @@ -168,9 +203,9 @@ vector KageFrame::lowerToBottomSelectedShape(vector } } -vector KageFrame::groupSelectedShapes(vector p_selectedShapes) { - if ( _extension == KageFrame::EXTENSION_NOT - || _extension == KageFrame::EXTENSION_START) { +std::vector KageFrame::groupSelectedShapes(std::vector p_selectedShapes) { + if ( _extension == KageFrame::extension::EXTENSION_NOT + || _extension == KageFrame::extension::EXTENSION_START) { return vectorsData.groupSelectedShapes(p_selectedShapes); } else { VectorDataManager l_vectorData = _layer->getPreviousFrameData(frameID); @@ -179,9 +214,9 @@ vector KageFrame::groupSelectedShapes(vector p_selec return l_selectedShapes; } } -vector KageFrame::ungroupSelectedShapes(vector p_selectedShapes) { - if ( _extension == KageFrame::EXTENSION_NOT - || _extension == KageFrame::EXTENSION_START) { +std::vector KageFrame::ungroupSelectedShapes(std::vector p_selectedShapes) { + if ( _extension == KageFrame::extension::EXTENSION_NOT + || _extension == KageFrame::extension::EXTENSION_START) { return vectorsData.ungroupSelectedShapes(p_selectedShapes); } else { VectorDataManager l_vectorData = _layer->getPreviousFrameData(frameID); @@ -191,9 +226,9 @@ vector KageFrame::ungroupSelectedShapes(vector p_sel } } -vector KageFrame::duplicateShapes(vector p_selectedShapes) { - if ( _extension == KageFrame::EXTENSION_NOT - || _extension == KageFrame::EXTENSION_START) { +std::vector KageFrame::duplicateShapes(std::vector p_selectedShapes) { + if ( _extension == KageFrame::extension::EXTENSION_NOT + || _extension == KageFrame::extension::EXTENSION_START) { return vectorsData.duplicateShapes(p_selectedShapes); } else { VectorDataManager l_vectorData = _layer->getPreviousFrameData(frameID); @@ -203,9 +238,9 @@ vector KageFrame::duplicateShapes(vector p_selectedS } } -bool KageFrame::flipHorizontalSelectedShape(vector p_selectedShapes) { - if ( _extension == KageFrame::EXTENSION_NOT - || _extension == KageFrame::EXTENSION_START) { +bool KageFrame::flipHorizontalSelectedShape(std::vector p_selectedShapes) { + if ( _extension == KageFrame::extension::EXTENSION_NOT + || _extension == KageFrame::extension::EXTENSION_START) { return vectorsData.flipHorizontalSelectedShape(p_selectedShapes); } else { VectorDataManager l_vectorData = _layer->getPreviousFrameData(frameID); @@ -214,9 +249,9 @@ bool KageFrame::flipHorizontalSelectedShape(vector p_selectedShape return l_selectedShapes; } } -bool KageFrame::flipVerticalSelectedShape(vector p_selectedShapes) { - if ( _extension == KageFrame::EXTENSION_NOT - || _extension == KageFrame::EXTENSION_START) { +bool KageFrame::flipVerticalSelectedShape(std::vector p_selectedShapes) { + if ( _extension == KageFrame::extension::EXTENSION_NOT + || _extension == KageFrame::extension::EXTENSION_START) { return vectorsData.flipVerticalSelectedShape(p_selectedShapes); } else { VectorDataManager l_vectorData = _layer->getPreviousFrameData(frameID); @@ -225,9 +260,9 @@ bool KageFrame::flipVerticalSelectedShape(vector p_selectedShapes) return l_selectedShapes; } } -bool KageFrame::recenterRotationPoint(vector p_selectedShapes) { - if ( _extension == KageFrame::EXTENSION_NOT - || _extension == KageFrame::EXTENSION_START) { +bool KageFrame::recenterRotationPoint(std::vector p_selectedShapes) { + if ( _extension == KageFrame::extension::EXTENSION_NOT + || _extension == KageFrame::extension::EXTENSION_START) { return vectorsData.recenterRotationPoint(p_selectedShapes); } else { VectorDataManager l_vectorData = _layer->getPreviousFrameData(frameID); @@ -237,8 +272,8 @@ bool KageFrame::recenterRotationPoint(vector p_selectedShapes) { } } void KageFrame::addDataToFrame(VectorDataManager v) { - if ( _extension == KageFrame::EXTENSION_NOT - || _extension == KageFrame::EXTENSION_START) { + if ( _extension == KageFrame::extension::EXTENSION_NOT + || _extension == KageFrame::extension::EXTENSION_START) { if (_null == true) { setNull(false); } @@ -248,14 +283,14 @@ void KageFrame::addDataToFrame(VectorDataManager v) { } } -vector KageFrame::copySelectedShapes(vector p_selectedShapes) { +std::vector KageFrame::copySelectedShapes(std::vector p_selectedShapes) { return vectorsData.copySelectedShapes(p_selectedShapes); } -vector KageFrame::pasteSelectedShapes(vector p_copiedShapes) { +std::vector KageFrame::pasteSelectedShapes(std::vector p_copiedShapes) { return vectorsData.pasteSelectedShapes(p_copiedShapes); } -bool KageFrame::deleteSelectedShapes(vector p_selectedShapes) { +bool KageFrame::deleteSelectedShapes(std::vector p_selectedShapes) { return vectorsData.deleteSelectedShapes(p_selectedShapes); } \ No newline at end of file diff --git a/studio/kage/data/frame.h b/studio/kage/data/frame.h index bf57683..cada473 100644 --- a/studio/kage/data/frame.h +++ b/studio/kage/data/frame.h @@ -29,13 +29,9 @@ #include - using namespace std; - class KageLayer; //forward declaration class KageFrame { - unsigned int ID; - //================================ public: enum extension { EXTENSION_NOT, @@ -50,6 +46,7 @@ //Glib::RefPtr window; KageFrame(KageLayer *p_layer, unsigned int p_frameID); + KageFrame operator=(const KageFrame &p_frame); virtual ~KageFrame(); bool isEmpty(); @@ -76,29 +73,29 @@ static bool _gotFocus; - std::vector raiseSelectedShape(vector p_selectedShapes); - std::vector lowerSelectedShape(vector p_selectedShapes); - std::vector raiseToTopSelectedShape(vector p_selectedShapes); - std::vector lowerToBottomSelectedShape(vector p_selectedShapes); - std::vector groupSelectedShapes(vector p_selectedShapes); - std::vector ungroupSelectedShapes(vector p_selectedShapes); - std::vector duplicateShapes(vector p_selectedShapes); - bool flipHorizontalSelectedShape(vector p_selectedShapes); - bool flipVerticalSelectedShape(vector p_selectedShapes); + std::vector raiseSelectedShape(std::vector p_selectedShapes); + std::vector lowerSelectedShape(std::vector p_selectedShapes); + std::vector raiseToTopSelectedShape(std::vector p_selectedShapes); + std::vector lowerToBottomSelectedShape(std::vector p_selectedShapes); + std::vector groupSelectedShapes(std::vector p_selectedShapes); + std::vector ungroupSelectedShapes(std::vector p_selectedShapes); + std::vector duplicateShapes(std::vector p_selectedShapes); + bool flipHorizontalSelectedShape(std::vector p_selectedShapes); + bool flipVerticalSelectedShape(std::vector p_selectedShapes); - bool recenterRotationPoint(vector p_selectedShapes); + bool recenterRotationPoint(std::vector p_selectedShapes); void addDataToFrame(VectorDataManager v); - std::vector copySelectedShapes(vector p_selectedShapes); - std::vector pasteSelectedShapes(vector p_copiedShapes); - bool deleteSelectedShapes(vector p_selectedShapes); - protected: + std::vector copySelectedShapes(std::vector p_selectedShapes); + std::vector pasteSelectedShapes(std::vector p_copiedShapes); + bool deleteSelectedShapes(std::vector p_selectedShapes); + bool _null; bool _selected; bool _current; unsigned int _tweenX; unsigned int _tweenY; - public: + KageFrame::extension _extension; KageLayer *_layer; diff --git a/studio/kage/data/layer.cpp b/studio/kage/data/layer.cpp index d7d090c..4997893 100644 --- a/studio/kage/data/layer.cpp +++ b/studio/kage/data/layer.cpp @@ -35,40 +35,75 @@ KageLayer::KageLayer(KageScene *p_scene, unsigned int p_layerID, unsigned int p_ addFrame(); } if (KageScene::LOADING_MODE == false && p_frameCount > 1) { - Frames[0]->setExtension(KageFrame::EXTENSION_START); + Frames[0]->setExtension(KageFrame::extension::EXTENSION_START); for (unsigned int i = 1; i < p_frameCount; ++i) { - Frames[i]->setExtension(KageFrame::EXTENSION_MID); + Frames[i]->setExtension(KageFrame::extension::EXTENSION_MID); } - Frames[p_frameCount-1]->setExtension(KageFrame::EXTENSION_END); + Frames[p_frameCount-1]->setExtension(KageFrame::extension::EXTENSION_END); } } +KageLayer KageLayer::operator=(const KageLayer &p_layer) { + if (this == &p_layer) { + return *this; + } + KageScene::LOADING_MODE = true; + + this->layerID = p_layer.layerID; + this->_currentFrameIndex = p_layer._currentFrameIndex; + this->_activeFrame = p_layer._activeFrame; + this->_selected = p_layer._selected; + this->_visible = p_layer._visible; + this->_lock = p_layer._lock; + this->_label = p_layer._label; + this->frameCtr = p_layer.frameCtr; + this->_currentFrameID = p_layer._currentFrameID; + + this->removeAllFrames(); + + for (unsigned int l_frameIndex = 0; l_frameIndex < p_layer.Frames.size(); ++l_frameIndex) { + KageScene::LOADING_MODE = true; + _framePtr = new KageFrame(this, frameCtr); + this->Frames.push_back(_framePtr); + *(this->Frames[this->Frames.size()-1]) = *(p_layer.Frames[l_frameIndex]); + } + + this->frameCtr = p_layer.frameCtr; + this->_currentFrameID = p_layer._currentFrameID; + + KageScene::LOADING_MODE = false; + //std::cout << "\t\tKageLayer KageLayer::operator= >> " << this << "\t" << this->layerID << " "<< this->_currentFrameID << std::endl; + return *this; +} + KageLayer::~KageLayer() { - _scene = NULL; + //TODO: revisit + /* for (unsigned int i = Frames.size()-1; i > 0 && i != UINT_MAX; --i) { delete Frames[i]; Frames[i] = NULL; } Frames.clear(); + _scene = NULL;*/ } bool KageLayer::addFrame() { - unsigned int l_currentFrame = getCurrentFrame(); - ++frameCtr; - Frames.push_back(new KageFrame(this, frameCtr)); + _framePtr = new KageFrame(this, frameCtr); + Frames.push_back(_framePtr); if (KageScene::LOADING_MODE == true) { return true; } + unsigned int l_currentFrame = getCurrentFrame(); if (l_currentFrame == Frames.size()) { //when does currentFrame equal to Frames size when new frame is added?!? if (Frames.size() > 1) { KageFrame::extension l_extension = Frames[Frames.size()-2]->getExtension(); - if (l_extension == KageFrame::EXTENSION_NOT) { + if (l_extension == KageFrame::extension::EXTENSION_NOT) { //keep - } else if (l_extension == KageFrame::EXTENSION_END) { + } else if (l_extension == KageFrame::extension::EXTENSION_END) { //keep } //what happens if previous is extension? @@ -83,23 +118,23 @@ bool KageLayer::addFrame() { if (Frames.size() > 1) { KageFrame::extension l_extension = Frames[l_currentFrame-1]->getExtension(); - if (l_extension == KageFrame::EXTENSION_NOT) { + if (l_extension == KageFrame::extension::EXTENSION_NOT) { //keep - } else if (l_extension == KageFrame::EXTENSION_START) { - Frames[l_currentFrame-1]->setExtension(KageFrame::EXTENSION_NOT); + } else if (l_extension == KageFrame::extension::EXTENSION_START) { + Frames[l_currentFrame-1]->setExtension(KageFrame::extension::EXTENSION_NOT); l_extension = Frames[l_currentFrame+1]->getExtension(); - if ( l_extension == KageFrame::EXTENSION_MID - || l_extension == KageFrame::EXTENSION_END) { - Frames[l_currentFrame ]->setExtension(KageFrame::EXTENSION_START); + if ( l_extension == KageFrame::extension::EXTENSION_MID + || l_extension == KageFrame::extension::EXTENSION_END) { + Frames[l_currentFrame ]->setExtension(KageFrame::extension::EXTENSION_START); } - } else if (l_extension == KageFrame::EXTENSION_MID) { - Frames[l_currentFrame-1]->setExtension(KageFrame::EXTENSION_END); + } else if (l_extension == KageFrame::extension::EXTENSION_MID) { + Frames[l_currentFrame-1]->setExtension(KageFrame::extension::EXTENSION_END); l_extension = Frames[l_currentFrame+1]->getExtension(); - if ( l_extension == KageFrame::EXTENSION_MID - || l_extension == KageFrame::EXTENSION_END) { - Frames[l_currentFrame ]->setExtension(KageFrame::EXTENSION_START); + if ( l_extension == KageFrame::extension::EXTENSION_MID + || l_extension == KageFrame::extension::EXTENSION_END) { + Frames[l_currentFrame ]->setExtension(KageFrame::extension::EXTENSION_START); } - } else if (l_extension == KageFrame::EXTENSION_END) { + } else if (l_extension == KageFrame::extension::EXTENSION_END) { //keep } setCurrentFrame(l_currentFrame, false); //restore Current Frame because moveToLeft changed Current Frame @@ -120,45 +155,45 @@ void KageLayer::duplicateFrame() { unsigned int l_currentFrame = getCurrentFrame()-1; if (Frames.size() > 1) { KageFrame::extension l_extension = Frames[l_currentFrame-1]->getExtension(); - if (l_extension == KageFrame::EXTENSION_NOT) { + if (l_extension == KageFrame::extension::EXTENSION_NOT) { //keep // l_extension = Frames[l_currentFrame+1]->getExtension(); - // if ( l_extension == KageFrame::EXTENSION_MID - // || l_extension == KageFrame::EXTENSION_END) { - // Frames[l_currentFrame]->setExtension(KageFrame::EXTENSION_START); + // if ( l_extension == KageFrame::extension::EXTENSION_MID + // || l_extension == KageFrame::extension::EXTENSION_END) { + // Frames[l_currentFrame]->setExtension(KageFrame::extension::EXTENSION_START); // } - } else if (l_extension == KageFrame::EXTENSION_START) { - Frames[l_currentFrame-1]->setExtension(KageFrame::EXTENSION_NOT); + } else if (l_extension == KageFrame::extension::EXTENSION_START) { + Frames[l_currentFrame-1]->setExtension(KageFrame::extension::EXTENSION_NOT); if (l_currentFrame+1 < Frames.size()) { l_extension = Frames[l_currentFrame+1]->getExtension(); - if ( l_extension == KageFrame::EXTENSION_MID - || l_extension == KageFrame::EXTENSION_END) { - Frames[l_currentFrame]->setExtension(KageFrame::EXTENSION_START); - } else if (l_extension == KageFrame::EXTENSION_NOT - || l_extension == KageFrame::EXTENSION_START) { - Frames[l_currentFrame]->setExtension(KageFrame::EXTENSION_NOT); + if ( l_extension == KageFrame::extension::EXTENSION_MID + || l_extension == KageFrame::extension::EXTENSION_END) { + Frames[l_currentFrame]->setExtension(KageFrame::extension::EXTENSION_START); + } else if (l_extension == KageFrame::extension::EXTENSION_NOT + || l_extension == KageFrame::extension::EXTENSION_START) { + Frames[l_currentFrame]->setExtension(KageFrame::extension::EXTENSION_NOT); } } else { - Frames[l_currentFrame]->setExtension(KageFrame::EXTENSION_NOT); + Frames[l_currentFrame]->setExtension(KageFrame::extension::EXTENSION_NOT); } - } else if (l_extension == KageFrame::EXTENSION_MID) { - Frames[l_currentFrame-1]->setExtension(KageFrame::EXTENSION_END); + } else if (l_extension == KageFrame::extension::EXTENSION_MID) { + Frames[l_currentFrame-1]->setExtension(KageFrame::extension::EXTENSION_END); if (l_currentFrame+1 < Frames.size()) { l_extension = Frames[l_currentFrame+1]->getExtension(); - if ( l_extension == KageFrame::EXTENSION_MID - || l_extension == KageFrame::EXTENSION_END) { - Frames[l_currentFrame]->setExtension(KageFrame::EXTENSION_START); - } else if (l_extension == KageFrame::EXTENSION_NOT - || l_extension == KageFrame::EXTENSION_START) { - Frames[l_currentFrame]->setExtension(KageFrame::EXTENSION_NOT); + if ( l_extension == KageFrame::extension::EXTENSION_MID + || l_extension == KageFrame::extension::EXTENSION_END) { + Frames[l_currentFrame]->setExtension(KageFrame::extension::EXTENSION_START); + } else if (l_extension == KageFrame::extension::EXTENSION_NOT + || l_extension == KageFrame::extension::EXTENSION_START) { + Frames[l_currentFrame]->setExtension(KageFrame::extension::EXTENSION_NOT); } } else { - Frames[l_currentFrame]->setExtension(KageFrame::EXTENSION_NOT); + Frames[l_currentFrame]->setExtension(KageFrame::extension::EXTENSION_NOT); } - } else if (l_extension == KageFrame::EXTENSION_END) { + } else if (l_extension == KageFrame::extension::EXTENSION_END) { //keep previous - std::cout << " at END with " << Frames[l_currentFrame]->getExtension() << std::endl; - Frames[l_currentFrame]->setExtension(KageFrame::EXTENSION_NOT); + //std::cout << " at END with " << Frames[l_currentFrame]->getExtension() << std::endl; + Frames[l_currentFrame]->setExtension(KageFrame::extension::EXTENSION_NOT); } } @@ -198,45 +233,45 @@ bool KageLayer::removeFrame() { l_frameData.setVectorData(getFrameData().getVectorData()); l_extensionPrevious = Frames[i-1]->getExtension(); l_extensionNext = Frames[i+1]->getExtension(); - if (l_extensionPrevious == KageFrame::EXTENSION_NOT) { + if (l_extensionPrevious == KageFrame::extension::EXTENSION_NOT) { //keep Previous - if ( l_extensionNext == KageFrame::EXTENSION_START - && l_extensionNext == KageFrame::EXTENSION_MID) { - Frames[i ]->setExtension(KageFrame::EXTENSION_START); - } else if (l_extensionNext == KageFrame::EXTENSION_END - && l_extensionNext == KageFrame::EXTENSION_NOT) { - Frames[i ]->setExtension(KageFrame::EXTENSION_NOT); + if ( l_extensionNext == KageFrame::extension::EXTENSION_START + && l_extensionNext == KageFrame::extension::EXTENSION_MID) { + Frames[i ]->setExtension(KageFrame::extension::EXTENSION_START); + } else if (l_extensionNext == KageFrame::extension::EXTENSION_END + && l_extensionNext == KageFrame::extension::EXTENSION_NOT) { + Frames[i ]->setExtension(KageFrame::extension::EXTENSION_NOT); } - } else if (l_extensionPrevious == KageFrame::EXTENSION_START) { - if ( l_extensionNext == KageFrame::EXTENSION_NOT - || l_extensionNext == KageFrame::EXTENSION_START) { - Frames[i-1]->setExtension(KageFrame::EXTENSION_NOT); - } else {//if (l_extensionNext == KageFrame::EXTENSION_MID - //&& l_extensionNext == KageFrame::EXTENSION_END) { + } else if (l_extensionPrevious == KageFrame::extension::EXTENSION_START) { + if ( l_extensionNext == KageFrame::extension::EXTENSION_NOT + || l_extensionNext == KageFrame::extension::EXTENSION_START) { + Frames[i-1]->setExtension(KageFrame::extension::EXTENSION_NOT); + } else {//if (l_extensionNext == KageFrame::extension::EXTENSION_MID + //&& l_extensionNext == KageFrame::extension::EXTENSION_END) { //keep Previous } //simply copy Next Frame to Current KageFrame::extension l_temp = Frames[i+1]->getExtension(); Frames[i ]->setExtension(l_temp); - } else if (l_extensionPrevious == KageFrame::EXTENSION_MID) { - if ( l_extensionNext == KageFrame::EXTENSION_NOT - || l_extensionNext == KageFrame::EXTENSION_START) { - Frames[i-1]->setExtension(KageFrame::EXTENSION_END); - } else {//if (l_extensionNext == KageFrame::EXTENSION_MID - //|| l_extensionNext == KageFrame::EXTENSION_END) { + } else if (l_extensionPrevious == KageFrame::extension::EXTENSION_MID) { + if ( l_extensionNext == KageFrame::extension::EXTENSION_NOT + || l_extensionNext == KageFrame::extension::EXTENSION_START) { + Frames[i-1]->setExtension(KageFrame::extension::EXTENSION_END); + } else {//if (l_extensionNext == KageFrame::extension::EXTENSION_MID + //|| l_extensionNext == KageFrame::extension::EXTENSION_END) { //keep Previous } //simply copy Next Frame to Current KageFrame::extension l_temp = Frames[i+1]->getExtension(); Frames[i ]->setExtension(l_temp); - } else if (l_extensionPrevious == KageFrame::EXTENSION_END) { + } else if (l_extensionPrevious == KageFrame::extension::EXTENSION_END) { //keep Previous - if ( l_extensionNext == KageFrame::EXTENSION_NOT - || l_extensionNext == KageFrame::EXTENSION_END) { - Frames[i ]->setExtension(KageFrame::EXTENSION_NOT); - } else if (l_extensionNext == KageFrame::EXTENSION_START - || l_extensionNext == KageFrame::EXTENSION_MID) { - Frames[i ]->setExtension(KageFrame::EXTENSION_START); + if ( l_extensionNext == KageFrame::extension::EXTENSION_NOT + || l_extensionNext == KageFrame::extension::EXTENSION_END) { + Frames[i ]->setExtension(KageFrame::extension::EXTENSION_NOT); + } else if (l_extensionNext == KageFrame::extension::EXTENSION_START + || l_extensionNext == KageFrame::extension::EXTENSION_MID) { + Frames[i ]->setExtension(KageFrame::extension::EXTENSION_START); } } } else { @@ -248,7 +283,7 @@ bool KageLayer::removeFrame() { switchToPreviousFrame(); Frames[i]->forceSetTween(l_tween); if (l_tween == false || - l_tween == true && Frames[i+1]->getExtension() == KageFrame::EXTENSION_START) { + l_tween == true && Frames[i+1]->getExtension() == KageFrame::extension::EXTENSION_START) { setFrameData(l_frameData.clone()); } switchToNextFrame(); @@ -265,7 +300,7 @@ bool KageLayer::removeFrame() { switchToPreviousFrame(); Frames[j]->forceSetTween(l_tween); if (l_tween == false || - l_tween == true && Frames[j+1]->getExtension() == KageFrame::EXTENSION_START) { + l_tween == true && Frames[j+1]->getExtension() == KageFrame::extension::EXTENSION_START) { setFrameData(l_frameData.clone()); } switchToNextFrame(); //should it be here? @@ -279,7 +314,7 @@ bool KageLayer::removeFrame() { } Frames[Frames.size()-1]->forceSetTween(false); Frames[Frames.size()-1]->setNull(true); - Frames[Frames.size()-1]->setExtension(KageFrame::EXTENSION_NOT); //see issue #120 -- https://sourceforge.net/p/kage/tickets/120/ + Frames[Frames.size()-1]->setExtension(KageFrame::extension::EXTENSION_NOT); //see issue #120 -- https://sourceforge.net/p/kage/tickets/120/ setCurrentFrame(l_currentFrame, false); } else if (Frames.size() == 1) { VectorDataManager l_frameData; @@ -292,7 +327,7 @@ bool KageLayer::removeFrame() { bool KageLayer::moveToLeft() { if (_currentFrameIndex < Frames.size() && Frames[_currentFrameIndex]->frameID == _currentFrameID) { if (_currentFrameIndex > 0) { - swap(Frames[_currentFrameIndex], Frames[_currentFrameIndex-1]); + std::swap(Frames[_currentFrameIndex], Frames[_currentFrameIndex-1]); --_currentFrameIndex; return true; } @@ -301,7 +336,7 @@ bool KageLayer::moveToLeft() { if (Frames[i]->frameID == _currentFrameID) { _currentFrameIndex = i; if (_currentFrameIndex > 0) { - swap(Frames[_currentFrameIndex], Frames[_currentFrameIndex-1]); + std::swap(Frames[_currentFrameIndex], Frames[_currentFrameIndex-1]); --_currentFrameIndex; return true; } @@ -356,7 +391,8 @@ void KageLayer::extendFrame() { ++frameCtr; unsigned int l_currentFrame = getCurrentFrame(); unsigned int l_frameCount = Frames.size(); - Frames.push_back(new KageFrame(this, frameCtr)); + _framePtr = new KageFrame(this, frameCtr); + Frames.push_back(_framePtr); if (KageScene::LOADING_MODE == true) { return; @@ -366,12 +402,12 @@ void KageLayer::extendFrame() { KageFrame::extension l_extension = Frames[Frames.size()-2]->getExtension(); unsigned int l_tween = Frames[Frames.size()-2]->getTween(); Frames[Frames.size()-1]->forceSetTween(l_tween); - if (l_extension == KageFrame::EXTENSION_NOT) { - Frames[Frames.size()-2]->setExtension(KageFrame::EXTENSION_START); - } else if (l_extension == KageFrame::EXTENSION_END) { - Frames[Frames.size()-2]->setExtension(KageFrame::EXTENSION_MID); + if (l_extension == KageFrame::extension::EXTENSION_NOT) { + Frames[Frames.size()-2]->setExtension(KageFrame::extension::EXTENSION_START); + } else if (l_extension == KageFrame::extension::EXTENSION_END) { + Frames[Frames.size()-2]->setExtension(KageFrame::extension::EXTENSION_MID); } - Frames[Frames.size()-1]->setExtension(KageFrame::EXTENSION_END); + Frames[Frames.size()-1]->setExtension(KageFrame::extension::EXTENSION_END); } else if (l_currentFrame < l_frameCount) { unsigned int l_frameIndex = Frames.size(); while (l_frameIndex > l_currentFrame+1) { @@ -383,30 +419,30 @@ void KageLayer::extendFrame() { KageFrame::extension l_extension = Frames[l_currentFrame-1]->getExtension(); unsigned int l_tween = Frames[l_currentFrame-1]->getTween(); Frames[l_currentFrame]->forceSetTween(l_tween); - if (l_extension == KageFrame::EXTENSION_NOT) { - Frames[l_currentFrame-1]->setExtension(KageFrame::EXTENSION_START); - Frames[l_currentFrame ]->setExtension(KageFrame::EXTENSION_END); - } else if (l_extension == KageFrame::EXTENSION_START) { + if (l_extension == KageFrame::extension::EXTENSION_NOT) { + Frames[l_currentFrame-1]->setExtension(KageFrame::extension::EXTENSION_START); + Frames[l_currentFrame ]->setExtension(KageFrame::extension::EXTENSION_END); + } else if (l_extension == KageFrame::extension::EXTENSION_START) { l_extension = Frames[l_currentFrame+1]->getExtension(); - if ( l_extension == KageFrame::EXTENSION_NOT - || l_extension == KageFrame::EXTENSION_START) { - Frames[l_currentFrame]->setExtension(KageFrame::EXTENSION_END); - } else if (l_extension == KageFrame::EXTENSION_MID - || l_extension == KageFrame::EXTENSION_END) { - Frames[l_currentFrame]->setExtension(KageFrame::EXTENSION_MID); + if ( l_extension == KageFrame::extension::EXTENSION_NOT + || l_extension == KageFrame::extension::EXTENSION_START) { + Frames[l_currentFrame]->setExtension(KageFrame::extension::EXTENSION_END); + } else if (l_extension == KageFrame::extension::EXTENSION_MID + || l_extension == KageFrame::extension::EXTENSION_END) { + Frames[l_currentFrame]->setExtension(KageFrame::extension::EXTENSION_MID); } - } else if (l_extension == KageFrame::EXTENSION_MID) { + } else if (l_extension == KageFrame::extension::EXTENSION_MID) { l_extension = Frames[l_currentFrame+1]->getExtension(); - if ( l_extension == KageFrame::EXTENSION_NOT - || l_extension == KageFrame::EXTENSION_START) { - Frames[l_currentFrame]->setExtension(KageFrame::EXTENSION_END); - } else if (l_extension == KageFrame::EXTENSION_MID - || l_extension == KageFrame::EXTENSION_END) { - Frames[l_currentFrame]->setExtension(KageFrame::EXTENSION_MID); + if ( l_extension == KageFrame::extension::EXTENSION_NOT + || l_extension == KageFrame::extension::EXTENSION_START) { + Frames[l_currentFrame]->setExtension(KageFrame::extension::EXTENSION_END); + } else if (l_extension == KageFrame::extension::EXTENSION_MID + || l_extension == KageFrame::extension::EXTENSION_END) { + Frames[l_currentFrame]->setExtension(KageFrame::extension::EXTENSION_MID); } - } else if (l_extension == KageFrame::EXTENSION_END) { - Frames[l_currentFrame-1]->setExtension(KageFrame::EXTENSION_MID); - Frames[l_currentFrame ]->setExtension(KageFrame::EXTENSION_END); + } else if (l_extension == KageFrame::extension::EXTENSION_END) { + Frames[l_currentFrame-1]->setExtension(KageFrame::extension::EXTENSION_MID); + Frames[l_currentFrame ]->setExtension(KageFrame::extension::EXTENSION_END); } setCurrentFrame(l_currentFrame, false); //restore Current Frame because moveToLeft changed Current Frame } @@ -415,9 +451,11 @@ static int FRAME_SIZE = 0; //who is using this? bool KageLayer::removeAllFrames() { frameCtr = 0; FRAME_SIZE = Frames.size(); - for (unsigned int i = Frames.size()-1; i >= 0 && i != UINT_MAX; --i) { - delete Frames[i]; - Frames[i] = NULL; + for (unsigned int i = FRAME_SIZE-1; i >= 0 && i != UINT_MAX; --i) { + if (Frames[i]) { + delete Frames[i]; + Frames[i] = NULL; + } } Frames.clear(); FRAME_SIZE = Frames.size(); @@ -447,7 +485,7 @@ KageScene *KageLayer::getScene() { * \sa getCurrentFrame() */ void KageLayer::setCurrentFrame(unsigned int p_frame, bool p_addSelected) { - unsigned int l_fromFrameIndex = UINT_MAX; + unsigned int l_fromFrameIndex = 0; if (p_addSelected == true) { //get current frame to select range of frames if (_currentFrameIndex < Frames.size() && Frames[_currentFrameIndex]->frameID == _currentFrameID) { @@ -550,25 +588,14 @@ unsigned int KageLayer::getFrameNumberByID(unsigned int p_frameID) { */ void KageLayer::setSelected(KageFrame *p_frame) { _scene->selectAllLayerFrame(false); - _scene->setCurrentLayerByID(p_frame->_layer->ID); + _scene->setCurrentLayerByID(p_frame->_layer->layerID); _scene->setCurrentFrameByID(p_frame->frameID); -/* if (_currentFrameIndex < Frames.size() && Frames[_currentFrameIndex]->frameID == _currentFrameID) { - Frames[_currentFrameIndex]->setSelected(false); - } else { - for (unsigned int i = 0; i < Frames.size(); ++i) { - if (Frames[i]->frameID == _currentFrameID) { - _currentFrameIndex = i; - _currentFrameID = Frames[i]->frameID; - Frames[i]->setSelected(false); - break; - } - } - }*/ + p_frame->setSelected(true); _currentFrameID = p_frame->frameID; } -vector KageLayer::raiseSelectedShape(vector p_selectedShapes) { +std::vector KageLayer::raiseSelectedShape(std::vector p_selectedShapes) { if (_currentFrameIndex < Frames.size() && Frames[_currentFrameIndex]->frameID == _currentFrameID) { return Frames[_currentFrameIndex]->raiseSelectedShape(p_selectedShapes); } else { @@ -583,7 +610,7 @@ vector KageLayer::raiseSelectedShape(vector p_select std::vector l_nullReturn; return l_nullReturn; } -vector KageLayer::lowerSelectedShape(vector p_selectedShapes) { +std::vector KageLayer::lowerSelectedShape(std::vector p_selectedShapes) { if (_currentFrameIndex < Frames.size() && Frames[_currentFrameIndex]->frameID == _currentFrameID) { return Frames[_currentFrameIndex]->lowerSelectedShape(p_selectedShapes); } else { @@ -598,7 +625,7 @@ vector KageLayer::lowerSelectedShape(vector p_select std::vector l_nullReturn; return l_nullReturn; } -vector KageLayer::raiseToTopSelectedShape(vector p_selectedShapes) { +std::vector KageLayer::raiseToTopSelectedShape(std::vector p_selectedShapes) { if (_currentFrameIndex < Frames.size() && Frames[_currentFrameIndex]->frameID == _currentFrameID) { return Frames[_currentFrameIndex]->raiseToTopSelectedShape(p_selectedShapes); } else { @@ -613,7 +640,7 @@ vector KageLayer::raiseToTopSelectedShape(vector p_s std::vector l_nullReturn; return l_nullReturn; } -vector KageLayer::lowerToBottomSelectedShape(vector p_selectedShapes) { +std::vector KageLayer::lowerToBottomSelectedShape(std::vector p_selectedShapes) { if (_currentFrameIndex < Frames.size() && Frames[_currentFrameIndex]->frameID == _currentFrameID) { return Frames[_currentFrameIndex]->lowerToBottomSelectedShape(p_selectedShapes); } else { @@ -629,7 +656,7 @@ vector KageLayer::lowerToBottomSelectedShape(vector return l_nullReturn; } -vector KageLayer::groupSelectedShapes(vector p_selectedShapes) { +std::vector KageLayer::groupSelectedShapes(std::vector p_selectedShapes) { if (_currentFrameIndex < Frames.size() && Frames[_currentFrameIndex]->frameID == _currentFrameID) { return Frames[_currentFrameIndex]->groupSelectedShapes(p_selectedShapes); } else { @@ -644,7 +671,7 @@ vector KageLayer::groupSelectedShapes(vector p_selec std::vector l_nullReturn; return l_nullReturn; } -vector KageLayer::ungroupSelectedShapes(vector p_selectedShapes) { +std::vector KageLayer::ungroupSelectedShapes(std::vector p_selectedShapes) { if (_currentFrameIndex < Frames.size() && Frames[_currentFrameIndex]->frameID == _currentFrameID) { return Frames[_currentFrameIndex]->ungroupSelectedShapes(p_selectedShapes); } else { @@ -660,7 +687,7 @@ vector KageLayer::ungroupSelectedShapes(vector p_sel return l_nullReturn; } -vector KageLayer::duplicateShapes(vector p_selectedShapes) { +std::vector KageLayer::duplicateShapes(std::vector p_selectedShapes) { if (_currentFrameIndex < Frames.size() && Frames[_currentFrameIndex]->frameID == _currentFrameID) { return Frames[_currentFrameIndex]->duplicateShapes(p_selectedShapes); } else { @@ -676,7 +703,7 @@ vector KageLayer::duplicateShapes(vector p_selectedS return l_nullReturn; } -bool KageLayer::flipHorizontalSelectedShape(vector p_selectedShapes) { +bool KageLayer::flipHorizontalSelectedShape(std::vector p_selectedShapes) { if (_currentFrameIndex < Frames.size() && Frames[_currentFrameIndex]->frameID == _currentFrameID) { return Frames[_currentFrameIndex]->flipHorizontalSelectedShape(p_selectedShapes); } else { @@ -691,7 +718,7 @@ bool KageLayer::flipHorizontalSelectedShape(vector p_selectedShape return false; } -bool KageLayer::flipVerticalSelectedShape(vector p_selectedShapes) { +bool KageLayer::flipVerticalSelectedShape(std::vector p_selectedShapes) { if (_currentFrameIndex < Frames.size() && Frames[_currentFrameIndex]->frameID == _currentFrameID) { return doFlipVerticalSelectedShapeOn(_currentFrameIndex, p_selectedShapes); } else { @@ -707,8 +734,8 @@ bool KageLayer::flipVerticalSelectedShape(vector p_selectedShapes) return false; } bool KageLayer::doFlipVerticalSelectedShapeOn(unsigned int p_frameIndex, std::vector p_selectedShapes) { - if ( Frames[p_frameIndex]->getExtension() == KageFrame::EXTENSION_NOT - || Frames[p_frameIndex]->getExtension() == KageFrame::EXTENSION_START) { + if ( Frames[p_frameIndex]->getExtension() == KageFrame::extension::EXTENSION_NOT + || Frames[p_frameIndex]->getExtension() == KageFrame::extension::EXTENSION_START) { return Frames[p_frameIndex]->flipVerticalSelectedShape(p_selectedShapes); } else { return doFlipVerticalSelectedShapeOnExtendedFrame(p_frameIndex-1, p_selectedShapes); @@ -716,8 +743,8 @@ bool KageLayer::flipVerticalSelectedShape(vector p_selectedShapes) } bool KageLayer::doFlipVerticalSelectedShapeOnExtendedFrame(unsigned int p_frameIndex, std::vector p_selectedShapes) { while (p_frameIndex > 0) { - if ( Frames[p_frameIndex]->getExtension() == KageFrame::EXTENSION_NOT - || Frames[p_frameIndex]->getExtension() == KageFrame::EXTENSION_START) { + if ( Frames[p_frameIndex]->getExtension() == KageFrame::extension::EXTENSION_NOT + || Frames[p_frameIndex]->getExtension() == KageFrame::extension::EXTENSION_START) { return Frames[p_frameIndex]->flipVerticalSelectedShape(p_selectedShapes); } else { --p_frameIndex; @@ -726,7 +753,7 @@ bool KageLayer::flipVerticalSelectedShape(vector p_selectedShapes) return false; } -bool KageLayer::recenterRotationPoint(vector p_selectedShapes) { +bool KageLayer::recenterRotationPoint(std::vector p_selectedShapes) { if (_currentFrameIndex < Frames.size() && Frames[_currentFrameIndex]->frameID == _currentFrameID) { return Frames[_currentFrameIndex]->recenterRotationPoint(p_selectedShapes); } else { @@ -783,21 +810,21 @@ VectorDataManager KageLayer::getFrameTweenData(unsigned int p_frameIndex) { KageFrame::extension l_extension = Frames[p_frameIndex]->getExtension(); if ( l_tween > 0 - && (l_extension == KageFrame::EXTENSION_MID - || l_extension == KageFrame::EXTENSION_END)) { + && (l_extension == KageFrame::extension::EXTENSION_MID + || l_extension == KageFrame::extension::EXTENSION_END)) { unsigned int l_tweenHead = UINT_MAX; unsigned int l_tweenTail = UINT_MAX; for (unsigned int j = p_frameIndex-1; j >= 0 && j != UINT_MAX; --j) { - if (Frames[j]->getExtension() == KageFrame::EXTENSION_START) { + if (Frames[j]->getExtension() == KageFrame::extension::EXTENSION_START) { l_tweenHead = j; break; } } for (unsigned int j = p_frameIndex+1; j < Frames.size(); ++j) { l_extension = Frames[j]->getExtension(); - if ( l_extension == KageFrame::EXTENSION_START - || l_extension == KageFrame::EXTENSION_NOT) { + if ( l_extension == KageFrame::extension::EXTENSION_START + || l_extension == KageFrame::extension::EXTENSION_NOT) { l_tweenTail = j; break; } @@ -978,10 +1005,10 @@ VectorDataManager KageLayer::getFrameData() { VectorDataManager l_nullReturn; return l_nullReturn; } -VectorDataManager KageLayer::getFrameDataAt(unsigned int p_frame) { +VectorDataManager KageLayer::getFrameDataAt(unsigned int p_frame, bool p_frameOnion, bool p_layerOnion) { if (p_frame > 0 && p_frame <= Frames.size()) { - --p_frame; //layer now becomes Frame Index - if (_scene->_document->_kage->_toggleOnion.get_active() == true || _scene->_document->_kage->_toggleOnionLayer.get_active() == true) { + --p_frame; //p_frame now becomes Frame Index + if (p_frameOnion == true || p_layerOnion == true) { return getFrameTweenData(p_frame); } return Frames[p_frame]->getFrameData(); @@ -1041,10 +1068,10 @@ bool KageLayer::setExtendedFrameTween(unsigned int p_frameID, unsigned int p_twe if (Frames[i]->frameID == p_frameID) { for (unsigned int j = i+1; j < Frames.size(); ++j) { Frames[j]->forceSetTween(p_tween); - if (Frames[j]->getExtension() == KageFrame::EXTENSION_END) { + if (Frames[j]->getExtension() == KageFrame::extension::EXTENSION_END) { break; - } else if (Frames[j]->getExtension() == KageFrame::EXTENSION_NOT) { - Frames[j]->setExtension(KageFrame::EXTENSION_END); + } else if (Frames[j]->getExtension() == KageFrame::extension::EXTENSION_NOT) { + Frames[j]->setExtension(KageFrame::extension::EXTENSION_END); break; } } @@ -1174,10 +1201,10 @@ bool KageLayer::canReUseNextFrame() { if (_currentFrameIndex+1 == Frames.size()) { return false; } else if (Frames[_currentFrameIndex+1]->isEmpty() == false - && Frames[_currentFrameIndex+1]->getExtension() == KageFrame::EXTENSION_NOT) { + && Frames[_currentFrameIndex+1]->getExtension() == KageFrame::extension::EXTENSION_NOT) { return false; } else if (Frames[_currentFrameIndex+1]->isEmpty() == false - && Frames[_currentFrameIndex+1]->getExtension() == KageFrame::EXTENSION_START) { + && Frames[_currentFrameIndex+1]->getExtension() == KageFrame::extension::EXTENSION_START) { return false; } @@ -1246,9 +1273,9 @@ void KageLayer::toggleLock() { } } -void KageLayer::setLabel(string p_label) { +void KageLayer::setLabel(std::string p_label) { _label = p_label; } -string KageLayer::getLabel() { +std::string KageLayer::getLabel() { return _label; } \ No newline at end of file diff --git a/studio/kage/data/layer.h b/studio/kage/data/layer.h index 8f02127..fd812ef 100644 --- a/studio/kage/data/layer.h +++ b/studio/kage/data/layer.h @@ -32,16 +32,16 @@ #include class Kage; //forward declaration - using namespace std; - class KageScene; //forward declaration class KageLayer { public: - unsigned int ID; + unsigned int layerID; std::vector Frames; + KageFrame* _framePtr; KageLayer(KageScene *p_scene, unsigned int p_layerID, unsigned int p_frameCount); + KageLayer operator=(const KageLayer &p_layer); virtual ~KageLayer(); unsigned int getID(); bool selectAllFrame(bool p_selectAll); @@ -62,25 +62,25 @@ void setSelected(KageFrame *p_frame); - std::vector raiseSelectedShape(vector p_selectedShapes); - std::vector lowerSelectedShape(vector p_selectedShapes); - std::vector raiseToTopSelectedShape(vector p_selectedShapes); - std::vector lowerToBottomSelectedShape(vector p_selectedShapes); - std::vector groupSelectedShapes(vector p_selectedShapes); - std::vector ungroupSelectedShapes(vector p_selectedShapes); - std::vector duplicateShapes(vector p_selectedShapes); - bool flipHorizontalSelectedShape(vector p_selectedShapes); - bool flipVerticalSelectedShape(vector p_selectedShapes); + std::vector raiseSelectedShape(std::vector p_selectedShapes); + std::vector lowerSelectedShape(std::vector p_selectedShapes); + std::vector raiseToTopSelectedShape(std::vector p_selectedShapes); + std::vector lowerToBottomSelectedShape(std::vector p_selectedShapes); + std::vector groupSelectedShapes(std::vector p_selectedShapes); + std::vector ungroupSelectedShapes(std::vector p_selectedShapes); + std::vector duplicateShapes(std::vector p_selectedShapes); + bool flipHorizontalSelectedShape(std::vector p_selectedShapes); + bool flipVerticalSelectedShape(std::vector p_selectedShapes); bool doFlipVerticalSelectedShapeOn(unsigned int p_frameIndex, std::vector p_selectedShapes); bool doFlipVerticalSelectedShapeOnExtendedFrame(unsigned int p_frameIndex, std::vector p_selectedShapes); - bool recenterRotationPoint(vector p_selectedShapes); + bool recenterRotationPoint(std::vector p_selectedShapes); bool addDataToFrame(VectorDataManager p_vectorsData); bool setFrameData(VectorDataManager p_vectorsData); VectorDataManager getFrameTweenData(unsigned int p_frameIndex); VectorDataManager getFrameData(); - VectorDataManager getFrameDataAt(unsigned int p_frame); ///NOTE: "Frame" -- NOT "frame ID" + VectorDataManager getFrameDataAt(unsigned int p_frame, bool p_frameOnion, bool p_layerOnion); ///NOTE: "Frame" -- NOT "frame ID" VectorDataManager getPreviousFrameData(unsigned int p_frameID); ///Called by KageFrame if KageFrame is Extended bool setFrameDataToPreviousFrame(VectorDataManager p_vectorsData, unsigned int p_frameID); ///Called by KageFrame if KageFrame is Extended bool addDataToPreviousFrame(VectorDataManager v, unsigned int p_frameID); ///Called by KageFrame if KageFrame is Extended @@ -100,12 +100,9 @@ void setFrameExtension(KageFrame::extension p_extension); unsigned int getActiveFrameID(); - protected: -// unsigned int layerCtr; + unsigned int frameCtr; - protected: - unsigned int layerID; - + KageScene *_scene; unsigned int _currentFrameID; unsigned int _currentFrameIndex; @@ -120,8 +117,8 @@ bool _selected; bool _visible; bool _lock; - string _label; - public: + std::string _label; + //GUI-related void setSelected(bool p_selected); bool isSelected(); @@ -134,7 +131,7 @@ bool isLocked(); void toggleLock(); - void setLabel(string p_label); - string getLabel(); + void setLabel(std::string p_label); + std::string getLabel(); }; #endif //GTKMM_KAGE_LAYER_H \ No newline at end of file diff --git a/studio/kage/data/scene.cpp b/studio/kage/data/scene.cpp index 1f23ce3..ae15f58 100644 --- a/studio/kage/data/scene.cpp +++ b/studio/kage/data/scene.cpp @@ -22,15 +22,55 @@ #include "scene.h" #include "../../kage.h" -KageScene::KageScene(KageDocument *p_document, unsigned int p_sceneID, string p_filepath) { +KageScene::KageScene(KageDocument *p_document, unsigned int p_sceneID, std::string p_filepath) { init(p_document, p_sceneID); open(p_filepath); } +KageScene KageScene::operator=(const KageScene &p_scene) { + if (this == &p_scene) { + return *this; + } + KageScene::LOADING_MODE = true; + + this->sceneID = p_scene.sceneID; + this->_selected = p_scene._selected; + this->_saved = p_scene._saved; + this->_activeLayerIndex = p_scene._activeLayerIndex; + this->_activeLayer = p_scene._activeLayer; + this->_label = p_scene._label; + this->layerCtr = p_scene.layerCtr; + this->_activeLayerID = p_scene._activeLayerID; + //TODO: Assets that are KSF should be included on _document but TAGged as ASSET + // ex: this->_asset = p_scene._asset; //_asset is boolean + + bool l_return; + for (unsigned int l_layerIndex = 0; l_layerIndex < this->Layers.size(); ++l_layerIndex) { + l_return = this->removeLayerAt(l_layerIndex); + if (l_return == false) { + break; + } + } + this->Layers.clear(); + + for (unsigned int l_layerIndex = 0; l_layerIndex < p_scene.Layers.size(); ++l_layerIndex) { + KageScene::LOADING_MODE = true; + this->addLayer(); //when will it (_activeLayerCount)++ if not on addLayer?!? + *(this->Layers[l_layerIndex]) = *(p_scene.Layers[l_layerIndex]); + } + + this->layerCtr = p_scene.layerCtr; + this->_activeLayerID = p_scene._activeLayerID; + + KageScene::LOADING_MODE = false; + + return *this; +} + void KageScene::init(KageDocument *p_document, unsigned int p_sceneID) { _document = p_document; - ID = p_sceneID; + sceneID = p_sceneID; setSelected(false); layerCtr = 0; @@ -44,10 +84,10 @@ void KageScene::init(KageDocument *p_document, unsigned int p_sceneID) { } unsigned int KageScene::getID() { - return ID; + return sceneID; } -bool KageScene::open(string p_filepath) { +bool KageScene::open(std::string p_filepath) { //TODO: open KSF -- take it from kage.cpp return true; } @@ -79,8 +119,9 @@ KageScene::KageScene(KageDocument *p_document, unsigned int p_sceneID, KageScene } KageScene::~KageScene() { - Layers.clear(); - _document = NULL; + //TODO: revisit + //Layers.clear(); + //_document = NULL; } unsigned int KageScene::frameCount() { @@ -94,9 +135,10 @@ unsigned int KageScene::frameCount() { void KageScene::addLayer() { ++layerCtr; //TODO: add layer above currently selected Layer - Layers.push_back(new KageLayer(this, layerCtr, frameCount())); + _layerPtr = new KageLayer(this, layerCtr, frameCount()); + Layers.push_back(_layerPtr); if (_activeLayerID == UINT_MAX) { - setActiveLayerID(layerCtr); + _activeLayerID = layerCtr; } } @@ -130,10 +172,10 @@ bool KageScene::addLayerFrame() { KageFrame *l_frame = Layers[l_currentLayer-1]->getFrameAt(getCurrentFrame()); if (l_frame) { Layers[l_currentLayer-1]->setSelected(l_frame); //why duplicate frame then delete? why not just create empty frame via Layer->addFrame? - std::cout << "KageScene::addLayerFrame DELETED " << _document->_kage->doDeleteFrame() << std::endl; + return true; } - return true; + return false; } bool KageScene::duplicateLayerFrame() { @@ -191,10 +233,6 @@ bool KageScene::removeAllFrames() { return true; } -void KageScene::setActiveLayerID(unsigned int p_layerID) { - _activeLayerID = p_layerID; -} - /** For use of Kage. To keep track of active Layer in-check of all layers in Scene * \return index+1 of registered active layer * \sa setCurrentLayer() @@ -202,7 +240,7 @@ void KageScene::setActiveLayerID(unsigned int p_layerID) { unsigned int KageScene::getCurrentLayer() { if (_activeLayerIndex < Layers.size() && Layers[_activeLayerIndex]->getID() == _activeLayerID) { _activeLayer = _activeLayerIndex+1; - return _activeLayerIndex+1; + return _activeLayer; } else { for (unsigned int i = 0; i < Layers.size(); ++i) { if (Layers[i]->getID() == _activeLayerID) { @@ -356,17 +394,12 @@ void KageScene::setCurrentFrameByID(unsigned int p_frameID) { } } - _document->_kage->forceRenderFrames(); - _document->_kage->_timeline.forceRender(); - _document->_kage->refreshUI(); +// _document->_kage->forceRenderFrames(); +// _document->_kage->_timeline.forceRender(); +// _document->_kage->refreshUI(); } } -void KageScene::renderStage() {//who is calling renderStage? - _document->_kage->forceRenderFrames(); - _document->_kage->refreshUI(); -} - void KageScene::selectAllLayerFrame(bool p_selectAll) { unsigned int l_layerCount = Layers.size(); for (unsigned int i = 0; i < l_layerCount; ++i) { @@ -431,7 +464,7 @@ bool KageScene::moveToTop() { --l_currentLayer; //layer now becomes Layer Index if (l_currentLayer < Layers.size()-1) { while (l_currentLayer < Layers.size()-1) { - swap(Layers[l_currentLayer], Layers[l_currentLayer+1]); + std::swap(Layers[l_currentLayer], Layers[l_currentLayer+1]); l_currentLayer = l_currentLayer+1; } return true; @@ -451,7 +484,7 @@ bool KageScene::moveUp() { } else { --l_currentLayer; //layer now becomes Layer Index if (l_currentLayer < Layers.size()-1) { - swap(Layers[l_currentLayer], Layers[l_currentLayer+1]); + std::swap(Layers[l_currentLayer], Layers[l_currentLayer+1]); return true; } } @@ -469,7 +502,7 @@ bool KageScene::moveDown() { } else { --l_currentLayer; //layer now becomes Layer Index if (l_currentLayer > 0) { - swap(Layers[l_currentLayer], Layers[l_currentLayer-1]); + std::swap(Layers[l_currentLayer], Layers[l_currentLayer-1]); return true; } } @@ -488,7 +521,7 @@ bool KageScene::moveToBottom() { --l_currentLayer; //layer now becomes Layer Index if (l_currentLayer > 0) { while (l_currentLayer > 0) { - swap(Layers[l_currentLayer], Layers[l_currentLayer-1]); + std::swap(Layers[l_currentLayer], Layers[l_currentLayer-1]); l_currentLayer = l_currentLayer-1; } return true; @@ -497,7 +530,7 @@ bool KageScene::moveToBottom() { return false; } -vector KageScene::raiseSelectedShape(vector p_selectedShapes) { +std::vector KageScene::raiseSelectedShape(std::vector p_selectedShapes) { unsigned int l_currentLayer = getCurrentLayer(); if (l_currentLayer < 1 || l_currentLayer > Layers.size()) { // @@ -508,7 +541,7 @@ vector KageScene::raiseSelectedShape(vector p_select std::vector l_nullReturn; return l_nullReturn; } -vector KageScene::lowerSelectedShape(vector p_selectedShapes) { +std::vector KageScene::lowerSelectedShape(std::vector p_selectedShapes) { unsigned int l_currentLayer = getCurrentLayer(); if (l_currentLayer < 1 || l_currentLayer > Layers.size()) { // @@ -519,7 +552,7 @@ vector KageScene::lowerSelectedShape(vector p_select std::vector l_nullReturn; return l_nullReturn; } -vector KageScene::raiseToTopSelectedShape(vector p_selectedShapes) { +std::vector KageScene::raiseToTopSelectedShape(std::vector p_selectedShapes) { unsigned int l_currentLayer = getCurrentLayer(); if (l_currentLayer < 1 || l_currentLayer > Layers.size()) { // @@ -530,7 +563,7 @@ vector KageScene::raiseToTopSelectedShape(vector p_s std::vector l_nullReturn; return l_nullReturn; } -vector KageScene::lowerToBottomSelectedShape(vector p_selectedShapes) { +std::vector KageScene::lowerToBottomSelectedShape(std::vector p_selectedShapes) { unsigned int l_currentLayer = getCurrentLayer(); if (l_currentLayer < 1 || l_currentLayer > Layers.size()) { // @@ -542,7 +575,7 @@ vector KageScene::lowerToBottomSelectedShape(vector return l_nullReturn; } -vector KageScene::groupSelectedShapes(vector p_selectedShapes) { +std::vector KageScene::groupSelectedShapes(std::vector p_selectedShapes) { unsigned int l_currentLayer = getCurrentLayer(); if (l_currentLayer < 1 || l_currentLayer > Layers.size()) { // @@ -553,7 +586,7 @@ vector KageScene::groupSelectedShapes(vector p_selec std::vector l_nullReturn; return l_nullReturn; } -vector KageScene::ungroupSelectedShapes(vector p_selectedShapes) { +std::vector KageScene::ungroupSelectedShapes(std::vector p_selectedShapes) { unsigned int l_currentLayer = getCurrentLayer(); if (l_currentLayer < 1 || l_currentLayer > Layers.size()) { // @@ -565,7 +598,7 @@ vector KageScene::ungroupSelectedShapes(vector p_sel return l_nullReturn; } -vector KageScene::duplicateShapes(vector p_selectedShapes) { +std::vector KageScene::duplicateShapes(std::vector p_selectedShapes) { unsigned int l_currentLayer = getCurrentLayer(); if (l_currentLayer < 1 || l_currentLayer > Layers.size()) { // @@ -577,7 +610,7 @@ vector KageScene::duplicateShapes(vector p_selectedS return l_nullReturn; } -bool KageScene::flipHorizontalSelectedShape(vector p_selectedShapes) { +bool KageScene::flipHorizontalSelectedShape(std::vector p_selectedShapes) { unsigned int l_currentLayer = getCurrentLayer(); if (l_currentLayer < 1 || l_currentLayer > Layers.size()) { // @@ -588,7 +621,7 @@ bool KageScene::flipHorizontalSelectedShape(vector p_selectedShape return false; } -bool KageScene::flipVerticalSelectedShape(vector p_selectedShapes) { +bool KageScene::flipVerticalSelectedShape(std::vector p_selectedShapes) { unsigned int l_currentLayer = getCurrentLayer(); if (l_currentLayer < 1 || l_currentLayer > Layers.size()) { // @@ -600,7 +633,7 @@ bool KageScene::flipVerticalSelectedShape(vector p_selectedShapes) return false; } -bool KageScene::recenterRotationPoint(vector p_selectedShapes) { +bool KageScene::recenterRotationPoint(std::vector p_selectedShapes) { unsigned int l_currentLayer = getCurrentLayer(); if (l_currentLayer < 1 || l_currentLayer > Layers.size()) { // @@ -634,7 +667,6 @@ bool KageScene::setFrameData(VectorDataManager p_vectorsData) { return false; } VectorDataManager KageScene::getFrameData() { - unsigned int l_currentLayer = getCurrentLayer(); if (l_currentLayer < 1 || l_currentLayer > Layers.size()) { // @@ -645,13 +677,13 @@ VectorDataManager KageScene::getFrameData() { VectorDataManager l_nullReturn; return l_nullReturn; } -VectorDataManager KageScene::getFrameDataAt(unsigned int p_frame) { +VectorDataManager KageScene::getFrameDataAt(unsigned int p_frame, bool p_frameOnion, bool p_layerOnion) { unsigned int l_currentLayer = getCurrentLayer(); if (l_currentLayer < 1 || l_currentLayer > Layers.size()) { // } else { --l_currentLayer; //layer now becomes Layer Index - return Layers[l_currentLayer]->getFrameDataAt(p_frame); + return Layers[l_currentLayer]->getFrameDataAt(p_frame, p_frameOnion, p_layerOnion); } VectorDataManager l_nullReturn; return l_nullReturn; @@ -830,10 +862,10 @@ unsigned int KageScene::getActiveLayerID() { return _activeLayerID; } -string KageScene::getLayerLabel() { +std::string KageScene::getLayerLabel() { return Layers[_activeLayerIndex]->getLabel(); } -void KageScene::setLayerLabel(string p_label) { +void KageScene::setLayerLabel(std::string p_label) { Layers[_activeLayerIndex]->setLabel(p_label); } @@ -857,9 +889,9 @@ void KageScene::setLayerLocked(bool p_locked) { Layers[_activeLayerIndex]->setLock(p_locked); } -string KageScene::getLabel() { +std::string KageScene::getLabel() { return _label; } -void KageScene::setLabel(string p_label) { +void KageScene::setLabel(std::string p_label) { _label = p_label; } diff --git a/studio/kage/data/scene.h b/studio/kage/data/scene.h index 21a70d1..33f4e38 100644 --- a/studio/kage/data/scene.h +++ b/studio/kage/data/scene.h @@ -33,18 +33,16 @@ #include //class Kage; //forward declaration - using namespace std; - class KageFrame; //forward declaration class KageLayer; //forward declaration class KageDocument; //forward declaration class KageScene { - protected: + public: void init(KageDocument *p_document, unsigned int p_sceneID); - unsigned int ID; + unsigned int sceneID; bool _selected; bool _saved; unsigned int _activeLayerID; @@ -53,16 +51,18 @@ unsigned int layerCtr; ///will be used to create Unique LayerUI IDs - string _label; //Scene label - public: + std::string _label; //Scene label + static bool LOADING_MODE; - KageScene(KageDocument *p_document, unsigned int p_sceneID, string p_filepath); + KageScene(KageDocument *p_document, unsigned int p_sceneID, std::string p_filepath); + KageScene operator=(const KageScene &p_scene); unsigned int getID(); std::vector Layers; + KageLayer* _layerPtr; - bool open(string p_filepath); + bool open(std::string p_filepath); bool save(); void setSelected(bool p_selected); @@ -92,8 +92,6 @@ KageLayer *getLayer(); KageLayer *getLayerAt(unsigned int p_layer); - void renderStage(); //used by KageFrame - bool removeAllFrames(); bool moveToTop(); @@ -101,22 +99,22 @@ bool moveDown(); bool moveToBottom(); - std::vector raiseSelectedShape(vector p_selectedShapes); - std::vector lowerSelectedShape(vector p_selectedShapes); - std::vector raiseToTopSelectedShape(vector p_selectedShapes); - std::vector lowerToBottomSelectedShape(vector p_selectedShapes); - std::vector groupSelectedShapes(vector p_selectedShapes); - std::vector ungroupSelectedShapes(vector p_selectedShapes); - std::vector duplicateShapes(vector p_selectedShapes); - bool flipHorizontalSelectedShape(vector p_selectedShapes); - bool flipVerticalSelectedShape(vector p_selectedShapes); + std::vector raiseSelectedShape(std::vector p_selectedShapes); + std::vector lowerSelectedShape(std::vector p_selectedShapes); + std::vector raiseToTopSelectedShape(std::vector p_selectedShapes); + std::vector lowerToBottomSelectedShape(std::vector p_selectedShapes); + std::vector groupSelectedShapes(std::vector p_selectedShapes); + std::vector ungroupSelectedShapes(std::vector p_selectedShapes); + std::vector duplicateShapes(std::vector p_selectedShapes); + bool flipHorizontalSelectedShape(std::vector p_selectedShapes); + bool flipVerticalSelectedShape(std::vector p_selectedShapes); - bool recenterRotationPoint(vector p_selectedShapes); + bool recenterRotationPoint(std::vector p_selectedShapes); bool addDataToFrame(VectorDataManager p_vectorsData); bool setFrameData(VectorDataManager p_vectorsData); VectorDataManager getFrameData(); - VectorDataManager getFrameDataAt(unsigned int p_frame); ///NOTE: "Frame" -- NOT "frame ID" + VectorDataManager getFrameDataAt(unsigned int p_frame, bool p_frameOnion, bool p_layerOnion); ///NOTE: "Frame" -- NOT "frame ID" bool forceSetTween(unsigned int p_tween); bool setTween(unsigned int p_tween); @@ -135,9 +133,8 @@ KageScene *_parent; unsigned int getActiveLayerID(); - void setActiveLayerID(unsigned int p_layerID); - string getLayerLabel(); - void setLayerLabel(string p_label); + std::string getLayerLabel(); + void setLayerLabel(std::string p_label); void toggleLayerVisibility(); bool isLayerVisible(); void setLayerVisible(bool p_visible); @@ -145,8 +142,8 @@ bool isLayerLocked(); void setLayerLocked(bool p_locked); - string getLabel(); - void setLabel(string p_label); + std::string getLabel(); + void setLabel(std::string p_label); }; #endif //GTKMM_KAGE_SCENE_H \ No newline at end of file diff --git a/studio/kage/data/vectordata.cpp b/studio/kage/data/vectordata.cpp index 582e60d..e7f2f3e 100644 --- a/studio/kage/data/vectordata.cpp +++ b/studio/kage/data/vectordata.cpp @@ -44,12 +44,12 @@ VectorData::type VectorData::getType() const { return vectorType; } -void VectorData::setPoints(vector p_points) { +void VectorData::setPoints(std::vector p_points) { points = p_points; count = p_points.size(); } -vector VectorData::getPoints() { +std::vector VectorData::getPoints() { return points; } diff --git a/studio/kage/data/vectordata.h b/studio/kage/data/vectordata.h index 833dc06..249b084 100644 --- a/studio/kage/data/vectordata.h +++ b/studio/kage/data/vectordata.h @@ -27,8 +27,6 @@ #include "point.h" #include "strokecolor.h" - using namespace std; - class VectorData { public: enum type { @@ -51,11 +49,11 @@ void setType(type p_type); type getType() const; - void setPoints(vector p_points); + void setPoints(std::vector p_points); std::vector getPoints(); StrokeColorData stroke; ColorData fillColor; - string fillColorGradientID; + std::string fillColorGradientID; unsigned int count; type vectorType; diff --git a/studio/kage/document.cpp b/studio/kage/document.cpp index fef6b45..788783f 100644 --- a/studio/kage/document.cpp +++ b/studio/kage/document.cpp @@ -22,51 +22,94 @@ #include "document.h" #include "../kage.h" -KageDocument::KageDocument(Kage *p_kage) { - Project = KageProject(); +KageDocument::KageDocument() { + init(); +} + +KageDocument::KageDocument(KageDocument &p_document) { + if (this == &p_document) { + return; + } + KageScene::LOADING_MODE = true; - init(p_kage); + this->_saved = p_document._saved; + this->_activeSceneIndex = p_document._activeSceneIndex; + this->_activeScene = p_document._activeScene; + this->sceneCtr = p_document.sceneCtr; + this->_activeSceneID = p_document._activeSceneID; + + //TODO: copy asses for undo/redo of Assets -- Assets = p_document.Assets; + //ClassPointer = new Class(); + //*ClassPointer = *(p_document.ClassPointer); + this->removeAllScenes(); + for (unsigned int l_sceneIndex = 0; l_sceneIndex < p_document.Scenes.size(); ++l_sceneIndex) { + KageScene::LOADING_MODE = true; + this->addScene(p_document.Scenes[l_sceneIndex]->getLabel()); + *(this->Scenes[l_sceneIndex]) = *(p_document.Scenes[l_sceneIndex]); + } + + this->sceneCtr = p_document.sceneCtr; + this->_activeSceneID = p_document._activeSceneID; + + KageScene::LOADING_MODE = false; } -KageDocument::KageDocument(Kage *p_kage, KageProject p_project) { - setProjectInformation(p_project); + +KageDocument KageDocument::operator=(const KageDocument &p_document) { + if (this == &p_document) { + return *this; + } + KageScene::LOADING_MODE = true; + + this->_saved = p_document._saved; + this->_activeSceneIndex = p_document._activeSceneIndex; + this->_activeScene = p_document._activeScene; + this->sceneCtr = p_document.sceneCtr; + this->_activeSceneID = p_document._activeSceneID; + + //TODO: copy asses for undo/redo of Assets -- Assets = p_document.Assets; + //ClassPointer = new Class(); + //*ClassPointer = *(p_document.ClassPointer); + this->removeAllScenes(); + for (unsigned int l_sceneIndex = 0; l_sceneIndex < p_document.Scenes.size(); ++l_sceneIndex) { + KageScene::LOADING_MODE = true; + this->addScene(p_document.Scenes[l_sceneIndex]->getLabel()); + *(this->Scenes[l_sceneIndex]) = *(p_document.Scenes[l_sceneIndex]); + } + + this->sceneCtr = p_document.sceneCtr; + this->_activeSceneID = p_document._activeSceneID; - init(p_kage); + KageScene::LOADING_MODE = false; + + return *this; } -void KageDocument::init(Kage *p_kage) { +void KageDocument::init() { sceneCtr = 0; - _kage = p_kage; _activeSceneID = UINT_MAX; addScene(StringHelper::unsignedIntegerToString(sceneCtr+1)); _activeSceneIndex = 0; - setActiveSceneID(Scenes[_activeSceneIndex]->getID()); + _activeSceneID = Scenes[_activeSceneIndex]->getID(); _activeScene = _activeSceneIndex + 1; } KageDocument::~KageDocument() { - Scenes.clear(); - _kage = NULL; -} - -void KageDocument::setProjectInformation(KageProject p_project) { - Project._name = p_project._name; - Project._width = p_project._width; - Project._height = p_project._height; - Project._backgroundColor = p_project._backgroundColor; - Project._fps = p_project._fps; + //TODO: revisit + //removeAllScenes(); + //Scenes.clear(); } -unsigned int KageDocument::openScene(string p_filepath) { +unsigned int KageDocument::openScene(std::string p_filepath) { ++sceneCtr; - KageScene *l_scene = new KageScene(this, sceneCtr, p_filepath);// (this, sceneCtr); - l_scene->setLabel("openScene_p_sceneLabel"); - l_scene->setSelected(true); - Scenes.push_back(l_scene);//new KageScene(this, sceneCtr)); + _scenePtr = new KageScene(this, sceneCtr, p_filepath); + _scenePtr->setLabel("openScene_p_sceneLabel"); + _scenePtr->setSelected(true); + Scenes.push_back(_scenePtr); - setActiveSceneID(sceneCtr); + _activeSceneID = sceneCtr; return Scenes.size() - 1; } @@ -91,7 +134,7 @@ bool KageDocument::openProject() { bool KageDocument::saveProject() { //TODO: // 1. save project info - std::cout << ""; + //std::cout << ""; // 2. save AssetData // if image/video, filename, width, height // if ksf, save as Scene with name, data @@ -115,7 +158,7 @@ KageScene *KageDocument::getScene() { return Scenes[i]; } } - return NULL; + return Scenes[0]; //harder to handle NULL but needs to be reviewed why _activeSceneID is not matching the only Scene's ID } /** * @brief returns activeSceneIndex+1 @@ -140,8 +183,6 @@ unsigned int KageDocument::getCurrentScene() { void KageDocument::setCurrentScene(unsigned int p_currentScene) { int l_sceneCount = Scenes.size(); //unselect previously selected Scene - std::cout << "\nKageDocument::setCurrentScene l_sceneCount " << l_sceneCount << std::endl; - std::cout << "KageDocument::setCurrentScene p_currentScene " << p_currentScene << std::endl; if (_activeSceneIndex < l_sceneCount && Scenes[_activeSceneIndex]->getID() == _activeSceneID) { Scenes[_activeSceneIndex]->setSelected(false); } else { @@ -152,6 +193,7 @@ void KageDocument::setCurrentScene(unsigned int p_currentScene) { } } } + //select new scene if (p_currentScene > l_sceneCount) { p_currentScene = l_sceneCount; @@ -160,7 +202,7 @@ void KageDocument::setCurrentScene(unsigned int p_currentScene) { p_currentScene = 1; } _activeSceneIndex = p_currentScene-1; - setActiveSceneID(Scenes[_activeSceneIndex]->getID()); + _activeSceneID = Scenes[_activeSceneIndex]->getID(); _activeScene = p_currentScene; Scenes[_activeSceneIndex]->setSelected(true); } @@ -168,10 +210,6 @@ void KageDocument::setCurrentScene(unsigned int p_currentScene) { unsigned int KageDocument::getActiveSceneID() { return _activeSceneID; } -void KageDocument::setActiveSceneID(unsigned int p_activeSceneID) { - std::cout << "\nKageDocument::setActiveSceneID _activeSceneID " << _activeSceneID << " = " << p_activeSceneID << std::endl << std::endl; - _activeSceneID = p_activeSceneID; -} unsigned int KageDocument::getActiveLayerID() { try { return getScene()->getActiveLayerID(); @@ -194,12 +232,13 @@ unsigned int KageDocument::getActiveFrameID() { * * @return Scene ID of newly created Scene */ -unsigned int KageDocument::addScene(string p_sceneLabel) { +unsigned int KageDocument::addScene(std::string p_sceneLabel) { ++sceneCtr; //TODO: add scene above(or below) currently selected Scene - Scenes.push_back(new KageScene(this, sceneCtr)); + _scenePtr = new KageScene(this, sceneCtr); + Scenes.push_back(_scenePtr); if (_activeSceneID == UINT_MAX) { - setActiveSceneID(sceneCtr); + _activeSceneID = sceneCtr; } setCurrentScene(Scenes.size()); try { @@ -250,26 +289,6 @@ bool KageDocument::removeSceneAt(unsigned int p_sceneIndex) { return false; } -//======================================================================================= -KageProject::KageProject() { - _name = "Untitled"; - _width = 960.0f; - _height = 720.0f; - _backgroundColor = ColorData(255, 255, 255); - _fps = 12; -} - -KageProject::~KageProject() { - // -} - -string KageProject::toString() { - return "name=\"" + _name - + "\" width=\"" + StringHelper::doubleToString(_width) - + "\" height=\"" + StringHelper::doubleToString(_height) - + "\" background=\"rgb(" + StringHelper::integerToString(_backgroundColor.getR()) + ", " + StringHelper::integerToString(_backgroundColor.getG()) + ", " + StringHelper::integerToString(_backgroundColor.getB()) + ")\" " + - + "\" fps=\"" + StringHelper::unsignedIntegerToString(_fps) + "\""; -} unsigned int KageDocument::frameCount() { try { @@ -288,22 +307,7 @@ void KageDocument::setSceneLayerCurrentFrame(unsigned int p_frame) { } } -/** For use of Kage when User clicked Layer->Rename - * \sa renameLayer(KageLayer) - */ -void KageDocument::renameLayer() { - try { - string l_layerLabel = getScene()->getLayerLabel(); - - LabelRenameDialog* pDialog = new LabelRenameDialog(*_kage, l_layerLabel); - pDialog->run(); - getScene()->setLayerLabel(pDialog->getLabel()); - delete pDialog; - } catch (std::exception& e) { - std::cout << "KageDocument::renameLayer Exception : " << e.what() << std::endl; - } -} -string KageDocument::getLayerLabel() { +std::string KageDocument::getLayerLabel() { try { return getScene()->getLayerLabel(); } catch (std::exception& e) { @@ -311,7 +315,7 @@ string KageDocument::getLayerLabel() { return ""; } } -void KageDocument::setLayerLabel(string p_label) { +void KageDocument::setLayerLabel(std::string p_label) { try { getScene()->setLayerLabel(p_label); } catch (std::exception& e) { @@ -365,22 +369,6 @@ void KageDocument::setLayerLocked(bool p_lock) { } } -/** For use of Kage when User clicked Scene->Rename - * \sa renameScene(KageScenesUI) - */ -void KageDocument::renameScene() { - try { - string l_sceneLabel = getScene()->getLabel(); - - LabelRenameDialog* pDialog = new LabelRenameDialog(*_kage, l_sceneLabel); - pDialog->run(); - getScene()->setLabel(pDialog->getLabel()); - delete pDialog; - } catch (std::exception& e) { - std::cout << "KageDocument::renameScene Exception : " << e.what() << std::endl; - } -} - /** * NOTE: Scenes are organized as index 0 as BOTTOM and last index is TOP * \sa moveSceneDown() moveSceneToBottom() moveSceneUp() @@ -414,7 +402,7 @@ bool KageDocument::moveSceneToTop() { bool KageDocument::moveSceneUp() { if (_activeSceneIndex < Scenes.size() && Scenes[_activeSceneIndex]->getID() == _activeSceneID) { if (_activeSceneIndex < Scenes.size()-1) { - swap(Scenes[_activeSceneIndex], Scenes[_activeSceneIndex+1]); + std::swap(Scenes[_activeSceneIndex], Scenes[_activeSceneIndex+1]); _activeSceneIndex = _activeSceneIndex+1; return true; } @@ -423,7 +411,7 @@ bool KageDocument::moveSceneUp() { if (Scenes[i]->getID() == _activeSceneID) { _activeSceneIndex = i; if (_activeSceneIndex < Scenes.size()-1) { - swap(Scenes[_activeSceneIndex], Scenes[_activeSceneIndex+1]); + std::swap(Scenes[_activeSceneIndex], Scenes[_activeSceneIndex+1]); _activeSceneIndex = _activeSceneIndex+1; return true; } @@ -441,7 +429,7 @@ bool KageDocument::moveSceneUp() { bool KageDocument::moveSceneDown() { if (_activeSceneIndex < Scenes.size() && Scenes[_activeSceneIndex]->getID() == _activeSceneID) { if (_activeSceneIndex > 0) { - swap(Scenes[_activeSceneIndex], Scenes[_activeSceneIndex-1]); + std::swap(Scenes[_activeSceneIndex], Scenes[_activeSceneIndex-1]); --_activeSceneIndex; return true; } @@ -450,7 +438,7 @@ bool KageDocument::moveSceneDown() { if (Scenes[i]->getID() == _activeSceneID) { _activeSceneIndex = i; if (_activeSceneIndex > 0) { - swap(Scenes[_activeSceneIndex], Scenes[_activeSceneIndex-1]); + std::swap(Scenes[_activeSceneIndex], Scenes[_activeSceneIndex-1]); --_activeSceneIndex; return true; } diff --git a/studio/kage/document.h b/studio/kage/document.h index 19825f1..15ed612 100644 --- a/studio/kage/document.h +++ b/studio/kage/document.h @@ -65,24 +65,9 @@ #include "../util/string/stringhelper.h" #include - class Kage; //forward declaration - using namespace std; - class KageProject { - public: - string _name; - double _width; //made double for zoom - double _height; //ditto - ColorData _backgroundColor; - unsigned int _fps; - - KageProject(); - virtual ~KageProject(); - string toString(); - }; - class KageDocument { - protected: + public: bool _saved; unsigned int _activeSceneID; unsigned int _activeSceneIndex; @@ -90,22 +75,19 @@ unsigned int sceneCtr; ///will be used to create Unique sceneCtr IDs unsigned int _activeScene; - public: - KageProject Project; - Kage *_kage; - KageDocument(Kage *p_kage); - KageDocument(Kage *p_kage, KageProject p_project); - void init(Kage *p_kage); + KageDocument(); + KageDocument(KageDocument &p_document); + KageDocument operator=(const KageDocument &p_document); + void init(); virtual ~KageDocument(); - void setProjectInformation(KageProject p_project); - unsigned int openScene(string p_filepath); + unsigned int openScene(std::string p_filepath); bool saveScene(unsigned int p_sceneID); bool openProject(); bool saveProject(); bool isSaved(); - unsigned int addScene(string p_sceneLabel); + unsigned int addScene(std::string p_sceneLabel); bool removeAllScenes(); bool removeSceneAt(unsigned int p_sceneIndex); @@ -118,28 +100,27 @@ struct Asset { unsigned int ID; AssetType Type; - string Path; - string Name; + std::string Path; + std::string Name; }; //TODO: each instance of asset will reference to this std::vector Assets; //TODO: each Scene will be saved as separate KSF file std::vector Scenes; + KageScene* _scenePtr; KageScene *getScene(); unsigned int getCurrentScene(); ///returns index+1 void setCurrentScene(unsigned int p_scene); //p_scene-1 is index unsigned int getActiveSceneID(); - void setActiveSceneID(unsigned int p_activeSceneID); unsigned int getActiveLayerID(); unsigned int getActiveFrameID(); unsigned int frameCount(); void setSceneLayerCurrentFrame(unsigned int p_frame); - void renameLayer(); - string getLayerLabel(); - void setLayerLabel(string p_label); + std::string getLayerLabel(); + void setLayerLabel(std::string p_label); void toggleLayerVisibility(); bool isLayerVisible(); void setLayerVisible(bool p_visible); @@ -147,7 +128,6 @@ bool isLayerLocked(); void setLayerLocked(bool p_lock); - void renameScene(); bool moveSceneUp(); bool moveSceneDown(); bool moveSceneToTop(); diff --git a/studio/kage/library/asset.cpp b/studio/kage/library/asset.cpp index a9c0e30..2a75a18 100644 --- a/studio/kage/library/asset.cpp +++ b/studio/kage/library/asset.cpp @@ -262,17 +262,17 @@ bool KageAsset::on_draw(const Cairo::RefPtr& cr) { * \sa setFileName * @param p_assetHash */ -void KageAsset::setAssetHash(string p_assetHash) { +void KageAsset::setAssetHash(std::string p_assetHash) { _assetHash = p_assetHash; } -string KageAsset::getAssetHash() { +std::string KageAsset::getAssetHash() { return _assetHash; } -void KageAsset::setFilePath(string p_filePath) { +void KageAsset::setFilePath(std::string p_filePath) { _filePath = p_filePath; } -string KageAsset::getFilePath() { +std::string KageAsset::getFilePath() { return _filePath; } /** @@ -280,18 +280,18 @@ string KageAsset::getFilePath() { * \sa setAssetHash * @param p_fileName the original File Name */ -void KageAsset::setFileName(string p_fileName) { +void KageAsset::setFileName(std::string p_fileName) { _fileName = p_fileName; } -string KageAsset::getFileName() { +std::string KageAsset::getFileName() { return _fileName; } -void KageAsset::setLabel(string p_label) { +void KageAsset::setLabel(std::string p_label) { _label = p_label; invalidateToRender(); } -string KageAsset::getLabel() { +std::string KageAsset::getLabel() { return _label; } void KageAsset::setSelected(bool p_selected) { diff --git a/studio/kage/library/asset.h b/studio/kage/library/asset.h index 0c90276..2532ce3 100644 --- a/studio/kage/library/asset.h +++ b/studio/kage/library/asset.h @@ -1,6 +1,6 @@ /* * Kage Studio - a simple free and open source vector-based 2D animation software - * Copyright (C) 2011~2023 Mj Mendoza IV + * Copyright (C) 2011~2024 Mj Mendoza IV * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -48,16 +48,16 @@ KageAsset(KageAssetManager *p_assetManager, unsigned p_assetID); virtual ~KageAsset(); - void setAssetHash(string p_assetHash); - string getAssetHash(); + void setAssetHash(std::string p_assetHash); + std::string getAssetHash(); - void setFilePath(string p_filePath); - string getFilePath(); - void setFileName(string p_fileName); - string getFileName(); + void setFilePath(std::string p_filePath); + std::string getFilePath(); + void setFileName(std::string p_fileName); + std::string getFileName(); - void setLabel(string p_label); - string getLabel(); + void setLabel(std::string p_label); + std::string getLabel(); void setSelected(bool p_selected); bool isSelected(); void setFocus(); @@ -77,7 +77,7 @@ void render(unsigned int p_assetID); void render(); protected: - string _assetHash; + std::string _assetHash; //Override default signal handler: virtual bool on_expose_event(GdkEventExpose *e); @@ -88,11 +88,11 @@ bool on_draw(const Cairo::RefPtr& cr) override; bool _selected; KageAsset::AssetType _assetType; - string _label; + std::string _label; KageAssetManager *_assetManager; - string _filePath; - string _fileName; + std::string _filePath; + std::string _fileName; unsigned int _renderAssetID; bool _CTRL; diff --git a/studio/kage/library/assetmanager.cpp b/studio/kage/library/assetmanager.cpp index e2c9424..9e2c6cd 100644 --- a/studio/kage/library/assetmanager.cpp +++ b/studio/kage/library/assetmanager.cpp @@ -35,9 +35,9 @@ KageAssetManager::~KageAssetManager() { assets.clear(); } -unsigned int KageAssetManager::addAsset(string p_name) { - string l_filePath; - string l_fileName; +unsigned int KageAssetManager::addAsset(std::string p_name) { + std::string l_filePath; + std::string l_fileName; /** * TODO: @@ -48,7 +48,7 @@ unsigned int KageAssetManager::addAsset(string p_name) { * use kHash from Quixie */ - string l_hash = StringHelper::kHash(p_name, 24); + std::string l_hash = StringHelper::kHash(p_name, 24); int l_len = strlen(p_name.c_str()) - 4; if (p_name == "") { //p_name = Glib::ustring::compose("Asset %1", assetCtr); @@ -73,23 +73,23 @@ unsigned int KageAssetManager::addAsset(string p_name) { * 11. add image on stage FROM ASSET (drag-n-drop) */ - filesystem::path l_sourceFile = p_name; - if (filesystem::exists(l_sourceFile) == true) { + std::filesystem::path l_sourceFile = p_name; + if (std::filesystem::exists(l_sourceFile) == true) { l_fileName = l_sourceFile.filename().u8string(); - l_filePath = filesystem::path(p_name).remove_filename().u8string(); + l_filePath = std::filesystem::path(p_name).remove_filename().u8string(); - filesystem::path l_currentPath = filesystem::current_path(); - filesystem::current_path(filesystem::temp_directory_path()); + std::filesystem::path l_currentPath = std::filesystem::current_path(); + std::filesystem::current_path(std::filesystem::temp_directory_path()); - filesystem::create_directories(_KageStudioAsset); - //const auto copyOptions = filesystem::copy_options::update_existing; - //| filesystem::copy_options::recursive; <-- use in future when importing project file which will import ALL assets - filesystem::path l_assetFile = filesystem::temp_directory_path() / _KageStudioAsset / l_hash; - if (filesystem::exists(l_assetFile) == true) { + std::filesystem::create_directories(_KageStudioAsset); + //const auto copyOptions = std::filesystem::copy_options::update_existing; + //| std::filesystem::copy_options::recursive; <-- use in future when importing project file which will import ALL assets + std::filesystem::path l_assetFile = std::filesystem::temp_directory_path() / _KageStudioAsset / l_hash; + if (std::filesystem::exists(l_assetFile) == true) { //delete l_assetFile const char* filename = l_assetFile.u8string().c_str(); - //if (filesystem::remove_all(l_assetFile) == false) { //it's not deleting somehow + //if (std::filesystem::remove_all(l_assetFile) == false) { //it's not deleting somehow if (std::remove(filename) != 0) { std::perror("Error deleting file"); return UINT_MAX; @@ -98,13 +98,13 @@ unsigned int KageAssetManager::addAsset(string p_name) { } } - //filesystem::copy(l_sourceFile, l_assetFile, filesystem::copy_options::update_existing); + //std::filesystem::copy(l_sourceFile, l_assetFile, std::filesystem::copy_options::update_existing); //as above code is not working with GCC 13 std::ifstream src(l_sourceFile.u8string(), std::ios::binary); std::ofstream dst( l_assetFile.u8string(), std::ios::binary); dst << src.rdbuf(); - filesystem::current_path(l_currentPath); + std::filesystem::current_path(l_currentPath); p_name = l_fileName; } else { @@ -134,33 +134,33 @@ unsigned int KageAssetManager::addAsset(string p_name) { * @param p_name Image file with full path * @return unsigned int */ -unsigned int KageAssetManager::addImageAsset(string p_name) { - string l_filePath; - string l_fileName; +unsigned int KageAssetManager::addImageAsset(std::string p_name) { + std::string l_filePath; + std::string l_fileName; - string l_hash = StringHelper::kHash(p_name, 24); + std::string l_hash = StringHelper::kHash(p_name, 24); if (p_name == "") { return UINT_MAX; } else { - filesystem::path l_sourceFile = p_name; - if (filesystem::exists(l_sourceFile) == true) { + std::filesystem::path l_sourceFile = p_name; + if (std::filesystem::exists(l_sourceFile) == true) { l_fileName = l_sourceFile.filename().u8string(); - l_filePath = filesystem::path(p_name).remove_filename().u8string(); + l_filePath = std::filesystem::path(p_name).remove_filename().u8string(); l_hash = l_fileName; std::cout << "l_fileName " << l_fileName << std::endl; std::cout << "l_filePath " << l_filePath << std::endl; - filesystem::path l_currentPath = filesystem::current_path(); - filesystem::current_path(filesystem::temp_directory_path()); + std::filesystem::path l_currentPath = std::filesystem::current_path(); + std::filesystem::current_path(std::filesystem::temp_directory_path()); - filesystem::create_directories(_KageStudioAsset); - //const auto copyOptions = filesystem::copy_options::update_existing; - //| filesystem::copy_options::recursive; <-- use in future when importing project file which will import ALL assets - filesystem::path l_assetFile = filesystem::temp_directory_path() / _KageStudioAsset / l_hash; - if (filesystem::exists(l_assetFile) == true) { + std::filesystem::create_directories(_KageStudioAsset); + //const auto copyOptions = std::filesystem::copy_options::update_existing; + //| std::filesystem::copy_options::recursive; <-- use in future when importing project file which will import ALL assets + std::filesystem::path l_assetFile = std::filesystem::temp_directory_path() / _KageStudioAsset / l_hash; + if (std::filesystem::exists(l_assetFile) == true) { //delete l_assetFile const char* filename = l_assetFile.u8string().c_str(); - //if (filesystem::remove_all(l_assetFile) == false) { //it's not deleting somehow + //if (std::filesystem::remove_all(l_assetFile) == false) { //it's not deleting somehow if (std::remove(filename) != 0) { std::perror("Error deleting file"); return UINT_MAX; @@ -169,13 +169,13 @@ unsigned int KageAssetManager::addImageAsset(string p_name) { } } - //filesystem::copy(l_sourceFile, l_assetFile, filesystem::copy_options::update_existing); + //std::filesystem::copy(l_sourceFile, l_assetFile, std::filesystem::copy_options::update_existing); //as above code is not working with GCC 13 std::ifstream src(l_sourceFile.u8string(), std::ios::binary); std::ofstream dst( l_assetFile.u8string(), std::ios::binary); dst << src.rdbuf(); - filesystem::current_path(l_currentPath); + std::filesystem::current_path(l_currentPath); p_name = l_fileName; } else { @@ -519,7 +519,7 @@ void KageAssetManager::renameAsset() { * * @param p_label the new label for the active Asset */ -void KageAssetManager::setLabel(string p_label) { +void KageAssetManager::setLabel(std::string p_label) { if (_currentAssetIndex < assetCount() && assets[_currentAssetIndex]->assetID == _currentAssetID) { assets[_currentAssetIndex]->setLabel(p_label); } else { @@ -533,7 +533,7 @@ void KageAssetManager::setLabel(string p_label) { } } -string KageAssetManager::getLabel() { +std::string KageAssetManager::getLabel() { if (_currentAssetIndex < assetCount() && assets[_currentAssetIndex]->assetID == _currentAssetID) { return assets[_currentAssetIndex]->getLabel(); } else { @@ -581,7 +581,7 @@ bool KageAssetManager::moveUp() { if (_currentAssetIndex < assetCount() && assets[_currentAssetIndex]->assetID == _currentAssetID) { if (_currentAssetIndex < assetCount()-1) { reorder_child(*assets[_currentAssetIndex], _currentAssetIndex+1); - swap(assets[_currentAssetIndex], assets[_currentAssetIndex+1]); + std::swap(assets[_currentAssetIndex], assets[_currentAssetIndex+1]); _currentAssetIndex = _currentAssetIndex+1; return true; } @@ -591,7 +591,7 @@ bool KageAssetManager::moveUp() { _currentAssetIndex = i; if (_currentAssetIndex < assetCount()-1) { reorder_child(*assets[_currentAssetIndex], _currentAssetIndex+1); - swap(assets[_currentAssetIndex], assets[_currentAssetIndex+1]); + std::swap(assets[_currentAssetIndex], assets[_currentAssetIndex+1]); _currentAssetIndex = _currentAssetIndex+1; return true; } @@ -610,7 +610,7 @@ bool KageAssetManager::moveDown() { if (_currentAssetIndex < assetCount() && assets[_currentAssetIndex]->assetID == _currentAssetID) { if (_currentAssetIndex > 0) { reorder_child(*assets[_currentAssetIndex], _currentAssetIndex-1); - swap(assets[_currentAssetIndex], assets[_currentAssetIndex-1]); + std::swap(assets[_currentAssetIndex], assets[_currentAssetIndex-1]); --_currentAssetIndex; return true; } @@ -620,7 +620,7 @@ bool KageAssetManager::moveDown() { _currentAssetIndex = i; if (_currentAssetIndex > 0) { reorder_child(*assets[_currentAssetIndex], _currentAssetIndex-1); - swap(assets[_currentAssetIndex], assets[_currentAssetIndex-1]); + std::swap(assets[_currentAssetIndex], assets[_currentAssetIndex-1]); --_currentAssetIndex; return true; } @@ -661,10 +661,10 @@ bool KageAssetManager::moveToBottom() { * @param p_filePath Asset's full path1 * \return true if p_filePath is in AssetManager. Otherwise, false. */ -bool KageAssetManager::exists(string p_filePath) { +bool KageAssetManager::exists(std::string p_filePath) { bool l_return = false; unsigned int l_assetCount = assetCount(); - string l_assetHash = StringHelper::kHash(p_filePath, 24); + std::string l_assetHash = StringHelper::kHash(p_filePath, 24); std::cout << "l_assetHash " << l_assetHash << std::endl; for (unsigned int i = 0; i < l_assetCount; ++i) { std::cout << " " << assets[i]->getAssetHash() << " == " << l_assetHash << std::endl; @@ -679,7 +679,7 @@ bool KageAssetManager::exists(string p_filePath) { * Set's an Asset's hash * @param p_assetHash */ -void KageAssetManager::setAssetHash(string p_assetHash) { +void KageAssetManager::setAssetHash(std::string p_assetHash) { if (_currentAssetIndex < assetCount() && assets[_currentAssetIndex]->assetID == _currentAssetID) { assets[_currentAssetIndex]->setAssetHash(p_assetHash); } else { @@ -692,14 +692,14 @@ void KageAssetManager::setAssetHash(string p_assetHash) { } } -string KageAssetManager::getImagePathByID(unsigned int p_index) { +std::string KageAssetManager::getImagePathByID(unsigned int p_index) { std::cout << "p_index " << p_index << std::endl; - filesystem::path path_tempPath = filesystem::temp_directory_path(); + std::filesystem::path path_tempPath = std::filesystem::temp_directory_path(); // stringstream stream_tempPath; // stream_tempPath << path_tempPath; -// string l_tempPath; +// std::string l_tempPath; // stream_tempPath >> l_tempPath; - string l_tempPath { path_tempPath.u8string() }; + std::string l_tempPath { path_tempPath.u8string() }; std::cout << " ? " << l_tempPath << _KageStudioAsset << "\\" << assets[p_index]->getAssetHash() << std::endl; if (p_index < assetCount() && assets[p_index]->getAssetHash() != "") { #ifdef __linux__ @@ -722,7 +722,7 @@ string KageAssetManager::getImagePathByID(unsigned int p_index) { * For use by Stage when rendering an Asset, it needs the image path (why not the loaded image object?) * @param p_id */ -string KageAssetManager::getImageByID(unsigned int p_id) { +std::string KageAssetManager::getImageByID(unsigned int p_id) { if (_currentAssetIndex < assetCount() && assets[_currentAssetIndex]->assetID == p_id) { return getImagePathByID(_currentAssetIndex); } else { @@ -744,7 +744,7 @@ string KageAssetManager::getImageByID(unsigned int p_id) { * @return true if asset index exists * @return false */ -bool KageAssetManager::setFilePathAt(unsigned int p_index, string p_filePath) { +bool KageAssetManager::setFilePathAt(unsigned int p_index, std::string p_filePath) { if (p_index < assetCount() && assets[p_index]->getAssetHash() != "") { assets[p_index]->setFilePath(p_filePath); return true; @@ -755,7 +755,7 @@ bool KageAssetManager::setFilePathAt(unsigned int p_index, string p_filePath) { * For use by saveAssetsTo when Exporting; returns path like /home/creek23/assets/ * @param p_index */ -string KageAssetManager::getFilePathAt(unsigned int p_index) { +std::string KageAssetManager::getFilePathAt(unsigned int p_index) { if (p_index < assetCount() && assets[p_index]->getAssetHash() != "") { return assets[p_index]->getFilePath(); } @@ -769,7 +769,7 @@ string KageAssetManager::getFilePathAt(unsigned int p_index) { * @return true if asset index exists * @return false */ -bool KageAssetManager::setFileNameAt(unsigned int p_index, string p_fileName) { +bool KageAssetManager::setFileNameAt(unsigned int p_index, std::string p_fileName) { if (p_index < assetCount() && assets[p_index]->getAssetHash() != "") { assets[p_index]->setFileName(p_fileName); return true; @@ -780,7 +780,7 @@ bool KageAssetManager::setFileNameAt(unsigned int p_index, string p_fileName) { * For use by saveAssetsTo when Exporting; returns path like image.png * @param p_index */ -string KageAssetManager::getFileNameAt(unsigned int p_index) { +std::string KageAssetManager::getFileNameAt(unsigned int p_index) { if (p_index < assetCount() && assets[p_index]->getAssetHash() != "") { return assets[p_index]->getFileName(); } @@ -790,14 +790,14 @@ string KageAssetManager::getFileNameAt(unsigned int p_index) { * For use by saveAssetsTo when Exporting; returns label as scene on AssetManager * @param p_index */ -string KageAssetManager::getLabelAt(unsigned int p_index) { +std::string KageAssetManager::getLabelAt(unsigned int p_index) { if (p_index < assetCount() && assets[p_index]->getAssetHash() != "") { return assets[p_index]->getLabel(); } return ""; } -bool KageAssetManager::setHashAt(unsigned int p_index, string p_hash) { +bool KageAssetManager::setHashAt(unsigned int p_index, std::string p_hash) { if (p_index < assetCount() && assets[p_index]->getAssetHash() != "") { assets[p_index]->setAssetHash(p_hash); return true; @@ -808,7 +808,7 @@ bool KageAssetManager::setHashAt(unsigned int p_index, string p_hash) { * For use by saveAssetsTo when Exporting; returns hash of '/home/creek23/assets/image.png' * @param p_index */ -string KageAssetManager::getHashAt(unsigned int p_index) { +std::string KageAssetManager::getHashAt(unsigned int p_index) { if (p_index < assetCount() && assets[p_index]->getAssetHash() != "") { return assets[p_index]->getAssetHash(); } @@ -819,23 +819,23 @@ string KageAssetManager::getHashAt(unsigned int p_index) { * For use by Kage when Exporting; returns XML string as part of .kage file * @param p_path */ -string KageAssetManager::saveAssetsTo(string p_path) { +std::string KageAssetManager::saveAssetsTo(std::string p_path) { unsigned int l_assetMax = assets.size(); - string l_assetXML = ""; - string l_hash = ""; + std::string l_assetXML = ""; + std::string l_hash = ""; for (unsigned int i = 0; i < l_assetMax; ++i) { //ASSET_KAGE are KSF files considered as Scenes if (assets[i]->getAssetType() != KageAsset::AssetType::ASSET_KAGE) { l_hash = getHashAt(i); - filesystem::path l_sourceFile = filesystem::temp_directory_path() / _KageStudioAsset / l_hash; - filesystem::path l_assetFile = filesystem::path(p_path) / l_hash; - string l_filenames = l_sourceFile.u8string() + " " + l_assetFile.u8string(); + std::filesystem::path l_sourceFile = std::filesystem::temp_directory_path() / _KageStudioAsset / l_hash; + std::filesystem::path l_assetFile = std::filesystem::path(p_path) / l_hash; + std::string l_filenames = l_sourceFile.u8string() + " " + l_assetFile.u8string(); - //filesystem::copy(l_sourceFile, l_assetFile, filesystem::copy_options::overwrite_existing); + //std::filesystem::copy(l_sourceFile, l_assetFile, std::filesystem::copy_options::overwrite_existing); //as above code is not working with GCC 13 - if (filesystem::exists(l_assetFile)) { - filesystem::remove_all(l_assetFile); + if (std::filesystem::exists(l_assetFile)) { + std::filesystem::remove_all(l_assetFile); } std::ifstream src(l_sourceFile.u8string(), std::ios::binary); std::ofstream dst( l_assetFile.u8string(), std::ios::binary); diff --git a/studio/kage/library/assetmanager.h b/studio/kage/library/assetmanager.h index 64b9cda..0bb78f3 100644 --- a/studio/kage/library/assetmanager.h +++ b/studio/kage/library/assetmanager.h @@ -38,8 +38,8 @@ KageAssetManager(Kage *p_kage); virtual ~KageAssetManager(); unsigned int assetCount(); - unsigned int addAsset(string p_name = ""); - unsigned int addImageAsset(string p_name = ""); + unsigned int addAsset(std::string p_name = ""); + unsigned int addImageAsset(std::string p_name = ""); void deleteAsset(); bool removeAllAssets(); void setSelected(KageAsset *p_asset); @@ -58,30 +58,30 @@ void renameAsset(KageAsset *p_asset); void renameAsset(); - void setLabel(string p_label); - string getLabel(); + void setLabel(std::string p_label); + std::string getLabel(); bool moveToTop(); bool moveUp(); bool moveDown(); bool moveToBottom(); - bool exists(string p_filePath); - void setAssetHash(string p_assetHash); + bool exists(std::string p_filePath); + void setAssetHash(std::string p_assetHash); - string _KageStudioAsset; - string getImagePathByID(unsigned int p_index); - string getImageByID(unsigned int p_id); - string getFilePathAt(unsigned int p_index); - string getFileNameAt(unsigned int p_index); - string getLabelAt(unsigned int p_index); - string getHashAt(unsigned int p_index); - string getIDAt(unsigned int p_index); - bool setFilePathAt(unsigned int p_index, string p_filePath); - bool setFileNameAt(unsigned int p_index, string p_fileName); - bool setHashAt(unsigned int p_index, string p_hash); - - string saveAssetsTo(string p_path); + std::string _KageStudioAsset; + std::string getImagePathByID(unsigned int p_index); + std::string getImageByID(unsigned int p_id); + std::string getFilePathAt(unsigned int p_index); + std::string getFileNameAt(unsigned int p_index); + std::string getLabelAt(unsigned int p_index); + std::string getHashAt(unsigned int p_index); + std::string getIDAt(unsigned int p_index); + bool setFilePathAt(unsigned int p_index, std::string p_filePath); + bool setFileNameAt(unsigned int p_index, std::string p_fileName); + bool setHashAt(unsigned int p_index, std::string p_hash); + + std::string saveAssetsTo(std::string p_path); void renderLibrary(unsigned int p_ID); diff --git a/studio/kage/library/library.cpp b/studio/kage/library/library.cpp index 1c60fed..b779dd1 100644 --- a/studio/kage/library/library.cpp +++ b/studio/kage/library/library.cpp @@ -172,7 +172,6 @@ bool KageLibrary::on_draw(const Cairo::RefPtr& p_context) { p_context->fill_preserve(); //TODO: check if _renderAssetID is IMAGE - std::cout << "_renderAssetID " << _renderAssetID << " " << UINT_MAX << std::endl; if (_renderAssetID != UINT_MAX && _kage->_stage.cairoPNG[_renderAssetID]) { try { KageStage::cairoImageSurface = _kage->_stage.cairoPNG[_renderAssetID]; @@ -260,7 +259,7 @@ void KageLibrary::setFocus() { grab_focus(); } -vector KageLibrary::raiseSelectedShape(vector p_selectedShapes) { +std::vector KageLibrary::raiseSelectedShape(std::vector p_selectedShapes) { std::vector foo; return foo; } diff --git a/studio/kage/library/library.h b/studio/kage/library/library.h index b07efcf..55cd267 100644 --- a/studio/kage/library/library.h +++ b/studio/kage/library/library.h @@ -65,9 +65,9 @@ static bool _gotFocus; - std::vector raiseSelectedShape(vector p_selectedShapes); + std::vector raiseSelectedShape(std::vector p_selectedShapes); - bool recenterRotationPoint(vector p_selectedShapes); + bool recenterRotationPoint(std::vector p_selectedShapes); void addDataToFrame(VectorDataManager v); diff --git a/studio/kage/properties/asset.h b/studio/kage/properties/asset.h index c3604e8..e4680b2 100644 --- a/studio/kage/properties/asset.h +++ b/studio/kage/properties/asset.h @@ -1,6 +1,6 @@ /* * Kage Studio - a simple free and open source vector-based 2D animation software - * Copyright (C) 2023 Mj Mendoza IV + * Copyright (C) 2023~2024 Mj Mendoza IV * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -31,8 +31,6 @@ class Kage; //forward declaration - using namespace std; - class PropertyAsset : public Gtk::HBox { public: PropertyAsset(Kage* p_kage); diff --git a/studio/kage/properties/fillstroke.cpp b/studio/kage/properties/fillstroke.cpp index f9b77b6..6bf5125 100644 --- a/studio/kage/properties/fillstroke.cpp +++ b/studio/kage/properties/fillstroke.cpp @@ -332,7 +332,7 @@ void PropertyFillStroke::FillAlpha_onChange() { void PropertyFillStroke::EntryFillRGBA_onEnter() { //see: https://sourceforge.net/p/kage/tickets/66/?limit=25#7488 - string l_input = m_EntryFillRGBA.get_text(); + std::string l_input = m_EntryFillRGBA.get_text(); unsigned int l_inputLength = l_input.length(); unsigned int l_R = 0; unsigned int l_G = 0; @@ -343,10 +343,10 @@ void PropertyFillStroke::EntryFillRGBA_onEnter() { } else { l_A = KageStage::fillColor.getA(); } - string l_sR = ""; - string l_sG = ""; - string l_sB = ""; - string l_sA = ""; + std::string l_sR = ""; + std::string l_sG = ""; + std::string l_sB = ""; + std::string l_sA = ""; if (l_inputLength == 1) { l_sR = l_input + l_input; @@ -502,7 +502,7 @@ void PropertyFillStroke::StrokeAlpha_onChange() { } void PropertyFillStroke::EntryStrokeRGBA_onEnter() { //see: https://sourceforge.net/p/kage/tickets/66/?limit=25#7488 - string l_input = m_EntryStrokeRGBA.get_text(); + std::string l_input = m_EntryStrokeRGBA.get_text(); unsigned int l_inputLength = l_input.length(); unsigned int l_R = 0; unsigned int l_G = 0; @@ -513,10 +513,10 @@ void PropertyFillStroke::EntryStrokeRGBA_onEnter() { } else { l_A = KageStage::stroke.getA(); } - string l_sR = ""; - string l_sG = ""; - string l_sB = ""; - string l_sA = ""; + std::string l_sR = ""; + std::string l_sG = ""; + std::string l_sB = ""; + std::string l_sA = ""; if (l_inputLength == 1) { l_sR = l_input + l_input; @@ -651,7 +651,7 @@ void PropertyFillStroke::setScaleStrokeRGBA(ColorData p_colordata) { void PropertyFillStroke::setStrokeThicknessText(double p_thickness) { m_EntryStrokeThickness.set_text(StringHelper::doubleToString(p_thickness)); } -string PropertyFillStroke::getStrokeThicknessText() { +std::string PropertyFillStroke::getStrokeThicknessText() { return m_EntryStrokeThickness.get_text(); } diff --git a/studio/kage/properties/fillstroke.h b/studio/kage/properties/fillstroke.h index d8e2037..0918c54 100644 --- a/studio/kage/properties/fillstroke.h +++ b/studio/kage/properties/fillstroke.h @@ -1,6 +1,6 @@ /* * Kage Studio - a simple free and open source vector-based 2D animation software - * Copyright (C) 2011~2023 Mj Mendoza IV + * Copyright (C) 2011~2024 Mj Mendoza IV * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -32,8 +32,6 @@ class Kage; //forward declaration - using namespace std; - class PropertyFillStroke : public Gtk::VBox { public: PropertyFillStroke(Kage* p_kage); @@ -122,7 +120,7 @@ void setScaleFillRGBA(ColorData p_colordata); void setScaleStrokeRGBA(ColorData p_colordata); void setStrokeThicknessText(double p_thickness); - string getStrokeThicknessText(); + std::string getStrokeThicknessText(); Gdk::Color getFillColor(); Gdk::Color getStrokeColor(); diff --git a/studio/kage/properties/frametween.cpp b/studio/kage/properties/frametween.cpp index 783ad04..6a0763b 100644 --- a/studio/kage/properties/frametween.cpp +++ b/studio/kage/properties/frametween.cpp @@ -81,9 +81,9 @@ void PropertyFrameTween::FrameTween_onChange() { std::cout << "FrameTween_onChange X = " << nameX << " Y = " << nameY << " l_tweenX " << (l_tweenX+l_tweenY) << std::endl; } -void PropertyFrameTween::setTweenXText(string p_tween) { +void PropertyFrameTween::setTweenXText(std::string p_tween) { m_ComboX.set_active_text(p_tween); } -void PropertyFrameTween::setTweenYText(string p_tween) { +void PropertyFrameTween::setTweenYText(std::string p_tween) { m_ComboY.set_active_text(p_tween); } \ No newline at end of file diff --git a/studio/kage/properties/frametween.h b/studio/kage/properties/frametween.h index c94b030..7ee7e67 100644 --- a/studio/kage/properties/frametween.h +++ b/studio/kage/properties/frametween.h @@ -1,6 +1,6 @@ /* * Kage Studio - a simple free and open source vector-based 2D animation software - * Copyright (C) 2011~2023 Mj Mendoza IV + * Copyright (C) 2011~2024 Mj Mendoza IV * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -29,8 +29,6 @@ class Kage; //forward declaration - using namespace std; - class PropertyFrameTween : public Gtk::HBox { public: PropertyFrameTween(Kage* p_kage); @@ -48,7 +46,7 @@ public: void FrameTween_onChange(); - void setTweenXText(string p_tween); - void setTweenYText(string p_tween); + void setTweenXText(std::string p_tween); + void setTweenYText(std::string p_tween); }; #endif //GTKMM_KAGE_PROP_FRAME_TWEEN_H diff --git a/studio/kage/properties/locationsize.h b/studio/kage/properties/locationsize.h index f040c04..6ad07b8 100644 --- a/studio/kage/properties/locationsize.h +++ b/studio/kage/properties/locationsize.h @@ -1,6 +1,6 @@ /* * Kage Studio - a simple free and open source vector-based 2D animation software - * Copyright (C) 2011~2023 Mj Mendoza IV + * Copyright (C) 2011~2024 Mj Mendoza IV * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -30,8 +30,6 @@ class Kage; //forward declaration - using namespace std; - class PropertyLocationSize : public Gtk::HBox { public: PropertyLocationSize(Kage* p_kage); diff --git a/studio/kage/properties/nodexy.h b/studio/kage/properties/nodexy.h index d52211e..c3189a8 100644 --- a/studio/kage/properties/nodexy.h +++ b/studio/kage/properties/nodexy.h @@ -1,6 +1,6 @@ /* * Kage Studio - a simple free and open source vector-based 2D animation software - * Copyright (C) 2011~2023 Mj Mendoza IV + * Copyright (C) 2011~2024 Mj Mendoza IV * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -30,8 +30,6 @@ class Kage; //forward declaration - using namespace std; - class PropertyNodeXY : public Gtk::HBox { public: PropertyNodeXY(Kage* p_kage); diff --git a/studio/kage/properties/stage.cpp b/studio/kage/properties/stage.cpp index 5fcaef6..b5eb5bc 100644 --- a/studio/kage/properties/stage.cpp +++ b/studio/kage/properties/stage.cpp @@ -47,13 +47,13 @@ PropertyStage::PropertyStage(Kage* p_kage) : m_EntryStageWid.set_size_request(20, 24); m_EntryStageWid.set_width_chars(4); m_EntryStageWid.set_max_length(4); - setWidthText(_kage->_document.Project._width); + setWidthText(_kage->_document._width); m_EntryStageWid.signal_activate().connect( sigc::mem_fun(*this, &PropertyStage::EntryStageArea_onEnter) ); m_EntryStageHgt.set_size_request(20, 24); m_EntryStageHgt.set_width_chars(4); m_EntryStageHgt.set_max_length(4); - setHeightText(_kage->_document.Project._height); + setHeightText(_kage->_document._height); m_EntryStageHgt.signal_activate().connect( sigc::mem_fun(*this, &PropertyStage::EntryStageArea_onEnter) ); m_ColorButtonStage.set_size_request(32, 32); @@ -64,7 +64,7 @@ PropertyStage::PropertyStage(Kage* p_kage) : m_EntryStageFPS.set_size_request(20, 24); m_EntryStageFPS.set_width_chars(3); m_EntryStageFPS.set_max_length(3); - setFPSText(_kage->_document.Project._fps); + setFPSText(_kage->_document._fps); m_EntryStageFPS.signal_activate().connect( sigc::mem_fun(*this, &PropertyStage::EntryStageFPS_onEnter) ); } @@ -74,20 +74,18 @@ PropertyStage::~PropertyStage() { } void PropertyStage::EntryStageArea_onEnter() { - string t = m_EntryStageWid.get_text(); - _kage->_document.Project._width = StringHelper::toDouble(t); - setWidthText(_kage->_document.Project._width); + std::string t = m_EntryStageWid.get_text(); + _kage->_document._width = StringHelper::toDouble(t); + setWidthText(_kage->_document._width); t = m_EntryStageHgt.get_text(); - _kage->_document.Project._height = StringHelper::toDouble(t); - setHeightText(_kage->_document.Project._height); + _kage->_document._height = StringHelper::toDouble(t); + setHeightText(_kage->_document._height); _kage->_stage.invalidateToRender(); } void PropertyStage::EntryStageFPS_onEnter() { - string t = m_EntryStageFPS.get_text(); - std::cout << "_kage->_document.Project._fps " << _kage->_document.Project._fps << " t " << t << std::endl; - _kage->_document.Project._fps = StringHelper::toUnsignedInteger(t); - std::cout << "_kage->_document.Project._fps ..." << _kage->_document.Project._fps << " t " << t << std::endl; - setFPSText(_kage->_document.Project._fps); + std::string t = m_EntryStageFPS.get_text(); + _kage->_document._fps = StringHelper::toUnsignedInteger(t); + setFPSText(_kage->_document._fps); } void PropertyStage::ColorButtonStage_onClick() { diff --git a/studio/kage/properties/stage.h b/studio/kage/properties/stage.h index 225875f..bd4fee7 100644 --- a/studio/kage/properties/stage.h +++ b/studio/kage/properties/stage.h @@ -1,6 +1,6 @@ /* * Kage Studio - a simple free and open source vector-based 2D animation software - * Copyright (C) 2011~2023 Mj Mendoza IV + * Copyright (C) 2011~2024 Mj Mendoza IV * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -30,8 +30,6 @@ class Kage; //forward declaration - using namespace std; - class PropertyStage : public Gtk::HBox { public: PropertyStage(Kage* p_kage); diff --git a/studio/kage/stage/node.cpp b/studio/kage/stage/node.cpp index edd0656..fd57150 100644 --- a/studio/kage/stage/node.cpp +++ b/studio/kage/stage/node.cpp @@ -1051,7 +1051,7 @@ bool KageStage::deleteSelectedNodes() { Kage::timestamp_IN(); std::cout << " KageStage::deleteSelectedNodes " << selectedNodes.size() << std::endl; - sort(selectedNodes.begin(), selectedNodes.end(), greater ()); + sort(selectedNodes.begin(), selectedNodes.end(), std::greater ()); for (unsigned int l_selectedNode = 0; l_selectedNode < selectedNodes.size(); ++l_selectedNode) { Kage::timestamp_IN(); diff --git a/studio/kage/stage/shape.cpp b/studio/kage/stage/shape.cpp index 4659b10..de72c4c 100644 --- a/studio/kage/stage/shape.cpp +++ b/studio/kage/stage/shape.cpp @@ -25,11 +25,11 @@ #include "../../kage.h" #include -void KageStage::setSelectedShapes(vector p_selectedShapes) { +void KageStage::setSelectedShapes(std::vector p_selectedShapes) { selectedNodes = p_selectedShapes; tryMultiSelectShapes_populateShapes(); } -vector KageStage::getSelectedShapes() { +std::vector KageStage::getSelectedShapes() { return selectedShapes; } @@ -1441,7 +1441,7 @@ bool KageStage::deleteSelectedShapes() { } std::vector l_selectedShapesOld(selectedShapes); - sort(l_selectedShapesOld.begin(), l_selectedShapesOld.end(), greater ()); + sort(l_selectedShapesOld.begin(), l_selectedShapesOld.end(), std::greater ()); std::vector v = _kage->getFrameData().getVectorData(); diff --git a/studio/kage/stage/stage.cpp b/studio/kage/stage/stage.cpp index bedbc44..cef2d85 100644 --- a/studio/kage/stage/stage.cpp +++ b/studio/kage/stage/stage.cpp @@ -725,7 +725,7 @@ Gdk::Color KageStage::getStroke() { return l_c; } -void KageStage::printVectors(vector p_vectorData) { +void KageStage::printVectors(std::vector p_vectorData) { Kage::timestamp_IN(); std::cout << " KageStage::printVectors <" << std::endl; //vector v = _kage->getFrameData().getVectorData(); @@ -842,12 +842,12 @@ void KageStage::printVectors(vector p_vectorData) { void KageStage::cleanSlate() { origin.x = 50; origin.y = 50; - _kage->_document.Project._width = 960.0f; - _kage->_document.Project._height = 720.0f; + _kage->_document._width = 960.0f; + _kage->_document._height = 720.0f; - currentScale = _kage->_document.Project._width; + currentScale = _kage->_document._width; - _kage->_document.Project._fps = 12; + _kage->_document._fps = 12; mouseDown = false; stroke.setThickness(3.0); drawCtr = 0; @@ -870,8 +870,8 @@ void KageStage::cleanSlate() { _zoomValue = 1.0f; _zoomRatio = 1.0f; - __stageArea.x = _kage->_document.Project._width; - __stageArea.y = _kage->_document.Project._height; + __stageArea.x = _kage->_document._width; + __stageArea.y = _kage->_document._height; cairoPNG.clear(); @@ -895,6 +895,13 @@ void KageStage::invalidateToRender() { // Kage::timestamp_OUT(); } +/** + * @brief Called by Gtkmm when DrawingArea's display is invalidated + * + * @param p_cr Cairo context object on which lines/shapes/image is applied to. + * @return true + * @return false + */ bool KageStage::on_draw(const Cairo::RefPtr& p_cr) { // Kage::timestamp_IN(); std::cout << " KageStage::on_draw" << std::endl; if (!window) { @@ -915,13 +922,13 @@ bool KageStage::on_draw(const Cairo::RefPtr& p_cr) { //kage/stage is being resized, try to re-center view if (_registerWidth != get_width()) { _registerWidth = get_width(); - origin.x = (_registerWidth - _kage->_document.Project._width) / 2; + origin.x = (_registerWidth - _kage->_document._width) / 2; _kage->registerPropertiesPane(); } if (_registerHeight != get_height()) { _registerHeight = get_height(); - origin.y = (_registerHeight - _kage->_document.Project._height) / 2; + origin.y = (_registerHeight - _kage->_document._height) / 2; } //draw user-drawn object @@ -974,13 +981,12 @@ void KageStage::clearScreen(Cairo::RefPtr p_context) { //draw viewable area p_context->move_to( origin.x, origin.y ); - p_context->line_to((_kage->_document.Project._width * _zoomValue) + origin.x, origin.y ); - p_context->line_to((_kage->_document.Project._width * _zoomValue) + origin.x, origin.y + (_kage->_document.Project._height * _zoomValue)); - p_context->line_to( origin.x, origin.y + (_kage->_document.Project._height * _zoomValue)); + p_context->line_to((_kage->_document._width * _zoomValue) + origin.x, origin.y ); + p_context->line_to((_kage->_document._width * _zoomValue) + origin.x, origin.y + (_kage->_document._height * _zoomValue)); + p_context->line_to( origin.x, origin.y + (_kage->_document._height * _zoomValue)); p_context->close_path(); - p_context->set_source_rgb((double)_kage->_document.Project._backgroundColor.getR()/255, (double)_kage->_document.Project._backgroundColor.getG()/255, (double)_kage->_document.Project._backgroundColor.getB()/255); - // p_context->fill_preserve(); + p_context->set_source_rgb((double)_kage->_document._backgroundColor.getR()/255, (double)_kage->_document._backgroundColor.getG()/255, (double)_kage->_document._backgroundColor.getB()/255); p_context->fill(); p_context->set_line_width(0.2f); p_context->set_source_rgb(0.0, 0.0, 0.0); @@ -990,9 +996,9 @@ void KageStage::clearScreen(Cairo::RefPtr p_context) { } } -bool KageStage::renderToPNG(string p_path, bool p_transparent) { +bool KageStage::renderToPNG(std::string p_path, bool p_transparent) { #ifdef CAIRO_HAS_PNG_FUNCTIONS - Cairo::RefPtr surface = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, _kage->_document.Project._width, _kage->_document.Project._height); + Cairo::RefPtr surface = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, _kage->_document._width, _kage->_document._height); Cairo::RefPtr l_context = Cairo::Context::create(surface); @@ -1044,9 +1050,9 @@ void KageStage::renderFrame(Cairo::RefPtr p_context, bool p_forc } -bool KageStage::renderToPNGOffset(string p_path, bool p_transparent, double p_offsetX, double p_offsetY) { +bool KageStage::renderToPNGOffset(std::string p_path, bool p_transparent, double p_offsetX, double p_offsetY) { #ifdef CAIRO_HAS_PNG_FUNCTIONS - Cairo::RefPtr surface = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, _kage->_document.Project._width, _kage->_document.Project._height); + Cairo::RefPtr surface = Cairo::ImageSurface::create(Cairo::FORMAT_ARGB32, _kage->_document._width, _kage->_document._height); Cairo::RefPtr l_context = Cairo::Context::create(surface); diff --git a/studio/kage/stage/stage.h b/studio/kage/stage/stage.h index 3e8ae3f..a13b9b7 100644 --- a/studio/kage/stage/stage.h +++ b/studio/kage/stage/stage.h @@ -98,7 +98,7 @@ #define IMAGE_SCALEX_SCALEY 3 //p4 x/y == scaleX / scaleY #define IMAGE_ROTATE_ALPHA 4 //p5 x/y == rotate / alpha - void printVectors(vector p_vectorData); + void printVectors(std::vector p_vectorData); void cleanSlate(); void invalidateToRender(); bool _invalidated; @@ -107,7 +107,7 @@ Gdk::Color getFill(); void setStroke(Gdk::Color p_Color); Gdk::Color getStroke(); - double currentScale; /// for use with zoom; default value is _kage->_document.Project._width; can be changed as preferred + double currentScale; /// for use with zoom; default value is _kage->_document._width; can be changed as preferred void clearScreen(Cairo::RefPtr p_context); void renderFrame(Cairo::RefPtr p_context, bool p_force = false); void renderOnionFrame(Cairo::RefPtr p_context, std::vector p_vectorData, double p_alpha); @@ -192,8 +192,8 @@ std::vector _vectorDataZOrderBufferB; std::vector _vectorDataZOrderBufferC; - bool renderToPNG(string p_path, bool p_transparent); - bool renderToPNGOffset(string p_path, bool p_transparent, double p_offsetX = 0.0, double p_offsetY = 0.0); + bool renderToPNG(std::string p_path, bool p_transparent); + bool renderToPNGOffset(std::string p_path, bool p_transparent, double p_offsetX = 0.0, double p_offsetY = 0.0); void renderFrameToPNG(Cairo::RefPtr p_context); void renderFrameToPNGOffset(Cairo::RefPtr p_context, double p_offsetX = 0.0, double p_offsetY = 0.0); @@ -215,7 +215,7 @@ bool _rotateMode; bool _rotateApply; - void setSelectedShapes(vector p_selectedShapes); + void setSelectedShapes(std::vector p_selectedShapes); std::vector getSelectedShapes(); void unpressKeys(); diff --git a/studio/kage/timeline/layers.cpp b/studio/kage/timeline/layers.cpp index 0ea240e..cbb534c 100644 --- a/studio/kage/timeline/layers.cpp +++ b/studio/kage/timeline/layers.cpp @@ -119,7 +119,7 @@ bool KageLayersUI::on_event(GdkEvent *e) { KageLayer *l_layer = _kage->_document.getScene()->Layers[l_index]; std::cout << "\te->button.x " << e->button.x << std::endl; if (e->button.x > 36) { - string l_layerLabel = _kage->_document.getScene()->getLayerLabel(); + std::string l_layerLabel = _kage->_document.getScene()->getLayerLabel(); LabelRenameDialog* pDialog = new LabelRenameDialog(*_kage, l_layerLabel); pDialog->run(); _kage->_document.getScene()->setLayerLabel(pDialog->getLabel()); @@ -150,12 +150,15 @@ bool KageLayersUI::on_event(GdkEvent *e) { l_layer->toggleVisibility(); invalidateToRender(); renderStage(); + _kage->stackDo(); } else if (e->button.x < 36) { l_layer->toggleLock(); invalidateToRender(); + _kage->stackDo(); } else { _kage->setDocumentSceneCurrentLayer(l_index+1, false); _kage->setDocumentSceneLayerCurrentFrame(_kage->getDocumentSceneLayerCurrentFrame(), false); + _kage->stackDo(); } } else { std::cout << "_kage->_document.getActiveSceneID() " << _kage->_document.getActiveSceneID() << std::endl << std::endl; @@ -188,15 +191,12 @@ void KageLayersUI::forceRender() { if (KageScene::LOADING_MODE == true) { return; } - Kage::timestamp_IN(); std::cout << " KageLayersUI::forceRender()" << std::endl; invalidateToRender(); - Kage::timestamp_OUT(); } bool KageLayersUI::invalidateToRender() { if (KageScene::LOADING_MODE == true) { return true; } - Kage::timestamp_IN(); std::cout << " KageLayersUI::invalidateToRender()" << std::endl; if (!window) { window = get_window(); } diff --git a/studio/kage/timeline/scenes.cpp b/studio/kage/timeline/scenes.cpp index e26e6c7..d319c64 100644 --- a/studio/kage/timeline/scenes.cpp +++ b/studio/kage/timeline/scenes.cpp @@ -111,16 +111,14 @@ bool KageScenesUI::on_event(GdkEvent *e) { invalidateToRender(); } else if (e->type == GDK_DOUBLE_BUTTON_PRESS) { //determine Y location to identify which scene to rename - int l_scenes= _kage->_document.Scenes.size(); - double l_y = get_height() - (l_scenes * FRAME_HEIGHT); - int l_index = l_scenes - ((e->button.y - l_y) / FRAME_HEIGHT); + int l_index = (e->button.y / FRAME_HEIGHT); std::cout << "\n double clicked on l_index " << l_index << " / " << _kage->_document.Scenes.size() << std::endl; if (l_index < _kage->_document.Scenes.size()) { KageScene *l_scene = _kage->_document.Scenes[l_index]; std::cout << "\te->button.x " << e->button.x << std::endl; try { if (e->button.x > 36) { - string l_sceneLabel = _kage->_document.getScene()->getLabel(); + std::string l_sceneLabel = _kage->_document.getScene()->getLabel(); LabelRenameDialog* pDialog = new LabelRenameDialog(*_kage, l_sceneLabel); pDialog->run(); _kage->_document.getScene()->setLabel(pDialog->getLabel()); @@ -139,15 +137,10 @@ bool KageScenesUI::on_event(GdkEvent *e) { KageScenesUI::mouseIsDown = true; //determine Y location to identify which scene to highlight int l_scenes = _kage->_document.Scenes.size(); - //double l_y = get_height() - (l_scenes * FRAME_HEIGHT); - //int l_index = l_scenes - ((e->button.y - l_y) / FRAME_HEIGHT); int l_index = (e->button.y / FRAME_HEIGHT); - std::cout << "KageScenesUI::on_event clicked on l_index " << l_index << " / " << l_scenes << std::endl; try { if (l_index < l_scenes) { _kage->setDocumentCurrentScene(l_index+1); - } else { - std::cout << "KageScenesUI::on_event\n\t_kage->_document.getActiveSceneID() " << _kage->_document.getActiveSceneID() << " ??? " << _kage->_document.getScene()->Layers.size() << std::endl << std::endl; } } catch (std::exception& e) { std::cout << "KageScenesUI::on_event Exception : " << e.what() << std::endl; @@ -171,15 +164,12 @@ void KageScenesUI::forceRender() { if (KageScene::LOADING_MODE == true) { return; } - Kage::timestamp_IN(); std::cout << " KageScenesUI::forceRender()" << std::endl; invalidateToRender(); - Kage::timestamp_OUT(); } bool KageScenesUI::invalidateToRender() { if (KageScene::LOADING_MODE == true) { return true; } - Kage::timestamp_IN(); std::cout << " KageScenesUI::invalidateToRender()" << std::endl; if (!window) { window = get_window(); } @@ -193,8 +183,6 @@ bool KageScenesUI::invalidateToRender() { std::cerr << "KageScenesUI::invalidateToRender Exception : " << e.what() << std::endl; } - Kage::timestamp_OUT(); - return true; } diff --git a/studio/kage/timeline/timeline.cpp b/studio/kage/timeline/timeline.cpp index a9b61cb..6a2e105 100644 --- a/studio/kage/timeline/timeline.cpp +++ b/studio/kage/timeline/timeline.cpp @@ -253,7 +253,6 @@ bool KageTimeline::on_event(GdkEvent *e) { } unsigned int l_layerStartIndex = ((draw1.y - ((unsigned int)draw1.y % FRAME_HEIGHT)) / FRAME_HEIGHT) + 1; unsigned int l_layerStopIndex = ((draw2.y - ((unsigned int)draw2.y % FRAME_HEIGHT)) / FRAME_HEIGHT); - cout << "l_layerStartIndex " << l_layerStartIndex << " l_layerStopIndex " << l_layerStopIndex; l_layerStartIndex = l_layerCount - l_layerStartIndex; l_layerStopIndex = l_layerCount - l_layerStopIndex; if (l_layerStopIndex < l_layerStartIndex) { @@ -261,7 +260,7 @@ bool KageTimeline::on_event(GdkEvent *e) { l_layerStopIndex = l_layerStartIndex; l_layerStartIndex = l_tmpLayerIndex; } - cout << "\t " << l_layerStartIndex << " " << l_layerStopIndex << endl; + //loop from start to stop to select frames in between for (unsigned int l_layerIndex = 0; l_layerIndex < _kage->_document.getScene()->Layers.size(); ++l_layerIndex) { if (l_layerIndex >= l_layerStartIndex && l_layerIndex < l_layerStopIndex) { @@ -377,7 +376,7 @@ bool KageTimeline::on_draw(const Cairo::RefPtr& p_context) { p_context->set_source_rgb(0.80f, 0.80f, 0.80f); p_context->set_line_width(1.0f); p_context->stroke(); - l_x += (FRAME_WIDTH * _kage->_document.Project._fps); + l_x += (FRAME_WIDTH * _kage->_document._fps); } unsigned int l_frames; @@ -434,8 +433,8 @@ bool KageTimeline::on_draw(const Cairo::RefPtr& p_context) { l_selected = l_frame->isSelected(); bool l_tween = (l_frame->getTween() > 0); switch (l_frame->getExtension()) { - case KageFrame::EXTENSION_NOT: - case KageFrame::EXTENSION_END: + case KageFrame::extension::EXTENSION_NOT: + case KageFrame::extension::EXTENSION_END: if (l_frame->isEmpty() == true) { if ( l_current == true && l_selected == false && l_tween == false) { Gdk::Cairo::set_source_pixbuf(p_context, KageTimeline::imageBLANK_CUR, l_x, l_y); @@ -480,8 +479,8 @@ bool KageTimeline::on_draw(const Cairo::RefPtr& p_context) { } } break; - case KageFrame::EXTENSION_START: - case KageFrame::EXTENSION_MID: + case KageFrame::extension::EXTENSION_START: + case KageFrame::extension::EXTENSION_MID: if (l_frame->isEmpty() == true) { if ( l_current == true && l_selected == false && l_tween == false) { Gdk::Cairo::set_source_pixbuf(p_context, KageTimeline::imageBLANK_X_CUR, l_x, l_y); @@ -567,7 +566,7 @@ bool KageTimeline::on_draw(const Cairo::RefPtr& p_context) { } Cairo::TextExtents extents; - string l_text; + std::string l_text; //draw currently selected Layer/Frame p_context->select_font_face ("Arial", Cairo::FONT_SLANT_NORMAL, Cairo::FONT_WEIGHT_BOLD); p_context->set_font_size(16); @@ -591,7 +590,7 @@ bool KageTimeline::on_draw(const Cairo::RefPtr& p_context) { //p_context->set_source_rgb(0.34f, 0.34f, 0.34f); p_context->set_source_rgb(0.5f, 0.5f, 0.5f); while (l_x < get_width()) { - l_text = StringHelper::unsignedIntegerToString(_kage->_document.Project._fps * l_ctr); + l_text = StringHelper::unsignedIntegerToString(_kage->_document._fps * l_ctr); p_context->get_text_extents(l_text, extents); p_context->move_to( l_x-(extents.width/2), 16); p_context->show_text(l_text); @@ -600,7 +599,7 @@ bool KageTimeline::on_draw(const Cairo::RefPtr& p_context) { p_context->get_text_extents(l_text, extents); p_context->move_to( l_x-(extents.width/2), get_height()-2); p_context->show_text(l_text); - l_x += (FRAME_WIDTH * _kage->_document.Project._fps); + l_x += (FRAME_WIDTH * _kage->_document._fps); ++l_ctr; } @@ -649,7 +648,7 @@ void KageTimeline::setFocus() { grab_focus(); } -vector KageTimeline::raiseSelectedShape(vector p_selectedShapes) { +std::vector KageTimeline::raiseSelectedShape(std::vector p_selectedShapes) { std::vector foo; return foo; } diff --git a/studio/kage/timeline/timeline.h b/studio/kage/timeline/timeline.h index 3e87aa6..15afd17 100644 --- a/studio/kage/timeline/timeline.h +++ b/studio/kage/timeline/timeline.h @@ -88,7 +88,7 @@ static bool _gotFocus; - std::vector raiseSelectedShape(vector p_selectedShapes); + std::vector raiseSelectedShape(std::vector p_selectedShapes); void addDataToFrame(VectorDataManager v); protected: diff --git a/studio/kage/unre/unre.cpp b/studio/kage/unre/unre.cpp index d535e8f..9ab632b 100644 --- a/studio/kage/unre/unre.cpp +++ b/studio/kage/unre/unre.cpp @@ -22,6 +22,7 @@ #include "unre.h" UnRe::UnRe() { + _kageDocument = NULL; clear(); } @@ -30,86 +31,61 @@ UnRe::~UnRe() { } void UnRe::clear() { - _stackIndex = -1; + _stackIndex = UINT_MAX; _undoStack.clear(); } -void UnRe::stackDo(unsigned int p_scene, unsigned int p_layer, unsigned int p_frame, std::vector p_data) { - KageDo p_kageDo(p_scene, p_layer, p_frame); - p_kageDo.setVectorData(p_data); - +void UnRe::stackDocument(KageDocument p_document) { unsigned int l_size = _undoStack.size(); - if (_stackIndex < l_size - 1) { - _undoStack.erase(_undoStack.begin() + _stackIndex+1, _undoStack.end()); + if (_stackIndex < l_size - 1) {// && _undoStack.size() > 0) { + _undoStack[_stackIndex+1]->removeAllScenes(); + _undoStack.erase(_undoStack.begin() + _stackIndex+1, _undoStack.end()); } - _undoStack.push_back(p_kageDo.clone()); + _kageDocument = new KageDocument(); + *_kageDocument = p_document; + _undoStack.push_back(_kageDocument); std::cout << "UNDO SIZE: " << _undoStack.size() << std::endl; ++_stackIndex; } -KageDo UnRe::undo() { - KageDo l_kageDo; - +KageDocument UnRe::undoDocument() { if (_stackIndex > 0 && _stackIndex != -1) { --_stackIndex; - l_kageDo = _undoStack[_stackIndex].clone(); + return *(_undoStack[_stackIndex]); } - return l_kageDo; + return *(_undoStack[0]); } -KageDo UnRe::redo() { - KageDo l_kageDo; - +KageDocument UnRe::redoDocument() { unsigned int l_size = _undoStack.size(); if (_stackIndex < l_size-1 && _stackIndex != -1) { ++_stackIndex; - l_kageDo = _undoStack[_stackIndex].clone(); + return *(_undoStack[_stackIndex]); } else if (_stackIndex == -1 && l_size > 0) { ++_stackIndex; - l_kageDo = _undoStack[_stackIndex].clone(); + return *(_undoStack[_stackIndex]); } - return l_kageDo; + if (l_size > 0) { + return *(_undoStack[l_size-1]); + } + return *(_undoStack[0]); } + /** - * While undo() pops a KageDo from a stack, this just gives a preview - * of the top KageDo on the stack. + * While undo() pops a KageDocument from a stack, this just gives a preview + * of the top KageDocument on the stack. * \return latest state pushed in the stack - * \sa undo() + * \sa undoDocument() */ -KageDo UnRe::previewUndo() { - KageDo l_kageDo; - +KageDocument UnRe::previewUndoDocument() { if (_stackIndex > 0 && _stackIndex != -1) { - l_kageDo = _undoStack[_stackIndex].clone(); - } - - return l_kageDo; -} - -PointData UnRe::applyZoomRatio(PointData p_zoomReference, double p_zoomRatio, PointData p_value) { - if (p_zoomRatio == 0.0f) { return p_value; } - - double l_value; - - if (p_value.x < p_zoomReference.x) { - l_value = (p_zoomReference.x - p_value.x) * p_zoomRatio; - p_value.x = p_zoomReference.x - l_value; - } else if (p_value.x > p_zoomReference.x) { - l_value = (p_value.x - p_zoomReference.x) * p_zoomRatio; - p_value.x = p_zoomReference.x + l_value; - } - if (p_value.y < p_zoomReference.y) { - l_value = (p_zoomReference.y - p_value.y) * p_zoomRatio; - p_value.y = p_zoomReference.y - l_value; - } else if (p_value.y > p_zoomReference.y) { - l_value = (p_value.y - p_zoomReference.y) * p_zoomRatio; - p_value.y = p_zoomReference.y + l_value; + return *(_undoStack[_stackIndex]); } - return p_value.clone(); + return *(_undoStack[0]); } \ No newline at end of file diff --git a/studio/kage/unre/unre.h b/studio/kage/unre/unre.h index 19c3c8d..2d8785f 100644 --- a/studio/kage/unre/unre.h +++ b/studio/kage/unre/unre.h @@ -28,26 +28,24 @@ #include "../data/vectordata.h" #include "../data/point.h" - #include "kagedo.h" + #include "../document.h" - using namespace std; + class Kage;//forward declaration class UnRe { public: UnRe(); virtual ~UnRe(); - void stackDo(unsigned int p_scene, unsigned int p_layer, unsigned int p_frame, std::vector p_data); - KageDo undo(); - KageDo redo(); - KageDo previewUndo(); + void stackDocument(KageDocument p_document); + KageDocument undoDocument(); + KageDocument redoDocument(); + KageDocument previewUndoDocument(); void clear(); protected: unsigned int _stackIndex; - std::vector _undoStack; - - ///for use of applyZoom - PointData applyZoomRatio(PointData p_zoomReference, double p_zoomRatio, PointData p_value); + KageDocument *_kageDocument; + std::vector _undoStack; }; #endif //GTKMM_KAGE_MANAGER_UNRE_UNRE_H diff --git a/studio/kage/vectordatamanager.cpp b/studio/kage/vectordatamanager.cpp index 4125b95..9e4f4fc 100644 --- a/studio/kage/vectordatamanager.cpp +++ b/studio/kage/vectordatamanager.cpp @@ -26,21 +26,31 @@ VectorDataManager::VectorDataManager() { // init(KageStage::fillColor, KageStage::stroke); // ^ depracated: TYPE_INIT to be used as SHAPE identifier + _selectedNodes.clear(); + _selectedShapes.clear(); + vectorData.clear(); } -VectorDataManager::VectorDataManager(vector p_vectorData) { +VectorDataManager::VectorDataManager(std::vector p_vectorData) { + _selectedNodes.clear(); + _selectedShapes.clear(); + vectorData.clear(); + setVectorData(p_vectorData); } VectorDataManager::~VectorDataManager() { - vectorData.clear(); + //TODO: revisit + //_selectedNodes.clear(); + //_selectedShapes.clear(); + //vectorData.clear(); } -void VectorDataManager::setVectorData(vector p_vectorData) { +void VectorDataManager::setVectorData(std::vector p_vectorData) { vectorData = p_vectorData; } -vector VectorDataManager::getVectorData() { +std::vector VectorDataManager::getVectorData() { return vectorData; } @@ -67,7 +77,7 @@ void VectorDataManager::add(VectorData::type p_type, ColorData p_fill, StrokeCol vectorData.push_back(l_vectorData); } -void VectorDataManager::add(VectorData::type p_type, string p_fillGradientID, StrokeColorData p_stroke) { +void VectorDataManager::add(VectorData::type p_type, std::string p_fillGradientID, StrokeColorData p_stroke) { VectorData l_vectorData; l_vectorData.vectorType = p_type; @@ -98,13 +108,13 @@ void VectorDataManager::addInit(PointData p_point) { vectorData[vectorData.size()-1].setPoints(ps); } -bool VectorDataManager::recenterRotationPoint(vector p_selectedShapes) { +bool VectorDataManager::recenterRotationPoint(std::vector p_selectedShapes) { if (p_selectedShapes.size() == 0) { return false; } std::vector l_selectedShapesOld(p_selectedShapes); - sort(l_selectedShapesOld.begin(), l_selectedShapesOld.end(), greater ()); + sort(l_selectedShapesOld.begin(), l_selectedShapesOld.end(), std::greater ()); std::vector v = getVectorData(); @@ -210,7 +220,7 @@ void VectorDataManager::addFill(ColorData p_color) { add(VectorData::TYPE_FILL, p_color, l_vectorData.stroke); } -void VectorDataManager::addFill(string p_gradientID) { +void VectorDataManager::addFill(std::string p_gradientID) { VectorData l_vectorData; if (vectorData.size() > 0) { l_vectorData = vectorData[vectorData.size()-1]; @@ -415,7 +425,7 @@ void VectorDataManager::addSelectedShape(unsigned int p_index) { } -vector VectorDataManager::tryMultiSelectShapes_populateShapes() { +std::vector VectorDataManager::tryMultiSelectShapes_populateShapes() { _selectedShapes.clear(); if (vectorData.size() == 0) { return _selectedShapes; @@ -426,14 +436,12 @@ vector VectorDataManager::tryMultiSelectShapes_populateShapes() { return _selectedShapes; } -vector VectorDataManager::selectAllShapes() { +std::vector VectorDataManager::selectAllShapes() { std::vector l_selectedShapes; l_selectedShapes.clear(); - std::cout << " KageStage::selectAllShapes " << l_selectedShapes.size() << std::endl; unsigned int vsize = vectorData.size(); if (vsize == 0) { - std::cout << " KageStage::selectAllShapes A " << std::endl; return l_selectedShapes; } @@ -445,7 +453,6 @@ vector VectorDataManager::selectAllShapes() { l_selectedShapes = tryMultiSelectShapes_populateShapes(); _selectedNodes.clear(); - std::cout << " KageStage::selectAllShapes B " << std::endl; return l_selectedShapes; } @@ -469,7 +476,7 @@ bool VectorDataManager::cutSelectedShapes() { return false; } -vector VectorDataManager::copySelectedShapes(vector p_selectedShapes) { +std::vector VectorDataManager::copySelectedShapes(std::vector p_selectedShapes) { std::vector l_vectorDataCopyBuffer; l_vectorDataCopyBuffer.clear(); @@ -498,7 +505,7 @@ vector VectorDataManager::copySelectedShapes(vector p_ return l_vectorDataCopyBuffer; } -vector VectorDataManager::pasteSelectedShapes(vector p_vectorDataCopyBuffer) { +std::vector VectorDataManager::pasteSelectedShapes(std::vector p_vectorDataCopyBuffer) { unsigned int l_vectorDataCopyBuffer_size = p_vectorDataCopyBuffer.size(); _selectedNodes.clear(); @@ -506,7 +513,7 @@ vector VectorDataManager::pasteSelectedShapes(vector p std::cout << "VectorDataManager::pasteSelectedShapes FAIL" << std::endl; return _selectedNodes; } - std::cout << "VectorDataManager::pasteSelectedShapes PASS " + p_vectorDataCopyBuffer.size() << " " << vectorData.size() << std::endl; + for (unsigned int i = 0; i < l_vectorDataCopyBuffer_size; ++i) { vectorData.push_back(p_vectorDataCopyBuffer[i]); _selectedNodes.push_back(vectorData.size()-1); @@ -515,7 +522,7 @@ vector VectorDataManager::pasteSelectedShapes(vector p return _selectedNodes; } -bool VectorDataManager::deleteSelectedShapes(vector p_selectedShapes) { +bool VectorDataManager::deleteSelectedShapes(std::vector p_selectedShapes) { unsigned int l_selectedShapes_size = p_selectedShapes.size(); if (l_selectedShapes_size == 0) { @@ -524,7 +531,7 @@ bool VectorDataManager::deleteSelectedShapes(vector p_selectedShap } std::vector l_selectedShapesOld(p_selectedShapes); - sort(l_selectedShapesOld.begin(), l_selectedShapesOld.end(), greater ()); + sort(l_selectedShapesOld.begin(), l_selectedShapesOld.end(), std::greater ()); unsigned int vsize = vectorData.size(); if (vsize < l_selectedShapes_size) { //attempt to fix https://sourceforge.net/p/kage/tickets/15/ @@ -564,7 +571,7 @@ bool VectorDataManager::deleteSelectedShapes(vector p_selectedShap \return True if it successfully lowered back selected Shape \sa lowerSelectedShape(), raiseToTopSelectedShape() and lowerToBottomSelectedShape() */ -vector VectorDataManager::raiseSelectedShape(vector p_selectedShapes) { +std::vector VectorDataManager::raiseSelectedShape(std::vector p_selectedShapes) { std::vector l_selectedShapes; l_selectedShapes.clear(); if (p_selectedShapes.size() == 0) { @@ -572,7 +579,7 @@ vector VectorDataManager::raiseSelectedShape(vector } l_selectedShapes = p_selectedShapes; - sort(l_selectedShapes.begin(), l_selectedShapes.end(), greater ()); + sort(l_selectedShapes.begin(), l_selectedShapes.end(), std::greater ()); std::vector l_selectedShapesNew; l_selectedShapesNew.clear(); @@ -655,7 +662,7 @@ vector VectorDataManager::raiseSelectedShape(vector \return True if it successfully lowered back selected Shape \sa raiseSelectedShape(), raiseToTopSelectedShape() and lowerToBottomSelectedShape() */ -vector VectorDataManager::lowerSelectedShape(vector p_selectedShapes) { +std::vector VectorDataManager::lowerSelectedShape(std::vector p_selectedShapes) { std::vector l_selectedShapes; l_selectedShapes.clear(); if (p_selectedShapes.size() == 0) { @@ -663,7 +670,7 @@ vector VectorDataManager::lowerSelectedShape(vector } l_selectedShapes = p_selectedShapes; - sort(l_selectedShapes.begin(), l_selectedShapes.end(), greater ()); + sort(l_selectedShapes.begin(), l_selectedShapes.end(), std::greater ()); std::vector l_selectedShapesNew; l_selectedShapesNew.clear(); @@ -744,7 +751,7 @@ vector VectorDataManager::lowerSelectedShape(vector * \return True if it successfully raised selected Shape on top of z-ordering * \sa raiseSelectedShape(), lowerSelectedShape() and lowerToBottomSelectedShape() */ -vector VectorDataManager::raiseToTopSelectedShape(vector p_selectedShapes) { +std::vector VectorDataManager::raiseToTopSelectedShape(std::vector p_selectedShapes) { std::vector l_selectedShapes; l_selectedShapes.clear(); if (p_selectedShapes.size() == 0) { @@ -773,7 +780,7 @@ vector VectorDataManager::raiseToTopSelectedShape(vector VectorDataManager::lowerToBottomSelectedShape(vector p_selectedShapes) { +std::vector VectorDataManager::lowerToBottomSelectedShape(std::vector p_selectedShapes) { std::vector l_selectedShapes; l_selectedShapes.clear(); if (p_selectedShapes.size() == 0) { @@ -805,7 +812,7 @@ vector VectorDataManager::lowerToBottomSelectedShape(vector VectorDataManager::groupSelectedShapes(vector p_selectedShapes) { +std::vector VectorDataManager::groupSelectedShapes(std::vector p_selectedShapes) { std::vector l_selectedShapes; l_selectedShapes.clear(); if (p_selectedShapes.size() == 0) { @@ -831,7 +838,7 @@ vector VectorDataManager::groupSelectedShapes(vector l_selectedShapes.clear(); return l_selectedShapes; } -vector VectorDataManager::ungroupSelectedShapes(vector p_selectedShapes) { +std::vector VectorDataManager::ungroupSelectedShapes(std::vector p_selectedShapes) { std::vector l_selectedShapes; l_selectedShapes.clear(); if (p_selectedShapes.size() == 0) { @@ -874,7 +881,7 @@ vector VectorDataManager::ungroupSelectedShapes(vector VectorDataManager::duplicateShapes(vector p_selectedShapes) { +std::vector VectorDataManager::duplicateShapes(std::vector p_selectedShapes) { std::vector l_selectedShapes; l_selectedShapes.clear(); if (p_selectedShapes.size() == 0) { @@ -891,13 +898,13 @@ vector VectorDataManager::duplicateShapes(vector p_s l_selectedShapes.clear(); return l_selectedShapes; } -bool VectorDataManager::flipHorizontalSelectedShape(vector p_selectedShapes) { +bool VectorDataManager::flipHorizontalSelectedShape(std::vector p_selectedShapes) { if (p_selectedShapes.size() == 0) { return false; } std::vector l_selectedShapesOld(p_selectedShapes); - sort(l_selectedShapesOld.begin(), l_selectedShapesOld.end(), greater ()); + sort(l_selectedShapesOld.begin(), l_selectedShapesOld.end(), std::greater ()); double l_leftPoint = DBL_MAX; double l_rightPoint = DBL_MIN; @@ -974,13 +981,13 @@ bool VectorDataManager::flipHorizontalSelectedShape(vector p_selec return true; } -bool VectorDataManager::flipVerticalSelectedShape(vector p_selectedShapes) { +bool VectorDataManager::flipVerticalSelectedShape(std::vector p_selectedShapes) { if (p_selectedShapes.size() == 0) { return false; } std::vector l_selectedShapesOld(p_selectedShapes); - sort(l_selectedShapesOld.begin(), l_selectedShapesOld.end(), greater ()); + sort(l_selectedShapesOld.begin(), l_selectedShapesOld.end(), std::greater ()); double l_upperPoint = DBL_MAX; double l_lowerPoint = DBL_MIN; diff --git a/studio/kage/vectordatamanager.h b/studio/kage/vectordatamanager.h index c88503a..ef074a4 100644 --- a/studio/kage/vectordatamanager.h +++ b/studio/kage/vectordatamanager.h @@ -32,16 +32,14 @@ class Kage; //forward declaration - using namespace std; - class VectorDataManager { public: static unsigned int idmaker; VectorDataManager(); - VectorDataManager(vector p_vectorData); + VectorDataManager(std::vector p_vectorData); virtual ~VectorDataManager(); - void setVectorData(vector p_vectorData); + void setVectorData(std::vector p_vectorData); std::vector getVectorData(); VectorDataManager clone(); @@ -49,7 +47,7 @@ void addInit(); void addInit(PointData p_point); void addFill(ColorData p_color); - void addFill(string p_gradientID); + void addFill(std::string p_gradientID); void addEndFill(); void addClosePath(); void addCubic(PointData p_point1, PointData p_point2, PointData p_point3); @@ -67,17 +65,17 @@ bool isEmpty(); //for use on z-ordering~ish - std::vector raiseSelectedShape(vector p_selectedShapes); - std::vector lowerSelectedShape(vector p_selectedShapes); - std::vector raiseToTopSelectedShape(vector p_selectedShapes); - std::vector lowerToBottomSelectedShape(vector p_selectedShapes); - std::vector groupSelectedShapes(vector p_selectedShapes); - std::vector ungroupSelectedShapes(vector p_selectedShapes); - std::vector duplicateShapes(vector p_selectedShapes); - bool flipHorizontalSelectedShape(vector p_selectedShapes); - bool flipVerticalSelectedShape(vector p_selectedShapes); + std::vector raiseSelectedShape(std::vector p_selectedShapes); + std::vector lowerSelectedShape(std::vector p_selectedShapes); + std::vector raiseToTopSelectedShape(std::vector p_selectedShapes); + std::vector lowerToBottomSelectedShape(std::vector p_selectedShapes); + std::vector groupSelectedShapes(std::vector p_selectedShapes); + std::vector ungroupSelectedShapes(std::vector p_selectedShapes); + std::vector duplicateShapes(std::vector p_selectedShapes); + bool flipHorizontalSelectedShape(std::vector p_selectedShapes); + bool flipVerticalSelectedShape(std::vector p_selectedShapes); - bool recenterRotationPoint(vector p_selectedShapes); + bool recenterRotationPoint(std::vector p_selectedShapes); const unsigned int _NO_SELECTION = -1; std::vector _selectedNodes; @@ -88,12 +86,12 @@ std::vector tryMultiSelectShapes_populateShapes(); std::vector selectAllShapes(); bool cutSelectedShapes(); - std::vector copySelectedShapes(vector p_selectedShapes); - std::vector pasteSelectedShapes(vector p_vectorDataCopyBuffer); - bool deleteSelectedShapes(vector p_selectedShapes); - protected: + std::vector copySelectedShapes(std::vector p_selectedShapes); + std::vector pasteSelectedShapes(std::vector p_vectorDataCopyBuffer); + bool deleteSelectedShapes(std::vector p_selectedShapes); + void add(VectorData::type p_type, ColorData p_fill, StrokeColorData p_stroke); - void add(VectorData::type p_type, string p_fillGradientID, StrokeColorData p_stroke); + void add(VectorData::type p_type, std::string p_fillGradientID, StrokeColorData p_stroke); std::vector vectorData; diff --git a/studio/label_rename.cpp b/studio/label_rename.cpp index 33d6bc1..e885274 100644 --- a/studio/label_rename.cpp +++ b/studio/label_rename.cpp @@ -1,6 +1,6 @@ /* * Kage Studio - a simple free and open source vector-based 2D animation software - * Copyright (C) 2011~2023 Mj Mendoza IV + * Copyright (C) 2011~2024 Mj Mendoza IV * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,7 +21,7 @@ #include "label_rename.h" -LabelRenameDialog::LabelRenameDialog(Gtk::Window& parent, string p_label) +LabelRenameDialog::LabelRenameDialog(Gtk::Window& parent, std::string p_label) : Gtk::Dialog("Rename " + p_label, parent, true), m_HBox(false, 8), _label("Label:", true) { @@ -42,13 +42,13 @@ LabelRenameDialog::~LabelRenameDialog() { // } -string LabelRenameDialog::getLabel() { +std::string LabelRenameDialog::getLabel() { return _txtLabel.get_text(); } void LabelRenameDialog::EntryLabel_onEnter() { - string l_newLabel = _txtLabel.get_text(); - string l_satinized = ""; + std::string l_newLabel = _txtLabel.get_text(); + std::string l_satinized = ""; char l_char; for (unsigned int i = 0; i < l_newLabel.length(); ++i) { if (l_newLabel[i] >= 35 && l_newLabel[i] <= 126 //#$%&'()*+,-./ and 0~9 and :;<=>?@ and A~Z and []^_` and a~z and {|}~ diff --git a/studio/label_rename.h b/studio/label_rename.h index dbfd43d..f0018f2 100644 --- a/studio/label_rename.h +++ b/studio/label_rename.h @@ -1,6 +1,6 @@ /* * Kage Studio - a simple free and open source vector-based 2D animation software - * Copyright (C) 2011~2023 Mj Mendoza IV + * Copyright (C) 2011~2024 Mj Mendoza IV * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -29,15 +29,13 @@ #include #include - using namespace std; - class LabelRenameDialog : public Gtk::Dialog { public: - LabelRenameDialog(Gtk::Window& parent, string p_label); + LabelRenameDialog(Gtk::Window& parent, std::string p_label); virtual ~LabelRenameDialog(); void EntryLabel_onEnter(); - string getLabel(); + std::string getLabel(); protected: //Member widgets: Gtk::HBox m_HBox; diff --git a/studio/main.cpp b/studio/main.cpp index 077b2eb..2268964 100644 --- a/studio/main.cpp +++ b/studio/main.cpp @@ -25,11 +25,11 @@ #include "kage.h" -vector g_argv; -vector argHandler(int &argc, char *argv[]) { +std::vector g_argv; +std::vector argHandler(int &argc, char *argv[]) { int i; - std::vector l_argv; - string l_tmp; + std::vector l_argv; + std::string l_tmp; for (i = 0; i < argc; ++i) { l_argv.push_back(argv[i]); } @@ -43,7 +43,7 @@ int main(int argc, char *argv[]) { g_argv = argHandler(argc, argv); //App_Path = getFilePath(g_argv[0]); //App_EXEName = getFileName(g_argv[0]); - string l_filePath = ""; + std::string l_filePath = ""; std::cout << "KAGE g_argv " << g_argv.size() << std::endl; if (g_argv.size() > 0) { if (g_argv.size() > 1) { diff --git a/studio/util/cairo/cairo_kage.cpp b/studio/util/cairo/cairo_kage.cpp index 1abda06..e4d5ddc 100644 --- a/studio/util/cairo/cairo_kage.cpp +++ b/studio/util/cairo/cairo_kage.cpp @@ -35,7 +35,7 @@ Cairo::ErrorStatus CairoKage::writeToPNGStream(const unsigned char* data, unsign return CAIRO_STATUS_SUCCESS; } -bool CairoKage::writeToPNG(string p_path, Cairo::RefPtr p_surface) { +bool CairoKage::writeToPNG(std::string p_path, Cairo::RefPtr p_surface) { CairoKage::pngFile.close(); CairoKage::pngFile.open(p_path.c_str(), std::ofstream::binary); diff --git a/studio/util/cairo/cairo_kage.h b/studio/util/cairo/cairo_kage.h index cac2f46..b124fca 100644 --- a/studio/util/cairo/cairo_kage.h +++ b/studio/util/cairo/cairo_kage.h @@ -1,7 +1,7 @@ /* * cairo_kage.h * - * Copyright 2020 Mj Mendoza IV + * Copyright 2020-2024 Mj Mendoza IV * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,14 +28,12 @@ #include #include //ofstream - using namespace std; - class CairoKage { static std::ofstream pngFile; - + public: static Cairo::ErrorStatus writeToPNGStream(const unsigned char* data, unsigned int length); - static bool writeToPNG(string p_path, Cairo::RefPtr p_surface); + static bool writeToPNG(std::string p_path, Cairo::RefPtr p_surface); }; #endif //UTIL_CAIRO_KAGE_H diff --git a/studio/util/string/stringhelper.cpp b/studio/util/string/stringhelper.cpp index 12fd7d9..ee0f12b 100644 --- a/studio/util/string/stringhelper.cpp +++ b/studio/util/string/stringhelper.cpp @@ -23,7 +23,7 @@ #include "stringhelper.h" -string StringHelper::toUpper(string p_str) { +std::string StringHelper::toUpper(std::string p_str) { unsigned int i; for(i = 0; i < p_str.length(); ++i) { @@ -33,7 +33,7 @@ string StringHelper::toUpper(string p_str) { return p_str; } -string StringHelper::toLower(string p_str) { +std::string StringHelper::toLower(std::string p_str) { unsigned int i; for(i = 0; i < p_str.length(); ++i) { p_str[i] = tolower(p_str[i]); @@ -41,57 +41,57 @@ string StringHelper::toLower(string p_str) { return p_str; } -string StringHelper::integerToString(int p_src) { +std::string StringHelper::integerToString(int p_src) { if (p_src == 0) { return "0"; } - ostringstream l_ostringstream; + std::ostringstream l_ostringstream; l_ostringstream << p_src; return l_ostringstream.str(); } -string StringHelper::unsignedIntegerToString(unsigned int p_src) { +std::string StringHelper::unsignedIntegerToString(unsigned int p_src) { if (p_src == 0) { return "0"; } - ostringstream l_ostringstream; + std::ostringstream l_ostringstream; l_ostringstream << p_src; return l_ostringstream.str(); } -string StringHelper::doubleToString(double p_src) { +std::string StringHelper::doubleToString(double p_src) { if (p_src == 0.0) { return "0.0"; } - ostringstream l_ostringstream; + std::ostringstream l_ostringstream; l_ostringstream << p_src; return l_ostringstream.str(); } -int StringHelper::toInteger(string p_src) { +int StringHelper::toInteger(std::string p_src) { //TODO: validate string to be numerics return atoi(p_src.c_str()); } -unsigned int StringHelper::toUnsignedInteger(string p_src) { +unsigned int StringHelper::toUnsignedInteger(std::string p_src) { //TODO: validate string to be numerics return (unsigned)atoi(p_src.c_str()); } -long StringHelper::toLong(string p_src) { +long StringHelper::toLong(std::string p_src) { //TODO: validate string to be numerics return atol(p_src.c_str()); } -double StringHelper::toDouble(string p_src) { +double StringHelper::toDouble(std::string p_src) { //TODO: validate string to be numerics return (double)atof(p_src.c_str()); } -bool StringHelper::toBoolean(string p_src) { +bool StringHelper::toBoolean(std::string p_src) { if (p_src == "1" || StringHelper::toLower(p_src) == "true") { return true; } else { @@ -99,16 +99,16 @@ bool StringHelper::toBoolean(string p_src) { } } -vector StringHelper::split(const string &p_source, const string &p_delimiter) { - std::vector l_return; +std::vector StringHelper::split(const std::string &p_source, const std::string &p_delimiter) { + std::vector l_return; if (p_delimiter.empty()) { l_return.push_back(p_source); return l_return; } - string::const_iterator substart = p_source.begin(), subend; + std::string::const_iterator substart = p_source.begin(), subend; while (true) { subend = search(substart, p_source.end(), p_delimiter.begin(), p_delimiter.end()); - string l_temp(substart, subend); + std::string l_temp(substart, subend); if (!l_temp.empty()) { l_return.push_back(StringHelper::trim(l_temp)); } @@ -120,8 +120,8 @@ vector StringHelper::split(const string &p_source, const string &p_delim return l_return; } -string StringHelper::trim(string p_source) { - string l_source = ""; +std::string StringHelper::trim(std::string p_source) { + std::string l_source = ""; int i; int l_len; //remove "space" before @@ -151,12 +151,12 @@ string StringHelper::trim(string p_source) { } #include -string StringHelper::kHash(string par, int p_len) { +std::string StringHelper::kHash(std::string par, int p_len) { unsigned int i = par.length(); char hArr[i - 1]; int hNum[16] = { 75, 114, 105, 120, 119, 97, 114, 101, 32, 83, 116, 117, 100, 105, 111, 115 }; int hVal = 10; - string sHash; + std::string sHash; //delimit hash length if (p_len < 8) { p_len = 8; } @@ -194,14 +194,14 @@ string StringHelper::kHash(string par, int p_len) { return sHash.substr(0, p_len); } -string StringHelper::replace(std::string s, std::string const& p_find, std::string const& p_replace) { +std::string StringHelper::replace(std::string s, std::string const& p_find, std::string const& p_replace) { std::size_t pos = s.find(p_find); if (pos == std::string::npos) return s; s.replace(pos, p_find.length(), p_replace); return s; } -string StringHelper::replaceAll(std::string s, std::string const& p_find, std::string const& p_replace) { +std::string StringHelper::replaceAll(std::string s, std::string const& p_find, std::string const& p_replace) { std::string temp; do { temp = s; diff --git a/studio/util/string/stringhelper.h b/studio/util/string/stringhelper.h index 70693a7..e6509fb 100644 --- a/studio/util/string/stringhelper.h +++ b/studio/util/string/stringhelper.h @@ -29,26 +29,25 @@ #include #include #include - using namespace std; class StringHelper { public: - static string toUpper(string p_str); - static string toLower(string p_str); - static string integerToString(int p_src); - static string unsignedIntegerToString(unsigned int p_src); - static string doubleToString(double p_src); - static int toInteger(string p_str); - static unsigned int toUnsignedInteger(string p_str); - static long toLong(string p_str); - static double toDouble(string p_str); - static bool toBoolean(string p_str); - static std::vector split(const string &p_source, const string &p_delimiter); - static string trim(string p_source); - static string kHash(string par, int p_len = 8); + static std::string toUpper(std::string p_str); + static std::string toLower(std::string p_str); + static std::string integerToString(int p_src); + static std::string unsignedIntegerToString(unsigned int p_src); + static std::string doubleToString(double p_src); + static int toInteger(std::string p_str); + static unsigned int toUnsignedInteger(std::string p_str); + static long toLong(std::string p_str); + static double toDouble(std::string p_str); + static bool toBoolean(std::string p_str); + static std::vector split(const std::string &p_source, const std::string &p_delimiter); + static std::string trim(std::string p_source); + static std::string kHash(std::string par, int p_len = 8); - static string replace(std::string s, std::string const& p_find, std::string const& p_replace); - static string replaceAll(std::string s, std::string const& p_find, std::string const& p_replace); + static std::string replace(std::string s, std::string const& p_find, std::string const& p_replace); + static std::string replaceAll(std::string s, std::string const& p_find, std::string const& p_replace); }; #endif //UTIL_STRING_HELPER_H diff --git a/studio/util/xml/xml.cpp b/studio/util/xml/xml.cpp index d6c8a26..f3f417d 100644 --- a/studio/util/xml/xml.cpp +++ b/studio/util/xml/xml.cpp @@ -27,7 +27,7 @@ BasicXml::BasicXml() { setContent(""); } -BasicXml::BasicXml(string p_content) { +BasicXml::BasicXml(std::string p_content) { setContent(p_content); } @@ -35,14 +35,14 @@ BasicXml::~BasicXml() { // } -void BasicXml::setContent(string p_content) { +void BasicXml::setContent(std::string p_content) { _xmlContent = p_content; } -string BasicXml::getContent() { +std::string BasicXml::getContent() { return _xmlContent; } -bool BasicXml::parse(string p_content) { +bool BasicXml::parse(std::string p_content) { setContent(p_content); return parse(); } @@ -50,7 +50,7 @@ bool BasicXml::parse(string p_content) { XmlTag BasicXml::getRoot() { return _root; } -string BasicXml::toString() { +std::string BasicXml::toString() { std::ostringstream l_ostringstream; for (unsigned int i = 0; i < _xmlTagProperties.size(); ++i) { l_ostringstream << _xmlTagProperties[i].toString() << " "; @@ -70,7 +70,7 @@ unsigned int BasicXml::skipWhitespace(unsigned int p_index) { return -1; } -unsigned int BasicXml::expectFor(unsigned int p_index, string p_token) { +unsigned int BasicXml::expectFor(unsigned int p_index, std::string p_token) { unsigned int l_len = _tokens.size(); for (unsigned int i = p_index; i < l_len; ++i) { i = skipWhitespace(i); @@ -83,7 +83,7 @@ unsigned int BasicXml::expectFor(unsigned int p_index, string p_token) { return -1; } -unsigned int BasicXml::lookFor(unsigned int p_index, string p_token) { +unsigned int BasicXml::lookFor(unsigned int p_index, std::string p_token) { unsigned int l_len = _tokens.size(); for (unsigned int i = p_index; i < l_len; ++i) { i = skipWhitespace(i); @@ -106,7 +106,7 @@ unsigned int BasicXml::getPreviousIndex(unsigned int p_index) { return -1; } -bool BasicXml::isNumeric(string p_value) { +bool BasicXml::isNumeric(std::string p_value) { bool l_gotDOT = false; for (unsigned int i = 0; i < p_value.length(); ++i) { @@ -143,7 +143,7 @@ bool BasicXml::parse() { } unsigned int l_len = strlen(_xmlContent.c_str()); - string l_token = ""; + std::string l_token = ""; for (unsigned int l_index = 0; l_index < l_len; ++l_index) { if (BasicXml::isNumeric(l_token) && (_xmlContent[l_index] == '0' || _xmlContent[l_index] == '.' || _xmlContent[l_index] == '-' @@ -249,11 +249,12 @@ bool BasicXml::tokenize() { return false; } } + return true; } -void BasicXml::listChildren(vector p_tags, string p_tab) { +void BasicXml::listChildren(std::vector p_tags, std::string p_tab) { std::cout << std::endl; for (unsigned int i = 0; i < p_tags.size(); ++i) { std::cout << p_tab << "[" << i << "]\t" << p_tags[i].getName() << " -> "; @@ -270,7 +271,7 @@ void BasicXml::printXML() { listChildren(_root._children, "\t"); } -bool BasicXml::setXML(string p_xmldata) { +bool BasicXml::setXML(std::string p_xmldata) { if (parse(p_xmldata)) { if (tokenize()) { return true; @@ -283,8 +284,8 @@ bool BasicXml::setXML(string p_xmldata) { return false; } -string BasicXml::getXMLChildren(vector p_children, string p_tab) { - string l_xml = ""; +std::string BasicXml::getXMLChildren(std::vector p_children, std::string p_tab) { + std::string l_xml = ""; for (unsigned int i = 0; i < p_children.size(); ++i) { l_xml += p_tab + "<" + p_children[i].getName(); std::vector l_properties = p_children[i].getProperties(); @@ -314,12 +315,12 @@ string BasicXml::getXMLChildren(vector p_children, string p_tab) { return l_xml; } -string BasicXml::getXML() { +std::string BasicXml::getXML() { std::vector l_root; l_root.push_back(_root); return getXMLChildren(l_root, ""); #ifdef zxcasd - string l_xml = "<" + _root.getName(); + std::string l_xml = "<" + _root.getName(); std::vector l_properties = _root.getProperties(); if (l_properties.size() > 0) { l_xml += " "; @@ -535,12 +536,13 @@ unsigned int BasicXml::createTag(unsigned int p_index, XmlTag &p_xmlTagParent) { return i; } -string BasicXml::openXMLFile(string p_path) { +std::string BasicXml::openXMLFile(std::string p_path) { char ch; - string l_string = ""; - fstream fin(p_path, fstream::in); - while (fin >> noskipws >> ch) { + std::string l_string = ""; + std::fstream fin(p_path, std::fstream::in); + while (fin >> std::noskipws >> ch) { l_string += ch; } + return l_string; } diff --git a/studio/util/xml/xml.h b/studio/util/xml/xml.h index dae9abf..b2b3069 100644 --- a/studio/util/xml/xml.h +++ b/studio/util/xml/xml.h @@ -33,21 +33,20 @@ #include "xmltagproperty.h" #include "xmltoken.h" #include "xmltag.h" - using namespace std; class BasicXml { public: - BasicXml(string p_xmlContent); + BasicXml(std::string p_xmlContent); BasicXml(); virtual ~BasicXml(); - void setContent(string p_xmlContent); - string getContent(); - bool parse(string p_content); + void setContent(std::string p_xmlContent); + std::string getContent(); + bool parse(std::string p_content); bool parse(); - void setProperties(vector p_xmlTagProperties); - string getProperties(); + void setProperties(std::vector p_xmlTagProperties); + std::string getProperties(); BasicXml clone(); std::string toString(); void copy(BasicXml p_xmlTag); @@ -59,21 +58,21 @@ void debugToken(unsigned int p_index); void printXML(); - string getXML(); - bool setXML(string p_xmldata); + std::string getXML(); + bool setXML(std::string p_xmldata); - static string openXMLFile(string p_path); - static bool isNumeric(string p_value); + static std::string openXMLFile(std::string p_path); + static bool isNumeric(std::string p_value); protected: unsigned int createTag(unsigned int p_index, XmlTag &p_xmlTagParent); unsigned int skipWhitespace(unsigned int p_index); - unsigned int expectFor(unsigned int p_index, string p_token); - unsigned int lookFor(unsigned int p_index, string p_token); + unsigned int expectFor(unsigned int p_index, std::string p_token); + unsigned int lookFor(unsigned int p_index, std::string p_token); unsigned int getPreviousIndex(unsigned int p_index); - void listChildren(vector p_tags, string p_tab); - string getXMLChildren(vector p_children, string p_tab); + void listChildren(std::vector p_tags, std::string p_tab); + std::string getXMLChildren(std::vector p_children, std::string p_tab); - string _xmlContent; + std::string _xmlContent; std::vector _xmlTagProperties; XmlTag _root; // std::vector _children; diff --git a/studio/util/xml/xmltag.cpp b/studio/util/xml/xmltag.cpp index 41f0149..029cb11 100644 --- a/studio/util/xml/xmltag.cpp +++ b/studio/util/xml/xmltag.cpp @@ -28,12 +28,12 @@ XmlTag::XmlTag() { _xmlTagProperties.clear(); } -XmlTag::XmlTag(string p_name) { +XmlTag::XmlTag(std::string p_name) { setName(p_name); _xmlTagProperties.clear(); } -XmlTag::XmlTag(string p_name, std::vector p_xmlTagProperties) { +XmlTag::XmlTag(std::string p_name, std::vector p_xmlTagProperties) { setName(p_name); setProperties(p_xmlTagProperties); } @@ -85,22 +85,22 @@ std::string XmlTag::toString() { return l_ostringstream.str(); } -void XmlTag::setName(string p_name) { +void XmlTag::setName(std::string p_name) { _name = p_name; } -void XmlTag::setProperties(vector p_xmlTagProperties) { +void XmlTag::setProperties(std::vector p_xmlTagProperties) { _xmlTagProperties.clear(); for (unsigned int i = 0; i < p_xmlTagProperties.size(); ++i) { _xmlTagProperties.push_back(p_xmlTagProperties[i]); } } -string XmlTag::getName() { +std::string XmlTag::getName() { return _name; } -vector XmlTag::getProperties() { +std::vector XmlTag::getProperties() { std::vector l_xmlTagProperties; l_xmlTagProperties.clear(); for (unsigned int i = 0; i < _xmlTagProperties.size(); ++i) { diff --git a/studio/util/xml/xmltag.h b/studio/util/xml/xmltag.h index 5f12741..c9c62bb 100644 --- a/studio/util/xml/xmltag.h +++ b/studio/util/xml/xmltag.h @@ -28,18 +28,17 @@ #include #include #include "xmltagproperty.h" - using namespace std; class XmlTag { public: XmlTag(); - XmlTag(string p_name); - XmlTag(string p_name, std::vector p_xmlTagProperties); + XmlTag(std::string p_name); + XmlTag(std::string p_name, std::vector p_xmlTagProperties); virtual ~XmlTag(); - void setName(string p_name); - string getName(); - void setProperties(vector p_xmlTagProperties); + void setName(std::string p_name); + std::string getName(); + void setProperties(std::vector p_xmlTagProperties); std::vector getProperties(); unsigned int addChild(XmlTag p_xmlTag); XmlTag getChild(unsigned int p_index); @@ -49,9 +48,9 @@ void copy(XmlTag p_xmlTag); bool equalTo(XmlTag p_xmlTag); std::vector _children; - string _value; // values + std::string _value; // values protected: - string _name; + std::string _name; std::vector _xmlTagProperties; }; #endif //KAGE_UTIL_XMLTAG_H diff --git a/studio/util/xml/xmltagproperty.cpp b/studio/util/xml/xmltagproperty.cpp index 5e5d959..6feb3ba 100644 --- a/studio/util/xml/xmltagproperty.cpp +++ b/studio/util/xml/xmltagproperty.cpp @@ -27,7 +27,7 @@ XmlTagProperty::XmlTagProperty() { setName(""); } -XmlTagProperty::XmlTagProperty(string p_name, string p_value) { +XmlTagProperty::XmlTagProperty(std::string p_name, std::string p_value) { setName(p_name); setValue(p_value); } @@ -57,18 +57,18 @@ std::string XmlTagProperty::toString() { return l_ostringstream.str(); } -void XmlTagProperty::setName(string p_name) { +void XmlTagProperty::setName(std::string p_name) { _name = p_name; } -void XmlTagProperty::setValue(string p_value) { +void XmlTagProperty::setValue(std::string p_value) { _value = p_value; } -string XmlTagProperty::getName() { +std::string XmlTagProperty::getName() { return _name; } -string XmlTagProperty::getValue() { +std::string XmlTagProperty::getValue() { return _value; } diff --git a/studio/util/xml/xmltagproperty.h b/studio/util/xml/xmltagproperty.h index bafde12..8ea6bd1 100644 --- a/studio/util/xml/xmltagproperty.h +++ b/studio/util/xml/xmltagproperty.h @@ -1,7 +1,7 @@ /* * xmltagproperty.h * - * Copyright 2019 Mj Mendoza IV + * Copyright 2019~2024 Mj Mendoza IV * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,24 +26,23 @@ #include #include - using namespace std; class XmlTagProperty { public: XmlTagProperty(); - XmlTagProperty(string p_name, string p_value); + XmlTagProperty(std::string p_name, std::string p_value); virtual ~XmlTagProperty(); - void setName(string p_name); - void setValue(string p_value); - string getName(); - string getValue(); + void setName(std::string p_name); + void setValue(std::string p_value); + std::string getName(); + std::string getValue(); XmlTagProperty clone(); std::string toString(); void copy(XmlTagProperty p_xmlTagProperty); bool equalTo(XmlTagProperty p_xmlTagProperty); protected: - string _name; - string _value; + std::string _name; + std::string _value; }; #endif //KAGE_UTIL_XMLTAGPROPERTY_H