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