Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    Dialog Group change width

    Scheduled Pinned Locked Moved SDK Help
    2 Posts 0 Posters 259 Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H Offline
      Helper
      last edited by

      THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

      On 10/04/2007 at 17:57, xxxxxxxx wrote:

      User Information:
      Cinema 4D Version:   R8.2-R10 
      Platform:   Windows  ; Mac  ;  Mac OSX  ; 
      Language(s) :     C++  ;

      ---------
      This is my code for updating a dynamic 'thumbnail' scroll group. In CreateThumbnailGroup(), you'll see that I prepass the folder items to get the maximum width for the ScrollGroup GROUP_THUMBNAIL_SCROLL. Of course, this endeavor doubles the time it takes to load all of the bitmaps (as they are loaded twice - once for calculation, once to set the BitmapButton). Is there any way that the group's width could be set after the fact to avoid the prepass? Or would you suggest just getting the count of elements that 'might' have a bitmap and preallocating an array of BaseBitmap which is then disposed of upon exiting CreateThumbnailGroup()?

      // Relayout Thumbnail Group  
      //*---------------------------------------------------------------------------*  
      Bool IPPDialog::LayoutThumbnailGroup()  
      //*---------------------------------------------------------------------------*  
      {  
           if (functableExplorer.inDragMode())     return TRUE;  
        
           SetMousePointer(MOUSE_BUSY);  
           LayoutFlushGroup(GROUP_THUMBNAIL);  
           CreateThumbnailGroup(FALSE);  
           LayoutChanged(GROUP_THUMBNAIL);  
           SetMousePointer(MOUSE_NORMAL);  
        
           // Reset ScrollArea to top/center  
           LONG     x;  
           GetVisibleArea(GROUP_THUMBNAIL_SCROLL, &x;, &thumb;_y1, &thumb;_x2, &thumb;_y2);  
           SetVisibleArea(GROUP_THUMBNAIL_SCROLL, 0, 0, thumb_x2-x, thumb_y2-thumb_y1);  
        
           return TRUE;  
      }  
      // Create Thumbnail Group of BitmapButtons  
      //*---------------------------------------------------------------------------*  
      Bool IPPDialog::CreateThumbnailGroup(BOOL inittg)  
      //*---------------------------------------------------------------------------*  
      {  
           // Fully Collapse Thumbnail Group  
           if (thumbColumns == 0)  
           {  
                // ScrollGroup to handle long file names  
                ScrollGroupBegin(GROUP_THUMBNAIL_SCROLL,BFH_CENTER|BFV_SCALEFIT,SCROLLGROUP_NOSCROLLER,1,0);  
                GroupEnd();  
                return TRUE;  
           }  
        
           // Get Widest Thumbnail Image  
           LONG     w;  
           folder =               root.GetSelectedFolder();  
           if (folder && settings->GetAutoThumbWidth() && !inittg)  
           {  
                LONG     thumbWidth =     91;  
                w =                             91;  
                for (RuntimeItem* item = folder->GetChild(); item; item = item->GetNext())  
                {  
                     if (item->IsTypeOf(ITEMTYPE_FOLDER))     continue;  
                     iconType =                                        item->GetIconType();  
                     if (iconType < RTICON_RSR)                    continue;  
                     if (iconType > RTICON_FORK)  
                     {  
                          bitmap->Init(item->GetIcon());  
                          w =     bitmap->GetBw();  
                          bitmap->FlushAll();  
                          if (w > thumbWidth)     thumbWidth =     w;  
                     }  
                     else if (ReadRSR(item))  
                     {  
                          bitmap->Init(tmpthumbFN);  
                          w =     bitmap->GetBw();  
                          bitmap->FlushAll();  
                          if (w > thumbWidth)     thumbWidth =     w;  
                     }  
                     clipmap->BeginDraw();  
                     w =     clipmap->TextWidth(item->GetDisplayName());  
                     clipmap->EndDraw();  
                     if (w > thumbWidth)     thumbWidth =     w;  
                }  
                clipmap->BeginDraw();  
                w =     clipmap->TextWidth(GeLoadString(IPPS_THUMBNAILS)+" [Cols: "+LongToString(thumbColumns)+"]");  
                clipmap->EndDraw();  
                if (w > thumbWidth)     w = SizePix(w+12);  
                else                    w =     SizePix(thumbWidth+12);  
           }  
           else  
           {  
                clipmap->BeginDraw();  
                w =     clipmap->TextWidth(GeLoadString(IPPS_THUMBNAILS)+" [Cols: "+LongToString(thumbColumns)+"]");  
                clipmap->EndDraw();  
                if (w <= 91)     w = SizePix(103);  
                else               w =     SizePix(w+12);  
           }  
        
           // ScrollGroup to handle long file names  
           ScrollGroupBegin(GROUP_THUMBNAIL_SCROLL,BFH_CENTER|BFV_SCALEFIT,SCROLLGROUP_HORIZ|SCROLLGROUP_VERT|SCROLLGROUP_BORDERIN,w*thumbColumns,0);  
           if (inittg || !folder)  
           {  
                GroupEnd();  
                return TRUE;  
           }  
           // Interior Group to handle gridding of multiple columns  
           GroupBegin(GROUP_THUMBNAIL_INTERIOR,BFH_CENTER|BFV_SCALEFIT,thumbColumns,0,blankStr,BFV_GRIDGROUP_EQUALCOLS|BFV_GRIDGROUP_EQUALROWS);  
        
           StopAllThreads();  
        
           UINT     poserType =     folder->GetPoserType();  
           // v1.4.3: For Materials library, skip Frame check  
           if (poserType == POSERTYPE_MATERIAL)  
           {  
                LONG     id;  
                // Folder's Thumbnails  
                for (RuntimeItem* item = folder->GetChild(); item; item = item->GetNext())  
                {  
                     if (item->IsTypeOf(ITEMTYPE_FOLDER))     continue;  
                     iconType =                                        item->GetIconType();  
                     if (iconType == RTICON_NONE)               continue;  
                     id =                                             item->GetID();  
                     // BitMap Button  
                     bmbutton =          (BitmapButtonCustomGui* )AddCustomGui(id,CUSTOMGUI_BITMAPBUTTON,blankStr,BFH_CENTER|BFV_CENTER,thumb_x1,thumb_x1,thumb_bc);  
                     if (!bmbutton)     return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_MEMORY_TEXT), "IPPDialog.CreateThumbnailGroup.bmbutton");  
                     // Group for thumbnail and text  
                     GroupBegin(0,BFH_CENTER|BFV_TOP,0,2,blankStr,0);  
                     GroupBorderSpace(4,4,4,4);  
                     if (iconType > RTICON_FORK)  
                     {  
      #ifdef     XCODE  
                          // v1.2.2:     Fix for masked PNG images in UB plugin  
                          if (iconType == RTICON_PNG)  
                          {  
                               bitmap->Init(item->GetIcon());  
                               bitmap->RemoveChannel(bitmap->GetChannelNum(0));  
                               bmbutton->SetImage(bitmap, TRUE, FALSE);  
                               bitmap->FlushAll();  
                          }  
                          else bmbutton->SetImage(item->GetIcon());  
      #else  
                          bmbutton->SetImage(item->GetIcon());  
      #endif  
                     }  
                     else if (ReadRSR(item))  
                     {  
                          bitmap->Init(tmpthumbFN);  
                          bitmap->RemoveChannel(bitmap->GetChannelNum(0));  
                          bmbutton->SetImage(bitmap, TRUE, FALSE);  
                          bitmap->FlushAll();  
                     }  
                     else  
                     {  
                          item->SetIconType(RTICON_BLANK);  
                          bmbutton->SetImage(nothumbBitmap, FALSE, FALSE);  
                     }  
                     // Item Name  
                     //AddStaticText(0,flags,0,0,item->GetDisplayName(),BORDER_NONE);  
                     AddButton(-id, BFH_CENTER|BFV_CENTER, 0, 0, item->GetDisplayName());  
                     GroupEnd();  
                }  
           }  
           else  
           {  
                String     ttitle;  
                LONG     id;  
                ippLoader.InitKeyCount(poserType);  
                // Folder's Thumbnails  
                for (RuntimeItem* item = folder->GetChild(); item; item = item->GetNext())  
                {  
                     if (item->IsTypeOf(ITEMTYPE_FOLDER))     continue;  
                     iconType =                                        item->GetIconType();  
                     if (iconType == RTICON_NONE)               continue;  
                     id =                                             item->GetID();  
                     // BitMap Button  
                     bmbutton =          (BitmapButtonCustomGui* )AddCustomGui(id,CUSTOMGUI_BITMAPBUTTON,blankStr,BFH_CENTER|BFV_CENTER,thumb_x1,thumb_x1,thumb_bc);  
                     if (!bmbutton)     return ErrorException::Throw(EE_DIALOG, GeLoadString(IPPERR_MEMORY_TEXT), "IPPDialog.CreateThumbnailGroup.bmbutton");  
                     // Group for thumbnail and text  
                     GroupBegin(0,BFH_CENTER|BFV_TOP,0,2,blankStr,0);  
                     GroupBorderSpace(4,4,4,4);  
                     if (iconType > RTICON_FORK)  
                     {  
      #ifdef     XCODE  
                          // v1.2.2:     Fix for masked PNG images in UB plugin  
                          if (iconType == RTICON_PNG)  
                          {  
                               bitmap->Init(item->GetIcon());  
                               bitmap->RemoveChannel(bitmap->GetChannelNum(0));  
                               bmbutton->SetImage(bitmap, TRUE, FALSE);  
                               bitmap->FlushAll();  
                          }  
                          else bmbutton->SetImage(item->GetIcon());  
      #else  
                          bmbutton->SetImage(item->GetIcon());  
      #endif  
                     }  
                     else if (ReadRSR(item))  
                     {  
                          bitmap->Init(tmpthumbFN);  
                          bitmap->RemoveChannel(bitmap->GetChannelNum(0));  
                          bmbutton->SetImage(bitmap, TRUE, FALSE);  
                          bitmap->FlushAll();  
                     }  
                     else  
                     {  
                          item->SetIconType(RTICON_BLANK);  
                          bmbutton->SetImage(nothumbBitmap, FALSE, FALSE);  
                     }  
                     // Item Name - Get Frames for animated poses  
                     ttitle =     item->GetDisplayName()+ippLoader.ParseKeyCount(item->GetFilename());  
                     //AddStaticText(0,flags,0,0,ttitle,BORDER_NONE);  
                     AddButton(-id, BFH_CENTER|BFV_CENTER, 0, 0, ttitle);  
                     GroupEnd();  
                     ippLoader.FlushSimple();  
                }  
                ippLoader.FlushTemp();  
           }  
        
           GroupEnd();     // Interior Group  
           GroupEnd();     // Scroll Group  
        
           // Add "Save Pose" button to bottom of Thumbnails group  
           switch (poserType)  
           {  
                case POSERTYPE_POSE:  
                case POSERTYPE_FACE:  
                case POSERTYPE_HAND:  
                case POSERTYPE_CAMERA:  
                case POSERTYPE_LIGHT:  
                case POSERTYPE_MATERIAL:  
                     GroupBegin(0L,BFH_CENTER|BFV_BOTTOM,2,2,blankStr,BFV_GRIDGROUP_EQUALCOLS|BFV_GRIDGROUP_EQUALROWS);  
                          AddButton(IP_RUNTIME_ADDPOSE,     BFH_LEFT|BFV_CENTER, 0, 0, String("+"));  
                          AddStaticText(0, BFH_LEFT|BFV_CENTER, 0, 0, GeLoadString(IPPS_RUNTIME_ADDPOSE), BORDER_NONE);  
                          AddButton(IP_RUNTIME_REMPOSE,     BFH_LEFT|BFV_CENTER, 0, 0, String("-"));  
                          AddStaticText(0, BFH_LEFT|BFV_CENTER, 0, 0, GeLoadString(IPPS_RUNTIME_REMPOSE), BORDER_NONE);  
                     GroupEnd();  
                     break;  
                case POSERTYPE_FIGURE:  
                case POSERTYPE_HAIR:  
                case POSERTYPE_PROP:  
                     GroupBegin(0L,BFH_CENTER|BFV_BOTTOM,2,0,blankStr,BFV_GRIDGROUP_EQUALCOLS|BFV_GRIDGROUP_EQUALROWS);  
                          AddButton(IP_RUNTIME_REMPOSE,     BFH_LEFT|BFV_CENTER, 0, 0, String("-"));  
                          AddStaticText(0, BFH_LEFT|BFV_CENTER, 0, 0, GeLoadString(IPPS_RUNTIME_REMPOSE), BORDER_NONE);  
                     GroupEnd();  
                default:  
                     break;  
           };  
        
           StatusClear();  
           return TRUE;  
      }
      

      Thanks,

      1 Reply Last reply Reply Quote 0
      • H Offline
        Helper
        last edited by

        THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

        On 11/04/2007 at 23:56, xxxxxxxx wrote:

        To respond to this myself, I could not find a way to 'reset' the ScrollGroup width after the fact. There might be a way, but the docs are inprecise about how this could be done.

        Instead, the BaseBitmap array was used to store all of the bitmaps during the width calculation phase and then these set to the BitmapButtons instead of reconstructing the image path and reloading the image into a generic bitmap. This means that the width calculation variation is about as fast as the non-calculation instead of taking twice the time.

        That's about as good as it gets. Now if the developers would make image loading into bitmaps a little faster (as that is my main bottleneck here from testing) users of my plugin would be elated. 🙂

        Thanks,

        1 Reply Last reply Reply Quote 0
        • First post
          Last post