Rev 167: Implement index and rowCount in http://bazaar.launchpad.net/~jameinel/bzr-explorer/wt_model

John Arbash Meinel john at arbash-meinel.com
Tue Jul 7 22:37:32 BST 2009


At http://bazaar.launchpad.net/~jameinel/bzr-explorer/wt_model

------------------------------------------------------------
revno: 167
revision-id: john at arbash-meinel.com-20090707213728-1p71ophh8c5genbk
parent: john at arbash-meinel.com-20090707211314-06872uxsiog4blas
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: wt_model
timestamp: Tue 2009-07-07 16:37:28 -0500
message:
  Implement index and rowCount
  by using hasIndex they really need to be implemented concurrently.
-------------- next part --------------
=== modified file 'lib/wt_model.py'
--- a/lib/wt_model.py	2009-07-07 21:13:14 +0000
+++ b/lib/wt_model.py	2009-07-07 21:37:28 +0000
@@ -86,9 +86,10 @@
         'path',
         ]
 
-    def __init__(self, path, parent=None):
+    def __init__(self, wt, parent=None):
         QtCore.QAbstractItemModel.__init__(self, parent)
-        self._wt = workingtree.WorkingTree.open(path)
+        self._wt = wt
+        self._root_wt_item = _WTItem.create_from_wt(self._wt)
 
     def index(self, row, column, parent=None):
         """Return the QModelIndex for the given item.
@@ -102,12 +103,29 @@
         :return: The index object to reference the given data
         :rtype: QModelIndex
         """
-        # Der broken
-        return None
+        if parent is None:
+            parent = QtCore.QModelIndex()
+            parent_item = self._root_wt_item
+        if not self.hasIndex(row, column, parent):
+            return QtCore.QModelIndex()
+
+        if not parent.isValid():
+            parent_item = self._root_wt_item
+        else:
+            parent_item = parent.internalPointer()
+        child = parent_item.children[row]
+        return self.createIndex(row, column, child)
 
     # def parent(self, ...):
 
-    # def rowCount(self, ...):
+    def rowCount(self, parent=None):
+        if parent is None or not parent.isValid():
+            parent_item = self._root_wt_item
+        else:
+            parent_item = parent.internalPointer()
+        return len(parent_item.children)
+
+
     # implement def hasChildren(self, ...) if rowCount is expensive
 
     def columnCount(self, parent=None):

=== modified file 'tests/test_wt_model.py'
--- a/tests/test_wt_model.py	2009-07-07 21:13:14 +0000
+++ b/tests/test_wt_model.py	2009-07-07 21:37:28 +0000
@@ -29,9 +29,65 @@
 
 class TestWTModel(tests.TestCaseWithTransport):
 
+    def test_index_invalid(self):
+        wt = self.make_branch_and_tree('.')
+        model = wt_model.WorkingTreeModel(wt)
+        res = model.index(100, 100, None)
+        self.assertIsInstance(res, QtCore.QModelIndex)
+        self.assertFalse(res.isValid())
+
+    def test_index_empty(self):
+        wt = self.make_branch_and_tree('.')
+        model = wt_model.WorkingTreeModel(wt)
+        res = model.index(0, 0, None)
+        self.assertIsInstance(res, QtCore.QModelIndex)
+        self.assertFalse(res.isValid())
+
+    def test_index_one_item(self):
+        wt = self.make_branch_and_tree('.')
+        self.build_tree(['a_file'])
+        model = wt_model.WorkingTreeModel(wt)
+        res = model.index(0, 0, None)
+        self.assertIsInstance(res, QtCore.QModelIndex)
+        self.assertTrue(res.isValid())
+        self.assertEqual('a_file', res.internalPointer().name)
+
+    def test_index_subdir(self):
+        wt = self.make_branch_and_tree('.')
+        self.build_tree(['dir/', 'dir/a_file', 'b_file'])
+        wt.add(['dir', 'dir/a_file', 'b_file'],
+               ['dir-id', 'a-id', 'b-id'])
+        model = wt_model.WorkingTreeModel(wt)
+        res = model.index(1, 0, None)
+        self.assertIsInstance(res, QtCore.QModelIndex)
+        self.assertTrue(res.isValid())
+        self.assertEqual('dir', res.internalPointer().name)
+        res = model.index(0, 0, res)
+        self.assertIsInstance(res, QtCore.QModelIndex)
+        self.assertTrue(res.isValid())
+        self.assertEqual('a_file', res.internalPointer().name)
+
+    def test_rowCount_simple(self):
+        wt = self.make_branch_and_tree('.')
+        model = wt_model.WorkingTreeModel(wt)
+        self.assertEqual(0, model.rowCount())
+
+    def test_rowCount_subdirs(self):
+        wt = self.make_branch_and_tree('.')
+        self.build_tree(['dir/', 'dir/a_file', 'b_file'])
+        wt.add(['dir', 'dir/a_file', 'b_file'],
+               ['dir-id', 'a-id', 'b-id'])
+        model = wt_model.WorkingTreeModel(wt)
+        self.assertEqual(2, model.rowCount())
+        dir_index = model.index(1, 0, None)
+        self.assertIsInstance(dir_index, QtCore.QModelIndex)
+        self.assertTrue(dir_index.isValid())
+        self.assertEqual('dir', dir_index.internalPointer().name)
+        self.assertEqual(1, model.rowCount(dir_index))
+
     def test_headerData(self):
-        self.make_branch_and_tree('.')
-        model = wt_model.WorkingTreeModel('.')
+        wt = self.make_branch_and_tree('.')
+        model = wt_model.WorkingTreeModel(wt)
         self.assertEqual(6, model.columnCount())
         res = model.headerData(0, QtCore.Qt.Horizontal, QtCore.Qt.DisplayRole)
         self.assertIsInstance(res, QtCore.QVariant)



More information about the bazaar-commits mailing list