ayon-core/openpype/tools/workfiles/model.py
2021-04-01 18:54:46 +02:00

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)