class Yasser(QDialog): def __init__(self): QDialog.__init__(self) self.vlayout = QVBoxLayout() self.setLayout(self.vlayout) #- new book project self.title_layout = QHBoxLayout() self.title_container = QWidget() self.title_container.setLayout(self.title_layout) self.book_title = QLabel("Book Title: ") self.book_title.setObjectName("book_title") self.edit_title = QLineEdit("Type book title here") self.edit_title.setObjectName("edit_title") self.edit_title.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.edit_title.setToolTip("Type book title here") self.title_layout.addWidget(self.book_title) self.title_layout.addWidget(self.edit_title) self.vlayout.addWidget(self.title_container) #- camera overview self.camera_layout = QHBoxLayout() self.camera_container = QWidget() self.camera_container.setLayout(self.camera_layout) self.right_camera = QLabel("Left pages") self.left_camera = QLabel("Right pages") self.camera_layout.addWidget(self.right_camera) self.camera_layout.addWidget(self.left_camera) self.vlayout.addWidget(self.camera_container) #- image preview self.preview_layout = QHBoxLayout() self.preview_container = QWidget() self.preview_container.setLayout(self.preview_layout) self.left_preview = ImageButton("left.png", 200) self.right_preview = ImageButton("right.png", 200) self.left_preview.image_pressed.connect( lambda: print("show next image")) self.right_preview.image_pressed.connect( lambda: print("show next image")) self.preview_layout.addWidget(self.right_preview) self.preview_layout.addWidget(self.left_preview) self.vlayout.addWidget(self.preview_container)
class AnnotationsAppearance(SizePersistedDialog): ''' Dialog for managing CSS rules, including Preview window ''' if isosx: FONT = QFont('Monaco', 12) elif iswindows: FONT = QFont('Lucida Console', 9) elif islinux: FONT = QFont('Monospace', 9) FONT.setStyleHint(QFont.TypeWriter) def __init__(self, parent, icon, prefs): self.parent = parent self.prefs = prefs self.icon = icon super(AnnotationsAppearance, self).__init__(parent, 'appearance_dialog') self.setWindowTitle(_('Modify appearance')) self.setWindowIcon(icon) self.l = QVBoxLayout(self) self.setLayout(self.l) # Add a label for description #self.description_label = QLabel(_("Descriptive text here")) #self.l.addWidget(self.description_label) # Add a group box, vertical layout for preview window self.preview_gb = QGroupBox(self) self.preview_gb.setTitle(_("Preview")) self.preview_vl = QVBoxLayout(self.preview_gb) self.l.addWidget(self.preview_gb) self.wv = QWebView() self.wv.setHtml('<p></p>') self.wv.setMinimumHeight(100) self.wv.setMaximumHeight(16777215) self.wv.setGeometry(0, 0, 200, 100) self.wv.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.preview_vl.addWidget(self.wv) # Create a group box, horizontal layout for the table self.css_table_gb = QGroupBox(self) self.css_table_gb.setTitle(_("Annotation elements")) self.elements_hl = QHBoxLayout(self.css_table_gb) self.l.addWidget(self.css_table_gb) # Add the group box to the main layout self.elements_table = AnnotationElementsTable(self, 'annotation_elements_tw') self.elements_hl.addWidget(self.elements_table) self.elements_table.initialize() # Options self.options_gb = QGroupBox(self) self.options_gb.setTitle(_("Options")) self.options_gl = QGridLayout(self.options_gb) self.l.addWidget(self.options_gb) current_row = 0 # <hr/> separator # addWidget(widget, row, col, rowspan, colspan) self.hr_checkbox = QCheckBox(_('Add horizontal rule between annotations')) self.hr_checkbox.stateChanged.connect(self.hr_checkbox_changed) self.hr_checkbox.setCheckState( JSONConfig('plugins/annotations').get('appearance_hr_checkbox', False)) self.options_gl.addWidget(self.hr_checkbox, current_row, 0, 1, 4) current_row += 1 # Timestamp self.timestamp_fmt_label = QLabel(_("Timestamp format:")) self.options_gl.addWidget(self.timestamp_fmt_label, current_row, 0) self.timestamp_fmt_le = QLineEdit( JSONConfig('plugins/annotations').get('appearance_timestamp_format', default_timestamp), parent=self) self.timestamp_fmt_le.textEdited.connect(self.timestamp_fmt_changed) self.timestamp_fmt_le.setFont(self.FONT) self.timestamp_fmt_le.setObjectName('timestamp_fmt_le') self.timestamp_fmt_le.setToolTip(_('Format string for timestamp')) self.timestamp_fmt_le.setMaximumWidth(16777215) self.timestamp_fmt_le.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum) self.options_gl.addWidget(self.timestamp_fmt_le, current_row, 1) self.timestamp_fmt_reset_tb = QToolButton(self) self.timestamp_fmt_reset_tb.setToolTip(_("Reset to default")) self.timestamp_fmt_reset_tb.setIcon(QIcon(I('trash.png'))) self.timestamp_fmt_reset_tb.clicked.connect(self.reset_timestamp_to_default) self.options_gl.addWidget(self.timestamp_fmt_reset_tb, current_row, 2) self.timestamp_fmt_help_tb = QToolButton(self) self.timestamp_fmt_help_tb.setToolTip(_("Format string reference")) self.timestamp_fmt_help_tb.setIcon(QIcon(I('help.png'))) self.timestamp_fmt_help_tb.clicked.connect(self.show_help) self.options_gl.addWidget(self.timestamp_fmt_help_tb, current_row, 3) # Button box bb = QDialogButtonBox(QDialogButtonBox.Ok|QDialogButtonBox.Cancel) bb.accepted.connect(self.accept) bb.rejected.connect(self.reject) self.l.addWidget(bb) # Spacer self.spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.l.addItem(self.spacerItem) # Sizing sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.sizePolicy().hasHeightForWidth()) self.setSizePolicy(sizePolicy) self.resize_dialog() def hr_checkbox_changed(self, state): self.prefs.set('appearance_hr_checkbox', state) self.elements_table.preview_css() def reset_timestamp_to_default(self): from calibre_plugins.annotations.appearance import default_timestamp self.timestamp_fmt_le.setText(default_timestamp) self.timestamp_fmt_changed() def show_help(self): ''' Display strftime help file ''' hv = HelpView(self, self.icon, self.prefs, html=get_resources('help/timestamp_formats.html'), title=_("Timestamp formats")) hv.show() def sizeHint(self): return QtCore.QSize(600, 200) def timestamp_fmt_changed(self): self.prefs.set('appearance_timestamp_format', str(self.timestamp_fmt_le.text())) self.elements_table.preview_css()
class AnnotationsAppearance(SizePersistedDialog): ''' Dialog for managing CSS rules, including Preview window ''' if isosx: FONT = QFont('Monaco', 12) elif iswindows: FONT = QFont('Lucida Console', 9) elif islinux: FONT = QFont('Monospace', 9) FONT.setStyleHint(QFont.TypeWriter) def __init__(self, parent, icon, prefs): self.opts = parent.opts self.parent = parent self.prefs = prefs self.icon = icon super(AnnotationsAppearance, self).__init__(parent, 'appearance_dialog') self.setWindowTitle('Annotations appearance') self.setWindowIcon(icon) self.l = QVBoxLayout(self) self.setLayout(self.l) # Add a label for description #self.description_label = QLabel("Descriptive text here") #self.l.addWidget(self.description_label) # Add a group box, vertical layout for preview window self.preview_gb = QGroupBox(self) self.preview_gb.setTitle("Preview") self.preview_vl = QVBoxLayout(self.preview_gb) self.l.addWidget(self.preview_gb) self.wv = QWebView() self.wv.setHtml('<p></p>') self.wv.setMinimumHeight(100) self.wv.setMaximumHeight(16777215) self.wv.setGeometry(0, 0, 200, 100) self.wv.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.preview_vl.addWidget(self.wv) # Create a group box, horizontal layout for the table self.css_table_gb = QGroupBox(self) self.css_table_gb.setTitle("Annotation elements") self.elements_hl = QHBoxLayout(self.css_table_gb) self.l.addWidget(self.css_table_gb) # Add the group box to the main layout self.elements_table = AnnotationElementsTable(self, 'annotation_elements_tw') self.elements_hl.addWidget(self.elements_table) self.elements_table.initialize() # Options self.options_gb = QGroupBox(self) self.options_gb.setTitle("Options") self.options_gl = QGridLayout(self.options_gb) self.l.addWidget(self.options_gb) current_row = 0 # <hr/> separator # addWidget(widget, row, col, rowspan, colspan) self.hr_checkbox = QCheckBox('Add horizontal rule between annotations') self.hr_checkbox.stateChanged.connect(self.hr_checkbox_changed) self.hr_checkbox.setCheckState( prefs.get('appearance_hr_checkbox', False)) self.options_gl.addWidget(self.hr_checkbox, current_row, 0, 1, 4) current_row += 1 # Timestamp self.timestamp_fmt_label = QLabel("Timestamp format:") self.options_gl.addWidget(self.timestamp_fmt_label, current_row, 0) self.timestamp_fmt_le = QLineEdit( prefs.get('appearance_timestamp_format', default_timestamp), parent=self) self.timestamp_fmt_le.textEdited.connect(self.timestamp_fmt_changed) self.timestamp_fmt_le.setFont(self.FONT) self.timestamp_fmt_le.setObjectName('timestamp_fmt_le') self.timestamp_fmt_le.setToolTip('Format string for timestamp') self.timestamp_fmt_le.setMaximumWidth(16777215) self.timestamp_fmt_le.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum) self.options_gl.addWidget(self.timestamp_fmt_le, current_row, 1) self.timestamp_fmt_reset_tb = QToolButton(self) self.timestamp_fmt_reset_tb.setToolTip("Reset to default") self.timestamp_fmt_reset_tb.setIcon(QIcon(I('trash.png'))) self.timestamp_fmt_reset_tb.clicked.connect(self.reset_timestamp_to_default) self.options_gl.addWidget(self.timestamp_fmt_reset_tb, current_row, 2) self.timestamp_fmt_help_tb = QToolButton(self) self.timestamp_fmt_help_tb.setToolTip("Format string reference") self.timestamp_fmt_help_tb.setIcon(QIcon(I('help.png'))) self.timestamp_fmt_help_tb.clicked.connect(self.show_help) self.options_gl.addWidget(self.timestamp_fmt_help_tb, current_row, 3) # Button box bb = QDialogButtonBox(QDialogButtonBox.Ok|QDialogButtonBox.Cancel) bb.accepted.connect(self.accept) bb.rejected.connect(self.reject) self.l.addWidget(bb) # Spacer #self.spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) #self.l.addItem(self.spacerItem) # Sizing #sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred) #sizePolicy.setHorizontalStretch(0) #sizePolicy.setVerticalStretch(0) #sizePolicy.setHeightForWidth(self.sizePolicy().hasHeightForWidth()) #self.setSizePolicy(sizePolicy) self.resize_dialog() def hr_checkbox_changed(self, state): self.prefs.set('appearance_hr_checkbox', state) self.prefs.commit() self.elements_table.preview_css() def reset_timestamp_to_default(self): from calibre_plugins.marvin_manager.appearance import default_timestamp self.timestamp_fmt_le.setText(default_timestamp) self.timestamp_fmt_changed() def show_help(self): ''' Display strftime help file ''' from calibre.gui2 import open_url path = os.path.join(self.parent.resources_path, 'help/timestamp_formats.html') open_url(QUrl.fromLocalFile(path)) def sizeHint(self): return QtCore.QSize(600, 200) def timestamp_fmt_changed(self): self.prefs.set('appearance_timestamp_format', str(self.timestamp_fmt_le.text())) self.prefs.commit() self.elements_table.preview_css()
class ConverterWidget(QMainWindow): name = 'RWConvert' # For easier usage calculate the path relative to here. here = os.path.abspath(os.path.dirname(__file__)) getPath = partial(os.path.join, here) # Setup a plugin base for "rwconvert.plugins" and make sure to load # all the default built-in plugins from the builtin_plugins folder. pluginBase = PluginBase(package='rwconvert.plugins', searchpath=[getPath('./plugins')]) plugins = {} filenames = [] currentPlugin = None filetypes = 'All Files (*.*)' config = {} def __init__(self): ''' init ''' super().__init__() self.comms = CommSignals() """ Read configuration file and return its contents """ self.initConfig() cfgDir = self.config[PATHS]['config_path'] self.cfgFileName = os.path.join(cfgDir, self.config[FILES]['config_name']) if not os.path.isfile(self.cfgFileName): os.makedirs(os.path.dirname(self.cfgFileName), exist_ok=True) self.exportConfig() else: with open(self.cfgFileName, 'r') as configFile: c = yaml.load(configFile) c = {} if c is None else c if c != {}: self.config = c # and a source which loads the plugins from the "plugins" # folder. We also pass the application name as identifier. This # is optional but by doing this out plugins have consistent # internal module names which allows pickle to work. self.source = self.pluginBase.make_plugin_source( searchpath=[self.getPath('./plugins')], identifier=self.name) # Here we list all the plugins the source knows about, load them # and the use the "setup" function provided by the plugin to # initialize the plugin. for pluginName in self.source.list_plugins(): plugin = self.source.load_plugin(pluginName) pluginClass = getattr(plugin, pluginName) instance = pluginClass(self.config, self.comms) self.plugins[pluginName] = instance self.initGui() # self.showFullScreen() def initConfig(self): if PATHS not in self.config: self.config[PATHS] = {} if FILES not in self.config: self.config[FILES] = {} if FORMS not in self.config: self.config[FORMS] = {} if NAMES not in self.config: self.config[NAMES] = {} self.config[PATHS]['homepath'] = os.path.expanduser('~') self.config[PATHS]['docpath'] = os.path.join( self.config[PATHS]['homepath'], 'Documents') self.config[PATHS]['download_path'] = os.path.join( self.config[PATHS]['homepath'], 'Downloads') self.config[PATHS]['save_path'] = os.path.join( self.config[PATHS]['docpath'], self.name) self.config[PATHS]['config_path'] = appdirs.user_config_dir(self.name) self.config[PATHS]['db_path'] = os.path.join( self.config[PATHS]['config_path'], 'data') self.config[FILES]['config_name'] = 'config.yaml' self.config[FILES]['db_name'] = 'rwconvert.sqlite' self.config[FILES]['save_file'] = 'roadwarrior' self.config[FILES]['save_ext'] = '.xlsx' self.config[FORMS]['include_date'] = False self.config[FORMS]['prefix_date'] = False self.config[FORMS]['include_routes'] = False self.config[FORMS]['combine_routes'] = False self.config[NAMES]['current_plugin_name'] = '' self.destFilename = self.config['Files']['save_file'] + self.config[ 'Files']['save_ext'] # Create destination file directory if it doesn't already exist' # if not os.path.exists(self.config[PATHS]['config_path']): os.makedirs(self.config[PATHS]['config_path'], exist_ok=True) # if not os.path.exists(self.config[PATHS]['db_path']): os.makedirs(self.config[PATHS]['db_path'], exist_ok=True) # if not os.path.exists(self.config[PATHS]['save_path']): os.makedirs(self.config[PATHS]['save_path'], exist_ok=True) def initGui(self): self.setGeometry(300, 300, 800, 600) self.setWindowTitle('Road warrior Upload File Converter') self.center() fMain = QFrame() mainLayout = QGridLayout() fMain.setLayout(mainLayout) self.setCentralWidget(fMain) tabWidget = QTabWidget() mainLayout.addWidget(tabWidget, 0, 0) self.closeBtn = QPushButton('Close Application') self.closeBtn.clicked.connect(self.handleCloseClicked) mainLayout.addWidget(self.closeBtn, 1, 0) tabWidget.addTab(self.initConvertPage(), 'Converter') tabWidget.addTab(self.initResultPage(), 'Converter') tabWidget.addTab(self.initConfigPage(), 'Configuration') def initResultPage(self): f = QFrame() l = QHBoxLayout() f.setLayout(l) self.convertedTabs = QTabWidget() l.addWidget(self.convertedTabs) ''' This just adds a blank page with an empty tab widget. Pages are added on the fly when the files are converted as this could involve one or many pages depending on combine_route flag and number of routes. self.convertedTabs is the empty tab widget ''' return f def initConvertPage(self): f = QFrame() l = QGridLayout() f.setLayout(l) row = 0 l.addWidget(QLabel('Converter :'), row, 0) currentPluginBox = QComboBox() currentPluginBox.currentTextChanged.connect(self.selectPlugin) l.addWidget(currentPluginBox, row, 1) for key in self.plugins.keys(): currentPluginBox.addItem(key) row += 1 l.addWidget(QLabel('Destination path :'), row, 0) self.destPathLbl = QLabel( self.joinSavePath(self.config[PATHS]['save_path'], self.config[FILES]['save_file'], self.config[FILES]['save_ext'])) self.destPathLbl.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) l.addWidget(self.destPathLbl, row, 1) row += 1 f2 = QFrame() l2 = QHBoxLayout() f2.setLayout(l2) f3 = QFrame() l3 = QGridLayout() f3.setLayout(l3) l3.addWidget(QLabel('Destination Files :'), 0, 0) self.destFilesList = QListWidget() self.destFilesList.setAlternatingRowColors(True) l3.addWidget(self.destFilesList, 1, 0) l2.addWidget(self.initFileFrame()) l2.addWidget(f3) l.addWidget(f2, row, 0, 1, 3) row += 1 l.addWidget(self.initSrcFiles(), row, 0, 1, 3) row += 1 self.convertBtn = QPushButton('Convert') self.convertBtn.clicked.connect(self.handleConvertClicked) self.convertBtn.setEnabled(False) l.addWidget(self.convertBtn, row, 0, 1, 3) return f def initSrcFiles(self): row = 0 f = QFrame() l = QGridLayout() f.setLayout(l) l.addWidget(QLabel('Source Files :'), row, 0) self.srcFilesList = QListWidget() self.srcFilesList.setSelectionMode(QAbstractItemView.MultiSelection) self.srcFilesList.setAlternatingRowColors(True) self.srcFilesList.model().rowsInserted.connect( self.handleSrcFilesChanged) self.srcFilesList.model().rowsRemoved.connect( self.handleSrcFilesChanged) selectionModel = self.srcFilesList.selectionModel() selectionModel.selectionChanged.connect( self.handleSrcFilesSelectionChanged) l.addWidget(self.srcFilesList, row, 1, 3, 1) self.srcFilesBtn = QPushButton('Select Files') self.srcFilesBtn.clicked.connect(self.handleSelectSrcFiles) self.srcFilesBtn.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding) l.addWidget(self.srcFilesBtn, row, 2) row += 1 self.addFilesBtn = QPushButton('Add Files') self.addFilesBtn.clicked.connect(self.handleAddSrcFiles) self.addFilesBtn.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding) l.addWidget(self.addFilesBtn, row, 2) row += 1 self.removeFilesBtn = QPushButton('Remove Files') self.removeFilesBtn.setEnabled(False) self.removeFilesBtn.clicked.connect(self.handleRemoveSrcFiles) self.removeFilesBtn.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding) l.addWidget(self.removeFilesBtn, row, 2) row += 1 self.errorEdit = QPlainTextEdit() self.errorEdit.setReadOnly(True) l.addWidget(self.errorEdit, row, 1, 1, 2) self.comms.errorSignal.connect(self.errorEdit.appendPlainText) return f def initFileFrame(self): row = 0 f = QFrame() l = QGridLayout() f.setLayout(l) # f.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Expanding) l.addWidget(QLabel('Destination File :'), row, 0) self.destFilenameEdit = QLineEdit(self.destFilename) self.destFilenameEdit.setEnabled(False) self.destFilenameEdit.textChanged.connect( self.handleDestFilenameChanged) l.addWidget(self.destFilenameEdit, row, 1) row += 1 self.combineRoutesBox = QCheckBox('combine_routes') if self.config[FORMS]['combine_routes']: self.combineRoutesBox.setChecked(True) else: self.combineRoutesBox.setChecked(False) self.combineRoutesBox.clicked.connect(self.handleCombineRoutesClicked) self.combineRoutesBox.setEnabled(False) l.addWidget(self.combineRoutesBox, row, 0) row += 1 addDateInNameBox = QCheckBox('Add date to filename') addDateInNameBox.clicked.connect(self.handleAddDateClicked) l.addWidget(addDateInNameBox, row, 0) if self.config[FORMS]['prefix_date']: self.prefixDateInNameBox = QPushButton('prefix_date') self.prefixDateInNameBox.setEnabled(False) else: self.prefixDateInNameBox = QPushButton('Suffix date') self.prefixDateInNameBox.setEnabled(False) self.prefixDateInNameBox.setToolTip('Click to change to prefix date.') self.prefixDateInNameBox.clicked.connect(self.handlePrefixDateClicked) l.addWidget(self.prefixDateInNameBox, row, 1) row += 1 addRouteInNameBox = QCheckBox('Add route to filename') addRouteInNameBox.clicked.connect(self.handleAddRouteClicked) l.addWidget(addRouteInNameBox, row, 0) # row += 1 return f def initConfigPage(self): row = 0 f = QFrame() l = QGridLayout() f.setLayout(l) srcLbl = QLabel('Source directory :') srcLbl.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) l.addWidget(srcLbl, row, 0) self.srcDirBox = QLineEdit() self.srcDirBox.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) self.srcDirBox.setText(self.config[PATHS]['download_path']) l.addWidget(self.srcDirBox, row, 1) srcDirSelectBtn = QPushButton('Select') srcDirSelectBtn.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) srcDirSelectBtn.clicked.connect(self.handleSelectSrcDirectory) l.addWidget(srcDirSelectBtn, row, 2) row += 1 destLbl = QLabel('Destination directory :') destLbl.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) l.addWidget(destLbl, row, 0) self.destDirBox = QLineEdit() self.destDirBox.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) self.destDirBox.setText(self.config[PATHS]['save_path']) l.addWidget(self.destDirBox, row, 1) destDirSelectBtn = QPushButton('Select') destDirSelectBtn.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) destDirSelectBtn.clicked.connect(self.handleSelectDestDirectory) l.addWidget(destDirSelectBtn, row, 2) row += 1 l.addWidget(QFrame(), row, 0, 1, 3) return f def handleSelectSrcDirectory(self): directory = QFileDialog.getExistingDirectory( self, 'Select Source Directory', self.config[PATHS]['download_path'], QFileDialog.ShowDirsOnly) if not directory == '': self.config[PATHS]['download_path'] = directory self.srcDirBox.setText(directory) def handleSelectDestDirectory(self): directory = QFileDialog.getExistingDirectory( self, 'Select Destination Directory', self.config[PATHS]['save_path'], QFileDialog.ShowDirsOnly) if not directory == '': self.config[PATHS]['save_path'] = directory self.destDirBox.setText(directory) def joinSavePath(self, path, filename, ext): newpath = os.path.join(path, filename) newpath += ext return newpath @pyqtSlot(bool) def handleAddDateClicked(self, checked): if checked: self.config[FORMS]['include_path'] = True self.prefixDateInNameBox.setEnabled(True) else: self.config[FORMS]['include_path'] = False self.prefixDateInNameBox.setEnabled(False) @pyqtSlot() def handlePrefixDateClicked(self): if self.config[FORMS]['prefix_date']: self.config[FORMS]['prefix_date'] = False self.prefixDateInNameBox.setText('Suffix date') self.prefixDateInNameBox.setToolTip( 'Click to change to prefix date.') else: self.config[FORMS]['prefix_date'] = True self.prefixDateInNameBox.setText('Prefix date') self.prefixDateInNameBox.setToolTip( 'Click to change to suffix date.') @pyqtSlot() def handleAddRouteClicked(self, checked): if checked: self.config[FORMS]['include_routes'] = True else: self.config[FORMS]['include_routes'] = False @pyqtSlot() def handleCombineRoutesClicked(self): if self.combineRoutesBox.isChecked(): self.config[FORMS]['combine_routes'] = True else: self.config[FORMS]['combine_routes'] = False self.enableStuff() def enableStuff(self): if self.srcFilesList.model().rowCount() == 0: self.convertBtn.setEnabled(False) self.combineRoutesBox.setEnabled(False) self.destFilenameEdit.setEnabled(False) elif self.srcFilesList.model().rowCount() == 1: self.convertBtn.setEnabled(True) self.combineRoutesBox.setEnabled(False) self.destFilenameEdit.setEnabled(True) else: self.convertBtn.setEnabled(True) self.combineRoutesBox.setEnabled(True) if self.combineRoutesBox.isChecked(): self.destFilenameEdit.setEnabled(True) else: self.destFilenameEdit.setEnabled(False) @pyqtSlot() def handleDestFilenameChanged(self, text): if len(text) > 0: if self.config[PATHS]['include_path']: year = datetime.year month = datetime.month day = datetime.day datestr = str(year) if month < 10: datestr += '0' datestr += str(month) if day < 10: datestr += '0' datestr += str(day) if self.config[FORMS]['prefix_date']: name = datestr + '_' + text else: name = text + '_' + datestr else: name = text self.config[FILES]['save file'] = name self.destPathLbl.setText( self.joinSavePath(self.savepath, self.savefile, self.saveext)) def createDestinationFilePath(self): return self.joinSavePath(self.savepath, self.savefile, self.saveext) @pyqtSlot() def handleSrcFilesSelectionChanged(self, selected): if len(selected.indexes()) > 0: self.removeFilesBtn.setEnabled(True) else: self.removeFilesBtn.setEnabled(False) @pyqtSlot() def handleSrcFilesChanged(self): self.enableStuff() @pyqtSlot() def handleConvertClicked(self): if len(self.filenames) > 0: toexcel = ToExcel() self.currentPlugin.convert(self.filenames) routedata = self.currentPlugin.data if self.config[FORMS]['combine_routes']: combined = [] for route in routedata.keys(): singleroute = routedata[route] combined += singleroute path = self.joinSavePath(self.config[PATHS]['save_path'], self.config[FILES]['save_file'], self.config[FILES]['save_ext']) toexcel.create_workbook(combined, path) self.destFilesList.addItem(path) else: i = 1 for route in routedata.keys(): singleroute = routedata[route] if self.config[FORMS]['include_routes'] and len(route) > 0: path = self.joinSavePath( self.config[PATHS]['save_path'], self.config[FILES]['save_file'] + '_' + route, self.config[FILES]['save_ext']) else: path = self.joinSavePath( self.config[PATHS]['save_path'], self.config[FILES]['save_file'] + '(' + str(i) + ')', self.config[FILES]['save_ext']) i += 1 toexcel.create_workbook(singleroute, path) self.destFilesList.addItem(path) @pyqtSlot() def handleConverterChanged(self): pluginName = self.currentPluginBox.currentText() if pluginName != self.config[NAMES]['current_plugin_name']: self.config[NAMES]['current_plugin_name'] = pluginName self.currentPlugin = self.plugins[pluginName] self.filetypes = self.currentPlugin.filetypes @pyqtSlot() def handleCloseClicked(self): self.close() @pyqtSlot() def handleSelectSrcFiles(self): fileDlg = QFileDialog(self, 'Select Files', self.config[PATHS]['download_path'], self.filetypes) fileDlg.setFileMode(QFileDialog.ExistingFiles) if fileDlg.exec_(): self.filenames = fileDlg.selectedFiles() self.srcFilesList.clear() self.srcFilesList.addItems(self.filenames) @pyqtSlot() def handleAddSrcFiles(self): fileDlg = QFileDialog(self, 'Select Files', self.config[PATHS]['download_path'], self.filetypes) fileDlg.setFileMode(QFileDialog.ExistingFiles) if fileDlg.exec_(): for filename in fileDlg.selectedFiles(): if filename not in self.filenames: self.filenames.append(filename) self.srcFilesList.addItem(filename) @pyqtSlot() def handleRemoveSrcFiles(self): selectedModel = self.srcFilesList.selectionModel() selected = selectedModel.selectedIndexes() for index in selected: name = index.data() self.filenames.remove(name) self.srcFilesList.takeItem(index.row()) selectedModel.clear() @pyqtSlot(str) def selectPlugin(self, name): # activate the current plugin # self.pluginManager.activatePluginByName(name) self.config[NAMES]['current_plugin_name'] = name self.currentPlugin = self.plugins[name] self.filetypes = self.currentPlugin.filetypes def center(self): qr = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft()) def exportConfig(self): with open(self.cfgFileName, 'w') as configFile: yaml.dump(self.config, configFile) def createUserConfig(self): """ Create the user's config file in OS specific location """ os.makedirs(os.path.dirname(self.cfgFileName), exist_ok=True) self.exportConfig() def closeEvent(self, event): buttonReply = QMessageBox.warning( self, 'Close Application', 'You are about to close the Application,' ' Press Yes to continue or Cancel to return to the Application', QMessageBox.Yes | QMessageBox.Cancel, QMessageBox.Cancel) if buttonReply == QMessageBox.Yes: self.exportConfig() exit()