def exitApplication(): config.mainWindow.textCommandParser.stopTtsAudio() # Run shutdown plugins if config.enablePlugins: for plugin in FileUtil.fileNamesWithoutExtension(os.path.join("plugins", "shutdown"), "py"): if not plugin in config.excludeShutdownPlugins: script = os.path.join(os.getcwd(), "plugins", "shutdown", "{0}.py".format(plugin)) config.mainWindow.execPythonFile(script) ConfigUtil.save() if config.restartUBA and hasattr(config, "cli"): subprocess.Popen("{0} uba.py gui".format(sys.executable), shell=True)
def exitApplication(): config.mainWindow.textCommandParser.stopTtsAudio() # Run shutdown plugins if config.enablePlugins: for plugin in FileUtil.fileNamesWithoutExtension( os.path.join("plugins", "shutdown"), "py"): if not plugin in config.excludeShutdownPlugins: script = os.path.join(os.getcwd(), "plugins", "shutdown", "{0}.py".format(plugin)) config.mainWindow.execPythonFile(script) ConfigUtil.save()
def addMenuLayoutItems(parent, menu): items = ( ("menu1_aleph_menu_layout", lambda: parent.setMenuLayout("aleph")), ("menu1_focus_menu_layout", lambda: parent.setMenuLayout("focus")), ("menu1_classic_menu_layout", lambda: parent.setMenuLayout("classic")), ) for feature, action in items: addMenuItem(menu, feature, parent, action) layouts = FileUtil.fileNamesWithoutExtension( os.path.join("plugins", "layout"), "py") if layouts: menu.addSeparator() for pluginLayout in layouts: addMenuItem(menu, pluginLayout, parent, lambda: parent.setMenuLayout(pluginLayout), translation=False)
def runStartupPlugins(): if config.enablePlugins: for plugin in FileUtil.fileNamesWithoutExtension(os.path.join("plugins", "startup"), "py"): if not plugin in config.excludeStartupPlugins: script = os.path.join(os.getcwd(), "plugins", "startup", "{0}.py".format(plugin)) config.mainWindow.execPythonFile(script)
def setupUI(self): mainLayout = QVBoxLayout() mainLayout.addWidget(QLabel(self.translation[0])) subLayout = QHBoxLayout() layout = QVBoxLayout() layout.addWidget(QLabel(self.translation[1])) dataView1 = QListView() dataView1.setEditTriggers(QAbstractItemView.NoEditTriggers) dataViewModel1 = QStandardItemModel(dataView1) dataView1.setModel(dataViewModel1) for plugin in FileUtil.fileNamesWithoutExtension( os.path.join("plugins", "startup"), "py"): item = QStandardItem(plugin) item.setToolTip(plugin) item.setCheckable(True) item.setCheckState( Qt.CheckState.Unchecked if plugin in config.excludeStartupPlugins else Qt.CheckState.Checked) dataViewModel1.appendRow(item) dataViewModel1.itemChanged.connect(self.itemChanged1) layout.addWidget(dataView1) subLayout.addLayout(layout) layout = QVBoxLayout() layout.addWidget(QLabel(self.translation[2])) dataView2 = QListView() dataView2.setEditTriggers(QAbstractItemView.NoEditTriggers) dataViewModel2 = QStandardItemModel(dataView2) dataView2.setModel(dataViewModel2) for plugin in FileUtil.fileNamesWithoutExtension( os.path.join("plugins", "menu"), "py"): item = QStandardItem(plugin) item.setToolTip(plugin) item.setCheckable(True) item.setCheckState(Qt.CheckState.Unchecked if plugin in config. excludeMenuPlugins else Qt.CheckState.Checked) dataViewModel2.appendRow(item) dataViewModel2.itemChanged.connect(self.itemChanged2) layout.addWidget(dataView2) subLayout.addLayout(layout) layout = QVBoxLayout() layout.addWidget(QLabel(self.translation[3])) dataView3 = QListView() dataView3.setEditTriggers(QAbstractItemView.NoEditTriggers) dataViewModel3 = QStandardItemModel(dataView3) dataView3.setModel(dataViewModel3) for plugin in FileUtil.fileNamesWithoutExtension( os.path.join("plugins", "context"), "py"): item = QStandardItem(plugin) item.setToolTip(plugin) item.setCheckable(True) item.setCheckState( Qt.CheckState.Unchecked if plugin in config.excludeContextPlugins else Qt.CheckState.Checked) dataViewModel3.appendRow(item) dataViewModel3.itemChanged.connect(self.itemChanged3) layout.addWidget(dataView3) subLayout.addLayout(layout) layout = QVBoxLayout() layout.addWidget(QLabel(self.translation[4])) dataView4 = QListView() dataView4.setEditTriggers(QAbstractItemView.NoEditTriggers) dataViewModel4 = QStandardItemModel(dataView4) dataView4.setModel(dataViewModel4) for plugin in FileUtil.fileNamesWithoutExtension( os.path.join("plugins", "shutdown"), "py"): item = QStandardItem(plugin) item.setToolTip(plugin) item.setCheckable(True) item.setCheckState( Qt.CheckState.Unchecked if plugin in config.excludeShutdownPlugins else Qt.CheckState.Checked) dataViewModel4.appendRow(item) dataViewModel4.itemChanged.connect(self.itemChanged4) layout.addWidget(dataView4) subLayout.addLayout(layout) mainLayout.addLayout(subLayout) self.setLayout(mainLayout)
def addMenuActions(self): subMenu = QMenu() for text in self.parent.parent.textList: action = QAction(self) action.setText(text) action.triggered.connect( partial(self.openReferenceInBibleVersion, text)) subMenu.addAction(action) separator = QAction(self) separator.setSeparator(True) subMenu.addAction(separator) action = QAction(self) action.setText(config.thisTranslation["all"]) action.triggered.connect(self.compareAllVersions) subMenu.addAction(action) action = QAction(self) action.setText(config.thisTranslation["openReferences"]) action.setMenu(subMenu) self.addAction(action) subMenu = QMenu() for text in self.parent.parent.textList: action = QAction(self) action.setText(text) action.triggered.connect( partial(self.compareReferenceWithBibleVersion, text)) subMenu.addAction(action) separator = QAction(self) separator.setSeparator(True) subMenu.addAction(separator) action = QAction(self) action.setText(config.thisTranslation["all"]) action.triggered.connect(self.compareAllVersions) subMenu.addAction(action) action = QAction(self) action.setText(config.thisTranslation["compareReferences"]) action.setMenu(subMenu) self.addAction(action) subMenu = QMenu() for text in self.parent.parent.textList: action = QAction(self) action.setText(text) action.triggered.connect( partial(self.parallelReferenceWithBibleVersion, text)) subMenu.addAction(action) separator = QAction(self) separator.setSeparator(True) subMenu.addAction(separator) action = QAction(self) action.setText(config.thisTranslation["all"]) action.triggered.connect(self.compareAllVersions) subMenu.addAction(action) action = QAction(self) action.setText(config.thisTranslation["parallelReferences"]) action.setMenu(subMenu) self.addAction(action) separator = QAction(self) separator.setSeparator(True) self.addAction(separator) subMenu = QMenu() searchBibleReferences = QAction(self) searchBibleReferences.setText( config.thisTranslation["openOnNewWindow"]) searchBibleReferences.triggered.connect(self.displayVersesInNewWindow) subMenu.addAction(searchBibleReferences) searchBibleReferences = QAction(self) searchBibleReferences.setText(config.thisTranslation["bar1_menu"]) searchBibleReferences.triggered.connect( self.displayVersesInBibleWindow) subMenu.addAction(searchBibleReferences) searchBibleReferences = QAction(self) searchBibleReferences.setText(config.thisTranslation["bottomWindow"]) searchBibleReferences.triggered.connect( self.displayVersesInBottomWindow) subMenu.addAction(searchBibleReferences) action = QAction(self) action.setText(config.thisTranslation["displayVerses"]) action.setMenu(subMenu) self.addAction(action) if self.name in ("main", "study"): subMenu = QMenu() if hasattr(config, "cli"): action = QAction(self) action.setText(config.thisTranslation["cli"]) action.triggered.connect(self.switchToCli) subMenu.addAction(action) action = QAction(self) action.setText(config.thisTranslation["openOnNewWindow"]) action.triggered.connect(self.openOnNewWindow) subMenu.addAction(action) action = QAction(self) action.setText(config.thisTranslation["pdfDocument"]) action.triggered.connect(self.exportToPdf) subMenu.addAction(action) action = QAction(self) action.setText(config.thisTranslation["displayContent"]) action.setMenu(subMenu) self.addAction(action) separator = QAction(self) separator.setSeparator(True) self.addAction(separator) subMenu = QMenu() copyText = QAction(self) copyText.setText(config.thisTranslation["text"]) copyText.triggered.connect(self.copySelectedText) subMenu.addAction(copyText) copyReferences = QAction(self) copyReferences.setText(config.thisTranslation["bibleReferences"]) copyReferences.triggered.connect(self.copyAllReferences) subMenu.addAction(copyReferences) copyHtml = QAction(self) copyHtml.setText(config.thisTranslation["htmlCode"]) copyHtml.triggered.connect(self.copyHtmlCode) subMenu.addAction(copyHtml) action = QAction(self) action.setText(config.thisTranslation["context1_copy"]) action.setMenu(subMenu) self.addAction(action) separator = QAction(self) separator.setSeparator(True) self.addAction(separator) if self.name == "main": subMenu = QMenu() # Instant highlight feature action = QAction(self) action.setText(config.thisTranslation["menu_highlight"]) action.triggered.connect(self.instantHighlight) subMenu.addAction(action) action = QAction(self) action.setText(config.thisTranslation["remove"]) action.triggered.connect(self.removeInstantHighlight) subMenu.addAction(action) action = QAction(self) action.setText(config.thisTranslation["instantHighlight"]) action.setMenu(subMenu) self.addAction(action) separator = QAction(self) separator.setSeparator(True) self.addAction(separator) action = QAction(self) action.setText(config.thisTranslation["context1_search"]) action.triggered.connect(self.searchPanel) self.addAction(action) subMenu = QMenu() self.searchText = QAction(self) self.searchText.setText("{0} [{1}]".format( config.thisTranslation["context1_search"], config.mainText)) self.searchText.triggered.connect(self.searchSelectedText) subMenu.addAction(self.searchText) self.searchTextInBook = QAction(self) self.searchTextInBook.setText( config.thisTranslation["context1_current"]) self.searchTextInBook.triggered.connect(self.searchSelectedTextInBook) subMenu.addAction(self.searchTextInBook) searchFavouriteBible = QAction(self) searchFavouriteBible.setText( config.thisTranslation["context1_favourite"]) searchFavouriteBible.triggered.connect( self.searchSelectedFavouriteBible) subMenu.addAction(searchFavouriteBible) action = QAction(self) action.setText(config.thisTranslation["cp0"]) action.setMenu(subMenu) self.addAction(action) subMenu = QMenu() bibleVerseParser = BibleVerseParser(config.parserStandarisation) for bookNo in range(1, 67): action = QAction(self) action.setText(bibleVerseParser.standardFullBookName[str(bookNo)]) action.triggered.connect( partial(self.searchSelectedTextInBook, bookNo)) subMenu.addAction(action) action = QAction(self) action.setText(config.thisTranslation["bibleBook"]) action.setMenu(subMenu) self.addAction(action) subMenu = QMenu() for text in self.parent.parent.textList: action = QAction(self) action.setText(text) action.triggered.connect(partial(self.searchSelectedText, text)) subMenu.addAction(action) action = QAction(self) action.setText(config.thisTranslation["bibleVersion"]) action.setMenu(subMenu) self.addAction(action) # Search Strong's number bibles, if installed if self.parent.parent.strongBibles: subMenu = QMenu() for text in self.parent.parent.strongBibles: action = QAction(self) action.setText(text) action.triggered.connect(partial(self.searchStrongBible, text)) subMenu.addAction(action) separator = QAction(self) separator.setSeparator(True) subMenu.addAction(separator) action = QAction(self) action.setText(config.thisTranslation["all"]) action.triggered.connect(self.searchAllStrongBible) subMenu.addAction(action) action = QAction(self) action.setText(config.thisTranslation["bibleConcordance"]) action.setMenu(subMenu) self.addAction(action) subMenu = QMenu() for keyword in ("SEARCHBOOKNOTE", "SEARCHCHAPTERNOTE", "SEARCHVERSENOTE"): action = QAction(self) action.setText(config.thisTranslation[keyword]) action.triggered.connect(partial(self.searchBibleNote, keyword)) subMenu.addAction(action) separator = QAction(self) separator.setSeparator(True) subMenu.addAction(separator) action = QAction(self) action.setText(config.thisTranslation["removeNoteHighlight"]) action.triggered.connect(self.removeNoteHighlight) subMenu.addAction(action) action = QAction(self) action.setText(config.thisTranslation["menu6_notes"]) action.setMenu(subMenu) self.addAction(action) subMenu = QMenu() searchBibleCharacter = QAction(self) searchBibleCharacter.setText( config.thisTranslation["menu5_characters"]) searchBibleCharacter.triggered.connect(self.searchCharacter) subMenu.addAction(searchBibleCharacter) searchBibleName = QAction(self) searchBibleName.setText(config.thisTranslation["menu5_names"]) searchBibleName.triggered.connect(self.searchName) subMenu.addAction(searchBibleName) searchBibleLocation = QAction(self) searchBibleLocation.setText(config.thisTranslation["menu5_locations"]) searchBibleLocation.triggered.connect(self.searchLocation) subMenu.addAction(searchBibleLocation) subSubMenu = QMenu() action = QAction(self) action.setText(config.thisTranslation["previous"]) action.triggered.connect(self.searchTopic) subSubMenu.addAction(action) separator = QAction(self) separator.setSeparator(True) subSubMenu.addAction(separator) for module in self.parent.parent.topicListAbb: action = QAction(self) action.setText(module) action.triggered.connect(partial(self.searchResource, module)) subSubMenu.addAction(action) action = QAction(self) action.setText(config.thisTranslation["menu5_topics"]) action.setMenu(subSubMenu) subMenu.addAction(action) subSubMenu = QMenu() action = QAction(self) action.setText(config.thisTranslation["previous"]) action.triggered.connect(self.searchDictionary) subSubMenu.addAction(action) separator = QAction(self) separator.setSeparator(True) subSubMenu.addAction(separator) for module in self.parent.parent.dictionaryListAbb: action = QAction(self) action.setText(module) action.triggered.connect(partial(self.searchResource, module)) subSubMenu.addAction(action) action = QAction(self) action.setText(config.thisTranslation["context1_dict"]) action.setMenu(subSubMenu) subMenu.addAction(action) subSubMenu = QMenu() action = QAction(self) action.setText(config.thisTranslation["previous"]) action.triggered.connect(self.searchEncyclopedia) subSubMenu.addAction(action) separator = QAction(self) separator.setSeparator(True) subSubMenu.addAction(separator) for module in self.parent.parent.encyclopediaListAbb: action = QAction(self) action.setText(module) action.triggered.connect(partial(self.searchResource, module)) subSubMenu.addAction(action) action = QAction(self) action.setText(config.thisTranslation["context1_encyclopedia"]) action.setMenu(subSubMenu) subMenu.addAction(action) subSubMenu = QMenu() action = QAction(self) action.setText(config.thisTranslation["previous"]) action.triggered.connect(self.searchHebrewGreekLexicon) subSubMenu.addAction(action) separator = QAction(self) separator.setSeparator(True) subSubMenu.addAction(separator) for module in self.parent.parent.lexiconList: action = QAction(self) action.setText(module) action.triggered.connect( partial(self.searchHebrewGreekLexiconSelected, module)) subSubMenu.addAction(action) action = QAction(self) action.setText(config.thisTranslation["menu5_lexicon"]) action.setMenu(subSubMenu) subMenu.addAction(action) subSubMenu = QMenu() action = QAction(self) action.setText(config.thisTranslation["previous"]) action.triggered.connect(self.searchThirdPartyDictionary) subSubMenu.addAction(action) separator = QAction(self) separator.setSeparator(True) subSubMenu.addAction(separator) for module in self.parent.parent.thirdPartyDictionaryList: action = QAction(self) action.setText(module) action.triggered.connect( partial(self.searchThirdPartyDictionarySelected, module)) subSubMenu.addAction(action) action = QAction(self) action.setText(config.thisTranslation["menu5_3rdDict"]) action.setMenu(subSubMenu) subMenu.addAction(action) action = QAction(self) action.setText(config.thisTranslation["bibleResources"]) action.setMenu(subMenu) self.addAction(action) subMenu = QMenu() action = QAction(self) action.setText(config.thisTranslation["previous"]) action.triggered.connect(self.searchPreviousBook) subMenu.addAction(action) separator = QAction(self) separator.setSeparator(True) subMenu.addAction(separator) subSubMenu = QMenu() for module in config.favouriteBooks: action = QAction(self) action.setText(module) action.triggered.connect(partial(self.searchSelectedBook, module)) subSubMenu.addAction(action) separator = QAction(self) separator.setSeparator(True) subSubMenu.addAction(separator) action = QAction(self) action.setText(config.thisTranslation["all"]) action.triggered.connect(self.searchFavouriteBooks) subSubMenu.addAction(action) action = QAction(self) action.setText(config.thisTranslation["context1_favouriteBooks"]) action.setMenu(subSubMenu) subMenu.addAction(action) action = QAction(self) action.setText(config.thisTranslation["context1_allBooks"]) action.triggered.connect(self.searchAllBooks) subMenu.addAction(action) separator = QAction(self) separator.setSeparator(True) subMenu.addAction(separator) action = QAction(self) action.setText(config.thisTranslation["removeBookHighlight"]) action.triggered.connect(self.removeBookHighlight) subMenu.addAction(action) action = QAction(self) action.setText(config.thisTranslation["installBooks"]) action.setMenu(subMenu) self.addAction(action) separator = QAction(self) separator.setSeparator(True) self.addAction(separator) # TEXT-TO-SPEECH feature languages = self.parent.parent.getTtsLanguages() tts = QAction(self) tts.setText("{0} [{1}]".format( config.thisTranslation["context1_speak"], languages[config.ttsDefaultLangauge][1].capitalize())) tts.triggered.connect(self.textToSpeech) self.addAction(tts) if config.isTtsInstalled: ttsMenu = QMenu() languageCodes = list(languages.keys()) items = [languages[code][1] for code in languageCodes] for index, item in enumerate(items): languageCode = languageCodes[index] action = QAction(self) action.setText(item.capitalize()) action.triggered.connect( partial(self.textToSpeechLanguage, languageCode)) ttsMenu.addAction(action) tts = QAction(self) tts.setText(config.thisTranslation["context1_speak"]) tts.setMenu(ttsMenu) self.addAction(tts) separator = QAction(self) separator.setSeparator(True) self.addAction(separator) # IBM-Watson Translation Service # Translate into User-defined Language userLanguage = config.userLanguage translateText = QAction(self) translateText.setText("{0} [{1}]".format( config.thisTranslation["context1_translate"], userLanguage)) translateText.triggered.connect(self.checkUserLanguage) self.addAction(translateText) translateMenu = QMenu() for index, item in enumerate(Translator.toLanguageNames): languageCode = Translator.toLanguageCodes[index] action = QAction(self) action.setText(item) action.triggered.connect( partial(self.selectedTextToSelectedLanguage, languageCode)) translateMenu.addAction(action) translate = QAction(self) translate.setText(config.thisTranslation["watsonTranslator"]) translate.setMenu(translateMenu) self.addAction(translate) translateMenu = QMenu() for language, languageCode in Languages.googleTranslateCodes.items(): action = QAction(self) action.setText(language) action.triggered.connect( partial(self.googleTranslate, languageCode)) translateMenu.addAction(action) translate = QAction(self) translate.setText(config.thisTranslation["googleTranslate"]) translate.setMenu(translateMenu) self.addAction(translate) # Context menu plugins if config.enablePlugins: separator = QAction(self) separator.setSeparator(True) self.addAction(separator) subMenu = QMenu() for plugin in FileUtil.fileNamesWithoutExtension( os.path.join("plugins", "context"), "py"): if not plugin in config.excludeContextPlugins: action = QAction(self) if "_" in plugin: feature, shortcut = plugin.split("_", 1) action.setText(feature) # The following line does not work #action.setShortcut(QKeySequence(shortcut)) self.parent.parent.addContextPluginShortcut( plugin, shortcut) else: action.setText(plugin) action.triggered.connect(partial(self.runPlugin, plugin)) subMenu.addAction(action) separator = QAction(self) separator.setSeparator(True) subMenu.addAction(separator) action = QAction(self) action.setText(config.thisTranslation["enableIndividualPlugins"]) action.triggered.connect( self.parent.parent.enableIndividualPluginsWindow) subMenu.addAction(action) action = QAction(self) action.setText(config.thisTranslation["menu_plugins"]) action.setMenu(subMenu) self.addAction(action)
config.activeVerseNoColour = config.activeVerseNoColourDark if config.theme == "dark" else config.activeVerseNoColourLight # Assign mainWindow to config.mainWindow, to make it acessible from user customised user script config.mainWindow = MainWindow() # Check screen size availableGeometry = app.desktop().availableGeometry(config.mainWindow) setupMainWindow(availableGeometry) # A container of functions to be run after UBA loaded history records on startup # This offers a way for startup plugins to run codes after history records being loaded. config.actionsRightAfterLoadingHistoryRecords = [] # Run startup plugins if config.enablePlugins: for plugin in FileUtil.fileNamesWithoutExtension( os.path.join("plugins", "startup"), "py"): if not plugin in config.excludeStartupPlugins: script = os.path.join(os.getcwd(), "plugins", "startup", "{0}.py".format(plugin)) config.mainWindow.execPythonFile(script) # Run initial commands if config.populateTabsOnStartup: openBibleWindowContentOnNextTab, openStudyWindowContentOnNextTab = config.openBibleWindowContentOnNextTab, config.openStudyWindowContentOnNextTab config.openBibleWindowContentOnNextTab = True config.openStudyWindowContentOnNextTab = True # Execute initial command on Bible Window populateTabsOnStartup("main") # Execute initial command on Study Window populateTabsOnStartup("study") config.openBibleWindowContentOnNextTab, config.openStudyWindowContentOnNextTab = openBibleWindowContentOnNextTab, openStudyWindowContentOnNextTab