Skip to content
This repository has been archived by the owner on Sep 20, 2024. It is now read-only.

Attribute Defs UI: Files widget show what is allowed to drop in #3411

Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions openpype/style/style.css
Original file line number Diff line number Diff line change
Expand Up @@ -1418,3 +1418,6 @@ InViewButton, InViewButton:disabled {
InViewButton:hover {
background: rgba(255, 255, 255, 37);
}
SupportLabel {
color: {color:font-disabled};
}
112 changes: 101 additions & 11 deletions openpype/widgets/attribute_defs/files_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,26 +26,109 @@
EXT_ROLE = QtCore.Qt.UserRole + 8


class SupportLabel(QtWidgets.QLabel):
pass


class DropEmpty(QtWidgets.QWidget):
_drop_enabled_text = "Drag & Drop\n(drop files here)"
_empty_extensions = "Any file"

def __init__(self, parent):
def __init__(self, single_item, allow_sequences, parent):
super(DropEmpty, self).__init__(parent)
label_widget = QtWidgets.QLabel(self._drop_enabled_text, self)
label_widget.setAlignment(QtCore.Qt.AlignCenter)

label_widget.setAttribute(QtCore.Qt.WA_TranslucentBackground)
drop_label_widget = QtWidgets.QLabel("Drag & Drop files here", self)

layout = QtWidgets.QHBoxLayout(self)
items_label_widget = SupportLabel(self)
items_label_widget.setWordWrap(True)

layout = QtWidgets.QVBoxLayout(self)
layout.setContentsMargins(0, 0, 0, 0)
layout.addSpacing(10)
layout.addWidget(
mkolar marked this conversation as resolved.
Show resolved Hide resolved
label_widget,
alignment=QtCore.Qt.AlignCenter
drop_label_widget, 0, alignment=QtCore.Qt.AlignCenter
)
layout.addStretch(1)
layout.addWidget(
items_label_widget, 0, alignment=QtCore.Qt.AlignCenter
)
layout.addSpacing(10)

self._label_widget = label_widget
for widget in (
drop_label_widget,
items_label_widget,
):
widget.setAlignment(QtCore.Qt.AlignCenter)
widget.setAttribute(QtCore.Qt.WA_TranslucentBackground)

self._single_item = single_item
self._allow_sequences = allow_sequences
self._allowed_extensions = set()
self._allow_folders = None

self._drop_label_widget = drop_label_widget
self._items_label_widget = items_label_widget

self.set_allow_folders(False)

def set_extensions(self, extensions):
if extensions:
extensions = {
ext.replace(".", "")
for ext in extensions
}
if extensions == self._allowed_extensions:
return
self._allowed_extensions = extensions

self._update_items_label()

def set_allow_folders(self, allowed):
if self._allow_folders == allowed:
return

self._allow_folders = allowed
self._update_items_label()

def _update_items_label(self):
allowed_items = []
if self._allow_folders:
allowed_items.append("folder")

if self._allowed_extensions:
allowed_items.append("file")
if self._allow_sequences:
allowed_items.append("sequence")

if not self._single_item:
allowed_items = [item + "s" for item in allowed_items]

if not allowed_items:
self._items_label_widget.setText(
"It is not allowed to add anything here!"
)
return

items_label = "Multiple "
if self._single_item:
items_label = "Single "

if len(allowed_items) == 1:
allowed_items_label = allowed_items[0]
elif len(allowed_items) == 2:
allowed_items_label = " or ".join(allowed_items)
else:
last_item = allowed_items.pop(-1)
new_last_item = " or ".join(last_item, allowed_items.pop(-1))
allowed_items.append(new_last_item)
allowed_items_label = ", ".join(allowed_items)

items_label += allowed_items_label
if self._allowed_extensions:
items_label += " of\n{}".format(
", ".join(sorted(self._allowed_extensions))
)

self._items_label_widget.setText(items_label)

def paintEvent(self, event):
super(DropEmpty, self).paintEvent(event)
Expand Down Expand Up @@ -188,7 +271,12 @@ def set_allow_folders(self, allow=None):

def set_allowed_extensions(self, extensions=None):
if extensions is not None:
extensions = set(extensions)
_extensions = set()
for ext in set(extensions):
if not ext.startswith("."):
ext = ".{}".format(ext)
_extensions.add(ext.lower())
extensions = _extensions

if self._allowed_extensions != extensions:
self._allowed_extensions = extensions
Expand Down Expand Up @@ -444,7 +532,7 @@ def __init__(self, single_item, allow_sequences, parent):
super(FilesWidget, self).__init__(parent)
self.setAcceptDrops(True)

empty_widget = DropEmpty(self)
empty_widget = DropEmpty(single_item, allow_sequences, self)

files_model = FilesModel(single_item, allow_sequences)
files_proxy_model = FilesProxyModel()
Expand Down Expand Up @@ -519,6 +607,8 @@ def current_value(self):
def set_filters(self, folders_allowed, exts_filter):
self._files_proxy_model.set_allow_folders(folders_allowed)
self._files_proxy_model.set_allowed_extensions(exts_filter)
self._empty_widget.set_extensions(exts_filter)
self._empty_widget.set_allow_folders(folders_allowed)

def _on_rows_inserted(self, parent_index, start_row, end_row):
for row in range(start_row, end_row + 1):
Expand Down