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

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

First release to xenial

File size: 6.1 KB
Line 
1/* === S Y N F I G ========================================================= */
2/*!     \file dockbook.cpp
3**      \brief Template File
4**
5**      $Id$
6**
7**      \legal
8**      Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
9**      Copyright (c) 2007 Chris Moore
10**
11**      This package is free software; you can redistribute it and/or
12**      modify it under the terms of the GNU General Public License as
13**      published by the Free Software Foundation; either version 2 of
14**      the License, or (at your option) any later version.
15**
16**      This package is distributed in the hope that it will be useful,
17**      but WITHOUT ANY WARRANTY; without even the implied warranty of
18**      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19**      General Public License for more details.
20**      \endlegal
21*/
22/* ========================================================================= */
23
24/* === H E A D E R S ======================================================= */
25
26#ifdef USING_PCH
27#       include "pch.h"
28#else
29#ifdef HAVE_CONFIG_H
30#       include <config.h>
31#endif
32
33#include "docks/dockbook.h"
34#include "docks/dockable.h"
35#include "app.h"
36#include "docks/dockmanager.h"
37#include "docks/dockdroparea.h"
38
39#include <gtkmm/image.h>
40#include <gtkmm/eventbox.h>
41#include <gtkmm/menu.h>
42#include <gtkmm/imagemenuitem.h>
43
44#include "general.h"
45
46#include "canvasview.h"
47
48#endif
49
50/* === U S I N G =========================================================== */
51
52using namespace std;
53using namespace etl;
54using namespace synfig;
55using namespace studio;
56
57/* === M A C R O S ========================================================= */
58
59/* === G L O B A L S ======================================================= */
60
61/* === P R O C E D U R E S ================================================= */
62
63/* === M E T H O D S ======================================================= */
64
65DockBook::DockBook():
66        allow_empty(false)
67{
68        std::vector<Gtk::TargetEntry> listTargets;
69        listTargets.push_back( Gtk::TargetEntry("SYNFIG_DOCK") );
70
71        drag_dest_set(listTargets);
72        //set_sensitive(true);
73        set_receives_default(true);
74        set_can_default(true);
75        //add_events(Gdk::ALL_EVENTS_MASK);
76        //set_extension_events(Gdk::EXTENSION_EVENTS_ALL);
77        set_show_tabs(true);
78        set_scrollable(true);
79        deleting_=false;
80
81        DockDropArea *dock_area = manage(new DockDropArea(this));
82        dock_area->show();
83        set_action_widget(dock_area, Gtk::PACK_END);
84}
85
86DockBook::~DockBook()
87{
88        DockManager::containers_to_remove_.erase(this);
89        deleting_=true;
90        clear();
91}
92
93void
94DockBook::clear()
95{
96        while(get_n_pages())
97                remove(static_cast<Dockable&>(*get_nth_page(get_n_pages()-1)));
98}
99
100void
101DockBook::on_drag_data_received(const Glib::RefPtr<Gdk::DragContext>& context, int, int, const Gtk::SelectionData& selection_data, guint, guint time)
102{
103        if ((selection_data.get_length() >= 0) && (selection_data.get_format() == 8))
104        {
105                Dockable& dockable(**reinterpret_cast<Dockable**>(const_cast<guint8*>(selection_data.get_data())));
106                if(dockable.get_parent()!=this)
107                        add(dockable);
108                dockable.present();
109                context->drag_finish(true, false, time);
110                return;
111        }
112
113        context->drag_finish(false, false, time);
114}
115
116void
117DockBook::add(Dockable& dockable, int position)
118{
119        DockManager::remove_widget_recursive(dockable);
120
121        if(position==-1)
122                append_page(dockable, " ");
123        else
124                insert_page(dockable, " ", position);
125
126        refresh_tab(&dockable);
127
128        dockable.signal_stock_id_changed().connect(
129                sigc::bind(
130                        sigc::mem_fun(
131                                *this,
132                                &DockBook::refresh_tab
133                        ),
134                        &dockable
135                )
136        );
137
138        dockable.show();
139
140        signal_changed_();
141}
142
143void
144DockBook::refresh_tab(Dockable* dockable)
145{
146        Gtk::Widget* label(dockable->create_tab_label());
147
148        label->signal_button_press_event().connect(
149                sigc::bind(
150                        sigc::mem_fun(
151                                *this,
152                                &DockBook::tab_button_pressed
153                        ),
154                        dockable
155                )
156        );
157
158        set_tab_label(*dockable, *label);
159        label->show();
160}
161
162
163void
164DockBook::remove(Dockable& dockable)
165{
166        dockable.hide();
167        remove_page(dockable);
168
169        if(!deleting_)
170        {
171                signal_changed_();
172
173                if(get_n_pages()==0)
174                        signal_empty()();
175        }
176}
177
178void
179DockBook::present()
180{
181        show();
182}
183
184synfig::String
185DockBook::get_local_contents()const
186{
187        synfig::String ret;
188
189        for(int i(0);i!=const_cast<DockBook*>(this)->get_n_pages();i++)
190        {
191                Dockable& dockable(static_cast<Dockable&>(*const_cast<DockBook*>(this)->get_nth_page(i)));
192
193                if(i)
194                        ret+=", ";
195                ret+=dockable.get_local_name();
196        }
197
198        return ret;
199}
200
201synfig::String
202DockBook::get_contents()const
203{
204        synfig::String ret;
205
206        for(int i(0);i!=const_cast<DockBook*>(this)->get_n_pages();i++)
207        {
208                Dockable& dockable(static_cast<Dockable&>(*const_cast<DockBook*>(this)->get_nth_page(i)));
209
210                if(i)
211                        ret+=' ';
212                ret+=dockable.get_name();
213        }
214
215        return ret;
216}
217
218void
219DockBook::set_contents(const synfig::String& x)
220{
221        synfig::String str(x);
222        while(!str.empty())
223        {
224                synfig::String::size_type separator=str.find_first_of(' ');
225                synfig::String dock;
226                if(separator==synfig::String::npos)
227                {
228                        dock=str;
229                        str.clear();
230                }
231                else
232                {
233                        dock=String(str.begin(),str.begin()+separator);
234                        str=String(str.begin()+separator+1,str.end());
235                }
236
237                try
238                {
239                        add(App::dock_manager->find_dockable(dock));
240                }catch(...) { }
241        }
242}
243
244bool
245DockBook::tab_button_pressed(GdkEventButton* event, Dockable* dockable)
246{
247        CanvasView *canvas_view = dynamic_cast<CanvasView*>(dockable);
248        if (canvas_view && canvas_view != App::get_selected_canvas_view())
249                App::set_selected_canvas_view(canvas_view);
250
251        if(event->button!=3)
252                return false;
253
254        Gtk::Menu *tabmenu=manage(new class Gtk::Menu());
255        tabmenu->signal_hide().connect(sigc::bind(sigc::ptr_fun(&delete_widget), tabmenu));
256
257        Gtk::MenuItem *item = manage(new Gtk::ImageMenuItem(Gtk::StockID("gtk-close")));
258        item->signal_activate().connect(
259                sigc::bind(sigc::ptr_fun(&DockManager::remove_widget_by_pointer_recursive), dockable) );
260
261        tabmenu->append(*item);
262        item->show();
263        tabmenu->popup(event->button,gtk_get_current_event_time());
264
265        return true;
266}
267
268void
269DockBook::on_switch_page(Gtk::Widget* page, guint page_num)
270{
271        if (page != NULL && this->page_num(*page)) {
272                CanvasView *canvas_view = dynamic_cast<CanvasView*>(page);
273                if (canvas_view && canvas_view != App::get_selected_canvas_view())
274                        App::set_selected_canvas_view(canvas_view);
275        }
276        Notebook::on_switch_page(page, page_num);
277}
Note: See TracBrowser for help on using the repository browser.