support a second filter in filtered decks

This commit is contained in:
Damien Elmes 2018-01-14 13:08:38 +10:00
parent a062e1bc29
commit 1e0b97f25b
4 changed files with 139 additions and 29 deletions

View file

@ -38,7 +38,7 @@ defaultDynamicDeck = {
'usn': 0, 'usn': 0,
'delays': None, 'delays': None,
'separate': True, 'separate': True,
# list of (search, limit, order); we only use first element for now # list of (search, limit, order); we only use first two elements for now
'terms': [["", 100, 0]], 'terms': [["", 100, 0]],
'resched': True, 'resched': True,
'return': True, # currently unused 'return': True, # currently unused

View file

@ -983,28 +983,30 @@ select id from cards where did in %s and queue = 2 and due <= ? limit ?)"""
assert deck['dyn'] assert deck['dyn']
# move any existing cards back first, then fill # move any existing cards back first, then fill
self.emptyDyn(did) self.emptyDyn(did)
ids = self._fillDyn(deck) cnt = self._fillDyn(deck)
if not ids: if not cnt:
return return
# and change to our new deck # and change to our new deck
self.col.decks.select(did) self.col.decks.select(did)
return ids return cnt
def _fillDyn(self, deck): def _fillDyn(self, deck):
search, limit, order = deck['terms'][0] start = -100000
orderlimit = self._dynOrder(order, limit) total = 0
if search.strip(): for search, limit, order in deck['terms']:
search = "(%s)" % search orderlimit = self._dynOrder(order, limit)
search = "%s -is:suspended -is:buried -deck:filtered" % search if search.strip():
try: search = "(%s)" % search
ids = self.col.findCards(search, order=orderlimit) search = "%s -is:suspended -is:buried -deck:filtered" % search
except: try:
ids = [] ids = self.col.findCards(search, order=orderlimit)
return ids except:
# move the cards over return total
self.col.log(deck['id'], ids) # move the cards over
self._moveToDyn(deck['id'], ids) self.col.log(deck['id'], ids)
return ids self._moveToDyn(deck['id'], ids, start=start+total)
total += len(ids)
return total
def emptyDyn(self, did, lim=None): def emptyDyn(self, did, lim=None):
if not lim: if not lim:
@ -1069,13 +1071,14 @@ group by did
t = "c.due" t = "c.due"
return t + " limit %d" % l return t + " limit %d" % l
def _moveToDyn(self, did, ids): def _moveToDyn(self, did, ids, start=-100000):
deck = self.col.decks.get(did) deck = self.col.decks.get(did)
data = [] data = []
t = intTime(); u = self.col.usn() t = intTime(); u = self.col.usn()
for c, id in enumerate(ids): due = start
# start at -100000 so that reviews are all due for id in ids:
data.append((did, -100000+c, u, id)) data.append((did, due, u, id))
due += 1
query = """ query = """
update cards set update cards set

View file

@ -28,7 +28,8 @@ class DeckConf(QDialog):
self.setupOrder() self.setupOrder()
self.loadConf() self.loadConf()
if search: if search:
self.form.search.setText(search) self.form.search.setText(search + " is:due")
self.form.search_2.setText(search + " is:new")
self.form.search.selectAll() self.form.search.selectAll()
self.show() self.show()
self.exec_() self.exec_()
@ -37,24 +38,51 @@ class DeckConf(QDialog):
def setupOrder(self): def setupOrder(self):
import anki.consts as cs import anki.consts as cs
self.form.order.addItems(list(cs.dynOrderLabels().values())) self.form.order.addItems(list(cs.dynOrderLabels().values()))
self.form.order_2.addItems(list(cs.dynOrderLabels().values()))
def loadConf(self): def loadConf(self):
f = self.form f = self.form
d = self.deck d = self.deck
f.resched.setChecked(d['resched'])
search, limit, order = d['terms'][0] search, limit, order = d['terms'][0]
f.search.setText(search) f.search.setText(search)
f.resched.setChecked(d['resched'])
f.order.setCurrentIndex(order) f.order.setCurrentIndex(order)
f.limit.setValue(limit) f.limit.setValue(limit)
if len(d['terms']) > 1:
search, limit, order = d['terms'][1]
f.search_2.setText(search)
f.order_2.setCurrentIndex(order)
f.limit_2.setValue(limit)
f.secondFilter.setChecked(True)
f.filter2group.setVisible(True)
else:
f.order_2.setCurrentIndex(5)
f.limit_2.setValue(20)
f.secondFilter.setChecked(False)
f.filter2group.setVisible(False)
def saveConf(self): def saveConf(self):
f = self.form f = self.form
d = self.deck d = self.deck
d['delays'] = None
d['terms'][0] = [f.search.text(),
f.limit.value(),
f.order.currentIndex()]
d['resched'] = f.resched.isChecked() d['resched'] = f.resched.isChecked()
d['delays'] = None
terms = [[
f.search.text(),
f.limit.value(),
f.order.currentIndex()]]
if f.secondFilter.isChecked():
terms.append([
f.search_2.text(),
f.limit_2.value(),
f.order_2.currentIndex()])
d['terms'] = terms
self.mw.col.decks.save(d) self.mw.col.decks.save(d)
return True return True

View file

@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>445</width> <width>445</width>
<height>301</height> <height>354</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -66,6 +66,58 @@
</layout> </layout>
</widget> </widget>
</item> </item>
<item>
<widget class="QGroupBox" name="filter2group">
<property name="title">
<string>Filter 2</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="1" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Limit to</string>
</property>
</widget>
</item>
<item row="1" column="3" colspan="2">
<widget class="QComboBox" name="order_2"/>
</item>
<item row="0" column="1" colspan="4">
<widget class="QLineEdit" name="search_2"/>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Search</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="limit_2">
<property name="maximumSize">
<size>
<width>60</width>
<height>16777215</height>
</size>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>99999</number>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLabel" name="label_4">
<property name="text">
<string>cards selected by</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item> <item>
<widget class="QGroupBox" name="groupBox_2"> <widget class="QGroupBox" name="groupBox_2">
<property name="title"> <property name="title">
@ -82,6 +134,13 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="0">
<widget class="QCheckBox" name="secondFilter">
<property name="text">
<string>Enable second filter</string>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>
@ -114,7 +173,11 @@
<tabstop>search</tabstop> <tabstop>search</tabstop>
<tabstop>limit</tabstop> <tabstop>limit</tabstop>
<tabstop>order</tabstop> <tabstop>order</tabstop>
<tabstop>search_2</tabstop>
<tabstop>limit_2</tabstop>
<tabstop>order_2</tabstop>
<tabstop>resched</tabstop> <tabstop>resched</tabstop>
<tabstop>secondFilter</tabstop>
<tabstop>buttonBox</tabstop> <tabstop>buttonBox</tabstop>
</tabstops> </tabstops>
<resources/> <resources/>
@ -151,5 +214,21 @@
</hint> </hint>
</hints> </hints>
</connection> </connection>
<connection>
<sender>secondFilter</sender>
<signal>toggled(bool)</signal>
<receiver>filter2group</receiver>
<slot>setVisible(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>125</x>
<y>265</y>
</hint>
<hint type="destinationlabel">
<x>222</x>
<y>155</y>
</hint>
</hints>
</connection>
</connections> </connections>
</ui> </ui>