Opening dialog twice in a row doesn't work[SOLVED]

On 24/05/2016 at 16:42, xxxxxxxx wrote:

Hi! I've got a strange issue with modal dialogs and I can't find a workaround. Paste the following code into the Script Manager and run it. The dialog should pop up twice.

  
import c4d
  
class SubmitSummaryDialog(c4d.gui.GeDialog) :
  
    def __init__(self, job_id=None, title=None, kind='ok') :
        super(SubmitSummaryDialog, self).__init__()
        assert kind in ('ok', 'cancel', 'confirm')
        self.AddGadget(c4d.DIALOG_NOMENUBAR, 0)
        self.job_id = job_id
        self.title = title
        self.kind = kind; assert kind in ('ok', 'confirm')
        self.result = None
        self.messages = []
        self.update_gui = False
  
    def put(self, message, kind='message') :
        assert kind in ('message', 'section', 'close-section')
        if kind == 'message':
            message = '' + str(message)
        self.messages.append({'msg': str(message), 'kind': kind})
        self.update_gui = True
  
    def section(self, header) :
        self.put(header, kind='section')
  
    def close_section(self) :
        self.put('', kind='close-section')
  
    def copy(self) :
        obj = SubmitSummaryDialog(self.job_id, self.title, self.kind)
        obj.result = self.result
        obj.messages = self.messages
        obj.update_gui = False
        return obj
  
    def update(self) :
        # Helper function to start a new group.
        def group_begin(title=None, cols=1) :
            self.GroupBegin(0, c4d.BFH_SCALEFIT, cols=cols, title=title)
            self.GroupBorderSpace(10, 6, 10, 6)
            if title:
                self.GroupBorder(c4d.BORDER_WITH_TITLE_BOLD | c4d.BORDER_THIN_IN)
  
        self.LayoutFlushGroup(1000)
        group_begin(cols=3)
        in_section = False
        for data in self.messages:
            border = c4d.BORDER_NONE
            if data['kind'] == 'section':
                in_section = True
                self.GroupEnd()
                group_begin(data['msg'])
            elif data['kind'] == 'close-section':
                in_section = False
                self.GroupEnd()
                group_begin(cols=3)
            else:
                if in_section:
                    self.AddStaticText(0, c4d.BFH_SCALEFIT | c4d.BFV_CENTER, name=data['msg'])
                else:
                    # Without an item that scales completely, we can't use
                    # BFH_CENTER correctly, it'll just be aligned to the left.
                    self.AddStaticText(0, c4d.BFH_SCALEFIT)
                    self.AddStaticText(0, c4d.BFH_CENTER | c4d.BFV_CENTER, name=data['msg'])
                    self.AddStaticText(0, c4d.BFH_SCALEFIT)
        self.GroupEnd()
        self.LayoutChanged(1000)
        self.update_gui = False
  
    def CreateLayout(self) :
        self.SetTitle(self.title or self.job_id)
        self.GroupBorderSpace(4, 4, 4, 4)
        self.ScrollGroupBegin(0, c4d.BFH_SCALEFIT | c4d.BFV_SCALEFIT, c4d.SCROLLGROUP_VERT | c4d.SCROLLGROUP_AUTOVERT, inith=150)
        self.GroupBegin(1000, c4d.BFH_SCALEFIT | c4d.BFV_SCALEFIT, cols=1)
        self.GroupSpace(0, 6)
        self.update()
        self.GroupEnd()
        self.GroupEnd()
        self.GroupBegin(0, c4d.BFH_CENTER, rows=1)
        if self.kind == 'confirm':
            self.AddButton(c4d.DLG_OK, 0, name='Submit')
            self.AddButton(c4d.DLG_CANCEL, 0, name='Cancel')
        elif self.kind == 'ok':
            self.AddButton(c4d.DLG_OK, 0, name='OK')
        elif self.kind == 'cancel':
            self.AddButton(c4d.DLG_CANCEL, 0, name='Cancel')
        else:
            raise ValueError('invalid kind: {0!r}'.format(self.kind))
        self.GroupEnd()
        return True
  
    def Command(self, wid, bc) :
        if wid == c4d.DLG_OK:
            self.result = 'ok'
            self.Close()
        elif wid == c4d.DLG_CANCEL:
            self.result = 'cancel'
            self.Close()
        return True
  
    def CoreMessage(self, mid, bc) :
        if mid == c4d.EVMSG_CHANGE:
            if self.update_gui:
                self.update()
        return super(SubmitSummaryDialog, self).CoreMessage(mid, bc)
  
    def Open(self, dlgtype=c4d.DLG_TYPE_MODAL, **kwargs) :
        print(">>> SubmitSummaryDialog.Open()")
        # Only open if we have stuff to show.
        self.update_gui = True
        kwargs.setdefault('xpos', -1)
        kwargs.setdefault('ypos', -1)
        if self.messages:
            return super(SubmitSummaryDialog, self).Open(dlgtype, **kwargs)
        return True
  
s = SubmitSummaryDialog()
s.put("hello")
s.Open()
s.Open()

It does, but the second one has no content!

First:  Second:

How can I fix this?

Thanks! (PS: R16.050)

On 24/05/2016 at 20:14, xxxxxxxx wrote:

Don't you need to create a unique class instance for each dialog you open?

s = SubmitSummaryDialog()
s.put("hello")
s.Open()

s2 = SubmitSummaryDialog()
s2.put("hello")
s2.Open()

-ScottA

On 25/05/2016 at 01:57, xxxxxxxx wrote:

Hey Scott,

You're right, that works! And I actually tried that already (that's why there is a copy() method in the
class)! But when I did, the function that was opening the dialog was still referencing the original dialog
instance (not the second, new instance). After I sorted that out, it works. :)

Thanks for the hint!

Cheers,
-Niklas