|
from PyQt5.QtCore import * |
|
from PyQt5.QtGui import * |
|
from PyQt5.QtWidgets import * |
|
|
|
from localization import StringsDB |
|
from .QXMainWindow import * |
|
|
|
class QXIconButton(QPushButton): |
|
""" |
|
Custom Icon button that works through keyEvent system, without shortcut of QAction |
|
works only with QXMainWindow as global window class |
|
currently works only with one-key shortcut |
|
""" |
|
|
|
def __init__(self, icon, |
|
tooltip=None, |
|
shortcut=None, |
|
click_func=None, |
|
first_repeat_delay=300, |
|
repeat_delay=20, |
|
): |
|
|
|
super().__init__(icon, "") |
|
|
|
self.setIcon(icon) |
|
|
|
if shortcut is not None: |
|
tooltip = f"{tooltip} ( {StringsDB['S_HOT_KEY'] }: {shortcut} )" |
|
|
|
self.setToolTip(tooltip) |
|
|
|
|
|
self.seq = QKeySequence(shortcut) if shortcut is not None else None |
|
|
|
QXMainWindow.inst.add_keyPressEvent_listener ( self.on_keyPressEvent ) |
|
QXMainWindow.inst.add_keyReleaseEvent_listener ( self.on_keyReleaseEvent ) |
|
|
|
self.click_func = click_func |
|
self.first_repeat_delay = first_repeat_delay |
|
self.repeat_delay = repeat_delay |
|
self.repeat_timer = None |
|
|
|
self.op_device = None |
|
|
|
self.pressed.connect( lambda : self.action(is_pressed=True) ) |
|
self.released.connect( lambda : self.action(is_pressed=False) ) |
|
|
|
def action(self, is_pressed=None, op_device=None): |
|
if self.click_func is None: |
|
return |
|
|
|
if is_pressed is not None: |
|
if is_pressed: |
|
if self.repeat_timer is None: |
|
self.click_func() |
|
self.repeat_timer = QTimer() |
|
self.repeat_timer.timeout.connect(self.action) |
|
self.repeat_timer.start(self.first_repeat_delay) |
|
else: |
|
if self.repeat_timer is not None: |
|
self.repeat_timer.stop() |
|
self.repeat_timer = None |
|
else: |
|
self.click_func() |
|
if self.repeat_timer is not None: |
|
self.repeat_timer.setInterval(self.repeat_delay) |
|
|
|
def on_keyPressEvent(self, ev): |
|
key = ev.nativeVirtualKey() |
|
if ev.isAutoRepeat(): |
|
return |
|
|
|
if self.seq is not None: |
|
if key == self.seq[0]: |
|
self.action(is_pressed=True) |
|
|
|
def on_keyReleaseEvent(self, ev): |
|
key = ev.nativeVirtualKey() |
|
if ev.isAutoRepeat(): |
|
return |
|
if self.seq is not None: |
|
if key == self.seq[0]: |
|
self.action(is_pressed=False) |
|
|