summaryrefslogtreecommitdiff
path: root/src/msd/msd_browse.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/msd/msd_browse.py')
-rw-r--r--src/msd/msd_browse.py238
1 files changed, 35 insertions, 203 deletions
diff --git a/src/msd/msd_browse.py b/src/msd/msd_browse.py
index 1c1b087..de677d3 100644
--- a/src/msd/msd_browse.py
+++ b/src/msd/msd_browse.py
@@ -16,219 +16,51 @@
# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
#
# Mark Ryan <mark.d.ryan@intel.com>
+# Jussi Kukkonen <jussi.kukkonen@intel.com>
#
import pygtk
pygtk.require('2.0')
import gtk
-import dateutil.parser
-import datetime
+from msd_generic_model import *
from msd_sort_order import *
from msd_upnp import *
-class TreeNode(object):
+class BrowseModel(GenericModel):
+ def __init__(self, root, sort_order):
+ super(BrowseModel, self).__init__()
- filter = ["Artist", "DisplayName", "URLs", "Date", "Path",
- "Type"]
- buffer_size = 50
-
- def __init__(self, props, parent, sort_order):
- self.__props = props
- self.__container = None
- self.__max_items = 0
- self.__parent = parent
self.__sort_order = sort_order
- if self.is_container():
- self.__container = Container(props["Path"])
- try:
- self.__max_items = self.__container.get_prop("ChildCount")
- except Exception:
- pass
- self.__children = [None] * self.__max_items
-
- def is_container(self):
- return self.__props["Type"] == "container"
-
- def reset_children(self):
- self.__children = [None] * self.__max_items
-
- def get_num_children(self):
- return self.__max_items
-
- def get_props(self):
- return self.__props
-
- def get_parent(self):
- return self.__parent
-
- def flush(self):
- self.__flush_down()
- if self.__parent:
- self.__parent.__flush_up(self)
-
- def __flush_down(self):
- i = 0;
- while i < self.__max_items:
- if self.__children[i]:
- self.__children[i].__flush_down()
- self.__children[i] = None
- i = i + 1
-
- def __flush_up(self, child):
- i = 0;
- while i < self.__max_items:
- if self.__children[i]:
- if child != self.__children[i]:
- self.__children[i].__flush_down()
- self.__children[i] = None
- i = i + 1
- if self.__parent:
- self.__parent.__flush_up(self)
-
- def get_child(self, child):
- retval = None
- if child < self.__max_items:
- retval = self.__children[child]
- if not retval:
- i = child + 1
- while (i < self.__max_items and (i - child) <
- TreeNode.buffer_size and not self.__children[i]):
- i = i + 1
- try:
- sort_descriptor = self.__sort_order.get_upnp_sort_order()
- try:
- result = self.__container.list_children(child,
- i - child,
- TreeNode.filter,
- sort_descriptor)
- except Exception:
- result = self.__container.list_children(child,
- i - child,
- TreeNode.filter)
- i = child
- for props in result:
- self.__children[i] = TreeNode(props, self,
- self.__sort_order)
- i = i + 1
- retval = self.__children[child]
- except Exception:
- pass
-
- return retval
-
-class BrowseModel(gtk.GenericTreeModel):
- columns = (("DisplayName", str), ("Artist", str), ("Date", str),
- ("Type",str), ("Path", str), ("URLs", str))
-
- def __init__(self, root):
- gtk.GenericTreeModel.__init__(self)
-
self.__root = root
- def flush(self):
- self.__root.flush()
-
- def on_get_flags(self):
- return gtk.TREE_MODEL_LIST_ONLY | gtk.TREE_MODEL_ITERS_PERSIST
-
- def on_get_n_columns(self):
- return len(BrowseModel.columns)
-
- def on_get_column_type(self, n):
- return BrowseModel.columns[n][1]
-
- def __get_num_of_children(self):
- num = self.__root.get_num_children()
- if self.__root.get_parent():
- num = num + 1
- return num
-
- def on_get_iter(self, path):
- if path[0] >= self.__get_num_of_children():
- raise ValueError("Invalid Path")
- return path[0]
-
- def on_get_path(self, rowref):
- return (rowref,)
-
- def adjusted_on_get_value(self, rowref, col):
- retval = None
- key = BrowseModel.columns[col][0]
- node = self.__root.get_child(rowref)
- props = node.get_props()
- if key in props:
- data = props[key]
- if node.is_container():
- if col == 0:
- retval = data
- else:
- if col == 2:
- date = dateutil.parser.parse(data)
- retval = date.strftime("%x")
- elif col == 3:
- data = data[0].upper() + data[1:]
- period = data.find('.')
- if period >=0:
- retval = data[:period]
- else:
- retval = data
- elif col == 5:
- retval = data[0]
- else:
- retval = data
- elif not node.is_container():
- if col == 1:
- retval = "Unknown"
- elif col == 2:
- retval = datetime.date.today().strftime("%x")
- else:
- retval = ""
-
- return retval
-
- def on_get_value(self, rowref, col):
- if self.__root.get_parent():
- if rowref == 0:
- if col == 0:
- retval = ".."
- else:
- retval = ""
- else:
- retval = self.adjusted_on_get_value(rowref - 1, col)
- else:
- retval = self.adjusted_on_get_value(rowref, col)
-
- return retval
-
- def on_iter_next(self, rowref):
- retval = None
- rowref = rowref + 1
- if rowref < self.__get_num_of_children():
- retval = rowref
-
- return retval
-
- def on_iter_children(self, rowref):
- retval = 0
- if rowref:
- retval = None
- return retval
-
- def on_iter_has_child(self, rowref):
- return False
-
- def on_iter_n_children(self, rowref):
- retval = 0
- if not rowref:
- retval = self.__get_num_of_children()
- return retval
-
- def on_iter_nth_child(self, rowref, child):
- retval = None
- if not rowref and child < self.__get_num_of_children():
- retval = child
- return retval
-
- def on_iter_parent(self, rowref):
- return None
+ try:
+ # if this container is in a container, add ".." row
+ parent = root.get_prop('Parent')
+ if (parent != root.get_prop('Path')):
+ self._set_static_row(["..",
+ None,
+ None,
+ "Container",
+ parent,
+ None,
+ False])
+ except:
+ pass
+
+ try:
+ self.__child_count = self.__root.get_prop("ChildCount")
+ except:
+ pass
+
+ self.set_request_range (0, GenericModel.max_items_per_fetch - 1)
+
+ def __on_browse_reply (self, result):
+ self._on_reply(result, self.__child_count)
+
+ def fetch_items(self, start, count):
+ sort_descriptor = self.__sort_order.get_upnp_sort_order()
+ self.__root.list_children(start, count,
+ GenericModel.filter,
+ sort_descriptor,
+ self.__on_browse_reply, self._on_error)