mirror of
https://github.com/ankitects/anki.git
synced 2025-09-22 07:52:24 -04:00
support a second filter in filtered decks
This commit is contained in:
parent
a062e1bc29
commit
1e0b97f25b
4 changed files with 139 additions and 29 deletions
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Reference in a new issue