def handleEvent(self, event): """ Handles mouse and key events: you can click on a given color indicator to select that color, or you can select colors by positioning the cursor with the arrow keys. Changes invoke `drawView()` when appropriate. :param event: Event to handle """ width = 4 super().handleEvent(event) oldColor = self._color maxCol = [7, 15][self._selectorType] what = event.what if what == evMouseDown: self.__handleMouseEvent(event, oldColor) elif what == evKeyDown: key = ctrlToArrow(event.keyDown.keyCode) if key in {kbLeft, kbRight, kbUp, kbDown}: self.__handleKeyDownEvent(key, maxCol, width) elif what == evBroadcast: self.__handleBroadcastEvent(event)
def handleEvent(self, event): super().handleEvent(event) if event.what == evMouseDown or (event.what == evKeyDown and ctrlToArrow( event.keyDown.keyCode) == kbDown and self.inputLine.state & sfFocused): if not self.collection or not self.inputLine: return if not self.inputLine.state & sfDisabled: self.inputLine.select() r = self.inputLine.getBounds() r.bottomRight.x = r.topLeft.x + max( self.collection.getTextLength() + 1, self.inputLine.size.x) + 1 delta = self.owner.size.x - r.bottomRight.x - 1 if delta < 0: r.topLeft.x += delta r.bottomRight.x += delta r.topLeft.x = max(r.topLeft.x, 1) r.topLeft.y += 1 r.bottomRight.y = r.topLeft.y + len(self.collection) delta = self.owner.size.y - r.bottomRight.y - 1 if delta < 0: r.topLeft.y += delta r.bottomRight.y += delta r.topLeft.y = max(r.topLeft.y, 1) comboWindow = ComboWindow(r, self.collection) c = self.owner.execView(comboWindow) if c == cmOK and not self.inputLine.state & sfDisabled: result = comboWindow.getSelection() self.__focused = comboWindow.viewer.focused self.inputLine.setData(result) self.inputLine.selectAll(True) self.inputLine.drawView() self.destroy(comboWindow) self.clearEvent(event)
def handleEvent(self, event): super().handleEvent(event) if (event.what == evMouseDown or (event.what == evKeyDown and ctrlToArrow(event.keyDown.keyCode) == kbDown and (self._linkedWidget.state & sfFocused) != 0)): if not self._linkedWidget.focus(): self.clearEvent(event) return historyRecord = self._linkedWidget.getData() self.recordHistory(historyRecord.value) r = self._linkedWidget.getBounds() r.topLeft.x -= 1 r.bottomRight.x += 1 r.bottomRight.y += 7 r.topLeft.y -= 1 p = self.owner.getExtent() r.intersect(p) r.bottomRight.y -= 1 historyWindow = self.initHistoryWindow(r) if historyWindow: c = self.owner.execView(historyWindow) if c == cmOK: rslt = historyWindow.getSelection() self._linkedWidget.setData(rslt) self._linkedWidget.selectAll(True) self._linkedWidget.drawView() self.destroy(historyWindow) self.clearEvent(event) else: if event.what == evBroadcast: if ((event.message.command == cmReleasedFocus and event.message.infoPtr == self._linkedWidget) or event.message.command == cmRecordHistory): historyRecord = self._linkedWidget.getData() self.recordHistory(historyRecord.value)
def __handleKeyDownEvent(self, event): if event.keyDown.charScan.charCode == ' ' and self.focused < self._range: self.selectItem(self.focused) newItem = self.focused else: kc = ctrlToArrow(event.keyDown.keyCode) if kc == kbUp: newItem = self.focused - 1 elif kc == kbDown: newItem = self.focused + 1 elif kc == kbRight: if self.numCols > 1: newItem = self.focused + self.size.y else: return elif kc == kbLeft: if self.numCols > 1: newItem = self.focused - self.size.y else: return elif kc == kbPgDn: newItem = self.focused + self.size.y * self.numCols elif kc == kbPgUp: newItem = self.focused - self.size.y * self.numCols elif kc == kbHome: newItem = self.topItem elif kc == kbEnd: newItem = self.topItem + (self.size.y * self.numCols) - 1 elif kc == kbCtrlPgDn: newItem = self._range - 1 elif kc == kbCtrlPgUp: newItem = 0 else: return self.focusItemNum(newItem) self.drawView() self.clearEvent(event)
def _handleKeyDownEvent(self, event): s = self._sel cta = ctrlToArrow(event.keyDown.keyCode) if cta == kbUp: if self.state & sfFocused: i = 0 done = False while not done: i += 1 s -= 1 if s < 0: s = len(self._strings) - 1 done = (self.buttonState(s) or i > len(self._strings)) self.__moveSel(i, s) self.clearEvent(event) elif cta == kbDown: if self.state & sfFocused: i = 0 done = False while not done: i += 1 s += 1 if s >= len(self._strings): s = 0 done = (self.buttonState(s) or i > len(self._strings)) self.__moveSel(i, s) self.clearEvent(event) elif cta == kbRight: if self.state & sfFocused: i = 0 done = False while not done: i += 1 s += self.size.y if s >= len(self._strings): s = (s + 1) % self.size.y if s >= len(self._strings): s = 0 done = (self.buttonState(s) or (i > len(self._strings))) self.__moveSel(i, s) self.clearEvent(event) elif cta == kbLeft: if self.state & sfFocused: i = 0 done = False while not done: i += 1 if s > 0: s -= self.size.y if s < 0: s = ((len(self._strings) + self.size.y - 1) // self.size.y) * self.size.y + s - 1 s %= len(self._strings) else: s = len(self._strings) - 1 done = (self.buttonState(s) or (i > len(self._strings))) self.__moveSel(i, s) self.clearEvent(event) else: for i, s in enumerate(self._strings): c = hotKey(s) if getAltCode(c) == event.keyDown.keyCode or ( (self.owner.phase == self.phPostProcess or (self.state & sfFocused) != 0) and c != 0 and event.keyDown.charScan.charCode.upper() == c): if self.buttonState(i): if self.focus(): self._sel = i self.movedTo(self._sel) self.press(self._sel) self.drawView() self.clearEvent(event) return if event.keyDown.charScan.charCode == ' ' and (self.state & sfFocused): self.press(self._sel) self.drawView() self.clearEvent(event)
def handleEvent(self, event): padKeys = {0x47, 0x4b, 0x4d, 0x4f, 0x73, 0x74} super().handleEvent(event) if self.state & sfSelected: if event.what == evMouseDown: delta = self.__mouseDelta(event) if self.__canScroll(delta): done = False while not done: self.current.firstPos += delta self.drawView() done = not self.mouseEvent(event, evMouseAuto) elif event.mouse.eventFlags & meDoubleClick: self.selectAll(True) else: self.current.anchor = self.__mousePos(event) done = False while not done: if event.what == evMouseAuto: delta = self.__mouseDelta(event) if self.__canScroll(delta): self.current.firstPos += delta self.current.pos = self.__mousePos(event) self.__adjustSelectBlock() self.drawView() done = not (self.mouseEvent(event, evMouseMove | evMouseAuto)) self.clearEvent(event) elif event.what == evKeyDown: self.__saveState() oldKeyCode = event.keyDown.keyCode event.keyDown.keyCode = ctrlToArrow(event.keyDown.keyCode) # scanCode must be non-zero if (event.keyDown.charScan.scanCode and event.keyDown.charScan.scanCode in padKeys and event.keyDown.controlKeyState & kbShift): event.keyDown.charScan.charCode = '\x00' if self.current.anchor < 0: self.current.anchor = self.current.pos else: self.current.anchor = -1 kc = event.keyDown.keyCode if kc == kbLeft: if self.current.pos > 0: self.current.pos -= 1 elif kc == kbRight: if self.current.pos < len(self.current.data): self.current.pos += 1 elif kc == kbHome: self.current.pos = 0 elif kc == kbEnd: self.current.pos = len(self.current.data) elif kc == kbBackSpace: if self.current.pos > 0: del self.current.data[self.current.pos - 1] self.current.pos -= 1 if self.current.firstPos > 0: self.current.firstPos -= 1 self.__checkValid(True) elif kc == kbDel: if self.current.selStart == self.current.selEnd: if self.current.pos < len(self.current.data): self.current.selStart = self.current.pos self.current.selEnd = self.current.pos + 1 self.__deleteSelect() self.__checkValid(True) elif kc == kbIns: self.setState(sfCursorIns, not (self.state & sfCursorIns)) else: if event.keyDown.charScan.charCode >= ' ': self.__deleteSelect() if self.state & sfCursorIns: if self.current.pos < len(self.current.data): del self.current.data[self.current.pos] if self.__checkValid(True): if len(self.current.data) < self.maxLen: if self.current.firstPos > self.current.pos: self.current.firstPos = self.current.pos self.current.data.insert( self.current.pos, event.keyDown.charScan.charCode) self.current.pos += 1 self.__checkValid(False) elif event.keyDown.charScan.charCode == kbCtrlY: self.current.data = [] self.current.pos = 0 else: event.keyDown.keyCode = oldKeyCode return self.__adjustSelectBlock() if self.current.firstPos > self.current.pos: self.current.firstPos = self.current.pos i = self.current.pos - self.size.x + 2 if self.current.firstPos < i: self.current.firstPos = i self.drawView() self.clearEvent(event)
def handleEvent(self, event): """ Handles scroll bar events by calling `handleEvent()`. Mouse events are broadcast to the scroll bar's owner, which must handle the implications of the scroll bar changes. `handleEvent()` also determines which scroll bar part has received a mouse click (or equivalent keystroke). Data member `value` is adjusted according to the current `arrowStep` or `pageStep` values. The scroll bar indicator is redrawn. :param event: The event to handle """ tracking = False i = 0 super().handleEvent(event) what = event.what if what == evMouseDown: message(self.owner, evBroadcast, cmScrollBarClicked, self) self.mouse = self.makeLocal(event.mouse.where) self.extent = self.getExtent() self.extent.grow(1, 1) p = self.getPos() s = self.getSize() - 1 clickPart = self.__getPartCode(s, p) if clickPart != sbIndicator: mouseDown = True while mouseDown: self.mouse = self.makeLocal(event.mouse.where) if self.__getPartCode(s, p) == clickPart: self.setValue(self.value + self.scrollStep(clickPart)) mouseDown = (self.mouseEvent(event, evMouseAuto)) else: done = False while not done: self.mouse = self.makeLocal(event.mouse.where) tracking = self.mouse in self.extent if tracking: if self.size.x == 1: i = self.mouse.y else: i = self.mouse.x i = max(i, 1) i = min(i, s - 1) else: i = self.getPos() if i != p: self.drawPos(i) done = not (self.mouseEvent(event, evMouseMove)) if tracking and s > 2: s -= 2 self.setValue(((((p - 1) * (self.maxVal - self.minVal) + (s >> 1)) // s) + self.minVal)) self.clearEvent(event) elif what == evKeyDown: if self.state & sfVisible: clickPart = sbIndicator if self.size.y == 1: kc = ctrlToArrow(event.keyDown.keyCode) if kc == kbLeft: clickPart = sbLeftArrow elif kc == kbRight: clickPart = sbRightArrow elif kc == kbCtrlLeft: clickPart = sbPageLeft elif kc == kbCtrlRight: clickPart = sbPageRight elif kc == kbHome: i = self.minVal elif kc == kbEnd: i = self.maxVal else: return else: kc = ctrlToArrow(event.keyDown.keyCode) if kc == kbUp: clickPart = sbUpArrow elif kc == kbDown: clickPart = sbDownArrow elif kc == kbPgUp: clickPart = sbPageUp elif kc == kbPgDn: clickPart = sbPageDown elif kbCtrlPgUp: i = self.minVal elif kbCtrlPgDn: i = self.maxVal else: return message(self.owner, evBroadcast, cmScrollBarClicked, self) if clickPart != sbIndicator: i = self.value + self.scrollStep(clickPart) self.setValue(i) self.clearEvent(event)
def handleEvent(self, event): super().handleEvent(event) mouseAutosToSkip = 4 newColumn = oldColumn = self.focusedColumn newRow = oldRow = self.focusedRow if event.what == evMouseDown: mouse = self.makeLocal(event.mouse.where) for newColumn in range(self.leftColumn, self.numColumns): if self.getColumnPosition(newColumn + 1) > mouse.x: break newRow = mouse.y + self.topRow count = 0 running = True while running: if newColumn != oldColumn or newRow != oldRow: self.focusItemNum(self.focusedColumn, newRow) oldColumn = newColumn oldRow = newRow mouse = self.makeLocal(event.mouse.where) if self.mouseInView(event.mouse.where): for newColumn in range(self.leftColumn, self.numColumns): if self.getColumnPosition(newColumn + 1) > mouse.x: break newRow = mouse.y + self.topRow else: if event.what == evMouseAuto: count += 1 if count == mouseAutosToSkip: count = 0 if mouse.x < 0: newColumn = self.focusedColumn - 1 elif mouse.x >= self.size.x: newColumn = self.focusedColumn + 1 if mouse.y < 0: newRow = self.focusedRow - 1 elif mouse.y >= self.size.y: newRow = self.focusedRow + 1 running = self.mouseEvent(event, evMouseMove | evMouseAuto) self.focusItemNum(newColumn, newRow) if event.mouse.eventFlags & meDoubleClick and self.focusedColumn < self.numColumns and self.focusedRow < self.numRows: self.selectItem(self.focusedColumn, self.focusedRow) self.clearEvent(event) elif event.what == evKeyDown: if (event.keyDown.charScan.charCode == ' ' and self.focusedColumn < self.numColumns and self.focusedRow < self.numRows): self.selectItem(self.focusedColumn, self.focusedRow) else: key = ctrlToArrow(event.keyDown.keyCode) if key == kbUp: newRow = oldRow - 1 elif key == kbDown: newRow = oldRow + 1 elif key == kbRight: newColumn = oldColumn + 1 elif key == kbLeft: newColumn = oldColumn - 1 elif key == kbPgDn: newRow = oldRow + self.size.y elif key == kbPgUp: newRow = oldRow - self.size.y elif key == kbHome: newRow = self.topRow newColumn = self.leftColumn elif key == kbEnd: newRow = self.topRow + self.size.y - 1 for newColumn in range(self.leftColumn, self.numColumns): if self.getColumnPosition(newColumn + 1) > self.size.x: break elif key == kbCtrlPgDn: newRow = self.numRows - 1 elif key == kbCtrlPgUp: newRow = 0 elif key == kbTab: newColumn = oldColumn + 1 if newColumn >= self.numColumns: newRow = oldRow + 1 if newRow >= self.numRows: newRow = 0 newColumn = 0 elif key == kbShiftTab: if oldColumn == 0: if oldRow == 0: oldRow = self.numRows newRow = oldRow - 1 oldColumn = self.numColumns newColumn = oldColumn - 1 self.focusItemNum(newColumn, newRow) self.clearEvent(event) elif event.what == evBroadcast: if self.options & ofSelectable: if event.message.command == cmScrollBarClicked and event.message.infoPtr in ( self.hScrollBar, self.vScrollBar): self.select() elif event.message.command == cmScrollBarChanged: if event.message.infoPtr in (self.hScrollBar, self.vScrollBar): self.focusItemNum(self.hScrollBar.value, self.vScrollBar.value) self.drawView()