Allow scrolling left and right in time widgets
[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         entry_focus->set_value(rend_desc_.get_focus());
138
139         toggle_px_aspect->set_active((bool)(rend_desc_.get_flags()&RendDesc::PX_ASPECT));
140         toggle_px_width->set_active((bool)(rend_desc_.get_flags()&RendDesc::PX_W));
141         toggle_px_height->set_active((bool)(rend_desc_.get_flags()&RendDesc::PX_H));
142
143         toggle_im_aspect->set_active((bool)(rend_desc_.get_flags()&RendDesc::IM_ASPECT));
144         toggle_im_width->set_active((bool)(rend_desc_.get_flags()&RendDesc::IM_W));
145         toggle_im_height->set_active((bool)(rend_desc_.get_flags()&RendDesc::IM_H));
146         toggle_im_span->set_active((bool)(rend_desc_.get_flags()&RendDesc::IM_SPAN));
147 }
148
149 void Widget_RendDesc::apply_rend_desc(const synfig::RendDesc &rend_desc)
150 {
151         set_rend_desc(rend_desc);
152 }
153
154 const synfig::RendDesc &
155 Widget_RendDesc::get_rend_desc()
156 {
157         return rend_desc_;
158 }
159
160 void
161 Widget_RendDesc::on_width_changed()
162 {
163         if(update_lock)return;
164         UpdateLock lock(update_lock);
165         rend_desc_.set_w(round_to_int(adjustment_width.get_value()));
166         refresh();
167         signal_changed()();
168 }
169
170 void
171 Widget_RendDesc::on_lock_changed()
172 {
173         if(update_lock)return;
174         UpdateLock lock(update_lock);
175
176 #define DO_TOGGLE(x,y)  if(toggle_ ## x->get_active()) \
177                 rend_desc_.set_flags(rend_desc_.get_flags()|RendDesc:: y); \
178         else \
179                 rend_desc_.set_flags(rend_desc_.get_flags()&~RendDesc:: y)
180
181         DO_TOGGLE(px_aspect,PX_ASPECT);
182         DO_TOGGLE(px_width,PX_W);
183         DO_TOGGLE(px_height,PX_H);
184
185         DO_TOGGLE(im_aspect,IM_ASPECT);
186         DO_TOGGLE(im_width,IM_W);
187         DO_TOGGLE(im_height,IM_H);
188         DO_TOGGLE(im_span,IM_SPAN);
189
190 #undef DO_TOGGLE
191
192         refresh();
193         signal_changed()();
194 }
195
196 void
197 Widget_RendDesc::on_height_changed()
198 {
199         if(update_lock)return;
200         UpdateLock lock(update_lock);
201         rend_desc_.set_h(round_to_int(adjustment_height.get_value()));
202         refresh();
203         signal_changed()();
204 }
205
206 void
207 Widget_RendDesc::on_phy_width_changed()
208 {
209         if(update_lock)return;
210         UpdateLock lock(update_lock);
211         rend_desc_.set_physical_w(INCHES2METERS(adjustment_phy_width.get_value()));
212         refresh();
213         signal_changed()();
214 }
215
216 void
217 Widget_RendDesc::on_phy_height_changed()
218 {
219         if(update_lock)return;
220         UpdateLock lock(update_lock);
221         rend_desc_.set_physical_h(INCHES2METERS(adjustment_phy_height.get_value()));
222         refresh();
223         signal_changed()();
224 }
225
226 void
227 Widget_RendDesc::on_xres_changed()
228 {
229         if(update_lock)return;
230         UpdateLock lock(update_lock);
231         rend_desc_.set_x_res(DPI2DPM(adjustment_xres.get_value()));
232         refresh();
233         signal_changed()();
234 }
235
236 void
237 Widget_RendDesc::on_yres_changed()
238 {
239         if(update_lock)return;
240         UpdateLock lock(update_lock);
241         rend_desc_.set_y_res(DPI2DPM(adjustment_yres.get_value()));
242         refresh();
243         signal_changed()();
244 }
245
246 void
247 Widget_RendDesc::on_start_time_changed()
248 {
249         if(update_lock)return;
250         UpdateLock lock(update_lock);
251         rend_desc_.set_time_start(entry_start_time->get_value());
252         refresh();
253         signal_changed()();
254 }
255
256 void
257 Widget_RendDesc::on_end_time_changed()
258 {
259         if(update_lock)return;
260         UpdateLock lock(update_lock);
261         rend_desc_.set_time_end(entry_end_time->get_value());
262         refresh();
263         signal_changed()();
264 }
265
266 /*
267 void
268 Widget_RendDesc::on_start_frame_changed()
269 {
270         if(update_lock)return;
271         UpdateLock lock(update_lock);
272         rend_desc_.set_frame_start((int)(adjustment_start_frame.get_value()+0.5));
273         refresh();
274         signal_changed()();
275 }
276
277 void
278 Widget_RendDesc::on_end_frame_changed()
279 {
280         if(update_lock)return;
281         UpdateLock lock(update_lock);
282         rend_desc_.set_frame_end((int)(adjustment_end_frame.get_value()+0.5));
283         refresh();
284         signal_changed()();
285 }
286 */
287
288 void
289 Widget_RendDesc::on_fps_changed()
290 {
291         if(update_lock)return;
292         UpdateLock lock(update_lock);
293         rend_desc_.set_frame_rate((int)(adjustment_fps.get_value()+0.5));
294         refresh();
295         signal_changed()();
296 }
297
298 void
299 Widget_RendDesc::on_tl_changed()
300 {
301         if(update_lock)return;
302         UpdateLock lock(update_lock);
303         rend_desc_.set_tl(entry_tl->get_value());
304         refresh();
305         signal_changed()();
306 }
307
308 void
309 Widget_RendDesc::on_br_changed()
310 {
311         if(update_lock)return;
312         UpdateLock lock(update_lock);
313         rend_desc_.set_br(entry_br->get_value());
314         refresh();
315         signal_changed()();
316 }
317
318 void
319 Widget_RendDesc::on_focus_changed()
320 {
321         if(update_lock)return;
322         UpdateLock lock(update_lock);
323         rend_desc_.set_focus(entry_focus->get_value());
324         refresh();
325         signal_changed()();
326 }
327
328 void
329 Widget_RendDesc::on_span_changed()
330 {
331         if(update_lock)return;
332         UpdateLock lock(update_lock);
333         rend_desc_.set_span(adjustment_span.get_value());
334         refresh();
335         signal_changed()();
336 }
337
338 void
339 Widget_RendDesc::disable_time_section()
340 {
341         time_frame->set_sensitive(false);
342
343 /*
344         Gtk::Table::TableList &list=time_table->children();
345         Gtk::Table::TableList::iterator iter;
346         for(iter=list.begin();iter!=list.end();iter++)
347                 iter->get_widget()->set_sensitive(false);
348 */
349 }
350
351 void
352 Widget_RendDesc::enable_time_section()
353 {
354         time_frame->set_sensitive(true);
355
356 /*
357         Gtk::Table::TableList &list=time_table->children();
358         Gtk::Table::TableList::iterator iter;
359         for(iter=list.begin();iter!=list.end();iter++)
360                 iter->get_widget()->set_sensitive(true);
361
362 */
363 }
364
365 void
366 Widget_RendDesc::create_widgets()
367 {
368         entry_width=manage(new Gtk::SpinButton(adjustment_width,1,0));
369         entry_width->set_alignment(1);
370         entry_height=manage(new Gtk::SpinButton(adjustment_height,1,0));
371         entry_height->set_alignment(1);
372         entry_xres=manage(new Gtk::SpinButton(adjustment_xres,0.5,1));
373         entry_xres->set_alignment(1);
374         entry_yres=manage(new Gtk::SpinButton(adjustment_yres,0.5,1));
375         entry_yres->set_alignment(1);
376         entry_phy_width=manage(new Gtk::SpinButton(adjustment_phy_width,0.25,2));
377         entry_phy_width->set_alignment(1);
378         entry_phy_height=manage(new Gtk::SpinButton(adjustment_phy_height,0.25,2));
379         entry_phy_height->set_alignment(1);
380         entry_span=manage(new Gtk::SpinButton(adjustment_span,0.1,4));
381         entry_span->set_alignment(1);
382         entry_tl=manage(new Widget_Vector());
383         entry_br=manage(new Widget_Vector());
384         entry_fps=manage(new Gtk::SpinButton(adjustment_fps,1,5));
385         entry_start_time=manage(new Widget_Time());
386         entry_end_time=manage(new Widget_Time());
387         //entry_start_frame=manage(new Gtk::SpinButton(adjustment_start_frame,1,0));
388         //entry_end_frame=manage(new Gtk::SpinButton(adjustment_end_frame,1,0));
389         entry_focus=manage(new Widget_Vector());
390         toggle_px_aspect=manage(new Gtk::CheckButton(_("_Pixel Aspect"), true));
391         toggle_px_aspect->set_alignment(0, 0.5);
392         toggle_px_width=manage(new Gtk::CheckButton(_("Pi_xel Width"), true));
393         toggle_px_width->set_alignment(0, 0.5);
394         toggle_px_height=manage(new Gtk::CheckButton(_("Pix_el Height"), true));
395         toggle_px_height->set_alignment(0, 0.5);
396         toggle_im_aspect=manage(new Gtk::CheckButton(_("Image _Aspect"), true));
397         toggle_im_aspect->set_alignment(0, 0.5);
398         toggle_im_width=manage(new Gtk::CheckButton(_("Image _Width"), true));
399         toggle_im_width->set_alignment(0, 0.5);
400         toggle_im_height=manage(new Gtk::CheckButton(_("Image _Height"), true));
401         toggle_im_height->set_alignment(0, 0.5);
402         toggle_im_span=manage(new Gtk::CheckButton(_("Image _Span"), true));
403         toggle_im_span->set_alignment(0, 0.5);
404 }
405
406 void
407 Widget_RendDesc::connect_signals()
408 {
409         entry_width->signal_value_changed().connect(sigc::mem_fun(*this,&studio::Widget_RendDesc::on_width_changed));
410         entry_height->signal_value_changed().connect(sigc::mem_fun(*this,&studio::Widget_RendDesc::on_height_changed));
411         entry_xres->signal_value_changed().connect(sigc::mem_fun(*this,&studio::Widget_RendDesc::on_xres_changed));
412         entry_yres->signal_value_changed().connect(sigc::mem_fun(*this,&studio::Widget_RendDesc::on_yres_changed));
413         entry_phy_width->signal_value_changed().connect(sigc::mem_fun(*this,&studio::Widget_RendDesc::on_phy_width_changed));
414         entry_phy_height->signal_value_changed().connect(sigc::mem_fun(*this,&studio::Widget_RendDesc::on_phy_height_changed));
415         entry_span->signal_value_changed().connect(sigc::mem_fun(*this,&studio::Widget_RendDesc::on_span_changed));
416         entry_tl->signal_value_changed().connect(sigc::mem_fun(*this,&studio::Widget_RendDesc::on_tl_changed));
417         entry_br->signal_value_changed().connect(sigc::mem_fun(*this,&studio::Widget_RendDesc::on_br_changed));
418         entry_fps->signal_value_changed().connect(sigc::mem_fun(*this,&studio::Widget_RendDesc::on_fps_changed));
419         entry_start_time->signal_value_changed().connect(sigc::mem_fun(*this,&studio::Widget_RendDesc::on_start_time_changed));
420         entry_end_time->signal_value_changed().connect(sigc::mem_fun(*this,&studio::Widget_RendDesc::on_end_time_changed));
421         //entry_start_frame->signal_value_changed().connect(sigc::mem_fun(*this,&studio::Widget_RendDesc::on_start_frame_changed));
422         //entry_end_frame->signal_value_changed().connect(sigc::mem_fun(*this,&studio::Widget_RendDesc::on_end_frame_changed));
423         entry_focus->signal_value_changed().connect(sigc::mem_fun(*this,&studio::Widget_RendDesc::on_focus_changed));
424         toggle_px_aspect->signal_toggled().connect(sigc::mem_fun(*this, &studio::Widget_RendDesc::on_lock_changed));
425         toggle_px_width->signal_toggled().connect(sigc::mem_fun(*this, &studio::Widget_RendDesc::on_lock_changed));
426         toggle_px_height->signal_toggled().connect(sigc::mem_fun(*this, &studio::Widget_RendDesc::on_lock_changed));
427         toggle_im_aspect->signal_toggled().connect(sigc::mem_fun(*this, &studio::Widget_RendDesc::on_lock_changed));
428         toggle_im_width->signal_toggled().connect(sigc::mem_fun(*this, &studio::Widget_RendDesc::on_lock_changed));
429         toggle_im_height->signal_toggled().connect(sigc::mem_fun(*this, &studio::Widget_RendDesc::on_lock_changed));
430         toggle_im_span->signal_toggled().connect(sigc::mem_fun(*this, &studio::Widget_RendDesc::on_lock_changed));
431 }
432
433 Gtk::Widget *
434 Widget_RendDesc::create_image_tab()
435 {
436         Gtk::Alignment *paddedPanel = manage(new Gtk::Alignment(0, 0, 1, 1));
437         paddedPanel->set_padding(12, 12, 12, 12);
438
439         Gtk::VBox *panelBox = manage(new Gtk::VBox(false, 12));
440         paddedPanel->add(*panelBox);
441
442         Gtk::Frame *imageFrame = manage(new Gtk::Frame(_("Image Size")));
443         imageFrame->set_shadow_type(Gtk::SHADOW_NONE);
444         ((Gtk::Label *) imageFrame->get_label_widget())->set_markup(_("<b>Image Size</b>"));
445         panelBox->pack_start(*imageFrame, false, false, 0);
446
447         Gtk::Alignment *tablePadding = manage(new Gtk::Alignment(0, 0, 1, 1));
448         tablePadding->set_padding(6, 0, 24, 0);
449         Gtk::Table *imageSizeTable = manage(new Gtk::Table(2, 6, false));
450         imageSizeTable->set_row_spacings(6);
451         imageSizeTable->set_col_spacings(12);
452         tablePadding->add(*imageSizeTable);
453         imageFrame->add(*tablePadding);
454
455         Gtk::Label *size_width_label = manage(new Gtk::Label(_("_Width"), 0, 0.5, true));
456         size_width_label->set_mnemonic_widget(*entry_width);
457
458         Gtk::Label *size_height_label = manage(new Gtk::Label(_("_Height"), 0, 0.5, true));
459         size_height_label->set_mnemonic_widget(*entry_height);
460
461         Gtk::Label *size_xres_label = manage(new Gtk::Label(_("_XRes"), 0, 0.5, true));
462         size_xres_label->set_mnemonic_widget(*entry_xres);
463
464         Gtk::Label *size_yres_label = manage(new Gtk::Label(_("_YRes"), 0, 0.5, true));
465         size_yres_label->set_mnemonic_widget(*entry_yres);
466
467         Gtk::Label *size_physwidth_label = manage(new Gtk::Label(_("_Physical Width"), 0, 0.5, true));
468         size_physwidth_label->set_mnemonic_widget(*entry_phy_width);
469
470         Gtk::Label *size_physheight_label = manage(new Gtk::Label(_("Phy_sical Height"), 0, 0.5, true));
471         size_physheight_label->set_mnemonic_widget(*entry_phy_height);
472
473         Gtk::Label *size_span = manage(new Gtk::Label(_("I_mage Span"), 0, 0.5, true));
474         size_span->set_mnemonic_widget(*entry_span);
475
476         imageSizeTable->attach(*size_width_label, 0, 1, 0, 1, Gtk::SHRINK|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
477         imageSizeTable->attach(*size_height_label, 0, 1, 1, 2, Gtk::SHRINK|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
478         imageSizeTable->attach(*entry_width, 1, 2, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
479         imageSizeTable->attach(*entry_height, 1, 2, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
480
481         imageSizeTable->attach(*size_xres_label, 2, 3, 0, 1, Gtk::SHRINK | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
482         imageSizeTable->attach(*size_yres_label, 2, 3, 1, 2, Gtk::SHRINK | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
483         imageSizeTable->attach(*entry_xres, 3, 4, 0, 1, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
484         imageSizeTable->attach(*entry_yres, 3, 4, 1, 2, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
485
486         imageSizeTable->attach(*size_physwidth_label, 4, 5, 0, 1, Gtk::SHRINK | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
487         imageSizeTable->attach(*size_physheight_label, 4, 5, 1, 2, Gtk::SHRINK | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
488         imageSizeTable->attach(*entry_phy_width, 5, 6, 0, 1, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
489         imageSizeTable->attach(*entry_phy_height, 5, 6, 1, 2, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
490
491         imageSizeTable->attach(*size_span, 0, 1, 2, 3, Gtk::SHRINK|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
492         imageSizeTable->attach(*entry_span, 1, 2, 2, 3, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
493
494         Gtk::Frame *imageAreaFrame = manage(new Gtk::Frame(_("Image Area")));
495         imageAreaFrame->set_shadow_type(Gtk::SHADOW_NONE);
496         ((Gtk::Label *) imageAreaFrame->get_label_widget())->set_markup(_("<b>Image Area</b>"));
497         panelBox->pack_start(*imageAreaFrame, false, false, 0);
498
499         Gtk::Alignment *imageAreaPadding = manage(new Gtk::Alignment(0, 0, 1, 1));
500         imageAreaPadding->set_padding(6, 0, 24, 0);
501         imageAreaFrame->add(*imageAreaPadding);
502
503         Gtk::Table *imageAreaTable = manage(new Gtk::Table(2, 2, false));
504         imageAreaTable->set_row_spacings(6);
505         imageAreaTable->set_col_spacings(12);
506         imageAreaPadding->add(*imageAreaTable);
507
508         Gtk::Label *imageAreaTopLeftLabel = manage(new Gtk::Label(_("_Top Left"), 0, 0.5, true));
509         imageAreaTopLeftLabel->set_mnemonic_widget(*entry_tl);
510
511         Gtk::Label *imageAreaBottomRightLabel = manage(new Gtk::Label(_("_Bottom Right"), 0, 0.5, true));
512         imageAreaBottomRightLabel->set_mnemonic_widget(*entry_br);
513
514         imageAreaTable->attach(*imageAreaTopLeftLabel, 0, 1, 0, 1, Gtk::SHRINK | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
515         imageAreaTable->attach(*imageAreaBottomRightLabel, 0, 1, 1, 2, Gtk::SHRINK | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
516         imageAreaTable->attach(*entry_tl, 1, 2, 0, 1, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
517         imageAreaTable->attach(*entry_br, 1, 2, 1, 2, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
518
519         paddedPanel->show_all();
520         return paddedPanel;
521 }
522
523 Gtk::Widget *
524 Widget_RendDesc::create_time_tab()
525 {
526         Gtk::Alignment *paddedPanel = manage(new Gtk::Alignment(0, 0, 1, 1));
527         paddedPanel->set_padding(12, 12, 12, 12);
528
529         Gtk::VBox *panelBox = manage(new Gtk::VBox(false, 12)); // for future widgets
530         paddedPanel->add(*panelBox);
531
532         time_frame = manage(new Gtk::Frame(_("Time Settings")));
533         time_frame->set_shadow_type(Gtk::SHADOW_NONE);
534         ((Gtk::Label *) time_frame->get_label_widget())->set_markup(_("<b>Time Settings</b>"));
535         panelBox->pack_start(*time_frame, false, false, 0);
536
537         Gtk::Alignment *timeFramePadding = manage(new Gtk::Alignment(0, 0, 1, 1));
538         timeFramePadding->set_padding(6, 0, 24, 0);
539         time_frame->add(*timeFramePadding);
540
541         Gtk::Table *timeFrameTable = manage(new Gtk::Table(3, 2, false));
542         timeFrameTable->set_row_spacings(6);
543         timeFrameTable->set_col_spacings(12);
544         timeFramePadding->add(*timeFrameTable);
545
546         Gtk::Label *timeFPSLabel = manage(new Gtk::Label(_("_Frames per second"), 0, 0.5, true));
547         timeFPSLabel->set_mnemonic_widget(*entry_fps);
548         timeFrameTable->attach(*timeFPSLabel, 0, 1, 0, 1, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
549         timeFrameTable->attach(*entry_fps, 1, 2, 0, 1, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
550
551         Gtk::Label *timeStartLabel = manage(new Gtk::Label(_("_Start Time"), 0, 0.5, true));
552         timeStartLabel->set_mnemonic_widget(*entry_start_time);
553         timeFrameTable->attach(*timeStartLabel, 0, 1, 1, 2, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
554         timeFrameTable->attach(*entry_start_time, 1, 2, 1, 2, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
555
556         Gtk::Label *timeEndLabel = manage(new Gtk::Label(_("_End Time"), 0, 0.5, true));
557         timeEndLabel->set_mnemonic_widget(*entry_end_time);
558         timeFrameTable->attach(*timeEndLabel, 0, 1, 2, 3, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
559         timeFrameTable->attach(*entry_end_time, 1, 2, 2, 3, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
560
561         paddedPanel->show_all();
562         return paddedPanel;
563 }
564
565 Gtk::Widget *
566 Widget_RendDesc::create_other_tab()
567 {
568         Gtk::Alignment *paddedPanel = manage(new Gtk::Alignment(0, 0, 1, 1));
569         paddedPanel->set_padding(12, 12, 12, 12);
570
571         Gtk::VBox *panelBox = manage(new Gtk::VBox(false, 12));
572         paddedPanel->add(*panelBox);
573
574         Gtk::Frame *lockFrame = manage(new Gtk::Frame(_("Locks and Links")));
575         lockFrame->set_shadow_type(Gtk::SHADOW_NONE);
576         ((Gtk::Label *) lockFrame->get_label_widget())->set_markup(_("<b>Locks and Links</b>"));
577         panelBox->pack_start(*lockFrame, false, false, 0);
578
579         Gtk::Alignment *lockPadding = manage(new Gtk::Alignment(0, 0, 1, 1));
580         lockPadding->set_padding(6, 0, 24, 0);
581         lockFrame->add(*lockPadding);
582
583         Gtk::Table *lockTable = manage(new Gtk::Table(2, 4, false));
584         lockTable->set_row_spacings(6);
585         lockTable->set_col_spacings(12);
586         lockPadding->add(*lockTable);
587
588         lockTable->attach(*toggle_im_width, 0, 1, 0, 1, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
589         lockTable->attach(*toggle_im_height, 1, 2, 0, 1, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
590         lockTable->attach(*toggle_im_aspect, 2, 3, 0, 1, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
591         lockTable->attach(*toggle_im_span, 3, 4, 0, 1, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
592
593         lockTable->attach(*toggle_px_width, 0, 1, 1, 2, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
594         lockTable->attach(*toggle_px_height, 1, 2, 1, 2, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
595         lockTable->attach(*toggle_px_aspect, 2, 3, 1, 2, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, 0, 0);
596
597         Gtk::Frame *focusFrame = manage(new Gtk::Frame(_("Focus Point")));
598         focusFrame->set_shadow_type(Gtk::SHADOW_NONE);
599         ((Gtk::Label *) focusFrame->get_label_widget())->set_markup(_("<b>Focus Point</b>"));
600         panelBox->pack_start(*focusFrame, false, false, 0);
601
602         Gtk::Alignment *focusPadding = manage(new Gtk::Alignment(0, 0, 1, 1));
603         focusPadding->set_padding(6, 0, 24, 0);
604         focusFrame->add(*focusPadding);
605
606         Gtk::HBox *focusBox = manage(new Gtk::HBox(false, 12));
607         focusPadding->add(*focusBox);
608
609         Gtk::Label *focusLabel = manage(new Gtk::Label(_("_Focus Point"), 0, 0.5, true));
610         focusLabel->set_mnemonic_widget(*entry_focus);
611         focusBox->pack_start(*focusLabel, false, false, 0);
612         focusBox->pack_start(*entry_focus, true, true, 0);
613
614         paddedPanel->show_all();
615         return paddedPanel;
616 }
617
618 /*
619  * vim:ts=4:sw=4
620  */