from __future__ import with_statement
from __future__ import division
+import string
+import itertools
import logging
from PyQt4 import QtGui
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):
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()
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:
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)
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)
@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())
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:
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)
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)
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()
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)
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)
@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")])