DeepFaceLab/core/qtex/QXIconButton.py
2020-03-27 19:08:01 +04:00

84 lines
2.7 KiB
Python

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)