source: synfigstudio/trunk/fuentes/src/gui/mainwindow.cpp @ 481

Last change on this file since 481 was 481, checked in by jrpelegrina, 4 years ago

First release to xenial

File size: 9.7 KB
Line 
1/* === S Y N F I G ========================================================= */
2/*!     \file mainwindow.cpp
3**      \brief MainWindow
4**
5**      $Id$
6**
7**      \legal
8**      ......... ... 2013 Ivan Mahonin
9**
10**      This package is free software; you can redistribute it and/or
11**      modify it under the terms of the GNU General Public License as
12**      published by the Free Software Foundation; either version 2 of
13**      the License, or (at your option) any later version.
14**
15**      This package is distributed in the hope that it will be useful,
16**      but WITHOUT ANY WARRANTY; without even the implied warranty of
17**      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18**      General Public License for more details.
19**      \endlegal
20*/
21/* ========================================================================= */
22
23/* === H E A D E R S ======================================================= */
24
25#ifdef USING_PCH
26#       include "pch.h"
27#else
28#ifdef HAVE_CONFIG_H
29#       include <config.h>
30#endif
31
32#include "mainwindow.h"
33#include "canvasview.h"
34#include "docks/dockable.h"
35#include "docks/dockbook.h"
36#include "docks/dockmanager.h"
37#include "docks/dockdroparea.h"
38#include "dialogs/dialog_input.h"
39
40#include <synfigapp/main.h>
41
42#include <gtkmm/menubar.h>
43#include <gtkmm/box.h>
44
45#endif
46
47/* === U S I N G =========================================================== */
48
49using namespace std;
50using namespace etl;
51using namespace synfig;
52using namespace studio;
53
54/* === M A C R O S ========================================================= */
55
56#define GRAB_HINT_DATA(y)       { \
57                String x; \
58                if(synfigapp::Main::settings().get_value(String("pref.")+y+"_hints",x)) \
59                { \
60                        set_type_hint((Gdk::WindowTypeHint)atoi(x.c_str()));    \
61                } \
62        }
63
64/* === G L O B A L S ======================================================= */
65
66/* === P R O C E D U R E S ================================================= */
67
68/* === M E T H O D S ======================================================= */
69
70MainWindow::MainWindow()
71{
72        set_default_size(600, 400);
73        toggling_show_menubar = App::enable_mainwin_menubar;
74
75        main_dock_book_ = manage(new DockBook());
76        main_dock_book_->allow_empty = true;
77        main_dock_book_->show();
78
79        class Bin : public Gtk::Bin {
80        public:
81                Bin() { }
82        protected:
83                void on_size_allocate(Gtk::Allocation &allocation) {
84                        Gtk::Bin::on_size_allocate(allocation);
85                        if (get_child() != NULL)
86                                get_child()->size_allocate(allocation);
87                }
88        };
89
90        bin_ = manage((Gtk::Bin*)new Bin());
91        bin_->add(*main_dock_book_);
92        bin_->show();
93
94        Gtk::VBox *vbox = manage(new Gtk::VBox());
95
96        Gtk::Widget* menubar = App::ui_manager()->get_widget("/menubar-main");
97        if (menubar != NULL)
98        {
99                vbox->pack_start(*menubar, false, false, 0);
100        }
101
102        vbox->pack_end(*bin_, true, true, 0);
103        vbox->show();
104        if(!App::enable_mainwin_menubar) menubar->hide();
105
106        add(*vbox);
107
108        add_accel_group(App::ui_manager()->get_accel_group());
109
110        init_menus();
111        window_action_group = Gtk::ActionGroup::create("mainwindow-recentfiles");
112        App::ui_manager()->insert_action_group(window_action_group);
113
114        App::signal_recent_files_changed().connect(
115                sigc::mem_fun(*this, &MainWindow::on_recent_files_changed) );
116
117        signal_delete_event().connect(
118                sigc::ptr_fun(App::shutdown_request) );
119
120        App::dock_manager->signal_dockable_registered().connect(
121                sigc::mem_fun(*this,&MainWindow::on_dockable_registered) );
122
123        App::dock_manager->signal_dockable_unregistered().connect(
124                sigc::mem_fun(*this,&MainWindow::on_dockable_unregistered) );
125
126        GRAB_HINT_DATA("mainwindow");
127}
128
129MainWindow::~MainWindow(){ }
130
131void
132MainWindow::show_dialog_input()
133{
134        App::dialog_input->reset();
135        App::dialog_input->present();
136}
137
138void
139MainWindow::init_menus()
140{
141        Glib::RefPtr<Gtk::ActionGroup> action_group = Gtk::ActionGroup::create("mainwindow");
142
143        // file
144        action_group->add( Gtk::Action::create("new", Gtk::StockID("synfig-new_doc"), _("New"), _("Create a new document")),
145                sigc::hide_return(sigc::ptr_fun(&studio::App::new_instance))
146        );
147        action_group->add( Gtk::Action::create("open", Gtk::StockID("synfig-open"), _("Open"), _("Open an existing document")),
148                sigc::hide_return(sigc::bind(sigc::ptr_fun(&studio::App::dialog_open), ""))
149        );
150        action_group->add( Gtk::Action::create("quit", Gtk::StockID("gtk-quit"), _("Quit")),
151                sigc::hide_return(sigc::ptr_fun(&studio::App::quit))
152        );
153
154        // Edit menu
155        action_group->add( Gtk::Action::create("input-devices", _("Input Devices...")),
156                sigc::ptr_fun(&MainWindow::show_dialog_input)
157        );
158        action_group->add( Gtk::Action::create("setup", _("Preferences...")),
159                sigc::ptr_fun(&studio::App::show_setup)
160        );
161
162        // View menu
163        //Glib::RefPtr<Gtk::ToggleAction> action;
164        toggle_menubar = Gtk::ToggleAction::create("toggle-mainwin-menubar", _("Show Menubar"));
165        toggle_menubar->set_active(toggling_show_menubar);
166        action_group->add(toggle_menubar, sigc::mem_fun(*this, &studio::MainWindow::toggle_show_menubar));
167
168        // pre defined workspace (window ui layout)
169        action_group->add( Gtk::Action::create("workspace-compositing", _("Compositing")),
170                sigc::ptr_fun(App::set_workspace_compositing)
171        );
172        action_group->add( Gtk::Action::create("workspace-animating", _("Animating")),
173                sigc::ptr_fun(App::set_workspace_animating)
174        );
175        action_group->add( Gtk::Action::create("workspace-default", _("Default")),
176                sigc::ptr_fun(App::set_workspace_default)
177        );
178
179        // help
180        #define URL(action_name,title,url) \
181                action_group->add( Gtk::Action::create(action_name, title), \
182                        sigc::bind(sigc::ptr_fun(&studio::App::open_url),url))
183        #define WIKI(action_name,title,page) \
184                URL(action_name,title, "http://synfig.org/wiki" + String(page))
185        #define SITE(action_name,title,page) \
186                URL(action_name,title, "http://synfig.org/cms" + String(page))
187
188        action_group->add( Gtk::Action::create("help", Gtk::Stock::HELP),
189                sigc::ptr_fun(studio::App::dialog_help)
190        );
191
192        // TRANSLATORS:         | Help menu entry:              | A wiki page:          |
193        WIKI("help-tutorials",  _("Tutorials"),                                 _("/Category:Tutorials"));
194        WIKI("help-reference",  _("Reference"),                                 _("/Category:Reference"));
195        WIKI("help-faq",                _("Frequently Asked Questions"),_("/FAQ")                               );
196        SITE("help-support",    _("Get Support"),                               _("/en/support")                );
197
198        action_group->add( Gtk::Action::create(
199                        "help-about", Gtk::StockID("synfig-about"), _("About Synfig Studio")),
200                sigc::ptr_fun(studio::App::dialog_about)
201        );
202
203        // TODO: open recent
204        //filemenu->items().push_back(Gtk::Menu_Helpers::MenuElem(_("Open Recent"),*recent_files_menu));
205
206        App::ui_manager()->insert_action_group(action_group);
207}
208
209
210void
211MainWindow::toggle_show_menubar()
212{
213        Gtk::Widget* menubar = App::ui_manager()->get_widget("/menubar-main");
214
215        if(toggling_show_menubar)
216        {
217                menubar->hide();
218                toggling_show_menubar = false;
219        }
220        else
221        {
222                menubar->show();
223                toggling_show_menubar = true;
224        }
225        App::enable_mainwin_menubar = toggling_show_menubar;
226}
227
228
229void
230MainWindow::on_recent_files_changed()
231{
232        Glib::RefPtr<Gtk::ActionGroup> action_group = Gtk::ActionGroup::create("mainwindow-recentfiles");
233
234        int index = 0;
235        std::string menu_items;
236        for(list<string>::const_iterator i=App::get_recent_files().begin();i!=App::get_recent_files().end();i++)
237        {
238                std::string raw = basename(*i);
239                std::string quoted;
240                size_t pos = 0, last_pos = 0;
241
242                // replace _ in filenames by __ or it won't show up in the menu
243                for (pos = last_pos = 0; (pos = raw.find('_', pos)) != string::npos; last_pos = pos)
244                        quoted += raw.substr(last_pos, ++pos - last_pos) + '_';
245                quoted += raw.substr(last_pos);
246
247                std::string action_name = strprintf("file-recent-%d", index++);
248                menu_items += "<menuitem action='" + action_name +"' />";
249
250                action_group->add( Gtk::Action::create(action_name, quoted),
251                        sigc::hide_return(sigc::bind(sigc::ptr_fun(&App::open),*i))
252                );
253        }
254
255        std::string ui_info =
256                "<menu action='menu-file'><menu action='menu-open-recent'>"
257          + menu_items
258          + "</menu></menu>";
259        std::string ui_info_popup =
260                "<ui><popup action='menu-main'>" + ui_info + "</popup></ui>";
261        std::string ui_info_menubar =
262                "<ui><menubar action='menubar-main'>" + ui_info + "</menubar></ui>";
263
264        App::ui_manager()->insert_action_group(action_group);
265        App::ui_manager()->add_ui_from_string(ui_info_popup);
266        App::ui_manager()->add_ui_from_string(ui_info_menubar);
267}
268
269void
270MainWindow::on_dockable_registered(Dockable* dockable)
271{
272
273        // replace _ in panel names (filenames) by __ or it won't show up in the menu,
274        // this block code is just a copy from MainWindow::on_recent_files_changed().
275        std::string raw = dockable->get_local_name();
276        std::string quoted;
277        size_t pos = 0, last_pos = 0;
278        for (pos = last_pos = 0; (pos = raw.find('_', pos)) != string::npos; last_pos = pos)
279                quoted += raw.substr(last_pos, ++pos - last_pos) + '_';
280        quoted += raw.substr(last_pos);
281
282        window_action_group->add( Gtk::Action::create("panel-" + dockable->get_name(), quoted),
283                sigc::mem_fun(*dockable, &Dockable::present)
284        );
285
286        std::string ui_info =
287                "<menu action='menu-window'>"
288            "<menuitem action='panel-" + dockable->get_name() + "' />"
289            "</menu>";
290        std::string ui_info_popup =
291                "<ui><popup action='menu-main'>" + ui_info + "</popup></ui>";
292        std::string ui_info_menubar =
293                "<ui><menubar action='menubar-main'>" + ui_info + "</menubar></ui>";
294
295        Gtk::UIManager::ui_merge_id merge_id_popup = App::ui_manager()->add_ui_from_string(ui_info_popup);
296        Gtk::UIManager::ui_merge_id merge_id_menubar = App::ui_manager()->add_ui_from_string(ui_info_menubar);
297
298        // record CanvasView toolbar and popup id's
299        CanvasView *canvas_view = dynamic_cast<CanvasView*>(dockable);
300        if(canvas_view)
301        {
302                canvas_view->set_popup_id(merge_id_popup);
303                canvas_view->set_toolbar_id(merge_id_menubar);
304        }
305}
306
307void
308MainWindow::on_dockable_unregistered(Dockable* dockable)
309{
310        // remove the document from the menus
311        CanvasView *canvas_view = dynamic_cast<CanvasView*>(dockable);
312        if(canvas_view)
313        {
314                App::ui_manager()->remove_ui(canvas_view->get_popup_id());
315                App::ui_manager()->remove_ui(canvas_view->get_toolbar_id());
316        }
317}
318/* === E N T R Y P O I N T ================================================= */
Note: See TracBrowser for help on using the repository browser.