different columns in editor, more use of space, more

- space between lines smaller
- changing the sort field will change the last column
- the last column size is adjustable (use the rightmost slider)
This commit is contained in:
Damien Elmes 2009-02-14 19:47:44 +09:00
parent b32cc953d1
commit ae5a8b918a
3 changed files with 81 additions and 15 deletions

View file

@ -81,6 +81,7 @@ class Config(dict):
'editorReverseOrder': False, 'editorReverseOrder': False,
'editFontFamily': 'Arial', 'editFontFamily': 'Arial',
'editFontSize': 12, 'editFontSize': 12,
'editLineSize': 20,
'factEditorAdvanced': False, 'factEditorAdvanced': False,
'typeAnswerFontSize': 20, 'typeAnswerFontSize': 20,
'recentColours': ["#000000", "#0000ff"], 'recentColours': ["#000000", "#0000ff"],

View file

@ -14,6 +14,7 @@ from anki.facts import factsTable, fieldsTable, Fact
from anki.utils import fmtTimeSpan, parseTags, findTag, addTags, deleteTags, \ from anki.utils import fmtTimeSpan, parseTags, findTag, addTags, deleteTags, \
stripHTML, ids2str stripHTML, ids2str
from ankiqt.ui.utils import saveGeom, restoreGeom, saveSplitter, restoreSplitter from ankiqt.ui.utils import saveGeom, restoreGeom, saveSplitter, restoreSplitter
from ankiqt.ui.utils import saveHeader, restoreHeader
from anki.errors import * from anki.errors import *
from anki.db import * from anki.db import *
from anki.stats import CardStats from anki.stats import CardStats
@ -25,6 +26,10 @@ CARD_ANSWER = 2
CARD_DUE = 3 CARD_DUE = 3
CARD_REPS = 4 CARD_REPS = 4
CARD_FACTID = 5 CARD_FACTID = 5
CARD_CREATED = 6
CARD_MODIFIED = 7
CARD_INTERVAL = 8
CARD_EASE = 9
# Deck editor # Deck editor
########################################################################## ##########################################################################
@ -38,12 +43,10 @@ class DeckModel(QAbstractTableModel):
self.filterTag = None self.filterTag = None
self.sortKey = None self.sortKey = None
# column title, display accessor, sort attr # column title, display accessor, sort attr
self.columns = [("Question", self.currentQuestion, self.columns = [(_("Question"), self.currentQuestion),
self.currentQuestion), (_("Answer"), self.currentAnswer),
("Answer", self.currentAnswer, [_("Due"), self.thirdColumn],
self.currentAnswer), ]
(" "*10 + "Due" + " "*10, self.nextDue,
"nextTime")]
self.searchStr = "" self.searchStr = ""
self.cards = [] self.cards = []
self.deleted = {} self.deleted = {}
@ -60,9 +63,9 @@ class DeckModel(QAbstractTableModel):
def data(self, index, role): def data(self, index, role):
if not index.isValid(): if not index.isValid():
return QVariant() return QVariant()
if role == Qt.FontRole and index.column() == 2: if role == Qt.FontRole:
f = QFont() f = QFont()
f.setPixelSize(12) f.setPixelSize(self.parent.config['editFontSize'])
return QVariant(f) return QVariant(f)
elif role == Qt.DisplayRole or role == Qt.EditRole: elif role == Qt.DisplayRole or role == Qt.EditRole:
if len(self.cards[index.row()]) == 1: if len(self.cards[index.row()]) == 1:
@ -76,9 +79,6 @@ class DeckModel(QAbstractTableModel):
s = re.sub("\[sound:[^]]+\]", "", s) s = re.sub("\[sound:[^]]+\]", "", s)
s = s.strip() s = s.strip()
return QVariant(s) return QVariant(s)
elif role == Qt.SizeHintRole:
if index.column() == 2:
return QVariant(20)
else: else:
return QVariant() return QVariant()
@ -87,6 +87,10 @@ class DeckModel(QAbstractTableModel):
return QVariant() return QVariant()
elif role == Qt.DisplayRole: elif role == Qt.DisplayRole:
return QVariant(self.columns[section][0]) return QVariant(self.columns[section][0])
elif role == Qt.FontRole:
f = QFont()
f.setPixelSize(10)
return QVariant(f)
else: else:
return QVariant() return QVariant()
@ -200,8 +204,8 @@ and (facts.tags like :s or models.tags like :s or cardModels.name like :s)""",
def updateCard(self, index): def updateCard(self, index):
try: try:
self.cards[index.row()] = self.deck.s.first(""" self.cards[index.row()] = self.deck.s.first("""
select id, question, answer, due, reps, factId select id, question, answer, due, reps, factId, created, modified,
from cards where id = :id""", id=self.cards[index.row()][0]) interval, factor from cards where id = :id""", id=self.cards[index.row()][0])
self.emit(SIGNAL("dataChanged(QModelIndex,QModelIndex)"), self.emit(SIGNAL("dataChanged(QModelIndex,QModelIndex)"),
index, self.index(index.row(), 1)) index, self.index(index.row(), 1))
except IndexError: except IndexError:
@ -242,6 +246,53 @@ and (facts.tags like :s or models.tags like :s or cardModels.name like :s)""",
else: else:
return _("in %s") % fmtTimeSpan(secs, pad=0) return _("in %s") % fmtTimeSpan(secs, pad=0)
def thirdColumn(self, index):
if self.sortKey == "created":
return self.createdColumn(index)
elif self.sortKey == "modified":
return self.modifiedColumn(index)
elif self.sortKey == "interval":
return self.intervalColumn(index)
elif self.sortKey == "reps":
return self.repsColumn(index)
elif self.sortKey == "factor":
return self.easeColumn(index)
else:
return self.nextDue(index)
def updateHeader(self):
if self.sortKey == "created":
k = _("Created")
elif self.sortKey == "modified":
k = _("Modified")
elif self.sortKey == "interval":
k = _("Interval")
elif self.sortKey == "reps":
k = _("Reps")
elif self.sortKey == "factor":
k = _("Ease")
else:
k = _("Due")
self.columns[-1][0] = k
def createdColumn(self, index):
return fmtTimeSpan(
time.time() - self.cards[index.row()][CARD_CREATED]) + " ago"
def modifiedColumn(self, index):
return fmtTimeSpan(
time.time() - self.cards[index.row()][CARD_MODIFIED]) + " ago"
def intervalColumn(self, index):
return fmtTimeSpan(
self.cards[index.row()][CARD_INTERVAL]*86400)
def repsColumn(self, index):
return str(self.cards[index.row()][CARD_REPS])
def easeColumn(self, index):
return "%0.2f" % self.cards[index.row()][CARD_EASE]
class EditDeck(QMainWindow): class EditDeck(QMainWindow):
def __init__(self, parent): def __init__(self, parent):
@ -367,6 +418,7 @@ class EditDeck(QMainWindow):
if idx <= 7: if idx <= 7:
self.config['sortIndex'] = idx self.config['sortIndex'] = idx
self.model.sortKey = self.sortKey self.model.sortKey = self.sortKey
self.model.updateHeader()
if refresh: if refresh:
self.model.showMatching() self.model.showMatching()
self.updateFilterLabel() self.updateFilterLabel()
@ -481,10 +533,13 @@ class EditDeck(QMainWindow):
def setupHeaders(self): def setupHeaders(self):
if not sys.platform.startswith("win32"): if not sys.platform.startswith("win32"):
self.dialog.tableView.verticalHeader().hide() self.dialog.tableView.verticalHeader().hide()
self.dialog.tableView.horizontalHeader().hide() self.dialog.tableView.horizontalHeader().show()
for i in range(2): for i in range(2):
self.dialog.tableView.horizontalHeader().setResizeMode(i, QHeaderView.Stretch) self.dialog.tableView.horizontalHeader().setResizeMode(i, QHeaderView.Stretch)
self.dialog.tableView.horizontalHeader().setResizeMode(2, QHeaderView.ResizeToContents) self.dialog.tableView.horizontalHeader().setResizeMode(2, QHeaderView.Interactive)
restoreHeader(self.dialog.tableView.horizontalHeader(), "editor")
self.dialog.tableView.verticalHeader().setDefaultSectionSize(
self.parent.config['editLineSize'])
def setupMenus(self): def setupMenus(self):
# actions # actions
@ -522,6 +577,7 @@ class EditDeck(QMainWindow):
return return
self.editor.setFact(None) self.editor.setFact(None)
saveGeom(self, "editor") saveGeom(self, "editor")
saveHeader(self.dialog.tableView.horizontalHeader(), "editor")
self.hide() self.hide()
ui.dialogs.close("CardList") ui.dialogs.close("CardList")
self.parent.moveToState("auto") self.parent.moveToState("auto")

View file

@ -167,6 +167,15 @@ def restoreSplitter(widget, key):
if ankiqt.mw.config.get(key): if ankiqt.mw.config.get(key):
widget.restoreState(ankiqt.mw.config[key]) widget.restoreState(ankiqt.mw.config[key])
def saveHeader(widget, key):
key += "Header"
ankiqt.mw.config[key] = widget.saveState()
def restoreHeader(widget, key):
key += "Header"
if ankiqt.mw.config.get(key):
widget.restoreState(ankiqt.mw.config[key])
def mungeQA(deck, txt): def mungeQA(deck, txt):
txt = renderLatex(deck, txt) txt = renderLatex(deck, txt)
txt = stripSounds(txt) txt = stripSounds(txt)