#include <gtkmm/messagedialog.h>
#include <gtkmm/treemodelsort.h>
#include <gtkmm/buttonbox.h>
+#include <gtkmm/separator.h>
#include <gtk/gtktreestore.h>
#include <gtk/gtkversion.h>
#include "preview.h"
#include "audiocontainer.h"
#include "widget_timeslider.h"
-#include "framedial.h"
#include "keyframedial.h"
#include <synfigapp/main.h>
//keyframe_tree_store_ (KeyframeTreeStore::create(canvas_interface_)),
time_adjustment_ (0,0,25,0,0,0),
time_window_adjustment_ (0,0,25,0,0,0),
+ quality_adjustment_ (8,1,10,1,1,0),
statusbar (manage(new class Gtk::Statusbar())),
timeslider (new Widget_Timeslider),
layer_tree=0;
children_tree=0;
duck_refresh_flag=true;
+ toggling_ducks_=false;
+ changing_resolution_=false;
+ updating_quality_=false;
+ toggling_show_grid=false;
smach_.set_default_state(&state_normal);
//create all allocated stuff for this canvas
audio = new AudioContainer();
- Gtk::Table *layout_table= manage(new class Gtk::Table(1, 3, false));
+ Gtk::Table *layout_table= manage(new class Gtk::Table(1, 4, false));
//layout_table->attach(*vpaned, 0, 1, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
layout_table->attach(*create_work_area(), 0, 1, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
+ layout_table->attach(*create_display_bar(), 0, 1, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0);
init_menus();
//layout_table->attach(*App::ui_manager()->get_widget("/menu-main"), 0, 1, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0);
//Gtk::HScrollbar *time_scroll = manage(new class Gtk::HScrollbar(time_adjustment()));
//TIME BAR TEMPORARY POSITION
//Widget_Timeslider *time_scroll = manage(new Widget_Timeslider);
- timeslider->show();
timeslider->set_time_adjustment(&time_adjustment());
timeslider->set_bounds_adjustment(&time_window_adjustment());
//layout_table->attach(*timeslider, 0, 1, 2, 3, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL);
tooltips.set_tip(*timeslider,_("Changes the current time"));
time_window_scroll->show();
timeslider->show();
- time_window_scroll->set_flags(Gtk::CAN_FOCUS);
+ //time_window_scroll->set_flags(Gtk::CAN_FOCUS); // Uncomment this produce bad render of the HScroll
timeslider->set_flags(Gtk::CAN_FOCUS);
//time_scroll->signal_value_changed().connect(sigc::mem_fun(*work_area, &studio::WorkArea::render_preview_hook));
current_time_widget->show();
//Setup the FrameDial widget
- FrameDial *framedial = manage(new class FrameDial());
+ framedial = manage(new class FrameDial());
framedial->signal_seek_begin().connect(
sigc::bind(sigc::mem_fun(*canvas_interface().get(), &synfigapp::CanvasInterface::seek_time), Time::begin())
);
framedial->signal_seek_prev_frame().connect(
sigc::bind(sigc::mem_fun(*canvas_interface().get(), &synfigapp::CanvasInterface::seek_frame), -1)
);
+ framedial->signal_play_stop().connect(
+ sigc::mem_fun(*this, &studio::CanvasView::on_play_stop_pressed)
+ );
framedial->signal_seek_next_frame().connect(
sigc::bind(sigc::mem_fun(*canvas_interface().get(), &synfigapp::CanvasInterface::seek_frame), 1)
);
keyframedial->show();
keyframebutton=keyframedial->get_lock_button();
- Gtk::Table *table = manage(new class Gtk::Table(5, 3, false));
- timebar = table;
+ timebar = manage(new class Gtk::Table(5, 4, false));
- //Attach widgets to the time bar table
- table->attach(*manage(disp_audio), 1, 5, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK);
- table->attach(*framedial, 0, 1, 2, 3,Gtk::SHRINK, Gtk::SHRINK);
- table->attach(*current_time_widget, 0, 1, 1, 2, Gtk::SHRINK|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0);
- table->attach(*timeslider, 1, 3, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK);
- table->attach(*time_window_scroll, 1, 3, 2, 3, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK);
- table->attach(*keyframedial, 3, 4, 1, 2, Gtk::SHRINK, Gtk::SHRINK);
- table->attach(*animatebutton, 4, 5, 1, 2, Gtk::SHRINK, Gtk::SHRINK);
- //table->attach(*keyframebutton, 1, 2, 3, 4, Gtk::SHRINK, Gtk::SHRINK);
+ //Attach widgets to the timebar
+ timebar->attach(*manage(disp_audio), 1, 5, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK);
+ timebar->attach(*framedial, 0, 1, 2, 3,Gtk::SHRINK, Gtk::SHRINK);
+ timebar->attach(*current_time_widget, 0, 1, 1, 2, Gtk::SHRINK|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0);
+ timebar->attach(*timeslider, 1, 3, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK);
+ timebar->attach(*time_window_scroll, 1, 3, 2, 3, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK);
+ timebar->attach(*keyframedial, 3, 4, 1, 2, Gtk::SHRINK, Gtk::SHRINK);
+ timebar->attach(*animatebutton, 4, 5, 1, 2, Gtk::SHRINK, Gtk::SHRINK);
+ //timebar->attach(*keyframebutton, 1, 2, 3, 4, Gtk::SHRINK, Gtk::SHRINK);
+ timebar->show();
- table->show();
-
- return table;
+ return timebar;
}
Gtk::Widget *
return statusbartable;
}
+Gtk::Widget*
+CanvasView::create_display_bar()
+{
+ displaybar = manage(new class Gtk::Table(1, 6, false));
+
+ // Setup the ToggleDuckDial widget
+ toggleducksdial = Gtk::manage(new class ToggleDucksDial());
+
+ Duck::Type m = work_area->get_type_mask();
+ toggleducksdial->update_toggles(m);
+
+ toggleducksdial->signal_ducks_position().connect(
+ sigc::bind(sigc::mem_fun(*this, &studio::CanvasView::toggle_duck_mask),Duck::TYPE_POSITION)
+ );
+ toggleducksdial->signal_ducks_vertex().connect(
+ sigc::bind(sigc::mem_fun(*this, &studio::CanvasView::toggle_duck_mask),Duck::TYPE_VERTEX)
+ );
+ toggleducksdial->signal_ducks_tangent().connect(
+ sigc::bind(sigc::mem_fun(*this, &studio::CanvasView::toggle_duck_mask),Duck::TYPE_TANGENT)
+ );
+ toggleducksdial->signal_ducks_radius().connect(
+ sigc::bind(sigc::mem_fun(*this, &studio::CanvasView::toggle_duck_mask),Duck::TYPE_RADIUS)
+ );
+ toggleducksdial->signal_ducks_width().connect(
+ sigc::bind(sigc::mem_fun(*this, &studio::CanvasView::toggle_duck_mask),Duck::TYPE_WIDTH)
+ );
+ toggleducksdial->signal_ducks_angle().connect(
+ sigc::bind(sigc::mem_fun(*this, &studio::CanvasView::toggle_duck_mask),Duck::TYPE_ANGLE)
+ );
+ toggleducksdial->show();
+
+ // Set up the ResolutionDial widget
+ resolutiondial=Gtk::manage(new class ResolutionDial());
+
+ resolutiondial->update_lowres(work_area->get_low_resolution_flag());
+ resolutiondial->signal_increase_resolution().connect(
+ sigc::mem_fun(*this, &studio::CanvasView::decrease_low_res_pixel_size));
+ resolutiondial->signal_decrease_resolution().connect(
+ sigc::mem_fun(*this, &studio::CanvasView::increase_low_res_pixel_size));
+ resolutiondial->signal_use_low_resolution().connect(
+ sigc::mem_fun(*this, &studio::CanvasView::toggle_low_res_pixel_flag));
+ resolutiondial->show();
+
+ // Set up a separator
+ Gtk::VSeparator *separator1 = Gtk::manage(new class Gtk::VSeparator());
+ separator1->show();
+ Gtk::VSeparator *separator2 = Gtk::manage(new class Gtk::VSeparator());
+ separator2->show();
+
+ // Set up quality spin button
+ quality_spin=Gtk::manage(new class Gtk::SpinButton(quality_adjustment_));
+ quality_spin->signal_value_changed().connect(
+ sigc::mem_fun(*this, &studio::CanvasView::update_quality));
+ tooltips.set_tip(*quality_spin, _("Quality (lower is better)"));
+ quality_spin->show();
+
+ // Set up the show grid check button
+ show_grid = Gtk::manage(new class Gtk::CheckButton());
+ show_grid->set_active(work_area->grid_status());
+ Gtk::Image *icon = manage(new Gtk::Image(Gtk::Stock::REMOVE, Gtk::IconSize::from_name("synfig-small_icon")));
+ icon->set_padding(0, 0);
+ icon->show();
+ show_grid->add(*icon);
+ show_grid->signal_toggled().connect(
+ sigc::mem_fun(*this, &studio::CanvasView::toggle_show_grid));
+ tooltips.set_tip(*show_grid, _("Show grid when enabled"));
+ show_grid->show();
+
+ displaybar->attach(*toggleducksdial, 0, 1, 0, 1, Gtk::SHRINK, Gtk::SHRINK);
+ displaybar->attach(*separator1, 1, 2, 0, 1, Gtk::FILL, Gtk::FILL);
+ displaybar->attach(*resolutiondial, 2, 3, 0, 1, Gtk::SHRINK, Gtk::SHRINK);
+ displaybar->attach(*separator2, 3, 4, 0, 1, Gtk::FILL, Gtk::FILL);
+ displaybar->attach(*quality_spin, 4, 5, 0, 1, Gtk::SHRINK, Gtk::SHRINK);
+ displaybar->attach(*show_grid, 5, 6, 0, 1, Gtk::SHRINK, Gtk::SHRINK);
+
+ displaybar->show();
+
+ return displaybar;
+
+}
+
void
CanvasView::on_current_time_widget_changed()
{
}
action_group->add( action,
sigc::bind(
- sigc::mem_fun(*work_area, &studio::WorkArea::set_quality),
+ sigc::mem_fun(*this, &studio::CanvasView::set_quality),
i
)
);
grid_show_toggle = Gtk::ToggleAction::create("toggle-grid-show", _("Show Grid"));
grid_show_toggle->set_active(work_area->grid_status());
- action_group->add(grid_show_toggle, sigc::mem_fun(*work_area, &studio::WorkArea::toggle_grid));
+ action_group->add(grid_show_toggle, sigc::mem_fun(*this, &studio::CanvasView::toggle_show_grid));
grid_snap_toggle = Gtk::ToggleAction::create("toggle-grid-snap", _("Snap to Grid"));
grid_snap_toggle->set_active(work_area->get_grid_snap());
action = Gtk::ToggleAction::create("toggle-low-res", _("Use Low-Res"));
action->set_active(work_area->get_low_resolution_flag());
- action_group->add(action, sigc::mem_fun(*work_area, &studio::WorkArea::toggle_low_resolution_flag));
+ action_group->add(action, sigc::mem_fun(*this, &studio::CanvasView::toggle_low_res_pixel_flag));
action = Gtk::ToggleAction::create("toggle-onion-skin", _("Show Onion Skin"));
action->set_active(work_area->get_onion_skin());
CanvasView::on_mode_changed(synfigapp::CanvasInterface::Mode mode)
{
// If the animate flag was set in mode...
+ Gtk::IconSize iconsize=Gtk::IconSize::from_name("synfig-small_icon");
if(mode&synfigapp::MODE_ANIMATE)
{
Gtk::Image *icon;
- icon=manage(new Gtk::Image(Gtk::StockID("gtk-no"),Gtk::ICON_SIZE_BUTTON));
+ icon=manage(new Gtk::Image(Gtk::StockID("gtk-no"),iconsize));
animatebutton->remove();
animatebutton->add(*icon);
tooltips.set_tip(*animatebutton,_("In Animate Editing Mode"));
else
{
Gtk::Image *icon;
- icon=manage(new Gtk::Image(Gtk::StockID("gtk-yes"),Gtk::ICON_SIZE_BUTTON));
+ icon=manage(new Gtk::Image(Gtk::StockID("gtk-yes"),iconsize));
animatebutton->remove();
animatebutton->add(*icon);
tooltips.set_tip(*animatebutton,_("Not in Animate Editing Mode"));
void
CanvasView::decrease_low_res_pixel_size()
{
+ if(changing_resolution_)
+ return;
+ changing_resolution_=true;
list<int> sizes = CanvasView::get_pixel_sizes();
int pixel_size = work_area->get_low_res_pixel_size();
-
for (list<int>::iterator iter = sizes.begin(); iter != sizes.end(); iter++)
if (*iter == pixel_size)
{
}
break;
}
+ // Update the "toggle-low-res" action
+ Glib::RefPtr<Gtk::ToggleAction> action = Glib::RefPtr<Gtk::ToggleAction>::cast_dynamic(action_group->get_action("toggle-low-res"));
+ action->set_active(work_area->get_low_resolution_flag());
+ // Update toggle low res button
+ resolutiondial->update_lowres(work_area->get_low_resolution_flag());
+ changing_resolution_=false;
}
void
CanvasView::increase_low_res_pixel_size()
{
+ if(changing_resolution_)
+ return;
+ changing_resolution_=true;
list<int> sizes = CanvasView::get_pixel_sizes();
int pixel_size = work_area->get_low_res_pixel_size();
-
if (!work_area->get_low_resolution_flag())
{
+ // We were using "hi res" so change it to low res.
work_area->set_low_resolution_flag(true);
+ // Update the "toggle-low-res" action
+ Glib::RefPtr<Gtk::ToggleAction> action = Glib::RefPtr<Gtk::ToggleAction>::cast_dynamic(action_group->get_action("toggle-low-res"));
+ action->set_active(true);
+ // Update the toggle low res button
+ resolutiondial->update_lowres(true);
+ changing_resolution_=false;
return;
}
}
break;
}
+ // Update the "toggle-low-res" action
+ Glib::RefPtr<Gtk::ToggleAction> action = Glib::RefPtr<Gtk::ToggleAction>::cast_dynamic(action_group->get_action("toggle-low-res"));
+ action->set_active(work_area->get_low_resolution_flag());
+ // Update toggle low res button
+ resolutiondial->update_lowres(work_area->get_low_resolution_flag());
+ changing_resolution_=false;
+}
+
+void
+CanvasView::toggle_low_res_pixel_flag()
+{
+ if(changing_resolution_)
+ return;
+ changing_resolution_=true;
+ work_area->toggle_low_resolution_flag();
+ // Update the toggle low res button
+ resolutiondial->update_lowres(work_area->get_low_resolution_flag());
+ // Update the "toggle-low-res" action
+ Glib::RefPtr<Gtk::ToggleAction> action = Glib::RefPtr<Gtk::ToggleAction>::cast_dynamic(action_group->get_action("toggle-low-res"));
+ action->set_active(work_area->get_low_resolution_flag());
+ changing_resolution_=false;
+}
+
+void
+CanvasView::update_quality()
+{
+ if(working_depth)
+ return;
+ if(updating_quality_)
+ return;
+ updating_quality_=true;
+ work_area->set_quality((int) quality_spin->get_value());
+ // Update Quality Radio actions
+ Glib::RefPtr<Gtk::RadioAction> action=Glib::RefPtr<Gtk::RadioAction>::cast_dynamic(
+ action_group->get_action(strprintf("quality-%02d",(int) quality_spin->get_value()))
+ );
+ action->set_active();
+
+ updating_quality_=false;
+}
+
+void
+CanvasView::set_quality(int x)
+{
+ if(updating_quality_)
+ return;
+ work_area->set_quality(x);
+ // Update the quality spin button
+ quality_spin->set_value(x);
+}
+
+void
+CanvasView::toggle_show_grid()
+{
+ if(toggling_show_grid)
+ return;
+ toggling_show_grid=true;
+ work_area->toggle_grid();
+ // Update the toggle grid show action
+ set_grid_show_toggle(work_area->grid_status());
+ // Update the toggle grid show check button
+ show_grid->set_active(work_area->grid_status());
+ toggling_show_grid=false;
}
+
void
CanvasView::on_dirty_preview()
{
return;
}
}
+ on_play_stop_pressed();
is_playing_=false;
-
time_adjustment().set_value(endtime);
time_adjustment().value_changed();
}
void
CanvasView::toggle_duck_mask(Duckmatic::Type type)
{
+ if(toggling_ducks_)
+ return;
+ toggling_ducks_=true;
bool is_currently_on(work_area->get_type_mask()&type);
if(is_currently_on)
work_area->set_type_mask(work_area->get_type_mask()|type);
work_area->queue_draw();
+ try
+ {
+ // Update the toggle ducks actions
+ Glib::RefPtr<Gtk::ToggleAction> action;
+ action = Glib::RefPtr<Gtk::ToggleAction>::cast_dynamic(action_group->get_action("mask-position-ducks"));
+ action->set_active((bool)(work_area->get_type_mask()&Duck::TYPE_POSITION));
+ action = Glib::RefPtr<Gtk::ToggleAction>::cast_dynamic(action_group->get_action("mask-tangent-ducks"));
+ action->set_active((bool)(work_area->get_type_mask()&Duck::TYPE_TANGENT));
+ action = Glib::RefPtr<Gtk::ToggleAction>::cast_dynamic(action_group->get_action("mask-vertex-ducks"));
+ action->set_active((bool)(work_area->get_type_mask()&Duck::TYPE_VERTEX));
+ action = Glib::RefPtr<Gtk::ToggleAction>::cast_dynamic(action_group->get_action("mask-radius-ducks"));
+ action->set_active((bool)(work_area->get_type_mask()&Duck::TYPE_RADIUS));
+ action = Glib::RefPtr<Gtk::ToggleAction>::cast_dynamic(action_group->get_action("mask-width-ducks"));
+ action->set_active((bool)(work_area->get_type_mask()&Duck::TYPE_WIDTH));
+ action = Glib::RefPtr<Gtk::ToggleAction>::cast_dynamic(action_group->get_action("mask-angle-ducks"));
+ action->set_active((bool)(work_area->get_type_mask()&Duck::TYPE_ANGLE));
+ // Update toggle ducks buttons
+ toggleducksdial->update_toggles(work_area->get_type_mask());
+ }
+ catch(...)
+ {
+ toggling_ducks_=false;
+ }
+ toggling_ducks_=false;
}
void
return true;
}
+
+//! Modify the play stop button apearence and play stop the animation
+void
+CanvasView::on_play_stop_pressed()
+{
+ Gtk::Image *icon;
+ Gtk::Button *stop_button;
+ stop_button=framedial->get_play_button();
+ bool play_flag;
+ if(!is_playing())
+ {
+ icon = manage(new Gtk::Image(Gtk::Stock::MEDIA_STOP, Gtk::IconSize::from_name("synfig-small_icon")));
+ stop_button->set_relief(Gtk::RELIEF_NORMAL);
+ play_flag=true;
+ }
+ else
+ {
+ icon = manage(new Gtk::Image(Gtk::Stock::MEDIA_PLAY, Gtk::IconSize::from_name("synfig-small_icon")));
+ stop_button->set_relief(Gtk::RELIEF_NONE);
+ play_flag=false;
+ }
+ stop_button->remove();
+ stop_button->add(*icon);
+ icon->set_padding(0, 0);
+ icon->show();
+ if(play_flag) play(); else stop();
+}