diff --git a/asl_cards/db.py b/asl_cards/db.py index c113030..7f1eb9c 100644 --- a/asl_cards/db.py +++ b/asl_cards/db.py @@ -1,5 +1,6 @@ import sys import os +from collections import defaultdict from sqlalchemy import sql , orm , create_engine from sqlalchemy import Column , ForeignKey , String , Integer , Binary @@ -63,7 +64,7 @@ def open_database( fname ) : conn_string = "sqlite:///{}".format( fname ) global db_engine db_engine = create_engine( conn_string , convert_unicode=True ) - #db_engine.echo = True + #db_engine.echo = True # initialize our session global db_session @@ -89,8 +90,37 @@ def add_cards( cards ) : # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +def load_cards() : + """Load the cards from the database.""" + # load the raw rows + query = db_session.query( AslCard ) + cards = list( query.all() ) + card_index = defaultdict( lambda: defaultdict(list) ) + # generate the card index + for card in cards : + d = card_index[ card.nationality ] + tag = card.tag.lower() + if tag.startswith( "ordnance" ) : + tag_type = "ordnance" + elif tag.startswith( "vehicle" ) : + tag_type = "vehicle" + else : + raise RuntimeError( "Unknown tag type ({}) for AslCard: {}".format( tag , card ) ) + d[ tag_type ].append( card ) + return card_index + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +def dump_cards( cards ) : + """Dump the card index.""" + for nationality in cards : + for tag_type in cards[nationality] : + print( "{} ({}):".format( nationality , tag_type ) ) + for card in cards[nationality][tag_type] : + print( "- {}".format( card ) ) + def dump_database() : - """Dump the database.""" + """Dump the raw database rows.""" # dump the ASL cards query = db_session.query( AslCard ) for card in query.all() : diff --git a/globals.py b/globals.py index c8e2207..7dffcd9 100644 --- a/globals.py +++ b/globals.py @@ -5,3 +5,6 @@ app_name = None # application settings app_settings = None debug_settings = None + +# AslCard table +card = {} # { nationality: { "ordnance|vehicle": [ AslCard's ] } } diff --git a/main.py b/main.py index 4784017..fac4884 100755 --- a/main.py +++ b/main.py @@ -9,6 +9,7 @@ from PyQt5.QtWidgets import QApplication from constants import * import globals +import asl_cards.db as db # --------------------------------------------------------------------- @@ -27,10 +28,13 @@ def do_main( args ) : # parse the command-line arguments settings_fname = None - opts , args = getopt.getopt( args[1:] , "c:h?" , ["config=","help"] ) + db_fname = None + opts , args = getopt.getopt( args[1:] , "c:d:h?" , ["config=","db=","help"] ) for opt,val in opts : if opt in ["-c","--config"] : settings_fname = val + elif opt in ["-d","--db"] : + db_fname = val elif opt in ["-h","--help","-?"] : print_help() else : @@ -43,12 +47,21 @@ def do_main( args ) : if sys.platform != "win32" : settings_fname = "." + settings_fname settings_fname = os.path.join( QDir.homePath() , settings_fname ) + if not db_fname : + # try to locate the database + db_fname = os.path.join( globals.base_dir , globals.app_name+".db" ) + if not os.path.isfile( db_fname ) : + raise RuntimeError( "Can't find database: {}".format( db_fname ) ) # load our settings globals.app_settings = QSettings( settings_fname , QSettings.IniFormat ) fname = os.path.join( os.path.split(settings_fname)[0] , "debug.ini" ) globals.debug_settings = QSettings( fname , QSettings.IniFormat ) + # open the database + db.open_database( db_fname ) + globals.cards = db.load_cards() + # do main processing app = QApplication( sys.argv ) import main_window diff --git a/main_window.py b/main_window.py index fd94b03..227fae1 100755 --- a/main_window.py +++ b/main_window.py @@ -2,15 +2,42 @@ import sys import os from PyQt5.QtCore import Qt , QPoint , QSize -from PyQt5.QtWidgets import QMainWindow +from PyQt5.QtWidgets import QMainWindow , QVBoxLayout , QHBoxLayout , QWidget , QTabWidget , QLabel from PyQt5.QtWidgets import QMessageBox -from PyQt5.QtGui import QIcon +from PyQt5.QtGui import QPainter , QPixmap , QIcon , QBrush +import asl_cards.db as db from constants import * import globals # --------------------------------------------------------------------- +class AslCardWidget( QWidget ) : + + def __init__( self , card ) : + # initialize + super().__init__() + self.card = card + self.pixmap = QPixmap() + self.pixmap.loadFromData( card.card_image.image_data ) + + def paintEvent( self , evt ) : + qp = QPainter() + qp.begin( self ) + qp_size = evt.rect().size() + # draw the AslCard image + qp.setRenderHint( QPainter.Antialiasing ) + pixmap_size = self.pixmap.size() + pixmap_size.scale( qp_size , Qt.KeepAspectRatio ) + pixmap = self.pixmap.scaled( pixmap_size , Qt.KeepAspectRatio , Qt.SmoothTransformation ) + qp.drawPixmap( + (qp_size.width()-pixmap_size.width())/2 , (qp_size.height()-pixmap_size.height())/2 , + pixmap + ) + qp.end() + +# --------------------------------------------------------------------- + class MainWindow( QMainWindow ) : def __init__( self ) : @@ -21,6 +48,18 @@ class MainWindow( QMainWindow ) : # load the window settings self.resize( globals.app_settings.value( MAINWINDOW_SIZE , QSize(500,300) ) ) self.move( globals.app_settings.value( MAINWINDOW_POSITION , QPoint(200,200) ) ) + # initialize the window controls + self.tab_widget = QTabWidget( self ) + self.tab_widget.setTabsClosable( True ) + self.tab_widgets = [] + + for i in range(0,3) : # FIXME! + card = globals.cards["Chinese"]["ordnance"][ i ] + w = AslCardWidget( card ) + self.tab_widget.addTab( w , card.name ) + self.tab_widgets.append( w ) + + self.setCentralWidget( self.tab_widget ) def closeEvent( self , evt ) : """Handle window close."""