diff --git a/aqt/browser.py b/aqt/browser.py
index cf93d2e69..5f8816be9 100644
--- a/aqt/browser.py
+++ b/aqt/browser.py
@@ -36,7 +36,8 @@ class DeckModel(QAbstractTableModel):
self.browser = browser
self.deck = browser.deck
self.sortKey = None
- self.columns = ["question", "answer", "sortField", "cardDue", "cardEase"]
+ self.activeCols = self.deck.conf.get(
+ "activeCols", ["factFld", "answer", "cardDue", "cardEase"])
self.cards = []
self.cardObjs = {}
@@ -53,7 +54,7 @@ class DeckModel(QAbstractTableModel):
return len(self.cards)
def columnCount(self, index):
- return len(self.columns)
+ return len(self.activeCols)
def data(self, index, role):
if not index.isValid():
@@ -77,15 +78,10 @@ class DeckModel(QAbstractTableModel):
return QVariant()
elif role == Qt.DisplayRole:
type = self.columnType(section)
- if type == "question":
- txt = _("Question")
- elif type == "answer":
- txt = _("Answer")
- else:
- for stype, name in self.browser.sortTypes:
- if type == stype:
- txt = name
- break
+ for stype, name in self.browser.columns:
+ if type == stype:
+ txt = name
+ break
return QVariant(txt)
elif role == Qt.FontRole:
f = QFont()
@@ -117,11 +113,7 @@ class DeckModel(QAbstractTableModel):
######################################################################
def columnType(self, column):
- type = self.columns[column]
- if type == "sortField":
- type = self.deck.conf['sortType']
- if type == "factFld":
- type = "cardDue"
+ type = self.activeCols[column]
return type
def columnData(self, index):
@@ -133,7 +125,10 @@ class DeckModel(QAbstractTableModel):
return self.formatQA(c.q())
elif type == "answer":
return self.formatQA(c.a())
- elif type == "factFld" or type == "cardDue":
+ elif type == "factFld":
+ f = c.fact()
+ return self.formatQA(f._fields[f.model().sortIdx()])
+ elif type == "cardDue":
return self.nextDue(c, index)
elif type == "factCrt":
return time.strftime("%Y-%m-%d", time.localtime(c.fact().crt))
@@ -233,7 +228,7 @@ class Browser(QMainWindow):
restoreSplitter(self.form.splitter_3, "editor3")
self.form.splitter_2.setChildrenCollapsible(False)
self.form.splitter_3.setChildrenCollapsible(False)
- self.setupSort()
+ self.setupColumns()
self.setupToolbar()
self.setupTable()
self.setupMenus()
@@ -243,7 +238,6 @@ class Browser(QMainWindow):
self.setupHooks()
self.setupEditor()
self.setupCardInfo()
- self.updateSortIcon()
self.updateFont()
self.form.searchEdit.setFocus()
self.updateFilterLabel()
@@ -310,6 +304,7 @@ class Browser(QMainWindow):
saveGeom(self, "editor")
saveState(self, "editor")
saveHeader(self.form.tableView.horizontalHeader(), "editor")
+ self.deck.conf['activeCols'] = self.model.activeCols
self.hide()
aqt.dialogs.close("Browser")
self.teardownHooks()
@@ -320,6 +315,21 @@ class Browser(QMainWindow):
if evt.key() in (Qt.Key_Escape,):
self.close()
+ def setupColumns(self):
+ self.columns = [
+ ('question', _("Question")),
+ ('answer', _("Answer")),
+ ('factFld', _("Sort Field")),
+ ('factCrt', _("Creation date")),
+ ('factMod', _("Edit date")),
+ ('cardMod', _("Review date")),
+ ('cardDue', _("Due date")),
+ ('cardIvl', _("Card interval")),
+ ('cardEase', _("Ease factor")),
+ ('cardReps', _("Review count")),
+ ('cardLapses', _("Lapse count")),
+ ]
+
# Searching
######################################################################
@@ -369,7 +379,7 @@ class Browser(QMainWindow):
def setupTable(self):
self.model = DeckModel(self)
- self.form.tableView.setSortingEnabled(False)
+ self.form.tableView.setSortingEnabled(True)
self.form.tableView.setShowGrid(False)
self.form.tableView.setModel(self.model)
self.form.tableView.selectionModel()
@@ -397,7 +407,6 @@ class Browser(QMainWindow):
return -1
def focusCard(self):
- print "focus"
if self.card:
try:
self.card.id
@@ -414,7 +423,7 @@ class Browser(QMainWindow):
return True
return False
- # Headers
+ # Headers & sorting
######################################################################
def setupHeaders(self):
@@ -424,80 +433,76 @@ class Browser(QMainWindow):
vh.hide()
hh.show()
restoreHeader(hh, "editor")
- for i in range(2):
- hh.setResizeMode(i, QHeaderView.Stretch)
- hh.setResizeMode(2, QHeaderView.Interactive)
+ hh.setHighlightSections(False)
+ hh.setMinimumSectionSize(50)
+ self.setColumnSizes()
hh.setContextMenuPolicy(Qt.CustomContextMenu)
hh.connect(hh, SIGNAL("customContextMenuRequested(QPoint)"),
self.onHeaderContext)
+ hh.connect(hh, SIGNAL("sortIndicatorChanged(int, Qt::SortOrder)"),
+ self.onSortChanged)
+ self.setSortIndicator()
+
+ def onSortChanged(self, idx, ord):
+ type = self.model.activeCols[idx]
+ if type in ("question", "answer"):
+ type = "factFld"
+ if self.deck.conf['sortType'] != type:
+ self.deck.conf['sortType'] = type
+ # default to descending for non-text fields
+ if type not in ("question", "answer", "factFld"):
+ ord = not ord
+ self.deck.conf['sortBackwards'] = ord
+ self.model.showMatching()
+ # fixme: we do this in various locations
+ self.updateFilterLabel()
+ self.focusCard()
+ else:
+ self.deck.conf['sortBackwards'] = ord
+ self.model.cards.reverse()
+ self.setSortIndicator()
+ self.model.reset()
+
+ def setSortIndicator(self):
+ hh = self.form.tableView.horizontalHeader()
+ type = self.deck.conf['sortType']
+ if type not in self.model.activeCols:
+ hh.setSortIndicatorShown(False)
+ return
+ idx = self.model.activeCols.index(type)
+ if self.deck.conf['sortBackwards']:
+ ord = Qt.DescendingOrder
+ else:
+ ord = Qt.AscendingOrder
+ hh.setSortIndicator(idx, ord)
+ hh.setSortIndicatorShown(True)
def onHeaderContext(self, pos):
gpos = self.form.tableView.mapToGlobal(pos)
m = QMenu()
- for type, name in [("question", _("Question")),
- ("answer", _("Answer")),
- ("sortField", _("Current Sort Field"))
- ] + self.sortTypes:
+ for type, name in self.columns:
a = m.addAction(name)
a.setCheckable(True)
- a.setChecked(type in self.model.columns)
+ a.setChecked(type in self.model.activeCols)
a.connect(a, SIGNAL("toggled(bool)"),
lambda b, t=type: self.toggleField(t))
m.exec_(gpos)
def toggleField(self, type):
- if type in self.model.columns:
- self.model.columns.remove(type)
+ if type in self.model.activeCols:
+ self.model.activeCols.remove(type)
else:
- self.model.columns.append(type)
+ self.model.activeCols.append(type)
+ self.setColumnSizes()
self.model.reset()
- # Sorting
- ######################################################################
-
- def setupSort(self):
- self.sortTypes = [
- ('factFld', _("Fields")),
- ('factCrt', _("Creation date")),
- ('factMod', _("Edit date")),
- ('cardMod', _("Review date")),
- ('cardDue', _("Due date")),
- ('cardIvl', _("Card interval")),
- ('cardEase', _("Ease factor")),
- ('cardReps', _("Review count")),
- ('cardLapses', _("Lapse count")),
- ]
- for c, (type, name) in enumerate(self.sortTypes):
- self.form.sortBox.addItem(name)
- if type == self.deck.conf['sortType']:
- idx = c
- self.form.sortBox.setCurrentIndex(idx)
- self.connect(self.form.sortBox, SIGNAL("activated(int)"),
- self.sortChanged)
- self.sortChanged(idx, refresh=False)
- self.connect(self.form.sortOrder, SIGNAL("clicked()"),
- self.toggleSortOrder)
-
- def toggleSortOrder(self):
- self.deck.conf['sortBackwards'] = not self.deck.conf['sortBackwards']
- self.model.cards.reverse()
- self.model.reset()
- self.focusCard()
- self.updateSortIcon()
-
- def updateSortIcon(self):
- if self.deck.conf['sortBackwards']:
- self.form.sortOrder.setIcon(QIcon(":/icons/view-sort-descending.png"))
- else:
- self.form.sortOrder.setIcon(QIcon(":/icons/view-sort-ascending.png"))
-
- def sortChanged(self, idx, refresh=True):
- self.deck.conf['sortType'] = self.sortTypes[idx][0]
- if refresh:
- self.model.showMatching()
- # fixme: we do this in various locations
- self.updateFilterLabel()
- self.focusCard()
+ def setColumnSizes(self):
+ hh = self.form.tableView.horizontalHeader()
+ for c, i in enumerate(self.model.activeCols):
+ if i in ("question", "answer", "factFld"):
+ hh.setResizeMode(c, QHeaderView.Stretch)
+ else:
+ hh.setResizeMode(c, QHeaderView.Interactive)
# Filter tree
######################################################################
diff --git a/aqt/main.py b/aqt/main.py
index 388724d3c..e48c31333 100755
--- a/aqt/main.py
+++ b/aqt/main.py
@@ -164,7 +164,7 @@ title="%s">%s''' % (
self.form.centralwidget.setLayout(self.mainLayout)
addHook("undoEnd", self.maybeEnableUndo)
if self.config['mainWindowState']:
- restoreGeom(self, "mainWindow", 21)
+ restoreGeom(self, "mainWindow")
restoreState(self, "mainWindow")
else:
self.resize(500, 400)
diff --git a/aqt/utils.py b/aqt/utils.py
index ebdbd3781..374c22a0b 100644
--- a/aqt/utils.py
+++ b/aqt/utils.py
@@ -234,13 +234,13 @@ def restoreGeom(widget, key, offset=None):
key += "Geom"
if aqt.mw.config.get(key):
widget.restoreGeometry(aqt.mw.config[key])
- # if sys.platform.startswith("darwin") and offset:
- # from aqt.main import QtConfig as q
- # minor = (q.qt_version & 0x00ff00) >> 8
- # if minor > 6:
- # # bug in osx toolkit
- # s = widget.size()
- # widget.resize(s.width(), s.height()+offset*2)
+ if sys.platform.startswith("darwin") and offset:
+ from aqt.main import QtConfig as q
+ minor = (q.qt_version & 0x00ff00) >> 8
+ if minor > 6:
+ # bug in osx toolkit
+ s = widget.size()
+ widget.resize(s.width(), s.height()+offset*2)
def saveState(widget, key):
key += "State"
diff --git a/designer/browser.ui b/designer/browser.ui
index e1ca29dcd..31577af6f 100644
--- a/designer/browser.ui
+++ b/designer/browser.ui
@@ -88,39 +88,6 @@
- -
-
-
- Sort:
-
-
-
- -
-
-
-
- 20
- 20
-
-
-
- Qt::NoFocus
-
-
-
-
-
-
- :/icons/view-sort-ascending.png:/icons/view-sort-ascending.png
-
-
- true
-
-
-
- -
-
-
-
@@ -159,15 +126,21 @@
QAbstractItemView::SelectRows
+
+ false
+
+
+ 20
+
+
+ true
+
0
-
- 0
-
-