Creating a Clickable Floating GUI Dialog?
-
Hi,
I have this old script that works well with
DLG_TYPE_MODAL_RESIZEABLE
but with this mode I am locked into the UI until I click exit. I wanted a floating dialog with whatDLG_TYPE_ASYNC
provides. The problem is the button does not work.When you click the button, a string is printed in the console.
Is there a way around this?
Thank you for looking at my problem.
You can see the code below:
import c4d from c4d import gui class Colorizer(gui.GeDialog): def CreateLayout(self): self.SetTitle('Colorizer') # Prepare a red bitmap for the button. w = 50 h = 50 bmpRed = c4d.bitmaps.BaseBitmap() bmpRed.Init(w, h) for y in xrange(w): for x in xrange(h): bmpRed.SetPixel(x, y, 255, 0, 0) # BitmapButton configuration bcBitmapButton = c4d.BaseContainer() bcBitmapButton[c4d.BITMAPBUTTON_BUTTON] = True # Add a BitmapButton to the dialog. # _bitmapButton is a member variable of the dialog class buttonId = 2000 _bitmapButton = self.AddCustomGui(buttonId, c4d.CUSTOMGUI_BITMAPBUTTON, "", c4d.BFH_CENTER|c4d.BFV_CENTER, w, h, bcBitmapButton) if _bitmapButton is None: print "Handle this error!" # Assign the image to the button. # Note: Let it create an internal copy as the created bitmap will be free'd, when scope is left. _bitmapButton.SetImage(bmpRed, True) def Command(self, id, msg): if id==2000: # corresponds to the button ID used in the code snippet in the first answer in this thread print "My Bitmap Button" return True def main(): dialog = Colorizer() dialog.Open(c4d.DLG_TYPE_ASYNC, defaultw=300,defaulth=100) #dialog.Open(c4d.DLG_TYPE_MODAL_RESIZEABLE, defaultw=300,defaulth=100) # Works but I can't click on the interface. Basically, I'm locked until I click exit. ' if __name__=='__main__': main()
-
Stupid me. I already asked the same question a year ago here:
https://developers.maxon.net/forum/topic/11472/dialogue-box-manager-through-plug-in-vs-vanilla-script/5Anyhow, for anyone interested on the working plug-in code. Here it is
import c4d from c4d import bitmaps, documents, gui, plugins, threading, utils PLUGIN_ID = 1011323 class MyDialog(gui.GeDialog): def CreateLayout(self): #self.SetTitle('Colorizer') # Prepare a red bitmap for the button. w = 50 h = 50 bmpRed = c4d.bitmaps.BaseBitmap() bmpRed.Init(w, h) for y in xrange(w): for x in xrange(h): bmpRed.SetPixel(x, y, 255, 0, 0) # BitmapButton configuration bcBitmapButton = c4d.BaseContainer() bcBitmapButton[c4d.BITMAPBUTTON_BUTTON] = True # Add a BitmapButton to the dialog. # _bitmapButton is a member variable of the dialog class buttonId = 2000 _bitmapButton = self.AddCustomGui(buttonId, c4d.CUSTOMGUI_BITMAPBUTTON, "", c4d.BFH_CENTER|c4d.BFV_CENTER, w, h, bcBitmapButton) if _bitmapButton is None: print "Handle this error!" # Assign the image to the button. # Note: Let it create an internal copy as the created bitmap will be free'd, when scope is left. _bitmapButton.SetImage(bmpRed, True) def Command(self, id, msg): if id==2000: # corresponds to the button ID used in the code snippet in the first answer in this thread print "My Bitmap Button" return True class MyMenuPlugin(plugins.CommandData): dialog = None def Execute(self, doc): # create the dialog if self.dialog is None: self.dialog = MyDialog() return self.dialog.Open(dlgtype=c4d.DLG_TYPE_ASYNC, pluginid=PLUGIN_ID, defaultw=200, defaulth=150, xpos=-1, ypos=-1) def RestoreLayout(self, sec_ref): # manage the dialog if self.dialog is None: self.dialog = MyDialog() return self.dialog.Restore(pluginid=PLUGIN_ID, secret=sec_ref) if __name__ == "__main__": okyn = plugins.RegisterCommandPlugin(PLUGIN_ID, "Cubey",0, None, "Cubey initialized", MyMenuPlugin()) if (okyn): print "Cubey initialized"