]> git.saurik.com Git - wxWidgets.git/commitdiff
Applied patch to add n bitmaps at once to an image
authorRobert Roebling <robert@roebling.de>
Sun, 30 Apr 2006 11:58:40 +0000 (11:58 +0000)
committerRobert Roebling <robert@roebling.de>
Sun, 30 Apr 2006 11:58:40 +0000 (11:58 +0000)
    list of the bitmap is n times as wide as the
    image width of the image list. This was the case
    in the MSW image list before.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@38965 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/latex/wx/imaglist.tex
include/wx/mac/carbon/imaglist.h
src/generic/imaglist.cpp
src/mac/carbon/imaglist.cpp

index 62b41b6e13f78a6cc26276f3b8b446875b565f8b..6b71f3a53e303337d6cd901c3df4c8bedf3c31de 100644 (file)
@@ -51,11 +51,11 @@ Constructor specifying the image size, whether image masks should be created, an
 
 \func{int}{Add}{\param{const wxBitmap\&}{ bitmap}, \param{const wxBitmap\&}{ mask = wxNullBitmap}}
 
-Adds a new image using a bitmap and optional mask bitmap.
+Adds a new image or images using a bitmap and optional mask bitmap.
 
 \func{int}{Add}{\param{const wxBitmap\&}{ bitmap}, \param{const wxColour\&}{ maskColour}}
 
-Adds a new image using a bitmap and mask colour.
+Adds a new image or images using a bitmap and mask colour.
 
 \func{int}{Add}{\param{const wxIcon\&}{ icon}}
 
@@ -79,6 +79,8 @@ The new zero-based image index.
 
 The original bitmap or icon is not affected by the {\bf Add} operation, and can be deleted afterwards.
 
+If the bitmap is wider than the images in the list, then the bitmap will automatically be split into smaller images, each matching the dimensions of the image list.  This does not apply when adding icons.
+
 \pythonnote{In place of a single overloaded method name, wxPython
 implements the following methods:\par
 \indented{2cm}{\begin{twocollist}
index 46205100cf73f6972ee35de0d1debb0f8883c27d..2877432b26091d4c52b13d057c5e04815f4d93bf 100644 (file)
@@ -70,6 +70,7 @@ public:
     wxIcon GetIcon(int index) const;
     bool Replace( int index, const wxIcon &bitmap );
     bool Replace( int index, const wxBitmap &bitmap );
+    bool Replace( int index, const wxBitmap &bitmap, const wxBitmap &mask );
     bool Remove( int index );
     bool RemoveAll();
     
index 5f342b70c4dae45be4cd54c3068ff005957a1cb5..70e0ee492ef69e6c7f8bfd5387d5dfe7e1814814 100644 (file)
@@ -69,15 +69,34 @@ bool wxGenericImageList::Create()
 
 int wxGenericImageList::Add( const wxBitmap &bitmap )
 {
-    wxASSERT_MSG( (bitmap.GetWidth() == m_width && bitmap.GetHeight() == m_height)
+    wxASSERT_MSG( (bitmap.GetWidth() >= m_width && bitmap.GetHeight() == m_height)
                   || (m_width == 0 && m_height == 0),
                   _T("invalid bitmap size in wxImageList: this might work ")
                   _T("on this platform but definitely won't under Windows.") );
 
     if (bitmap.IsKindOf(CLASSINFO(wxIcon)))
+    {
         m_images.Append( new wxIcon( (const wxIcon&) bitmap ) );
+    }
     else
-        m_images.Append( new wxBitmap(bitmap) );
+    {
+        // Mimic behavior of Windows ImageList_Add that automatically breaks up the added
+        // bitmap into sub-images of the correct size
+        if (m_width > 0 && bitmap.GetWidth() > m_width && bitmap.GetHeight() >= m_height)
+        {
+            int numImages = bitmap.GetWidth() / m_width;
+            for (int subIndex = 0; subIndex < numImages; subIndex++)
+            {
+                wxRect rect(m_width * subIndex, 0, m_width, m_height);
+                wxBitmap tmpBmp = bitmap.GetSubBitmap(rect);
+                m_images.Append( new wxBitmap(tmpBmp) );
+            }
+        }
+        else
+        {
+            m_images.Append( new wxBitmap(bitmap) );
+        }
+    }
 
     if (m_width == 0 && m_height == 0)
     {
index 403567198e676bcc64a8b452e6723efdbd06135e..f97e0715ac21a285194b429b5a739ae0daeb456d 100644 (file)
@@ -71,19 +71,34 @@ int wxImageList::Add( const wxIcon &bitmap )
 
 int wxImageList::Add( const wxBitmap &bitmap )
 {
-    wxASSERT_MSG( (bitmap.GetWidth() == m_width && bitmap.GetHeight() == m_height)
+    wxASSERT_MSG( (bitmap.GetWidth() >= m_width && bitmap.GetHeight() == m_height)
                   || (m_width == 0 && m_height == 0),
                   _T("invalid bitmap size in wxImageList: this might work ")
                   _T("on this platform but definitely won't under Windows.") );
-
-    m_images.Append( new wxBitmap( bitmap ) );
+                  
+    // Mimic behavior of Windows ImageList_Add that automatically breaks up the added
+    // bitmap into sub-images of the correct size
+    if (m_width > 0 && bitmap.GetWidth() > m_width && bitmap.GetHeight() >= m_height)
+    {
+        int numImages = bitmap.GetWidth() / m_width;
+        for (int subIndex = 0; subIndex < numImages; subIndex++)
+        {
+            wxRect rect(m_width * subIndex, 0, m_width, m_height);
+            wxBitmap tmpBmp = bitmap.GetSubBitmap(rect);
+            m_images.Append( new wxBitmap(tmpBmp) );
+        }
+    }
+    else
+    {
+        m_images.Append( new wxBitmap(bitmap) );
+    }
 
     if (m_width == 0 && m_height == 0)
     {
         m_width = bitmap.GetWidth();
         m_height = bitmap.GetHeight();
     }
-
+    
     return m_images.GetCount() - 1;
 }
 
@@ -191,6 +206,34 @@ bool wxImageList::Replace( int index, const wxIcon &bitmap )
     return true;
 }
 
+bool wxImageList::Replace( int index, const wxBitmap &bitmap, const wxBitmap &mask )
+{
+    wxList::compatibility_iterator node = m_images.Item( index );
+
+    wxCHECK_MSG( node, false, wxT("wrong index in image list") );
+
+    wxBitmap* newBitmap = new wxBitmap(bitmap);
+
+    if (index == (int) m_images.GetCount() - 1)
+    {
+        delete node->GetData();
+        m_images.Erase( node );
+        m_images.Append( newBitmap );
+    }
+    else
+    {
+        wxList::compatibility_iterator next = node->GetNext();
+        delete node->GetData();
+        m_images.Erase( node );
+        m_images.Insert( next, newBitmap );
+    }
+    
+    if (mask.Ok())
+        newBitmap->SetMask(new wxMask(mask));
+
+    return true;
+}
+
 bool wxImageList::Remove( int index )
 {
     wxList::compatibility_iterator node = m_images.Item( index );