diff --git a/config/sound/default/soundicons.conf b/config/sound/default/soundicons.conf index 830ccb13..8ad2c0ec 100644 --- a/config/sound/default/soundicons.conf +++ b/config/sound/default/soundicons.conf @@ -15,6 +15,10 @@ StartOfLine='StartOfLine.wav' EndOfLine='EndOfLine.wav' # barrier was detected BarrierFound='barrier.wav' +# barrier mode starts +BarrierStart='barrier_start.wav' +# barrier mode ends +BarrierEnd='barrier_end.wav' # the Line is empty EmptyLine='EmptyLine.wav' # Is the first line on the screen. diff --git a/config/sound/template/soundicons.conf b/config/sound/template/soundicons.conf index e5039970..6304abce 100644 --- a/config/sound/template/soundicons.conf +++ b/config/sound/template/soundicons.conf @@ -15,6 +15,10 @@ StartOfLine='' EndOfLine='' # barrier was detected BarrierFound='' +# barrier mode starts +BarrierStart='' +# barrier mode ends +BarrierEnd='' # the Line is empty EmptyLine='' # Is the first line on the screen. diff --git a/src/fenrirscreenreader/commands/onCursorChange/55000-present_line_if_cursor_change_vertical.py b/src/fenrirscreenreader/commands/onCursorChange/55000-present_line_if_cursor_change_vertical.py index e36ca032..5ccbd0cd 100644 --- a/src/fenrirscreenreader/commands/onCursorChange/55000-present_line_if_cursor_change_vertical.py +++ b/src/fenrirscreenreader/commands/onCursorChange/55000-present_line_if_cursor_change_vertical.py @@ -48,7 +48,9 @@ class command(): # barrier sayLine = currLine if self.env['runtime']['settingsManager'].getSettingAsBool('barrier','enabled'): - sayLine = self.env['runtime']['barrierManager'].handleLineBarrier(sayLine, self.env['screen']['newCursor']['x']) + isBarrier, barrierLine = self.env['runtime']['barrierManager'].handleLineBarrier(self.env['screen']['newContentText'].split('\n'), self.env['screen']['newCursor']['x'],self.env['screen']['newCursor']['y']) + if isBarrier: + sayLine = barrierLine # output self.env['runtime']['outputManager'].presentText(sayLine, interrupt=doInterrupt, flush=False) self.lastIdent = currIdent diff --git a/src/fenrirscreenreader/core/barrierManager.py b/src/fenrirscreenreader/core/barrierManager.py index 5ec39eeb..a3764412 100644 --- a/src/fenrirscreenreader/core/barrierManager.py +++ b/src/fenrirscreenreader/core/barrierManager.py @@ -24,43 +24,53 @@ class barrierManager(): self.prefIsBarrier = False def isBarrierChange(self): return self.currIsBarrier != self.prefIsBarrier - def handleLineBarrier(self, line, xCursor, output=True, doInterrupt=True): - isBarrier, sayLine = self.getBarrierText(line, xCursor) + def handleLineBarrier(self, text, xCursor, yCursor, output=True, doInterrupt=True): + isBarrier = False + try: + isBarrier, sayLine = self.getBarrierText(text, xCursor, yCursor) + except Exception as e: + return False, '' + self.updateBarrierChange(isBarrier) - #if self.isBarrierChange(): - if isBarrier: - if output: - self.env['runtime']['outputManager'].playSoundIcon(soundIcon='BarrierFound', interrupt=doInterrupt) - return sayLine + if self.isBarrierChange(): + if output: + if isBarrier: + self.env['runtime']['outputManager'].playSoundIcon(soundIcon='BarrierStart', interrupt=doInterrupt) + else: + self.env['runtime']['outputManager'].playSoundIcon(soundIcon='BarrierEnd', interrupt=doInterrupt) + + if not isBarrier: + sayLine = '' + return isBarrier, sayLine - def hasBorder(self, text, xCursor, yCursor, validBorder): + def hasBorder(self, text, xCursor, yCursor, validBorder, barrierPos): # check for corners here lastLineNo = len(text) - 1 if yCursor <= 0: - if not (text[0][xCursor] in validBorder): + if not (text[0][barrierPos] in validBorder): return False if len(text) > 1: - if not (text[1][xCursor] in validBorder): + if not (text[1][barrierPos] in validBorder): return False if len(text) > 2: - if not (text[2][xCursor] in validBorder): + if not (text[2][barrierPos] in validBorder): return False elif yCursor >= lastLineNo: - if not (text[lastLineNo][xCursor] in validBorder): + if not (text[lastLineNo][barrierPos] in validBorder): return False if len(text) > 1: - if not (text[lastLineNo - 1][xCursor] in validBorder): + if not (text[lastLineNo - 1][barrierPos] in validBorder): return False if len(text) > 2: - if not (text[lastLineNo - 2][xCursor] in validBorder): + if not (text[lastLineNo - 2][barrierPos] in validBorder): return False else: - if not (text[yCursor][xCursor] in validBorder): + if not (text[yCursor][barrierPos] in validBorder): return False - if not (text[yCursor - 1][xCursor] in validBorder): + if not (text[yCursor - 1][barrierPos] in validBorder): return False - if not (text[yCursor + 1][xCursor] in validBorder): - return False + if not (text[yCursor + 1][barrierPos] in validBorder): + return False return True def getBarrierText(self, text, xCursor, yCursor): line = text[yCursor] @@ -68,27 +78,30 @@ class barrierManager(): return False, line offset = xCursor - leftBarriers = self.env['runtime']['settingsManager'].getSetting('barrier', 'barrier') - rightBarriers = self.env['runtime']['settingsManager'].getSetting('barrier', 'grabDevices') + leftBarriers = self.env['runtime']['settingsManager'].getSetting('barrier', 'leftBarriers') + rightBarriers = self.env['runtime']['settingsManager'].getSetting('barrier', 'rightBarriers') # is the cursor at the begin or end of an entry: #print(line[:offset + 1].count('│'),line[offset:].count('│')) # start + for b in leftBarriers: if line[:offset + 1].count(b) > line[offset:].count(b): offset = xCursor - 1 - - start = line[:offset + 1].rfind(b) + 1 + start = line[:offset + 1].rfind(b) if start != -1: - if not self.hasBorder(text, xCursor, yCursor): - start = -1 + if not self.hasBorder(text, xCursor, yCursor, leftBarriers, start): + start = -1 + else: + start += 1 break if start == -1: return False, line # end for b in rightBarriers: - end = line[offset + 1:].find(b) + end = line[start + 1:].find(b) if end != -1: - if not self.hasBorder(text, xCursor, yCursor): + end = start + end + if not self.hasBorder(text, xCursor, yCursor,rightBarriers, end + 1): end = -1 break if end == -1: