Author: bugman Date: Tue Apr 17 14:35:13 2012 New Revision: 15749 URL: http://svn.gna.org/viewcvs/relax?rev=15749&view=rev Log: Big bug fix for the deletion of analyses tabs from the GUI! This affects wxGTK users on Macs and Linux. Now the spectrum and relaxation data list GUI elements have observer_register() methods, allowing the analysis delete_all() method to unregister all analysis specific methods from the observer objects. This prevents queued wx calls to be made on dead or non-existent GUI objects after the analysis has been deleted. wx.Yield() calls were not sufficient to solve this issue. Modified: 1.3/gui/analyses/auto_model_free.py 1.3/gui/analyses/auto_noe.py 1.3/gui/analyses/auto_rx_base.py 1.3/gui/components/relax_data.py 1.3/gui/components/spectrum.py Modified: 1.3/gui/analyses/auto_model_free.py URL: http://svn.gna.org/viewcvs/relax/1.3/gui/analyses/auto_model_free.py?rev=15749&r1=15748&r2=15749&view=diff ============================================================================== --- 1.3/gui/analyses/auto_model_free.py (original) +++ 1.3/gui/analyses/auto_model_free.py Tue Apr 17 14:35:13 2012 @@ -629,8 +629,12 @@ # Unregister. else: + # The model-free methods. status.observers.gui_uf.unregister(self.data.pipe_name) status.observers.exec_lock.unregister(self.data.pipe_name) + + # The embedded objects methods. + self.relax_data.observer_register(remove=True) def results_directory(self, event): Modified: 1.3/gui/analyses/auto_noe.py URL: http://svn.gna.org/viewcvs/relax/1.3/gui/analyses/auto_noe.py?rev=15749&r1=15748&r2=15749&view=diff ============================================================================== --- 1.3/gui/analyses/auto_noe.py (original) +++ 1.3/gui/analyses/auto_noe.py Tue Apr 17 14:35:13 2012 @@ -281,8 +281,12 @@ # Unregister. else: + # The model-free methods. status.observers.gui_uf.unregister(self.data.pipe_name) status.observers.exec_lock.unregister(self.data.pipe_name) + + # The embedded objects methods. + self.peak_intensity.observer_register(remove=True) def peak_wizard(self, event): Modified: 1.3/gui/analyses/auto_rx_base.py URL: http://svn.gna.org/viewcvs/relax/1.3/gui/analyses/auto_rx_base.py?rev=15749&r1=15748&r2=15749&view=diff ============================================================================== --- 1.3/gui/analyses/auto_rx_base.py (original) +++ 1.3/gui/analyses/auto_rx_base.py Tue Apr 17 14:35:13 2012 @@ -297,8 +297,12 @@ # Unregister. else: + # The model-free methods. status.observers.gui_uf.unregister(self.data.pipe_name) status.observers.exec_lock.unregister(self.data.pipe_name) + + # The embedded objects methods. + self.peak_intensity.observer_register(remove=True) def peak_wizard(self, event): Modified: 1.3/gui/components/relax_data.py URL: http://svn.gna.org/viewcvs/relax/1.3/gui/components/relax_data.py?rev=15749&r1=15748&r2=15749&view=diff ============================================================================== --- 1.3/gui/components/relax_data.py (original) +++ 1.3/gui/components/relax_data.py Tue Apr 17 14:35:13 2012 @@ -1,7 +1,7 @@ ############################################################################### # # # Copyright (C) 2009-2011 Michael Bieri # -# Copyright (C) 2010-2011 Edward d'Auvergne # +# Copyright (C) 2010-2012 Edward d'Auvergne # # # # This file is part of the program relax. # # # @@ -102,7 +102,7 @@ self.name = 'relaxation data list: %s' % id # Register the element for updating when a user function completes. - status.observers.gui_uf.register(self.name, self.build_element) + self.observer_register() def Enable(self, enable=True): @@ -207,8 +207,8 @@ def delete(self): """Unregister the class.""" - # Unregister the class. - status.observers.gui_uf.unregister(self.name) + # Unregister the observer methods. + self.observer_register(remove=True) def init_element(self, sizer): @@ -239,6 +239,22 @@ # Add list to sizer. sizer.Add(self.element, 0, wx.ALL|wx.EXPAND, 0) + + + def observer_register(self, remove=False): + """Register and unregister methods with the observer objects. + + @keyword remove: If set to True, then the methods will be unregistered. + @type remove: False + """ + + # Register. + if not remove: + status.observers.gui_uf.register(self.name, self.build_element) + + # Unregister. + else: + status.observers.gui_uf.unregister(self.name) def on_right_click(self, event): Modified: 1.3/gui/components/spectrum.py URL: http://svn.gna.org/viewcvs/relax/1.3/gui/components/spectrum.py?rev=15749&r1=15748&r2=15749&view=diff ============================================================================== --- 1.3/gui/components/spectrum.py (original) +++ 1.3/gui/components/spectrum.py Tue Apr 17 14:35:13 2012 @@ -1,7 +1,7 @@ ############################################################################### # # # Copyright (C) 2009-2011 Michael Bieri # -# Copyright (C) 2010-2011 Edward d'Auvergne # +# Copyright (C) 2010-2012 Edward d'Auvergne # # # # This file is part of the program relax. # # # @@ -106,7 +106,7 @@ self.name = 'spectra list: %s' % id # Register the element for updating when a user function completes. - status.observers.gui_uf.register(self.name, self.build_element) + self.observer_register() def Enable(self, enable=True): @@ -242,8 +242,8 @@ def delete(self): """Unregister the class.""" - # Unregister the class. - status.observers.gui_uf.unregister(self.name) + # Unregister the observer methods. + self.observer_register(remove=True) def init_element(self, sizer): @@ -269,6 +269,22 @@ # Add list to sizer. sizer.Add(self.element, 0, wx.ALL|wx.EXPAND, 0) + + + def observer_register(self, remove=False): + """Register and unregister methods with the observer objects. + + @keyword remove: If set to True, then the methods will be unregistered. + @type remove: False + """ + + # Register. + if not remove: + status.observers.gui_uf.register(self.name, self.build_element) + + # Unregister. + else: + status.observers.gui_uf.unregister(self.name) def on_right_click(self, event):