Fix bugs in previous commit that caused FTBFS in synfig and ETL FTBFS with older...
[synfig.git] / synfig-studio / tags / stable / src / gtkmm / render.cpp
index d648d38..4696a47 100644 (file)
@@ -6,6 +6,7 @@
 **
 **     \legal
 **     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
+**     Copyright (c) 2007, 2008 Chris Moore
 **
 **     This package is free software; you can redistribute it and/or
 **     modify it under the terms of the GNU General Public License as
@@ -37,6 +38,8 @@
 #include <synfig/canvas.h>
 #include "asyncrenderer.h"
 
+#include "general.h"
+
 #endif
 
 /* === U S I N G =========================================================== */
@@ -54,7 +57,7 @@ using namespace studio;
 
 /* === M E T H O D S ======================================================= */
 
-RenderSettings::RenderSettings(Gtk::Window& parent,handle<synfigapp::CanvasInterface> canvas_interface):
+RenderSettings::RenderSettings(Gtk::Window& parent, etl::handle<synfigapp::CanvasInterface> canvas_interface):
        Gtk::Dialog(_("Render Settings"),parent,false,true),
        canvas_interface_(canvas_interface),
        adjustment_quality(3,0,9),
@@ -173,26 +176,44 @@ RenderSettings::RenderSettings(Gtk::Window& parent,handle<synfigapp::CanvasInter
 
        set_title(_("Render Settings")+String(" - ")+canvas_interface_->get_canvas()->get_name());
 
+       toggle_single_frame.set_active(false);
+       widget_rend_desc.enable_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()));
 
-       toggle_single_frame.set_active(true);
-       widget_rend_desc.disable_time_section();
+       // if this isn't the root canvas, append (<canvasname>) to the filename
+       etl::handle<synfig::Canvas> 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(),Glib::ustring("Desktop")+ETL_DIRECTORY_SEPERATOR+Glib::ustring("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
@@ -211,7 +232,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);
 }
 
@@ -219,6 +240,7 @@ void
 RenderSettings::on_render_pressed()
 {
        String filename=entry_filename.get_text();
+       synfig::String calculated_target_name(target_name);
 
        if(filename.empty())
        {
@@ -228,15 +250,23 @@ 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)
                {
@@ -245,13 +275,13 @@ RenderSettings::on_render_pressed()
                }
        }
 
-       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);
@@ -271,7 +301,7 @@ RenderSettings::on_render_pressed()
        target->set_rend_desc(&rend_desc);
        target->set_quality((int)adjustment_quality.get_value());
        if( !target->init() ){
-               canvas_interface_->get_ui_interface()->error(_("Target initialisation failure"));
+               canvas_interface_->get_ui_interface()->error(_("Target initialization failure"));
                return;
        }