From 59f253e70565d415160e09e0d8b3ff7496c6c6ef Mon Sep 17 00:00:00 2001
From: Paul McCarthy <pauld.mccarthy@gmail.com>
Date: Tue, 22 Mar 2016 12:25:40 +0000
Subject: [PATCH] Open standard action enables itself when the FSLDIR changes.

---
 fsl/__init__.py                     |  9 ++++---
 fsl/fsleyes/actions/openstandard.py | 39 +++++++++++++++++++++++------
 2 files changed, 38 insertions(+), 10 deletions(-)

diff --git a/fsl/__init__.py b/fsl/__init__.py
index 3cc0076b8..7dea070a8 100644
--- a/fsl/__init__.py
+++ b/fsl/__init__.py
@@ -62,6 +62,7 @@ import subprocess
 
 import fsl.tools          as tools
 import fsl.utils.settings as fslsettings
+import fsl.utils.platform as fslplatform
 
 import fsl.version
 
@@ -566,7 +567,8 @@ def _fslDirWarning(parent, toolName, fslEnvActive):
     fsldir = fslsettings.read('fsldir')
 
     if fsldir is not None:
-        os.environ['FSLDIR'] = fsldir
+        os.environ['FSLDIR']        = fsldir
+        fslplatform.platform.fsldir = fsldir
         return
 
     if haveGui:
@@ -581,8 +583,9 @@ def _fslDirWarning(parent, toolName, fslEnvActive):
                 log.debug('Setting $FSLDIR to {} (specified '
                           'by user)'.format(fsldir))
 
-                os.environ['FSLDIR'] = fsldir
-                fslsettings.write('fsldir', fsldir)
+                fslplatform.platform.fsldir   = fsldir
+                os.environ[         'FSLDIR'] = fsldir
+                fslsettings.write(  'fsldir',   fsldir)
 
         wx.CallLater(500, warn)
 
diff --git a/fsl/fsleyes/actions/openstandard.py b/fsl/fsleyes/actions/openstandard.py
index ac25cbeeb..21527ed39 100644
--- a/fsl/fsleyes/actions/openstandard.py
+++ b/fsl/fsleyes/actions/openstandard.py
@@ -9,10 +9,11 @@ to load in standard space images from the ``$FSLDIR/data/standard/`` directory.
 """
 
 
-import os
 import os.path as op
 
-import action
+from . import action
+
+import fsl.utils.platform as fslplatform
 
 
 class OpenStandardAction(action.Action):
@@ -33,16 +34,40 @@ class OpenStandardAction(action.Action):
         self.__overlayList = overlayList
         self.__displayCtx  = displayCtx
         
-        # disable this action
-        # if $FSLDIR is not set
-        fsldir = os.environ.get('FSLDIR', None)
+        self.__setStandardDir()
+
+        # If FSLDIR is not set, the setStandardDir
+        # disables this action. But we'll listen 
+        # for changes to FSLDIR, in case it gets 
+        # set later on.
+        fslplatform.platform.register(
+            '{}_{}'.format(type(self).__name__, id(self)),
+            self.__setStandardDir)
+
+        
+    def destroy(self):
+        """Must be called when this ``OpenStandardAction`` is no longer
+        needed. Performs some clean-up.
+        """
+        fslplatform.platform.deregister(
+            '{}_{}'.format(type(self).__name__, id(self)))
 
+
+    def __setStandardDir(self, *a):
+        """Called by :meth:`__init__`, and when the
+        :attr:`~fsl.utils.Platform.fsldir` property is changed. Updates
+        the path to the FSLDIR standard directory.
+        """
+
+        fsldir = fslplatform.platform.fsldir
+        
         if fsldir is not None:
             self.__stddir = op.join(fsldir, 'data', 'standard')
         else:
             self.__stddir = None
-            self.enabled  = False
-        
+            
+        self.enabled = self.__stddir is not None
+            
         
     def __openStandard(self):
         """Calls the :meth:`.OverlayList.addOverlays` method. If the user
-- 
GitLab