Dev:Adding a Panel - Part I
Here's an example of how to build a module and add a basic panel option to the file menu in Synfig Studio. For this example I will make a empty panel option and have subsequent parts adding to it.
Section 1, "The Code" will present the entire source, uninterrupted
Contents
The Code
We need to create four new files (two header (.h) files. One for the module and one for the dock, and two implementations (.cpp) files. Also one for the module and one for the dock), and edit one existing files (outside of the newly created module directory app.cpp, and the Makefile.am), all in the synfigstudio/src/gtkmm/ folder:
<gtkmm dir>/mod_boring/mod_boring.h
/* === S Y N F I G ========================================================= */ /*! \file mod_boring.h ** \brief Template Header ** ** $Id$ ** ** \legal ** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley ** ** This package is free software; you can redistribute it and/or ** modify it under the terms of the GNU General Public License as ** published by the Free Software Foundation; either version 2 of ** the License, or (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** General Public License for more details. ** \endlegal */ /* ========================================================================= */ /* === S T A R T =========================================================== */ #ifndef __SYNFIG_MOD_BORING_H #define __SYNFIG_MOD_BORING_H /* === H E A D E R S ======================================================= */ #include <ETL/handle> #include "../module.h" /* === C L A S S E S & S T R U C T S ======================================= */ namespace studio { class Dock_BoringEdit; class ModBoring : public Module { friend class Dock_BoringEdit; Dock_BoringEdit* dock_boring_edit; protected: virtual bool start_vfunc(); virtual bool stop_vfunc(); public: virtual ~ModBoring() { stop(); } }; }; // END of namespace studio /* === E N D =============================================================== */ #endif
<gtkmm dir>/mod_boring/mod_boring.cpp
/* === S Y N F I G ========================================================= */ /*! \file mod_boring.cpp ** \brief Template File ** ** $Id$ ** ** \legal ** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley ** ** This package is free software; you can redistribute it and/or ** modify it under the terms of the GNU General Public License as ** published by the Free Software Foundation; either version 2 of ** the License, or (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** General Public License for more details. ** \endlegal */ /* ========================================================================= */ /* === H E A D E R S ======================================================= */ #ifdef USING_PCH # include "pch.h" #else #ifdef HAVE_CONFIG_H # include <config.h> #endif #include "mod_boring.h" #include "dock_boringedit.h" #include "../app.h" #include "../dockmanager.h" #include "../general.h" #endif /* === U S I N G =========================================================== */ using namespace std; using namespace etl; using namespace synfig; using namespace studio; /* === M E T H O D S ======================================================= */ bool studio::ModBoring::start_vfunc() { dock_boring_edit=new Dock_BoringEdit(); App::get_dock_manager()->register_dockable(*dock_boring_edit); return true; } bool studio::ModBoring::stop_vfunc() { App::get_dock_manager()->unregister_dockable(*dock_boring_edit); delete dock_boring_edit; return true; }
<gtkmm dir>/mod_boring/dock_boring.h
/* === S Y N F I G ========================================================= */ /*! \file dock_boringedit.h ** \brief Template Header ** ** $Id$ ** ** \legal ** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley ** ** This package is free software; you can redistribute it and/or ** modify it under the terms of the GNU General Public License as ** published by the Free Software Foundation; either version 2 of ** the License, or (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** General Public License for more details. ** \endlegal */ /* ========================================================================= */ /* === S T A R T =========================================================== */ #ifndef __SYNFIG_STUDIO_DOCK_BORING_EDIT_H #define __SYNFIG_STUDIO_DOCK_BORING_EDIT_H /* === H E A D E R S ======================================================= */ #include <gtk/gtk.h> #include <gtkmm/adjustment.h> #include <gtkmm/table.h> #include <gtkmm/dialog.h> #include <synfig/time.h> #include <synfigapp/value_desc.h> #include <synfig/time.h> #include "../dockable.h" #include <vector> #include <gtkmm/actiongroup.h> /* === C L A S S E S & S T R U C T S ======================================= */ namespace synfigapp { class CanvasInterface; }; namespace studio { class Dock_BoringEdit : public Dockable { Glib::RefPtr<Gtk::ActionGroup> action_group; Gtk::Table table; sigc::signal<void> signal_changed_; public: Dock_BoringEdit(); ~Dock_BoringEdit(); }; // END of Dock_BoringEdit }; // END of namespace studio /* === E N D =============================================================== */ #endif
<gtkmm dir>/mod_boring/dock_boring.cpp
/* === S Y N F I G ========================================================= */ /*! \file dock_boringedit.cpp ** \brief Template File ** ** Takes two lists of ducks coords and matches one to another blines ducks coords ** creating a shapeshift not a tween of the two blines instead of working with one ** bline. ** ** $Id$ ** ** \legal ** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley ** Copyright (c) 2007 Chris Moore ** ** This package is free software; you can redistribute it and/or ** modify it under the terms of the GNU General Public License as ** published by the Free Software Foundation; either version 2 of ** the License, or (at your option) any later version. ** ** This package is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** General Public License for more details. ** \endlegal */ /* ========================================================================= */ /* === H E A D E R S ======================================================= */ #ifdef USING_PCH # include "pch.h" #else #ifdef HAVE_CONFIG_H # include <config.h> #endif #include "dock_boringedit.h" #include <gtkmm/frame.h> #include <gtkmm/table.h> #include <gtkmm/label.h> #include <synfig/general.h> #include <synfigapp/canvasinterface.h> #include <synfigapp/value_desc.h> #include <synfigapp/main.h> #include "../app.h" #include "../general.h" #endif /* === U S I N G =========================================================== */ using namespace std; using namespace etl; using namespace synfig; using namespace studio; /* === M E T H O D S ======================================================= */ Dock_BoringEdit::Dock_BoringEdit(): Dockable("boring_edit",_("Boring"), Gtk::StockID("gtk-execute")), table(2,2,false) { Glib::ustring ui_info = "<ui>" " <toolbar action='toolbar-boring'>" " </toolbar>" "</ui>" ; App::ui_manager()->add_ui_from_string(ui_info); set_toolbar(*dynamic_cast<Gtk::Toolbar*>(App::ui_manager()->get_widget("/toolbar-boring"))); add(table); table.set_homogeneous(true); show_all_children(); } Dock_BoringEdit::~Dock_BoringEdit() { }
<gtkmm dir/app.cpp
And we edit <gtkmm dir>mod_boring/app.cpp. Add this with the other #include lines:
#include "mod_boring/mod_boring.h"
And we edit <gtkmm dir>/mod_boring/app.cpp. Add this with the others in the G L O B A L section lines:
etl::handle< studio::ModBoring > mod_boring_;
<gtkmm dir>/Makefile.am
Then I need to edit <gtkmm dir>Makefile.am and add these two files to the list of source files (maintain alphabetical order please):
This will be added above the PALETTE_HH section.
BORING_HH = \ mod_boring/dock_boringedit.h mod_boring/mod_boring.h BORING_CC = \ mod_boring/dock_boringedit.cpp mod_boring/mod_boring.cpp
This will be added to the list of items in the "synfigstudio_SOURCES =" line.
$(BORING_CC) $(BORING_HH)
Compiling
Note: This directory structures is based on the *NIX environment.
First you will need to follow the http://www.synfig.org/Build_Instructions. Then you will need to create a directory in synfigstudio/src/gtkmm/ called mod_boring. Next you will copy the above four files into that directory. After That you will need to modify the two files app.cpp and Makefile.am as stated above. You will have to run "autoreconf --install --force" and "./configure" once again to sync the makefiles up with your changes. This is only done if you modify the Makefile.am
The Location
After you install the newly compiled Synfigstudio, run the binary. From the main Synfigstudio interface choose the "File" option and select "panels".
From here your new panel should be located in this list of items. Select it. An empty tab window, based on the default synfigstudio layout should show up with the default exec icon. The only thing you can do at this time is drag and drop it into another one of the panels. To try this choose one or more and drag it onto the boring panel. They should become one. This gives you a basic dock widget to work with.
Adding Widgets
This will be described in the next part of adding a panel.