Fill GeDialog combo box dynamically ?

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

On 12/12/2012 at 09:42, xxxxxxxx wrote:

INFO : C4d r14, Windows Vista 64, Python

hm,

sorry it is me again 🙂 Is it possible possible to fill a GeDialog ComboBox dynamically with
children / entries after the execution of GeDialog.CreateLayout() ? I have got the 
following :

    # dialogContainer is a BaseContainer containg the current dialog settings
    # self.Presets is a BaseContainer containing several Bc of the same structure
    # cHelp is a namespace to some c4d related methods. the whole chain is called
    # from GeDialog.Command() :
    #
    # the bc is saved to file ...
    # --------------------------------------------------------------------------------------------------------------	
    def savePreset(self, dialogContainer) :
        presetName = c4d.gui.InputDialog('Preset name:','myPreset {0}'.format(len(self.Presets)))
        dialogContainer.SetString(1000, presetName)
        self.Presets.SetContainer(1000 + len(self.Presets), dialogContainer)
        result = cHelp.SaveHyperFile(self.Presets, self.PresetFilePath, self.HyperKey, True)
        if(result) :
            self.fillComboBox()
            print self.SetLong(srCon.IDC_PRESET_COMBOBOX, len(self.Presets))
        return result
    
    # and loaded back here. the ccombox is populated with the new preset names
    # --------------------------------------------------------------------------------------------------------------	
    def fillComboBox(self) :
        result = cHelp.ReadHyperFile(self.PresetFilePath, self.HyperKey, True)
	if(type(result) == c4d.BaseContainer) :
		self.Presets = result
        	self.FreeChildren(srCon.IDC_PRESET_COMBOBOX)
        	counter = 0
        	for item in self.Presets:
	    		# here i am adding the children, and trying to tell c4d that something had changed.
	    		# had the flush and changed thingie on a higher level first, but then moved them here 
            		# to be ultrasafe.
            		self.LayoutFlushGroup(srCon.IDC_PRESET_COMBOBOX)
            		self.AddChild(srCon.IDC_PRESET_COMBOBOX , counter, item[1].GetString(1000))
            		self.LayoutChanged(srCon.IDC_PRESET_COMBOBOX)
		return True
	else:
		return False
  

I am feeling pretty lazzy for just asking again, but i am not sure what is going wrong there.
When i execute the plugin, everything works as expected. I save the dialog settings to a
hyper file and load the content back from the hyperfile. The combobox is also populated as
expected with my preset names, BUT i cannot visually select anything except the first child.
Programmatically i can set the combobox to any value i want and is also accepted and
returned correctly (but also not reflected in the gui).

thanks for your help, as always.

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

On 13/12/2012 at 02:54, xxxxxxxx wrote:

Have you tried removing the calls to LayoutFlushGroup() and LayoutChanged()?

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

On 13/12/2012 at 04:41, xxxxxxxx wrote:

Originally posted by xxxxxxxx

Have you tried removing the calls to LayoutFlushGroup() and LayoutChanged()?

do you mean this in in a special context ? because i am calling both in my fillComboBox() 
loop for each preset found and added, as shown in the snippet. also i am not quite
sure if i am qusing them both correctly. do they actually expect a group ? i am just
passing the ComboBox.

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

On 13/12/2012 at 05:39, xxxxxxxx wrote:

Originally posted by xxxxxxxx

# and loaded back here. the ccombox is populated with the new preset names
    # --------------------------------------------------------------------------------------------------------------
    def fillComboBox(self) :
        result = cHelp.ReadHyperFile(self.PresetFilePath, self.HyperKey, True)
if(type(result) == c4d.BaseContainer) :
self.Presets = result
        self.FreeChildren(srCon.IDC_PRESET_COMBOBOX)
        counter = 0
        for item in self.Presets:
    # here i am adding the children, and trying to tell c4d that something had changed.
    # had the flush and changed thingie on a higher level first, but then moved them here 
            # to be ultrasafe.
            self.LayoutFlushGroup(srCon.IDC_PRESET_COMBOBOX)
            self.AddChild(srCon.IDC_PRESET_COMBOBOX , counter, item[1].GetString(1000))
            self.LayoutChanged(srCon.IDC_PRESET_COMBOBOX)
return True
else:
return False

It seems you return True from inside the loop. This is maybe why you can only select the first child.

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

On 13/12/2012 at 05:52, xxxxxxxx wrote:

sorry about that, that is just a typo I introduced, because the copy/paste messed up 
the indentions (if the true would be there the combobox wouldn always just contain
one element , but i have all elements, but i can just select the first).

before :

selection:

after :

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

On 13/12/2012 at 06:51, xxxxxxxx wrote:

lol stupid me, if forgot to increase my counter variable and therefor all entries have the same
ID 🙂