/* === S Y N F I G ========================================================= */
-/*! \file about.cpp
+/*! \file splash.cpp
** \brief writeme
**
** $Id$
** \legal
** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
** Copyright (c) 2007 Chris Moore
+** Copyright (c) 2008 Paul Wise
**
** This package is free software; you can redistribute it and/or
** modify it under the terms of the GNU General Public License as
#include <ETL/stringf>
#include <gtkmm/image.h>
-#include <gdkmm/pixbufloader.h>
-#include <gtkmm/button.h>
#include <gtkmm/label.h>
+#include <gtkmm/frame.h>
#include <gtkmm/fixed.h>
#include <synfig/general.h>
-#include "about.h"
+#include "splash.h"
#include "app.h"
#include "general.h"
#endif
/* === G L O B A L S ======================================================= */
-extern const guint gtk_major_version;
-extern const guint gtk_minor_version;
-extern const guint gtk_micro_version;
-extern const guint gtk_binary_age;
-extern const guint gtk_interface_age;
/* === P R O C E D U R E S ================================================= */
-class studio::AboutProgress : public synfig::ProgressCallback
+class studio::SplashProgress : public synfig::ProgressCallback
{
- About &about;
+ Splash &splash;
public:
- AboutProgress(About &about):about(about) { }
+ SplashProgress(Splash &splash):splash(splash) { }
virtual bool task(const std::string &task)
{
- if(about.tasklabel)
+ if(splash.tasklabel)
{
- about.tasklabel->set_label(task);
- about.tasklabel->show();
+ splash.tasklabel->set_label(task);
+ splash.tasklabel->show();
}
else
{
virtual bool error(const std::string &task)
{
- if(about.tasklabel)
+ if(splash.tasklabel)
{
- about.tasklabel->set_label(_("ERROR:")+task);
- about.tasklabel->show();
+ splash.tasklabel->set_label(_("ERROR:")+task);
+ splash.tasklabel->show();
}
else
{
virtual bool warning(const std::string &task)
{
- if(about.tasklabel)
+ if(splash.tasklabel)
{
- about.tasklabel->set_label(_("WARNING:")+task);
- about.tasklabel->show();
+ splash.tasklabel->set_label(_("WARNING:")+task);
+ splash.tasklabel->show();
}
else
{
virtual bool amount_complete(int current, int total)
{
- if(about.progressbar)
+ if(splash.progressbar)
{
- about.progressbar->set_fraction((float)current/(float)total);
- about.progressbar->show();
+ splash.progressbar->set_fraction((float)current/(float)total);
+ splash.progressbar->show();
}
else
cerr<<current<<'/'<<total<<endl;
while(studio::App::events_pending())studio::App::iteration(false);
return true;
}
-}; // END of class AboutProgress
+}; // END of class SplashProgress
/* === M E T H O D S ======================================================= */
-About::About():
- Gtk::Window(getenv("SYNFIG_DISABLE_POPUP_WINDOWS") ? Gtk::WINDOW_TOPLEVEL : Gtk::WINDOW_POPUP),
- can_self_destruct(true)
+Splash::Splash():
+ Gtk::Window(getenv("SYNFIG_DISABLE_POPUP_WINDOWS") ? Gtk::WINDOW_TOPLEVEL : Gtk::WINDOW_POPUP)
{
- int image_w=300,image_h=350;
-
std::string imagepath;
#ifdef WIN32
imagepath=App::get_base_path()+ETL_DIRECTORY_SEPARATOR+IMAGE_DIR;
if(synfig_root) {
imagepath=synfig_root;
imagepath+=ETL_DIRECTORY_SEPARATOR;
-
- imagepath+="share/pixmaps";
+ imagepath+="share";
+ imagepath+=ETL_DIRECTORY_SEPARATOR;
+ imagepath+="pixmaps";
+ imagepath+=ETL_DIRECTORY_SEPARATOR;
+ imagepath+="synfigstudio";
}
imagepath+=ETL_DIRECTORY_SEPARATOR;
-
- // Create the Logo
- Gtk::Image *Logo = manage(new class Gtk::Image());
- Logo->set(imagepath+"about_dialog."IMAGE_EXT);
- Logo->set_size_request(image_w,image_h);
- Logo->set_alignment(0.5,0.5);
- Logo->set_padding(0,0);
-
- // Create the Copyright Label
- Gtk::Label *CopyrightLabel = manage(new class Gtk::Label(SYNFIG_COPYRIGHT));
- CopyrightLabel->set_size_request(image_w,24);
- CopyrightLabel->set_alignment(0.5,0.5);
- CopyrightLabel->set_padding(0,0);
- CopyrightLabel->set_justify(Gtk::JUSTIFY_CENTER);
- CopyrightLabel->set_line_wrap(false);
- CopyrightLabel->modify_fg(Gtk::STATE_NORMAL,Gdk::Color("black"));
-
- /* Scale the text to fit */
- int width = 0;
- int height = 0;
- float size=11;
- Glib::RefPtr<Pango::Layout> l = CopyrightLabel->get_layout();
- Pango::FontDescription fd = Pango::FontDescription("Sans, 11");
- l->set_font_description(fd);
- l->set_justify(Pango::ALIGN_CENTER);
- fd.set_size(int(size*Pango::SCALE));
- l->set_font_description(fd);
- l->get_pixel_size(width,height);
- while( width >= image_w-6 ){
- size-=0.5;
- fd.set_size((int)(size*Pango::SCALE));
- l->set_font_description(fd);
- l->get_pixel_size(width,height);
+ // Create the splash image
+ Gtk::Image* splash_image = manage(new class Gtk::Image());
+ splash_image->set(imagepath+"splash_screen."IMAGE_EXT);
+ splash_image->set_alignment(0.5,0.5);
+ splash_image->set_padding(0,0);
+
+ // Get the image size
+ int image_w = 350; int image_h = 0;
+ Glib::RefPtr<Gdk::Pixbuf> pixbuf = splash_image->get_pixbuf();
+ if( pixbuf ){
+ image_w = pixbuf->get_width();
+ image_h = pixbuf->get_height();
}
- CopyrightLabel->modify_font(fd);
-
- // Create the Version information label
- Gtk::Label *VersionLabel = manage(new class Gtk::Label(_("Version")));
- VersionLabel->set_size_request(image_w,80);
- VersionLabel->set_flags(Gtk::CAN_FOCUS);
- VersionLabel->set_alignment(0.5,0.5);
- VersionLabel->set_padding(0,0);
- VersionLabel->set_justify(Gtk::JUSTIFY_CENTER);
- VersionLabel->set_line_wrap(false);
- VersionLabel->modify_fg(Gtk::STATE_NORMAL,Gdk::Color("black"));
-
- // Set the version label to contain the correct information
- string ver;
- ver+="Version "VERSION" ("__DATE__" "__TIME__")\n";
- ver+="Using Synfig ";
- ver+=synfig::get_version();
- #ifdef __GNUC__
- ver+=strprintf(" and GNU G++ %d.%d.%d",__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__);
- #endif
-
- ver+=strprintf("\nGtk+ %d.%d.%d",gtk_major_version,gtk_minor_version,gtk_micro_version);
-
- #ifdef _DEBUG
- ver+="\nDEBUG BUILD";
- #endif
- VersionLabel->set_text(ver);
-
- /* Scale the text to fit */
- width = 0;
- height = 0;
- size=11;
- l = VersionLabel->get_layout();
- fd = Pango::FontDescription("Sans, 11");
- l->set_font_description(fd);
- l->set_justify(Pango::ALIGN_CENTER);
- fd.set_size(int(size*Pango::SCALE));
- l->set_font_description(fd);
- l->get_pixel_size(width,height);
- while( width >= image_w-6 ){
- size-=0.5;
- fd.set_size((int)(size*Pango::SCALE));
- l->set_font_description(fd);
- l->get_pixel_size(width,height);
- }
- VersionLabel->modify_font(fd);
-
- // Create the image that will be used on the close button
- Gtk::Image *image2 = manage(new class Gtk::Image(Gtk::StockID("gtk-close"), Gtk::IconSize(4)));
- image2->set_alignment(0.5,0.5);
- image2->set_padding(0,0);
-
- // Create the close button, and attach the image to it
- CloseButton = manage(new class Gtk::Button());
- CloseButton->set_size_request(24,24);
- CloseButton->set_flags(Gtk::CAN_FOCUS);
- _tooltips.set_tip(*CloseButton, _("Close"), "");
- CloseButton->set_relief(Gtk::RELIEF_NONE);
- CloseButton->add(*image2);
// Create the progress bar
progressbar = manage(new class Gtk::ProgressBar());
tasklabel->set_use_underline(false);
// Create the Gtk::Fixed container and put all of the widgets into it
- Gtk::Fixed *fixed1 = manage(new class Gtk::Fixed());
- fixed1->put(*Logo, 0, 0);
- fixed1->put(*CopyrightLabel, 0, image_h-25);
- fixed1->put(*CloseButton, image_w-24, 0);
- fixed1->put(*VersionLabel, 0, image_h-90);
- fixed1->put(*progressbar, 0, image_h+24);
- fixed1->put(*tasklabel, 0, image_h);
+ Gtk::Fixed* fixed = manage(new class Gtk::Fixed());
+ if( pixbuf ) fixed->put(*splash_image, 0, 0);
+ fixed->put(*progressbar, 0, image_h+24);
+ fixed->put(*tasklabel, 0, image_h);
+
+ // Create shadow around the outside of the window
+ Gtk::Frame* frame = manage(new class Gtk::Frame());
+ frame->set_shadow_type(Gtk::SHADOW_OUT);
+ frame->add(*fixed);
// Set up the parameters for this pop-up window
set_title("Synfig Studio "VERSION);
set_modal(false);
property_window_position().set_value(Gtk::WIN_POS_CENTER);
set_resizable(false);
- add(*fixed1);
+ set_type_hint(Gdk::WINDOW_TYPE_HINT_SPLASHSCREEN);
+ set_auto_startup_notification(false);
+ try {
+ set_icon_from_file(imagepath+"synfig_icon."+IMAGE_EXT);
+ } catch(...) {
+ synfig::warning("Unable to open "+imagepath+"synfig_icon."+IMAGE_EXT);
+ }
+ add(*frame);
// show everything off
- Logo->show();
- CopyrightLabel->show();
- image2->show();
- CloseButton->show();
- VersionLabel->show();
- fixed1->show();
+ if( pixbuf ) splash_image->show();
+ fixed->show();
+ frame->show();
- // Connect relevant signals
- CloseButton->signal_clicked().connect(sigc::mem_fun(*this, &About::close));
+ // Once the splash is shown, we want startup stuff to continue as normal
+ signal_map().connect(sigc::mem_fun(*this, &Splash::enable_startup_notification));
- cb=new AboutProgress(*this);
+ cb=new SplashProgress(*this);
}
-About::~About()
+Splash::~Splash()
{
delete cb;
}
-void About::close()
+synfig::ProgressCallback *
+Splash::get_callback()
{
- hide();
- if(can_self_destruct)
- delete this;
+ return cb;
}
void
-About::set_can_self_destruct(bool x)
-{
- can_self_destruct=x;
- if(x==true)
- CloseButton->show();
- else
- CloseButton->hide();
-}
-
-synfig::ProgressCallback *
-About::get_callback()
-{
- return cb;
+Splash::enable_startup_notification(){
+ set_auto_startup_notification(true);
}