From 941ef99d27e3a34071fb61d21b00468fda23592f Mon Sep 17 00:00:00 2001 From: Taka Date: Tue, 2 May 2017 10:43:18 +0000 Subject: [PATCH] Added the ability to filter cards. --- add_card_widget.py | 64 ++++++++++++++------- main_window.py | 2 +- ui/add_card_widget.ui | 129 ++++++++++++++++++++++++++++++++---------- 3 files changed, 143 insertions(+), 52 deletions(-) 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&lter: + + + le_filter + + + + + + + + 100 + 0 + + + + + 100 + 16777215 + + + + + @@ -237,7 +300,13 @@ + cbo_nationality + rb_vehicles + rb_ordnance + le_filter lb_cards + cancel_button + ok_button