Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware 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
    • Register
    • Login

    Info for ITEMTREE/customgui_itemtree

    Cinema 4D SDK
    5
    8
    1.2k
    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.
    • K
      khor
      last edited by khor

      Hi guys,
      I'm curious if we have some guidance to show how to create/use "customgui_itemtree" UI as Volume Builder does it. I wish to make something simpler with checkbox+Enum UI as in picture at first. Any help please!
      a1.jpg
      Best,
      A.

      1 Reply Last reply Reply Quote 0
      • B
        bentraje
        last edited by

        I haven't used it as part of an object UI.
        So can't help there.

        But for the usage of the treeview, you can just this thread https://developers.maxon.net/forum/topic/10654/14102_using-customgui-listview
        There's a working plug in there.

        1 Reply Last reply Reply Quote 0
        • F
          Fritz
          last edited by Fritz

          GeData objListData = GeData(CUSTOMDATA_ITEMTREE, DEFAULTVALUE);
          ItemTreeData* volList = (ItemTreeData*)(objListData.GetCustomDataType(CUSTOMDATA_ITEMTREE));
          if (volList)
               volList->SetOwner((BaseList2D*)node);
          	
          bc.SetData(ID_VOLUMEBUILDER_OBJECT_LIST, objListData);
          

          this sets up the cgui_itemtree list. Important is to set the Owner, or many callbacks will not arrive the parent object.

          It's recommended to refresh this owner on "MSG_DESCRIPTION_POSTSETPARAMETER" and "MSG_DOCUMENTINFO_TYPE_SETACTIVE"message, because it happens that the information is lost

          #define BOOL_MODE_COLUMN ITEMTREE_USER_COL
          #define MIX_MODE_COLUMN ITEMTREE_USER_COL + 1
          #define MIXVECTOR_MODE_COLUMN ITEMTREE_USER_COL + 2
          #define CHILDTYPE_COLUMN ITEMTREE_USER_COL + 3
          #define SMOOTH_RADIUS_COLUMN ITEMTREE_USER_COL + 4
          
           BaseContainer* itreeui = description->GetParameterI(DescLevel(ID_VOLUMEBUILDER_OBJECT_LIST), arr);
          
          if (itreeui)
          {
          	_volMode = GetVolumeMode(bc);
          
          	BaseContainer userColTypes;
          	userColTypes.SetInt32(BOOL_MODE_COLUMN, LV_DROPDOWN);
          	userColTypes.SetInt32(MIX_MODE_COLUMN, LV_DROPDOWN);
          	userColTypes.SetInt32(MIXVECTOR_MODE_COLUMN, LV_DROPDOWN);
          	userColTypes.SetInt32(SMOOTH_RADIUS_COLUMN, LV_SLIDER);
          	itreeui->SetContainer(ITEMTREE_USER_COL_TYPES, userColTypes);
          
          	BaseContainer userColActive;
          	userColActive.SetBool(BOOL_MODE_COLUMN, _volMode == VOLUMEMODE::SDF);
          	userColActive.SetBool(MIX_MODE_COLUMN, _volMode == VOLUMEMODE::FOG);
          	userColActive.SetBool(MIXVECTOR_MODE_COLUMN, _volMode == VOLUMEMODE::VECTOR);
          	userColActive.SetBool(CHILDTYPE_COLUMN, true);
          	userColActive.SetBool(SMOOTH_RADIUS_COLUMN, _volMode == VOLUMEMODE::SDF);
          	itreeui->SetContainer(ITEMTREE_USER_COL_ACTIVE, userColActive);
          
          	itreeui->SetBool(ITEMTREE_CHECKBOX_FRONT, true);
          	BaseContainer thdata;
          
          	thdata.SetString(ITEMTREE_ENABLE_COL, ""_s);
          	thdata.SetString(ITEMTREE_OBJECT_COL, GeLoadString(IDS_VOLUMEBUILDERLIST_NAME));
          	thdata.SetString(BOOL_MODE_COLUMN, GeLoadString(IDS_VOLUMEBUILDERLIST_MODE));
          	thdata.SetString(MIX_MODE_COLUMN, GeLoadString(IDS_VOLUMEBUILDERLIST_MODE));
          	thdata.SetString(MIXVECTOR_MODE_COLUMN, GeLoadString(IDS_VOLUMEBUILDERLIST_MODE));
          	thdata.SetString(CHILDTYPE_COLUMN, GeLoadString(IDS_VOLUMEBUILDERLIST_INPUT_TYPE));
          	thdata.SetString(SMOOTH_RADIUS_COLUMN, GeLoadString(IDS_VOLUMEBUILDERLIST_SMOOTH_RADIUS));
          
          	itreeui->SetContainer(ITEMTREE_ID_HEADERS_DATA, thdata);
          
          	BaseContainer thids;
          	GeData columnId;
          	columnId.SetInt32(CHILDTYPE_COLUMN);
          	thids.SetData(CHILDTYPE_COLUMN, columnId);
          	itreeui->SetContainer(ITEMTREE_ID_HEADERS_IDS, thids);
          }
          

          thats the code in GetDDescription that sets up the UI with colums and header names and hides the columns that are not needed for the chosen mode.

          Every entry needs the dropdown data in the list added (recommended to do that in the itemtree callback ITEMTREE_CALLBACK_INSERTNODE). Here an example how the volume builder does it:

          inline BaseContainer BuildBoolCycleEntries()
          {
          	BaseContainer cyclebc;
          
          	cyclebc.InsData(ID_VOLUMEBUILDER_BOOL_UNION, GeLoadString(IDS_BOOL_UNION));
          	cyclebc.InsData(ID_VOLUMEBUILDER_BOOL_DIFF, GeLoadString(IDS_BOOL_DIFF));
          	cyclebc.InsData(ID_VOLUMEBUILDER_BOOL_INTERSECT, GeLoadString(IDS_BOOL_INTERSECT));
          	return cyclebc;
          }
          
          inline BaseContainer BuildBoolCycle()
          {
          	BaseContainer bc;
          	bc.SetContainer(DESC_CYCLE, BuildBoolCycleEntries());
          	return bc;
          }
          
          inline void AddDropdownDataToNode(ItemTreeNodeData& node)
          {
          	BaseContainer	cycleBoolBC = BuildBoolCycle();
          	cycleBoolBC.SetInt32(BOOL_MODE_COLUMN, ID_VOLUMEBUILDER_BOOL_UNION);
          
          	BaseContainer	cycleMixBC = BuildMixCycle();
          	cycleMixBC.SetInt32(MIX_MODE_COLUMN, ID_VOLUMEBUILDER_MIX_NORMAL);
          
          	BaseContainer	cycleMixVectorBC = BuildMixVectorCycle();
          	cycleMixVectorBC.SetInt32(MIXVECTOR_MODE_COLUMN, ID_VOLUMEBUILDER_MIXVECTOR_NORMAL);
          
          	BaseContainer nodeContainer;
          	nodeContainer.SetContainer(BOOL_MODE_COLUMN, cycleBoolBC);
          	nodeContainer.SetContainer(MIX_MODE_COLUMN, cycleMixBC);
          	nodeContainer.SetContainer(MIXVECTOR_MODE_COLUMN, cycleMixVectorBC);
          	nodeContainer.SetString(CHILDTYPE_COLUMN, ""_s);
          	node.m_Data.SetContainer(nodeContainer);
          }
          

          in the resource file the UI element needs to be set up correctly:

          ITEMTREE ID_VOLUMEBUILDER_OBJECT_LIST 
          { 
          	ANIM ON; // animation is allowed
          	NEWLINE; // the name of the UI element is above the ui element
          	HEADERS; // shows the header bar
          	MULTIPLE; // allows multiselect of entries
          	COLUMNS 7; // amount of columns
          	CHECKBOX; // checkbox added in the list
          	FOLDERS; // parent folders can be created
          	DRAGDROP; // drag & drop callbacks are send and d&d is allowed
          	ICON; // entries are shown with icons
          	NO_MENU; // no right click menu
          	ACCEPT // what types are accepted in the list
          	{ 
          		Obase;
          		1001381; //TP GROUP
          	}
          }
          

          Hope this helps

          Regards
          Fritz

          1 Reply Last reply Reply Quote 0
          • K
            khor
            last edited by

            Hey guys,
            Thanks for replies, I'll give some try as advice of Fritz at first. I definitely need it inside object UI, by C++

            1 Reply Last reply Reply Quote 0
            • B
              bentraje
              last edited by

              @khor

              this is a bit old but I guess this can server as an additional resource
              https://c4dprogramming.wordpress.com/2012/11/25/treeview-made-simple-part-1/

              K 1 Reply Last reply Reply Quote 0
              • K
                khor @bentraje
                last edited by

                @bentraje said in Info for ITEMTREE/customgui_itemtree:

                @khor

                this is a bit old but I guess this can server as an additional resource
                https://c4dprogramming.wordpress.com/2012/11/25/treeview-made-simple-part-1/

                Thanks, but it's not what I'm looking for!

                1 Reply Last reply Reply Quote 0
                • K
                  khor
                  last edited by

                  Hi @Fritz,
                  There are some missing bricks: definition for ItemTreeNodeData. I cannot find it in anywhere and how can we catch/register callbacks for itemtree to use ITEMTREE_CALLBACK_INSERTNODE?

                  1 Reply Last reply Reply Quote 0
                  • M
                    m_adam
                    last edited by

                    Hi @khor unfortunately Fritz is in holiday, but from what I see this is not possible since few types are not public.

                    I will confirm with him when he will be back, in the meantime I wish you a nice Christmas.
                    Cheers,
                    Maxime.

                    MAXON SDK Specialist

                    Development Blog, MAXON Registered Developer

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