[SOLVED] Dynamic Dropdown List

On 09/07/2018 at 21:02, xxxxxxxx wrote:

User Information:
Cinema 4D Version:   R18 
Platform:   Windows  ;   
Language(s) :     C++  ;

---------
Hi all,

I want to have a drop down list that I can change on the fly with user data. The list is a list of image extensions and I would like to allow users to put in there own custom extensions and then add this to this list.

The user clicks on custom, enters a custom extension and this is saved to a user configuration file (I have everything up to this point working fine). Where I'm stuck is how I can populate this list with the saved data so that the user can see their custom extensions each time they open a file.

You can see the code if that makes anything clearer on my GitHub page for the project, the files of interest here are SMDLoader.cpp/.h and fsmdloader.res

https://github.com/xNWP/Cinema-4D-Source-Tools

Thank you in advanced to anyone who can help point me in the right direction !!

On 09/07/2018 at 22:33, xxxxxxxx wrote:

Here's what I did to fill a dropdown box with filenames and a custom entry

Bool DisplayMode::GetDDescription(GeListNode* node, Description* description, DESCFLAGS_DESC& flags)  
{  
  if (!description->LoadDescription(DISPLAYMODE_DESC_PLUGIN_ID))  
      return false;  
  
    // === CHECKER ===   
  
  // fill the dropdown with all available checker types  
  const DescID *singleid = description->GetSingleDescID();  
  DescID cid = DescLevel(CHECKER_TYPE, DTYPE_LONG, 0);  
  if (!singleid || cid.IsPartOf(*singleid, nullptr)) // important to check for speedup c4d!  
  {  
      SortedStringArray checkerFilenames;  
      // read the available checker bitmap filenames
        {  
          ...   
      }  
  
      // add a fixed "Custom Checker" entry in the list,  
      // separated from the file entries  
      // (leave out separator when no file entries)  
      BaseContainer listBC;  
      listBC.SetString(CUSTOM_CHECKER_ID, "Custom Checker");  
      if (checkerFilenames.GetCount() > 0)  
          listBC.SetString(-1, ""); // separator  
  
      for (SortedStringArray::ConstIterator it = checkerFilenames.Begin(); it != checkerFilenames.End(); ++it)  
          listBC.SetString(Int32(it - checkerFilenames.Begin()), *it);  
        
      // add the items to the dropdown gadget  
      BaseContainer comboBC = GetCustomDataTypeDefault(DTYPE_LONG);  
        // re-use the original label from the description  
      {  
          BaseContainer* bc = description->GetParameterI(cid, nullptr);  
          comboBC.SetString(DESC_SHORT_NAME, bc->GetString(DESC_SHORT_NAME));  
      }  
      comboBC.SetInt32(DESC_ANIMATE, DESC_ANIMATE_OFF);  
      comboBC.SetContainer(DESC_CYCLE, listBC);  
  
        // store the data into the description  
      if (!description->SetParameter(cid, comboBC, DescLevel(0)))  
          return FALSE;  
  

On 10/07/2018 at 01:32, xxxxxxxx wrote:

Hello,

as C4DS showed, you can edit the parameter description of a NodeData based element by implementing GetDDescription(). There are multiple manuals and example available:

An example of editing a drop down list is found in sculptdeformer.cpp.

best wishes,
Sebastian

On 10/07/2018 at 15:52, xxxxxxxx wrote:

Thank-You both!

This has absolutely done the trick and is working flawlessly 🙂