mirror of
https://github.com/ynput/ayon-core.git
synced 2025-12-24 21:04:40 +01:00
153 lines
4.2 KiB
Python
153 lines
4.2 KiB
Python
import os
|
|
import logging
|
|
|
|
from Qt import QtCore
|
|
|
|
from avalon import style
|
|
from avalon.vendor import qtawesome
|
|
from avalon.tools.models import TreeModel, Item
|
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
|
|
class FilesModel(TreeModel):
|
|
"""Model listing files with specified extensions in a root folder"""
|
|
Columns = ["filename", "date"]
|
|
|
|
FileNameRole = QtCore.Qt.UserRole + 2
|
|
DateModifiedRole = QtCore.Qt.UserRole + 3
|
|
FilePathRole = QtCore.Qt.UserRole + 4
|
|
IsEnabled = QtCore.Qt.UserRole + 5
|
|
|
|
def __init__(self, file_extensions, parent=None):
|
|
super(FilesModel, self).__init__(parent=parent)
|
|
|
|
self._root = None
|
|
self._file_extensions = file_extensions
|
|
self._icons = {
|
|
"file": qtawesome.icon("fa.file-o", color=style.colors.default)
|
|
}
|
|
|
|
def set_root(self, root):
|
|
self._root = root
|
|
self.refresh()
|
|
|
|
def _add_empty(self):
|
|
item = Item()
|
|
item.update({
|
|
# Put a display message in 'filename'
|
|
"filename": "No files found.",
|
|
# Not-selectable
|
|
"enabled": False,
|
|
"date": None,
|
|
"filepath": None
|
|
})
|
|
|
|
self.add_child(item)
|
|
|
|
def refresh(self):
|
|
self.clear()
|
|
self.beginResetModel()
|
|
|
|
root = self._root
|
|
|
|
if not root:
|
|
self.endResetModel()
|
|
return
|
|
|
|
if not os.path.exists(root):
|
|
# Add Work Area does not exist placeholder
|
|
log.debug("Work Area does not exist: %s", root)
|
|
message = "Work Area does not exist. Use Save As to create it."
|
|
item = Item({
|
|
"filename": message,
|
|
"date": None,
|
|
"filepath": None,
|
|
"enabled": False,
|
|
"icon": qtawesome.icon("fa.times", color=style.colors.mid)
|
|
})
|
|
self.add_child(item)
|
|
self.endResetModel()
|
|
return
|
|
|
|
extensions = self._file_extensions
|
|
|
|
for filename in os.listdir(root):
|
|
path = os.path.join(root, filename)
|
|
if os.path.isdir(path):
|
|
continue
|
|
|
|
ext = os.path.splitext(filename)[1]
|
|
if extensions and ext not in extensions:
|
|
continue
|
|
|
|
modified = os.path.getmtime(path)
|
|
|
|
item = Item({
|
|
"filename": filename,
|
|
"date": modified,
|
|
"filepath": path
|
|
})
|
|
|
|
self.add_child(item)
|
|
|
|
if self.rowCount() == 0:
|
|
self._add_empty()
|
|
|
|
self.endResetModel()
|
|
|
|
def has_filenames(self):
|
|
for item in self._root_item.children():
|
|
if item.get("enabled", True):
|
|
return True
|
|
return False
|
|
|
|
def rowCount(self, parent=None):
|
|
if parent is None or not parent.isValid():
|
|
parent_item = self._root_item
|
|
else:
|
|
parent_item = parent.internalPointer()
|
|
return parent_item.childCount()
|
|
|
|
def data(self, index, role):
|
|
if not index.isValid():
|
|
return
|
|
|
|
if role == QtCore.Qt.DecorationRole:
|
|
# Add icon to filename column
|
|
item = index.internalPointer()
|
|
if index.column() == 0:
|
|
if item["filepath"]:
|
|
return self._icons["file"]
|
|
return item.get("icon", None)
|
|
|
|
if role == self.FileNameRole:
|
|
item = index.internalPointer()
|
|
return item["filename"]
|
|
|
|
if role == self.DateModifiedRole:
|
|
item = index.internalPointer()
|
|
return item["date"]
|
|
|
|
if role == self.FilePathRole:
|
|
item = index.internalPointer()
|
|
return item["filepath"]
|
|
|
|
if role == self.IsEnabled:
|
|
item = index.internalPointer()
|
|
return item.get("enabled", True)
|
|
|
|
return super(FilesModel, self).data(index, role)
|
|
|
|
def headerData(self, section, orientation, role):
|
|
# Show nice labels in the header
|
|
if (
|
|
role == QtCore.Qt.DisplayRole
|
|
and orientation == QtCore.Qt.Horizontal
|
|
):
|
|
if section == 0:
|
|
return "Name"
|
|
elif section == 1:
|
|
return "Date modified"
|
|
|
|
return super(FilesModel, self).headerData(section, orientation, role)
|