X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Ftrunk%2Fsrc%2Fgtkmm%2Frender.cpp;h=cec4215a09e05d2aefbda745a3510adc64315dea;hb=9459638ad6797b8139f1e9f0715c96076dbf0890;hp=cb75d55c2a4d0e7006cf5c4310d6926ec45a8104;hpb=02252941b29de64037116f4d37991a38d9ff0d94;p=synfig.git diff --git a/synfig-studio/trunk/src/gtkmm/render.cpp b/synfig-studio/trunk/src/gtkmm/render.cpp index cb75d55..cec4215 100644 --- a/synfig-studio/trunk/src/gtkmm/render.cpp +++ b/synfig-studio/trunk/src/gtkmm/render.cpp @@ -1,20 +1,22 @@ /* === S Y N F I G ========================================================= */ -/*! \file render.cpp +/*! \file gtkmm/render.cpp ** \brief Template File ** -** $Id: render.cpp,v 1.2 2005/01/10 08:13:44 darco Exp $ +** $Id$ ** ** \legal -** Copyright (c) 2002 Robert B. Quattlebaum Jr. +** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley +** Copyright (c) 2007, 2008 Chris Moore ** -** This software and associated documentation -** are CONFIDENTIAL and PROPRIETARY property of -** the above-mentioned copyright holder. +** This package is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 2 of +** the License, or (at your option) any later version. ** -** You may not copy, print, publish, or in any -** other way distribute this software without -** a prior written agreement with -** the copyright holder. +** This package is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. ** \endlegal */ /* ========================================================================= */ @@ -31,10 +33,15 @@ #include "render.h" #include "app.h" #include +#include #include #include #include "asyncrenderer.h" +#include "general.h" + +#include + #endif /* === U S I N G =========================================================== */ @@ -52,21 +59,21 @@ using namespace studio; /* === M E T H O D S ======================================================= */ -RenderSettings::RenderSettings(Gtk::Window& parent,handle canvas_interface): +RenderSettings::RenderSettings(Gtk::Window& parent, etl::handle canvas_interface): Gtk::Dialog(_("Render Settings"),parent,false,true), canvas_interface_(canvas_interface), adjustment_quality(3,0,9), entry_quality(adjustment_quality,1,0), adjustment_antialias(1,1,31), entry_antialias(adjustment_antialias,1,0), - toggle_single_frame(_("Use Current Frame")) + toggle_single_frame(_("Use _current frame"), true) { widget_rend_desc.show(); widget_rend_desc.signal_changed().connect(sigc::mem_fun(*this,&studio::RenderSettings::on_rend_desc_changed)); widget_rend_desc.set_rend_desc(canvas_interface_->get_canvas()->rend_desc()); - + canvas_interface->signal_rend_desc_changed().connect(sigc::mem_fun(*this,&RenderSettings::on_rend_desc_changed)); - + menu_target=manage(new class Gtk::Menu()); menu_target->items().push_back(Gtk::Menu_Helpers::MenuElem(_("Auto"), @@ -75,7 +82,7 @@ RenderSettings::RenderSettings(Gtk::Window& parent,handleitems().push_back(Gtk::Menu_Helpers::MenuElem(iter->first, @@ -85,44 +92,78 @@ RenderSettings::RenderSettings(Gtk::Window& parent,handleset_padding(12, 12, 12, 12); + get_vbox()->pack_start(*dialogPadding, false, false, 0); + + Gtk::VBox *dialogBox = manage(new Gtk::VBox(false, 12)); + dialogPadding->add(*dialogBox); Gtk::Button *choose_button(manage(new class Gtk::Button(Gtk::StockID(_("Choose..."))))); choose_button->show(); choose_button->signal_clicked().connect(sigc::mem_fun(*this, &studio::RenderSettings::on_choose_pressed)); - + Gtk::Frame *target_frame=manage(new Gtk::Frame(_("Target"))); - Gtk::Table *target_table=manage(new Gtk::Table(2,2,false)); - target_frame->add(*target_table); - target_table->attach(*manage(new Gtk::Label(_("Filename"))), 0, 1, 0, 1, Gtk::SHRINK|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0); - target_table->attach(entry_filename, 1, 2, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0); - target_table->attach(*choose_button, 2, 3, 0, 1, Gtk::SHRINK|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0); - target_table->attach(*manage(new Gtk::Label(_("Target"))), 3, 4, 0, 1, Gtk::SHRINK|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0); - target_table->attach(optionmenu_target, 4, 5, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0); - get_vbox()->pack_start(*target_frame); + target_frame->set_shadow_type(Gtk::SHADOW_NONE); + ((Gtk::Label *) target_frame->get_label_widget())->set_markup(_("Target")); + dialogBox->pack_start(*target_frame); + Gtk::Alignment *targetPadding = manage(new Gtk::Alignment(0, 0, 1, 1)); + targetPadding->set_padding(6, 0, 24, 0); + target_frame->add(*targetPadding); + + Gtk::Table *target_table = manage(new Gtk::Table(2, 3, false)); + target_table->set_row_spacings(6); + target_table->set_col_spacings(12); + targetPadding->add(*target_table); + + Gtk::Label *filenameLabel = manage(new Gtk::Label(_("_Filename"), true)); + filenameLabel->set_alignment(0, 0.5); + filenameLabel->set_mnemonic_widget(entry_filename); + target_table->attach(*filenameLabel, 0, 1, 0, 1, Gtk::SHRINK|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0); + target_table->attach(entry_filename, 1, 2, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0); + target_table->attach(*choose_button, 2, 3, 0, 1, Gtk::SHRINK|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0); + + Gtk::Label *targetLabel = manage(new Gtk::Label(_("_Target"), true)); + targetLabel->set_alignment(0, 0.5); + targetLabel->set_mnemonic_widget(optionmenu_target); + target_table->attach(*targetLabel, 0, 1, 1, 2, Gtk::SHRINK|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0); + target_table->attach(optionmenu_target, 1, 3, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0); toggle_single_frame.signal_toggled().connect(sigc::mem_fun(*this, &studio::RenderSettings::on_single_frame_toggle)); - Gtk::Frame *settings_frame=manage(new Gtk::Frame(_("Settings"))); + settings_frame->set_shadow_type(Gtk::SHADOW_NONE); + ((Gtk::Label *) settings_frame->get_label_widget())->set_markup(_("Settings")); + dialogBox->pack_start(*settings_frame); + + Gtk::Alignment *settingsPadding = manage(new Gtk::Alignment(0, 0, 1, 1)); + settingsPadding->set_padding(6, 0, 24, 0); + settings_frame->add(*settingsPadding); + Gtk::Table *settings_table=manage(new Gtk::Table(2,2,false)); - settings_frame->add(*settings_table); - settings_table->attach(*manage(new Gtk::Label(_("Quality"))), 0, 1, 0, 1, Gtk::SHRINK|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0); - settings_table->attach(entry_quality, 1, 2, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0); - settings_table->attach(*manage(new Gtk::Label(_("Anti-Alias"))), 2, 3, 0, 1, Gtk::SHRINK|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0); - settings_table->attach(entry_antialias, 3, 4, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0); - settings_table->attach(toggle_single_frame, 4, 5, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0); - get_vbox()->pack_start(*settings_frame); - - - - - get_vbox()->pack_start(widget_rend_desc); - - + settings_table->set_row_spacings(6); + settings_table->set_col_spacings(12); + settingsPadding->add(*settings_table); + + Gtk::Label *qualityLabel = manage(new Gtk::Label(_("_Quality"), true)); + qualityLabel->set_alignment(0, 0.5); + qualityLabel->set_mnemonic_widget(entry_quality); + settings_table->attach(*qualityLabel, 0, 1, 0, 1, Gtk::SHRINK|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0); + settings_table->attach(entry_quality, 1, 2, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0); + + Gtk::Label *antiAliasLabel = manage(new Gtk::Label(_("_Anti-Aliasing"), true)); + antiAliasLabel->set_alignment(0, 0.5); + antiAliasLabel->set_mnemonic_widget(entry_antialias); + settings_table->attach(*antiAliasLabel, 0, 1, 1, 2, Gtk::SHRINK|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0); + settings_table->attach(entry_antialias, 1, 2, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0); + + toggle_single_frame.set_alignment(0, 0.5); + settings_table->attach(toggle_single_frame, 0, 2, 2, 3, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0); + + dialogBox->pack_start(widget_rend_desc); + + Gtk::Button *render_button(manage(new class Gtk::Button(Gtk::StockID("Render")))); render_button->show(); add_action_widget(*render_button,1); @@ -134,29 +175,47 @@ RenderSettings::RenderSettings(Gtk::Window& parent,handlesignal_clicked().connect(sigc::mem_fun(*this, &studio::RenderSettings::on_cancel_pressed)); //set_default_response(1); - + set_title(_("Render Settings")+String(" - ")+canvas_interface_->get_canvas()->get_name()); + toggle_single_frame.set_active(false); + widget_rend_desc.enable_time_section(); - toggle_single_frame.set_active(true); - widget_rend_desc.disable_time_section(); - + set_entry_filename(); + + get_vbox()->show_all(); +} + +RenderSettings::~RenderSettings() +{ +} + +void +RenderSettings::set_entry_filename() +{ + String filename(filename_sans_extension(canvas_interface_->get_canvas()->get_file_name())); + + // if this isn't the root canvas, append () to the filename + etl::handle canvas = canvas_interface_->get_canvas(); + if (!canvas->is_root()) + { + if(canvas->get_name().empty()) + filename+=" ("+canvas->get_id()+')'; + else + filename+=" ("+canvas->get_name()+')'; + } + + filename += ".png"; try { - entry_filename.set_text(Glib::build_filename(Glib::get_home_dir(),"Desktop/output.png")); + entry_filename.set_text((filename)); } catch(...) { synfig::warning("Averted crash!"); entry_filename.set_text("output.png"); } - - get_vbox()->show_all(); -} - -RenderSettings::~RenderSettings() -{ } void @@ -175,7 +234,7 @@ void RenderSettings::on_choose_pressed() { String filename=entry_filename.get_text(); - if(App::dialog_saveas_file("Save Render As",filename)) + if(App::dialog_save_file("Save Render As", filename, RENDER_DIR_PREFERENCE)) entry_filename.set_text(filename); } @@ -183,7 +242,8 @@ void RenderSettings::on_render_pressed() { String filename=entry_filename.get_text(); - + synfig::String calculated_target_name(target_name); + if(filename.empty()) { canvas_interface_->get_ui_interface()->error(_("You must supply a filename!")); @@ -192,48 +252,68 @@ RenderSettings::on_render_pressed() // If the target type is not yet defined, // try to figure it out from the outfile. - if(target_name.empty()) + if(calculated_target_name.empty()) { try { - String ext=String(find(filename.begin(),filename.end(),'.')+1,filename.end()); + String ext(filename_extension(filename)); + if (ext.size()) ext=ext.substr(1); // skip initial '.' + synfig::info("render target filename: '%s'; extension: '%s'", filename.c_str(), ext.c_str()); if(Target::ext_book().count(ext)) - target_name=Target::ext_book()[ext]; + { + calculated_target_name=Target::ext_book()[ext]; + synfig::info("'%s' is a known extension - using target '%s'", ext.c_str(), calculated_target_name.c_str()); + } else - target_name=ext; + { + calculated_target_name=ext; + synfig::info("unknown extension"); + } } catch(std::runtime_error x) { canvas_interface_->get_ui_interface()->error(_("Unable to determine proper target from filename.")); - return; + return; } } - if(filename.empty() && target_name!="null") + if(filename.empty() && calculated_target_name!="null") { canvas_interface_->get_ui_interface()->error(_("A filename is required for this target")); return; } - Target::Handle target=Target::create(target_name,filename); + Target::Handle target=Target::create(calculated_target_name,filename); if(!target) { canvas_interface_->get_ui_interface()->error(_("Unable to create target for ")+filename); return; } + // This is the only way I've found to avoid send a non writable + // filename path to the renderer. + fstream filetest (filename.c_str(), fstream::out); + if (filetest.fail()) + { + canvas_interface_->get_ui_interface()->error(_("Unable to create file for ")+filename); + return; + } hide(); - + target->set_canvas(canvas_interface_->get_canvas()); RendDesc rend_desc(widget_rend_desc.get_rend_desc()); rend_desc.set_antialias((int)adjustment_antialias.get_value()); - + // If we are to only render the current frame if(toggle_single_frame.get_active()) rend_desc.set_time(canvas_interface_->get_time()); target->set_rend_desc(&rend_desc); target->set_quality((int)adjustment_quality.get_value()); + if( !target->init() ){ + canvas_interface_->get_ui_interface()->error(_("Target initialization failure")); + return; + } canvas_interface_->get_ui_interface()->task(_("Rendering ")+filename); @@ -252,21 +332,21 @@ RenderSettings::on_render_pressed() canvas_interface_->get_ui_interface()->amount_complete(0,10000); return; } - + // Success! - canvas_interface_->get_ui_interface()->task(filename+_(" rendered sucessfuly")); + canvas_interface_->get_ui_interface()->task(filename+_(" rendered successfully")); canvas_interface_->get_ui_interface()->amount_complete(0,10000); */ - return; + return; } void RenderSettings::on_finished() { - canvas_interface_->get_ui_interface()->task(_("File rendered sucessfuly")); + canvas_interface_->get_ui_interface()->task(_("File rendered successfully")); canvas_interface_->get_ui_interface()->amount_complete(0,10000); } - + void RenderSettings::on_cancel_pressed() {