Dialog in a dialog



  • On 25/03/2013 at 07:35, xxxxxxxx wrote:

    I'm tring to open a 2nd (modal) dialog in another dialog.
    It works ok, until I close and re-open the plugin with the dialog.
    Then an incorrect dialog is displayed and later Cinema 4d crashes.
    It seems that i do not restore correctly?

      
      
    import c4d  
    import os  
    from c4d import gui, plugins, bitmaps, utils, documents  
      
    PLUGIN_ID = 1011310 # Test ID  
      
    MY_CITY             = 11001  
    MY_BUTTON           = 11004  
      
    class MyDialog2(gui.GeDialog) :  #2nd (modal) dialog  
      
      def CreateLayout(self) :  
          self.GroupBegin(id=1011, flags=c4d.BFH_FIT, cols=2)   
          self.element = self.AddStaticText(id=1003, flags=c4d.BFH_LEFT, initw=100, name="City")  
          self.AddEditText(MY_CITY, c4d.BFH_SCALEFIT, 100, 0)  
          self.GroupEnd()      
            
          self.GroupBegin(id=1013, flags=c4d.BFH_SCALEFIT, cols=1)  
          self.AddButton(MY_BUTTON, c4d.BFV_MASK, initw=100, name="Done")  
          self.GroupEnd()  
          return True    
            
            
      def Command(self, id, msg) :        
          if (id == MY_BUTTON) :  
              print "city: ", self.GetString (MY_CITY)  
              self.Close()  
              return True  
          return True          
            
    class MyDialog(gui.GeDialog) : #main dialog  
      
      def CreateLayout(self) :  
          self.GroupBegin(id=1013, flags=c4d.BFH_SCALEFIT, cols=1)  
          self.AddButton(MY_BUTTON, c4d.BFV_MASK, initw=100, name="Goto 2nd dialog")  
          self.GroupEnd()  
          return True      
      
      def Command(self, id, msg) :        
          if (id == MY_BUTTON) :  
              self.dialog2 = MyDialog2()  #init and open 2nd dialog  
              self.dialog2.Open(dlgtype=c4d.DLG_TYPE_MODAL, pluginid=PLUGIN_ID, defaultw=200, defaulth=150, xpos=-1, ypos=-1)  
              return True  
          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()  
         print "Restore."  
         return self.dialog.Restore(pluginid=PLUGIN_ID, secret=sec_ref)  
           
    if __name__ == "__main__":  
      
     path, fn = os.path.split(__file__)  
     bmp = bitmaps.BaseBitmap()                                   
     bmp.InitWith(os.path.join(path, "res/icons/", "icon.tif"))   
      
     okyn = plugins.RegisterCommandPlugin(PLUGIN_ID, "OSM",0, bmp, "OSM", MyMenuPlugin())    
     if (okyn) :   
      print "Initialized."  
      
    


  • On 25/03/2013 at 07:40, xxxxxxxx wrote:

    Hi.

    Pass the pluginid to a dialog only for the dialog that belongs to the CommandData itself. It is
    also only necessary when you want to restore the dialog (in CommandData.Restore()) which in
    turn only works for asynchronous dialogs.

    Remove the pluginid=PLUGIN_ID from the Open() call of your second dialog.

    -Niklas



  • On 26/03/2013 at 12:07, xxxxxxxx wrote:

    Yes, it works!
    Thank you.
    I'll put it in a tutorial including your remarks.


Log in to reply