THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 07/08/2005 at 00:17, xxxxxxxx wrote:
User Information:
Cinema 4D Version: 8.503
Platform: Windows ; Mac ; Mac OSX ;
Language(s) : C++ ;
---------
My plugin tag is creating a stack of CUSTOMGUI_REALSLIDERs which are dynamically added using GetDDescription(). I would like to add an "Edit" button (CUSTOMGUI_BUTTON) to the end of each slider.
Okay, so I first create a CUSTOMGUI_GROUP, uniquely indexed, with DESC_COLUMNS = 2. That puts the slider and button on the same line, but now the slider no longer has the nice grouping that it had without the button.
Here's the method called from GetDDescription() that recursively traverses children for a particular tag to add to the 'list' of sliders. Note: yes, the sliders are divided into foldable groups by object.
// Add Dial to DialGroup list - recursive
BOOL IPPDialGroup::AddDial(BaseDocument* baseDoc, BaseObject* obj, BaseObject* orig, BaseContainer* opBC, Description* description)
{
LONG nr;
PluginTag* pt;
BaseContainer* pbc;
BaseContainer grpBC, subgrpBC, sliderBC, editBC;
// Initialize
grpBC = GetCustomDataTypeDefault(DTYPE_GROUP);
subgrpBC = GetCustomDataTypeDefault(DTYPE_GROUP);
subgrpBC.SetLong(DESC_COLUMNS, 2);
sliderBC = GetCustomDataTypeDefault(DTYPE_REAL);
sliderBC.SetLong(DESC_CUSTOMGUI, CUSTOMGUI_REALSLIDER);
sliderBC.SetLong(DESC_UNIT, DESC_UNIT_REAL);
sliderBC.SetLong(DESC_ANIMATE, DESC_ANIMATE_ON);
sliderBC.SetBool(DESC_REMOVEABLE, FALSE);
editBC = GetCustomDataTypeDefault(DTYPE_BUTTON);
editBC.SetString(DESC_SHORT_NAME, "Edit");
editBC.SetLong(DESC_CUSTOMGUI, CUSTOMGUI_BUTTON);
editBC.SetLong(DESC_ANIMATE, DESC_ANIMATE_OFF);
editBC.SetBool(DESC_REMOVEABLE, FALSE);
for (obj; obj; obj = obj->GetNext())
{
// Add a foldable group - only if there are dial tags
if (obj->GetTag(ID_IPPDIALTAG))
{
grpBC.SetString(DESC_NAME, obj->GetName());
if(!description->SetParameter(DescLevel(group,DTYPE_GROUP,0), grpBC, DescLevel(GROUP_DIALS))) return FALSE;
// Add related Dials to DialGroup list
for (nr = 0; pt = (PluginTag* )obj->GetTag(ID_IPPDIALTAG, nr); nr++)
{
// Verify dial object
if (!(pbc = pt->GetDataInstance())) return FALSE;
if (pbc->GetObjectLink(IPPDIAL_OPOLYGON_LINK, baseDoc) != orig) continue;
// Create 2 Column Group for Slider and Button
if (!description->SetParameter(DescLevel(subgroup,DTYPE_GROUP,0), subgrpBC, DescLevel(group))) return FALSE;
// Create slider
sliderBC.SetString(DESC_NAME, pbc->GetString(IPPDIAL_FULLNAME));
sliderBC.SetString(DESC_SHORT_NAME, pt->GetName());
sliderBC.SetLong(DESC_PARENTID, group);
sliderBC.SetReal(DESC_MIN, pbc->GetReal(IPPDIAL_MIN));
sliderBC.SetReal(DESC_MAX, pbc->GetReal(IPPDIAL_MAX));
sliderBC.SetReal(DESC_STEP, pbc->GetReal(IPPDIAL_STEP));
if (!description->SetParameter(DescLevel(index,DTYPE_REAL,0), sliderBC, DescLevel(subgroup))) return FALSE;
// Create button
editBC.SetString(DESC_NAME, pbc->GetString(IPPDIAL_FULLNAME));
editBC.SetLong(DESC_PARENTID, group);
if (!description->SetParameter(DescLevel(button,DTYPE_BUTTON,0), editBC, DescLevel(subgroup))) return FALSE;
opBC->SetLink(dtag, pt);
opBC->SetReal(index, pbc->GetReal(IPPDIAL_CURRENTVALUE));
button++;
index++;
subgroup++;
dtag++;
}
group++;
}
// Handle children
if (!AddDial(baseDoc, obj->GetDown(), orig, opBC, description)) return FALSE;
}
return TRUE;
}
Thanks,