files widget has only one widget

This commit is contained in:
Jakub Trllo 2022-04-22 18:50:50 +02:00
parent 0666af82e6
commit 750ec30c55
2 changed files with 34 additions and 99 deletions

View file

@ -87,15 +87,29 @@ class FilesModel(QtGui.QStandardItemModel):
".xpm", ".xwd"
]
def __init__(self):
def __init__(self, multivalue):
super(FilesModel, self).__init__()
self._filenames_by_dirpath = collections.defaultdict(set)
self._items_by_dirpath = collections.defaultdict(list)
self._multivalue = multivalue
def add_filepaths(self, filepaths):
if not filepaths:
return
if not self._multivalue:
filepaths = [filepaths[0]]
item_ids = []
for items in self._items_by_dirpath.values():
for item in items:
item_id = item.data(ITEM_ID_ROLE)
if item_id:
item_ids.append(item_id)
if item_ids:
self.remove_item_by_ids(item_ids)
new_dirpaths = set()
for filepath in filepaths:
filename = os.path.basename(filepath)
@ -368,16 +382,16 @@ class FilesView(QtWidgets.QListView):
return super(FilesView, self).event(event)
class MultiFilesWidget(QtWidgets.QFrame):
class FilesWidget(QtWidgets.QFrame):
value_changed = QtCore.Signal()
def __init__(self, parent):
super(MultiFilesWidget, self).__init__(parent)
def __init__(self, multiselect, parent):
super(FilesWidget, self).__init__(parent)
self.setAcceptDrops(True)
empty_widget = DropEmpty(self)
files_model = FilesModel()
files_model = FilesModel(multiselect)
files_proxy_model = FilesProxyModel()
files_proxy_model.setSourceModel(files_model)
files_view = FilesView(self)
@ -392,6 +406,11 @@ class MultiFilesWidget(QtWidgets.QFrame):
files_proxy_model.rowsInserted.connect(self._on_rows_inserted)
files_proxy_model.rowsRemoved.connect(self._on_rows_removed)
drag_label = DragLabel()
drag_label.setVisible(False)
self._drag_label = drag_label
self._in_set_value = False
self._empty_widget = empty_widget
@ -501,7 +520,7 @@ class MultiFilesWidget(QtWidgets.QFrame):
def sizeHint(self):
# Get size hints of widget and visible widgets
result = super(MultiFilesWidget, self).sizeHint()
result = super(FilesWidget, self).sizeHint()
if not self._files_view.isVisible():
not_visible_hint = self._files_view.sizeHint()
else:
@ -557,90 +576,11 @@ class MultiFilesWidget(QtWidgets.QFrame):
self._empty_widget.setVisible(not files_exists)
class SingleFileWidget(QtWidgets.QWidget):
value_changed = QtCore.Signal()
def __init__(self, parent):
super(SingleFileWidget, self).__init__(parent)
self.setAcceptDrops(True)
filepath_input = QtWidgets.QLineEdit(self)
browse_btn = QtWidgets.QPushButton("Browse", self)
browse_btn.setVisible(False)
class DragLabel(QtWidgets.QWidget):
def __init__(self, parent=None):
super(DragLabel, self).__init__(parent)
t_label = QtWidgets.QLabel("TESTING", self)
layout = QtWidgets.QHBoxLayout(self)
layout.setContentsMargins(0, 0, 0, 0)
layout.addWidget(filepath_input, 1)
layout.addWidget(browse_btn, 0)
browse_btn.clicked.connect(self._on_browse_clicked)
filepath_input.textChanged.connect(self._on_text_change)
self._in_set_value = False
self._filepath_input = filepath_input
self._folders_allowed = False
self._exts_filter = []
def set_value(self, value, multivalue):
self._in_set_value = True
if multivalue:
set_value = set(value)
if len(set_value) == 1:
value = tuple(set_value)[0]
else:
value = "< Multiselection >"
self._filepath_input.setText(value)
self._in_set_value = False
def current_value(self):
return self._filepath_input.text()
def set_filters(self, folders_allowed, exts_filter):
self._folders_allowed = folders_allowed
self._exts_filter = exts_filter
def _on_text_change(self, text):
if not self._in_set_value:
self.value_changed.emit()
def _on_browse_clicked(self):
# TODO implement file dialog logic in '_on_browse_clicked'
print("_on_browse_clicked")
def dragEnterEvent(self, event):
mime_data = event.mimeData()
if not mime_data.hasUrls():
return
filepaths = []
for url in mime_data.urls():
filepath = url.toLocalFile()
if os.path.exists(filepath):
filepaths.append(filepath)
# TODO add folder, extensions check
if len(filepaths) == 1:
event.setDropAction(QtCore.Qt.CopyAction)
event.accept()
def dragLeaveEvent(self, event):
event.accept()
def dropEvent(self, event):
mime_data = event.mimeData()
if mime_data.hasUrls():
filepaths = []
for url in mime_data.urls():
filepath = url.toLocalFile()
if os.path.exists(filepath):
filepaths.append(filepath)
# TODO filter check
if len(filepaths) == 1:
self._filepath_input.setText(filepaths[0])
event.accept()
layout.addWidget(t_label)
self._t_label = t_label

View file

@ -15,6 +15,8 @@ from openpype.lib.attribute_definitions import (
)
from openpype.widgets.nice_checkbox import NiceCheckbox
from .files_widget import FilesWidget
def create_widget_for_attr_def(attr_def, parent=None):
if not isinstance(attr_def, AbtractAttrDef):
@ -337,15 +339,8 @@ class UnknownAttrWidget(_BaseAttrDefWidget):
class FileAttrWidget(_BaseAttrDefWidget):
def _ui_init(self):
self.multipath = self.attr_def.multipath
if self.multipath:
from .files_widget import MultiFilesWidget
input_widget = MultiFilesWidget(self)
else:
from .files_widget import SingleFileWidget
input_widget = SingleFileWidget(self)
input_widget = FilesWidget(self.multipath, self)
if self.attr_def.tooltip:
input_widget.setToolTip(self.attr_def.tooltip)