f1a3464e8d3b9daff0b5ce32ef45e713bce8efe8
[synfig.git] / synfig-studio / trunk / src / gtkmm / renddesc.cpp
1 /* === S Y N F I G ========================================================= */
2 /*!     \file gtkmm/renddesc.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 "renddesc.h"
34 #include <gtkmm/label.h>
35 #include <gtkmm/frame.h>
36 #include <gtkmm/alignment.h>
37 #include <gtkmm/box.h>
38 #include <ETL/misc>
39 #include <synfig/general.h>
40 //#include <gtkmm/separator.h>
41
42 #include "general.h"
43
44 #endif
45
46 /* === U S I N G =========================================================== */
47
48 using namespace std;
49 using namespace etl;
50 using namespace synfig;
51 using namespace studio;
52
53 /* === M A C R O S ========================================================= */
54
55 #ifndef SYNFIG_MAX_PIXEL_WIDTH
56 #define SYNFIG_MAX_PIXEL_WIDTH  (~(1<<31))
57 #endif
58
59 #ifndef SYNFIG_MAX_PIXEL_HEIGHT
60 #define SYNFIG_MAX_PIXEL_HEIGHT (~(1<<31))
61 #endif
62
63 #ifndef DPM2DPI
64 #define DPM2DPI(x)      ((x)/39.3700787402)
65 #define DPI2DPM(x)      ((x)*39.3700787402)
66 #endif
67
68 #ifndef METERS2INCHES
69 #define METERS2INCHES(x)        ((x)*39.3700787402)
70 #define INCHES2METERS(x)        ((x)/39.3700787402)
71 #endif
72
73 /* === G L O B A L S ======================================================= */
74
75 /* === P R O C E D U R E S ================================================= */
76
77 /* === M E T H O D S ======================================================= */
78
79 Widget_RendDesc::Widget_RendDesc():
80         Gtk::Notebook(),
81         adjustment_width(1,1,SYNFIG_MAX_PIXEL_WIDTH),
82         adjustment_height(1,1,SYNFIG_MAX_PIXEL_HEIGHT),
83         adjustment_xres(0,0.0000000001,10000000),
84         adjustment_yres(0,0.0000000001,10000000),
85         adjustment_phy_width(0,0.0000000001,10000000),
86         adjustment_phy_height(0,0.0000000001,10000000),
87         adjustment_fps(0,0.0000000001,10000000),
88         adjustment_span(0,0.0000000001,10000000)
89 {
90         update_lock=0;
91
92         create_widgets();
93         connect_signals();
94
95         Gtk::Label *image_tab_label = manage(new Gtk::Label(_("Image")));
96         Gtk::Label *time_tab_label = manage(new Gtk::Label(_("Time")));
97         Gtk::Label *other_tab_label = manage(new Gtk::Label(_("Other")));
98         Gtk::Widget *imageTab = create_image_tab();
99         Gtk::Widget *timeTab = create_time_tab();
100         Gtk::Widget *otherTab = create_other_tab();
101         append_page(*imageTab, *image_tab_label);
102         append_page(*timeTab, *time_tab_label);
103         append_page(*otherTab, *other_tab_label);
104 }
105
106 Widget_RendDesc::~Widget_RendDesc()
107 {
108 }
109
110 void Widget_RendDesc::set_rend_desc(const synfig::RendDesc &rend_desc)
111 {
112         if(update_lock)return;
113
114         rend_desc_=rend_desc;
115         refresh();
116 }
117
118 void
119 Widget_RendDesc::refresh()
120 {
121         UpdateLock lock(update_lock);
122         adjustment_width.set_value(rend_desc_.get_w());
123         adjustment_height.set_value(rend_desc_.get_h());
124         adjustment_phy_width.set_value(METERS2INCHES(rend_desc_.get_physical_w()));
125         adjustment_phy_height.set_value(METERS2INCHES(rend_desc_.get_physical_h()));
126         adjustment_xres.set_value(DPM2DPI(rend_desc_.get_x_res()));
127         adjustment_yres.set_value(DPM2DPI(rend_desc_.get_y_res()));
128         entry_start_time->set_fps(rend_desc_.get_frame_rate());
129         entry_start_time->set_value(rend_desc_.get_time_start());
130         entry_end_time->set_fps(rend_desc_.get_frame_rate());
131         entry_end_time->set_value(rend_desc_.get_time_end());
132
133         adjustment_fps.set_value(rend_desc_.get_frame_rate());
134         adjustment_span.set_value(rend_desc_.get_span());
135         entry_tl->set_value(rend_desc_.get_tl());
136         entry_br->set_value(rend_desc_.get_br());
137
138         toggle_px_aspect->set_active((bool)(rend_desc_.get_flags()&RendDesc::PX_ASPECT));
139         toggle_px_width->set_active((bool)(rend_desc_.get_flags()&RendDesc::PX_W));
140         toggle_px_height->set_active((bool)(rend_desc_.get_flags()&RendDesc::PX_H));
141
142         toggle_im_aspect->set_active((bool)(rend_desc_.get_flags()&RendDesc::IM_ASPECT));
143         toggle_im_width->set_active((bool)(rend_desc_.get_flags()&RendDesc::IM_W));
144         toggle_im_height->set_active((bool)(rend_desc_.get_flags()&RendDesc::IM_H));
145         toggle_im_span->set_active((bool)(rend_desc_.get_flags()&RendDesc::IM_SPAN));
146 }
147
148 void Widget_RendDesc::apply_rend_desc(const synfig::RendDesc &rend_desc)
149 {
150         set_rend_desc(rend_desc);
151 }
152
153 const synfig::RendDesc &
154 Widget_RendDesc::get_rend_desc()
155 {
156         return rend_desc_;
157 }
158
159 void
160 Widget_RendDesc::on_width_changed()
161 {
162         if(update_lock)return;
163         UpdateLock lock(update_lock);
164         rend_desc_.set_w(round_to_int(adjustment_width.get_value()));
165         refresh();
166         signal_changed()();
167 }
168
169 void
170 Widget_RendDesc::on_lock_changed()
171 {
172         if(update_lock)return;
173         UpdateLock lock(update_lock);
174
175 #define DO_TOGGLE(x,y)  if(toggle_ ## x->get_active()) \
176                 rend_desc_.set_flags(rend_desc_.get_flags()|RendDesc:: y); \
177         else \
178                 rend_desc_.set_flags(rend_desc_.get_flags()&~RendDesc:: y)
179
180         DO_TOGGLE(px_aspect,PX_ASPECT);
181         DO_TOGGLE(px_width,PX_W);
182         DO_TOGGLE(px_height,PX_H);
183
184         DO_TOGGLE(im_aspect,IM_ASPECT);
185         DO_TOGGLE(im_width,IM_W);
186         DO_TOGGLE(im_height,IM_H);
187         DO_TOGGLE(im_span,IM_SPAN);
188
189 #undef DO_TOGGLE
190
191         refresh();
192         signal_changed()();
193 }
194
195 void
196 Widget_RendDesc::on_height_changed()
197 {
198         if(update_lock)return;
199         UpdateLock lock(update_lock);
200         rend_desc_.set_h(round_to_int(adjustment_height.get_value()));
201         refresh();
202         signal_changed()();
203 }
204
205 void
206 Widget_RendDesc::on_phy_width_changed()
207 {
208         if(update_lock)return;
209         UpdateLock lock(update_lock);
210         rend_desc_.set_physical_w(INCHES2METERS(adjustment_phy_width.get_value()));
211         refresh();
212         signal_changed()();
213 }
214
215 void
216 Widget_RendDesc::on_phy_height_changed()
217 {
218         if(update_lock)return;
219         UpdateLock lock(update_lock);
220         rend_desc_.set_physical_h(INCHES2METERS(adjustment_phy_height.get_value()));
221         refresh();
222         signal_changed()();
223 }
224
225 void
226 Widget_RendDesc::on_xres_changed()
227 {
228         if(update_lock)return;
229         UpdateLock lock(update_lock);
230         rend_desc_.set_x_res(DPI2DPM(adjustment_xres.get_value()));
231         refresh();
232         signal_changed()();
233 }
234
235 void
236 Widget_RendDesc::on_yres_changed()
237 {
238         if(update_lock)return;
239         UpdateLock lock(update_lock);
240         rend_desc_.set_y_res(DPI2DPM(adjustment_yres.get_value()));
241         refresh();
242         signal_changed()();
243 }
244
245 void
246 Widget_RendDesc::on_start_time_changed()
247 {
248         if(update_lock)return;
249         UpdateLock lock(update_lock);
250         rend_desc_.set_time_start(entry_start_time->get_value());
251         refresh();
252         signal_changed()();
253 }
254
255 void
256 Widget_RendDesc::on_end_time_changed()
257 {
258         if(update_lock)return;
259         UpdateLock lock(update_lock);
260         rend_desc_.set_time_end(entry_end_time->get_value());
261         refresh();
262         signal_changed()();
263 }
264
265 /*
266 void
267 Widget_RendDesc::on_start_frame_changed()
268 {
269         if(update_lock)return;
270         UpdateLock lock(update_lock);
271         rend_desc_.set_frame_start((int)(adjustment_start_frame.get_value()+0.5));
272         refresh();
273         signal_changed()();
274 }
275
276 void
277 Widget_RendDesc::on_end_frame_changed()
278 {
279         if(update_lock)return;
280         UpdateLock lock(update_lock);
281         rend_desc_.set_frame_end((int)(adjustment_end_frame.get_value()+0.5));
282         refresh();
283         signal_changed()();
284 }
285 */
286
287 void
288 Widget_RendDesc::on_fps_changed()
289 {
290         if(update_lock)return;
291         UpdateLock lock(update_lock);
292         rend_desc_.set_frame_rate((int)(adjustment_fps.get_value()+0.5));
293         refresh();
294         signal_changed()();
295 }
296
297 void
298 Widget_RendDesc::on_tl_changed()
299 {
300         if(update_lock)return;
301         UpdateLock lock(update_lock);
302         rend_desc_.set_tl(entry_tl->get_value());
303         refresh();
304         signal_changed()();
305 }
306
307 void
308 Widget_RendDesc::on_br_changed()
309 {
310         if(update_lock)return;
311         UpdateLock lock(update_lock);
312         rend_desc_.set_br(entry_br->get_value());
313         refresh();
314         signal_changed()();
315 }
316
317 void
318 Widget_RendDesc::on_span_changed()
319 {
320         if(update_lock)return;
321         UpdateLock lock(update_lock);
322         rend_desc_.set_span(adjustment_span.get_value());
323         refresh();
324         signal_changed()();
325 }
326
327 void
328 Widget_RendDesc::disable_time_section()
329 {
330         time_frame->set_sensitive(false);
331
332 /*
333         Gtk::Table::TableList &list=time_table->children();
334         Gtk::Table::TableList::iterator iter;
335         for(iter=list.begin();iter!=list.end();iter++)
336                 iter->get_widget()->set_sensitive(false);
337 */
338 }
339
340 void
341 Widget_RendDesc::enable_time_section()
342 {
343         time_frame->set_sensitive(true);
344
345 /*
346         Gtk::Table::TableList &list=time_table->children();
347         Gtk::Table::TableList::iterator iter;
348         for(iter=list.begin();iter!=list.end();iter++)
349                 iter->get_widget()->set_sensitive(true);
350
351 */
352 }
353
354 void
355 Widget_RendDesc::create_widgets()
356 {
357         entry_width=manage(new Gtk::SpinButton(adjustment_width,1,0));
358         entry_width->set_alignment(1);
359         entry_height=manage(new Gtk::SpinButton(adjustment_height,1,0));
360         entry_height->set_alignment(1);
361         entry_xres=manage(new Gtk::SpinButton(adjustment_xres,0.5,1));
362         entry_xres->set_alignment(1);
363         entry_yres=manage(new Gtk::SpinButton(adjustment_yres,0.5,1));
364         entry_yres->set_alignment(1);
365         entry_phy_width=manage(new Gtk::SpinButton(adjustment_phy_width,0.25,2));
366         entry_phy_width->set_alignment(1);
367         entry_phy_height=manage(new Gtk::SpinButton(adjustment_phy_height,0.25,2));
368         entry_phy_height->set_alignment(1);
369         entry_span=manage(new Gtk::SpinButton(adjustment_span,0.1,4));
370         entry_span->set_alignment(1);
371         entry_tl=manage(new Widget_Vector());
372         entry_br=manage(new Widget_Vector());
373         entry_fps=manage(new Gtk::SpinButton(adjustment_fps,1,5));
374         entry_start_time=manage(new Widget_Time());
375         entry_end_time=manage(new Widget_Time());
376         //entry_start_frame=manage(new Gtk::SpinButton(adjustment_start_frame,1,0));
377         //entry_end_frame=manage(new Gtk::SpinButton(adjustment_end_frame,1,0));
378         toggle_px_aspect=manage(new Gtk::CheckButton(_("_Pixel Aspect"), true));
379         toggle_px_aspect->set_alignment(0, 0.5);
380         toggle_px_width=manage(new Gtk::CheckButton(_("Pi_xel Width"), true));
381         toggle_px_width->set_alignment(0, 0.5);
382         toggle_px_height=manage(new Gtk::CheckButton(_("Pix_el Height"), true));
383         toggle_px_height->set_alignment(0, 0.5);
384         toggle_im_aspect=manage(new Gtk::CheckButton(_("Image _Aspect"), true));
385         toggle_im_aspect->set_alignment(0, 0.5);
386         toggle_im_width=manage(new Gtk::CheckButton(_("Image _Width"), true));
387         toggle_im_width->set_alignment(0, 0.5);
388         toggle_im_height=manage(new Gtk::CheckButton(_("Image _Height"), true));
389         toggle_im_height->set_alignment(0, 0.5);
390         toggle_im_span=manage(new Gtk::CheckButton(_("Image _Span"), true));
391         toggle_im_span->set_alignment(0, 0.5);
392 }
393
394 void
395 Widget_RendDesc::connect_signals()
396 {
397         entry_width->signal_value_changed().connect(sigc::mem_fun(*this,&studio::Widget_RendDesc::on_width_changed));
398         entry_height->signal_value_changed().connect(sigc::mem_fun(*this,&studio::Widget_RendDesc::on_height_changed));
399         entry_xres->signal_value_changed().connect(sigc::mem_fun(*this,&studio::Widget_RendDesc::on_xres_changed));
400         entry_yres->signal_value_changed().connect(sigc::mem_fun(*this,&studio::Widget_RendDesc::on_yres_changed));
401         entry_phy_width->signal_value_changed().connect(sigc::mem_fun(*this,&studio::Widget_RendDesc::on_phy_width_changed));
402         entry_phy_height->signal_value_changed().connect(sigc::mem_fun(*this,&studio::Widget_RendDesc::on_phy_height_changed));
403         entry_span->signal_value_changed().connect(sigc::mem_fun(*this,&studio::Widget_RendDesc::on_span_changed));
404         entry_tl->signal_value_changed().connect(sigc::mem_fun(*this,&studio::Widget_RendDesc::on_tl_changed));
405         entry_br->signal_value_changed().connect(sigc::mem_fun(*this,&studio::Widget_RendDesc::on_br_changed));
406         entry_fps->signal_value_changed().connect(sigc::mem_fun(*this,&studio::Widget_RendDesc::on_fps_changed));
407         entry_start_time->signal_value_changed().connect(sigc::mem_fun(*this,&studio::Widget_RendDesc::on_start_time_changed));
408         entry_end_time->signal_value_changed().connect(sigc::mem_fun(*this,&studio::Widget_RendDesc::on_end_time_changed));
409         //entry_start_frame->signal_value_changed().connect(sigc::mem_fun(*this,&studio::Widget_RendDesc::on_start_frame_changed));
410         //entry_end_frame->signal_value_changed().connect(sigc::mem_fun(*this,&studio::Widget_RendDesc::on_end_frame_changed));
411         toggle_px_aspect->signal_toggled().connect(sigc::mem_fun(*this, &studio::Widget_RendDesc::on_lock_changed));
412         toggle_px_width->signal_toggled().connect(sigc::mem_fun(*this, &studio::Widget_RendDesc::on_lock_changed));
413         toggle_px_height->signal_toggled().connect(sigc::mem_fun(*this, &studio::Widget_RendDesc::on_lock_changed));
414         toggle_im_aspect->signal_toggled().connect(sigc::mem_fun(*this, &studio::Widget_RendDesc::on_lock_changed));
415         toggle_im_width->signal_toggled().connect(sigc::mem_fun(*this, &studio::Widget_RendDesc::on_lock_changed));
416         toggle_im_height->signal_toggled().connect(sigc::mem_fun(*this, &studio::Widget_RendDesc::on_lock_changed));
417         toggle_im_span->signal_toggled().connect(sigc::mem_fun(*this, &studio::Widget_RendDesc::on_lock_changed));
418 }
419
420 Gtk::Widget *
421 Widget_RendDesc::create_image_tab()
422 {
423         Gtk::Alignment *paddedPanel = manage(new Gtk::Alignment(0, 0, 1, 1));
424         paddedPanel->set_padding(12, 12, 12, 12);
425
426         Gtk::VBox *panelBox = manage(new Gtk::VBox(false, 12));
427         paddedPanel->add(*panelBox);
428
429         Gtk::Frame *imageFrame = manage(new Gtk::Frame(_("Image Size")));
430         imageFrame->set_shadow_type(Gtk::SHADOW_NONE);
431         ((Gtk::Label *) imageFrame->get_label_widget())->set_markup(_("<b>Image Size</b>"));
432         panelBox->pack_start(*imageFrame, false, false, 0);
433
434         Gtk::Alignment *tablePadding = manage(new Gtk::Alignment(0, 0, 1, 1));
435         tablePadding->set_padding(6, 0, 24, 0);
436         Gtk::Table *imageSizeTable = manage(new Gtk::Table(2, 6, false));
437         imageSizeTable->set_row_spacings(6);
438         imageSizeTable->set_col_spacings(12);
439         tablePadding->add(*imageSizeTable);
440         imageFrame->add(*tablePadding);
441
442         Gtk::Label *size_width_label = manage(new Gtk::Label(_("_Width"), 0, 0.5, true));
443         size_width_label->set_mnemonic_widget(*entry_width);
444
445         Gtk::Label *size_height_label = manage(new Gtk::Label(_("_Height"), 0, 0.5, true));
446         size_height_label->set_mnemonic_widget(*entry_height);
447
448         Gtk::Label *size_xres_label = manage(new Gtk::Label(_("_XRes"), 0, 0.5, true));
449         size_xres_label->set_mnemonic_widget(*entry_xres);
450
451         Gtk::Label *size_yres_label = manage(new Gtk::Label(_("_YRes"), 0, 0.5, true));
452         size_yres_label->set_mnemonic_widget(*entry_yres);
453
454         Gtk::Label *size_physwidth_label = manage(new Gtk::Label(_("_Physical Width"), 0, 0.5, true));
455         size_physwidth_label->set_mnemonic_widget(*entry_phy_width);
456
457         Gtk::Label *size_physheight_label = manage(new Gtk::Label(_("Phy_sical Height"), 0, 0.5, true));
458         size_physheight_label->set_mnemonic_widget(*entry_phy_height);
459
460         Gtk::Label *size_span = manage(new Gtk::Label(_("I_mage Span"), 0, 0.5, true));
461         size_span->set_mnemonic_widget(*entry_span);
462
463         imageSizeTable->attach(*size_width_label, 0, 1, 0, 1, Gtk::SHRINK|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
464         imageSizeTable->attach(*size_height_label, 0, 1, 1, 2, Gtk::SHRINK|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
465         imageSizeTable->attach(*entry_width, 1, 2, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
466         imageSizeTable->attach(*entry_height, 1, 2, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
467
468         imageSizeTable->attach(*size_xres_label, 2, 3, 0, 1, Gtk::SHRINK | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
469         imageSizeTable->attach(*size_yres_label, 2, 3, 1, 2, Gtk::SHRINK | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
470         imageSizeTable->attach(*entry_xres, 3, 4, 0, 1, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
471         imageSizeTable->attach(*entry_yres, 3, 4, 1, 2, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
472
473         imageSizeTable->attach(*size_physwidth_label, 4, 5, 0, 1, Gtk::SHRINK | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
474         imageSizeTable->attach(*size_physheight_label, 4, 5, 1, 2, Gtk::SHRINK | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
475         imageSizeTable->attach(*entry_phy_width, 5, 6, 0, 1, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
476         imageSizeTable->attach(*entry_phy_height, 5, 6, 1, 2, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
477
478         imageSizeTable->attach(*size_span, 0, 1, 2, 3, Gtk::SHRINK|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
479         imageSizeTable->attach(*entry_span, 1, 2, 2, 3, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
480
481         Gtk::Frame *imageAreaFrame = manage(new Gtk::Frame(_("Image Area")));
482         imageAreaFrame->set_shadow_type(Gtk::SHADOW_NONE);
483         ((Gtk::Label *) imageAreaFrame->get_label_widget())->set_markup(_("<b>Image Area</b>"));
484         panelBox->pack_start(*imageAreaFrame, false, false, 0);
485
486         Gtk::Alignment *imageAreaPadding = manage(new Gtk::Alignment(0, 0, 1, 1));
487         imageAreaPadding->set_padding(6, 0, 24, 0);
488         imageAreaFrame->add(*imageAreaPadding);
489
490         Gtk::Table *imageAreaTable = manage(new Gtk::Table(2, 2, false));
491         imageAreaTable->set_row_spacings(6);
492         imageAreaTable->set_col_spacings(12);
493         imageAreaPadding->add(*imageAreaTable);
494
495         Gtk::Label *imageAreaTopLeftLabel = manage(new Gtk::Label(_("_Top Left"), 0, 0.5, true));
496         imageAreaTopLeftLabel->set_mnemonic_widget(*entry_tl);
497
498         Gtk::Label *imageAreaBottomRightLabel = manage(new Gtk::Label(_("_Bottom Right"), 0, 0.5, true));
499         imageAreaBottomRightLabel->set_mnemonic_widget(*entry_br);
500
501         imageAreaTable->attach(*imageAreaTopLeftLabel, 0, 1, 0, 1, Gtk::SHRINK | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
502         imageAreaTable->attach(*imageAreaBottomRightLabel, 0, 1, 1, 2, Gtk::SHRINK | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
503         imageAreaTable->attach(*entry_tl, 1, 2, 0, 1, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
504         imageAreaTable->attach(*entry_br, 1, 2, 1, 2, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
505
506         paddedPanel->show_all();
507         return paddedPanel;
508 }
509
510 Gtk::Widget *
511 Widget_RendDesc::create_time_tab()
512 {
513         Gtk::Alignment *paddedPanel = manage(new Gtk::Alignment(0, 0, 1, 1));
514         paddedPanel->set_padding(12, 12, 12, 12);
515
516         Gtk::VBox *panelBox = manage(new Gtk::VBox(false, 12)); // for future widgets
517         paddedPanel->add(*panelBox);
518
519         time_frame = manage(new Gtk::Frame(_("Time Settings")));
520         time_frame->set_shadow_type(Gtk::SHADOW_NONE);
521         ((Gtk::Label *) time_frame->get_label_widget())->set_markup(_("<b>Time Settings</b>"));
522         panelBox->pack_start(*time_frame, false, false, 0);
523
524         Gtk::Alignment *timeFramePadding = manage(new Gtk::Alignment(0, 0, 1, 1));
525         timeFramePadding->set_padding(6, 0, 24, 0);
526         time_frame->add(*timeFramePadding);
527
528         Gtk::Table *timeFrameTable = manage(new Gtk::Table(3, 2, false));
529         timeFrameTable->set_row_spacings(6);
530         timeFrameTable->set_col_spacings(12);
531         timeFramePadding->add(*timeFrameTable);
532
533         Gtk::Label *timeFPSLabel = manage(new Gtk::Label(_("_Frames per second"), 0, 0.5, true));
534         timeFPSLabel->set_mnemonic_widget(*entry_fps);
535         timeFrameTable->attach(*timeFPSLabel, 0, 1, 0, 1, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
536         timeFrameTable->attach(*entry_fps, 1, 2, 0, 1, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
537
538         Gtk::Label *timeStartLabel = manage(new Gtk::Label(_("_Start Time"), 0, 0.5, true));
539         timeStartLabel->set_mnemonic_widget(*entry_start_time);
540         timeFrameTable->attach(*timeStartLabel, 0, 1, 1, 2, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
541         timeFrameTable->attach(*entry_start_time, 1, 2, 1, 2, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
542
543         Gtk::Label *timeEndLabel = manage(new Gtk::Label(_("_End Time"), 0, 0.5, true));
544         timeEndLabel->set_mnemonic_widget(*entry_end_time);
545         timeFrameTable->attach(*timeEndLabel, 0, 1, 2, 3, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
546         timeFrameTable->attach(*entry_end_time, 1, 2, 2, 3, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
547
548         paddedPanel->show_all();
549         return paddedPanel;
550 }
551
552 Gtk::Widget *
553 Widget_RendDesc::create_other_tab()
554 {
555         Gtk::Alignment *paddedPanel = manage(new Gtk::Alignment(0, 0, 1, 1));
556         paddedPanel->set_padding(12, 12, 12, 12);
557
558         Gtk::VBox *panelBox = manage(new Gtk::VBox(false, 12));
559         paddedPanel->add(*panelBox);
560
561         Gtk::Frame *lockFrame = manage(new Gtk::Frame(_("Locks and Links")));
562         lockFrame->set_shadow_type(Gtk::SHADOW_NONE);
563         ((Gtk::Label *) lockFrame->get_label_widget())->set_markup(_("<b>Locks and Links</b>"));
564         panelBox->pack_start(*lockFrame, false, false, 0);
565
566         Gtk::Alignment *lockPadding = manage(new Gtk::Alignment(0, 0, 1, 1));
567         lockPadding->set_padding(6, 0, 24, 0);
568         lockFrame->add(*lockPadding);
569
570         Gtk::Table *lockTable = manage(new Gtk::Table(2, 4, false));
571         lockTable->set_row_spacings(6);
572         lockTable->set_col_spacings(12);
573         lockPadding->add(*lockTable);
574
575         lockTable->attach(*toggle_im_width, 0, 1, 0, 1, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
576         lockTable->attach(*toggle_im_height, 1, 2, 0, 1, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
577         lockTable->attach(*toggle_im_aspect, 2, 3, 0, 1, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
578         lockTable->attach(*toggle_im_span, 3, 4, 0, 1, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
579
580         lockTable->attach(*toggle_px_width, 0, 1, 1, 2, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
581         lockTable->attach(*toggle_px_height, 1, 2, 1, 2, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
582         lockTable->attach(*toggle_px_aspect, 2, 3, 1, 2, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
583
584         paddedPanel->show_all();
585         return paddedPanel;
586 }
587
588 /*
589  * vim:ts=4:sw=4
590  */