mirror of
https://github.com/ynput/ayon-core.git
synced 2025-12-25 05:14:40 +01:00
added timers manager that cares about all timers
This commit is contained in:
parent
d85a3d9f67
commit
de4cb207eb
3 changed files with 296 additions and 0 deletions
6
pype/services/timers_manager/__init__.py
Normal file
6
pype/services/timers_manager/__init__.py
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
from .timers_manager import TimersManager
|
||||
from .widget_user_idle import WidgetUserIdle
|
||||
|
||||
|
||||
def tray_init(tray_widget, main_widget):
|
||||
return TimersManager(tray_widget, main_widget)
|
||||
135
pype/services/timers_manager/timers_manager.py
Normal file
135
pype/services/timers_manager/timers_manager.py
Normal file
|
|
@ -0,0 +1,135 @@
|
|||
from Qt import QtCore
|
||||
from .widget_user_idle import WidgetUserIdle
|
||||
from pypeapp.lib.config import get_presets
|
||||
|
||||
|
||||
class Singleton(type):
|
||||
_instances = {}
|
||||
|
||||
def __call__(cls, *args, **kwargs):
|
||||
if cls not in cls._instances:
|
||||
cls._instances[cls] = super(
|
||||
Singleton, cls
|
||||
).__call__(*args, **kwargs)
|
||||
return cls._instances[cls]
|
||||
|
||||
|
||||
class TimersManager(metaclass=Singleton):
|
||||
modules = []
|
||||
is_running = False
|
||||
last_task = None
|
||||
|
||||
def __init__(self, tray_widget, main_widget):
|
||||
self.tray_widget = tray_widget
|
||||
self.main_widget = main_widget
|
||||
self.widget_user_idle = WidgetUserIdle(self)
|
||||
self.set_signal_times()
|
||||
|
||||
def set_signal_times(self):
|
||||
timer_info = get_presets()['services']['timers_manager']['timer']
|
||||
full_time = int(timer_info['full_time'])*60
|
||||
message_time = int(timer_info['message_time'])*60
|
||||
self.time_show_message = full_time - message_time
|
||||
self.time_stop_timer = full_time
|
||||
|
||||
def add_module(self, module):
|
||||
self.modules.append(module)
|
||||
|
||||
def start_timers(self, data):
|
||||
'''
|
||||
Dictionary "data" should contain:
|
||||
- project_name(str) - Name of Project
|
||||
- hierarchy(list/tuple) - list of parents(except project)
|
||||
- task_type(str)
|
||||
- task_name(str)
|
||||
|
||||
Example:
|
||||
- to run timers for task in
|
||||
'C001_BackToPast/assets/characters/villian/Lookdev BG'
|
||||
- input data should contain:
|
||||
data = {
|
||||
'project_name': 'C001_BackToPast',
|
||||
'hierarchy': ['assets', 'characters', 'villian'],
|
||||
'task_type': 'lookdev',
|
||||
'task_name': 'Lookdev BG'
|
||||
}
|
||||
'''
|
||||
self.last_task = data
|
||||
for module in self.modules:
|
||||
module.start_timer_manager(data)
|
||||
self.is_running = True
|
||||
|
||||
def restart_timers(self):
|
||||
if self.last_task is not None:
|
||||
self.start_timers(self.last_task)
|
||||
|
||||
def stop_timers(self):
|
||||
if self.is_running is False:
|
||||
return
|
||||
self.widget_user_idle.bool_not_stopped = False
|
||||
self.widget_user_idle.refresh_context()
|
||||
for module in self.modules:
|
||||
module.stop_timer_manager()
|
||||
self.is_running = False
|
||||
|
||||
def process_modules(self, modules):
|
||||
self.s_handler = SignalHandler(self)
|
||||
|
||||
if 'IdleManager' in modules:
|
||||
self.idle_man = modules['IdleManager']
|
||||
# Times when idle is between show widget and stop timers
|
||||
for num in range(self.time_show_message-1, self.time_stop_timer):
|
||||
self.idle_man.add_time_signal(
|
||||
num,
|
||||
self.s_handler.signal_change_label
|
||||
)
|
||||
# Times when widget is already shown and user restart idle
|
||||
for num in range(self.time_stop_timer - self.time_show_message):
|
||||
self.idle_man.add_time_signal(
|
||||
num,
|
||||
self.s_handler.signal_change_label
|
||||
)
|
||||
# Time when message is shown
|
||||
self.idle_man.add_time_signal(
|
||||
self.time_show_message,
|
||||
self.s_handler.signal_show_message
|
||||
)
|
||||
# Time when timers are stopped
|
||||
self.idle_man.add_time_signal(
|
||||
self.time_stop_timer, self.s_handler.signal_stop_timers
|
||||
)
|
||||
|
||||
def change_label(self):
|
||||
if self.is_running is False:
|
||||
return
|
||||
if self.widget_user_idle.bool_is_showed is False:
|
||||
return
|
||||
if not hasattr(self, 'idle_man'):
|
||||
return
|
||||
|
||||
if self.idle_man.idle_time > self.time_show_message:
|
||||
value = self.time_stop_timer - self.idle_man.idle_time
|
||||
else:
|
||||
value = 1 + (
|
||||
self.time_stop_timer -
|
||||
self.time_show_message -
|
||||
self.idle_man.idle_time
|
||||
)
|
||||
self.widget_user_idle.change_count_widget(value)
|
||||
|
||||
def show_message(self):
|
||||
if self.is_running is False:
|
||||
return
|
||||
if self.widget_user_idle.bool_is_showed is False:
|
||||
self.widget_user_idle.show()
|
||||
|
||||
|
||||
class SignalHandler(QtCore.QObject):
|
||||
signal_show_message = QtCore.Signal()
|
||||
signal_change_label = QtCore.Signal()
|
||||
signal_stop_timers = QtCore.Signal()
|
||||
def __init__(self, cls):
|
||||
super().__init__()
|
||||
self.signal_show_message.connect(cls.show_message)
|
||||
self.signal_change_label.connect(cls.change_label)
|
||||
self.signal_stop_timers.connect(cls.stop_timers)
|
||||
155
pype/services/timers_manager/widget_user_idle.py
Normal file
155
pype/services/timers_manager/widget_user_idle.py
Normal file
|
|
@ -0,0 +1,155 @@
|
|||
from pypeapp import style, Logger
|
||||
from Qt import QtCore, QtGui, QtWidgets
|
||||
|
||||
|
||||
class WidgetUserIdle(QtWidgets.QWidget):
|
||||
|
||||
SIZE_W = 300
|
||||
SIZE_H = 160
|
||||
|
||||
def __init__(self, parent):
|
||||
|
||||
super(WidgetUserIdle, self).__init__()
|
||||
|
||||
self.bool_is_showed = False
|
||||
self.bool_not_stopped = True
|
||||
|
||||
self.parent_widget = parent
|
||||
self.setWindowIcon(parent.tray_widget.icon)
|
||||
self.setWindowFlags(
|
||||
QtCore.Qt.WindowCloseButtonHint |
|
||||
QtCore.Qt.WindowMinimizeButtonHint
|
||||
)
|
||||
|
||||
self._translate = QtCore.QCoreApplication.translate
|
||||
|
||||
self.font = QtGui.QFont()
|
||||
self.font.setFamily("DejaVu Sans Condensed")
|
||||
self.font.setPointSize(9)
|
||||
self.font.setBold(True)
|
||||
self.font.setWeight(50)
|
||||
self.font.setKerning(True)
|
||||
|
||||
self.resize(self.SIZE_W, self.SIZE_H)
|
||||
self.setMinimumSize(QtCore.QSize(self.SIZE_W, self.SIZE_H))
|
||||
self.setMaximumSize(QtCore.QSize(self.SIZE_W+100, self.SIZE_H+100))
|
||||
self.setStyleSheet(style.load_stylesheet())
|
||||
|
||||
self.setLayout(self._main())
|
||||
self.refresh_context()
|
||||
self.setWindowTitle('Pype - Stop timers')
|
||||
|
||||
def _main(self):
|
||||
self.main = QtWidgets.QVBoxLayout()
|
||||
self.main.setObjectName('main')
|
||||
|
||||
self.form = QtWidgets.QFormLayout()
|
||||
self.form.setContentsMargins(10, 15, 10, 5)
|
||||
self.form.setObjectName('form')
|
||||
|
||||
msg_info = 'You didn\'t work for a long time.'
|
||||
msg_question = 'Would you like to stop Timers?'
|
||||
msg_stopped = (
|
||||
'Your Timers were stopped. Do you want to start them again?'
|
||||
)
|
||||
|
||||
self.lbl_info = QtWidgets.QLabel(msg_info)
|
||||
self.lbl_info.setFont(self.font)
|
||||
self.lbl_info.setTextFormat(QtCore.Qt.RichText)
|
||||
self.lbl_info.setObjectName("lbl_info")
|
||||
self.lbl_info.setWordWrap(True)
|
||||
|
||||
self.lbl_question = QtWidgets.QLabel(msg_question)
|
||||
self.lbl_question.setFont(self.font)
|
||||
self.lbl_question.setTextFormat(QtCore.Qt.RichText)
|
||||
self.lbl_question.setObjectName("lbl_question")
|
||||
self.lbl_question.setWordWrap(True)
|
||||
|
||||
self.lbl_stopped = QtWidgets.QLabel(msg_stopped)
|
||||
self.lbl_stopped.setFont(self.font)
|
||||
self.lbl_stopped.setTextFormat(QtCore.Qt.RichText)
|
||||
self.lbl_stopped.setObjectName("lbl_stopped")
|
||||
self.lbl_stopped.setWordWrap(True)
|
||||
|
||||
self.lbl_rest_time = QtWidgets.QLabel("")
|
||||
self.lbl_rest_time.setFont(self.font)
|
||||
self.lbl_rest_time.setTextFormat(QtCore.Qt.RichText)
|
||||
self.lbl_rest_time.setObjectName("lbl_rest_time")
|
||||
self.lbl_rest_time.setWordWrap(True)
|
||||
self.lbl_rest_time.setAlignment(QtCore.Qt.AlignCenter)
|
||||
|
||||
self.form.addRow(self.lbl_info)
|
||||
self.form.addRow(self.lbl_question)
|
||||
self.form.addRow(self.lbl_stopped)
|
||||
self.form.addRow(self.lbl_rest_time)
|
||||
|
||||
self.group_btn = QtWidgets.QHBoxLayout()
|
||||
self.group_btn.addStretch(1)
|
||||
self.group_btn.setObjectName("group_btn")
|
||||
|
||||
self.btn_stop = QtWidgets.QPushButton("Stop timer")
|
||||
self.btn_stop.setToolTip('Stop\'s All timers')
|
||||
self.btn_stop.clicked.connect(self.stop_timer)
|
||||
|
||||
self.btn_continue = QtWidgets.QPushButton("Continue")
|
||||
self.btn_continue.setToolTip('Timer won\'t stop')
|
||||
self.btn_continue.clicked.connect(self.continue_timer)
|
||||
|
||||
self.btn_close = QtWidgets.QPushButton("Close")
|
||||
self.btn_close.setToolTip('Close window')
|
||||
self.btn_close.clicked.connect(self.close_widget)
|
||||
|
||||
self.btn_restart = QtWidgets.QPushButton("Start timers")
|
||||
self.btn_restart.setToolTip('Timer will be started again')
|
||||
self.btn_restart.clicked.connect(self.restart_timer)
|
||||
|
||||
self.group_btn.addWidget(self.btn_continue)
|
||||
self.group_btn.addWidget(self.btn_stop)
|
||||
self.group_btn.addWidget(self.btn_restart)
|
||||
self.group_btn.addWidget(self.btn_close)
|
||||
|
||||
self.main.addLayout(self.form)
|
||||
self.main.addLayout(self.group_btn)
|
||||
|
||||
return self.main
|
||||
|
||||
def refresh_context(self):
|
||||
self.lbl_question.setVisible(self.bool_not_stopped)
|
||||
self.lbl_rest_time.setVisible(self.bool_not_stopped)
|
||||
self.lbl_stopped.setVisible(not self.bool_not_stopped)
|
||||
|
||||
self.btn_continue.setVisible(self.bool_not_stopped)
|
||||
self.btn_stop.setVisible(self.bool_not_stopped)
|
||||
self.btn_restart.setVisible(not self.bool_not_stopped)
|
||||
self.btn_close.setVisible(not self.bool_not_stopped)
|
||||
|
||||
def change_count_widget(self, time):
|
||||
str_time = str(time)
|
||||
self.lbl_rest_time.setText(str_time)
|
||||
|
||||
def stop_timer(self):
|
||||
self.parent_widget.stop_timers()
|
||||
self.close_widget()
|
||||
|
||||
def restart_timer(self):
|
||||
self.parent_widget.restart_timers()
|
||||
self.close_widget()
|
||||
|
||||
def continue_timer(self):
|
||||
self.close_widget()
|
||||
|
||||
def closeEvent(self, event):
|
||||
event.ignore()
|
||||
if self.bool_not_stopped is True:
|
||||
self.continue_timer()
|
||||
else:
|
||||
self.close_widget()
|
||||
|
||||
def close_widget(self):
|
||||
self.bool_is_showed = False
|
||||
self.bool_not_stopped = True
|
||||
self.refresh_context()
|
||||
self.hide()
|
||||
|
||||
def showEvent(self, event):
|
||||
self.bool_is_showed = True
|
||||
Loading…
Add table
Add a link
Reference in a new issue