def _get_current_bibolamazi_cmd(self): if (not self.bibolamaziFile): logger.warning("No bibolamazi file open") return cmds = self.bibolamaziFile.configCmds(); if (cmds is None): # file is not yet parsed return None cur = self.ui.txtConfig.textCursor() block = cur.block() thisline = cur.block().blockNumber()+1 thisline = self.bibolamaziFile.fileLineNo(thisline) logger.longdebug("searching for cmd... at file line=%d", thisline) for cmd in cmds: logger.longdebug("\t -- testing cmd %r", cmd) if cmd.lineno <= thisline and cmd.linenoend >= thisline: # got the current cmd logger.longdebug("\tGot cmd: %r", cmd) return cmd return None
def _do_update_edittools(self): if self._ignore_change_for_edittools: return cmd = self._get_current_bibolamazi_cmd() if (cmd is None): self.ui.stackEditTools.setCurrentWidget(self.ui.toolspageBase) return if (cmd.cmd == 'src'): thesrcs = shlex.split(cmd.text) self.ui.sourceListEditor.setSourceList(thesrcs, noemit=True) self.ui.sourceListEditor.setRefDir(self.bibolamaziFile.fdir()) self.ui.stackEditTools.setCurrentWidget(self.ui.toolspageSource) return if (cmd.cmd == "filter"): filtername = cmd.info['filtername'] text = cmd.text if (text and text[-1] == '\n'): text = text[:-1] self.ui.filterInstanceEditor.setFilterInstanceDefinition(filtername, text, noemit=True) self.ui.stackEditTools.setCurrentWidget(self.ui.toolspageFilter) return logger.warning("Unknown command: %r", cmd) return
def _open_anchor(self, url): logger.debug("Link clicked: %r", url.toString()) if url.scheme() == "helptopic": self.requestHelpTopic.emit(url.path()) return if url.scheme() == "action": m = re.match(r'/goto-config-line/(?P<lineno>\d+)', url.path()) if m: self.gotoConfigLineNo(int(m.group('lineno'))) return m = re.match(r'/goto-bibolamazi-file-line/(?P<lineno>\d+)', url.path()) if m: if (self.bibolamaziFile is None or self.bibolamaziFile.getLoadState() < bibolamazifile.BIBOLAMAZIFILE_READ): logger.warning("No bibolamazifile open!") return configlineno = self.bibolamaziFile.configLineNo(int(m.group('lineno'))) self.gotoConfigLineNo(configlineno) return logger.warning("Unknown action: %s", str(url.toString())) return logger.debug("Opening URL %r", str(url.toString())) QDesktopServices.openUrl(url)
def openHelpTopicBySender(self): sender = self.sender() path = str(sender.property('helppath')) if (not path): logger.warning("Bad help topic path: %r", path) return self.openHelpTopic(path)
def runBibolamazi(self, bibolamazifilename, verbosity_level, reload_filter_path): # reload_filter_path is a list of 2-tuples (fpname, fpdir) if self.threadparent.busy: logger.warning("Can't run bibolamazi twice simultaneously") return logger.debug("RunBibolamazi.runBibolamazi(): bibolamazifilename=%r, verbosity_level=%r, " "reload_filter_path=%r. thread id=%r", bibolamazifilename, verbosity_level, reload_filter_path, QThread.currentThread().objectName()) self._busy = True self.threadparent.busy = True self.busy.emit(True) try: rootlogger = logging.getLogger() loggerleveltoset = bibolamazimain.verbosity_logger_level(verbosity_level) with ContextAttributeSetter( (lambda : rootlogger.level, rootlogger.setLevel, loggerleveltoset), ): with LogToGuiContextManager(logqtsig=self.logqtsig, bibolamazi_fname=bibolamazifilename) as log2sig: try: # TODO: we should reload all relevant packages here, not # in the other method below self._reload_filterpkg_modules(reload_filter_path) bibolamazimain.run_bibolamazi(bibolamazifile=bibolamazifilename) self.logqtsig.dolog(" --> Finished successfully. <--") self.bibolamaziDone.emit() except butils.BibolamaziError as e: logger.error(str(e)) self.logqtsig.dolog(" --> Finished with errors. <--") self.bibolamaziDoneError.emit(str(e)) except KeyboardInterrupt as e: logger.error("*** interrupted ***") self.logqtsig.dolog(" --> Stop: Interrupted. <--") self.bibolamaziDoneError.emit("Bibolamazi interrupted") except Exception as e: stre = str(e) logger.error(stre) import traceback logger.error(traceback.format_exc()) self.logqtsig.dolog(" --> EXCEPTION <--") self.bibolamaziDoneError.emit(stre) finally: self.busy.emit(False) self._busy = False self.threadparent.busy = False
def on_btnInterrupt_clicked(self): self.ui.btnInterrupt.setEnabled(False) # not twice in a row import signal sig = signal.SIGINT if sys.platform.startswith('win'): logger.warning("Interrupt does not work on Windows (not implemented).") return # doesn't work????!? #logger.debug("Sending Ctrl+C ...") #sig = signal.CTRL_C_EVENT os.kill(os.getpid(), sig)
def _do_update_edittools(self): if self._ignore_change_for_edittools: return cmdlist = self._get_current_bibolamazi_cmdlist() if not cmdlist: # None, or empty list self.ui.stackEditTools.setCurrentWidget(self.ui.toolspageBase) return if len(cmdlist) > 1: # several commands selected self.ui.stackEditTools.setCurrentWidget(self.ui.toolspageSelectedMultiple) return # single command selected cmd = cmdlist[0] if cmd.cmd == "src": try: thesrcs = shlex.split(cmd.text) except ValueError as e: logger.debug("Invalid source list specification, syntax error: %s", str(e)) self.ui.sourceListEditor.dispSourceListError(str(e)) return self.ui.sourceListEditor.setSourceList(thesrcs, noemit=True) self.ui.sourceListEditor.setRefDir(self.bibolamaziFile.fdir()) self.ui.stackEditTools.setCurrentWidget(self.ui.toolspageSource) return if cmd.cmd == "package": try: self.ui.filterPackagePathEditor.setFilterPackageInfo(cmd.text.strip()) self.ui.filterPackagePathEditor.setRefDir(self.bibolamaziFile.fdir()) except BibolamaziError as e: self.ui.filterPackagePathEditor.setFilterPackageError(str(e)) self.ui.stackEditTools.setCurrentWidget(self.ui.toolspagePackage) return if cmd.cmd == "filter": filtername = cmd.info['filtername'] text = cmd.text if text and text[-1] == '\n': text = text[:-1] self.ui.filterInstanceEditor.setFilterPath(self.bibolamaziFile.fullFilterPath()) self.ui.filterInstanceEditor.setFilterInstanceDefinition(filtername, text, noemit=True) self.ui.stackEditTools.setCurrentWidget(self.ui.toolspageFilter) return logger.warning("Unknown command: %r", cmd) return
def add_favorite_cmd(self): cmd = self._get_current_bibolamazi_cmd() if (cmd is None): logger.warning("No command to add to favorites!") return logger.debug("Adding command %s on lines %d--%d to favorites: %r", cmd.cmd, cmd.lineno, cmd.linenoend, cmd) cmdtext = [] doc = self.ui.txtConfig.document(); for n in xrange(self.bibolamaziFile.configLineNo(cmd.lineno), self.bibolamaziFile.configLineNo(cmd.linenoend)+1): cmdtext.append(unicode(doc.findBlockByNumber(n-1).text())) cmdtext = "\n".join(cmdtext) self.add_favorite_cmdtext(cmdtext)
def _open_anchor(self, url): if (url.scheme() == "helptopic"): self.requestHelpTopic.emit(url.path()); return if (url.scheme() == "action"): m = re.match(r'/goto-config-line/(?P<lineno>\d+)', url.path()) if m: self.ui.tabs.setCurrentWidget(self.ui.pageConfig) cur = QTextCursor(self.ui.txtConfig.document().findBlockByNumber(int(m.group('lineno'))-1)) self.ui.txtConfig.setTextCursor(cur) return logger.warning("Unknown action: %s", str(url.toString())) return logger.debug("Opening URL %r", str(url.toString())) QDesktopServices.openUrl(url)
def makeHelpTopicTab(self, pathitems): if (not len(pathitems)): logger.warning("makeHelpTopicTab(): No Path specified!") return font = settingswidget.get_typewriter_font(self) if (pathitems[0] == 'filters'): if (len(pathitems) < 2): logger.warning("makeHelpTopicTab(): No filter specified!!") return filtname = pathitems[1] tb = QTextBrowser(self.ui.tabs) tb.setFont(font) tb.setText(filters_factory.format_filter_help(filtname)) tb.setProperty('HelpTabTitle', '%s filter' %(filtname)) tb.setProperty('HelpTabToolTip', filters_factory.get_filter_class(filtname).getHelpDescription()) return tb if (pathitems[0] == 'general'): if (len(pathitems) < 2): logger.warning("makeHelpTopicTab(): No help topic general page specified!!") return tb = QTextBrowser(self.ui.tabs) tb.setFont(font) if pathitems[1] == 'welcome': tb.setPlainText(HELP_WELCOME) tb.setProperty('HelpTabTitle', 'Welcome') elif pathitems[1] == 'version': tb.setPlainText(argparseactions.helptext_prolog()) tb.setProperty('HelpTabTitle', 'Version') elif pathitems[1] == 'cmdline': tb.setPlainText(argparseactions.helptext_prolog() + bibolamazimain.get_args_parser().format_help()) tb.setProperty('HelpTabTitle', 'Command-Line Help') elif pathitems[1] == 'filter-list': tb.setPlainText(argparseactions.help_list_filters()) tb.setProperty('HelpTabTitle', 'Filter List') else: tb.setPlainText('<Unknown help page>') tb.setProperty('HelpTabTitle', '<Unknown>') tb.setProperty('HelpTabToolTip', '') return tb logger.warning("makeHelpTopicTab(): Unknown help topic: %r", "/".join(pathitems)) return None
def _get_current_bibolamazi_cmdlist(self): if not self.bibolamaziFile: logger.warning("No bibolamazi file open") return cmds = self.bibolamaziFile.configCmds() if cmds is None: # file is not yet parsed return None cur = self.ui.txtConfig.textCursor() block = cur.block() thisline = cur.block().blockNumber()+1 thisline = self.bibolamaziFile.fileLineNo(thisline) if cur.hasSelection(): cur2 = QTextCursor(cur) cur2.setPosition(cur.anchor()) otherline = cur2.block().blockNumber()+1 otherline = self.bibolamaziFile.fileLineNo(otherline) else: otherline = thisline minline = min(thisline, otherline) maxline = max(thisline, otherline) logger.longdebug("searching for cmds between lines %d and %d", minline, maxline) cmdlist = [] for cmd in cmds: logger.longdebug("\t -- testing cmd %r", cmd) if cmd.lineno <= maxline and cmd.linenoend >= minline: # got the current cmd logger.longdebug("\tGot cmd: %r", cmd) cmdlist.append(cmd) return cmdlist