Author: bugman Date: Wed Feb 4 16:19:54 2015 New Revision: 27513 URL: http://svn.gna.org/viewcvs/relax?rev=27513&view=rev Log: Fix for GUI wizards and GUI user functions. The recent memory management changes caused the wizard windows to have an incorrect layout so that the wizard pages were not visible. Reperforming a layout of the GUI elements did not help. The solution is to not initialise sets of max_pages of wx.BoxSizer elements in the wizard __init__() method, but to generate and append these dynamically via the add_page() method. The change now means that there are no longer multiple unused wx.BoxSizer instances generated for each wizard window created. Modified: trunk/gui/wizards/wiz_objects.py Modified: trunk/gui/wizards/wiz_objects.py URL: http://svn.gna.org/viewcvs/relax/trunk/gui/wizards/wiz_objects.py?rev=27513&r1=27512&r2=27513&view=diff ============================================================================== --- trunk/gui/wizards/wiz_objects.py (original) +++ trunk/gui/wizards/wiz_objects.py Wed Feb 4 16:19:54 2015 @@ -366,11 +366,9 @@ TEXT_SKIP = " Skip" - def __init__(self, max_pages=15, parent=None, size_x=400, size_y=400, title='', border=10, style=wx.DEFAULT_DIALOG_STYLE): + def __init__(self, parent=None, size_x=400, size_y=400, title='', border=10, style=wx.DEFAULT_DIALOG_STYLE): """Set up the window. - @keyword max_pages: The maximum number of pages for the wizard. - @type max_pages: int @keyword parent: The parent window. @type parent: wx.Window instance @keyword size_x: The width of the wizard. @@ -390,7 +388,6 @@ self._size_y = size_y self._border = border self.title = title - self.max_pages = max_pages # Execute the base class method. wx.Dialog.__init__(self, parent, id=-1, title=title, style=style) @@ -417,6 +414,7 @@ self._pages = [] self._page_sizers = [] self._button_sizers = [] + self._top_sizers = [] self._button_apply_flag = [] self._button_skip_flag = [] self._buttons = [] @@ -429,59 +427,6 @@ self._seq_next = [] self._seq_prev = [] self._skip_flag = [] - - # Generate the elements for all pages. - for i in range(self.max_pages): - # Append some Nones. - self._pages.append(None) - - # Initialise all box sizers for the wizard pages, and store them. - self._page_sizers.append(wx.BoxSizer(wx.VERTICAL)) - self._main_sizer.Add(self._page_sizers[i], 1, wx.ALL|wx.EXPAND, 0) - - # Initialise all box sizers for the buttons, and store them. - self._button_sizers.append(wx.BoxSizer(wx.HORIZONTAL)) - self._page_sizers[i].Add(self._button_sizers[i], 0, wx.ALIGN_RIGHT|wx.ALL, 0) - - # Set all button flags. - self._button_apply_flag.append(True) - self._button_skip_flag.append(False) - - # Initialise the button storage. - self._buttons.append({'back': None, - 'apply': None, - 'next': None, - 'ok': None, - 'finish': None, - 'cancel': None}) - - # Initialise a set of unique button IDs. - self._button_ids.append({'back': -1, - 'apply': -1, - 'next': -1, - 'ok': -1, - 'finish': -1, - 'cancel': -1}) - - # Execute on next by default. - self._exec_on_next.append(True) - - # Execution count. - self._exec_count.append(0) - - # Proceed to next page on errors by default. - self._proceed_on_error.append(True) - - # No user function flushing of the GUI interpreter thread prior to proceeding. - self._uf_flush.append(False) - - # Page sequence initialisation. - self._seq_fn_list.append(self._next_fn) - self._seq_next.append(None) - self._seq_prev.append(None) - - # Page skipping. - self._skip_flag.append(False) # Flag to suppress later button addition. self._buttons_built = False @@ -628,6 +573,8 @@ @param i: The index of the page to display. @type i: int """ + + print "Displaying page %i" % i # Hide all of the original contents. for j in range(self._num_pages): @@ -873,28 +820,73 @@ # Store the page. index = self._num_pages self._num_pages += 1 - self._pages[index] = panel + self._pages.append(panel) + + # Initialise all box sizers for the wizard page, and store them. + self._page_sizers.append(wx.BoxSizer(wx.VERTICAL)) + self._main_sizer.Add(self._page_sizers[index], 1, wx.ALL|wx.EXPAND, 0) # Add the sizer for the top half. - top_sizer = wx.BoxSizer(wx.VERTICAL) - self._page_sizers[index].Add(top_sizer, 1, wx.ALL|wx.EXPAND, 0) + self._top_sizers.append(wx.BoxSizer(wx.VERTICAL)) + self._page_sizers[index].Add(self._top_sizers[index], 1, wx.ALL|wx.EXPAND, 0) # Add the page to the top sizer. - top_sizer.Add(panel, 1, wx.ALL|wx.EXPAND, 0) - - # Store the flags. - self._button_apply_flag[index] = apply_button - self._button_skip_flag[index] = skip_button - self._exec_on_next[index] = exec_on_next - self._proceed_on_error[index] = proceed_on_error + self._top_sizers[index].Add(panel, 1, wx.ALL|wx.EXPAND, 0) + + # Initialise all box sizers for the buttons, and store them. + self._button_sizers.append(wx.BoxSizer(wx.HORIZONTAL)) + + # Add the sizer for the wizard buttons. + self._page_sizers[index].Add(self._button_sizers[index], 0, wx.ALIGN_RIGHT|wx.ALL, 0) + + # Store all button flags. + self._button_apply_flag.append(apply_button) + self._button_skip_flag.append(skip_button) + + # Initialise the button storage. + self._buttons.append({'back': None, + 'apply': None, + 'next': None, + 'ok': None, + 'finish': None, + 'cancel': None}) + + # Initialise a set of unique button IDs. + self._button_ids.append({'back': -1, + 'apply': -1, + 'next': -1, + 'ok': -1, + 'finish': -1, + 'cancel': -1}) + + # Execute on next by default. + self._exec_on_next.append(exec_on_next) + + # Execution count. + self._exec_count.append(0) + + # Proceed to next page on errors by default. + self._proceed_on_error.append(proceed_on_error) + + # User function flushing of the GUI interpreter thread prior to proceeding. if not proceed_on_error or uf_flush: - self._uf_flush[index] = True + self._uf_flush.append(True) + else: + self._uf_flush.append(False) + + # Page sequence initialisation. + self._seq_fn_list.append(self._next_fn) + self._seq_next.append(None) + self._seq_prev.append(None) + + # Page skipping. + self._skip_flag.append(False) # Store the index of the page. - panel.page_index = self._num_pages - 1 + panel.page_index = index # Return the index of the page. - return panel.page_index + return index def block_next(self, block=True):