"""Widgets used by :class:`bookmarks.file_saver.file_saver.FileSaverWidget`.
"""
from PySide2 import QtCore, QtWidgets
from .. import common
from .. import database
from .. import ui
from ..editor import base
from ..tokens import tokens
NoMode = 'invalid'
SceneMode = 'scene'
CacheMode = 'export'
[docs]class BookmarkItemModel(ui.AbstractListModel):
"""Bookmark item picker model.
"""
def __init__(self, server, job, root, parent=None):
self.server = server
self.job = job
self.root = root
super().__init__(parent=parent)
[docs] def init_data(self):
"""Initializes data.
"""
k = '/'.join((self.server, self.job, self.root))
if not k or not QtCore.QFileInfo(k).exists():
return
self._data[len(self._data)] = {
QtCore.Qt.DisplayRole: self.display_name(k),
QtCore.Qt.DecorationRole: ui.get_icon(
'check', color=common.color(common.color_green)
),
QtCore.Qt.ForegroundRole: common.color(common.color_selected_text),
QtCore.Qt.SizeHintRole: self.row_size,
QtCore.Qt.StatusTipRole: k,
QtCore.Qt.AccessibleDescriptionRole: k,
QtCore.Qt.WhatsThisRole: k,
QtCore.Qt.ToolTipRole: k,
}
[docs]class BookmarkComboBox(QtWidgets.QComboBox):
"""Bookmark item picker.
"""
def __init__(self, parent=None):
super().__init__(parent=parent)
self.setView(QtWidgets.QListView())
model = BookmarkItemModel(
self.window().server,
self.window().job,
self.window().root,
)
self.setModel(model)
[docs]class AssetItemModel(ui.AbstractListModel):
"""Asset item picker model.
"""
def __init__(self, server, job, root, asset, parent=None):
self.server = server
self.job = job
self.root = root
self.asset = asset
super().__init__(parent=parent)
[docs] def init_data(self):
"""Initializes data.
"""
k = '/'.join((self.server, self.job, self.root, self.asset))
if not k or not QtCore.QFileInfo(k).exists():
return
icon = ui.get_icon(
'asset',
size=common.size(common.size_margin) * 2,
color=common.color(common.color_separator)
)
self._data[len(self._data)] = {
QtCore.Qt.DisplayRole: self.display_name(k),
QtCore.Qt.DecorationRole: ui.get_icon(
'check', color=common.color(common.color_green)
),
QtCore.Qt.ForegroundRole: common.color(common.color_selected_text),
QtCore.Qt.SizeHintRole: self.row_size,
QtCore.Qt.StatusTipRole: k,
QtCore.Qt.AccessibleDescriptionRole: k,
QtCore.Qt.WhatsThisRole: k,
QtCore.Qt.ToolTipRole: k,
}
[docs] def display_name(self, v):
"""Returns a customized display name.
Args:
v (str): The name of the asset item to modify.
"""
k = '/'.join((self.server, self.job, self.root))
return v.replace(k, '').strip('/').split('/', maxsplit=1)[0]
[docs]class AssetComboBox(QtWidgets.QComboBox):
"""Asset item picker.
"""
def __init__(self, parent=None):
super().__init__(parent=parent)
self.setView(QtWidgets.QListView())
model = AssetItemModel(
self.window().server,
self.window().job,
self.window().root,
self.window().asset,
)
self.setModel(model)
[docs]class TaskComboBox(QtWidgets.QComboBox):
"""Task item picker.
"""
def __init__(self, mode=SceneMode, parent=None):
super().__init__(parent=parent)
self.setView(QtWidgets.QListView())
model = TaskModel(
self.window().server,
self.window().job,
self.window().root,
self.window().asset,
mode
)
self.setModel(model)
[docs] def set_mode(self, mode):
"""Sets the mode of the task picker.
"""
model = self.model()
model.set_mode(mode)
self.clear()
model.init_data()
[docs]class TaskModel(ui.AbstractListModel):
"""Task item picker model.
"""
def __init__(self, server, job, root, asset, mode, parent=None):
self.server = server
self.job = job
self.root = root
self.asset = asset
self._mode = mode
super().__init__(parent=parent)
[docs] def mode(self):
"""Returns the mode of the task picker.
"""
return self._mode
[docs] def set_mode(self, v):
"""Sets the mode of the task picker.
"""
self._mode = v
[docs] @common.error
@common.debug
def init_data(self):
"""Initializes data.
"""
self._data = {}
k = '/'.join((self.server, self.job, self.root, self.asset))
if not k or not QtCore.QFileInfo(k).exists():
return
# Load the available task folders from the active bookmark item's `tokens`.
self._add_separator('Scenes')
self._add_sub_folders(tokens.SceneFolder, 'icon_bw')
self._add_separator('Caches')
self._add_sub_folders(tokens.CacheFolder, 'file')
self._add_separator('Custom (click \'Pick\' to add new)')
def _add_sub_folders(self, token, icon):
folder = tokens.get_folder(token)
description = tokens.get_description(token)
for sub_folder in tokens.get_subfolders(token):
if common.active('task') == sub_folder:
_icon = ui.get_icon(
'check',
color=common.color(common.color_green),
size=common.size(common.size_margin) * 2
)
else:
_icon = ui.get_icon(
icon,
size=common.size(common.size_margin) * 2
)
v = f'{folder}/{sub_folder}'
self._data[len(self._data)] = {
QtCore.Qt.DisplayRole: self.display_name(v),
QtCore.Qt.DecorationRole: _icon,
QtCore.Qt.ForegroundRole: common.color(common.color_text),
QtCore.Qt.SizeHintRole: self.row_size,
QtCore.Qt.StatusTipRole: description,
QtCore.Qt.AccessibleDescriptionRole: description,
QtCore.Qt.WhatsThisRole: description,
QtCore.Qt.ToolTipRole: description,
QtCore.Qt.UserRole: v,
}
[docs] def add_item(self, path):
"""Adds a new task item.
Args:
path (str): The path of the item to add.
"""
self.modelAboutToBeReset.emit()
self.beginResetModel()
_icon = ui.get_icon(
'folder',
size=common.size(common.size_margin) * 2
)
self._data[len(self._data)] = {
QtCore.Qt.DisplayRole: self.display_name(path),
QtCore.Qt.DecorationRole: _icon,
QtCore.Qt.ForegroundRole: common.color(common.color_text),
QtCore.Qt.SizeHintRole: self.row_size,
QtCore.Qt.UserRole: path,
}
self.endResetModel()
[docs]class TemplateModel(ui.AbstractListModel):
"""Template item picker model.
"""
def __init__(self, server, job, root, parent=None):
self.server = server
self.job = job
self.root = root
super().__init__(parent=parent)
[docs] def init_data(self):
"""Initializes data.
"""
args = (self.server, self.job, self.root)
if not all(args):
return
config = tokens.get(*args)
data = config.data()
if not isinstance(data, dict):
return
template = common.settings.value('file_saver/template')
for v in data[tokens.FileNameConfig].values():
if template == v['name']:
icon = ui.get_icon(
'check',
color=common.color(common.color_green),
size=common.size(common.size_margin) * 2
)
else:
icon = ui.get_icon(
'file',
size=common.size(common.size_margin) * 2
)
self._data[len(self._data)] = {
QtCore.Qt.DisplayRole: v['name'],
QtCore.Qt.DecorationRole: icon,
QtCore.Qt.SizeHintRole: self.row_size,
QtCore.Qt.StatusTipRole: v['description'],
QtCore.Qt.AccessibleDescriptionRole: v['description'],
QtCore.Qt.WhatsThisRole: v['description'],
QtCore.Qt.ToolTipRole: v['description'],
QtCore.Qt.UserRole: v['value'],
}
[docs]class TemplateComboBox(QtWidgets.QComboBox):
"""Template item picker.
"""
def __init__(self, parent=None):
super().__init__(parent=parent)
self.setView(QtWidgets.QListView())
model = TemplateModel(
self.window().server,
self.window().job,
self.window().root,
)
self.setModel(model)
[docs]class PrefixEditor(QtWidgets.QDialog):
"""A popup editor used to edit a bookmark prefix.
"""
def __init__(self, server, job, root, parent=None):
super().__init__(parent=parent)
self.ok_button = None
self.editor = None
self.server = server
self.job = job
self.root = root
self._create_ui()
self._connect_signals()
self.init_data()
def _create_ui(self):
QtWidgets.QHBoxLayout(self)
self.setWindowTitle('Edit Prefix')
self.editor = ui.LineEdit(parent=self)
self.editor.setPlaceholderText('Enter a prefix, e.g. \'MYB\'')
self.editor.setValidator(base.text_validator)
self.setFocusProxy(self.editor)
self.editor.setFocusPolicy(QtCore.Qt.StrongFocus)
self.ok_button = ui.PaintedButton('Save', parent=self)
self.layout().addWidget(self.editor, 1)
self.layout().addWidget(self.ok_button, 0)
def _connect_signals(self):
self.ok_button.clicked.connect(lambda: self.done(QtWidgets.QDialog.Accepted))
self.editor.returnPressed.connect(lambda: self.done(QtWidgets.QDialog.Accepted))
self.accepted.connect(self.save_changes)
[docs] def init_data(self):
"""Initializes data.
"""
db = database.get_db(self.server, self.job, self.root)
v = db.value(
db.source(),
'prefix',
database.BookmarkTable
)
if not v:
return
self.editor.setText(v)
[docs] def save_changes(self):
"""Saves changes.
"""
if self.editor.text() == self.parent().prefix_editor.text():
return
self.parent().prefix_editor.setText(self.editor.text())
db = database.get_db(
self.parent().server,
self.parent().job,
self.parent().root
)
db.set_value(
db.source(),
'prefix',
self.editor.text(),
table=database.BookmarkTable
)
[docs] def sizeHint(self):
"""Returns a size hint.
"""
return QtCore.QSize(
common.size(common.size_width) * 0.5,
common.size(common.size_row_height)
)