Fixing sizing on n900
[gc-dialer] / src / gv_views.py
index 8982530..c15aca4 100644 (file)
@@ -3,6 +3,8 @@
 from __future__ import with_statement
 from __future__ import division
 
+import string
+import itertools
 import logging
 
 from PyQt4 import QtGui
@@ -196,14 +198,12 @@ class Dialpad(object):
 
 class History(object):
 
-       DATE_IDX = 0
-       ACTION_IDX = 1
-       NUMBER_IDX = 2
-       FROM_IDX = 3
-       MAX_IDX = 4
+       DETAILS_IDX = 0
+       FROM_IDX = 1
+       MAX_IDX = 2
 
        HISTORY_ITEM_TYPES = ["Received", "Missed", "Placed", "All"]
-       HISTORY_COLUMNS = ["When", "What", "Number", "From"]
+       HISTORY_COLUMNS = ["Details", "From"]
        assert len(HISTORY_COLUMNS) == MAX_IDX
 
        def __init__(self, app, session, errorLog):
@@ -226,10 +226,12 @@ class History(object):
                self._itemView = QtGui.QTreeView()
                self._itemView.setModel(self._itemStore)
                self._itemView.setUniformRowHeights(True)
+               self._itemView.setRootIsDecorated(False)
                self._itemView.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
                self._itemView.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
                self._itemView.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
                self._itemView.setHeaderHidden(True)
+               self._itemView.header().setResizeMode(QtGui.QHeaderView.ResizeToContents)
                self._itemView.activated.connect(self._on_row_activated)
 
                self._layout = QtGui.QVBoxLayout()
@@ -271,6 +273,7 @@ class History(object):
 
        def _populate_items(self):
                self._itemStore.clear()
+
                history = self._session.get_history()
                history.sort(key=lambda item: item["time"], reverse=True)
                for event in history:
@@ -285,11 +288,15 @@ class History(object):
                                if not name:
                                        name = "Unknown"
 
-                               timeItem = QtGui.QStandardItem(relTime)
-                               actionItem = QtGui.QStandardItem(action)
-                               numberItem = QtGui.QStandardItem(prettyNumber)
+                               detailsItem = QtGui.QStandardItem("%s - %s\n%s" % (relTime, action, prettyNumber))
+                               detailsFont = detailsItem.font()
+                               detailsFont.setPointSize(detailsFont.pointSize() - 4)
+                               detailsItem.setFont(detailsFont)
                                nameItem = QtGui.QStandardItem(name)
-                               row = timeItem, actionItem, numberItem, nameItem
+                               nameFont = nameItem.font()
+                               nameFont.setPointSize(nameFont.pointSize() + 4)
+                               nameItem.setFont(nameFont)
+                               row = detailsItem, nameItem
                                for item in row:
                                        item.setEditable(False)
                                        item.setCheckable(False)
@@ -297,7 +304,7 @@ class History(object):
                                                itemFont = item.font()
                                                itemFont.setPointSize(max(itemFont.pointSize() - 3, 5))
                                                item.setFont(itemFont)
-                               numberItem.setData(event)
+                               row[0].setData(event)
                                self._itemStore.appendRow(row)
 
        @QtCore.pyqtSlot(str)
@@ -315,7 +322,7 @@ class History(object):
        @misc_utils.log_exception(_moduleLogger)
        def _on_row_activated(self, index):
                rowIndex = index.row()
-               item = self._itemStore.item(rowIndex, self.NUMBER_IDX)
+               item = self._itemStore.item(rowIndex, 0)
                contactDetails = item.data().toPyObject()
 
                title = str(self._itemStore.item(rowIndex, self.FROM_IDX).text())
@@ -323,9 +330,8 @@ class History(object):
                contactId = number # ids don't seem too unique so using numbers
 
                descriptionRows = []
-               # @bug doesn't seem to print multiple entries
                for i in xrange(self._itemStore.rowCount()):
-                       iItem = self._itemStore.item(i, self.NUMBER_IDX)
+                       iItem = self._itemStore.item(i, 0)
                        iContactDetails = iItem.data().toPyObject()
                        iNumber = str(iContactDetails[QtCore.QString("number")])
                        if number != iNumber:
@@ -389,6 +395,7 @@ class Messages(object):
                self._itemView = QtGui.QTreeView()
                self._itemView.setModel(self._itemStore)
                self._itemView.setUniformRowHeights(False)
+               self._itemView.setRootIsDecorated(False)
                self._itemView.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
                self._itemView.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
                self._itemView.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
@@ -495,7 +502,6 @@ class Messages(object):
                                item["expandedMessages"] = "<br/>\n".join(expandedMessages)
 
                                messageItem = QtGui.QStandardItem(item["collapsedMessages"])
-                               # @bug Not showing all of a message
                                messageItem.setData(item)
                                messageItem.setEditable(False)
                                messageItem.setCheckable(False)
@@ -561,14 +567,17 @@ class Contacts(object):
 
                self._itemStore = QtGui.QStandardItemModel()
                self._itemStore.setHorizontalHeaderLabels(["Contacts"])
+               self._alphaItem = {}
 
                self._itemView = QtGui.QTreeView()
                self._itemView.setModel(self._itemStore)
                self._itemView.setUniformRowHeights(True)
+               self._itemView.setRootIsDecorated(False)
                self._itemView.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
                self._itemView.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
                self._itemView.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
                self._itemView.setHeaderHidden(True)
+               self._itemView.setItemsExpandable(False)
                self._itemView.activated.connect(self._on_row_activated)
 
                self._layout = QtGui.QVBoxLayout()
@@ -647,10 +656,18 @@ class Contacts(object):
 
        def _populate_items(self):
                self._itemStore.clear()
+               self._alphaItem = dict(
+                       (letter, QtGui.QStandardItem(letter))
+                       for letter in self._prefixes()
+               )
+               for letter in self._prefixes():
+                       item = self._alphaItem[letter]
+                       item.setEditable(False)
+                       item.setCheckable(False)
+                       row = (item, )
+                       self._itemStore.appendRow(row)
 
-               contacts = list(self._backend.get_contacts().itervalues())
-               contacts.sort(key=lambda contact: contact["name"].lower())
-               for item in contacts:
+               for item in self._get_contacts():
                        name = item["name"]
                        numbers = item["numbers"]
                        nameItem = QtGui.QStandardItem(name)
@@ -658,7 +675,25 @@ class Contacts(object):
                        nameItem.setCheckable(False)
                        nameItem.setData(item)
                        row = (nameItem, )
-                       self._itemStore.appendRow(row)
+                       rowKey = name[0].upper()
+                       rowKey = rowKey if rowKey in self._alphaItem else "#"
+                       self._alphaItem[rowKey].appendRow(row)
+               self._itemView.expandAll()
+
+       def _prefixes(self):
+               return itertools.chain(string.ascii_uppercase, ("#", ))
+
+       def _jump_to_prefix(self, letter):
+               i = list(self._prefixes()).index(letter)
+               rootIndex = self._itemView.rootIndex()
+               currentIndex = self._itemView.model().index(i, 0, rootIndex)
+               self._itemView.scrollTo(currentIndex)
+               self._itemView.setItemSelected(self._itemView.topLevelItem(i), True)
+
+       def _get_contacts(self):
+               contacts = list(self._backend.get_contacts().itervalues())
+               contacts.sort(key=lambda contact: contact["name"].lower())
+               return contacts
 
        @QtCore.pyqtSlot(str)
        @misc_utils.log_exception(_moduleLogger)
@@ -673,8 +708,13 @@ class Contacts(object):
        @QtCore.pyqtSlot(QtCore.QModelIndex)
        @misc_utils.log_exception(_moduleLogger)
        def _on_row_activated(self, index):
+               letterIndex = index.parent()
+               assert letterIndex.isValid()
+               letterRow = letterIndex.row()
+               letter = list(self._prefixes())[letterRow]
+               letterItem = self._alphaItem[letter]
                rowIndex = index.row()
-               item = self._itemStore.item(rowIndex, 0)
+               item = letterItem.child(rowIndex, 0)
                contactDetails = item.data().toPyObject()
 
                name = str(contactDetails[QtCore.QString("name")])