-#!/usr/bin/env python\r
-\r
-'''\r
-playlist.py\r
-\r
-Playlist class for Hooke.\r
-\r
-Copyright 2010 by Dr. Rolf Schmidt (Concordia University, Canada)\r
-\r
-This program is released under the GNU General Public License version 2.\r
-'''\r
-\r
-import os.path\r
-import xml.dom.minidom\r
-\r
-import lib.libhooke\r
-import lib.file\r
-\r
-class Playlist(object):\r
-\r
- def __init__(self, filename=None):\r
- self._saved = False\r
- self.count = 0\r
- self.figure = None\r
- self.files = []\r
- self.generics_dict = {}\r
- self.hidden_attributes = ['curve', 'data', 'driver', 'fits', 'name', 'plot', 'plots']\r
- self.index = -1\r
- self.name = None\r
- self.path = None\r
- self.plot_panel = None\r
- self.plot_tab = None\r
- if filename is None:\r
- self.filename = None\r
- else:\r
- self.load(filename)\r
-\r
- def add_file(self, filename):\r
- if os.path.isfile(filename):\r
- file_to_add = lib.file.File(filename)\r
- self.files.append(file_to_add)\r
- self._saved = False\r
- self.count = len(self.files)\r
-\r
- def delete_file(self, name):\r
- for index, item in enumerate(self.files):\r
- if item.name == name:\r
- del self.files[index]\r
- self.index = index\r
- self.count = len(self.files)\r
- if self.index > self.count - 1:\r
- self.index = 0\r
-\r
- def filter_curves(self, curves_to_keep=[]):\r
- playlist = Playlist()\r
- for curve_index in curves_to_keep:\r
- playlist.files.append(self.files[curve_index])\r
- playlist.count = len(playlist.files)\r
- playlist.index = 0\r
- return playlist\r
-\r
- def get_active_file(self):\r
- return self.files[self.index]\r
-\r
- #def get_active_plot(self):\r
- ##TODO: is this the only active (or default?) plot?\r
- #return self.files[self.index].plots[0]\r
-\r
- def load(self, filename):\r
- '''\r
- Loads a playlist file\r
- '''\r
- self.filename = filename\r
- self.path, self.name = os.path.split(filename)\r
- playlist_file = lib.libhooke.delete_empty_lines_from_xmlfile(filename)\r
- self.xml = xml.dom.minidom.parseString(playlist_file)\r
- #TODO: rename 'element' to 'curve' or something in hkp file\r
- #TODO: rename 'path' to 'filename'\r
- #TODO: switch from attributes to nodes, it's cleaner XML in my eyes\r
-\r
- element_list = self.xml.getElementsByTagName('element')\r
- #populate playlist with files\r
- for index, element in enumerate(element_list):\r
- #rebuild a data structure from the xml attributes\r
- #the next two lines are here for backwards compatibility, newer playlist files use 'filename' instead of 'path'\r
- if element.hasAttribute('path'):\r
- #path, name = os.path.split(element.getAttribute('path'))\r
- #path = path.split(os.sep)\r
- #filename = lib.libhooke.get_file_path(name, path)\r
- filename = element.getAttribute('path')\r
- if element.hasAttribute('filename'):\r
- #path, name = os.path.split(element.getAttribute('filename'))\r
- #path = path.split(os.sep)\r
- #filename = lib.libhooke.get_file_path(name, path)\r
- filename = element.getAttribute('filename')\r
- if os.path.isfile(filename):\r
- data_file = lib.file.File(filename)\r
- if element.hasAttribute('note'):\r
- data_file.note = element.getAttribute('note')\r
- self.files.append(data_file)\r
- self.count = len(self.files)\r
- if self.count > 0:\r
- #populate generics\r
- genericsDict = {}\r
- generics_list = self.xml.getElementsByTagName('generics')\r
- if generics_list:\r
- for attribute in generics_list[0].attributes.keys():\r
- genericsDict[attribute] = generics_list[0].getAttribute(attribute)\r
- if genericsDict.has_key('pointer'):\r
- index = int(genericsDict['pointer'])\r
- if index >= 0 and index < self.count:\r
- self.index = index\r
- else:\r
- index = 0\r
- self._saved = True\r
-\r
- def next(self):\r
- self.index += 1\r
- if self.index > self.count - 1:\r
- self.index = 0\r
-\r
- def previous(self):\r
- self.index -= 1\r
- if self.index < 0:\r
- self.index = self.count - 1\r
-\r
- def reset(self):\r
- if self.count > 0:\r
- self.index = 0\r
- else:\r
- self.index = -1\r
-\r
- def save(self, filename):\r
- '''\r
- Saves a playlist from a list of files.\r
- A playlist is an XML document with the following syntax:\r
- <playlist>\r
- <element path="/my/file/path/"/ attribute="attribute">\r
- <element path="...">\r
- </playlist>\r
- '''\r
- try:\r
- output_file = file(filename, 'w')\r
- except IOError:\r
- self.AppendToOutput('Cannot save playlist. Wrong path or filename')\r
- return\r
- #create the output playlist, a simple XML document\r
- implementation = xml.dom.minidom.getDOMImplementation()\r
- #create the document DOM object and the root element\r
- self.xml = implementation.createDocument(None, 'playlist', None)\r
- root = self.xml.documentElement\r
-\r
- #save generics variables\r
- playlist_generics = self.xml.createElement('generics')\r
- root.appendChild(playlist_generics)\r
- self.generics_dict['pointer'] = self.index\r
- for key in self.generics_dict.keys():\r
- #for key in generics.keys():\r
- self.xml.createAttribute(key)\r
- playlist_generics.setAttribute(key, str(self.generics_dict[key]))\r
-\r
- #save files and their attributes\r
- for item in self.files:\r
- #playlist_element=newdoc.createElement("file")\r
- playlist_element = self.xml.createElement('element')\r
- root.appendChild(playlist_element)\r
- for key in item.__dict__:\r
- if not (key in self.hidden_attributes):\r
- self.xml.createAttribute(key)\r
- playlist_element.setAttribute(key, str(item.__dict__[key]))\r
- self._saved = False\r
-\r
- self.xml.writexml(output_file, indent='\n')\r
- output_file.close()\r
- self._saved = True\r
+#!/usr/bin/env python
+
+'''
+playlist.py
+
+Playlist class for Hooke.
+
+Copyright 2010 by Dr. Rolf Schmidt (Concordia University, Canada)
+
+This program is released under the GNU General Public License version 2.
+'''
+
+import os.path
+import xml.dom.minidom
+
+import lib.libhooke
+import lib.file
+
+class Playlist(object):
+
+ def __init__(self, filename=None):
+ self._saved = False
+ self.count = 0
+ self.figure = None
+ self.files = []
+ self.generics_dict = {}
+ self.hidden_attributes = ['curve', 'data', 'driver', 'fits', 'name', 'plot', 'plots']
+ self.index = -1
+ self.name = None
+ self.path = None
+ self.plot_panel = None
+ self.plot_tab = None
+ if filename is None:
+ self.filename = None
+ else:
+ self.load(filename)
+
+ def add_file(self, filename):
+ if os.path.isfile(filename):
+ file_to_add = lib.file.File(filename)
+ self.files.append(file_to_add)
+ self._saved = False
+ self.count = len(self.files)
+
+ def delete_file(self, name):
+ for index, item in enumerate(self.files):
+ if item.name == name:
+ del self.files[index]
+ self.index = index
+ self.count = len(self.files)
+ if self.index > self.count - 1:
+ self.index = 0
+
+ def filter_curves(self, curves_to_keep=[]):
+ playlist = Playlist()
+ for curve_index in curves_to_keep:
+ playlist.files.append(self.files[curve_index])
+ playlist.count = len(playlist.files)
+ playlist.index = 0
+ return playlist
+
+ def get_active_file(self):
+ return self.files[self.index]
+
+ #def get_active_plot(self):
+ ##TODO: is this the only active (or default?) plot?
+ #return self.files[self.index].plots[0]
+
+ def load(self, filename):
+ '''
+ Loads a playlist file
+ '''
+ self.filename = filename
+ self.path, self.name = os.path.split(filename)
+ playlist_file = lib.libhooke.delete_empty_lines_from_xmlfile(filename)
+ self.xml = xml.dom.minidom.parseString(playlist_file)
+ #TODO: rename 'element' to 'curve' or something in hkp file
+ #TODO: rename 'path' to 'filename'
+ #TODO: switch from attributes to nodes, it's cleaner XML in my eyes
+
+ element_list = self.xml.getElementsByTagName('element')
+ #populate playlist with files
+ for index, element in enumerate(element_list):
+ #rebuild a data structure from the xml attributes
+ #the next two lines are here for backwards compatibility, newer playlist files use 'filename' instead of 'path'
+ if element.hasAttribute('path'):
+ #path, name = os.path.split(element.getAttribute('path'))
+ #path = path.split(os.sep)
+ #filename = lib.libhooke.get_file_path(name, path)
+ filename = element.getAttribute('path')
+ if element.hasAttribute('filename'):
+ #path, name = os.path.split(element.getAttribute('filename'))
+ #path = path.split(os.sep)
+ #filename = lib.libhooke.get_file_path(name, path)
+ filename = element.getAttribute('filename')
+ if os.path.isfile(filename):
+ data_file = lib.file.File(filename)
+ if element.hasAttribute('note'):
+ data_file.note = element.getAttribute('note')
+ self.files.append(data_file)
+ self.count = len(self.files)
+ if self.count > 0:
+ #populate generics
+ genericsDict = {}
+ generics_list = self.xml.getElementsByTagName('generics')
+ if generics_list:
+ for attribute in generics_list[0].attributes.keys():
+ genericsDict[attribute] = generics_list[0].getAttribute(attribute)
+ if genericsDict.has_key('pointer'):
+ index = int(genericsDict['pointer'])
+ if index >= 0 and index < self.count:
+ self.index = index
+ else:
+ index = 0
+ self._saved = True
+
+ def next(self):
+ self.index += 1
+ if self.index > self.count - 1:
+ self.index = 0
+
+ def previous(self):
+ self.index -= 1
+ if self.index < 0:
+ self.index = self.count - 1
+
+ def reset(self):
+ if self.count > 0:
+ self.index = 0
+ else:
+ self.index = -1
+
+ def save(self, filename):
+ '''
+ Saves a playlist from a list of files.
+ A playlist is an XML document with the following syntax:
+ <playlist>
+ <element path="/my/file/path/"/ attribute="attribute">
+ <element path="...">
+ </playlist>
+ '''
+ try:
+ output_file = file(filename, 'w')
+ except IOError:
+ self.AppendToOutput('Cannot save playlist. Wrong path or filename')
+ return
+ #create the output playlist, a simple XML document
+ implementation = xml.dom.minidom.getDOMImplementation()
+ #create the document DOM object and the root element
+ self.xml = implementation.createDocument(None, 'playlist', None)
+ root = self.xml.documentElement
+
+ #save generics variables
+ playlist_generics = self.xml.createElement('generics')
+ root.appendChild(playlist_generics)
+ self.generics_dict['pointer'] = self.index
+ for key in self.generics_dict.keys():
+ #for key in generics.keys():
+ self.xml.createAttribute(key)
+ playlist_generics.setAttribute(key, str(self.generics_dict[key]))
+
+ #save files and their attributes
+ for item in self.files:
+ #playlist_element=newdoc.createElement("file")
+ playlist_element = self.xml.createElement('element')
+ root.appendChild(playlist_element)
+ for key in item.__dict__:
+ if not (key in self.hidden_attributes):
+ self.xml.createAttribute(key)
+ playlist_element.setAttribute(key, str(item.__dict__[key]))
+ self._saved = False
+
+ self.xml.writexml(output_file, indent='\n')
+ output_file.close()
+ self._saved = True