parent
2a8af8ed8b
commit
bd26c9a38a
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 3.8 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 3.1 KiB |
After Width: | Height: | Size: 4.0 KiB |
After Width: | Height: | Size: 3.3 KiB |
@ -0,0 +1,232 @@ |
||||
import os |
||||
|
||||
from PyQt5 import uic |
||||
from PyQt5.QtCore import QThread , pyqtSignal |
||||
from PyQt5.QtWidgets import QWidget , QFrame , QFileDialog , QMessageBox |
||||
from PyQt5.QtGui import QPixmap , QIcon |
||||
|
||||
from asl_cards.parse import PdfParser |
||||
import asl_cards.db as db |
||||
|
||||
from constants import * |
||||
import globals |
||||
|
||||
# --------------------------------------------------------------------- |
||||
|
||||
class AnalyzeThread( QThread ) : |
||||
|
||||
# define our signals |
||||
progress_signal = pyqtSignal( float , str , name="progress" ) |
||||
progress2_signal = pyqtSignal( float , name="progress2" ) |
||||
completed_signal = pyqtSignal( str , name="completed" ) |
||||
|
||||
def __init__( self , cards_dir , db_fname ) : |
||||
# initialize |
||||
super(AnalyzeThread,self).__init__() |
||||
self.cards_dir = cards_dir |
||||
self.db_fname = db_fname |
||||
|
||||
def run( self ) : |
||||
"""Run the worker thread.""" |
||||
try : |
||||
# initialize |
||||
if os.path.isfile( self.db_fname ) : |
||||
os.unlink( self.db_fname ) |
||||
# parse the files |
||||
self.parser = PdfParser( |
||||
progress = lambda pval,msg: self.progress_signal.emit( -1 if pval is None else pval , msg ) , |
||||
progress2 = lambda pval: self.progress2_signal.emit( pval ) |
||||
) |
||||
cards = self.parser.parse( self.cards_dir ) |
||||
db.open_database( self.db_fname , True ) |
||||
db.add_cards( cards ) |
||||
except Exception as ex : |
||||
# notify slots that something went wrong |
||||
if globals.debug_settings.value("Debug/LogAnalyzeExceptions",type=bool) : |
||||
import traceback |
||||
traceback.print_exc() |
||||
self.completed_signal.emit( str(ex) ) |
||||
else : |
||||
# notify slots that we've finished |
||||
self.completed_signal.emit( "" ) |
||||
|
||||
# --------------------------------------------------------------------- |
||||
|
||||
class StartupWidget( QWidget ) : |
||||
"""This form lets the user initialize a new database, or load an existing one.""" |
||||
|
||||
def __init__( self , db_fname , parent=None ) : |
||||
# initialize |
||||
super(StartupWidget,self).__init__( parent=parent ) |
||||
self.analyze_thread = None |
||||
# FUDGE! Workaround recursive import's :-/ |
||||
global MainWindow |
||||
from main_window import MainWindow |
||||
# initialize the widget |
||||
uic.loadUi( os.path.join(globals.base_dir,"ui/startup_widget.ui") , self ) |
||||
self.setMinimumSize( self.size() ) |
||||
self.frm_analyze_progress.hide() |
||||
# initialize the widget |
||||
self.lbl_analyze_icon.setPixmap( |
||||
QPixmap( os.path.join( globals.base_dir , "resources/analyze.png" ) ) |
||||
) |
||||
self.lbl_analyze_icon.setFrameStyle( QFrame.NoFrame ) |
||||
self.btn_cards_dir.setIcon( |
||||
QIcon( os.path.join( globals.base_dir , "resources/dir_dialog.png" ) ) |
||||
) |
||||
self.btn_save_db_fname.setIcon( |
||||
QIcon( os.path.join( globals.base_dir , "resources/file_dialog.png" ) ) |
||||
) |
||||
self.btn_analyze.setIcon( |
||||
QIcon( os.path.join( globals.base_dir , "resources/analyze.png" ) ) |
||||
) |
||||
self.btn_analyze.setText( " " + self.btn_analyze.text() ) |
||||
self.btn_cancel_analyze.setIcon( |
||||
QIcon( os.path.join( globals.base_dir , "resources/stop.png" ) ) |
||||
) |
||||
self.btn_cancel_analyze.setText( " " + self.btn_cancel_analyze.text() ) |
||||
# initialize the widget |
||||
self.lbl_load_db_icon.setPixmap( |
||||
QPixmap( os.path.join( globals.base_dir , "resources/load_db.png" ) ) |
||||
) |
||||
self.lbl_load_db_icon.setFrameStyle( QFrame.NoFrame ) |
||||
self.btn_load_db_fname.setIcon( |
||||
QIcon( os.path.join( globals.base_dir , "resources/file_dialog.png" ) ) |
||||
) |
||||
self.btn_load_db.setIcon( |
||||
QIcon( os.path.join( globals.base_dir , "resources/load_db.png" ) ) |
||||
) |
||||
self.btn_load_db.setText( " " + self.btn_load_db.text() ) |
||||
# load the widget |
||||
if os.path.isfile( db_fname ) : |
||||
self.le_load_db_fname.setText( db_fname ) |
||||
else : |
||||
self.le_save_db_fname.setText( db_fname ) |
||||
# connect our handlers |
||||
self.btn_cards_dir.clicked.connect( self.on_btn_cards_dir ) |
||||
self.btn_save_db_fname.clicked.connect( self.on_btn_save_db_fname ) |
||||
self.btn_analyze.clicked.connect( self.on_analyze ) |
||||
self.btn_load_db_fname.clicked.connect( self.on_btn_load_db_fname ) |
||||
self.btn_load_db.clicked.connect( self.on_btn_load_db ) |
||||
|
||||
def on_btn_cards_dir( self ) : |
||||
"""Let the user browse to where the "ASL Cards" files are.""" |
||||
dname = self.le_cards_dir.text().strip() |
||||
dname = QFileDialog.getExistingDirectory( self , "ASL Cards" , dname , QFileDialog.ShowDirsOnly ) |
||||
if not dname : |
||||
return |
||||
self.le_cards_dir.setText( dname ) |
||||
self.le_save_db_fname.setFocus() |
||||
|
||||
def on_btn_save_db_fname( self ) : |
||||
"""Let the user browse to where to save the database.""" |
||||
fname = self.le_save_db_fname.text().strip() |
||||
fname = QFileDialog.getSaveFileName( |
||||
self , "Save results" , |
||||
fname , "Database files (*.db)" |
||||
)[ 0 ] |
||||
if not fname : |
||||
return |
||||
self.le_save_db_fname.setText( fname ) |
||||
self.btn_analyze.setFocus() |
||||
|
||||
def on_analyze( self ) : |
||||
"""Analyze the ASL Card files.""" |
||||
# validate the "ASL Cards" directory |
||||
cards_dir = self.le_cards_dir.text().strip() |
||||
if not cards_dir : |
||||
MainWindow.show_error_msg( "Please specify where the \"ASL Cards\" PDF files are." ) |
||||
self.le_cards_dir.setFocus() |
||||
return |
||||
if not os.path.isdir( cards_dir ) : |
||||
MainWindow.show_error_msg( "Can't find the \"ASL Cards\" directory." ) |
||||
self.le_cards_dir.setFocus() |
||||
return |
||||
# validate the database filename |
||||
fname = self.le_save_db_fname.text().strip() |
||||
if not fname : |
||||
MainWindow.show_error_msg( "Please choose where you want to save the results." ) |
||||
self.le_save_db_fname.setFocus() |
||||
return |
||||
# run the analysis (in a worker thread) |
||||
self.frm_open_db.hide() |
||||
self.frm_analyze_progress.show() |
||||
self._update_analyze_ui( False ) |
||||
self.btn_cancel_analyze.setEnabled( True ) |
||||
self.btn_cancel_analyze.clicked.connect( self.on_cancel_analyze ) |
||||
self.analyze_thread = AnalyzeThread( cards_dir , fname ) |
||||
self.analyze_thread.progress_signal.connect( self.on_analyze_progress ) |
||||
self.analyze_thread.progress2_signal.connect( self.on_analyze_progress2 ) |
||||
self.analyze_thread.completed_signal.connect( self.on_analyze_completed ) |
||||
self.analyze_thread.start() |
||||
|
||||
def on_analyze_progress( self , pval , msg ) : |
||||
"""Update the analysis progress in the UI.""" |
||||
if pval >= 0 : |
||||
self.pb_files.setValue( int( 100*pval + 0.5 ) ) |
||||
self.pb_files.setFormat( msg ) |
||||
self.pb_pages.setValue( 0 ) |
||||
def on_analyze_progress2( self , pval ) : |
||||
"""Update the analysis progress in the UI.""" |
||||
self.pb_pages.setValue( int( 100*pval + 0.5 ) ) |
||||
|
||||
def on_cancel_analyze( self ) : |
||||
"""Cancel the analyze worker thread.""" |
||||
if not self.analyze_thread or self.analyze_thread.parser.cancelling : |
||||
return |
||||
rc = MainWindow.ask( "Cancel the analysis?" , QMessageBox.Ok|QMessageBox.Cancel , QMessageBox.Cancel ) |
||||
if rc != QMessageBox.Ok : |
||||
return |
||||
self.analyze_thread.parser.cancelling = True |
||||
self.pb_files.setFormat( "Cancelling, please wait..." ) |
||||
self.btn_cancel_analyze.setEnabled( False ) |
||||
|
||||
def on_analyze_completed( self , ex ) : |
||||
# clean up |
||||
self.analyze_thread = None |
||||
# check if the analysis failed |
||||
if ex : |
||||
MainWindow.show_error_msg( "Analyze failed:\n\n{}".format( ex ) ) |
||||
self._update_analyze_ui( True ) |
||||
self.frm_analyze_progress.hide() |
||||
self.le_cards_dir.setFocus() |
||||
return |
||||
# the analysis completed successully - start the main app |
||||
self.pb_files.setValue( 100 ) |
||||
self.pb_pages.setValue( 100 ) |
||||
MainWindow.show_info_msg( "The \"ASL Cards\" files were analyzed successully." ) |
||||
self.parent().start_main_app( self.le_save_db_fname.text().strip() ) |
||||
|
||||
def _update_analyze_ui( self , enable ) : |
||||
# update the UI |
||||
widgets = [ self.lbl_cards_dir , self.le_cards_dir, self.btn_cards_dir ] |
||||
widgets.extend( [ self.lbl_save_db_fname , self.le_save_db_fname , self.btn_save_db_fname ] ) |
||||
widgets.append( self.btn_analyze ) |
||||
for w in widgets : |
||||
w.setEnabled( enable ) |
||||
|
||||
def on_btn_load_db_fname( self ) : |
||||
"""Let the user browse to a database to load.""" |
||||
fname = self.le_load_db_fname.text().strip() |
||||
fname = QFileDialog.getOpenFileName( |
||||
self , "Load database" , |
||||
fname , "Database files (*.db)" |
||||
)[ 0 ] |
||||
if not fname : |
||||
return |
||||
self.le_load_db_fname.setText( fname ) |
||||
self.btn_load_db.setFocus() |
||||
|
||||
def on_btn_load_db( self ) : |
||||
"""Load the database and start the main application.""" |
||||
fname = self.le_load_db_fname.text().strip() |
||||
if not fname : |
||||
MainWindow.show_error_msg( "Please choose a database to load." ) |
||||
self.le_load_db_fname.setFocus() |
||||
return |
||||
if not os.path.isfile( fname ) : |
||||
MainWindow.show_error_msg( "Can't find this database file." ) |
||||
self.le_load_db_fname.setFocus() |
||||
return |
||||
# notify the main window it can start the main app |
||||
self.parent().start_main_app( fname ) |
@ -0,0 +1,513 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<ui version="4.0"> |
||||
<class>StartupWidget</class> |
||||
<widget class="QWidget" name="StartupWidget"> |
||||
<property name="geometry"> |
||||
<rect> |
||||
<x>0</x> |
||||
<y>0</y> |
||||
<width>566</width> |
||||
<height>399</height> |
||||
</rect> |
||||
</property> |
||||
<layout class="QVBoxLayout" name="verticalLayout_5"> |
||||
<item> |
||||
<widget class="QFrame" name="frm_analyze"> |
||||
<property name="sizePolicy"> |
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred"> |
||||
<horstretch>0</horstretch> |
||||
<verstretch>0</verstretch> |
||||
</sizepolicy> |
||||
</property> |
||||
<property name="frameShape"> |
||||
<enum>QFrame::StyledPanel</enum> |
||||
</property> |
||||
<property name="frameShadow"> |
||||
<enum>QFrame::Raised</enum> |
||||
</property> |
||||
<layout class="QHBoxLayout" name="horizontalLayout"> |
||||
<item alignment="Qt::AlignTop"> |
||||
<widget class="QLabel" name="lbl_analyze_icon"> |
||||
<property name="sizePolicy"> |
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed"> |
||||
<horstretch>0</horstretch> |
||||
<verstretch>0</verstretch> |
||||
</sizepolicy> |
||||
</property> |
||||
<property name="minimumSize"> |
||||
<size> |
||||
<width>50</width> |
||||
<height>50</height> |
||||
</size> |
||||
</property> |
||||
<property name="maximumSize"> |
||||
<size> |
||||
<width>50</width> |
||||
<height>50</height> |
||||
</size> |
||||
</property> |
||||
<property name="autoFillBackground"> |
||||
<bool>false</bool> |
||||
</property> |
||||
<property name="frameShape"> |
||||
<enum>QFrame::Box</enum> |
||||
</property> |
||||
<property name="text"> |
||||
<string/> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item> |
||||
<widget class="QWidget" name="widget_2" native="true"> |
||||
<layout class="QVBoxLayout" name="verticalLayout"> |
||||
<property name="spacing"> |
||||
<number>2</number> |
||||
</property> |
||||
<property name="leftMargin"> |
||||
<number>8</number> |
||||
</property> |
||||
<property name="topMargin"> |
||||
<number>0</number> |
||||
</property> |
||||
<property name="rightMargin"> |
||||
<number>0</number> |
||||
</property> |
||||
<property name="bottomMargin"> |
||||
<number>0</number> |
||||
</property> |
||||
<item> |
||||
<widget class="QLabel" name="label"> |
||||
<property name="sizePolicy"> |
||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred"> |
||||
<horstretch>0</horstretch> |
||||
<verstretch>0</verstretch> |
||||
</sizepolicy> |
||||
</property> |
||||
<property name="text"> |
||||
<string>If this is the first time you have run this program, you need to analyze the PDF files first, and save the results in a database.</string> |
||||
</property> |
||||
<property name="alignment"> |
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> |
||||
</property> |
||||
<property name="wordWrap"> |
||||
<bool>true</bool> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item> |
||||
<widget class="QWidget" name="widget_5" native="true"> |
||||
<layout class="QVBoxLayout" name="verticalLayout_3"> |
||||
<property name="spacing"> |
||||
<number>2</number> |
||||
</property> |
||||
<property name="leftMargin"> |
||||
<number>0</number> |
||||
</property> |
||||
<property name="topMargin"> |
||||
<number>8</number> |
||||
</property> |
||||
<property name="rightMargin"> |
||||
<number>0</number> |
||||
</property> |
||||
<property name="bottomMargin"> |
||||
<number>0</number> |
||||
</property> |
||||
<item> |
||||
<widget class="QLabel" name="lbl_cards_dir"> |
||||
<property name="text"> |
||||
<string>Where the "ASL Cards" &files are:</string> |
||||
</property> |
||||
<property name="buddy"> |
||||
<cstring>le_cards_dir</cstring> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item> |
||||
<widget class="QWidget" name="widget_6" native="true"> |
||||
<layout class="QHBoxLayout" name="horizontalLayout_3"> |
||||
<property name="spacing"> |
||||
<number>2</number> |
||||
</property> |
||||
<property name="leftMargin"> |
||||
<number>0</number> |
||||
</property> |
||||
<property name="topMargin"> |
||||
<number>0</number> |
||||
</property> |
||||
<property name="rightMargin"> |
||||
<number>0</number> |
||||
</property> |
||||
<property name="bottomMargin"> |
||||
<number>0</number> |
||||
</property> |
||||
<item> |
||||
<widget class="QLineEdit" name="le_cards_dir"/> |
||||
</item> |
||||
<item> |
||||
<widget class="QPushButton" name="btn_cards_dir"> |
||||
<property name="sizePolicy"> |
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed"> |
||||
<horstretch>0</horstretch> |
||||
<verstretch>0</verstretch> |
||||
</sizepolicy> |
||||
</property> |
||||
<property name="minimumSize"> |
||||
<size> |
||||
<width>30</width> |
||||
<height>30</height> |
||||
</size> |
||||
</property> |
||||
<property name="maximumSize"> |
||||
<size> |
||||
<width>30</width> |
||||
<height>30</height> |
||||
</size> |
||||
</property> |
||||
<property name="text"> |
||||
<string/> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
</layout> |
||||
</widget> |
||||
</item> |
||||
</layout> |
||||
</widget> |
||||
</item> |
||||
<item> |
||||
<widget class="QWidget" name="widget_3" native="true"> |
||||
<layout class="QVBoxLayout" name="verticalLayout_2"> |
||||
<property name="spacing"> |
||||
<number>2</number> |
||||
</property> |
||||
<property name="leftMargin"> |
||||
<number>0</number> |
||||
</property> |
||||
<property name="topMargin"> |
||||
<number>2</number> |
||||
</property> |
||||
<property name="rightMargin"> |
||||
<number>0</number> |
||||
</property> |
||||
<property name="bottomMargin"> |
||||
<number>0</number> |
||||
</property> |
||||
<item> |
||||
<widget class="QLabel" name="lbl_save_db_fname"> |
||||
<property name="text"> |
||||
<string>&Save the results here:</string> |
||||
</property> |
||||
<property name="buddy"> |
||||
<cstring>le_save_db_fname</cstring> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item> |
||||
<widget class="QWidget" name="widget_4" native="true"> |
||||
<layout class="QHBoxLayout" name="horizontalLayout_2"> |
||||
<property name="spacing"> |
||||
<number>2</number> |
||||
</property> |
||||
<property name="leftMargin"> |
||||
<number>0</number> |
||||
</property> |
||||
<property name="topMargin"> |
||||
<number>0</number> |
||||
</property> |
||||
<property name="rightMargin"> |
||||
<number>0</number> |
||||
</property> |
||||
<property name="bottomMargin"> |
||||
<number>0</number> |
||||
</property> |
||||
<item> |
||||
<widget class="QLineEdit" name="le_save_db_fname"/> |
||||
</item> |
||||
<item> |
||||
<widget class="QPushButton" name="btn_save_db_fname"> |
||||
<property name="sizePolicy"> |
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed"> |
||||
<horstretch>0</horstretch> |
||||
<verstretch>0</verstretch> |
||||
</sizepolicy> |
||||
</property> |
||||
<property name="minimumSize"> |
||||
<size> |
||||
<width>30</width> |
||||
<height>30</height> |
||||
</size> |
||||
</property> |
||||
<property name="maximumSize"> |
||||
<size> |
||||
<width>30</width> |
||||
<height>30</height> |
||||
</size> |
||||
</property> |
||||
<property name="text"> |
||||
<string/> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
</layout> |
||||
</widget> |
||||
</item> |
||||
</layout> |
||||
</widget> |
||||
</item> |
||||
<item alignment="Qt::AlignRight"> |
||||
<widget class="QPushButton" name="btn_analyze"> |
||||
<property name="text"> |
||||
<string>&Analyze</string> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item> |
||||
<widget class="QFrame" name="frm_analyze_progress"> |
||||
<property name="enabled"> |
||||
<bool>true</bool> |
||||
</property> |
||||
<property name="frameShape"> |
||||
<enum>QFrame::NoFrame</enum> |
||||
</property> |
||||
<property name="frameShadow"> |
||||
<enum>QFrame::Raised</enum> |
||||
</property> |
||||
<layout class="QVBoxLayout" name="verticalLayout_6"> |
||||
<property name="spacing"> |
||||
<number>2</number> |
||||
</property> |
||||
<property name="leftMargin"> |
||||
<number>0</number> |
||||
</property> |
||||
<property name="topMargin"> |
||||
<number>0</number> |
||||
</property> |
||||
<property name="rightMargin"> |
||||
<number>0</number> |
||||
</property> |
||||
<property name="bottomMargin"> |
||||
<number>0</number> |
||||
</property> |
||||
<item> |
||||
<widget class="QProgressBar" name="pb_files"> |
||||
<property name="value"> |
||||
<number>24</number> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item> |
||||
<widget class="QProgressBar" name="pb_pages"> |
||||
<property name="minimumSize"> |
||||
<size> |
||||
<width>0</width> |
||||
<height>15</height> |
||||
</size> |
||||
</property> |
||||
<property name="maximumSize"> |
||||
<size> |
||||
<width>16777215</width> |
||||
<height>15</height> |
||||
</size> |
||||
</property> |
||||
<property name="value"> |
||||
<number>24</number> |
||||
</property> |
||||
<property name="textVisible"> |
||||
<bool>false</bool> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item alignment="Qt::AlignRight"> |
||||
<widget class="QPushButton" name="btn_cancel_analyze"> |
||||
<property name="text"> |
||||
<string>&Cancel</string> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
</layout> |
||||
</widget> |
||||
</item> |
||||
</layout> |
||||
</widget> |
||||
</item> |
||||
</layout> |
||||
</widget> |
||||
</item> |
||||
<item> |
||||
<widget class="QFrame" name="frm_open_db"> |
||||
<property name="enabled"> |
||||
<bool>true</bool> |
||||
</property> |
||||
<property name="frameShape"> |
||||
<enum>QFrame::StyledPanel</enum> |
||||
</property> |
||||
<property name="frameShadow"> |
||||
<enum>QFrame::Raised</enum> |
||||
</property> |
||||
<layout class="QHBoxLayout" name="horizontalLayout_5"> |
||||
<item alignment="Qt::AlignTop"> |
||||
<widget class="QLabel" name="lbl_load_db_icon"> |
||||
<property name="sizePolicy"> |
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed"> |
||||
<horstretch>50</horstretch> |
||||
<verstretch>50</verstretch> |
||||
</sizepolicy> |
||||
</property> |
||||
<property name="minimumSize"> |
||||
<size> |
||||
<width>50</width> |
||||
<height>50</height> |
||||
</size> |
||||
</property> |
||||
<property name="frameShape"> |
||||
<enum>QFrame::Box</enum> |
||||
</property> |
||||
<property name="text"> |
||||
<string/> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item> |
||||
<widget class="QWidget" name="widget_7" native="true"> |
||||
<layout class="QVBoxLayout" name="verticalLayout_4"> |
||||
<property name="spacing"> |
||||
<number>2</number> |
||||
</property> |
||||
<property name="leftMargin"> |
||||
<number>0</number> |
||||
</property> |
||||
<property name="topMargin"> |
||||
<number>0</number> |
||||
</property> |
||||
<property name="rightMargin"> |
||||
<number>0</number> |
||||
</property> |
||||
<property name="bottomMargin"> |
||||
<number>0</number> |
||||
</property> |
||||
<item> |
||||
<widget class="QLabel" name="label_3"> |
||||
<property name="text"> |
||||
<string>If you have already analyzed the PDF files, open the &database:</string> |
||||
</property> |
||||
<property name="buddy"> |
||||
<cstring>le_load_db_fname</cstring> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item> |
||||
<widget class="QWidget" name="widget_9" native="true"> |
||||
<layout class="QHBoxLayout" name="horizontalLayout_4"> |
||||
<property name="spacing"> |
||||
<number>2</number> |
||||
</property> |
||||
<property name="leftMargin"> |
||||
<number>0</number> |
||||
</property> |
||||
<property name="topMargin"> |
||||
<number>0</number> |
||||
</property> |
||||
<property name="rightMargin"> |
||||
<number>0</number> |
||||
</property> |
||||
<property name="bottomMargin"> |
||||
<number>0</number> |
||||
</property> |
||||
<item> |
||||
<widget class="QLineEdit" name="le_load_db_fname"/> |
||||
</item> |
||||
<item> |
||||
<widget class="QPushButton" name="btn_load_db_fname"> |
||||
<property name="sizePolicy"> |
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed"> |
||||
<horstretch>0</horstretch> |
||||
<verstretch>0</verstretch> |
||||
</sizepolicy> |
||||
</property> |
||||
<property name="minimumSize"> |
||||
<size> |
||||
<width>30</width> |
||||
<height>30</height> |
||||
</size> |
||||
</property> |
||||
<property name="maximumSize"> |
||||
<size> |
||||
<width>30</width> |
||||
<height>30</height> |
||||
</size> |
||||
</property> |
||||
<property name="text"> |
||||
<string/> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
</layout> |
||||
</widget> |
||||
</item> |
||||
<item> |
||||
<layout class="QHBoxLayout" name="horizontalLayout_7"> |
||||
<item> |
||||
<widget class="QLabel" name="label_2"> |
||||
<property name="font"> |
||||
<font> |
||||
<pointsize>8</pointsize> |
||||
<italic>true</italic> |
||||
</font> |
||||
</property> |
||||
<property name="text"> |
||||
<string>Put the database in the same directory as this program, and it will be loaded automatically, or add a "--db ..." parameter to the command-line arguments.</string> |
||||
</property> |
||||
<property name="wordWrap"> |
||||
<bool>true</bool> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item> |
||||
<widget class="QPushButton" name="btn_load_db"> |
||||
<property name="sizePolicy"> |
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed"> |
||||
<horstretch>0</horstretch> |
||||
<verstretch>0</verstretch> |
||||
</sizepolicy> |
||||
</property> |
||||
<property name="text"> |
||||
<string>&Open</string> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
</layout> |
||||
</item> |
||||
</layout> |
||||
</widget> |
||||
</item> |
||||
</layout> |
||||
</widget> |
||||
</item> |
||||
<item> |
||||
<spacer name="verticalSpacer"> |
||||
<property name="orientation"> |
||||
<enum>Qt::Vertical</enum> |
||||
</property> |
||||
<property name="sizeHint" stdset="0"> |
||||
<size> |
||||
<width>20</width> |
||||
<height>40</height> |
||||
</size> |
||||
</property> |
||||
</spacer> |
||||
</item> |
||||
</layout> |
||||
</widget> |
||||
<tabstops> |
||||
<tabstop>le_cards_dir</tabstop> |
||||
<tabstop>btn_cards_dir</tabstop> |
||||
<tabstop>le_save_db_fname</tabstop> |
||||
<tabstop>btn_save_db_fname</tabstop> |
||||
<tabstop>btn_analyze</tabstop> |
||||
<tabstop>btn_cancel_analyze</tabstop> |
||||
<tabstop>le_load_db_fname</tabstop> |
||||
<tabstop>btn_load_db_fname</tabstop> |
||||
</tabstops> |
||||
<resources/> |
||||
<connections/> |
||||
</ui> |
Loading…
Reference in new issue