Dialog Group change width
-
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,
-
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,