diff --git a/add_card_widget.py b/add_card_widget.py
index 3cac853..e0a892f 100644
--- a/add_card_widget.py
+++ b/add_card_widget.py
@@ -36,6 +36,7 @@ class AddCardWidget( QWidget ) :
# connect our handlers
self.cbo_nationality.currentIndexChanged[str].connect( self.on_nationality_changed )
self.lb_cards.itemDoubleClicked.connect( self.on_card_doubleclicked )
+ self.le_filter.textChanged.connect( self.on_filter_textChanged )
self.ok_button.clicked.connect( self.on_ok )
self.cancel_button.clicked.connect( self.on_cancel )
for rb in [self.rb_vehicles,self.rb_ordnance] :
@@ -44,6 +45,40 @@ class AddCardWidget( QWidget ) :
self.cbo_nationality.setCurrentIndex( 0 )
self.on_nationality_changed( self.cbo_nationality.itemText(0) )
+ def _reload_cards( self , focus ) :
+ """Reload the available cards."""
+ # initialize
+ self.lb_cards.clear()
+ # figure out what type of cards to show
+ if self.rb_vehicles.isChecked() :
+ card_type = db.TAGTYPE_VEHICLE
+ elif self.rb_ordnance.isChecked() :
+ card_type = db.TAGTYPE_ORDNANCE
+ else :
+ return
+ cards = globals.cards[ self.cbo_nationality.currentText() ]
+ cards = cards.get( card_type )
+ if cards is None :
+ assert False
+ return
+ # prepare for filtering
+ def filter_val( str ) :
+ return str.replace(" ","").lower()
+ filter_text = filter_val( self.le_filter.text() )
+ # reload the available cards
+ for card in cards :
+ if filter_text and filter_val(card.name).find( filter_text ) < 0 :
+ continue
+ item = QListWidgetItem( card.name )
+ item.setData( Qt.UserRole , card )
+ self.lb_cards.addItem( item )
+ self.lbl_cards.setText(
+ "Cards:{}".format( " (filtered)" if filter_text else "" )
+ )
+ self.lb_cards.setCurrentRow( 0 )
+ if focus :
+ self.lb_cards.setFocus()
+
def on_ok( self ) :
"""Accept the currently selected card."""
item = self.lb_cards.currentItem()
@@ -74,30 +109,17 @@ class AddCardWidget( QWidget ) :
rb.setChecked( True )
break
# reload the cards
- self.on_card_type_changed()
+ self.le_filter.setText( "" )
+ self._reload_cards( True )
def on_card_type_changed( self ) :
"""Update the widget when the active card type is changed."""
- self.lb_cards.clear()
- # figure out what type of cards to show
- if self.rb_vehicles.isChecked() :
- card_type = db.TAGTYPE_VEHICLE
- elif self.rb_ordnance.isChecked() :
- card_type = db.TAGTYPE_ORDNANCE
- else :
- return
- # reload the available cards
- cards = globals.cards[ self.cbo_nationality.currentText() ]
- cards = cards.get( card_type )
- if cards is None :
- assert False
- return
- for card in cards :
- item = QListWidgetItem( card.name )
- item.setData( Qt.UserRole , card )
- self.lb_cards.addItem( item )
- self.lb_cards.setCurrentRow( 0 )
- self.lb_cards.setFocus()
+ self.le_filter.setText( "" )
+ self._reload_cards( True )
+
+ def on_filter_textChanged( self , val ) :
+ """Update the widget when the filter text is changed."""
+ self._reload_cards( False )
def on_card_doubleclicked( self , item ) :
# handle the event
diff --git a/main_window.py b/main_window.py
index 032037e..1e05167 100644
--- a/main_window.py
+++ b/main_window.py
@@ -210,7 +210,7 @@ class MainWindow( QMainWindow ) :
)
self.tab_widget.setCurrentIndex( index )
self._update_ui()
- widget.setFocus() # FIXME! s.b. to first child control
+ widget.lb_cards.setFocus()
def on_add_card_accepted( self , card ) :
"""Handle the user's card selection."""
index = self._find_add_card_tab()
diff --git a/ui/add_card_widget.ui b/ui/add_card_widget.ui
index 1eb2fbf..383a48a 100644
--- a/ui/add_card_widget.ui
+++ b/ui/add_card_widget.ui
@@ -6,8 +6,8 @@
0
0
- 450
- 300
+ 440
+ 356
@@ -43,7 +43,7 @@
- 290
+ 300
0
89
26
@@ -56,7 +56,7 @@
- 80
+ 90
0
120
28
@@ -86,10 +86,16 @@
0
-1
- 75
+ 81
31
+
+
+ 75
+ true
+
+
&Nationality:
@@ -100,21 +106,16 @@
- 210
+ 220
0
79
26
- &Vehicles
+ Ve&hicles
- label
- rb_ordnance
- cbo_nationality
- label
- rb_vehicles
-
@@ -131,28 +132,90 @@
20
-
-
-
- 0
- 0
- 51
- 19
-
+
+
+ 0
-
-
- 16777215
- 20
-
+
+ 0
-
- &Cards:
+
+ 0
-
- lb_cards
+
+ 0
-
+
+ 0
+
+ -
+
+
+
+ 16777215
+ 20
+
+
+
+
+ 50
+ false
+
+
+
+ &Cards:
+
+
+ lb_cards
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+ -
+
+
+
+ 75
+ true
+
+
+
+ Fi<er:
+
+
+ le_filter
+
+
+
+ -
+
+
+
+ 100
+ 0
+
+
+
+
+ 100
+ 16777215
+
+
+
+
+
-
@@ -237,7 +300,13 @@
+ cbo_nationality
+ rb_vehicles
+ rb_ordnance
+ le_filter
lb_cards
+ cancel_button
+ ok_button