X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/170acdc90e9f92f8b8120fa6c04acdbf45c89582..e413198572959f013fc2537a3c8cc184c9ac820d:/src/gtk/animate.cpp diff --git a/src/gtk/animate.cpp b/src/gtk/animate.cpp index 7b3b798c00..c6f7abe951 100644 --- a/src/gtk/animate.cpp +++ b/src/gtk/animate.cpp @@ -22,6 +22,8 @@ #include "wx/stream.h" #endif +#include "wx/wfstream.h" + #include @@ -30,10 +32,10 @@ // ============================================================================ void gdk_pixbuf_area_updated(GdkPixbufLoader *loader, - gint x, - gint y, - gint width, - gint height, + gint WXUNUSED(x), + gint WXUNUSED(y), + gint WXUNUSED(width), + gint WXUNUSED(height), wxAnimation *anim) { if (anim && anim->GetPixbuf() == NULL) @@ -59,6 +61,13 @@ wxAnimation::wxAnimation(const wxAnimation& that) g_object_ref(m_pixbuf); } +wxAnimation::wxAnimation(GdkPixbufAnimation *p) +{ + m_pixbuf = p; + if ( m_pixbuf ) + g_object_ref(m_pixbuf); +} + wxAnimation& wxAnimation::operator=(const wxAnimation& that) { if (this != &that) @@ -75,8 +84,7 @@ wxAnimation& wxAnimation::operator=(const wxAnimation& that) bool wxAnimation::LoadFile(const wxString &name, wxAnimationType WXUNUSED(type)) { UnRef(); - m_pixbuf = gdk_pixbuf_animation_new_from_file( - wxConvFileName->cWX2MB(name), NULL); + m_pixbuf = gdk_pixbuf_animation_new_from_file(name.fn_str(), NULL); return IsOk(); } @@ -110,7 +118,8 @@ bool wxAnimation::Load(wxInputStream &stream, wxAnimationType type) if (!loader) { - wxLogDebug(wxT("Could not create the loader for '%s' animation type"), anim_type); + wxLogDebug(wxT("Could not create the loader for '%s' animation type: %s"), + anim_type, error->message); return false; } @@ -127,7 +136,7 @@ bool wxAnimation::Load(wxInputStream &stream, wxAnimationType type) if (!gdk_pixbuf_loader_write(loader, buf, stream.LastRead(), &error)) { gdk_pixbuf_loader_close(loader, &error); - wxLogDebug(wxT("Could not write to the loader")); + wxLogDebug(wxT("Could not write to the loader: %s"), error->message); return false; } } @@ -135,7 +144,7 @@ bool wxAnimation::Load(wxInputStream &stream, wxAnimationType type) // load complete if (!gdk_pixbuf_loader_close(loader, &error)) { - wxLogDebug(wxT("Could not close the loader")); + wxLogDebug(wxT("Could not close the loader: %s"), error->message); return false; } @@ -143,7 +152,7 @@ bool wxAnimation::Load(wxInputStream &stream, wxAnimationType type) return true; } -wxImage wxAnimation::GetFrame(size_t i) const +wxImage wxAnimation::GetFrame(unsigned int WXUNUSED(frame)) const { return wxNullImage; } @@ -192,9 +201,6 @@ bool wxAnimationCtrl::Create( wxWindow *parent, wxWindowID id, long style, const wxString& name) { - m_needParent = true; - m_acceptsFocus = true; - if (!PreCreation( parent, pos, size ) || !base_type::CreateBase(parent, id, pos, size, style & wxWINDOW_STYLE_MASK, wxDefaultValidator, name)) @@ -206,7 +212,8 @@ bool wxAnimationCtrl::Create( wxWindow *parent, wxWindowID id, SetWindowStyle(style); m_widget = gtk_image_new(); - gtk_widget_show( GTK_WIDGET(m_widget) ); + g_object_ref(m_widget); + gtk_widget_show(m_widget); m_parent->DoAddChild( this ); @@ -229,9 +236,15 @@ wxAnimationCtrl::~wxAnimationCtrl() } bool wxAnimationCtrl::LoadFile(const wxString &filename, wxAnimationType type) +{ + wxFileInputStream fis(filename); + return Load(fis, type); +} + +bool wxAnimationCtrl::Load(wxInputStream& stream, wxAnimationType type) { wxAnimation anim; - if (!anim.LoadFile(filename, type)) + if ( !anim.Load(stream, type) || !anim.IsOk() ) return false; SetAnimation(anim); @@ -271,7 +284,7 @@ void wxAnimationCtrl::FitToAnimation() h = gdk_pixbuf_animation_get_height(m_anim); // update our size to fit animation - SetSize(w, h); + SetSize(w, h); } void wxAnimationCtrl::ResetAnim() @@ -318,35 +331,29 @@ void wxAnimationCtrl::Stop() DisplayStaticImage(); } -void wxAnimationCtrl::SetInactiveBitmap(const wxBitmap &bmp) -{ - wxAnimationCtrlBase::SetInactiveBitmap(bmp); - - // update the pixbuf associated with m_widget now... - if (!IsPlaying()) - DisplayStaticImage(); -} - void wxAnimationCtrl::DisplayStaticImage() { wxASSERT(!IsPlaying()); - if (m_bmpStatic.IsOk()) + // m_bmpStaticReal will be updated only if necessary... + UpdateStaticImage(); + + if (m_bmpStaticReal.IsOk()) { // show inactive bitmap GdkBitmap *mask = (GdkBitmap *) NULL; - if (m_bmpStatic.GetMask()) - mask = m_bmpStatic.GetMask()->GetBitmap(); + if (m_bmpStaticReal.GetMask()) + mask = m_bmpStaticReal.GetMask()->GetBitmap(); - if (m_bmpStatic.HasPixbuf()) + if (m_bmpStaticReal.HasPixbuf()) { gtk_image_set_from_pixbuf(GTK_IMAGE(m_widget), - m_bmpStatic.GetPixbuf()); + m_bmpStaticReal.GetPixbuf()); } else { gtk_image_set_from_pixmap(GTK_IMAGE(m_widget), - m_bmpStatic.GetPixmap(), mask); + m_bmpStaticReal.GetPixmap(), mask); } } else @@ -408,7 +415,13 @@ bool wxAnimationCtrl::SetBackgroundColour( const wxColour &colour ) // Thus we clear the GtkImage contents to the background colour... if (!wxControl::SetBackgroundColour(colour)) return false; - ClearToBackgroundColour(); + + // if not playing the change must take place immediately but + // remember that the inactive bitmap has higher priority over the background + // colour; DisplayStaticImage() will handle that + if ( !IsPlaying() ) + DisplayStaticImage(); + return true; } @@ -417,7 +430,7 @@ bool wxAnimationCtrl::SetBackgroundColour( const wxColour &colour ) // wxAnimationCtrl - event handlers //----------------------------------------------------------------------------- -void wxAnimationCtrl::OnTimer(wxTimerEvent &ev) +void wxAnimationCtrl::OnTimer(wxTimerEvent& WXUNUSED(ev)) { wxASSERT(m_iter != NULL);