diff --git a/_freeze.py b/_freeze.py index 2219c8f..72a2d11 100644 --- a/_freeze.py +++ b/_freeze.py @@ -25,7 +25,8 @@ extra_files = [] extra_files.extend( get_extra_files( "index/*.txt" ) ) extra_files.extend( get_extra_files( "resources/*.ico" ) ) extra_files.extend( get_extra_files( "resources/*.png" ) ) -extra_files.extend( get_extra_files( "ui/*ui" ) ) +extra_files.extend( get_extra_files( "ui/*.ui" ) ) +extra_files.extend( get_extra_files( "natinfo/*" ) ) build_options = { "packages": [ "os" , "sqlalchemy" ] , "excludes": [ "tkinter" ] , diff --git a/asl_cards/natinfo.py b/asl_cards/natinfo.py new file mode 100644 index 0000000..cbb07bd --- /dev/null +++ b/asl_cards/natinfo.py @@ -0,0 +1,50 @@ +""" Manage information about each nationality. +""" + +import sys +import os +import json + +_nat_info = None +_base_dir = None + +# --------------------------------------------------------------------- + +def _get_key( nat ) : + """Get the JSON key for a nationality. + + We require the JSON keys to be lower-case, with no spaces (not strictly necessary, but not a bad idea :-/). + """ + return nat.lower().replace( " " , "-" ) + +# --------------------------------------------------------------------- + +def load( base_dir ) : + """Load the nationality information.""" + global _base_dir , _nat_info + _base_dir = os.path.abspath( base_dir ) + fname = os.path.join( base_dir , "natinfo.json" ) + if os.path.isfile( fname ) : + with open( fname , "r" ) as fp : + _nat_info = json.load( fp ) + else : + _nat_info = {} + +def dump() : + """Dump the nationality information.""" + for nat in sorted(_nat_info.keys()) : + print( "{}:".format( nat ) ) + print( "- flag = {}".format( get_flag(nat) ) ) + +def get_flag( nat ) : + """Locate the flag image file for a nationality. + + These are set in the JSON data file at $/{nat}/flag. If there is no entry, the default is $/flags/${nat}.png + """ + key = _get_key( nat ) + try : + fname = _nat_info[ key ][ "flag" ] + except ( KeyError , TypeError ) : + fname = key + ".png" + fname = os.path.join( _base_dir , os.path.join("flags", fname) ) + return fname if os.path.isfile(fname) else None diff --git a/asl_cards/natinfo/flags/allied-minor.png b/asl_cards/natinfo/flags/allied-minor.png new file mode 100644 index 0000000..6133139 Binary files /dev/null and b/asl_cards/natinfo/flags/allied-minor.png differ diff --git a/asl_cards/natinfo/flags/american.png b/asl_cards/natinfo/flags/american.png new file mode 100644 index 0000000..56103db Binary files /dev/null and b/asl_cards/natinfo/flags/american.png differ diff --git a/asl_cards/natinfo/flags/axis-minor.png b/asl_cards/natinfo/flags/axis-minor.png new file mode 100644 index 0000000..79b78c6 Binary files /dev/null and b/asl_cards/natinfo/flags/axis-minor.png differ diff --git a/asl_cards/natinfo/flags/british.png b/asl_cards/natinfo/flags/british.png new file mode 100644 index 0000000..e2656a9 Binary files /dev/null and b/asl_cards/natinfo/flags/british.png differ diff --git a/asl_cards/natinfo/flags/chinese-gmd.png b/asl_cards/natinfo/flags/chinese-gmd.png new file mode 100644 index 0000000..d7b77e1 Binary files /dev/null and b/asl_cards/natinfo/flags/chinese-gmd.png differ diff --git a/asl_cards/natinfo/flags/chinese.png b/asl_cards/natinfo/flags/chinese.png new file mode 100644 index 0000000..50ed813 Binary files /dev/null and b/asl_cards/natinfo/flags/chinese.png differ diff --git a/asl_cards/natinfo/flags/finnish.png b/asl_cards/natinfo/flags/finnish.png new file mode 100644 index 0000000..676ceab Binary files /dev/null and b/asl_cards/natinfo/flags/finnish.png differ diff --git a/asl_cards/natinfo/flags/french.png b/asl_cards/natinfo/flags/french.png new file mode 100644 index 0000000..8933d6f Binary files /dev/null and b/asl_cards/natinfo/flags/french.png differ diff --git a/asl_cards/natinfo/flags/german.png b/asl_cards/natinfo/flags/german.png new file mode 100644 index 0000000..ff08ddf Binary files /dev/null and b/asl_cards/natinfo/flags/german.png differ diff --git a/asl_cards/natinfo/flags/italian.png b/asl_cards/natinfo/flags/italian.png new file mode 100644 index 0000000..3d36a26 Binary files /dev/null and b/asl_cards/natinfo/flags/italian.png differ diff --git a/asl_cards/natinfo/flags/japanese.png b/asl_cards/natinfo/flags/japanese.png new file mode 100644 index 0000000..2b18fda Binary files /dev/null and b/asl_cards/natinfo/flags/japanese.png differ diff --git a/asl_cards/natinfo/flags/russian.png b/asl_cards/natinfo/flags/russian.png new file mode 100644 index 0000000..a1acda4 Binary files /dev/null and b/asl_cards/natinfo/flags/russian.png differ diff --git a/asl_cards/natinfo/natinfo.json b/asl_cards/natinfo/natinfo.json new file mode 100644 index 0000000..0562f2b --- /dev/null +++ b/asl_cards/natinfo/natinfo.json @@ -0,0 +1,81 @@ +{ + +"allied-minor": { +} , + +"american": { +} , + +"axis-minor": { +} , + +"belgian": { + "flag": "allied-minor.png" +} , + +"british": { +} , + +"bulgarian": { + "flag": "axis-minor.png" +} , + +"chinese": { +} , + +"croatian": { + "flag": "axis-minor.png" +} , + +"danish": { + "flag": "axis-minor.png" +} , + +"dutch": { + "flag": "allied-minor.png" +} , + +"finnish": { + "flag": "axis-minor.png" +} , + +"french": { +} , + +"german": { +} , + +"greek": { + "flag": "allied-minor.png" +} , + +"hungarian": { + "flag": "axis-minor.png" +} , + +"italian": { +} , + +"japanese": { +} , + +"polish": { + "flag": "allied-minor.png" +} , + +"romanian": { + "flag": "axis-minor.png" +} , + +"russian": { +} , + +"slovakian": { + "flag": "axis-minor.png" +} , + +"yugoslav": { + "flag": "allied-minor.png" +} + +} diff --git a/asl_cards/tests/natinfo-data/flags/american.png b/asl_cards/tests/natinfo-data/flags/american.png new file mode 100644 index 0000000..e69de29 diff --git a/asl_cards/tests/natinfo-data/flags/japanese-flag.gif b/asl_cards/tests/natinfo-data/flags/japanese-flag.gif new file mode 100644 index 0000000..e69de29 diff --git a/asl_cards/tests/natinfo-data/natinfo.json b/asl_cards/tests/natinfo-data/natinfo.json new file mode 100644 index 0000000..d6af812 --- /dev/null +++ b/asl_cards/tests/natinfo-data/natinfo.json @@ -0,0 +1,20 @@ +{ + "german": { + "_comment_": "this nationality has no flag" + } , + + "russian": { + "flag": "_missing-file_" + } , + + "american" :{ + "_comment_": "this nationality has a default flag" + } , + + "japanese" :{ + "flag": "japanese-flag.gif" + } , + + "allied-minor": { + } +} diff --git a/asl_cards/tests/test_natinfo.py b/asl_cards/tests/test_natinfo.py new file mode 100755 index 0000000..f2328be --- /dev/null +++ b/asl_cards/tests/test_natinfo.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python3 + +import sys +import os +import unittest + +from _test_case_base import TestCaseBase +from asl_cards import natinfo + +# --------------------------------------------------------------------- + +class TestNatInfo( TestCaseBase ) : + """Test nationality info.""" + + @classmethod + def setUpClass( cls ) : + # load the nationality info + base_dir = os.path.split( __file__ )[ 0 ] + fname = os.path.join( base_dir , "natinfo-data" ) + natinfo.load( fname ) + + def test_flags( self ) : + """Test locating the flag image files for each nationality.""" + self.assertIsNone( natinfo.get_flag( "xxx" ) ) + self.assertIsNone( natinfo.get_flag( "german" ) ) + self.assertTrue( natinfo.get_flag("american").endswith( "/flags/american.png" ) ) + self.assertTrue( natinfo.get_flag("japanese").endswith( "/flags/japanese-flag.gif" ) ) + +# --------------------------------------------------------------------- + +if __name__ == "__main__" : + unittest.main() diff --git a/main.py b/main.py index ae85f0d..093f282 100755 --- a/main.py +++ b/main.py @@ -7,6 +7,7 @@ import getopt from PyQt5.QtCore import QSettings , QDir from PyQt5.QtWidgets import QApplication +from asl_cards import natinfo from constants import * import globals @@ -53,6 +54,13 @@ def do_main( args ) : fname = os.path.join( os.path.split(settings_fname)[0] , "debug.ini" ) globals.debug_settings = QSettings( fname , QSettings.IniFormat ) + # initialize + dname = os.path.join( globals.base_dir , "natinfo" ) + if not os.path.isdir( dname ) : + # nb: for a dev environment (or you can create a symlink natinfo -> asl_cards/natinfo) + dname = os.path.join( globals.base_dir , "asl_cards/natinfo" ) + natinfo.load( dname ) + # do main processing app = QApplication( sys.argv ) from main_window import MainWindow diff --git a/main_window.py b/main_window.py index 9a54910..85267d1 100644 --- a/main_window.py +++ b/main_window.py @@ -7,6 +7,7 @@ from PyQt5.QtWidgets import QMessageBox , QAction from PyQt5.QtGui import QPainter , QPixmap , QIcon , QBrush import asl_cards.db as db +from asl_cards import natinfo from constants import * import globals from add_card_widget import AddCardWidget @@ -179,7 +180,11 @@ class MainWindow( QMainWindow ) : index = self._find_add_card_tab() assert index is not None self.tab_widget.removeTab( index ) - widget = self.tab_widget.insertTab( index , AslCardWidget(card) , card.name ) + fname = natinfo.get_flag( card.nationality ) + if fname : + widget = self.tab_widget.insertTab( index , AslCardWidget(card) , QIcon(fname) , card.name ) + else : + widget = self.tab_widget.insertTab( index , AslCardWidget(card) , card.name ) self.tab_widget.setCurrentIndex( index ) self._update_ui() def on_add_card_cancelled( self ) :