mirror of
https://github.com/ynput/ayon-core.git
synced 2025-12-24 12:54:40 +01:00
move ayon_utils utils to tools utils
This commit is contained in:
parent
f1a921ea02
commit
ed268ccec6
3 changed files with 156 additions and 154 deletions
|
|
@ -1,109 +0,0 @@
|
|||
import os
|
||||
from functools import partial
|
||||
|
||||
from qtpy import QtCore, QtGui
|
||||
|
||||
from ayon_core.tools.utils.lib import get_qta_icon_by_name_and_color
|
||||
|
||||
|
||||
class RefreshThread(QtCore.QThread):
|
||||
refresh_finished = QtCore.Signal(str)
|
||||
|
||||
def __init__(self, thread_id, func, *args, **kwargs):
|
||||
super(RefreshThread, self).__init__()
|
||||
self._id = thread_id
|
||||
self._callback = partial(func, *args, **kwargs)
|
||||
self._exception = None
|
||||
self._result = None
|
||||
self.finished.connect(self._on_finish_callback)
|
||||
|
||||
@property
|
||||
def id(self):
|
||||
return self._id
|
||||
|
||||
@property
|
||||
def failed(self):
|
||||
return self._exception is not None
|
||||
|
||||
def run(self):
|
||||
try:
|
||||
self._result = self._callback()
|
||||
except Exception as exc:
|
||||
self._exception = exc
|
||||
|
||||
def get_result(self):
|
||||
return self._result
|
||||
|
||||
def _on_finish_callback(self):
|
||||
"""Trigger custom signal with thread id.
|
||||
|
||||
Listening for 'finished' signal we make sure that execution of thread
|
||||
finished and QThread object can be safely deleted.
|
||||
"""
|
||||
|
||||
self.refresh_finished.emit(self.id)
|
||||
|
||||
|
||||
class _IconsCache:
|
||||
"""Cache for icons."""
|
||||
|
||||
_cache = {}
|
||||
_default = None
|
||||
|
||||
@classmethod
|
||||
def _get_cache_key(cls, icon_def):
|
||||
parts = []
|
||||
icon_type = icon_def["type"]
|
||||
if icon_type == "path":
|
||||
parts = [icon_type, icon_def["path"]]
|
||||
|
||||
elif icon_type == "awesome-font":
|
||||
parts = [icon_type, icon_def["name"], icon_def["color"]]
|
||||
return "|".join(parts)
|
||||
|
||||
@classmethod
|
||||
def get_icon(cls, icon_def):
|
||||
if not icon_def:
|
||||
return None
|
||||
icon_type = icon_def["type"]
|
||||
cache_key = cls._get_cache_key(icon_def)
|
||||
cache = cls._cache.get(cache_key)
|
||||
if cache is not None:
|
||||
return cache
|
||||
|
||||
icon = None
|
||||
if icon_type == "path":
|
||||
path = icon_def["path"]
|
||||
if os.path.exists(path):
|
||||
icon = QtGui.QIcon(path)
|
||||
|
||||
elif icon_type == "awesome-font":
|
||||
icon_name = icon_def["name"]
|
||||
icon_color = icon_def["color"]
|
||||
icon = get_qta_icon_by_name_and_color(icon_name, icon_color)
|
||||
if icon is None:
|
||||
icon = get_qta_icon_by_name_and_color(
|
||||
"fa.{}".format(icon_name), icon_color)
|
||||
if icon is None:
|
||||
icon = cls.get_default()
|
||||
cls._cache[cache_key] = icon
|
||||
return icon
|
||||
|
||||
@classmethod
|
||||
def get_default(cls):
|
||||
pix = QtGui.QPixmap(1, 1)
|
||||
pix.fill(QtCore.Qt.transparent)
|
||||
return QtGui.QIcon(pix)
|
||||
|
||||
|
||||
def get_qt_icon(icon_def):
|
||||
"""Returns icon from cache or creates new one.
|
||||
|
||||
Args:
|
||||
icon_def (dict[str, Any]): Icon definition.
|
||||
|
||||
Returns:
|
||||
QtGui.QIcon: Icon.
|
||||
"""
|
||||
|
||||
return _IconsCache.get_icon(icon_def)
|
||||
|
|
@ -37,6 +37,7 @@ from .lib import (
|
|||
get_qt_app,
|
||||
get_ayon_qt_app,
|
||||
get_openpype_qt_app,
|
||||
get_qt_icon,
|
||||
)
|
||||
|
||||
from .models import (
|
||||
|
|
@ -96,6 +97,7 @@ __all__ = (
|
|||
"get_qt_app",
|
||||
"get_ayon_qt_app",
|
||||
"get_openpype_qt_app",
|
||||
"get_qt_icon",
|
||||
|
||||
"RecursiveSortFilterProxyModel",
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
import os
|
||||
import sys
|
||||
import contextlib
|
||||
from functools import partial
|
||||
|
||||
from qtpy import QtWidgets, QtCore, QtGui
|
||||
import qtawesome
|
||||
|
|
@ -195,51 +196,6 @@ def get_openpype_qt_app():
|
|||
return get_ayon_qt_app()
|
||||
|
||||
|
||||
class _Cache:
|
||||
icons = {}
|
||||
|
||||
|
||||
def get_qta_icon_by_name_and_color(icon_name, icon_color):
|
||||
if not icon_name or not icon_color:
|
||||
return None
|
||||
|
||||
full_icon_name = "{0}-{1}".format(icon_name, icon_color)
|
||||
if full_icon_name in _Cache.icons:
|
||||
return _Cache.icons[full_icon_name]
|
||||
|
||||
variants = [icon_name]
|
||||
qta_instance = qtawesome._instance()
|
||||
for key in qta_instance.charmap.keys():
|
||||
variants.append("{0}.{1}".format(key, icon_name))
|
||||
|
||||
icon = None
|
||||
used_variant = None
|
||||
for variant in variants:
|
||||
try:
|
||||
icon = qtawesome.icon(variant, color=icon_color)
|
||||
used_variant = variant
|
||||
break
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
if used_variant is None:
|
||||
log.info("Didn't find icon \"{}\"".format(icon_name))
|
||||
|
||||
elif used_variant != icon_name:
|
||||
log.debug("Icon \"{}\" was not found \"{}\" is used instead".format(
|
||||
icon_name, used_variant
|
||||
))
|
||||
|
||||
_Cache.icons[full_icon_name] = icon
|
||||
return icon
|
||||
|
||||
|
||||
def get_default_task_icon(color=None):
|
||||
if color is None:
|
||||
color = get_default_entity_icon_color()
|
||||
return get_qta_icon_by_name_and_color("fa.male", color)
|
||||
|
||||
|
||||
def iter_model_rows(model, column, include_root=False):
|
||||
"""Iterate over all row indices in a model"""
|
||||
indices = [QtCore.QModelIndex()] # start iteration at root
|
||||
|
|
@ -457,3 +413,156 @@ def get_warning_pixmap(color=None):
|
|||
color = get_objected_colors("delete-btn-bg").get_qcolor()
|
||||
|
||||
return paint_image_with_color(src_image, color)
|
||||
|
||||
|
||||
class RefreshThread(QtCore.QThread):
|
||||
refresh_finished = QtCore.Signal(str)
|
||||
|
||||
def __init__(self, thread_id, func, *args, **kwargs):
|
||||
super(RefreshThread, self).__init__()
|
||||
self._id = thread_id
|
||||
self._callback = partial(func, *args, **kwargs)
|
||||
self._exception = None
|
||||
self._result = None
|
||||
self.finished.connect(self._on_finish_callback)
|
||||
|
||||
@property
|
||||
def id(self):
|
||||
return self._id
|
||||
|
||||
@property
|
||||
def failed(self):
|
||||
return self._exception is not None
|
||||
|
||||
def run(self):
|
||||
try:
|
||||
self._result = self._callback()
|
||||
except Exception as exc:
|
||||
self._exception = exc
|
||||
|
||||
def get_result(self):
|
||||
return self._result
|
||||
|
||||
def _on_finish_callback(self):
|
||||
"""Trigger custom signal with thread id.
|
||||
|
||||
Listening for 'finished' signal we make sure that execution of thread
|
||||
finished and QThread object can be safely deleted.
|
||||
"""
|
||||
|
||||
self.refresh_finished.emit(self.id)
|
||||
|
||||
|
||||
class _IconsCache:
|
||||
"""Cache for icons."""
|
||||
|
||||
_cache = {}
|
||||
_default = None
|
||||
_qtawesome_cache = {}
|
||||
|
||||
@classmethod
|
||||
def _get_cache_key(cls, icon_def):
|
||||
parts = []
|
||||
icon_type = icon_def["type"]
|
||||
if icon_type == "path":
|
||||
parts = [icon_type, icon_def["path"]]
|
||||
|
||||
elif icon_type == "awesome-font":
|
||||
parts = [icon_type, icon_def["name"], icon_def["color"]]
|
||||
return "|".join(parts)
|
||||
|
||||
@classmethod
|
||||
def get_icon(cls, icon_def):
|
||||
if not icon_def:
|
||||
return None
|
||||
icon_type = icon_def["type"]
|
||||
cache_key = cls._get_cache_key(icon_def)
|
||||
cache = cls._cache.get(cache_key)
|
||||
if cache is not None:
|
||||
return cache
|
||||
|
||||
icon = None
|
||||
if icon_type == "path":
|
||||
path = icon_def["path"]
|
||||
if os.path.exists(path):
|
||||
icon = QtGui.QIcon(path)
|
||||
|
||||
elif icon_type == "awesome-font":
|
||||
icon_name = icon_def["name"]
|
||||
icon_color = icon_def["color"]
|
||||
icon = cls.get_qta_icon_by_name_and_color(icon_name, icon_color)
|
||||
if icon is None:
|
||||
icon = cls.get_qta_icon_by_name_and_color(
|
||||
"fa.{}".format(icon_name), icon_color)
|
||||
if icon is None:
|
||||
icon = cls.get_default()
|
||||
cls._cache[cache_key] = icon
|
||||
return icon
|
||||
|
||||
@classmethod
|
||||
def get_default(cls):
|
||||
pix = QtGui.QPixmap(1, 1)
|
||||
pix.fill(QtCore.Qt.transparent)
|
||||
return QtGui.QIcon(pix)
|
||||
|
||||
@classmethod
|
||||
def get_qta_icon_by_name_and_color(cls, icon_name, icon_color):
|
||||
if not icon_name or not icon_color:
|
||||
return None
|
||||
|
||||
full_icon_name = "{0}-{1}".format(icon_name, icon_color)
|
||||
if full_icon_name in cls._qtawesome_cache:
|
||||
return cls._qtawesome_cache[full_icon_name]
|
||||
|
||||
variants = [icon_name]
|
||||
qta_instance = qtawesome._instance()
|
||||
for key in qta_instance.charmap.keys():
|
||||
variants.append("{0}.{1}".format(key, icon_name))
|
||||
|
||||
icon = None
|
||||
used_variant = None
|
||||
for variant in variants:
|
||||
try:
|
||||
icon = qtawesome.icon(variant, color=icon_color)
|
||||
used_variant = variant
|
||||
break
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
if used_variant is None:
|
||||
log.info("Didn't find icon \"{}\"".format(icon_name))
|
||||
|
||||
elif used_variant != icon_name:
|
||||
log.debug("Icon \"{}\" was not found \"{}\" is used instead".format(
|
||||
icon_name, used_variant
|
||||
))
|
||||
|
||||
cls._qtawesome_cache[full_icon_name] = icon
|
||||
return icon
|
||||
|
||||
|
||||
def get_qt_icon(icon_def):
|
||||
"""Returns icon from cache or creates new one.
|
||||
|
||||
Args:
|
||||
icon_def (dict[str, Any]): Icon definition.
|
||||
|
||||
Returns:
|
||||
QtGui.QIcon: Icon.
|
||||
|
||||
"""
|
||||
return _IconsCache.get_icon(icon_def)
|
||||
|
||||
|
||||
def get_qta_icon_by_name_and_color(icon_name, icon_color):
|
||||
"""Returns icon from cache or creates new one.
|
||||
|
||||
Args:
|
||||
icon_name (str): Icon name.
|
||||
icon_color (str): Icon color.
|
||||
|
||||
Returns:
|
||||
QtGui.QIcon: Icon.
|
||||
|
||||
"""
|
||||
return _IconsCache.get_qta_icon_by_name_and_color(icon_name, icon_color)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue