def get_menu_item(self):
        """Overrides method from base class.

           Adds the menu item on the MainWindow if the starters can be found.
           """
        MessageBus.subscribe(MessageBus.Type.CARD_TEXT_MSG, 'post_set_text',
                             self.post_set_card_text)
    def get_menu_item(self):
        """Overrides method from base class.

           Adds the menu item on the MainWindow if the starters can be found.
           """
        MessageBus.subscribe(MessageBus.Type.CARD_TEXT_MSG, 'post_set_text',
                             self.post_set_card_text)
        # Listen for card set changes to manage the cache
        listen_row_update(self.card_set_changed, PhysicalCardSet)
        listen_row_destroy(self.card_set_added_deleted, PhysicalCardSet)
        listen_row_created(self.card_set_added_deleted, PhysicalCardSet)
        self._bDoSignalCleanup = True

        # Make sure we add the tag we need
        oCardTextView = self.parent.card_text_pane.view
        oCardTextView.text_buffer.add_list_tag('starters')

        self.oToggle = Gtk.CheckMenuItem(label="Show Starter Information")
        self.oToggle.connect('toggled', self._toggle_starter)
        self.oToggle.set_active(False)
        if self.check_enabled():
            sPrefsValue = self.get_config_item('show starters')
            if sPrefsValue == 'Yes':
                self.oToggle.set_active(True)
        else:
            self.oToggle.set_sensitive(False)
        oDownload = Gtk.MenuItem(label="Download starter decks")
        oDownload.connect('activate', self.do_download)
        return [('Preferences', self.oToggle), ('Data Downloads', oDownload)]
 def _toggle_starter(self, oToggle):
     """Toggle the show info flag"""
     self.bShowInfo = oToggle.get_active()
     # Update the card text pane to reflect changes
     MessageBus.publish(MessageBus.Type.CARD_TEXT_MSG, 'set_card_text',
                        self.oLastCard)
     if self.bShowInfo:
         self.set_config_item('show starters', 'Yes')
     else:
         self.set_config_item('show starters', 'No')
 def cleanup(self):
     """Remove the listener"""
     if self._bDoSignalCleanup:
         disconnect_row_update(self.card_set_changed, PhysicalCardSet)
         disconnect_row_destroy(self.card_set_added_deleted,
                                PhysicalCardSet)
         disconnect_row_created(self.card_set_added_deleted,
                                PhysicalCardSet)
         MessageBus.unsubscribe(MessageBus.Type.CARD_TEXT_MSG,
                                'post_set_text', self.post_set_card_text)
     super().cleanup()
 def config_activate(self, oMenuWidget):
     """Launch the configuration dialog."""
     bValue = oMenuWidget.get_active()
     self.set_config_item(SuffixTransformer.CONFIG_KEY, bValue)
     MessageBus.publish(MessageBus.Type.CONFIG_MSG,
                        SuffixTransformer.CONFIG_KEY, bValue)
 def cleanup(self):
     """Remove the listener"""
     MessageBus.unsubscribe(MessageBus.Type.CARD_TEXT_MSG, 'post_set_text',
                            self.post_set_card_text)
     super().cleanup()
 def set_show_errata_markers(self, bShowErrata):
     """Set the 'show errata markers' option."""
     self._oConfig['main']['show errata markers'] = bShowErrata
     MessageBus.publish(MessageBus.Type.CONFIG_MSG, 'show_errata_markers')
 def test_basic(self):
     """Set of simple tests of the Card List Model"""
     # pylint: disable=too-many-statements, too-many-locals
     # Want a long, sequential test case to minimise
     # repeated setups, so it has lots of lines + variables
     oModel = CardListModel(self.oConfig)
     # We test with illegal cards shown
     oModel.hideillegal = False
     oListener = LocalTestListener(oModel, True)
     self.assertFalse(oListener.bLoadCalled)
     oModel.load()
     self.assertTrue(oListener.bLoadCalled)
     aExpectedCards = set(AbstractCard.select())
     self.assertEqual(aExpectedCards, set(oListener.aCards))
     self.assertEqual(
         oModel.get_card_iterator(None).count(),
         PhysicalCard.select().count())
     # The model as an entry for every AbstractCard and entries
     # below that for every PhysicalCard
     # Set grouping to None for these tests
     oModel.groupby = NullGrouping
     oModel.load()
     self.assertEqual(count_all_cards(oModel),
                      AbstractCard.select().count())
     self.assertEqual(count_second_level(oModel),
                      PhysicalCard.select().count())
     # Check without expansions
     oModel.bExpansions = False
     oModel.load()
     self.assertEqual(count_all_cards(oModel),
                      AbstractCard.select().count())
     self.assertEqual(count_second_level(oModel), 0)
     oModel.bExpansions = True
     oModel.groupby = CryptLibraryGrouping
     oModel.load()
     self.assertEqual(count_all_cards(oModel),
                      AbstractCard.select().count())
     self.assertEqual(count_second_level(oModel),
                      PhysicalCard.select().count())
     self.assertEqual(count_top_level(oModel), 2)
     # Test filtering
     # Test filter which selects nothing works
     oModel.selectfilter = BaseFilters.CardNameFilter('ZZZZZZZ')
     oModel.applyfilter = True
     oModel.load()
     self.assertEqual(count_top_level(oModel), 1)
     self.assertEqual(count_all_cards(oModel), 0)
     oModel.applyfilter = False
     oModel.load()
     self.assertEqual(count_all_cards(oModel),
                      AbstractCard.select().count())
     self.assertEqual(count_second_level(oModel),
                      PhysicalCard.select().count())
     self.assertEqual(count_top_level(oModel), 2)
     # Test card type
     oModel.selectfilter = BaseFilters.CardTypeFilter('Vampire')
     oModel.applyfilter = True
     oModel.load()
     self.assertEqual(count_top_level(oModel), 1)
     self.assertEqual(count_second_level(oModel),
                      oModel.get_card_iterator(oModel.selectfilter).count())
     oModel.groupby = CardTypeGrouping
     oModel.load()
     self.assertEqual(count_top_level(oModel), 1)
     self.assertEqual(count_second_level(oModel),
                      oModel.get_card_iterator(oModel.selectfilter).count())
     # Test path queries
     # The remain tests require a sorted model
     oModel.enable_sorting()
     oPath = '0:0:0'  # First expansion for the first card
     self.assertEqual(oModel.get_exp_name_from_path(oPath),
                      oModel.sUnknownExpansion)
     self.assertEqual(oModel.get_card_name_from_path(oPath),
                      u'Aabbt Kindred (Group 2)')
     tAll = oModel.get_all_from_path(oPath)
     self.assertEqual(tAll[0], u'Aabbt Kindred (Group 2)')
     self.assertEqual(tAll[1], oModel.sUnknownExpansion)
     self.assertEqual(tAll[2], 0)
     self.assertEqual(tAll[3], 2)
     oIter = oModel.get_iter(oPath)
     self.assertEqual(oModel.get_child_entries_from_iter(oIter), [])
     oPath = '0:0'  # First card
     self.assertEqual(oModel.get_exp_name_from_path(oPath), None)
     self.assertEqual(oModel.get_inc_dec_flags_from_path(oPath),
                      (False, False))
     oIter = oModel.get_iter(oPath)
     tAll = oModel.get_all_from_path(oPath)
     self.assertEqual(tAll[0], u'Aabbt Kindred (Group 2)')
     self.assertEqual(tAll[1], None)
     self.assertEqual(tAll[2], 0)
     self.assertEqual(tAll[3], 1)
     oAbbt = IAbstractCard(u'Aabbt Kindred (Group 2)')
     oFirst = IPhysicalCard((oAbbt, None))
     oSecond = IPhysicalCard((oAbbt, IExpansion('Final Nights')))
     self.assertEqual(oModel.get_child_entries_from_iter(oIter),
                      [(oFirst, 0), (oSecond, 0)])
     # Test that the different variants show correctly
     oPath = '0:28:0'  # Harold's position
     self.assertEqual(oModel.get_card_name_from_path(oPath),
                      u"Harold Zettler, Pentex Director (Group 4)")
     self.assertEqual(oModel.get_exp_name_from_path(oPath),
                      oModel.sUnknownExpansion)
     oPath = '0:28:1'
     self.assertEqual(oModel.get_card_name_from_path(oPath),
                      u"Harold Zettler, Pentex Director (Group 4)")
     self.assertEqual(oModel.get_exp_name_from_path(oPath), "Third Edition")
     oPath = '0:28:2'
     self.assertEqual(oModel.get_card_name_from_path(oPath),
                      u"Harold Zettler, Pentex Director (Group 4)")
     self.assertEqual(oModel.get_exp_name_from_path(oPath),
                      "Third Edition (Sketch)")
     oListener.bLoadCalled = False
     # Test MessageBus clear does the right thing
     MessageBus.clear(oModel)
     oModel.load()
     self.assertFalse(oListener.bLoadCalled)
 def __init__(self, oIconManager, oMainWindow):
     oBuffer = CardTextBuffer()
     super().__init__(oBuffer, oIconManager, oMainWindow)
     MessageBus.subscribe(MessageBus.Type.CONFIG_MSG, 'show_errata_markers',
                          self._force_reload)