Regression - bash.bashFrame was None and restore settings failed:

See: #163
3fcbe3f87a99bca3f6aa85481697c0e3b073d390 (needed review!) introduced:

Traceback (most recent call last):
  File "<string>", line 11205, in Execute
  File "bash\barb.py", line 352, in Apply
    self.WarnRestart()
  File "bash\barb.py", line 411, in WarnRestart
    bash.bashFrame.Restart()
AttributeError: 'NoneType' object has no attribute 'Restart'

Turns out bashFrame is initialized in basher.BashApp.onInit(self):

def Init(self): # not OnInit(), we need to initialize _after_ the app
# has been instanced

There frame = BashFrame() is called and in there `BashFrame = self` is set.

Change: now basher.BashApp.onInit() returns the bashFrame !
_Link tmp class to factor out duplicate code and wx dependencies:

Files, File Links and all up to InstallerLink(Link)
TODO: self.title - where is it used - replace with self.text
InstallerLink(Link) -> InstallerLink(_Link) part I - EDIT:

Edit: # separation of presentation and data TODO move to _Link ?
Edit: _enable() also introduced

I had to introduce _initData() - it's a hack cause I sometimes need to
customize the Installers (only ?) links text and help based on selected,
data etc attributes. Consider this an implementation detail, ugly at that:

Traceback (most recent call last):
  File "bash\balt.py", line 2030, in DoItemMenu
    self.itemMenu.PopupMenu(self,Link.Frame,selected)
  File "bash\balt.py", line 2085, in PopupMenu
    link.AppendToMenu(menu,parent,*args)
  File "bash\basher.py", line 9170, in AppendToMenu
    self.help = _(u"Duplicate selected %(installername)s.") % ({'installername':self.selected[0]})
AttributeError: Installer_Duplicate instance has no attribute 'selected'
More installers  | _enable() to base REVIEW then SQUASH

_enable put to use
binned balt.Tank_Open:

It was only used in Installer_Open. Notice the help message was wrong
before (would display Open 'Bash Installers' instead of Open 'X Mod').
RIP: Files links - REVIEW:

I can't just import settings and bashFrame from basher - they will be None
So:

----------------------- Mopy/bash/basher/files_links.py -----------------------
index 69df419..c7c9c2b 100644
@@ -28,3 +28,3 @@
 from .. import balt, bosh, bush, bolt
-from . import _Link, settings, bashFrame, ListBoxes, bashBlue
+from . import _Link, bashFrame, ListBoxes, bashBlue
 from ..bolt import CancelError, SkipError, GPath, BoltError
@@ -56,3 +56,3 @@ def __init__(self,sortCol,prefix=''):
         self.sortCol = sortCol
-        self.sortName = settings['bash.colNames'][sortCol]
+        self.sortName = bosh.settings['bash.colNames'][sortCol]
         self.prefix = prefix

And then:

------------------------- Mopy/bash/basher/__init__.py -------------------------
index 5114ead..a25f758 100644
@@ -151,2 +151,4 @@

+def refreshData(): bashFrame.RefreshData() # TODO(ut): bashFrame is None in links files, ugly
+
 # Settings --------------------------------------------------------------------

----------------------- Mopy/bash/basher/files_links.py -----------------------
index c7c9c2b..df45dcb 100644
@@ -28,3 +28,3 @@
 from .. import balt, bosh, bush, bolt
-from . import _Link, bashFrame, ListBoxes, bashBlue
+from . import _Link, ListBoxes, bashBlue, refreshData
 from ..bolt import CancelError, SkipError, GPath, BoltError
@@ -139,3 +139,3 @@ def Execute(self,event):
             pass
-        bashFrame.RefreshData()
+        refreshData()

@@ -272,3 +272,3 @@ def Execute(self,event):
         #--Refresh stuff
-        bashFrame.RefreshData()
+        refreshData()
RIP: Installers links - introduced gInstallers module attribute:

Same story as basher.settings/bashFrame
Notice also:

+class _Installers_BoolLink_Refresh(BoolLink):
+    def Execute(self,event):
+        BoolLink.Execute(self,event)
+        gInstallers.gList.RefreshUI()
+

More of this needed
RIP: Installers_Skip Links - notice I renamed some for consistency
BoolLink revamp - EDIT:

text, key and help are really class and not instance attributes - so made
them such.
EDIT: avoid \ escapes when not needed
_Installer_OpenAt - REVIEW
Copy Conflicts to Project + Uninstall - SQUASH
Rip: Installer Links part I
wx wrappers in balt
Rip: Installer Links part II
Installers and Files links wx free
Installer_Subs & InstallerDetails Espm Links are now EnabledLink subclasses:

No need to be InstallerLink subclasses - they were not using InstallerLink methods.
New EnabledLink class to encapsulate common behavior
Notice 'data' - what the hell is it ? An integer apparently the index of
the espm - self.data (should) == data in this case, so _enable() SHOULD
function correctly.
Duh
Rip: Installer_Subs & InstallerDetails Espm Links
InstallerProject Links and some wrapping and nitpick:

Some wrong/unneeded help attributes removed, List_Column(CheckLink).
2 methods inlined in InstallersList.OnDropFiles() - gosh, no need for used once
methods in a 1000 lines class
InstallerArchive_Unpack + InstallerProject_Pack - REVIEW then SQUASH
Link.title attribute deleted:

Whenever used was set to the Link text (the _Link.text attribute) except:

Installers_UninstallAllPackages
Installers_UninstallAllUnknownFiles
Installers_AutoRefreshBethsoft
Installers_Enabled
Installer_Move

where the rather generic 'Installers' was displayed as the dialog title
(set in self.title = window.data.title).
Now those display the text of the link as the title except
Installers_Enabled which needed edit.

Notice that InstallerConverter_Apply has special title (text is set in
__init__) and also InstallerConverter_Create has different dialogTitle
from the Link text.