customizable deck order, nicer layout of browser and study options

This commit is contained in:
Damien Elmes 2009-06-08 23:06:48 +09:00
parent 3bab1b6829
commit b5fdca39e7
5 changed files with 271 additions and 238 deletions

View file

@ -97,6 +97,7 @@ class Config(dict):
'proxyPass': '', 'proxyPass': '',
'loadLastDeck': False, 'loadLastDeck': False,
'deckBrowserRefreshPeriod': 3600, 'deckBrowserRefreshPeriod': 3600,
'deckBrowserOrder': 0,
} }
for (k,v) in fields.items(): for (k,v) in fields.items():
if not self.has_key(k): if not self.has_key(k):

View file

@ -8,6 +8,7 @@ from PyQt4.QtWebKit import QWebPage
import os, sys, re, types, gettext, stat, traceback, inspect import os, sys, re, types, gettext, stat, traceback, inspect
import shutil, time, glob, tempfile, datetime, zipfile, locale import shutil, time, glob, tempfile, datetime, zipfile, locale
from operator import itemgetter
from PyQt4.QtCore import * from PyQt4.QtCore import *
from PyQt4.QtGui import * from PyQt4.QtGui import *
@ -1024,17 +1025,22 @@ your deck."""))
if ui.splash.finished: if ui.splash.finished:
self.finishProgress() self.finishProgress()
self.browserLastRefreshed = time.time() self.browserLastRefreshed = time.time()
self.reorderBrowserDecks()
def reorderBrowserDecks(self): def reorderBrowserDecks(self):
h = {} if self.config['deckBrowserOrder'] == 0:
for d in self.browserDecks: self.browserDecks.sort(key=itemgetter('mod'),
h[d['path']] = d reverse=True)
self.browserDecks = [] else:
for path in self.config['recentDeckPaths']: def custcmp(a, b):
try: x = cmp(not not b['due'], not not a['due'])
self.browserDecks.append(h[path]) if x:
except: return x
pass x = cmp(not not b['new'], not not a['new'])
if x:
return x
return cmp(a['mod'], b['mod'])
self.browserDecks.sort(cmp=custcmp)
def forceBrowserRefresh(self): def forceBrowserRefresh(self):
self.browserLastRefreshed = 0 self.browserLastRefreshed = 0
@ -1058,6 +1064,7 @@ your deck."""))
sip.delete(self.mainWin.decksFrame.layout()) sip.delete(self.mainWin.decksFrame.layout())
# build new layout # build new layout
layout = QGridLayout() layout = QGridLayout()
layout.setSpacing(0)
if (time.time() - self.browserLastRefreshed > if (time.time() - self.browserLastRefreshed >
self.config['deckBrowserRefreshPeriod']): self.config['deckBrowserRefreshPeriod']):
self.refreshBrowserDecks() self.refreshBrowserDecks()
@ -1065,14 +1072,13 @@ your deck."""))
self.reorderBrowserDecks() self.reorderBrowserDecks()
if self.browserDecks: if self.browserDecks:
layout.addWidget(QLabel(_("<b>Deck</b>")), 0, 0) layout.addWidget(QLabel(_("<b>Deck</b>")), 0, 0)
layout.setColumnStretch(0, 1)
l = QLabel(_("<b>Due<br>Today</b>")) l = QLabel(_("<b>Due<br>Today</b>"))
l.setAlignment(Qt.AlignRight | Qt.AlignVCenter) l.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
layout.addWidget(l, 0, 1) layout.addWidget(l, 0, 1)
l = QLabel(_("<b>New<br>Today</b>")) l = QLabel(_("<b>New<br>Today</b>"))
l.setAlignment(Qt.AlignRight | Qt.AlignVCenter) l.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
layout.addWidget(l, 0, 2) layout.addWidget(l, 0, 2)
# space
layout.addWidget(QLabel(" " * 4), 0, 3)
for c, deck in enumerate(self.browserDecks): for c, deck in enumerate(self.browserDecks):
# name # name
n = deck['name'] n = deck['name']
@ -1081,9 +1087,9 @@ your deck."""))
mod = _("%s ago") % anki.utils.fmtTimeSpan( mod = _("%s ago") % anki.utils.fmtTimeSpan(
time.time() - deck['mod']) time.time() - deck['mod'])
mod = "<font size=-1>%s</font>" % mod mod = "<font size=-1>%s</font>" % mod
layout.addWidget(QLabel( l = QLabel("%d. <b>%s</b><br>&nbsp;&nbsp;&nbsp;&nbsp;%s" %
"%d. <b>%s</b><br>&nbsp;&nbsp;&nbsp;&nbsp;%s" % (c+1, n, mod))
(c+1, n, mod)), c+1, 0) layout.addWidget(l, c+1, 0)
# due # due
col = '<b><font color=#0000ff>%s</font></b>' col = '<b><font color=#0000ff>%s</font></b>'
if deck['due'] > 0: if deck['due'] > 0:
@ -1100,6 +1106,7 @@ your deck."""))
else: else:
s = "" s = ""
l = QLabel(s) l = QLabel(s)
l.setMargin(10)
l.setMinimumWidth(50) l.setMinimumWidth(50)
l.setAlignment(Qt.AlignRight | Qt.AlignVCenter) l.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
layout.addWidget(l, c+1, 2) layout.addWidget(l, c+1, 2)
@ -1117,7 +1124,7 @@ your deck."""))
openButton.setToolTip(_("Open this deck%s") % extra) openButton.setToolTip(_("Open this deck%s") % extra)
self.connect(openButton, SIGNAL("clicked()"), self.connect(openButton, SIGNAL("clicked()"),
lambda d=deck['path']: self.loadDeck(d)) lambda d=deck['path']: self.loadDeck(d))
layout.addWidget(openButton, c+1, 4) layout.addWidget(openButton, c+1, 3)
if c == 0: if c == 0:
focusButton = openButton focusButton = openButton
# more # more
@ -1130,7 +1137,7 @@ your deck."""))
_("Forget removes the deck from the list without deleting.")) _("Forget removes the deck from the list without deleting."))
self.connect(moreButton, SIGNAL("currentIndexChanged(int)"), self.connect(moreButton, SIGNAL("currentIndexChanged(int)"),
lambda idx, c=c: self.onDeckBrowserMore(idx, c)) lambda idx, c=c: self.onDeckBrowserMore(idx, c))
layout.addWidget(moreButton, c+1, 5) layout.addWidget(moreButton, c+1, 4)
refresh = QPushButton(_("Refresh")) refresh = QPushButton(_("Refresh"))
refresh.setToolTip(_("Check due counts again (Ctrl+Shift+r)")) refresh.setToolTip(_("Check due counts again (Ctrl+Shift+r)"))
refresh.setShortcut(_("Ctrl+Shift+r")) refresh.setShortcut(_("Ctrl+Shift+r"))

View file

@ -142,7 +142,7 @@ class Preferences(QDialog):
self.dialog.addZeroSpace.setChecked(self.config['addZeroSpace']) self.dialog.addZeroSpace.setChecked(self.config['addZeroSpace'])
self.dialog.alternativeTheme.setChecked(self.config['alternativeTheme']) self.dialog.alternativeTheme.setChecked(self.config['alternativeTheme'])
self.dialog.showProgress.setChecked(self.config['showProgress']) self.dialog.showProgress.setChecked(self.config['showProgress'])
self.dialog.openLastDeck.setChecked(self.config['loadLastDeck']) self.dialog.deckBrowserOrder.setChecked(self.config['deckBrowserOrder'])
def updateAdvanced(self): def updateAdvanced(self):
self.config['showTrayIcon'] = self.dialog.showTray.isChecked() self.config['showTrayIcon'] = self.dialog.showTray.isChecked()
@ -156,6 +156,10 @@ class Preferences(QDialog):
self.config['showProgress'] = self.dialog.showProgress.isChecked() self.config['showProgress'] = self.dialog.showProgress.isChecked()
self.config['preventEditUntilAnswer'] = self.dialog.preventEdits.isChecked() self.config['preventEditUntilAnswer'] = self.dialog.preventEdits.isChecked()
self.config['loadLastDeck'] = self.dialog.openLastDeck.isChecked() self.config['loadLastDeck'] = self.dialog.openLastDeck.isChecked()
if self.dialog.deckBrowserOrder.isChecked():
self.config['deckBrowserOrder'] = 1
else:
self.config['deckBrowserOrder'] = 0
def codeToIndex(self, code): def codeToIndex(self, code):
n = 0 n = 0

View file

@ -601,6 +601,12 @@
</item> </item>
<item> <item>
<widget class="QFrame" name="studyOptionsFrame"> <widget class="QFrame" name="studyOptionsFrame">
<property name="maximumSize">
<size>
<width>400</width>
<height>16777215</height>
</size>
</property>
<property name="frameShape"> <property name="frameShape">
<enum>QFrame::StyledPanel</enum> <enum>QFrame::StyledPanel</enum>
</property> </property>
@ -1108,6 +1114,12 @@
</item> </item>
<item> <item>
<widget class="QFrame" name="frame_3"> <widget class="QFrame" name="frame_3">
<property name="maximumSize">
<size>
<width>500</width>
<height>16777215</height>
</size>
</property>
<property name="frameShape"> <property name="frameShape">
<enum>QFrame::StyledPanel</enum> <enum>QFrame::StyledPanel</enum>
</property> </property>

View file

@ -1,3 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>Preferences</class> <class>Preferences</class>
<widget class="QDialog" name="Preferences"> <widget class="QDialog" name="Preferences">
@ -5,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>320</width> <width>332</width>
<height>419</height> <height>438</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -32,7 +33,7 @@
<item> <item>
<widget class="QLabel" name="label"> <widget class="QLabel" name="label">
<property name="text"> <property name="text">
<string>&lt;h1>Language&lt;/h1></string> <string>&lt;h1&gt;Language&lt;/h1&gt;</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>false</bool> <bool>false</bool>
@ -52,7 +53,7 @@
<item> <item>
<widget class="QLabel" name="label_2"> <widget class="QLabel" name="label_2">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy vsizetype="Fixed" hsizetype="Fixed" > <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
@ -61,7 +62,7 @@
<enum>Qt::TabFocus</enum> <enum>Qt::TabFocus</enum>
</property> </property>
<property name="text"> <property name="text">
<string>&lt;h1>Reviewing&lt;/h1></string> <string>&lt;h1&gt;Reviewing&lt;/h1&gt;</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>false</bool> <bool>false</bool>
@ -165,7 +166,7 @@
<item> <item>
<widget class="QLabel" name="label_16"> <widget class="QLabel" name="label_16">
<property name="text"> <property name="text">
<string>&lt;h1>Synchronisation&lt;/h1>&lt;a href="http://anki.ichi2.net/">Create a free account&lt;/a>.</string> <string>&lt;h1&gt;Synchronisation&lt;/h1&gt;&lt;a href=&quot;http://anki.ichi2.net/&quot;&gt;Create a free account&lt;/a&gt;.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@ -236,7 +237,7 @@
<item> <item>
<widget class="QLabel" name="label_13"> <widget class="QLabel" name="label_13">
<property name="text"> <property name="text">
<string>&lt;h1>Proxy&lt;/h1></string> <string>&lt;h1&gt;Proxy&lt;/h1&gt;</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -334,7 +335,7 @@
<item> <item>
<widget class="QLabel" name="label_4"> <widget class="QLabel" name="label_4">
<property name="text"> <property name="text">
<string>&lt;h1>Autosaving&lt;/h1></string> <string>&lt;h1&gt;Autosaving&lt;/h1&gt;</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -412,7 +413,7 @@
<item> <item>
<widget class="QLabel" name="label_9"> <widget class="QLabel" name="label_9">
<property name="text"> <property name="text">
<string>&lt;h1>Backups&lt;/h1>Decks are backed up when they are opened, and only if they have been modified since the last backup.</string> <string>&lt;h1&gt;Backups&lt;/h1&gt;Decks are backed up when they are opened, and only if they have been modified since the last backup.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@ -469,7 +470,7 @@
<item> <item>
<widget class="QLabel" name="openBackupFolder"> <widget class="QLabel" name="openBackupFolder">
<property name="text"> <property name="text">
<string>&lt;a href="backups">Open backup folder&lt;/a></string> <string>&lt;a href=&quot;backups&quot;&gt;Open backup folder&lt;/a&gt;</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -508,7 +509,7 @@
<item row="2" column="0"> <item row="2" column="0">
<widget class="QLabel" name="label_6"> <widget class="QLabel" name="label_6">
<property name="text"> <property name="text">
<string>&lt;h1>Advanced settings&lt;/h1></string> <string>&lt;h1&gt;Advanced settings&lt;/h1&gt;</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -556,7 +557,7 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="9" column="0" > <item row="10" column="0">
<widget class="QCheckBox" name="addZeroSpace"> <widget class="QCheckBox" name="addZeroSpace">
<property name="text"> <property name="text">
<string>Add hidden char to text (fixes Thai on OSX)</string> <string>Add hidden char to text (fixes Thai on OSX)</string>
@ -566,7 +567,14 @@
<item row="8" column="0"> <item row="8" column="0">
<widget class="QCheckBox" name="openLastDeck"> <widget class="QCheckBox" name="openLastDeck">
<property name="text"> <property name="text">
<string>Open last deck even when multiple decks available</string> <string>Always open last deck on startup</string>
</property>
</widget>
</item>
<item row="9" column="0">
<widget class="QCheckBox" name="deckBrowserOrder">
<property name="text">
<string>Show decks with cards due first in browser</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -639,6 +647,7 @@
<tabstop>showTray</tabstop> <tabstop>showTray</tabstop>
<tabstop>showStudyOptions</tabstop> <tabstop>showStudyOptions</tabstop>
<tabstop>openLastDeck</tabstop> <tabstop>openLastDeck</tabstop>
<tabstop>deckBrowserOrder</tabstop>
<tabstop>addZeroSpace</tabstop> <tabstop>addZeroSpace</tabstop>
<tabstop>buttonBox</tabstop> <tabstop>buttonBox</tabstop>
</tabstops> </tabstops>