Package plugins :: Package misc :: Package where :: Module main

[hide private]
[frames] | no frames]

# Source Code for Module plugins.misc.where.main

      1  #-*- coding: utf8 -*
      2  #
      3  # Max E. Kuznecov <syhpoon@syhpoon.name> 2009
      4  #
      5
      6  import os
      7
      8  from libxyz.core.plugins import BasePlugin
      9  from libxyz.core import UserData
     10
     11  from libxyz.exceptions import XYZRuntimeError
     12
     13 -class XYZPlugin(BasePlugin):
     14      "Plugin where"
     15
     16      NAME = u"where"
     17      AUTHOR = u"Max E. Kuznecov <syhpoon@syhpoon.name>"
     18      VERSION = u"0.2"
     19      BRIEF_DESCRIPTION = _(u"Save panels locations")
     20      FULL_DESCRIPTION = _(u"When starting load previously saved locations")
     21      NAMESPACE = u"misc"
     22      MIN_XYZ_VERSION = 4
     23      DOC = None
     24      HOMEPAGE = "http://xyzcmd.syhpoon.name/"
     25      EVENTS = None
     26
     27 -    def __init__(self, xyz):
     28          super(XYZPlugin, self).__init__(xyz)
     29          self._ud = UserData()
     30          self._wfile = "where"
     31
     32          self.xyz.hm.register("event:startup", self.load)
     33          self.xyz.hm.register("event:shutdown", self.save)
     34
     35          self.export(self.save)
     36          self.export(self.load)
     37
     38      #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     39
     40 -    def load(self):
     41          """
     42          Restore locations on startup.
     43          File format is following:
     44          /panel-1/path
     45          /panel-2/path
     46          <Number of tabs in panel-1>
     47          <Active tab index in panel-1>
     48          <Active tab selected name in panel-1>
     49          panel-1 tab-1 path
     50          panel-1 tab-1 selected
     51          panel-1 tab-n path
     52          panel-1 tab-n selected
     53          <Number of tabs in panel-2>
     54          <Active tab index in panel-2>
     55          <Active tab selected name in panel-2>
     56          panel-2 tab-1 path
     57          panel-2 tab-1 selected
     58          panel-2 tab-n path
     59          panel-2 tab-n selected
     60          """
     61
     62          chdir = self.xyz.pm.from_load(":sys:panel", "chdir")
     63          new_tab = self.xyz.pm.from_load(":sys:panel", "new_tab")
     64          select = self.xyz.pm.from_load(":sys:panel", "select")
     65          switch = self.xyz.pm.from_load(":sys:panel", "switch_tab")
     66
     67          def restore_tabs(d, num, active):
     68              i = 0
     69
     70              while i < num:
     71                  tab_path = d[i].rstrip()
     72                  tab_selected = d[i + 1].rstrip()
     73
     74                  chdir(tab_path, active=active)
     75                  select(tab_selected, active=active)
     76
     77                  if i < num - 2:
     78                      new_tab(active=active)
     79
     80                  i += 2
     81
     82              return i
     83
     84          #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     85
     86          f = None
     87          try:
     88              f = self._ud.openfile(self._wfile, "r", "data")
     89              data = [x.rstrip() for x in f.readlines()]
     90              act = data[0]
     91              inact = data[1]
     92
     93              chdir(act)
     94              chdir(inact, active=False)
     95
     96              tabsnum = int(data[2]) * 2
     97              active_tab = int(data[3])
     98              selected = data[4]
     99
    100              data = data[5:]
    101
    102              restored = restore_tabs(data, tabsnum, True)
    103
    104              tabsnum = int(data[restored]) * 2
    105              iactive_tab = int(data[restored + 1])
    106              iselected = data[restored + 2]
    107
    108              data = data[restored + 3:]
    109
    110              restore_tabs(data, tabsnum, False)
    111
    112              switch(iactive_tab, active=False)
    113              switch(active_tab)
    114              select(iselected, active=False)
    115              select(selected)
    116          except IOError:
    117              pass
    118
    119          if f:
    120              f.close()
    121
    122      #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    123
    124 -    def save(self):
    125          """
    126          Save locations on shutdown
    127          """
    128
    129          panel = self.xyz.pm.load(":sys:panel")
    130
    131          act = panel.cwd()
    132          inact = panel.cwd(active=False)
    133          tabs = panel.get_tabs()
    134          inacttabs = panel.get_tabs(active=False)
    135
    136          f = None
    137
    138          try:
    139              data = [act, inact]
    140              data.append(str(len(tabs)))
    141              data.append(str(panel.active_tab()))
    142              data.append(str(panel.get_selected().name))
    143
    144              for tab_path, tab_selected in tabs:
    145                  if tab_selected is None:
    146                      tab_selected = os.path.sep
    147
    148                  data.extend([tab_path, tab_selected])
    149
    150              data.append(str(len(inacttabs)))
    151              data.append(str(panel.active_tab(active=False)))
    152              data.append(str(panel.get_selected(active=False).name))
    153
    154              for itab_path, itab_selected in inacttabs:
    155                  if itab_selected is None:
    156                      itab_selected = os.path.sep
    157
    158                  data.extend([itab_path, itab_selected])
    159
    160              f = self._ud.openfile(self._wfile, "w", "data")
    161
    162              f.write("\n".join(data))
    163          except XYZRuntimeError, e:
    164              xyzlog.info(_(u"Unable to open where data file: %s")
    165                          % ustring(str(e)))
    166          if f:
    167              f.close()
    168