Пример #1
0
    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)
Пример #2
0
    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)
Пример #3
0
    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)
Пример #4
0
    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)
Пример #5
0
    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)
Пример #6
0
    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)
Пример #7
0
    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)
Пример #8
0
    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()