1 /* === S Y N F I G ========================================================= */
2 /*! \file widget_canvaschooser.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 <synfig/general.h>
34
35 #include "widgets/widget_canvaschooser.h"
36 #include <gtkmm/menu.h>
37 #include "app.h"
38
39 #include <gui/localization.h>
40
41 #endif
42
43 /* === U S I N G =========================================================== */
44
45 using namespace std;
46 using namespace etl;
47 using namespace synfig;
48 using namespace studio;
49
50 /* === M A C R O S ========================================================= */
51
52 /* === G L O B A L S ======================================================= */
53
54 /* === P R O C E D U R E S ================================================= */
55
56 /* === M E T H O D S ======================================================= */
57
Widget_CanvasChooser()58 Widget_CanvasChooser::Widget_CanvasChooser():
59 canvas_menu(NULL)
60 { }
61
~Widget_CanvasChooser()62 Widget_CanvasChooser::~Widget_CanvasChooser()
63 { }
64
65 void
set_parent_canvas(synfig::Canvas::Handle x)66 Widget_CanvasChooser::set_parent_canvas(synfig::Canvas::Handle x)
67 {
68 assert(x);
69 parent_canvas=x;
70 }
71
72 void
set_value_(synfig::Canvas::Handle data)73 Widget_CanvasChooser::set_value_(synfig::Canvas::Handle data)
74 {
75 set_value(data);
76 activate();
77 }
78
79 void
on_changed()80 Widget_CanvasChooser::on_changed()
81 {
82 int i = get_active_row_number();
83 if (i < 0 || i > (int)canvases.size()) return;
84
85 // Check "Other..." item at the end
86 if (i == (int)canvases.size()) { chooser_menu(); return; }
87
88 if (canvas != canvases[i]) set_value_(canvases[i]);
89 }
90
91 void
set_value(synfig::Canvas::Handle data)92 Widget_CanvasChooser::set_value(synfig::Canvas::Handle data)
93 {
94 assert(parent_canvas);
95 canvas=data;
96
97 synfig::Canvas::Children::iterator iter;
98 synfig::Canvas::Children &children(parent_canvas->children());
99 String label;
100
101 set_active(-1);
102 remove_all();
103 canvases.clear();
104
105 if(canvas)
106 {
107 label=canvas->get_name().empty()?canvas->get_id():canvas->get_name();
108 canvases.push_back(canvas);
109 append(label);
110 }
111
112 for(iter=children.begin();iter!=children.end();iter++)
113 if(*iter!=canvas)
114 {
115 label=(*iter)->get_name().empty()?(*iter)->get_id():(*iter)->get_name();
116 canvases.push_back(*iter);
117 append(label);
118 }
119
120 append(_("Other..."));
121
122 if(canvas)
123 set_active(0);
124 }
125
126 const etl::handle<synfig::Canvas> &
get_value()127 Widget_CanvasChooser::get_value()
128 {
129 return canvas;
130 }
131
132 void
chooser_menu()133 Widget_CanvasChooser::chooser_menu()
134 {
135 String canvas_name;
136
137 if (!App::dialog_entry(_("Choose canvas"),
138 _("Canvas Name: "),
139 canvas_name,
140 _("Cancel"),
141 _("Choose"))
142 )
143 {
144 // the user hit 'cancel', so set the parameter back to its previous value
145 set_value_(canvas);
146 return;
147 }
148
149 if (canvas_name == "")
150 {
151 App::dialog_message_1b(
152 "ERROR",
153 _("No canvas name was specified"),
154 "details",
155 _("Close"));
156
157 set_value_(canvas);
158 return;
159 }
160
161 Canvas::Handle new_canvas;
162 try
163 {
164 String warnings;
165 new_canvas=parent_canvas->find_canvas(canvas_name, warnings);
166 set_value_(new_canvas);
167 }
168 catch(std::runtime_error x)
169 {
170 App::dialog_message_1b(
171 "ERROR",
172 String(_("(Exception Thrown) Error selecting canvas:\n\n")) + x.what(),
173 "details",
174 _("Close"));
175
176 set_value_(canvas);
177 }
178 catch(...)
179 {
180 App::dialog_message_1b(
181 "ERROR",
182 _("Unknown Exception"),
183 "details",
184 _("Close"));
185
186 set_value_(canvas);
187 }
188 }
189