def __init__(self, *args, **kwargs): TTkAbstractScrollView.__init__(self, *args, **kwargs) self._name = kwargs.get('name', '_TTkLogViewer') self._messages = [""] self._cwd = os.getcwd() TTkLog.installMessageHandler(self.loggingCallback) self.viewChanged.connect(self._viewChangedHandler)
def _addCustomPressed(): btn = _TTkColorButton.lastClicked TTkLog.debug(f"{btn}") if btn is not None and \ btn.isCustom(): TTkLog.debug(f"2 {btn}") btn.setColor(sc.color)
def _fps(self): curtime = time.time() self.frame += 1 delta = curtime - self.time if delta > 5: TTkLog.debug(f"fps: {int(self.frame/delta)}") self.frame = 0 self.time = curtime
def _moveToHighlighted(self): index = self._items.index(self._highlighted) h = self.height() offx, offy = self.getViewOffsets() if index >= h + offy - 1: TTkLog.debug(f"{index} {h} {offy}") self.viewMoveTo(offx, index - h + 1) elif index <= offy: self.viewMoveTo(offx, index)
def searchRe(self, regex, ignoreCase=False): indexes = [] id = 0 rr = re.compile(regex, re.IGNORECASE if ignoreCase else 0) TTkLog.debug(f"Search RE: {regex}") with open(self._filename, 'r') as infile: for line in infile: ma = rr.search(line) if ma: indexes.append(id) id += 1 return indexes
def paintCanvas(self, canvas, geom, slice, bound): # TTkLog.debug(f"PaintCanvas:{(x,y,w,h)}") x, y, w, h = geom bx, by, bw, bh = bound # out of bound if not self._visible: return if not canvas._visible: return if canvas._width == 0 or canvas._height == 0: return if x + w < bx or y + h < by or bx + bw - 1 < x or by + bh - 1 < y: return x = min(x, self._width - 1) y = min(y, self._height - 1) w = min(w, self._width - x) h = min(h, self._height - y) # if x>=self._width: x=self._width-1 # if y>=self._height: y=self._height-1 # if w>=self._width-x: w=self._width-x # if h>=self._height-y: h=self._height-y xoffset = 0 if x >= bx else bx - x yoffset = 0 if y >= by else by - y wslice = w if x + w < bx + bw else bx + bw - x hslice = h if y + h < by + bh else by + bh - y for iy in range(yoffset, hslice): for ix in range(xoffset, wslice): #TTkLog.debug(f"PaintCanvas:{(ix,iy)}") if iy > len(canvas._data) - 1: TTkLog.debug( f"{canvas._width, canvas._height} - {(yoffset,hslice)}, {(xoffset,wslice)}, {slice}" ) b = canvas._data[iy] a = b[ix] self._data[y + iy][x + ix] = a # canvas._data[iy][ix] self._colors[y + iy][x + ix] = canvas._colors[iy][ix]
def _menuCallback(self, button): #self._id = self._list.index(label) TTkLog.debug(f"Bind Clicked {button.text}") self.menuButtonClicked.emit(button) TTkHelper.removeOverlay() self.update()
def _controlClicked(self, status, widget, item): TTkLog.debug(f"{status} {widget._name}") if status: # we need to expand the TTkFancyTreeWidgetItem self._expand(item=item, depth=(widget._depth + 1)) else: # we need to shrink the TTkFancyTreeWidgetItem self._shrink(item=item)
def mouseDragEvent(self, evt): TTkLog.debug(f"{self._name} Test Mouse {evt}")
def mainloop(self): '''Enters the main event loop and waits until :meth:`~quit` is called or the main widget is destroyed.''' TTkLog.debug("") TTkLog.debug(" ████████╗ ████████╗ ") TTkLog.debug(" ╚══██╔══╝ ╚══██╔══╝ ") TTkLog.debug(" ██║ ▄▄ ▄ ▄▄ ▄▄▖▄▖ ██║ █ ▗▖ ") TTkLog.debug(" ▞▀▚ ▖▗ ██║ █▄▄█ █▀▘ █ █ █ ██║ █▟▘ ") TTkLog.debug(" ▙▄▞▐▄▟ ██║ ▀▄▄▖ █ █ ▝ █ ██║ █ ▀▄ ") TTkLog.debug(" ▌ ▐ ╚═╝ ╚═╝ ") TTkLog.debug(" ▚▄▄▘ ") TTkLog.debug("") TTkLog.debug(f" Version: {TTkCfg.version}") TTkLog.debug("") TTkLog.debug("Starting Main Loop...") # Register events try: signal.signal(signal.SIGTSTP, self._SIGSTOP) # Ctrl-Z signal.signal(signal.SIGCONT, self._SIGCONT) # Resume signal.signal(signal.SIGINT, self._SIGINT) # Ctrl-C except Exception as e: TTkLog.error(f"{e}") exit(1) else: TTkLog.debug("Signal Event Registered") TTkTerm.registerResizeCb(self._win_resize_cb) threading.Thread(target=self._input_thread, daemon=True).start() self._timer = TTkTimer() self._timer.timeout.connect(self._time_event) self._timer.start(0.1) self.show() self.running = True # Keep track of the multiTap to avoid the extra key release lastMultiTap = False TTkTerm.init(title=self._title) while self.running: # Main Loop evt = self.events.get() if evt is TTkK.MOUSE_EVENT: mevt = self.mouse_events.get() # Avoid to broadcast a key release after a multitap event if mevt.evt == TTkK.Release and lastMultiTap: continue lastMultiTap = mevt.tap > 1 focusWidget = TTkHelper.getFocus() if focusWidget is not None and \ mevt.evt != TTkK.Press and \ mevt.key != TTkK.Wheel: x, y = TTkHelper.absPos(focusWidget) nmevt = mevt.clone(pos=(mevt.x - x, mevt.y - y)) focusWidget.mouseEvent(nmevt) else: # Sometimes the release event is not retrieved if focusWidget and focusWidget._pendingMouseRelease: focusWidget.mouseEvent(nmevt.clone(evt=TTkK.Release)) focusWidget._pendingMouseRelease = False self.mouseEvent(mevt) elif evt is TTkK.KEY_EVENT: keyHandled = False kevt = self.key_events.get() # TTkLog.debug(f"Key: {kevt}") focusWidget = TTkHelper.getFocus() overlayWidget = TTkHelper.getOverlay() TTkLog.debug(f"{focusWidget}") if focusWidget is not None: TTkHelper.execShortcut(kevt.key, focusWidget) keyHandled = focusWidget.keyEvent(kevt) else: TTkHelper.execShortcut(kevt.key) # Handle Next Focus Key Binding if not keyHandled and \ ((kevt.key == TTkK.Key_Tab and kevt.mod == TTkK.NoModifier) or ( kevt.key == TTkK.Key_Right )): TTkHelper.nextFocus(focusWidget if focusWidget else self) # Handle Prev Focus Key Binding if not keyHandled and \ ((kevt.key == TTkK.Key_Tab and kevt.mod == TTkK.ShiftModifier) or ( kevt.key == TTkK.Key_Left )): TTkHelper.prevFocus(focusWidget if focusWidget else self) elif evt is TTkK.TIME_EVENT: size = os.get_terminal_size() self.setGeometry(0, 0, size.columns, size.lines) TTkHelper.paintAll() self._timer.start(1 / TTkCfg.maxFps) self._fps() pass elif evt is TTkK.SCREEN_EVENT: self.setGeometry(0, 0, TTkGlbl.term_w, TTkGlbl.term_h) TTkLog.info(f"Resize: w:{TTkGlbl.term_w}, h:{TTkGlbl.term_h}") elif evt is TTkK.QUIT_EVENT: TTkLog.debug(f"Quit.") break else: TTkLog.error(f"Unhandled Event {evt}") break TTkTerm.exit()
def _SIGINT(self, signum, frame): TTkLog.debug("Captured SIGINT <CTRL-C>") # Deregister the handler # so CTRL-C can be redirected to the default handler if the app does not exit signal.signal(signal.SIGINT, signal.SIG_DFL) self.quit()
def _SIGCONT(self, signum, frame): """Set terminal settings and restart background input read""" TTkLog.debug("Captured SIGCONT 'fg/bg'") TTkTerm.cont()
def _SIGSTOP(self, signum, frame): """Reset terminal settings and stop background input read before putting to sleep""" TTkLog.debug("Captured SIGSTOP <CTRL-z>") TTkTerm.stop() # TODO: stop the threads os.kill(os.getpid(), signal.SIGSTOP)
def get_key(callback=None): mouse_re = re.compile(r"\033\[<(\d+);(\d+);(\d+)([mM])") while not False: stdinRead = readInput() mevt = None kevt = KeyEvent.parse(stdinRead) if kevt is None and \ stdinRead.startswith("\033[<"): # Mouse Event m = mouse_re.match(stdinRead) if not m: # TODO: Return Error TTkLog.error("UNHANDLED: " + stdinRead.replace("\033", "<ESC>")) continue code = int(m.group(1)) x = int(m.group(2)) - 1 y = int(m.group(3)) - 1 state = m.group(4) key = TTkMouseEvent.NoButton evt = TTkMouseEvent.NoEvent tap = 0 def _checkTap(lastTime, tap): if state == "M": t = time() if (t - lastTime) < 0.4: return t, tap + 1 else: return t, 1 return lastTime, tap if code == 0x00: TTkInput._leftLastTime, TTkInput._leftTap = _checkTap( TTkInput._leftLastTime, TTkInput._leftTap) tap = TTkInput._leftTap key = TTkMouseEvent.LeftButton evt = TTkMouseEvent.Press if state == "M" else TTkMouseEvent.Release elif code == 0x01: TTkInput._midLastTime, TTkInput._midTap = _checkTap( TTkInput._midLastTime, TTkInput._midTap) tap = TTkInput._midTap key = TTkMouseEvent.MidButton evt = TTkMouseEvent.Press if state == "M" else TTkMouseEvent.Release elif code == 0x02: TTkInput._rightLastTime, TTkInput._rightTap = _checkTap( TTkInput._rightLastTime, TTkInput._rightTap) tap = TTkInput._rightTap key = TTkMouseEvent.RightButton evt = TTkMouseEvent.Press if state == "M" else TTkMouseEvent.Release elif code == 0x20: key = TTkMouseEvent.LeftButton evt = TTkMouseEvent.Drag elif code == 0x21: key = TTkMouseEvent.MidButton evt = TTkMouseEvent.Drag elif code == 0x22: key = TTkMouseEvent.RightButton evt = TTkMouseEvent.Drag elif code == 0x40: key = TTkMouseEvent.Wheel evt = TTkMouseEvent.Up elif code == 0x41: key = TTkMouseEvent.Wheel evt = TTkMouseEvent.Down mevt = TTkMouseEvent(x, y, key, evt, tap, m.group(0).replace("\033", "<ESC>")) if kevt is None and mevt is None: TTkLog.error("UNHANDLED: " + stdinRead.replace("\033", "<ESC>")) if callback is not None: if not callback(kevt, mevt): break