added few docstrings

This commit is contained in:
iLLiCiTiT 2021-10-22 15:25:13 +02:00
parent fe2c583fc3
commit 22e8886fd1
4 changed files with 164 additions and 16 deletions

View file

@ -4,6 +4,14 @@ from openpype.style import get_objected_colors
class _VLineWidget(QtWidgets.QWidget):
"""Widget drawing 1px wide vertical line.
``` ```
Line is drawn in the middle of widget.
It is expected that parent widget will set width.
"""
def __init__(self, color, left, parent):
super(_VLineWidget, self).__init__(parent)
self._color = color
@ -33,9 +41,21 @@ class _VLineWidget(QtWidgets.QWidget):
painter.end()
class _HLineWidget(QtWidgets.QWidget):
class _HBottomLineWidget(QtWidgets.QWidget):
"""Widget drawing 1px wide vertical line with side lines going upwards.
``````
Corners may have curve set by radius (`set_radius`). Radius should expect
height of widget.
Bottom line is drawed at the bottom of widget. If radius is 0 then height
of widget should be 1px.
It is expected that parent widget will set height and radius.
"""
def __init__(self, color, parent):
super(_HLineWidget, self).__init__(parent)
super(_HBottomLineWidget, self).__init__(parent)
self._color = color
self._radius = 0
@ -65,9 +85,23 @@ class _HLineWidget(QtWidgets.QWidget):
painter.end()
class _HCornerLineWidget(QtWidgets.QWidget):
class _HTopCornerLineWidget(QtWidgets.QWidget):
"""Widget drawing 1px wide horizontal line with side line going downwards.
``````
or
``````
Horizontal line is drawed in the middle of widget.
Widget represents left or right corner. Corner may have curve set by
radius (`set_radius`). Radius should expect height of widget (maximum half
height of widget).
It is expected that parent widget will set height and radius.
"""
def __init__(self, color, left_side, parent):
super(_HCornerLineWidget, self).__init__(parent)
super(_HTopCornerLineWidget, self).__init__(parent)
self._left_side = left_side
self._color = color
self._radius = 0
@ -112,13 +146,13 @@ class _HCornerLineWidget(QtWidgets.QWidget):
class BorderedLabelWidget(QtWidgets.QFrame):
"""Draws borders around widget with label in the middle of top.
+------- Label --------+
| |
| |
| CONTENT |
| |
| |
+----------------------+
Label
CONTENT
"""
def __init__(self, label, parent):
super(BorderedLabelWidget, self).__init__(parent)
@ -128,8 +162,8 @@ class BorderedLabelWidget(QtWidgets.QFrame):
if color_value:
color = color_value.get_qcolor()
top_left_w = _HCornerLineWidget(color, True, self)
top_right_w = _HCornerLineWidget(color, False, self)
top_left_w = _HTopCornerLineWidget(color, True, self)
top_right_w = _HTopCornerLineWidget(color, False, self)
label_widget = QtWidgets.QLabel(label, self)
@ -143,7 +177,7 @@ class BorderedLabelWidget(QtWidgets.QFrame):
left_w = _VLineWidget(color, True, self)
right_w = _VLineWidget(color, False, self)
bottom_w = _HLineWidget(color, self)
bottom_w = _HBottomLineWidget(color, self)
center_layout = QtWidgets.QHBoxLayout()
center_layout.setContentsMargins(5, 5, 5, 5)
@ -176,6 +210,7 @@ class BorderedLabelWidget(QtWidgets.QFrame):
self._center_layout = center_layout
def set_content_margins(self, value):
"""Set margins around content."""
self._center_layout.setContentsMargins(
value, value, value, value
)
@ -204,6 +239,7 @@ class BorderedLabelWidget(QtWidgets.QFrame):
self._widget.update()
def set_center_widget(self, widget):
"""Set content widget and add it to center."""
while self._center_layout.count():
item = self._center_layout.takeAt(0)
widget = item.widget()

View file

@ -4,6 +4,7 @@ from Qt import QtGui
def get_icon_path(icon_name=None, filename=None):
"""Path to image in './images' folder."""
if icon_name is None and filename is None:
return None
@ -21,6 +22,7 @@ def get_icon_path(icon_name=None, filename=None):
def get_image(icon_name=None, filename=None):
"""Load image from './images' as QImage."""
path = get_icon_path(icon_name, filename)
if path:
return QtGui.QImage(path)
@ -28,6 +30,7 @@ def get_image(icon_name=None, filename=None):
def get_pixmap(icon_name=None, filename=None):
"""Load image from './images' as QPixmap."""
path = get_icon_path(icon_name, filename)
if path:
return QtGui.QPixmap(path)
@ -35,6 +38,7 @@ def get_pixmap(icon_name=None, filename=None):
def get_icon(icon_name=None, filename=None):
"""Load image from './images' as QICon."""
pix = get_pixmap(icon_name, filename)
if pix:
return QtGui.QIcon(pix)

View file

@ -5,6 +5,13 @@ from Qt import QtCore, QtGui
class AssetsHierarchyModel(QtGui.QStandardItemModel):
"""Assets hiearrchy model.
For selecting asset for which should beinstance created.
Uses controller to load asset hierarchy. All asset documents are stored by
their parents.
"""
def __init__(self, controller):
super(AssetsHierarchyModel, self).__init__()
self._controller = controller
@ -53,6 +60,19 @@ class AssetsHierarchyModel(QtGui.QStandardItemModel):
class TasksModel(QtGui.QStandardItemModel):
"""Tasks model.
Task model must have set context of asset documents.
Items in model are based on 0-infinite asset documents. Always contain
an interserction of context asset tasks. When no assets are in context
them model is empty if 2 or more are in context assets that don't have
tasks with same names then model is empty too.
Args:
controller (PublisherController): Controller which handles creation and
publishing.
"""
def __init__(self, controller):
super(TasksModel, self).__init__()
self._controller = controller
@ -61,11 +81,31 @@ class TasksModel(QtGui.QStandardItemModel):
self._task_names_by_asset_name = {}
def set_asset_names(self, asset_names):
"""Set assets context."""
self._asset_names = asset_names
self.reset()
@staticmethod
def get_intersection_of_tasks(task_names_by_asset_name):
"""Calculate intersection of task names from passed data.
Example:
```
# Passed `task_names_by_asset_name`
{
"asset_1": ["compositing", "animation"],
"asset_2": ["compositing", "editorial"]
}
```
Result:
```
# Set
{"compositing"}
```
Args:
task_names_by_asset_name (dict): Task names in iterable by parent.
"""
tasks = None
for task_names in task_names_by_asset_name.values():
if tasks is None:
@ -78,12 +118,20 @@ class TasksModel(QtGui.QStandardItemModel):
return tasks or set()
def is_task_name_valid(self, asset_name, task_name):
"""Is task name available for asset.
Args:
asset_name (str): Name of asset where should look for task.
task_name (str): Name of task which should be available in asset's
tasks.
"""
task_names = self._task_names_by_asset_name.get(asset_name)
if task_names and task_name in task_names:
return True
return False
def reset(self):
"""Update model by current context."""
if not self._asset_names:
self._items_by_name = {}
self._task_names_by_asset_name = {}
@ -120,6 +168,13 @@ class TasksModel(QtGui.QStandardItemModel):
class RecursiveSortFilterProxyModel(QtCore.QSortFilterProxyModel):
"""Recursive proxy model.
Item is not filtered if any children match the filter.
Use case: Filtering by string - parent won't be filtered if does not match
the filter string but first checks if any children does.
"""
def filterAcceptsRow(self, row, parent_index):
regex = self.filterRegExp()
if not regex.isEmpty():

View file

@ -32,6 +32,7 @@ class PixmapLabel(QtWidgets.QLabel):
self._source_pixmap = pixmap
def set_source_pixmap(self, pixmap):
"""Change source image."""
self._source_pixmap = pixmap
self._set_resized_pix()
@ -53,7 +54,7 @@ class PixmapLabel(QtWidgets.QLabel):
class TransparentPixmapLabel(QtWidgets.QLabel):
"""Label resizing to width and height of font."""
"""Transparent label resizing to width and height of font."""
def __init__(self, *args, **kwargs):
super(TransparentPixmapLabel, self).__init__(*args, **kwargs)
@ -67,7 +68,11 @@ class TransparentPixmapLabel(QtWidgets.QLabel):
class IconValuePixmapLabel(PixmapLabel):
"""Label resizing to width and height of font."""
"""Label resizing to width and height of font.
Handle icon parsing from creators/instances. Using of QAwesome module
of path to images.
"""
fa_prefixes = ["", "fa."]
default_size = 200
@ -77,6 +82,11 @@ class IconValuePixmapLabel(PixmapLabel):
super(IconValuePixmapLabel, self).__init__(source_pixmap, parent)
def set_icon_def(self, icon_def):
"""Set icon by it's definition name.
Args:
icon_def (str): Name of FontAwesome icon or path to image.
"""
source_pixmap = self._parse_icon_def(icon_def)
self.set_source_pixmap(source_pixmap)
@ -115,6 +125,7 @@ class IconValuePixmapLabel(PixmapLabel):
class ContextWarningLabel(PixmapLabel):
"""Pixmap label with warning icon."""
def __init__(self, parent):
pix = get_pixmap("warning")
@ -150,6 +161,18 @@ class IconButton(QtWidgets.QPushButton):
class PublishIconBtn(IconButton):
"""Button using alpha of source image to redraw with different color.
Main class for buttons showed in publisher.
TODO:
Add different states:
- normal : before publishing
- publishing : publishing is running
- validation error : validation error happened
- error : other error happened
- success : publishing finished
"""
def __init__(self, pixmap_path, *args, **kwargs):
super(PublishIconBtn, self).__init__(*args, **kwargs)
@ -164,9 +187,11 @@ class PublishIconBtn(IconButton):
self.setIcon(self._enabled_icon)
def get_enabled_icon(self):
"""Enabled icon."""
return self._enabled_icon
def get_disabled_icon(self):
"""Disabled icon."""
if self._disabled_icon is None:
pixmap = self.paint_image_with_color(
self._base_image, QtCore.Qt.gray
@ -176,6 +201,14 @@ class PublishIconBtn(IconButton):
@staticmethod
def paint_image_with_color(image, color):
"""Redraw image with single color using it's alpha.
It is expected that input image is singlecolor image with alpha.
Args:
image (QImage): Loaded image with alpha.
color (QColor): Color that will be used to paint image.
"""
width = image.width()
height = image.height()
partition = 8
@ -212,6 +245,7 @@ class PublishIconBtn(IconButton):
class ResetBtn(PublishIconBtn):
"""Publish reset button."""
def __init__(self, parent=None):
icon_path = get_icon_path("refresh")
super(ResetBtn, self).__init__(icon_path, parent)
@ -219,6 +253,7 @@ class ResetBtn(PublishIconBtn):
class StopBtn(PublishIconBtn):
"""Publish stop button."""
def __init__(self, parent):
icon_path = get_icon_path("stop")
super(StopBtn, self).__init__(icon_path, parent)
@ -226,6 +261,7 @@ class StopBtn(PublishIconBtn):
class ValidateBtn(PublishIconBtn):
"""Publish validate button."""
def __init__(self, parent=None):
icon_path = get_icon_path("validate")
super(ValidateBtn, self).__init__(icon_path, parent)
@ -233,6 +269,7 @@ class ValidateBtn(PublishIconBtn):
class PublishBtn(PublishIconBtn):
"""Publish start publish button."""
def __init__(self, parent=None):
icon_path = get_icon_path("play")
super(PublishBtn, self).__init__(icon_path, "Publish", parent)
@ -240,6 +277,7 @@ class PublishBtn(PublishIconBtn):
class CreateInstanceBtn(PublishIconBtn):
"""Create add button."""
def __init__(self, parent=None):
icon_path = get_icon_path("add")
super(CreateInstanceBtn, self).__init__(icon_path, parent)
@ -247,6 +285,7 @@ class CreateInstanceBtn(PublishIconBtn):
class RemoveInstanceBtn(PublishIconBtn):
"""Create remove button."""
def __init__(self, parent=None):
icon_path = get_icon_path("delete")
super(RemoveInstanceBtn, self).__init__(icon_path, parent)
@ -254,6 +293,7 @@ class RemoveInstanceBtn(PublishIconBtn):
class ChangeViewBtn(PublishIconBtn):
"""Create toggle view button."""
def __init__(self, parent=None):
icon_path = get_icon_path("change_view")
super(ChangeViewBtn, self).__init__(icon_path, parent)
@ -261,19 +301,32 @@ class ChangeViewBtn(PublishIconBtn):
class AbstractInstanceView(QtWidgets.QWidget):
"""Abstract class for instance view in creation part."""
selection_changed = QtCore.Signal()
active_changed = QtCore.Signal()
# Refreshed attribute is not changed by view itself
# - widget which triggers `refresh` is changing the state
# TODO store that information in widget which cares about refreshing
refreshed = False
def set_refreshed(self, refreshed):
"""View is refreshed with last instances.
Views are not updated all the time. Only if are visible.
"""
self.refreshed = refreshed
def refresh(self):
"""Refresh instances in the view from current `CreatedContext`."""
raise NotImplementedError((
"{} Method 'refresh' is not implemented."
).format(self.__class__.__name__))
def get_selected_items(self):
"""Selected instances required for callbacks.
Example: When delete button is clicked to know what should be deleted.
"""
raise NotImplementedError((
"{} Method 'get_selected_items' is not implemented."
).format(self.__class__.__name__))