]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/animate/anitest.cpp
Use template class instead of template function in wxVectorSort().
[wxWidgets.git] / samples / animate / anitest.cpp
index 52d607f13a835868a3e6338e1f1736d72a93ed2c..6d4a4ecb00183074779edf299dbba96d9cd0479a 100644 (file)
     #include "sample.xpm"
 #endif
 
     #include "sample.xpm"
 #endif
 
+#include "wx/aboutdlg.h"
+#include "wx/artprov.h"
+#include "wx/colordlg.h"
+#include "wx/wfstream.h"
+
 #include "anitest.h"
 
 #include "anitest.h"
 
+#if !wxUSE_ANIMATIONCTRL
+    #error Cannot compile this sample if wxAnimationCtrl is not enabled
+#endif
+
+
 IMPLEMENT_APP(MyApp)
 
 // ---------------------------------------------------------------------------
 IMPLEMENT_APP(MyApp)
 
 // ---------------------------------------------------------------------------
@@ -46,11 +56,20 @@ IMPLEMENT_APP(MyApp)
 
 enum
 {
 
 enum
 {
-    wxID_PLAY
+    ID_PLAY = 1,
+    ID_SET_NULL_ANIMATION,
+    ID_SET_INACTIVE_BITMAP,
+    ID_SET_NO_AUTO_RESIZE,
+    ID_SET_BGCOLOR
 };
 
 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
 };
 
 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
-    EVT_MENU(wxID_PLAY, MyFrame::OnPlay)
+    EVT_MENU(ID_PLAY, MyFrame::OnPlay)
+    EVT_MENU(ID_SET_NULL_ANIMATION, MyFrame::OnSetNullAnimation)
+    EVT_MENU(ID_SET_INACTIVE_BITMAP, MyFrame::OnSetInactiveBitmap)
+    EVT_MENU(ID_SET_NO_AUTO_RESIZE, MyFrame::OnSetNoAutoResize)
+    EVT_MENU(ID_SET_BGCOLOR, MyFrame::OnSetBgColor)
+
     EVT_MENU(wxID_STOP, MyFrame::OnStop)
     EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)
     EVT_MENU(wxID_EXIT, MyFrame::OnQuit)
     EVT_MENU(wxID_STOP, MyFrame::OnStop)
     EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)
     EVT_MENU(wxID_EXIT, MyFrame::OnQuit)
@@ -73,43 +92,14 @@ END_EVENT_TABLE()
 // Initialise this in OnInit, not statically
 bool MyApp::OnInit()
 {
 // Initialise this in OnInit, not statically
 bool MyApp::OnInit()
 {
-    // Create the main frame window
-
-    MyFrame* frame = new MyFrame((wxFrame *)NULL, -1, _T("Animation Demo"),
-                        wxPoint(-1, -1), wxSize(500, 400),
-                        wxDEFAULT_FRAME_STYLE);
-
-    // Give it an icon
-    frame->SetIcon(wxICON(sample));
-
-    // Make a menubar
-    wxMenu *file_menu = new wxMenu;
-
-#if wxUSE_FILEDLG
-    file_menu->Append(wxID_OPEN, _T("&Open Animation...\tCtrl+O"), _T("Loads an animation"));
-#endif // wxUSE_FILEDLG
-    file_menu->Append(wxID_EXIT);
-
-    wxMenu *play_menu = new wxMenu;
-    play_menu->Append(wxID_PLAY, _T("Play\tCtrl+P"), _T("Play the animation"));
-    play_menu->Append(wxID_STOP, _T("Stop\tCtrl+P"), _T("Stop the animation"));
-
-    wxMenu *help_menu = new wxMenu;
-    help_menu->Append(wxID_ABOUT);
-
-    wxMenuBar *menu_bar = new wxMenuBar;
-
-    menu_bar->Append(file_menu, _T("&File"));
-    menu_bar->Append(play_menu, _T("&Animation"));
-    menu_bar->Append(help_menu, _T("&Help"));
-
-    // Associate the menu bar with the frame
-    frame->SetMenuBar(menu_bar);
+    if ( !wxApp::OnInit() )
+        return false;
 
 
-#if wxUSE_STATUSBAR
-    frame->CreateStatusBar();
-#endif // wxUSE_STATUSBAR
+    // Create the main frame window
 
 
+    MyFrame* frame = new MyFrame((wxFrame *)NULL, wxID_ANY, wxT("Animation Demo"),
+                                 wxDefaultPosition, wxSize(500, 400),
+                                 wxDEFAULT_FRAME_STYLE);
     frame->Show(true);
 
     SetTopWindow(frame);
     frame->Show(true);
 
     SetTopWindow(frame);
@@ -121,8 +111,6 @@ bool MyApp::OnInit()
 // MyFrame
 // ---------------------------------------------------------------------------
 
 // MyFrame
 // ---------------------------------------------------------------------------
 
-#include "wx/wfstream.h"
-
 // Define my frame constructor
 MyFrame::MyFrame(wxWindow *parent,
                  const wxWindowID id,
 // Define my frame constructor
 MyFrame::MyFrame(wxWindow *parent,
                  const wxWindowID id,
@@ -133,18 +121,58 @@ MyFrame::MyFrame(wxWindow *parent,
        : wxFrame(parent, id, title, pos, size,
                           style | wxNO_FULL_REPAINT_ON_RESIZE)
 {
        : wxFrame(parent, id, title, pos, size,
                           style | wxNO_FULL_REPAINT_ON_RESIZE)
 {
-    //m_canvas = new MyCanvas(this, wxPoint(0, 0), wxDefaultSize);
+    SetIcon(wxICON(sample));
+
+    // Make a menubar
+    wxMenu *file_menu = new wxMenu;
+
+#if wxUSE_FILEDLG
+    file_menu->Append(wxID_OPEN, wxT("&Open Animation...\tCtrl+O"), wxT("Loads an animation"));
+#endif // wxUSE_FILEDLG
+    file_menu->Append(wxID_EXIT);
+
+    wxMenu *play_menu = new wxMenu;
+    play_menu->Append(ID_PLAY, wxT("Play\tCtrl+P"), wxT("Play the animation"));
+    play_menu->Append(wxID_STOP, wxT("Stop\tCtrl+S"), wxT("Stop the animation"));
+    play_menu->AppendSeparator();
+    play_menu->Append(ID_SET_NULL_ANIMATION, wxT("Set null animation"),
+                      wxT("Sets the empty animation in the control"));
+    play_menu->AppendCheckItem(ID_SET_INACTIVE_BITMAP, wxT("Set inactive bitmap"),
+                               wxT("Sets an inactive bitmap for the control"));
+    play_menu->AppendCheckItem(ID_SET_NO_AUTO_RESIZE, wxT("Set no autoresize"),
+                               wxT("Tells the control not to resize automatically"));
+    play_menu->Append(ID_SET_BGCOLOR, wxT("Set background colour..."),
+                      wxT("Sets the background colour of the control"));
+
+    wxMenu *help_menu = new wxMenu;
+    help_menu->Append(wxID_ABOUT);
+
+    wxMenuBar *menu_bar = new wxMenuBar;
 
 
-    //wxSizer *sz = new wxBoxSizer(wxVERTICAL);
+    menu_bar->Append(file_menu, wxT("&File"));
+    menu_bar->Append(play_menu, wxT("&Animation"));
+    menu_bar->Append(help_menu, wxT("&Help"));
 
 
-    m_animationCtrl = new wxAnimationCtrl(this, wxID_ANY, wxNullAnimation,
-                                          wxPoint(0,0),wxSize(100,100));
+    // Associate the menu bar with this frame
+    SetMenuBar(menu_bar);
+
+#if wxUSE_STATUSBAR
+    CreateStatusBar();
+#endif // wxUSE_STATUSBAR
+
+    // use a wxBoxSizer otherwise wxFrame will automatically
+    // resize the m_animationCtrl to fill its client area on
+    // user resizes
+    wxSizer *sz = new wxBoxSizer(wxVERTICAL);
+    sz->Add(new wxStaticText(this, wxID_ANY, wxT("wxAnimationCtrl:")),
+            wxSizerFlags().Centre().Border());
+
+    m_animationCtrl = new wxAnimationCtrl(this, wxID_ANY);
     if (m_animationCtrl->LoadFile(wxT("throbber.gif")))
         m_animationCtrl->Play();
 
     if (m_animationCtrl->LoadFile(wxT("throbber.gif")))
         m_animationCtrl->Play();
 
-    //sz->Add(m_animationCtrl, 1, wxGROW);
-
-    //SetSizer(sz);
+    sz->Add(m_animationCtrl, wxSizerFlags().Centre().Border());
+    SetSizer(sz);
 }
 
 MyFrame::~MyFrame()
 }
 
 MyFrame::~MyFrame()
@@ -154,7 +182,9 @@ MyFrame::~MyFrame()
 void MyFrame::OnPlay(wxCommandEvent& WXUNUSED(event))
 {
     if (!m_animationCtrl->Play())
 void MyFrame::OnPlay(wxCommandEvent& WXUNUSED(event))
 {
     if (!m_animationCtrl->Play())
+    {
         wxLogError(wxT("Invalid animation"));
         wxLogError(wxT("Invalid animation"));
+    }
 }
 
 void MyFrame::OnStop(wxCommandEvent& WXUNUSED(event))
 }
 
 void MyFrame::OnStop(wxCommandEvent& WXUNUSED(event))
@@ -162,6 +192,62 @@ void MyFrame::OnStop(wxCommandEvent& WXUNUSED(event))
     m_animationCtrl->Stop();
 }
 
     m_animationCtrl->Stop();
 }
 
+void MyFrame::OnSetNullAnimation(wxCommandEvent& WXUNUSED(event))
+{
+    m_animationCtrl->SetAnimation(wxNullAnimation);
+}
+
+void MyFrame::OnSetInactiveBitmap(wxCommandEvent& event)
+{
+    if (event.IsChecked())
+    {
+        // set a dummy bitmap as the inactive bitmap
+        wxBitmap bmp = wxArtProvider::GetBitmap(wxART_MISSING_IMAGE);
+        m_animationCtrl->SetInactiveBitmap(bmp);
+    }
+    else
+        m_animationCtrl->SetInactiveBitmap(wxNullBitmap);
+}
+
+void MyFrame::OnSetNoAutoResize(wxCommandEvent& event)
+{
+    // recreate the control with the new flag if necessary
+    long style = wxAC_DEFAULT_STYLE |
+                    (event.IsChecked() ? wxAC_NO_AUTORESIZE : 0);
+
+    if (style != m_animationCtrl->GetWindowStyle())
+    {
+        // save status of the control before destroying it
+        wxAnimation curr = m_animationCtrl->GetAnimation();
+        wxBitmap inactive = m_animationCtrl->GetInactiveBitmap();
+        wxColour bg = m_animationCtrl->GetBackgroundColour();
+
+        // destroy & rebuild
+        wxAnimationCtrl *old = m_animationCtrl;
+        m_animationCtrl = new wxAnimationCtrl(this, wxID_ANY, curr,
+                                              wxDefaultPosition, wxDefaultSize,
+                                              style);
+
+        GetSizer()->Replace(old, m_animationCtrl);
+        delete old;
+
+        // load old status in new control
+        m_animationCtrl->SetInactiveBitmap(inactive);
+        m_animationCtrl->SetBackgroundColour(bg);
+
+        GetSizer()->Layout();
+    }
+}
+
+void MyFrame::OnSetBgColor(wxCommandEvent& WXUNUSED(event))
+{
+    wxColour clr = wxGetColourFromUser(this, m_animationCtrl->GetBackgroundColour(),
+                                       wxT("Choose the background colour"));
+
+    if (clr.IsOk())
+        m_animationCtrl->SetBackgroundColour(clr);
+}
+
 void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
 {
     Close();
 void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
 {
     Close();
@@ -169,22 +255,22 @@ void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
 
 void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event) )
 {
 
 void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event) )
 {
-    /*
-
-    FIXME: on wxGTK at least using File->About command it shows
-    the message dialog but does not focus it
+    wxAboutDialogInfo info;
+    info.SetName(_("wxAnimationCtrl and wxAnimation sample"));
+    info.SetDescription(_("This sample program demonstrates the usage of wxAnimationCtrl"));
+    info.SetCopyright(wxT("(C) 2006 Julian Smart"));
 
 
-    */
+    info.AddDeveloper(wxT("Julian Smart"));
+    info.AddDeveloper(wxT("Guillermo Rodriguez Garcia"));
+    info.AddDeveloper(wxT("Francesco Montorsi"));
 
 
-    (void)wxMessageBox(_T("wxWidgets 2 Animation Demo\n")
-                       _T("Author: Julian Smart (c) 2001\n"),
-                       _T("About Animation Demo"));
+    wxAboutBox(info);
 }
 
 #if wxUSE_FILEDLG
 void MyFrame::OnOpen(wxCommandEvent& WXUNUSED(event))
 {
 }
 
 #if wxUSE_FILEDLG
 void MyFrame::OnOpen(wxCommandEvent& WXUNUSED(event))
 {
-    wxFileDialog dialog(this, _T("Please choose an animation"),
+    wxFileDialog dialog(this, wxT("Please choose an animation"),
                         wxEmptyString, wxEmptyString, wxT("*.gif;*.ani"), wxFD_OPEN);
     if (dialog.ShowModal() == wxID_OK)
     {
                         wxEmptyString, wxEmptyString, wxT("*.gif;*.ani"), wxFD_OPEN);
     if (dialog.ShowModal() == wxID_OK)
     {
@@ -195,7 +281,7 @@ void MyFrame::OnOpen(wxCommandEvent& WXUNUSED(event))
         if (m_animationCtrl->LoadFile(filename))
             m_animationCtrl->Play();
         else
         if (m_animationCtrl->LoadFile(filename))
             m_animationCtrl->Play();
         else
-            wxMessageBox(_T("Sorry, this animation is not a valid format for wxAnimation."));
+            wxMessageBox(wxT("Sorry, this animation is not a valid format for wxAnimation."));
 #else
     #if 0
         wxAnimation temp;
 #else
     #if 0
         wxAnimation temp;
@@ -226,6 +312,8 @@ void MyFrame::OnOpen(wxCommandEvent& WXUNUSED(event))
         m_animationCtrl->Play();
     #endif
 #endif
         m_animationCtrl->Play();
     #endif
 #endif
+
+        GetSizer()->Layout();
     }
 }
 #endif // wxUSE_FILEDLG
     }
 }
 #endif // wxUSE_FILEDLG
@@ -233,30 +321,7 @@ void MyFrame::OnOpen(wxCommandEvent& WXUNUSED(event))
 void MyFrame::OnUpdateUI(wxUpdateUIEvent& WXUNUSED(event) )
 {
     GetMenuBar()->FindItem(wxID_STOP)->Enable(m_animationCtrl->IsPlaying());
 void MyFrame::OnUpdateUI(wxUpdateUIEvent& WXUNUSED(event) )
 {
     GetMenuBar()->FindItem(wxID_STOP)->Enable(m_animationCtrl->IsPlaying());
-    GetMenuBar()->FindItem(wxID_PLAY)->Enable(!m_animationCtrl->IsPlaying());
+    GetMenuBar()->FindItem(ID_PLAY)->Enable(!m_animationCtrl->IsPlaying());
+    GetMenuBar()->FindItem(ID_SET_NO_AUTO_RESIZE)->Enable(!m_animationCtrl->IsPlaying());
 }
 
 }
 
-// ---------------------------------------------------------------------------
-// MyCanvas
-// ---------------------------------------------------------------------------
-
-BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow)
-    //EVT_PAINT(MyCanvas::OnPaint)
-END_EVENT_TABLE()
-
-// Define a constructor for my canvas
-MyCanvas::MyCanvas(wxWindow *parent, const wxPoint& pos, const wxSize& size)
-        : wxScrolledWindow(parent, -1, pos, size,
-                           wxSUNKEN_BORDER |
-                           wxNO_FULL_REPAINT_ON_RESIZE |
-                           wxVSCROLL | wxHSCROLL)
-{
-    SetBackgroundColour(wxColour(_T("YELLOW")));
-}
-
-void MyCanvas::OnPaint(wxPaintEvent& WXUNUSED(event))
-{
-    //wxPaintDC dc(this);
-
-    //dc.DrawRotatedText(wxT("Background"),
-}