diff --git a/pype/api.py b/pype/api.py index 021080b4d5a..c722757a3c5 100644 --- a/pype/api.py +++ b/pype/api.py @@ -1,7 +1,3 @@ -from .settings import ( - system_settings, - project_settings -) from pypeapp import ( Logger, Anatomy, @@ -53,9 +49,6 @@ from .lib import _subprocess as subprocess __all__ = [ - "system_settings", - "project_settings", - "Logger", "Anatomy", "project_overrides_dir_path", diff --git a/pype/hosts/harmony/__init__.py b/pype/hosts/harmony/__init__.py index 7310e91e9b5..d4b7d91fdb9 100644 --- a/pype/hosts/harmony/__init__.py +++ b/pype/hosts/harmony/__init__.py @@ -18,7 +18,12 @@ def set_scene_settings(settings): if (args[0]["frameStart"] && args[0]["frameEnd"]) { var duration = args[0]["frameEnd"] - args[0]["frameStart"] + 1 - + if (frame.numberOf() > duration) + { + frame.remove( + duration, frame.numberOf() - duration + ); + } if (frame.numberOf() < duration) { frame.insert( diff --git a/pype/hosts/maya/plugin.py b/pype/hosts/maya/plugin.py index a5c57f1ab87..ed244d56df9 100644 --- a/pype/hosts/maya/plugin.py +++ b/pype/hosts/maya/plugin.py @@ -174,25 +174,6 @@ def update(self, container, representation): assert os.path.exists(path), "%s does not exist." % path - # Need to save alembic settings and reapply, cause referencing resets - # them to incoming data. - alembic_attrs = ["speed", "offset", "cycleType"] - alembic_data = {} - if representation["name"] == "abc": - alembic_nodes = cmds.ls( - "{}:*".format(members[0].split(":")[0]), type="AlembicNode" - ) - if alembic_nodes: - for attr in alembic_attrs: - node_attr = "{}.{}".format(alembic_nodes[0], attr) - alembic_data[attr] = cmds.getAttr(node_attr) - else: - cmds.warning( - "No alembic nodes found in {}".format( - cmds.ls("{}:*".format(members[0].split(":")[0])) - ) - ) - try: content = cmds.file(path, loadReference=reference_node, @@ -214,16 +195,6 @@ def update(self, container, representation): self.log.warning("Ignoring file read error:\n%s", exc) - # Reapply alembic settings. - if representation["name"] == "abc": - alembic_nodes = cmds.ls( - "{}:*".format(members[0].split(":")[0]), type="AlembicNode" - ) - if alembic_nodes: - for attr in alembic_attrs: - value = alembic_data[attr] - cmds.setAttr("{}.{}".format(alembic_nodes[0], attr), value) - # Fix PLN-40 for older containers created with Avalon that had the # `.verticesOnlySet` set to True. if cmds.getAttr("{}.verticesOnlySet".format(node)): diff --git a/pype/hosts/nukestudio/tags.py b/pype/hosts/nukestudio/tags.py index c2b1d0d728e..c8af0cabc1b 100644 --- a/pype/hosts/nukestudio/tags.py +++ b/pype/hosts/nukestudio/tags.py @@ -71,8 +71,8 @@ def add_tags_from_presets(): # Get project task types. tasks = io.find_one({"type": "project"})["config"]["tasks"] nks_pres_tags["[Tasks]"] = {} - for task in tasks: - nks_pres_tags["[Tasks]"][task["name"]] = { + for task_type in tasks.keys(): + nks_pres_tags["[Tasks]"][task_type] = { "editable": "1", "note": "", "icon": { diff --git a/pype/lib.py b/pype/lib.py index 6fa204b379c..601c85f5217 100644 --- a/pype/lib.py +++ b/pype/lib.py @@ -19,7 +19,7 @@ from avalon import io, pipeline import six import avalon.api -from .api import config, Anatomy, Logger +from .api import config, Anatomy log = logging.getLogger(__name__) @@ -1622,7 +1622,7 @@ class ApplicationAction(avalon.api.Action): parsed application `.toml` this can launch the application. """ - _log = None + config = None group = None variant = None @@ -1632,12 +1632,6 @@ class ApplicationAction(avalon.api.Action): "AVALON_TASK" ) - @property - def log(self): - if self._log is None: - self._log = Logger().get_logger(self.__class__.__name__) - return self._log - def is_compatible(self, session): for key in self.required_session_keys: if key not in session: @@ -1650,165 +1644,6 @@ def process(self, session, **kwargs): project_name = session["AVALON_PROJECT"] asset_name = session["AVALON_ASSET"] task_name = session["AVALON_TASK"] - launch_application( + return launch_application( project_name, asset_name, task_name, self.name ) - - self._ftrack_after_launch_procedure( - project_name, asset_name, task_name - ) - - def _ftrack_after_launch_procedure( - self, project_name, asset_name, task_name - ): - # TODO move to launch hook - required_keys = ("FTRACK_SERVER", "FTRACK_API_USER", "FTRACK_API_KEY") - for key in required_keys: - if not os.environ.get(key): - self.log.debug(( - "Missing required environment \"{}\"" - " for Ftrack after launch procedure." - ).format(key)) - return - - try: - import ftrack_api - session = ftrack_api.Session(auto_connect_event_hub=True) - self.log.debug("Ftrack session created") - except Exception: - self.log.warning("Couldn't create Ftrack session") - return - - try: - entity = self._find_ftrack_task_entity( - session, project_name, asset_name, task_name - ) - self._ftrack_status_change(session, entity, project_name) - self._start_timer(session, entity, ftrack_api) - except Exception: - self.log.warning( - "Couldn't finish Ftrack procedure.", exc_info=True - ) - return - - finally: - session.close() - - def _find_ftrack_task_entity( - self, session, project_name, asset_name, task_name - ): - project_entity = session.query( - "Project where full_name is \"{}\"".format(project_name) - ).first() - if not project_entity: - self.log.warning( - "Couldn't find project \"{}\" in Ftrack.".format(project_name) - ) - return - - potential_task_entities = session.query(( - "TypedContext where parent.name is \"{}\" and project_id is \"{}\"" - ).format(asset_name, project_entity["id"])).all() - filtered_entities = [] - for _entity in potential_task_entities: - if ( - _entity.entity_type.lower() == "task" - and _entity["name"] == task_name - ): - filtered_entities.append(_entity) - - if not filtered_entities: - self.log.warning(( - "Couldn't find task \"{}\" under parent \"{}\" in Ftrack." - ).format(task_name, asset_name)) - return - - if len(filtered_entities) > 1: - self.log.warning(( - "Found more than one task \"{}\"" - " under parent \"{}\" in Ftrack." - ).format(task_name, asset_name)) - return - - return filtered_entities[0] - - def _ftrack_status_change(self, session, entity, project_name): - presets = config.get_presets(project_name)["ftrack"]["ftrack_config"] - statuses = presets.get("status_update") - if not statuses: - return - - actual_status = entity["status"]["name"].lower() - already_tested = set() - ent_path = "/".join( - [ent["name"] for ent in entity["link"]] - ) - while True: - next_status_name = None - for key, value in statuses.items(): - if key in already_tested: - continue - if actual_status in value or "_any_" in value: - if key != "_ignore_": - next_status_name = key - already_tested.add(key) - break - already_tested.add(key) - - if next_status_name is None: - break - - try: - query = "Status where name is \"{}\"".format( - next_status_name - ) - status = session.query(query).one() - - entity["status"] = status - session.commit() - self.log.debug("Changing status to \"{}\" <{}>".format( - next_status_name, ent_path - )) - break - - except Exception: - session.rollback() - msg = ( - "Status \"{}\" in presets wasn't found" - " on Ftrack entity type \"{}\"" - ).format(next_status_name, entity.entity_type) - self.log.warning(msg) - - def _start_timer(self, session, entity, _ftrack_api): - self.log.debug("Triggering timer start.") - - user_entity = session.query("User where username is \"{}\"".format( - os.environ["FTRACK_API_USER"] - )).first() - if not user_entity: - self.log.warning( - "Couldn't find user with username \"{}\" in Ftrack".format( - os.environ["FTRACK_API_USER"] - ) - ) - return - - source = { - "user": { - "id": user_entity["id"], - "username": user_entity["username"] - } - } - event_data = { - "actionIdentifier": "start.timer", - "selection": [{"entityId": entity["id"], "entityType": "task"}] - } - session.event_hub.publish( - _ftrack_api.event.base.Event( - topic="ftrack.action.launch", - data=event_data, - source=source - ), - on_error="ignore" - ) - self.log.debug("Timer start triggered successfully.") diff --git a/pype/modules/clockify/launcher_actions/ClockifySync.py b/pype/modules/clockify/launcher_actions/ClockifySync.py index a77c0380766..422a3460236 100644 --- a/pype/modules/clockify/launcher_actions/ClockifySync.py +++ b/pype/modules/clockify/launcher_actions/ClockifySync.py @@ -30,7 +30,7 @@ def process(self, session, **kwargs): projects_info = {} for project in projects_to_sync: - task_types = [task['name'] for task in project['config']['tasks']] + task_types = project['config']['tasks'].keys() projects_info[project['name']] = task_types clockify_projects = self.clockapi.get_projects() diff --git a/pype/modules/ftrack/events/event_sync_to_avalon.py b/pype/modules/ftrack/events/event_sync_to_avalon.py index d0c9ea2e966..314871f5b33 100644 --- a/pype/modules/ftrack/events/event_sync_to_avalon.py +++ b/pype/modules/ftrack/events/event_sync_to_avalon.py @@ -717,9 +717,6 @@ def process_removed(self): if not self.ftrack_removed: return ent_infos = self.ftrack_removed - self.log.debug( - "Processing removed entities: {}".format(str(ent_infos)) - ) removable_ids = [] recreate_ents = [] removed_names = [] @@ -881,9 +878,8 @@ def process_removed(self): self.process_session.commit() found_idx = None - proj_doc, asset_docs = self._avalon_ents - for idx, asset_doc in enumerate(asset_docs): - if asset_doc["_id"] == avalon_entity["_id"]: + for idx, _entity in enumerate(self._avalon_ents): + if _entity["_id"] == avalon_entity["_id"]: found_idx = idx break @@ -898,8 +894,7 @@ def process_removed(self): new_entity_id ) # Update cached entities - asset_docs[found_idx] = avalon_entity - self._avalon_ents = proj_doc, asset_docs + self._avalon_ents[found_idx] = avalon_entity if self._avalon_ents_by_id is not None: mongo_id = avalon_entity["_id"] @@ -1263,10 +1258,6 @@ def process_renamed(self): if not ent_infos: return - self.log.debug( - "Processing renamed entities: {}".format(str(ent_infos)) - ) - renamed_tasks = {} not_found = {} changeable_queue = queue.Queue() @@ -1462,10 +1453,6 @@ def process_added(self): if not ent_infos: return - self.log.debug( - "Processing added entities: {}".format(str(ent_infos)) - ) - cust_attrs, hier_attrs = self.avalon_cust_attrs entity_type_conf_ids = {} # Skip if already exit in avalon db or tasks entities @@ -1742,10 +1729,6 @@ def process_moved(self): if not self.ftrack_moved: return - self.log.debug( - "Processing moved entities: {}".format(str(self.ftrack_moved)) - ) - ftrack_moved = {k: v for k, v in sorted( self.ftrack_moved.items(), key=(lambda line: len( @@ -1876,10 +1859,6 @@ def process_updated(self): if not self.ftrack_updated: return - self.log.debug( - "Processing updated entities: {}".format(str(self.ftrack_updated)) - ) - ent_infos = self.ftrack_updated ftrack_mongo_mapping = {} not_found_ids = [] diff --git a/pype/modules/ftrack/ftrack_server/lib.py b/pype/modules/ftrack/ftrack_server/lib.py index ee6b1216dc4..acf31ab437e 100644 --- a/pype/modules/ftrack/ftrack_server/lib.py +++ b/pype/modules/ftrack/ftrack_server/lib.py @@ -205,16 +205,10 @@ def wait(self, duration=None): else: try: self._handle(event) - - mongo_id = event["data"].get("_event_mongo_id") - if mongo_id is None: - continue - self.dbcon.update_one( - {"_id": mongo_id}, + {"id": event["id"]}, {"$set": {"pype_data.is_processed": True}} ) - except pymongo.errors.AutoReconnect: self.pypelog.error(( "Mongo server \"{}\" is not responding, exiting." @@ -250,7 +244,6 @@ def load_events(self): } try: event = ftrack_api.event.base.Event(**new_event_data) - event["data"]["_event_mongo_id"] = event_data["_id"] except Exception: self.logger.exception(L( 'Failed to convert payload into event: {0}', diff --git a/pype/modules/ftrack/ftrack_server/sub_event_status.py b/pype/modules/ftrack/ftrack_server/sub_event_status.py index 00a6687de32..c2e7b7477fd 100644 --- a/pype/modules/ftrack/ftrack_server/sub_event_status.py +++ b/pype/modules/ftrack/ftrack_server/sub_event_status.py @@ -12,7 +12,7 @@ SocketSession, StatusEventHub, TOPIC_STATUS_SERVER, TOPIC_STATUS_SERVER_RESULT ) -from pype.api import Logger +from pype.api import Logger, config log = Logger().get_logger("Event storer") action_identifier = ( @@ -23,7 +23,17 @@ "label": "Pype Admin", "variant": "- Event server Status ({})".format(host_ip), "description": "Get Infromation about event server", - "actionIdentifier": action_identifier + "actionIdentifier": action_identifier, + "icon": "{}/ftrack/action_icons/PypeAdmin.svg".format( + os.environ.get( + "PYPE_STATICS_SERVER", + "http://localhost:{}".format( + config.get_presets().get("services", {}).get( + "rest_api", {} + ).get("default_port", 8021) + ) + ) + ) } diff --git a/pype/modules/ftrack/lib/avalon_sync.py b/pype/modules/ftrack/lib/avalon_sync.py index 03124ab10d9..40b14a02a88 100644 --- a/pype/modules/ftrack/lib/avalon_sync.py +++ b/pype/modules/ftrack/lib/avalon_sync.py @@ -16,6 +16,7 @@ from bson.errors import InvalidId from pymongo import UpdateOne import ftrack_api +from pype.api import config log = Logger().get_logger(__name__) @@ -23,9 +24,9 @@ # Current schemas for avalon types EntitySchemas = { - "project": "avalon-core:project-2.0", + "project": "avalon-core:project-2.1", "asset": "avalon-core:asset-3.0", - "config": "avalon-core:config-1.0" + "config": "avalon-core:config-1.1" } # Group name of custom attributes @@ -50,7 +51,7 @@ def check_regex(name, entity_type, in_schema=None, schema_patterns=None): if in_schema: schema_name = in_schema elif entity_type == "project": - schema_name = "project-2.0" + schema_name = "project-2.1" elif entity_type == "task": schema_name = "task" @@ -103,6 +104,14 @@ def get_pype_attr(session, split_hierarchical=True): def from_dict_to_set(data): + """ + Converts 'data' into $set part of MongoDB update command. + Args: + data: (dictionary) - up-to-date data from Ftrack + + Returns: + (dictionary) - { "$set" : "{..}"} + """ result = {"$set": {}} dict_queue = queue.Queue() dict_queue.put((None, data)) @@ -114,7 +123,8 @@ def from_dict_to_set(data): if _key is not None: new_key = "{}.{}".format(_key, key) - if not isinstance(value, dict): + if not isinstance(value, dict) or \ + (isinstance(value, dict) and not bool(value)): # empty dic result["$set"][new_key] = value continue dict_queue.put((new_key, value)) @@ -123,6 +133,8 @@ def from_dict_to_set(data): def get_avalon_project_template(project_name): """Get avalon template + Args: + project_name: (string) Returns: dictionary with templates """ @@ -135,6 +147,16 @@ def get_avalon_project_template(project_name): def get_project_apps(in_app_list): + """ + Returns metadata information about apps in 'in_app_list' enhanced + from toml files. + Args: + in_app_list: (list) - names of applications + + Returns: + tuple (list, dictionary) - list of dictionaries about apps + dictionary of warnings + """ apps = [] # TODO report missing_toml_msg = "Missing config file for application" @@ -239,6 +261,28 @@ def get_hierarchical_attributes(session, entity, attr_names, attr_defaults={}): return hier_values +def get_task_short_name(task_type): + """ + Returns short name (code) for 'task_type'. Short name stored in + metadata dictionary in project.config per each 'task_type'. + Could be used in anatomy, paths etc. + If no appropriate short name is found in mapping, 'task_type' is + returned back unchanged. + + Currently stores data in: + 'pype-config/presets/ftrack/project_defaults.json' + Args: + task_type: (string) - Animation | Modeling ... + + Returns: + (string) - anim | model ... + """ + presets = config.get_presets()['ftrack']['project_defaults']\ + .get("task_short_names") + + return presets.get(task_type, task_type) + + class SyncEntitiesFactory: dbcon = AvalonMongoDB() @@ -378,7 +422,7 @@ def launch_setup(self, project_full_name): "custom_attributes": {}, "hier_attrs": {}, "avalon_attrs": {}, - "tasks": [] + "tasks": {} }) for entity in all_project_entities: @@ -389,7 +433,9 @@ def launch_setup(self, project_full_name): continue elif entity_type_low == "task": - entities_dict[parent_id]["tasks"].append(entity["name"]) + # enrich task info with additional metadata + task = {"type": entity["type"]["name"]} + entities_dict[parent_id]["tasks"][entity["name"]] = task continue entity_id = entity["id"] @@ -416,6 +462,13 @@ def launch_setup(self, project_full_name): @property def avalon_ents_by_id(self): + """ + Returns dictionary of avalon tracked entities (assets stored in + MongoDB) accessible by its '_id' + (mongo intenal ID - example ObjectId("5f48de5830a9467b34b69798")) + Returns: + (dictionary) - {"(_id)": whole entity asset} + """ if self._avalon_ents_by_id is None: self._avalon_ents_by_id = {} for entity in self.avalon_entities: @@ -425,6 +478,14 @@ def avalon_ents_by_id(self): @property def avalon_ents_by_ftrack_id(self): + """ + Returns dictionary of Mongo ids of avalon tracked entities + (assets stored in MongoDB) accessible by its 'ftrackId' + (id from ftrack) + (example '431ee3f2-e91a-11ea-bfa4-92591a5b5e3e') + Returns: + (dictionary) - {"(ftrackId)": "_id"} + """ if self._avalon_ents_by_ftrack_id is None: self._avalon_ents_by_ftrack_id = {} for entity in self.avalon_entities: @@ -437,6 +498,13 @@ def avalon_ents_by_ftrack_id(self): @property def avalon_ents_by_name(self): + """ + Returns dictionary of Mongo ids of avalon tracked entities + (assets stored in MongoDB) accessible by its 'name' + (example 'Hero') + Returns: + (dictionary) - {"(name)": "_id"} + """ if self._avalon_ents_by_name is None: self._avalon_ents_by_name = {} for entity in self.avalon_entities: @@ -446,6 +514,15 @@ def avalon_ents_by_name(self): @property def avalon_ents_by_parent_id(self): + """ + Returns dictionary of avalon tracked entities + (assets stored in MongoDB) accessible by its 'visualParent' + (example ObjectId("5f48de5830a9467b34b69798")) + + Fills 'self._avalon_archived_ents' for performance + Returns: + (dictionary) - {"(_id)": whole entity} + """ if self._avalon_ents_by_parent_id is None: self._avalon_ents_by_parent_id = collections.defaultdict(list) for entity in self.avalon_entities: @@ -458,6 +535,14 @@ def avalon_ents_by_parent_id(self): @property def avalon_archived_ents(self): + """ + Returns list of archived assets from DB + (their "type" == 'archived_asset') + + Fills 'self._avalon_archived_ents' for performance + Returns: + (list) of assets + """ if self._avalon_archived_ents is None: self._avalon_archived_ents = [ ent for ent in self.dbcon.find({"type": "archived_asset"}) @@ -466,6 +551,14 @@ def avalon_archived_ents(self): @property def avalon_archived_by_name(self): + """ + Returns list of archived assets from DB + (their "type" == 'archived_asset') + + Fills 'self._avalon_archived_by_name' for performance + Returns: + (dictionary of lists) of assets accessible by asset name + """ if self._avalon_archived_by_name is None: self._avalon_archived_by_name = collections.defaultdict(list) for ent in self.avalon_archived_ents: @@ -474,6 +567,14 @@ def avalon_archived_by_name(self): @property def avalon_archived_by_id(self): + """ + Returns dictionary of archived assets from DB + (their "type" == 'archived_asset') + + Fills 'self._avalon_archived_by_id' for performance + Returns: + (dictionary) of assets accessible by asset mongo _id + """ if self._avalon_archived_by_id is None: self._avalon_archived_by_id = { str(ent["_id"]): ent for ent in self.avalon_archived_ents @@ -482,6 +583,15 @@ def avalon_archived_by_id(self): @property def avalon_archived_by_parent_id(self): + """ + Returns dictionary of archived assets from DB per their's parent + (their "type" == 'archived_asset') + + Fills 'self._avalon_archived_by_parent_id' for performance + Returns: + (dictionary of lists) of assets accessible by asset parent + mongo _id + """ if self._avalon_archived_by_parent_id is None: self._avalon_archived_by_parent_id = collections.defaultdict(list) for entity in self.avalon_archived_ents: @@ -494,6 +604,14 @@ def avalon_archived_by_parent_id(self): @property def subsets_by_parent_id(self): + """ + Returns dictionary of subsets from Mongo ("type": "subset") + grouped by their parent. + + Fills 'self._subsets_by_parent_id' for performance + Returns: + (dictionary of lists) + """ if self._subsets_by_parent_id is None: self._subsets_by_parent_id = collections.defaultdict(list) for subset in self.dbcon.find({"type": "subset"}): @@ -515,6 +633,11 @@ def changeability_by_mongo_id(self): @property def all_ftrack_names(self): + """ + Returns lists of names of all entities in Ftrack + Returns: + (list) + """ return [ ent_dict["name"] for ent_dict in self.entities_dict.values() if ( ent_dict.get("name") @@ -534,8 +657,9 @@ def duplicity_regex_check(self): name = entity_dict["name"] entity_type = entity_dict["entity_type"] # Tasks must be checked too - for task_name in entity_dict["tasks"]: - passed = task_names.get(task_name) + for task in entity_dict["tasks"].items(): + task_name, task = task + passed = task_name if passed is None: passed = check_regex( task_name, "task", schema_patterns=_schema_patterns @@ -1014,9 +1138,13 @@ def prepare_ftrack_ent_data(self): if not msg or not items: continue self.report_items["warning"][msg] = items - + tasks = {} + for tt in task_types: + tasks[tt["name"]] = { + "short_name": get_task_short_name(tt["name"]) + } self.entities_dict[id]["final_entity"]["config"] = { - "tasks": [{"name": tt["name"]} for tt in task_types], + "tasks": tasks, "apps": proj_apps } continue @@ -1029,7 +1157,7 @@ def prepare_ftrack_ent_data(self): data["parents"] = parents data["hierarchy"] = hierarchy - data["tasks"] = self.entities_dict[id].pop("tasks", []) + data["tasks"] = self.entities_dict[id].pop("tasks", {}) self.entities_dict[id]["final_entity"]["data"] = data self.entities_dict[id]["final_entity"]["type"] = "asset" @@ -1904,10 +2032,10 @@ def update_entities(self): filter = {"_id": ObjectId(mongo_id)} change_data = from_dict_to_set(changes) mongo_changes_bulk.append(UpdateOne(filter, change_data)) - if not mongo_changes_bulk: # TODO LOG return + log.debug("mongo_changes_bulk:: {}".format(mongo_changes_bulk)) self.dbcon.bulk_write(mongo_changes_bulk) def reload_parents(self, hierarchy_changing_ids): @@ -2144,7 +2272,6 @@ def create_ftrack_ent_from_avalon_ent(self, av_entity, parent_id): "name": _name, "parent": parent_entity }) - self.session.commit() final_entity = {} for k, v in av_entity.items(): diff --git a/pype/modules/websocket_server/hosts/photoshop.py b/pype/modules/websocket_server/hosts/photoshop.py deleted file mode 100644 index cdfb9413a09..00000000000 --- a/pype/modules/websocket_server/hosts/photoshop.py +++ /dev/null @@ -1,64 +0,0 @@ -from pype.api import Logger -from wsrpc_aiohttp import WebSocketRoute -import functools - -import avalon.photoshop as photoshop - -log = Logger().get_logger("WebsocketServer") - - -class Photoshop(WebSocketRoute): - """ - One route, mimicking external application (like Harmony, etc). - All functions could be called from client. - 'do_notify' function calls function on the client - mimicking - notification after long running job on the server or similar - """ - instance = None - - def init(self, **kwargs): - # Python __init__ must be return "self". - # This method might return anything. - log.debug("someone called Photoshop route") - self.instance = self - return kwargs - - # server functions - async def ping(self): - log.debug("someone called Photoshop route ping") - - # This method calls function on the client side - # client functions - - async def read(self): - log.debug("photoshop.read client calls server server calls " - "Photo client") - return await self.socket.call('Photoshop.read') - - # panel routes for tools - async def creator_route(self): - self._tool_route("creator") - - async def workfiles_route(self): - self._tool_route("workfiles") - - async def loader_route(self): - self._tool_route("loader") - - async def publish_route(self): - self._tool_route("publish") - - async def sceneinventory_route(self): - self._tool_route("sceneinventory") - - async def projectmanager_route(self): - self._tool_route("projectmanager") - - def _tool_route(self, tool_name): - """The address accessed when clicking on the buttons.""" - partial_method = functools.partial(photoshop.show, tool_name) - - photoshop.execute_in_main_thread(partial_method) - - # Required return statement. - return "nothing" diff --git a/pype/modules/websocket_server/stubs/photoshop_server_stub.py b/pype/modules/websocket_server/stubs/photoshop_server_stub.py deleted file mode 100644 index da69127799c..00000000000 --- a/pype/modules/websocket_server/stubs/photoshop_server_stub.py +++ /dev/null @@ -1,283 +0,0 @@ -from pype.modules.websocket_server import WebSocketServer -""" - Stub handling connection from server to client. - Used anywhere solution is calling client methods. -""" -import json -from collections import namedtuple - - -class PhotoshopServerStub(): - """ - Stub for calling function on client (Photoshop js) side. - Expects that client is already connected (started when avalon menu - is opened). - 'self.websocketserver.call' is used as async wrapper - """ - - def __init__(self): - self.websocketserver = WebSocketServer.get_instance() - self.client = self.websocketserver.get_client() - - def open(self, path): - """ - Open file located at 'path' (local). - :param path: file path locally - :return: None - """ - self.websocketserver.call(self.client.call - ('Photoshop.open', path=path) - ) - - def read(self, layer, layers_meta=None): - """ - Parses layer metadata from Headline field of active document - :param layer: Layer("id": XXX, "name":'YYY') - :param data: json representation for single layer - :param all_layers: - for performance, could be - injected for usage in loop, if not, single call will be - triggered - :param layers_meta: json representation from Headline - (for performance - provide only if imprint is in - loop - value should be same) - :return: None - """ - if not layers_meta: - layers_meta = self.get_layers_metadata() - # json.dumps writes integer values in a dictionary to string, so - # anticipating it here. - if str(layer.id) in layers_meta and layers_meta[str(layer.id)]: - layers_meta[str(layer.id)].update(data) - else: - layers_meta[str(layer.id)] = data - - # Ensure only valid ids are stored. - if not all_layers: - all_layers = self.get_layers() - layer_ids = [layer.id for layer in all_layers] - cleaned_data = {} - - for id in layers_meta: - if int(id) in layer_ids: - cleaned_data[id] = layers_meta[id] - - payload = json.dumps(cleaned_data, indent=4) - - self.websocketserver.call(self.client.call - ('Photoshop.imprint', payload=payload) - ) - - def get_layers(self): - """ - Returns JSON document with all(?) layers in active document. - - :return: - Format of tuple: { 'id':'123', - 'name': 'My Layer 1', - 'type': 'GUIDE'|'FG'|'BG'|'OBJ' - 'visible': 'true'|'false' - """ - res = self.websocketserver.call(self.client.call - ('Photoshop.get_layers')) - - return self._to_records(res) - - def get_layers_in_layers(self, layers): - """ - Return all layers that belong to layers (might be groups). - :param layers: - :return: - """ - all_layers = self.get_layers() - ret = [] - parent_ids = set([lay.id for lay in layers]) - - for layer in all_layers: - parents = set(layer.parents) - if len(parent_ids & parents) > 0: - ret.append(layer) - if layer.id in parent_ids: - ret.append(layer) - - return ret - - def create_group(self, name): - """ - Create new group (eg. LayerSet) - :return: - """ - ret = self.websocketserver.call(self.client.call - ('Photoshop.create_group', - name=name)) - # create group on PS is asynchronous, returns only id - layer = {"id": ret, "name": name, "group": True} - return namedtuple('Layer', layer.keys())(*layer.values()) - - def group_selected_layers(self, name): - """ - Group selected layers into new LayerSet (eg. group) - :return: - """ - res = self.websocketserver.call(self.client.call - ('Photoshop.group_selected_layers', - name=name) - ) - return self._to_records(res) - - def get_selected_layers(self): - """ - Get a list of actually selected layers - :return: - """ - res = self.websocketserver.call(self.client.call - ('Photoshop.get_selected_layers')) - return self._to_records(res) - - def select_layers(self, layers): - """ - Selecte specified layers in Photoshop - :param layers: - :return: None - """ - layer_ids = [layer.id for layer in layers] - - self.websocketserver.call(self.client.call - ('Photoshop.get_layers', - layers=layer_ids) - ) - - def get_active_document_full_name(self): - """ - Returns full name with path of active document via ws call - :return: full path with name - """ - res = self.websocketserver.call( - self.client.call('Photoshop.get_active_document_full_name')) - - return res - - def get_active_document_name(self): - """ - Returns just a name of active document via ws call - :return: file name - """ - res = self.websocketserver.call(self.client.call - ('Photoshop.get_active_document_name')) - - return res - - def is_saved(self): - """ - Returns true if no changes in active document - :return: - """ - return self.websocketserver.call(self.client.call - ('Photoshop.is_saved')) - - def save(self): - """ - Saves active document - :return: None - """ - self.websocketserver.call(self.client.call - ('Photoshop.save')) - - def saveAs(self, image_path, ext, as_copy): - """ - Saves active document to psd (copy) or png or jpg - :param image_path: full local path - :param ext: - :param as_copy: - :return: None - """ - self.websocketserver.call(self.client.call - ('Photoshop.saveAs', - image_path=image_path, - ext=ext, - as_copy=as_copy)) - - def set_visible(self, layer_id, visibility): - """ - Set layer with 'layer_id' to 'visibility' - :param layer_id: - :param visibility: - :return: None - """ - self.websocketserver.call(self.client.call - ('Photoshop.set_visible', - layer_id=layer_id, - visibility=visibility)) - - def get_layers_metadata(self): - """ - Reads layers metadata from Headline from active document in PS. - (Headline accessible by File > File Info) - :return: - json documents - """ - layers_data = {} - res = self.websocketserver.call(self.client.call('Photoshop.read')) - try: - layers_data = json.loads(res) - except json.decoder.JSONDecodeError: - pass - return layers_data - - def import_smart_object(self, path): - """ - Import the file at `path` as a smart object to active document. - - Args: - path (str): File path to import. - """ - res = self.websocketserver.call(self.client.call - ('Photoshop.import_smart_object', - path=path)) - - return self._to_records(res).pop() - - def replace_smart_object(self, layer, path): - """ - Replace the smart object `layer` with file at `path` - - Args: - layer (namedTuple): Layer("id":XX, "name":"YY"..). - path (str): File to import. - """ - self.websocketserver.call(self.client.call - ('Photoshop.replace_smart_object', - layer=layer, - path=path)) - - def close(self): - self.client.close() - - def _to_records(self, res): - """ - Converts string json representation into list of named tuples for - dot notation access to work. - :return: - :param res: - json representation - """ - try: - layers_data = json.loads(res) - except json.decoder.JSONDecodeError: - raise ValueError("Received broken JSON {}".format(res)) - ret = [] - # convert to namedtuple to use dot donation - if isinstance(layers_data, dict): # TODO refactore - layers_data = [layers_data] - for d in layers_data: - ret.append(namedtuple('Layer', d.keys())(*d.values())) - return ret diff --git a/pype/modules/websocket_server/websocket_server.py b/pype/modules/websocket_server/websocket_server.py index 1152c65e007..56e71ea8951 100644 --- a/pype/modules/websocket_server/websocket_server.py +++ b/pype/modules/websocket_server/websocket_server.py @@ -1,4 +1,4 @@ -from pype.api import Logger +from pype.api import config, Logger import threading from aiohttp import web @@ -9,7 +9,6 @@ import sys import pyclbr import importlib -import urllib log = Logger().get_logger("WebsocketServer") @@ -20,23 +19,24 @@ class WebSocketServer(): Uses class in external_app_1.py to mimic implementation for single external application. 'test_client' folder contains two test implementations of client + + WIP """ - _instance = None def __init__(self): self.qaction = None self.failed_icon = None self._is_running = False - WebSocketServer._instance = self - self.client = None - self.handlers = {} + default_port = 8099 - websocket_url = os.getenv("WEBSOCKET_URL") - if websocket_url: - parsed = urllib.parse.urlparse(websocket_url) - port = parsed.port - if not port: - port = 8099 # fallback + try: + self.presets = config.get_presets()["services"]["websocket_server"] + except Exception: + self.presets = {"default_port": default_port, "exclude_ports": []} + log.debug(( + "There are not set presets for WebsocketServer." + " Using defaults \"{}\"" + ).format(str(self.presets))) self.app = web.Application() @@ -48,7 +48,7 @@ def __init__(self): directories_with_routes = ['hosts'] self.add_routes_for_directories(directories_with_routes) - self.websocket_thread = WebsocketServerThread(self, port) + self.websocket_thread = WebsocketServerThread(self, default_port) def add_routes_for_directories(self, directories_with_routes): """ Loops through selected directories to find all modules and @@ -78,33 +78,6 @@ def add_routes_for_module(self, file_name, dir_name): WebSocketAsync.add_route(class_name, cls) sys.path.pop() - def call(self, func): - log.debug("websocket.call {}".format(func)) - future = asyncio.run_coroutine_threadsafe(func, - self.websocket_thread.loop) - result = future.result() - return result - - def get_client(self): - """ - Return first connected client to WebSocket - TODO implement selection by Route - :return: client - """ - clients = WebSocketAsync.get_clients() - client = None - if len(clients) > 0: - key = list(clients.keys())[0] - client = clients.get(key) - - return client - - @staticmethod - def get_instance(): - if WebSocketServer._instance is None: - WebSocketServer() - return WebSocketServer._instance - def tray_start(self): self.websocket_thread.start() @@ -151,7 +124,6 @@ def __init__(self, module, port): self.loop = None self.runner = None self.site = None - self.tasks = [] def run(self): self.is_running = True @@ -197,12 +169,6 @@ async def check_shutdown(self): periodically. """ while self.is_running: - while self.tasks: - task = self.tasks.pop(0) - log.debug("waiting for task {}".format(task)) - await task - log.debug("returned value {}".format(task.result)) - await asyncio.sleep(0.5) log.debug("Starting shutdown") diff --git a/pype/plugins/ftrack/publish/integrate_hierarchy_ftrack.py b/pype/plugins/ftrack/publish/integrate_hierarchy_ftrack.py index e8a6151efd5..cc569ce2d10 100644 --- a/pype/plugins/ftrack/publish/integrate_hierarchy_ftrack.py +++ b/pype/plugins/ftrack/publish/integrate_hierarchy_ftrack.py @@ -2,7 +2,6 @@ import six import pyblish.api from avalon import io -from pprint import pformat try: from pype.modules.ftrack.lib.avalon_sync import CUST_ATTR_AUTO_SYNC @@ -41,14 +40,9 @@ class IntegrateHierarchyToFtrack(pyblish.api.ContextPlugin): def process(self, context): self.context = context - if "hierarchyContext" not in self.context.data: + if "hierarchyContext" not in context.data: return - hierarchy_context = self.context.data["hierarchyContext"] - - self.log.debug( - f"__ hierarchy_context: `{pformat(hierarchy_context)}`") - self.session = self.context.data["ftrackSession"] project_name = self.context.data["projectEntity"]["name"] query = 'Project where full_name is "{}"'.format(project_name) @@ -61,7 +55,7 @@ def process(self, context): self.ft_project = None - input_data = hierarchy_context + input_data = context.data["hierarchyContext"] # disable termporarily ftrack project's autosyncing if auto_sync_state: @@ -173,27 +167,6 @@ def import_to_ftrack(self, input_data, parent=None): self.session.rollback() six.reraise(tp, value, tb) - # Create notes. - user = self.session.query( - "User where username is \"{}\"".format(self.session.api_user) - ).first() - if user: - for comment in entity_data.get("comments", []): - entity.create_note(comment, user) - else: - self.log.warning( - "Was not able to query current User {}".format( - self.session.api_user - ) - ) - try: - self.session.commit() - except Exception: - tp, value, tb = sys.exc_info() - self.session.rollback() - six.reraise(tp, value, tb) - - # Import children. if 'childs' in entity_data: self.import_to_ftrack( entity_data['childs'], entity) diff --git a/pype/plugins/global/publish/extract_hierarchy_avalon.py b/pype/plugins/global/publish/extract_hierarchy_avalon.py index 4253c35929a..b43678ff6c9 100644 --- a/pype/plugins/global/publish/extract_hierarchy_avalon.py +++ b/pype/plugins/global/publish/extract_hierarchy_avalon.py @@ -10,7 +10,6 @@ class ExtractHierarchyToAvalon(pyblish.api.ContextPlugin): families = ["clip", "shot"] def process(self, context): - # processing starts here if "hierarchyContext" not in context.data: self.log.info("skipping IntegrateHierarchyToAvalon") return @@ -18,29 +17,7 @@ def process(self, context): if not io.Session: io.install() - active_assets = [] - hierarchy_context = context.data["hierarchyContext"] - hierarchy_assets = self._get_assets(hierarchy_context) - - # filter only the active publishing insatnces - for instance in context: - if instance.data.get("publish") is False: - continue - - if not instance.data.get("asset"): - continue - - active_assets.append(instance.data["asset"]) - - # filter out only assets which are activated as isntances - new_hierarchy_assets = {k: v for k, v in hierarchy_assets.items() - if k in active_assets} - - # modify the hierarchy context so there are only fitred assets - self._set_assets(hierarchy_context, new_hierarchy_assets) - - input_data = context.data["hierarchyContext"] = hierarchy_context - + input_data = context.data["hierarchyContext"] self.project = None self.import_to_avalon(input_data) @@ -61,7 +38,7 @@ def import_to_avalon(self, input_data, parent=None): data["inputs"] = entity_data.get("inputs", []) # Tasks. - tasks = entity_data.get("tasks", []) + tasks = entity_data.get("tasks", {}) if tasks is not None or len(tasks) > 0: data["tasks"] = tasks parents = [] @@ -101,11 +78,13 @@ def import_to_avalon(self, input_data, parent=None): if entity: # Do not override data, only update cur_entity_data = entity.get("data") or {} - new_tasks = data.pop("tasks", []) + new_tasks = data.pop("tasks", {}) if "tasks" in cur_entity_data and new_tasks: - for task_name in new_tasks: - if task_name not in cur_entity_data["tasks"]: - cur_entity_data["tasks"].append(task_name) + for task_name in new_tasks.keys(): + if task_name \ + not in cur_entity_data["tasks"].keys(): + cur_entity_data["tasks"][task_name] = \ + new_tasks[task_name] cur_entity_data.update(data) data = cur_entity_data else: @@ -172,41 +151,3 @@ def create_avalon_asset(self, name, data): entity_id = io.insert_one(item).inserted_id return io.find_one({"_id": entity_id}) - - def _get_assets(self, input_dict): - """ Returns only asset dictionary. - Usually the last part of deep dictionary which - is not having any children - """ - for key in input_dict.keys(): - # check if child key is available - if input_dict[key].get("childs"): - # loop deeper - return self._get_assets(input_dict[key]["childs"]) - else: - # give the dictionary with assets - return input_dict - - def _set_assets(self, input_dict, new_assets=None): - """ Modify the hierarchy context dictionary. - It will replace the asset dictionary with only the filtred one. - """ - for key in input_dict.keys(): - # check if child key is available - if input_dict[key].get("childs"): - # return if this is just for testing purpose and no - # new_assets property is avalable - if not new_assets: - return True - - # test for deeper inner children availabelity - if self._set_assets(input_dict[key]["childs"]): - # if one level deeper is still children available - # then process farther - self._set_assets(input_dict[key]["childs"], new_assets) - else: - # or just assign the filtred asset ditionary - input_dict[key]["childs"] = new_assets - else: - # test didnt find more childs in input dictionary - return None diff --git a/pype/plugins/global/publish/extract_jpeg.py b/pype/plugins/global/publish/extract_jpeg.py index d23ce4360f4..89a4bbd664e 100644 --- a/pype/plugins/global/publish/extract_jpeg.py +++ b/pype/plugins/global/publish/extract_jpeg.py @@ -81,11 +81,6 @@ def process(self, instance): jpeg_items.append("-i {}".format(full_input_path)) # output arguments from presets jpeg_items.extend(ffmpeg_args.get("output") or []) - - # If its a movie file, we just want one frame. - if repre["ext"] == "mov": - jpeg_items.append("-vframes 1") - # output file jpeg_items.append(full_output_path) diff --git a/pype/plugins/global/publish/integrate_new.py b/pype/plugins/global/publish/integrate_new.py index 68549e91860..f92968e5546 100644 --- a/pype/plugins/global/publish/integrate_new.py +++ b/pype/plugins/global/publish/integrate_new.py @@ -682,14 +682,6 @@ def get_subset(self, asset, instance): instance.data.get('subsetGroup')}} ) - # Update families on subset. - families = [instance.data["family"]] - families.extend(instance.data.get("families", [])) - io.update_many( - {"type": "subset", "_id": io.ObjectId(subset["_id"])}, - {"$set": {"data.families": families}} - ) - return subset def create_version(self, subset, version_number, data=None): diff --git a/pype/plugins/global/publish/submit_publish_job.py b/pype/plugins/global/publish/submit_publish_job.py index 99f0ae7cb65..758872e7173 100644 --- a/pype/plugins/global/publish/submit_publish_job.py +++ b/pype/plugins/global/publish/submit_publish_job.py @@ -718,8 +718,7 @@ def process(self, instance): "resolutionWidth": data.get("resolutionWidth", 1920), "resolutionHeight": data.get("resolutionHeight", 1080), "multipartExr": data.get("multipartExr", False), - "jobBatchName": data.get("jobBatchName", ""), - "review": data.get("review", True) + "jobBatchName": data.get("jobBatchName", "") } if "prerender" in instance.data["families"]: diff --git a/pype/plugins/global/publish/validate_intent.py b/pype/plugins/global/publish/validate_intent.py deleted file mode 100644 index 80bcb0e1648..00000000000 --- a/pype/plugins/global/publish/validate_intent.py +++ /dev/null @@ -1,31 +0,0 @@ -import pyblish.api -import os - - -class ValidateIntent(pyblish.api.ContextPlugin): - """Validate intent of the publish. - - It is required to fill the intent of this publish. Chech the log - for more details - """ - - order = pyblish.api.ValidatorOrder - - label = "Validate Intent" - # TODO: this should be off by default and only activated viac config - tasks = ["animation"] - hosts = ["harmony"] - if os.environ.get("AVALON_TASK") not in tasks: - active = False - - def process(self, context): - msg = ( - "Please make sure that you select the intent of this publish." - ) - - intent = context.data.get("intent") - self.log.debug(intent) - assert intent, msg - - intent_value = intent.get("value") - assert intent is not "", msg diff --git a/pype/plugins/global/publish/validate_version.py b/pype/plugins/global/publish/validate_version.py index 6701041541e..9c7ce723072 100644 --- a/pype/plugins/global/publish/validate_version.py +++ b/pype/plugins/global/publish/validate_version.py @@ -10,7 +10,7 @@ class ValidateVersion(pyblish.api.InstancePlugin): order = pyblish.api.ValidatorOrder label = "Validate Version" - hosts = ["nuke", "maya", "blender", "standalonepublisher"] + hosts = ["nuke", "maya", "blender"] def process(self, instance): version = instance.data.get("version") diff --git a/pype/plugins/maya/load/load_image_plane.py b/pype/plugins/maya/load/load_image_plane.py index 7d8ae27f893..17a6866f807 100644 --- a/pype/plugins/maya/load/load_image_plane.py +++ b/pype/plugins/maya/load/load_image_plane.py @@ -12,7 +12,7 @@ class ImagePlaneLoader(api.Loader): families = ["plate", "render"] label = "Create imagePlane on selected camera." - representations = ["mov", "exr", "preview", "png"] + representations = ["mov", "exr", "preview"] icon = "image" color = "orange" @@ -29,8 +29,6 @@ def load(self, context, name, namespace, data): # Getting camera from selection. selection = pc.ls(selection=True) - camera = None - if len(selection) > 1: QtWidgets.QMessageBox.critical( None, @@ -41,29 +39,25 @@ def load(self, context, name, namespace, data): return if len(selection) < 1: - result = QtWidgets.QMessageBox.critical( + QtWidgets.QMessageBox.critical( None, "Error!", - "No camera selected. Do you want to create a camera?", - QtWidgets.QMessageBox.Ok, - QtWidgets.QMessageBox.Cancel + "No camera selected.", + QtWidgets.QMessageBox.Ok ) - if result == QtWidgets.QMessageBox.Ok: - camera = pc.createNode("camera") - else: - return - else: - relatives = pc.listRelatives(selection[0], shapes=True) - if pc.ls(relatives, type="camera"): - camera = selection[0] - else: - QtWidgets.QMessageBox.critical( - None, - "Error!", - "Selected node is not a camera.", - QtWidgets.QMessageBox.Ok - ) - return + return + + relatives = pc.listRelatives(selection[0], shapes=True) + if not pc.ls(relatives, type="camera"): + QtWidgets.QMessageBox.critical( + None, + "Error!", + "Selected node is not a camera.", + QtWidgets.QMessageBox.Ok + ) + return + + camera = selection[0] try: camera.displayResolution.set(1) @@ -87,7 +81,6 @@ def load(self, context, name, namespace, data): image_plane_shape.frameOffset.set(1 - start_frame) image_plane_shape.frameIn.set(start_frame) image_plane_shape.frameOut.set(end_frame) - image_plane_shape.frameCache.set(end_frame) image_plane_shape.useFrameExtension.set(1) movie_representations = ["mov", "preview"] diff --git a/pype/plugins/maya/publish/collect_yeti_cache.py b/pype/plugins/maya/publish/collect_yeti_cache.py index 4af3e1ea18c..e24517951be 100644 --- a/pype/plugins/maya/publish/collect_yeti_cache.py +++ b/pype/plugins/maya/publish/collect_yeti_cache.py @@ -30,7 +30,7 @@ class CollectYetiCache(pyblish.api.InstancePlugin): label = "Collect Yeti Cache" families = ["yetiRig", "yeticache"] hosts = ["maya"] - tasks = ["animation", "fx"] + tasks = {"animation": {"type": "Animation"}, "fx": {"type": "FX"}} def process(self, instance): diff --git a/pype/plugins/nuke/publish/extract_thumbnail.py b/pype/plugins/nuke/publish/extract_thumbnail.py index a53cb4d1466..a3ef09bc9fb 100644 --- a/pype/plugins/nuke/publish/extract_thumbnail.py +++ b/pype/plugins/nuke/publish/extract_thumbnail.py @@ -15,12 +15,10 @@ class ExtractThumbnail(pype.api.Extractor): order = pyblish.api.ExtractorOrder + 0.01 label = "Extract Thumbnail" - families = ["review"] + families = ["review", "render.farm"] hosts = ["nuke"] def process(self, instance): - if "render.farm" in instance.data["families"]: - return with anlib.maintained_selection(): self.log.debug("instance: {}".format(instance)) diff --git a/pype/plugins/nukestudio/publish/collect_hierarchy_context.py b/pype/plugins/nukestudio/publish/collect_hierarchy_context.py index 930efd618e8..a41e987bdb7 100644 --- a/pype/plugins/nukestudio/publish/collect_hierarchy_context.py +++ b/pype/plugins/nukestudio/publish/collect_hierarchy_context.py @@ -273,6 +273,8 @@ def process(self, context): instance.data["clipOut"] - instance.data["clipIn"]) + + self.log.debug( "__ instance.data[parents]: {}".format( instance.data["parents"] @@ -317,7 +319,6 @@ def process(self, context): }) in_info['tasks'] = instance.data['tasks'] - in_info["comments"] = instance.data.get("comments", []) parents = instance.data.get('parents', []) self.log.debug("__ in_info: {}".format(in_info)) diff --git a/pype/plugins/nukestudio/publish/collect_shots.py b/pype/plugins/nukestudio/publish/collect_shots.py index 70551671438..543a96fcbad 100644 --- a/pype/plugins/nukestudio/publish/collect_shots.py +++ b/pype/plugins/nukestudio/publish/collect_shots.py @@ -40,13 +40,13 @@ def process(self, instance): data["name"] = data["subset"] + "_" + data["asset"] data["label"] = ( - "{} - {} - tasks: {} - assetbuilds: {} - comments: {}".format( + "{} - {} - tasks:{} - assetbuilds:{} - comments:{}".format( data["asset"], data["subset"], - data["tasks"], + data["tasks"].keys(), [x["name"] for x in data.get("assetbuilds", [])], - len(data.get("comments", [])) - ) + len(data["comments"]) + ) ) # Create instance. diff --git a/pype/plugins/nukestudio/publish/collect_tag_comments.py b/pype/plugins/nukestudio/publish/collect_tag_comments.py index e14e53d4393..1ec98e3d3bb 100644 --- a/pype/plugins/nukestudio/publish/collect_tag_comments.py +++ b/pype/plugins/nukestudio/publish/collect_tag_comments.py @@ -17,7 +17,7 @@ def process(self, instance): for tag in instance.data["tags"]: if tag["name"].lower() == "comment": instance.data["comments"].append( - tag["metadata"]["tag.note"] + tag.metadata().dict()["tag.note"] ) # Find tags on the source clip. diff --git a/pype/plugins/photoshop/create/create_image.py b/pype/plugins/photoshop/create/create_image.py index c1a7d92a2c1..5b2f9f7981d 100644 --- a/pype/plugins/photoshop/create/create_image.py +++ b/pype/plugins/photoshop/create/create_image.py @@ -1,6 +1,5 @@ -from avalon import api +from avalon import api, photoshop from avalon.vendor import Qt -from avalon import photoshop class CreateImage(api.Creator): @@ -14,12 +13,11 @@ def process(self): groups = [] layers = [] create_group = False - - stub = photoshop.stub() + group_constant = photoshop.get_com_objects().constants().psLayerSet if (self.options or {}).get("useSelection"): multiple_instances = False - selection = stub.get_selected_layers() - self.log.info("selection {}".format(selection)) + selection = photoshop.get_selected_layers() + if len(selection) > 1: # Ask user whether to create one image or image per selected # item. @@ -42,18 +40,19 @@ def process(self): if multiple_instances: for item in selection: - if item.group: + if item.LayerType == group_constant: groups.append(item) else: layers.append(item) else: - group = stub.group_selected_layers(self.name) + group = photoshop.group_selected_layers() + group.Name = self.name groups.append(group) elif len(selection) == 1: # One selected item. Use group if its a LayerSet (group), else # create a new group. - if selection[0].group: + if selection[0].LayerType == group_constant: groups.append(selection[0]) else: layers.append(selection[0]) @@ -64,14 +63,16 @@ def process(self): create_group = True if create_group: - group = stub.create_group(self.name) + group = photoshop.app().ActiveDocument.LayerSets.Add() + group.Name = self.name groups.append(group) for layer in layers: - stub.select_layers([layer]) - group = stub.group_selected_layers(layer.name) + photoshop.select_layers([layer]) + group = photoshop.group_selected_layers() + group.Name = layer.Name groups.append(group) for group in groups: - self.data.update({"subset": "image" + group.name}) - stub.imprint(group, self.data) + self.data.update({"subset": "image" + group.Name}) + photoshop.imprint(group, self.data) diff --git a/pype/plugins/photoshop/load/load_image.py b/pype/plugins/photoshop/load/load_image.py index 75c02bb3276..18efe750d59 100644 --- a/pype/plugins/photoshop/load/load_image.py +++ b/pype/plugins/photoshop/load/load_image.py @@ -1,7 +1,5 @@ from avalon import api, photoshop -stub = photoshop.stub() - class ImageLoader(api.Loader): """Load images @@ -14,7 +12,7 @@ class ImageLoader(api.Loader): def load(self, context, name=None, namespace=None, data=None): with photoshop.maintained_selection(): - layer = stub.import_smart_object(self.fname) + layer = photoshop.import_smart_object(self.fname) self[:] = [layer] @@ -30,11 +28,11 @@ def update(self, container, representation): layer = container.pop("layer") with photoshop.maintained_selection(): - stub.replace_smart_object( + photoshop.replace_smart_object( layer, api.get_representation_path(representation) ) - stub.imprint( + photoshop.imprint( layer, {"representation": str(representation["_id"])} ) diff --git a/pype/plugins/photoshop/publish/collect_current_file.py b/pype/plugins/photoshop/publish/collect_current_file.py index 3cc3e3f636c..4308588559d 100644 --- a/pype/plugins/photoshop/publish/collect_current_file.py +++ b/pype/plugins/photoshop/publish/collect_current_file.py @@ -1,7 +1,6 @@ import os import pyblish.api - from avalon import photoshop @@ -14,5 +13,5 @@ class CollectCurrentFile(pyblish.api.ContextPlugin): def process(self, context): context.data["currentFile"] = os.path.normpath( - photoshop.stub().get_active_document_full_name() + photoshop.app().ActiveDocument.FullName ).replace("\\", "/") diff --git a/pype/plugins/photoshop/publish/collect_instances.py b/pype/plugins/photoshop/publish/collect_instances.py index 81d1c80bf6b..4937f2a1e42 100644 --- a/pype/plugins/photoshop/publish/collect_instances.py +++ b/pype/plugins/photoshop/publish/collect_instances.py @@ -1,9 +1,9 @@ import pythoncom -import pyblish.api - from avalon import photoshop +import pyblish.api + class CollectInstances(pyblish.api.ContextPlugin): """Gather instances by LayerSet and file metadata @@ -27,11 +27,8 @@ def process(self, context): # can be. pythoncom.CoInitialize() - stub = photoshop.stub() - layers = stub.get_layers() - layers_meta = stub.get_layers_metadata() - for layer in layers: - layer_data = stub.read(layer, layers_meta) + for layer in photoshop.get_layers_in_document(): + layer_data = photoshop.read(layer) # Skip layers without metadata. if layer_data is None: @@ -41,19 +38,18 @@ def process(self, context): if "container" in layer_data["id"]: continue - # child_layers = [*layer.Layers] - # self.log.debug("child_layers {}".format(child_layers)) - # if not child_layers: - # self.log.info("%s skipped, it was empty." % layer.Name) - # continue + child_layers = [*layer.Layers] + if not child_layers: + self.log.info("%s skipped, it was empty." % layer.Name) + continue - instance = context.create_instance(layer.name) + instance = context.create_instance(layer.Name) instance.append(layer) instance.data.update(layer_data) instance.data["families"] = self.families_mapping[ layer_data["family"] ] - instance.data["publish"] = layer.visible + instance.data["publish"] = layer.Visible # Produce diagnostic message for any graphical # user interface interested in visualising it. diff --git a/pype/plugins/photoshop/publish/extract_image.py b/pype/plugins/photoshop/publish/extract_image.py index 38920b5557e..6dfccdc4f24 100644 --- a/pype/plugins/photoshop/publish/extract_image.py +++ b/pype/plugins/photoshop/publish/extract_image.py @@ -21,37 +21,35 @@ def process(self, instance): self.log.info("Outputting image to {}".format(staging_dir)) # Perform extraction - stub = photoshop.stub() files = {} with photoshop.maintained_selection(): self.log.info("Extracting %s" % str(list(instance))) with photoshop.maintained_visibility(): # Hide all other layers. - extract_ids = set([ll.id for ll in stub. - get_layers_in_layers([instance[0]])]) + extract_ids = [ + x.id for x in photoshop.get_layers_in_layers([instance[0]]) + ] + for layer in photoshop.get_layers_in_document(): + if layer.id not in extract_ids: + layer.Visible = False - for layer in stub.get_layers(): - # limit unnecessary calls to client - if layer.visible and layer.id not in extract_ids: - stub.set_visible(layer.id, False) - if not layer.visible and layer.id in extract_ids: - stub.set_visible(layer.id, True) - - save_options = [] + save_options = {} if "png" in self.formats: - save_options.append('png') + save_options["png"] = photoshop.com_objects.PNGSaveOptions() if "jpg" in self.formats: - save_options.append('jpg') + save_options["jpg"] = photoshop.com_objects.JPEGSaveOptions() file_basename = os.path.splitext( - stub.get_active_document_name() + photoshop.app().ActiveDocument.Name )[0] - for extension in save_options: + for extension, save_option in save_options.items(): _filename = "{}.{}".format(file_basename, extension) files[extension] = _filename full_filename = os.path.join(staging_dir, _filename) - stub.saveAs(full_filename, extension, True) + photoshop.app().ActiveDocument.SaveAs( + full_filename, save_option, True + ) representations = [] for extension, filename in files.items(): diff --git a/pype/plugins/photoshop/publish/extract_review.py b/pype/plugins/photoshop/publish/extract_review.py index 6fb50bba9f2..078ee53899a 100644 --- a/pype/plugins/photoshop/publish/extract_review.py +++ b/pype/plugins/photoshop/publish/extract_review.py @@ -13,11 +13,10 @@ class ExtractReview(pype.api.Extractor): families = ["review"] def process(self, instance): + staging_dir = self.staging_dir(instance) self.log.info("Outputting image to {}".format(staging_dir)) - stub = photoshop.stub() - layers = [] for image_instance in instance.context: if image_instance.data["family"] != "image": @@ -26,22 +25,25 @@ def process(self, instance): # Perform extraction output_image = "{}.jpg".format( - os.path.splitext(stub.get_active_document_name())[0] + os.path.splitext(photoshop.app().ActiveDocument.Name)[0] ) output_image_path = os.path.join(staging_dir, output_image) with photoshop.maintained_visibility(): # Hide all other layers. - extract_ids = set([ll.id for ll in stub. - get_layers_in_layers(layers)]) - self.log.info("extract_ids {}".format(extract_ids)) - for layer in stub.get_layers(): - # limit unnecessary calls to client - if layer.visible and layer.id not in extract_ids: - stub.set_visible(layer.id, False) - if not layer.visible and layer.id in extract_ids: - stub.set_visible(layer.id, True) - - stub.saveAs(output_image_path, 'jpg', True) + extract_ids = [ + x.id for x in photoshop.get_layers_in_layers(layers) + ] + for layer in photoshop.get_layers_in_document(): + if layer.id in extract_ids: + layer.Visible = True + else: + layer.Visible = False + + photoshop.app().ActiveDocument.SaveAs( + output_image_path, + photoshop.com_objects.JPEGSaveOptions(), + True + ) ffmpeg_path = pype.lib.get_ffmpeg_tool_path("ffmpeg") @@ -64,6 +66,8 @@ def process(self, instance): ] output = pype.lib._subprocess(args) + self.log.debug(output) + instance.data["representations"].append({ "name": "thumbnail", "ext": "jpg", @@ -71,6 +75,7 @@ def process(self, instance): "stagingDir": staging_dir, "tags": ["thumbnail"] }) + # Generate mov. mov_path = os.path.join(staging_dir, "review.mov") args = [ @@ -81,7 +86,9 @@ def process(self, instance): mov_path ] output = pype.lib._subprocess(args) + self.log.debug(output) + instance.data["representations"].append({ "name": "mov", "ext": "mov", diff --git a/pype/plugins/photoshop/publish/extract_save_scene.py b/pype/plugins/photoshop/publish/extract_save_scene.py index 63a4b7b7eaa..b3d4f0e447b 100644 --- a/pype/plugins/photoshop/publish/extract_save_scene.py +++ b/pype/plugins/photoshop/publish/extract_save_scene.py @@ -11,4 +11,4 @@ class ExtractSaveScene(pype.api.Extractor): families = ["workfile"] def process(self, instance): - photoshop.stub().save() + photoshop.app().ActiveDocument.Save() diff --git a/pype/plugins/photoshop/publish/increment_workfile.py b/pype/plugins/photoshop/publish/increment_workfile.py index eca2583595c..ba9ab8606ae 100644 --- a/pype/plugins/photoshop/publish/increment_workfile.py +++ b/pype/plugins/photoshop/publish/increment_workfile.py @@ -1,7 +1,6 @@ import pyblish.api from pype.action import get_errored_plugins_from_data from pype.lib import version_up - from avalon import photoshop @@ -25,6 +24,6 @@ def process(self, instance): ) scene_path = version_up(instance.context.data["currentFile"]) - photoshop.stub().saveAs(scene_path, 'psd', True) + photoshop.app().ActiveDocument.SaveAs(scene_path) self.log.info("Incremented workfile to: {}".format(scene_path)) diff --git a/pype/plugins/photoshop/publish/validate_instance_asset.py b/pype/plugins/photoshop/publish/validate_instance_asset.py index f05d9601dd3..ab1d02269f8 100644 --- a/pype/plugins/photoshop/publish/validate_instance_asset.py +++ b/pype/plugins/photoshop/publish/validate_instance_asset.py @@ -23,12 +23,11 @@ def process(self, context, plugin): # Apply pyblish.logic to get the instances for the plug-in instances = pyblish.api.instances_by_plugin(failed, plugin) - stub = photoshop.stub() - for instance in instances: - data = stub.read(instance[0]) + for instance in instances: + data = photoshop.read(instance[0]) data["asset"] = os.environ["AVALON_ASSET"] - stub.imprint(instance[0], data) + photoshop.imprint(instance[0], data) class ValidateInstanceAsset(pyblish.api.InstancePlugin): diff --git a/pype/plugins/photoshop/publish/validate_naming.py b/pype/plugins/photoshop/publish/validate_naming.py index 2483adcb5e6..51e00da3520 100644 --- a/pype/plugins/photoshop/publish/validate_naming.py +++ b/pype/plugins/photoshop/publish/validate_naming.py @@ -21,14 +21,13 @@ def process(self, context, plugin): # Apply pyblish.logic to get the instances for the plug-in instances = pyblish.api.instances_by_plugin(failed, plugin) - stub = photoshop.stub() + for instance in instances: - self.log.info("validate_naming instance {}".format(instance)) name = instance.data["name"].replace(" ", "_") instance[0].Name = name - data = stub.read(instance[0]) + data = photoshop.read(instance[0]) data["subset"] = "image" + name - stub.imprint(instance[0], data) + photoshop.imprint(instance[0], data) return True diff --git a/pype/plugins/standalonepublisher/publish/collect_context.py b/pype/plugins/standalonepublisher/publish/collect_context.py index 9dbeec93fbd..a5479fdf131 100644 --- a/pype/plugins/standalonepublisher/publish/collect_context.py +++ b/pype/plugins/standalonepublisher/publish/collect_context.py @@ -123,7 +123,7 @@ def create_instance(self, context, in_data): "label": subset, "name": subset, "family": in_data["family"], - # "version": in_data.get("version", 1), + "version": in_data.get("version", 1), "frameStart": in_data.get("representations", [None])[0].get( "frameStart", None ), diff --git a/pype/plugins/standalonepublisher/publish/collect_editorial.py b/pype/plugins/standalonepublisher/publish/collect_editorial.py index 5e6fd106e40..a31125d9a8e 100644 --- a/pype/plugins/standalonepublisher/publish/collect_editorial.py +++ b/pype/plugins/standalonepublisher/publish/collect_editorial.py @@ -32,7 +32,7 @@ class CollectEditorial(pyblish.api.InstancePlugin): actions = [] # presets - extensions = [".mov", ".mp4"] + extensions = [".mov"] def process(self, instance): # remove context test attribute diff --git a/pype/plugins/standalonepublisher/publish/collect_psd_instances.py b/pype/plugins/standalonepublisher/publish/collect_psd_instances.py index b5db4374738..9c8e2eae83a 100644 --- a/pype/plugins/standalonepublisher/publish/collect_psd_instances.py +++ b/pype/plugins/standalonepublisher/publish/collect_psd_instances.py @@ -9,7 +9,7 @@ class CollectPsdInstances(pyblish.api.InstancePlugin): """ label = "Collect Psd Instances" - order = pyblish.api.CollectorOrder + 0.489 + order = pyblish.api.CollectorOrder + 0.492 hosts = ["standalonepublisher"] families = ["background_batch"] @@ -34,6 +34,8 @@ def process(self, instance): context = instance.context asset_data = instance.data["assetEntity"] asset_name = instance.data["asset"] + anatomy_data = instance.data["anatomyData"] + for subset_name, subset_data in self.subsets.items(): instance_name = f"{asset_name}_{subset_name}" task = subset_data.get("task", "background") @@ -53,8 +55,16 @@ def process(self, instance): new_instance.data["label"] = f"{instance_name}" new_instance.data["subset"] = subset_name - new_instance.data["task"] = task + # fix anatomy data + anatomy_data_new = copy.deepcopy(anatomy_data) + # updating hierarchy data + anatomy_data_new.update({ + "asset": asset_data["name"], + "task": task, + "subset": subset_name + }) + new_instance.data["anatomyData"] = anatomy_data_new if subset_name in self.unchecked_by_default: new_instance.data["publish"] = False diff --git a/pype/resources/app_icons/maya.png b/pype/resources/app_icons/maya.png index 95c605f50d6..e84a6a3742f 100644 Binary files a/pype/resources/app_icons/maya.png and b/pype/resources/app_icons/maya.png differ diff --git a/pype/settings/__init__.py b/pype/settings/__init__.py deleted file mode 100644 index 7e73d541a4a..00000000000 --- a/pype/settings/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -from .lib import ( - system_settings, - project_settings -) - -__all__ = ( - "system_settings", - "project_settings" -) diff --git a/pype/settings/defaults/project_anatomy/colorspace.json b/pype/settings/defaults/project_anatomy/colorspace.json deleted file mode 100644 index 8b934f810d2..00000000000 --- a/pype/settings/defaults/project_anatomy/colorspace.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "nuke": { - "root": { - "colorManagement": "Nuke", - "OCIO_config": "nuke-default", - "defaultViewerLUT": "Nuke Root LUTs", - "monitorLut": "sRGB", - "int8Lut": "sRGB", - "int16Lut": "sRGB", - "logLut": "Cineon", - "floatLut": "linear" - }, - "viewer": { - "viewerProcess": "sRGB" - }, - "write": { - "render": { - "colorspace": "linear" - }, - "prerender": { - "colorspace": "linear" - }, - "still": { - "colorspace": "sRGB" - } - }, - "read": { - "[^-a-zA-Z0-9]beauty[^-a-zA-Z0-9]": "linear", - "[^-a-zA-Z0-9](P|N|Z|crypto)[^-a-zA-Z0-9]": "linear", - "[^-a-zA-Z0-9](plateRef)[^-a-zA-Z0-9]": "sRGB" - } - }, - "maya": { - - }, - "houdini": { - - }, - "resolve": { - - } -} diff --git a/pype/settings/defaults/project_anatomy/dataflow.json b/pype/settings/defaults/project_anatomy/dataflow.json deleted file mode 100644 index d2f470b5bcd..00000000000 --- a/pype/settings/defaults/project_anatomy/dataflow.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "nuke": { - "nodes": { - "connected": true, - "modifymetadata": { - "_id": "connect_metadata", - "_previous": "ENDING", - "metadata.set.pype_studio_name": "{PYPE_STUDIO_NAME}", - "metadata.set.avalon_project_name": "{AVALON_PROJECT}", - "metadata.set.avalon_project_code": "{PYPE_STUDIO_CODE}", - "metadata.set.avalon_asset_name": "{AVALON_ASSET}" - }, - "crop": { - "_id": "connect_crop", - "_previous": "connect_metadata", - "box": [ - "{metadata.crop.x}", - "{metadata.crop.y}", - "{metadata.crop.right}", - "{metadata.crop.top}" - ] - }, - "write": { - "render": { - "_id": "output_write", - "_previous": "connect_crop", - "file_type": "exr", - "datatype": "16 bit half", - "compression": "Zip (1 scanline)", - "autocrop": true, - "tile_color": "0xff0000ff", - "channels": "rgb" - }, - "prerender": { - "_id": "output_write", - "_previous": "connect_crop", - "file_type": "exr", - "datatype": "16 bit half", - "compression": "Zip (1 scanline)", - "autocrop": false, - "tile_color": "0xc9892aff", - "channels": "rgba" - }, - "still": { - "_previous": "connect_crop", - "channels": "rgba", - "file_type": "tiff", - "datatype": "16 bit", - "compression": "LZW", - "tile_color": "0x4145afff" - } - } - } - } -} diff --git a/pype/settings/defaults/project_anatomy/roots.json b/pype/settings/defaults/project_anatomy/roots.json deleted file mode 100644 index 0282471a608..00000000000 --- a/pype/settings/defaults/project_anatomy/roots.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "windows": "C:/projects", - "linux": "/mnt/share/projects", - "darwin": "/Volumes/path" -} diff --git a/pype/settings/defaults/project_anatomy/templates.json b/pype/settings/defaults/project_anatomy/templates.json deleted file mode 100644 index 0fff0265b35..00000000000 --- a/pype/settings/defaults/project_anatomy/templates.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "version_padding": 3, - "version": "v{version:0>{@version_padding}}", - "frame_padding": 4, - "frame": "{frame:0>{@frame_padding}}", - "work": { - "folder": "{root}/{project[name]}/{hierarchy}/{asset}/work/{task}", - "file": "{project[code]}_{asset}_{task}_{@version}<_{comment}>.{ext}", - "path": "{@folder}/{@file}" - }, - "render": { - "folder": "{root}/{project[name]}/{hierarchy}/{asset}/publish/render/{subset}/{@version}", - "file": "{project[code]}_{asset}_{subset}_{@version}<_{output}><.{@frame}>.{representation}", - "path": "{@folder}/{@file}" - }, - "texture": { - "path": "{root}/{project[name]}/{hierarchy}/{asset}/publish/{family}/{subset}" - }, - "publish": { - "folder": "{root}/{project[name]}/{hierarchy}/{asset}/publish/{family}/{subset}/{@version}", - "file": "{project[code]}_{asset}_{subset}_{@version}<_{output}><.{@frame}>.{representation}", - "path": "{@folder}/{@file}", - "thumbnail": "{thumbnail_root}/{project[name]}/{_id}_{thumbnail_type}{ext}" - }, - "master": { - "folder": "{root}/{project[name]}/{hierarchy}/{asset}/publish/{family}/{subset}/master", - "file": "{project[code]}_{asset}_{subset}_master<_{output}><.{frame}>.{representation}", - "path": "{@folder}/{@file}" - } -} \ No newline at end of file diff --git a/pype/settings/defaults/project_settings/ftrack/ftrack_config.json b/pype/settings/defaults/project_settings/ftrack/ftrack_config.json deleted file mode 100644 index 1ef3a9d69f9..00000000000 --- a/pype/settings/defaults/project_settings/ftrack/ftrack_config.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "sync_to_avalon": { - "statuses_name_change": ["not ready", "ready"] - }, - - "status_update": { - "_ignore_": ["in progress", "ommited", "on hold"], - "Ready": ["not ready"], - "In Progress" : ["_any_"] - }, - "status_version_to_task": { - "__description__": "Status `from` (key) must be lowered!", - "in progress": "in progress", - "approved": "approved" - } -} diff --git a/pype/settings/defaults/project_settings/ftrack/ftrack_custom_attributes.json b/pype/settings/defaults/project_settings/ftrack/ftrack_custom_attributes.json deleted file mode 100644 index f03d473cd0b..00000000000 --- a/pype/settings/defaults/project_settings/ftrack/ftrack_custom_attributes.json +++ /dev/null @@ -1,165 +0,0 @@ -[{ - "label": "FPS", - "key": "fps", - "type": "number", - "is_hierarchical": true, - "group": "avalon", - "write_security_role": ["ALL"], - "read_security_role": ["ALL"], - "default": null, - "config": { - "isdecimal": true - } -}, { - "label": "Applications", - "key": "applications", - "type": "enumerator", - "entity_type": "show", - "group": "avalon", - "config": { - "multiselect": true, - "data": [ - {"blender_2.80": "Blender 2.80"}, - {"blender_2.81": "Blender 2.81"}, - {"blender_2.82": "Blender 2.82"}, - {"blender_2.83": "Blender 2.83"}, - {"celaction_local": "CelAction2D Local"}, - {"maya_2017": "Maya 2017"}, - {"maya_2018": "Maya 2018"}, - {"maya_2019": "Maya 2019"}, - {"nuke_10.0": "Nuke 10.0"}, - {"nuke_11.2": "Nuke 11.2"}, - {"nuke_11.3": "Nuke 11.3"}, - {"nuke_12.0": "Nuke 12.0"}, - {"nukex_10.0": "NukeX 10.0"}, - {"nukex_11.2": "NukeX 11.2"}, - {"nukex_11.3": "NukeX 11.3"}, - {"nukex_12.0": "NukeX 12.0"}, - {"nukestudio_10.0": "NukeStudio 10.0"}, - {"nukestudio_11.2": "NukeStudio 11.2"}, - {"nukestudio_11.3": "NukeStudio 11.3"}, - {"nukestudio_12.0": "NukeStudio 12.0"}, - {"harmony_17": "Harmony 17"}, - {"houdini_16.5": "Houdini 16.5"}, - {"houdini_17": "Houdini 17"}, - {"houdini_18": "Houdini 18"}, - {"photoshop_2020": "Photoshop 2020"}, - {"python_3": "Python 3"}, - {"python_2": "Python 2"}, - {"premiere_2019": "Premiere Pro 2019"}, - {"premiere_2020": "Premiere Pro 2020"}, - {"resolve_16": "BM DaVinci Resolve 16"} - ] - } -}, { - "label": "Avalon auto-sync", - "key": "avalon_auto_sync", - "type": "boolean", - "entity_type": "show", - "group": "avalon", - "write_security_role": ["API", "Administrator"], - "read_security_role": ["API", "Administrator"] -}, { - "label": "Intent", - "key": "intent", - "type": "enumerator", - "entity_type": "assetversion", - "group": "avalon", - "config": { - "multiselect": false, - "data": [ - {"test": "Test"}, - {"wip": "WIP"}, - {"final": "Final"} - ] - } -}, { - "label": "Library Project", - "key": "library_project", - "type": "boolean", - "entity_type": "show", - "group": "avalon", - "write_security_role": ["API", "Administrator"], - "read_security_role": ["API", "Administrator"] -}, { - "label": "Clip in", - "key": "clipIn", - "type": "number", - "is_hierarchical": true, - "group": "avalon", - "default": null -}, { - "label": "Clip out", - "key": "clipOut", - "type": "number", - "is_hierarchical": true, - "group": "avalon", - "default": null -}, { - "label": "Frame start", - "key": "frameStart", - "type": "number", - "is_hierarchical": true, - "group": "avalon", - "default": null -}, { - "label": "Frame end", - "key": "frameEnd", - "type": "number", - "is_hierarchical": true, - "group": "avalon", - "default": null -}, { - "label": "Tools", - "key": "tools_env", - "type": "enumerator", - "is_hierarchical": true, - "group": "avalon", - "config": { - "multiselect": true, - "data": [ - {"mtoa_3.0.1": "mtoa_3.0.1"}, - {"mtoa_3.1.1": "mtoa_3.1.1"}, - {"mtoa_3.2.0": "mtoa_3.2.0"}, - {"yeti_2.1.2": "yeti_2.1"} - ] - } -}, { - "label": "Resolution Width", - "key": "resolutionWidth", - "type": "number", - "is_hierarchical": true, - "group": "avalon", - "default": null -}, { - "label": "Resolution Height", - "key": "resolutionHeight", - "type": "number", - "is_hierarchical": true, - "group": "avalon", - "default": null -}, { - "label": "Pixel aspect", - "key": "pixelAspect", - "type": "number", - "is_hierarchical": true, - "group": "avalon", - "config": { - "isdecimal": true - } -}, { - "label": "Frame handles start", - "key": "handleStart", - "type": "number", - "is_hierarchical": true, - "group": "avalon", - "default": null -}, { - "label": "Frame handles end", - "key": "handleEnd", - "type": "number", - "is_hierarchical": true, - "group": "avalon", - "default": null -} -] diff --git a/pype/settings/defaults/project_settings/ftrack/partnership_ftrack_cred.json b/pype/settings/defaults/project_settings/ftrack/partnership_ftrack_cred.json deleted file mode 100644 index 6b3a32f1819..00000000000 --- a/pype/settings/defaults/project_settings/ftrack/partnership_ftrack_cred.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "server_url": "", - "api_key": "", - "api_user": "" -} diff --git a/pype/settings/defaults/project_settings/ftrack/plugins/server.json b/pype/settings/defaults/project_settings/ftrack/plugins/server.json deleted file mode 100644 index 0967ef424bc..00000000000 --- a/pype/settings/defaults/project_settings/ftrack/plugins/server.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/pype/settings/defaults/project_settings/ftrack/plugins/user.json b/pype/settings/defaults/project_settings/ftrack/plugins/user.json deleted file mode 100644 index 1ba8e9b5111..00000000000 --- a/pype/settings/defaults/project_settings/ftrack/plugins/user.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "TestAction": { - "ignore_me": true - } -} diff --git a/pype/settings/defaults/project_settings/ftrack/project_defaults.json b/pype/settings/defaults/project_settings/ftrack/project_defaults.json deleted file mode 100644 index a4e3aa33620..00000000000 --- a/pype/settings/defaults/project_settings/ftrack/project_defaults.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "fps": 25, - "frameStart": 1001, - "frameEnd": 1100, - "clipIn": 1001, - "clipOut": 1100, - "handleStart": 10, - "handleEnd": 10, - - "resolutionHeight": 1080, - "resolutionWidth": 1920, - "pixelAspect": 1.0, - "applications": [ - "maya_2019", "nuke_11.3", "nukex_11.3", "nukestudio_11.3", "deadline" - ], - "tools_env": [], - "avalon_auto_sync": true -} diff --git a/pype/settings/defaults/project_settings/global/creator.json b/pype/settings/defaults/project_settings/global/creator.json deleted file mode 100644 index d14e779f01f..00000000000 --- a/pype/settings/defaults/project_settings/global/creator.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Model": ["model"], - "Render Globals": ["light", "render"], - "Layout": ["layout"], - "Set Dress": ["setdress"], - "Look": ["look"], - "Rig": ["rigging"] -} diff --git a/pype/settings/defaults/project_settings/global/project_folder_structure.json b/pype/settings/defaults/project_settings/global/project_folder_structure.json deleted file mode 100644 index 83bd5f12a99..00000000000 --- a/pype/settings/defaults/project_settings/global/project_folder_structure.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "__project_root__": { - "prod" : {}, - "resources" : { - "footage": { - "plates": {}, - "offline": {} - }, - "audio": {}, - "art_dept": {} - }, - "editorial" : {}, - "assets[ftrack.Library]": { - "characters[ftrack]": {}, - "locations[ftrack]": {} - }, - "shots[ftrack.Sequence]": { - "scripts": {}, - "editorial[ftrack.Folder]": {} - } - } -} diff --git a/pype/settings/defaults/project_settings/global/sw_folders.json b/pype/settings/defaults/project_settings/global/sw_folders.json deleted file mode 100644 index a154935dced..00000000000 --- a/pype/settings/defaults/project_settings/global/sw_folders.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "compositing": ["nuke", "ae"], - "modeling": ["maya", "app2"], - "lookdev": ["substance"], - "animation": [], - "lighting": [], - "rigging": [] -} diff --git a/pype/settings/defaults/project_settings/global/workfiles.json b/pype/settings/defaults/project_settings/global/workfiles.json deleted file mode 100644 index 393b2e3c105..00000000000 --- a/pype/settings/defaults/project_settings/global/workfiles.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "last_workfile_on_startup": [ - { - "enabled": false - } - ] -} diff --git a/pype/settings/defaults/project_settings/maya/capture.json b/pype/settings/defaults/project_settings/maya/capture.json deleted file mode 100644 index b6c48930346..00000000000 --- a/pype/settings/defaults/project_settings/maya/capture.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "Codec": { - "compression": "jpg", - "format": "image", - "quality": 95 - }, - "Display Options": { - "background": [ - 0.7137254901960784, - 0.7137254901960784, - 0.7137254901960784 - ], - "backgroundBottom": [ - 0.7137254901960784, - 0.7137254901960784, - 0.7137254901960784 - ], - "backgroundTop": [ - 0.7137254901960784, - 0.7137254901960784, - 0.7137254901960784 - ], - "override_display": true - }, - "Generic": { - "isolate_view": true, - "off_screen": true - }, - "IO": { - "name": "", - "open_finished": false, - "raw_frame_numbers": false, - "recent_playblasts": [], - "save_file": false - }, - "PanZoom": { - "pan_zoom": true - }, - "Renderer": { - "rendererName": "vp2Renderer" - }, - "Resolution": { - "height": 1080, - "mode": "Custom", - "percent": 1.0, - "width": 1920 - }, - "Time Range": { - "end_frame": 25, - "frame": "", - "start_frame": 0, - "time": "Time Slider" - }, - "Viewport Options": { - "cameras": false, - "clipGhosts": false, - "controlVertices": false, - "deformers": false, - "dimensions": false, - "displayLights": 0, - "dynamicConstraints": false, - "dynamics": false, - "fluids": false, - "follicles": false, - "gpuCacheDisplayFilter": false, - "greasePencils": false, - "grid": false, - "hairSystems": false, - "handles": false, - "high_quality": true, - "hud": false, - "hulls": false, - "ikHandles": false, - "imagePlane": false, - "joints": false, - "lights": false, - "locators": false, - "manipulators": false, - "motionTrails": false, - "nCloths": false, - "nParticles": false, - "nRigids": false, - "nurbsCurves": false, - "nurbsSurfaces": false, - "override_viewport_options": true, - "particleInstancers": false, - "pivots": false, - "planes": false, - "pluginShapes": false, - "polymeshes": true, - "shadows": false, - "strokes": false, - "subdivSurfaces": false, - "textures": false, - "twoSidedLighting": true - }, - "Camera Options": { - "displayGateMask": false, - "displayResolution": false, - "displayFilmGate": false, - "displayFieldChart": false, - "displaySafeAction": false, - "displaySafeTitle": false, - "displayFilmPivot": false, - "displayFilmOrigin": false, - "overscan": 1.0 - } -} diff --git a/pype/settings/defaults/project_settings/muster/templates_mapping.json b/pype/settings/defaults/project_settings/muster/templates_mapping.json deleted file mode 100644 index 4edab9077dc..00000000000 --- a/pype/settings/defaults/project_settings/muster/templates_mapping.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "3delight": 41, - "arnold": 46, - "arnold_sf": 57, - "gelato": 30, - "harware": 3, - "krakatoa": 51, - "file_layers": 7, - "mentalray": 2, - "mentalray_sf": 6, - "redshift": 55, - "renderman": 29, - "software": 1, - "software_sf": 5, - "turtle": 10, - "vector": 4, - "vray": 37, - "ffmpeg": 48 -} diff --git a/pype/settings/defaults/project_settings/plugins/celaction/publish.json b/pype/settings/defaults/project_settings/plugins/celaction/publish.json deleted file mode 100644 index fd1af23d843..00000000000 --- a/pype/settings/defaults/project_settings/plugins/celaction/publish.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "ExtractCelactionDeadline": { - "enabled": true, - "deadline_department": "", - "deadline_priority": 50, - "deadline_pool": "", - "deadline_pool_secondary": "", - "deadline_group": "", - "deadline_chunk_size": 10 - } -} \ No newline at end of file diff --git a/pype/settings/defaults/project_settings/plugins/config.json b/pype/settings/defaults/project_settings/plugins/config.json deleted file mode 100644 index 9e26dfeeb6e..00000000000 --- a/pype/settings/defaults/project_settings/plugins/config.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/pype/settings/defaults/project_settings/plugins/ftrack/publish.json b/pype/settings/defaults/project_settings/plugins/ftrack/publish.json deleted file mode 100644 index d8d93a36eee..00000000000 --- a/pype/settings/defaults/project_settings/plugins/ftrack/publish.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "IntegrateFtrackNote": { - "enabled": false, - "note_with_intent_template": "{intent}: {comment}", - "note_labels": [] - } -} \ No newline at end of file diff --git a/pype/settings/defaults/project_settings/plugins/global/create.json b/pype/settings/defaults/project_settings/plugins/global/create.json deleted file mode 100644 index 0967ef424bc..00000000000 --- a/pype/settings/defaults/project_settings/plugins/global/create.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/pype/settings/defaults/project_settings/plugins/global/filter.json b/pype/settings/defaults/project_settings/plugins/global/filter.json deleted file mode 100644 index 0967ef424bc..00000000000 --- a/pype/settings/defaults/project_settings/plugins/global/filter.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/pype/settings/defaults/project_settings/plugins/global/load.json b/pype/settings/defaults/project_settings/plugins/global/load.json deleted file mode 100644 index 0967ef424bc..00000000000 --- a/pype/settings/defaults/project_settings/plugins/global/load.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/pype/settings/defaults/project_settings/plugins/global/publish.json b/pype/settings/defaults/project_settings/plugins/global/publish.json deleted file mode 100644 index 0a7f6fbf3d3..00000000000 --- a/pype/settings/defaults/project_settings/plugins/global/publish.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "IntegrateMasterVersion": { - "enabled": false - }, - "ExtractJpegEXR": { - "enabled": true, - "ffmpeg_args": { - "input": [ - "-gamma 2.2" - ], - "output": [] - } - }, - "ExtractReview": { - "enabled": true, - "profiles": [ - { - "families": [], - "hosts": [], - "outputs": { - "h264": { - "ext": "mp4", - "tags": [ - "burnin", - "ftrackreview" - ], - "ffmpeg_args": { - "video_filters": [], - "audio_filters": [], - "input": [ - "-gamma 2.2" - ], - "output": [ - "-pix_fmt yuv420p", - "-crf 18", - "-intra" - ] - }, - "filter": { - "families": [ - "render", - "review", - "ftrack" - ] - } - } - } - } - ] - }, - "ExtractBurnin": { - "enabled": false, - "options": { - "font_size": 42, - "opacity": 1, - "bg_opacity": 0, - "x_offset": 5, - "y_offset": 5, - "bg_padding": 5 - }, - "fields": {}, - "profiles": [ - { - "burnins": { - "burnin": { - "TOP_LEFT": "{yy}-{mm}-{dd}", - "TOP_RIGHT": "{anatomy[version]}", - "TOP_CENTERED": "", - "BOTTOM_RIGHT": "{frame_start}-{current_frame}-{frame_end}", - "BOTTOM_CENTERED": "{asset}", - "BOTTOM_LEFT": "{username}" - } - } - } - ] - }, - "IntegrateAssetNew": { - "template_name_profiles": { - "publish": { - "families": [], - "tasks": [] - }, - "render": { - "families": [ - "review", - "render", - "prerender" - ] - } - } - }, - "ProcessSubmittedJobOnFarm": { - "enabled": false, - "deadline_department": "", - "deadline_pool": "", - "deadline_group": "" - } -} \ No newline at end of file diff --git a/pype/settings/defaults/project_settings/plugins/maya/create.json b/pype/settings/defaults/project_settings/plugins/maya/create.json deleted file mode 100644 index 0967ef424bc..00000000000 --- a/pype/settings/defaults/project_settings/plugins/maya/create.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/pype/settings/defaults/project_settings/plugins/maya/filter.json b/pype/settings/defaults/project_settings/plugins/maya/filter.json deleted file mode 100644 index 83d6f05f311..00000000000 --- a/pype/settings/defaults/project_settings/plugins/maya/filter.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "Preset n1": { - "ValidateNoAnimation": false, - "ValidateShapeDefaultNames": false - }, - "Preset n2": { - "ValidateNoAnimation": false - } -} diff --git a/pype/settings/defaults/project_settings/plugins/maya/load.json b/pype/settings/defaults/project_settings/plugins/maya/load.json deleted file mode 100644 index 260fbb35ee9..00000000000 --- a/pype/settings/defaults/project_settings/plugins/maya/load.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "colors": { - "model": [0.821, 0.518, 0.117], - "rig": [0.144, 0.443, 0.463], - "pointcache": [0.368, 0.821, 0.117], - "animation": [0.368, 0.821, 0.117], - "ass": [1.0, 0.332, 0.312], - "camera": [0.447, 0.312, 1.0], - "fbx": [1.0, 0.931, 0.312], - "mayaAscii": [0.312, 1.0, 0.747], - "setdress": [0.312, 1.0, 0.747], - "layout": [0.312, 1.0, 0.747], - "vdbcache": [0.312, 1.0, 0.428], - "vrayproxy": [0.258, 0.95, 0.541], - "yeticache": [0.2, 0.8, 0.3], - "yetiRig": [0, 0.8, 0.5] - } -} diff --git a/pype/settings/defaults/project_settings/plugins/maya/maya/maya_capture.json b/pype/settings/defaults/project_settings/plugins/maya/maya/maya_capture.json deleted file mode 100644 index 02e6a9b95dc..00000000000 --- a/pype/settings/defaults/project_settings/plugins/maya/maya/maya_capture.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "Codec": { - "compression": "jpg", - "format": "image", - "quality": 95 - }, - "Display Options": { - "background": [ - 0.714, - 0.714, - 0.714 - ], - "backgroundBottom": [ - 0.714, - 0.714, - 0.714 - ], - "backgroundTop": [ - 0.714, - 0.714, - 0.714 - ], - "override_display": true - }, - "Generic": { - "isolate_view": true, - "off_screen": true - }, - "IO": { - "name": "", - "open_finished": false, - "raw_frame_numbers": false, - "recent_playblasts": [], - "save_file": false - }, - "PanZoom": { - "pan_zoom": true - }, - "Renderer": { - "rendererName": "vp2Renderer" - }, - "Resolution": { - "width": 1920, - "height": 1080, - "percent": 1.0, - "mode": "Custom" - }, - "Time Range": { - "start_frame": 0, - "end_frame": 25, - "frame": "", - "time": "Time Slider" - }, - "Viewport Options": { - "cameras": false, - "clipGhosts": false, - "controlVertices": false, - "deformers": false, - "dimensions": false, - "displayLights": 0, - "dynamicConstraints": false, - "dynamics": false, - "fluids": false, - "follicles": false, - "gpuCacheDisplayFilter": false, - "greasePencils": false, - "grid": false, - "hairSystems": false, - "handles": false, - "high_quality": true, - "hud": false, - "hulls": false, - "ikHandles": false, - "imagePlane": false, - "joints": false, - "lights": false, - "locators": false, - "manipulators": false, - "motionTrails": false, - "nCloths": false, - "nParticles": false, - "nRigids": false, - "nurbsCurves": false, - "nurbsSurfaces": false, - "override_viewport_options": true, - "particleInstancers": false, - "pivots": false, - "planes": false, - "pluginShapes": false, - "polymeshes": true, - "shadows": false, - "strokes": false, - "subdivSurfaces": false, - "textures": false, - "twoSidedLighting": true - }, - "Camera Options": { - "displayGateMask": false, - "displayResolution": false, - "displayFilmGate": false, - "displayFieldChart": false, - "displaySafeAction": false, - "displaySafeTitle": false, - "displayFilmPivot": false, - "displayFilmOrigin": false, - "overscan": 1.0 - } -} \ No newline at end of file diff --git a/pype/settings/defaults/project_settings/plugins/maya/maya/publish.json b/pype/settings/defaults/project_settings/plugins/maya/maya/publish.json deleted file mode 100644 index 486f0917e25..00000000000 --- a/pype/settings/defaults/project_settings/plugins/maya/maya/publish.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "ValidateModelName": { - "enabled": true, - "material_file": { - "windows": "", - "darwin": "", - "linux": "" - }, - "regex": "" - }, - "ValidateAssemblyName": { - "enabled": true - }, - "ValidateShaderName": { - "enabled": true, - "regex": "(?P.*)_(.*)_SHD" - }, - "ValidateMeshHasOverlappingUVs": { - "enabled": true - } -} \ No newline at end of file diff --git a/pype/settings/defaults/project_settings/plugins/maya/maya/workfile_build.json b/pype/settings/defaults/project_settings/plugins/maya/maya/workfile_build.json deleted file mode 100644 index 9e26dfeeb6e..00000000000 --- a/pype/settings/defaults/project_settings/plugins/maya/maya/workfile_build.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/pype/settings/defaults/project_settings/plugins/maya/publish.json b/pype/settings/defaults/project_settings/plugins/maya/publish.json deleted file mode 100644 index 2b3637ff80b..00000000000 --- a/pype/settings/defaults/project_settings/plugins/maya/publish.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "ValidateModelName": { - "enabled": false, - "material_file": "/path/to/shader_name_definition.txt", - "regex": "(.*)_(\\d)*_(?P.*)_(GEO)" - }, - "ValidateAssemblyName": { - "enabled": false - }, - "ValidateShaderName": { - "enabled": false, - "regex": "(?P.*)_(.*)_SHD" - }, - "ValidateMeshHasOverlappingUVs": { - "enabled": false - } -} \ No newline at end of file diff --git a/pype/settings/defaults/project_settings/plugins/maya/workfile_build.json b/pype/settings/defaults/project_settings/plugins/maya/workfile_build.json deleted file mode 100644 index 443bc2cb2c3..00000000000 --- a/pype/settings/defaults/project_settings/plugins/maya/workfile_build.json +++ /dev/null @@ -1,136 +0,0 @@ -[ - { - "tasks": [ - "lighting" - ], - "current_context": [ - { - "subset_name_filters": [ - ".+[Mm]ain" - ], - "families": [ - "model" - ], - "repre_names": [ - "abc", - "ma" - ], - "loaders": [ - "ReferenceLoader" - ] - }, - { - "families": [ - "animation", - "pointcache" - ], - "repre_names": [ - "abc" - ], - "loaders": [ - "ReferenceLoader" - ] - }, - { - "families": [ - "rendersetup" - ], - "repre_names": [ - "json" - ], - "loaders": [ - "RenderSetupLoader" - ] - }, - { - "families": [ - "camera" - ], - "repre_names": [ - "abc" - ], - "loaders": [ - "ReferenceLoader" - ] - } - ], - "linked_assets": [ - { - "families": [ - "setdress" - ], - "repre_names": [ - "ma" - ], - "loaders": [ - "ReferenceLoader" - ] - }, - { - "families": [ - "ass" - ], - "repre_names": [ - "ass" - ], - "loaders": [ - "assLoader" - ] - } - ] - }, - { - "tasks": [ - "animation" - ], - "current_context": [ - { - "families": [ - "camera" - ], - "repre_names": [ - "abc", - "ma" - ], - "loaders": [ - "ReferenceLoader" - ] - }, - { - "families": [ - "audio" - ], - "repre_names": [ - "wav" - ], - "loaders": [ - "RenderSetupLoader" - ] - } - ], - "linked_assets": [ - { - "families": [ - "setdress" - ], - "repre_names": [ - "proxy" - ], - "loaders": [ - "ReferenceLoader" - ] - }, - { - "families": [ - "rig" - ], - "repre_names": [ - "ass" - ], - "loaders": [ - "rigLoader" - ] - } - ] - } -] \ No newline at end of file diff --git a/pype/settings/defaults/project_settings/plugins/nuke/create.json b/pype/settings/defaults/project_settings/plugins/nuke/create.json deleted file mode 100644 index 79ab665696f..00000000000 --- a/pype/settings/defaults/project_settings/plugins/nuke/create.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "CreateWriteRender": { - "fpath_template": "{work}/renders/nuke/{subset}/{subset}.{frame}.{ext}" - }, - "CreateWritePrerender": { - "fpath_template": "{work}/prerenders/nuke/{subset}/{subset}.{frame}.{ext}" - } -} \ No newline at end of file diff --git a/pype/settings/defaults/project_settings/plugins/nuke/load.json b/pype/settings/defaults/project_settings/plugins/nuke/load.json deleted file mode 100644 index 0967ef424bc..00000000000 --- a/pype/settings/defaults/project_settings/plugins/nuke/load.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/pype/settings/defaults/project_settings/plugins/nuke/publish.json b/pype/settings/defaults/project_settings/plugins/nuke/publish.json deleted file mode 100644 index 08a099a0a0c..00000000000 --- a/pype/settings/defaults/project_settings/plugins/nuke/publish.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "ExtractThumbnail": { - "enabled": true, - "nodes": { - "Reformat": [ - [ - "type", - "to format" - ], - [ - "format", - "HD_1080" - ], - [ - "filter", - "Lanczos6" - ], - [ - "black_outside", - true - ], - [ - "pbb", - false - ] - ] - } - }, - "ValidateNukeWriteKnobs": { - "enabled": false, - "knobs": { - "render": { - "review": true - } - } - }, - "ExtractReviewDataLut": { - "enabled": false - }, - "ExtractReviewDataMov": { - "enabled": true, - "viewer_lut_raw": false - }, - "ExtractSlateFrame": { - "viewer_lut_raw": false - }, - "NukeSubmitDeadline": { - "deadline_priority": 50, - "deadline_pool": "", - "deadline_pool_secondary": "", - "deadline_chunk_size": 1 - } -} \ No newline at end of file diff --git a/pype/settings/defaults/project_settings/plugins/nuke/workfile_build.json b/pype/settings/defaults/project_settings/plugins/nuke/workfile_build.json deleted file mode 100644 index 4b48b46184c..00000000000 --- a/pype/settings/defaults/project_settings/plugins/nuke/workfile_build.json +++ /dev/null @@ -1,23 +0,0 @@ -[ - { - "tasks": [ - "compositing" - ], - "current_context": [ - { - "families": [ - "render", - "plate" - ], - "repre_names": [ - "exr", - "dpx" - ], - "loaders": [ - "LoadSequence" - ] - } - ], - "linked_assets": [] - } -] \ No newline at end of file diff --git a/pype/settings/defaults/project_settings/plugins/nukestudio/filter.json b/pype/settings/defaults/project_settings/plugins/nukestudio/filter.json deleted file mode 100644 index bd6a0dc1bd5..00000000000 --- a/pype/settings/defaults/project_settings/plugins/nukestudio/filter.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "strict": { - "ValidateVersion": true, - "VersionUpWorkfile": true - }, - "benevolent": { - "ValidateVersion": false, - "VersionUpWorkfile": false - } -} \ No newline at end of file diff --git a/pype/settings/defaults/project_settings/plugins/nukestudio/publish.json b/pype/settings/defaults/project_settings/plugins/nukestudio/publish.json deleted file mode 100644 index d99a878c35a..00000000000 --- a/pype/settings/defaults/project_settings/plugins/nukestudio/publish.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "CollectInstanceVersion": { - "enabled": false - }, - "ExtractReviewCutUpVideo": { - "enabled": true, - "tags_addition": [] - } -} \ No newline at end of file diff --git a/pype/settings/defaults/project_settings/plugins/resolve/create.json b/pype/settings/defaults/project_settings/plugins/resolve/create.json deleted file mode 100644 index 8ff5b157148..00000000000 --- a/pype/settings/defaults/project_settings/plugins/resolve/create.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "CreateShotClip": { - "clipName": "{track}{sequence}{shot}", - "folder": "takes", - "steps": 20 - } -} \ No newline at end of file diff --git a/pype/settings/defaults/project_settings/plugins/standalonepublisher/publish.json b/pype/settings/defaults/project_settings/plugins/standalonepublisher/publish.json deleted file mode 100644 index 2f1a3e7aca4..00000000000 --- a/pype/settings/defaults/project_settings/plugins/standalonepublisher/publish.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "ExtractThumbnailSP": { - "ffmpeg_args": { - "input": [ - "-gamma 2.2" - ], - "output": [] - } - }, - "ExtractReviewSP": { - "outputs": { - "h264": { - "input": [ - "-gamma 2.2" - ], - "output": [ - "-pix_fmt yuv420p", - "-crf 18" - ], - "tags": [ - "preview" - ], - "ext": "mov" - } - } - } -} \ No newline at end of file diff --git a/pype/settings/defaults/project_settings/plugins/test/create.json b/pype/settings/defaults/project_settings/plugins/test/create.json deleted file mode 100644 index fa0b2fc05fc..00000000000 --- a/pype/settings/defaults/project_settings/plugins/test/create.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "MyTestCreator": { - "my_test_property": "B", - "active": false, - "new_property": "new", - "family": "new_family" - } -} diff --git a/pype/settings/defaults/project_settings/plugins/test/publish.json b/pype/settings/defaults/project_settings/plugins/test/publish.json deleted file mode 100644 index 3180dd5d8a9..00000000000 --- a/pype/settings/defaults/project_settings/plugins/test/publish.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "MyTestPlugin": { - "label": "loaded from preset", - "optional": true, - "families": ["changed", "by", "preset"] - }, - "MyTestRemovedPlugin": { - "enabled": false - } -} diff --git a/pype/settings/defaults/project_settings/premiere/asset_default.json b/pype/settings/defaults/project_settings/premiere/asset_default.json deleted file mode 100644 index 84d2bde3d80..00000000000 --- a/pype/settings/defaults/project_settings/premiere/asset_default.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "frameStart": 1001, - "handleStart": 0, - "handleEnd": 0 -} diff --git a/pype/settings/defaults/project_settings/premiere/rules_tasks.json b/pype/settings/defaults/project_settings/premiere/rules_tasks.json deleted file mode 100644 index 333c9cd70b7..00000000000 --- a/pype/settings/defaults/project_settings/premiere/rules_tasks.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "defaultTasks": ["Layout", "Animation"], - "taskToSubsets": { - "Layout": ["reference", "audio"], - "Animation": ["audio"] - }, - "subsetToRepresentations": { - "reference": { - "preset": "h264", - "representation": "mp4" - }, - "thumbnail": { - "preset": "jpeg_thumb", - "representation": "jpg" - }, - "audio": { - "preset": "48khz", - "representation": "wav" - } - } -} diff --git a/pype/settings/defaults/project_settings/standalonepublisher/families.json b/pype/settings/defaults/project_settings/standalonepublisher/families.json deleted file mode 100644 index d05941cc261..00000000000 --- a/pype/settings/defaults/project_settings/standalonepublisher/families.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "create_look": { - "name": "look", - "label": "Look", - "family": "look", - "icon": "paint-brush", - "defaults": ["Main"], - "help": "Shader connections defining shape look" - }, - "create_model": { - "name": "model", - "label": "Model", - "family": "model", - "icon": "cube", - "defaults": ["Main", "Proxy", "Sculpt"], - "help": "Polygonal static geometry" - }, - "create_workfile": { - "name": "workfile", - "label": "Workfile", - "family": "workfile", - "icon": "cube", - "defaults": ["Main"], - "help": "Working scene backup" - }, - "create_camera": { - "name": "camera", - "label": "Camera", - "family": "camera", - "icon": "video-camera", - "defaults": ["Main"], - "help": "Single baked camera" - }, - "create_pointcache": { - "name": "pointcache", - "label": "Pointcache", - "family": "pointcache", - "icon": "gears", - "defaults": ["Main"], - "help": "Alembic pointcache for animated data" - }, - "create_rig": { - "name": "rig", - "label": "Rig", - "family": "rig", - "icon": "wheelchair", - "defaults": ["Main"], - "help": "Artist-friendly rig with controls" - }, - "create_layout": { - "name": "layout", - "label": "Layout", - "family": "layout", - "icon": "cubes", - "defaults": ["Main"], - "help": "Simple scene for animators with camera" - }, - "create_plate": { - "name": "plate", - "label": "Plate", - "family": "plate", - "icon": "camera", - "defaults": ["Main", "BG", "Reference"], - "help": "Plates for compositors" - }, - "create_matchmove": { - "name": "matchmove", - "label": "Matchmove script", - "family": "matchmove", - "icon": "empire", - "defaults": ["Camera", "Object", "Mocap"], - "help": "Script exported from matchmoving application" - }, - "create_images": { - "name": "image", - "label": "Image file", - "family": "image", - "icon": "image", - "defaults": ["ConceptArt", "Reference", "Texture", "MattePaint"], - "help": "Holder for all kinds of image data" - }, - "create_editorial": { - "name": "editorial", - "label": "Editorial", - "family": "editorial", - "icon": "image", - "defaults": ["Main"], - "help": "Editorial files to generate shots." - } -} diff --git a/pype/settings/defaults/project_settings/tools/slates/example_HD.json b/pype/settings/defaults/project_settings/tools/slates/example_HD.json deleted file mode 100644 index b06391fb634..00000000000 --- a/pype/settings/defaults/project_settings/tools/slates/example_HD.json +++ /dev/null @@ -1,212 +0,0 @@ -{ - "width": 1920, - "height": 1080, - "destination_path": "{destination_path}", - "style": { - "*": { - "font-family": "arial", - "font-color": "#ffffff", - "font-bold": false, - "font-italic": false, - "bg-color": "#0077ff", - "alignment-horizontal": "left", - "alignment-vertical": "top" - }, - "layer": { - "padding": 0, - "margin": 0 - }, - "rectangle": { - "padding": 0, - "margin": 0, - "bg-color": "#E9324B", - "fill": true - }, - "main_frame": { - "padding": 0, - "margin": 0, - "bg-color": "#252525" - }, - "table": { - "padding": 0, - "margin": 0, - "bg-color": "transparent" - }, - "table-item": { - "padding": 5, - "padding-bottom": 10, - "margin": 0, - "bg-color": "#212121", - "bg-alter-color": "#272727", - "font-color": "#dcdcdc", - "font-bold": false, - "font-italic": false, - "alignment-horizontal": "left", - "alignment-vertical": "top", - "word-wrap": false, - "ellide": true, - "max-lines": 1 - }, - "table-item-col[0]": { - "font-size": 20, - "font-color": "#898989", - "font-bold": true, - "ellide": false, - "word-wrap": true, - "max-lines": null - }, - "table-item-col[1]": { - "font-size": 40, - "padding-left": 10 - }, - "#colorbar": { - "bg-color": "#9932CC" - } - }, - "items": [{ - "type": "layer", - "direction": 1, - "name": "MainLayer", - "style": { - "#MainLayer": { - "width": 1094, - "height": 1000, - "margin": 25, - "padding": 0 - }, - "#LeftSide": { - "margin-right": 25 - } - }, - "items": [{ - "type": "layer", - "name": "LeftSide", - "items": [{ - "type": "layer", - "direction": 1, - "style": { - "table-item": { - "bg-color": "transparent", - "padding-bottom": 20 - }, - "table-item-col[0]": { - "font-size": 20, - "font-color": "#898989", - "alignment-horizontal": "right" - }, - "table-item-col[1]": { - "alignment-horizontal": "left", - "font-bold": true, - "font-size": 40 - } - }, - "items": [{ - "type": "table", - "values": [ - ["Show:", "{project[name]}"] - ], - "style": { - "table-item-field[0:0]": { - "width": 150 - }, - "table-item-field[0:1]": { - "width": 580 - } - } - }, { - "type": "table", - "values": [ - ["Submitting For:", "{intent}"] - ], - "style": { - "table-item-field[0:0]": { - "width": 160 - }, - "table-item-field[0:1]": { - "width": 218, - "alignment-horizontal": "right" - } - } - }] - }, { - "type": "rectangle", - "style": { - "bg-color": "#bc1015", - "width": 1108, - "height": 5, - "fill": true - } - }, { - "type": "table", - "use_alternate_color": true, - "values": [ - ["Version name:", "{version_name}"], - ["Date:", "{date}"], - ["Shot Types:", "{shot_type}"], - ["Submission Note:", "{submission_note}"] - ], - "style": { - "table-item": { - "padding-bottom": 20 - }, - "table-item-field[0:1]": { - "font-bold": true - }, - "table-item-field[3:0]": { - "word-wrap": true, - "ellide": true, - "max-lines": 4 - }, - "table-item-col[0]": { - "alignment-horizontal": "right", - "width": 150 - }, - "table-item-col[1]": { - "alignment-horizontal": "left", - "width": 958 - } - } - }] - }, { - "type": "layer", - "name": "RightSide", - "items": [{ - "type": "placeholder", - "name": "thumbnail", - "path": "{thumbnail_path}", - "style": { - "width": 730, - "height": 412 - } - }, { - "type": "placeholder", - "name": "colorbar", - "path": "{color_bar_path}", - "return_data": true, - "style": { - "width": 730, - "height": 55 - } - }, { - "type": "table", - "use_alternate_color": true, - "values": [ - ["Vendor:", "{vendor}"], - ["Shot Name:", "{shot_name}"], - ["Frames:", "{frame_start} - {frame_end} ({duration})"] - ], - "style": { - "table-item-col[0]": { - "alignment-horizontal": "left", - "width": 200 - }, - "table-item-col[1]": { - "alignment-horizontal": "right", - "width": 530, - "font-size": 30 - } - } - }] - }] - }] -} diff --git a/pype/settings/defaults/project_settings/unreal/project_setup.json b/pype/settings/defaults/project_settings/unreal/project_setup.json deleted file mode 100644 index 8a4dffc526c..00000000000 --- a/pype/settings/defaults/project_settings/unreal/project_setup.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "dev_mode": false, - "install_unreal_python_engine": false -} diff --git a/pype/settings/defaults/system_settings/environments/avalon.json b/pype/settings/defaults/system_settings/environments/avalon.json deleted file mode 100644 index 832ba07e719..00000000000 --- a/pype/settings/defaults/system_settings/environments/avalon.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "AVALON_CONFIG": "pype", - "AVALON_PROJECTS": "{PYPE_PROJECTS_PATH}", - "AVALON_USERNAME": "avalon", - "AVALON_PASSWORD": "secret", - "AVALON_DEBUG": "1", - "AVALON_MONGO": "mongodb://localhost:2707", - "AVALON_DB": "avalon", - "AVALON_DB_DATA": "{PYPE_SETUP_PATH}/../mongo_db_data", - "AVALON_EARLY_ADOPTER": "1", - "AVALON_SCHEMA": "{PYPE_MODULE_ROOT}/schema", - "AVALON_LOCATION": "http://127.0.0.1", - "AVALON_LABEL": "Pype", - "AVALON_TIMEOUT": "1000", - "AVALON_THUMBNAIL_ROOT": "" -} diff --git a/pype/settings/defaults/system_settings/environments/blender.json b/pype/settings/defaults/system_settings/environments/blender.json deleted file mode 100644 index 6f4f6a012d4..00000000000 --- a/pype/settings/defaults/system_settings/environments/blender.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "BLENDER_USER_SCRIPTS": "{PYPE_SETUP_PATH}/repos/avalon-core/setup/blender", - "PYTHONPATH": [ - "{PYPE_SETUP_PATH}/repos/avalon-core/setup/blender", - "{PYTHONPATH}" - ] -} diff --git a/pype/settings/defaults/system_settings/environments/celaction.json b/pype/settings/defaults/system_settings/environments/celaction.json deleted file mode 100644 index cdd4e609ab7..00000000000 --- a/pype/settings/defaults/system_settings/environments/celaction.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "CELACTION_TEMPLATE": "{PYPE_MODULE_ROOT}/pype/hosts/celaction/celaction_template_scene.scn" -} diff --git a/pype/settings/defaults/system_settings/environments/deadline.json b/pype/settings/defaults/system_settings/environments/deadline.json deleted file mode 100644 index e8ef52805b6..00000000000 --- a/pype/settings/defaults/system_settings/environments/deadline.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "DEADLINE_REST_URL": "http://localhost:8082" -} diff --git a/pype/settings/defaults/system_settings/environments/ftrack.json b/pype/settings/defaults/system_settings/environments/ftrack.json deleted file mode 100644 index 4f25de027b5..00000000000 --- a/pype/settings/defaults/system_settings/environments/ftrack.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "FTRACK_SERVER": "https://pype.ftrackapp.com", - "FTRACK_ACTIONS_PATH": [ - "{PYPE_MODULE_ROOT}/pype/modules/ftrack/actions" - ], - "FTRACK_EVENTS_PATH": [ - "{PYPE_MODULE_ROOT}/pype/modules/ftrack/events" - ], - "PYTHONPATH": [ - "{PYPE_MODULE_ROOT}/pype/vendor", - "{PYTHONPATH}" - ], - "PYBLISHPLUGINPATH": [ - "{PYPE_MODULE_ROOT}/pype/plugins/ftrack/publish" - ], - "FTRACK_EVENTS_MONGO_DB": "pype", - "FTRACK_EVENTS_MONGO_COL": "ftrack_events" -} diff --git a/pype/settings/defaults/system_settings/environments/global.json b/pype/settings/defaults/system_settings/environments/global.json deleted file mode 100644 index ef528e68579..00000000000 --- a/pype/settings/defaults/system_settings/environments/global.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "PYPE_STUDIO_NAME": "Studio Name", - "PYPE_STUDIO_CODE": "stu", - "PYPE_APP_ROOT": "{PYPE_SETUP_PATH}/pypeapp", - "PYPE_MODULE_ROOT": "{PYPE_SETUP_PATH}/repos/pype", - "PYPE_PROJECT_PLUGINS": "", - "STUDIO_SOFT": "{PYP_SETUP_ROOT}/soft", - "FFMPEG_PATH": { - "windows": "{VIRTUAL_ENV}/localized/ffmpeg_exec/windows/bin;{PYPE_SETUP_PATH}/vendor/ffmpeg_exec/windows/bin", - "darwin": "{VIRTUAL_ENV}/localized/ffmpeg_exec/darwin/bin:{PYPE_SETUP_PATH}/vendor/ffmpeg_exec/darwin/bin", - "linux": "{VIRTUAL_ENV}/localized/ffmpeg_exec/linux:{PYPE_SETUP_PATH}/vendor/ffmpeg_exec/linux" - }, - "DJV_PATH": { - "windows": [ - "C:/Program Files/djv-1.1.0-Windows-64/bin/djv_view.exe", - "C:/Program Files/DJV/bin/djv_view.exe", - "{STUDIO_SOFT}/djv/windows/bin/djv_view.exe" - ], - "linux": [ - "usr/local/djv/djv_view", - "{STUDIO_SOFT}/djv/linux/bin/djv_view" - ], - "darwin": "Application/DJV.app/Contents/MacOS/DJV" - }, - "PATH": [ - "{PYPE_CONFIG}/launchers", - "{PYPE_APP_ROOT}", - "{FFMPEG_PATH}", - "{PATH}" - ], - "PYPE_OCIO_CONFIG": "{STUDIO_SOFT}/OpenColorIO-Configs", - "PYTHONPATH": { - "windows": "{VIRTUAL_ENV}/Lib/site-packages;{PYPE_MODULE_ROOT}/pype/tools;{PYTHONPATH}", - "linux": "{VIRTUAL_ENV}/lib/python{PYTHON_VERSION}/site-packages:{PYPE_MODULE_ROOT}/pype/tools:{PYTHONPATH}", - "darwin": "{VIRTUAL_ENV}/lib/python{PYTHON_VERSION}/site-packages:{PYPE_MODULE_ROOT}/pype/tools:{PYTHONPATH}" - }, - "PYPE_PROJECT_CONFIGS": "{PYPE_SETUP_PATH}/../studio-project-configs", - "PYPE_PYTHON_EXE": { - "windows": "{VIRTUAL_ENV}/Scripts/python.exe", - "linux": "{VIRTUAL_ENV}/Scripts/python", - "darwin": "{VIRTUAL_ENV}/bin/python" - }, - "PYBLISH_GUI": "pyblish_pype" -} diff --git a/pype/settings/defaults/system_settings/environments/harmony.json b/pype/settings/defaults/system_settings/environments/harmony.json deleted file mode 100644 index d3943439352..00000000000 --- a/pype/settings/defaults/system_settings/environments/harmony.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "AVALON_HARMONY_WORKFILES_ON_LAUNCH": "1", - "PYBLISH_GUI_ALWAYS_EXEC": "1" -} diff --git a/pype/settings/defaults/system_settings/environments/houdini.json b/pype/settings/defaults/system_settings/environments/houdini.json deleted file mode 100644 index 95c7d190885..00000000000 --- a/pype/settings/defaults/system_settings/environments/houdini.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "HOUDINI_PATH": { - "darwin": "{PYPE_MODULE_ROOT}/setup/houdini:&", - "linux": "{PYPE_MODULE_ROOT}/setup/houdini:&", - "windows": "{PYPE_MODULE_ROOT}/setup/houdini;&" - }, - "HOUDINI_MENU_PATH": { - "darwin": "{PYPE_MODULE_ROOT}/setup/houdini:&", - "linux": "{PYPE_MODULE_ROOT}/setup/houdini:&", - "windows": "{PYPE_MODULE_ROOT}/setup/houdini;&" - } -} diff --git a/pype/settings/defaults/system_settings/environments/maya.json b/pype/settings/defaults/system_settings/environments/maya.json deleted file mode 100644 index 7785b108f70..00000000000 --- a/pype/settings/defaults/system_settings/environments/maya.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "PYTHONPATH": [ - "{PYPE_SETUP_PATH}/repos/avalon-core/setup/maya", - "{PYPE_SETUP_PATH}/repos/maya-look-assigner", - "{PYTHON_ENV}/python2/Lib/site-packages", - "{PYTHONPATH}" - ], - "MAYA_DISABLE_CLIC_IPM": "Yes", - "MAYA_DISABLE_CIP": "Yes", - "MAYA_DISABLE_CER": "Yes", - "PYMEL_SKIP_MEL_INIT": "Yes", - "LC_ALL": "C", - "PYPE_LOG_NO_COLORS": "Yes" -} diff --git a/pype/settings/defaults/system_settings/environments/maya_2018.json b/pype/settings/defaults/system_settings/environments/maya_2018.json deleted file mode 100644 index 72a0c57ce3d..00000000000 --- a/pype/settings/defaults/system_settings/environments/maya_2018.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "MAYA_VERSION": "2018", - "MAYA_LOCATION": { - "darwin": "/Applications/Autodesk/maya{MAYA_VERSION}/Maya.app/Contents", - "linux": "/usr/autodesk/maya{MAYA_VERSION}", - "windows": "C:/Program Files/Autodesk/Maya{MAYA_VERSION}" - }, - "DYLD_LIBRARY_PATH": { - "darwin": "{MAYA_LOCATION}/MacOS" - } -} diff --git a/pype/settings/defaults/system_settings/environments/maya_2020.json b/pype/settings/defaults/system_settings/environments/maya_2020.json deleted file mode 100644 index efd0250bc8e..00000000000 --- a/pype/settings/defaults/system_settings/environments/maya_2020.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "MAYA_VERSION": "2020", - "MAYA_LOCATION": { - "darwin": "/Applications/Autodesk/maya{MAYA_VERSION}/Maya.app/Contents", - "linux": "/usr/autodesk/maya{MAYA_VERSION}", - "windows": "C:/Program Files/Autodesk/Maya{MAYA_VERSION}" - }, - "DYLD_LIBRARY_PATH": { - "darwin": "{MAYA_LOCATION}/MacOS" - } -} diff --git a/pype/settings/defaults/system_settings/environments/mayabatch.json b/pype/settings/defaults/system_settings/environments/mayabatch.json deleted file mode 100644 index 7785b108f70..00000000000 --- a/pype/settings/defaults/system_settings/environments/mayabatch.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "PYTHONPATH": [ - "{PYPE_SETUP_PATH}/repos/avalon-core/setup/maya", - "{PYPE_SETUP_PATH}/repos/maya-look-assigner", - "{PYTHON_ENV}/python2/Lib/site-packages", - "{PYTHONPATH}" - ], - "MAYA_DISABLE_CLIC_IPM": "Yes", - "MAYA_DISABLE_CIP": "Yes", - "MAYA_DISABLE_CER": "Yes", - "PYMEL_SKIP_MEL_INIT": "Yes", - "LC_ALL": "C", - "PYPE_LOG_NO_COLORS": "Yes" -} diff --git a/pype/settings/defaults/system_settings/environments/mayabatch_2019.json b/pype/settings/defaults/system_settings/environments/mayabatch_2019.json deleted file mode 100644 index aa7360a943e..00000000000 --- a/pype/settings/defaults/system_settings/environments/mayabatch_2019.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "MAYA_VERSION": "2019", - "MAYA_LOCATION": { - "darwin": "/Applications/Autodesk/maya{MAYA_VERSION}/Maya.app/Contents", - "linux": "/usr/autodesk/maya{MAYA_VERSION}", - "windows": "C:/Program Files/Autodesk/Maya{MAYA_VERSION}" - }, - "DYLD_LIBRARY_PATH": { - "darwin": "{MAYA_LOCATION}/MacOS" - } -} diff --git a/pype/settings/defaults/system_settings/environments/mtoa_3.1.1.json b/pype/settings/defaults/system_settings/environments/mtoa_3.1.1.json deleted file mode 100644 index f7b9f94d4ed..00000000000 --- a/pype/settings/defaults/system_settings/environments/mtoa_3.1.1.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "MTOA": "{PYPE_STUDIO_SOFTWARE}/arnold/mtoa_{MAYA_VERSION}_{MTOA_VERSION}", - "MTOA_VERSION": "3.1.1", - "MAYA_RENDER_DESC_PATH": "{MTOA}", - "MAYA_MODULE_PATH": "{MTOA}", - "ARNOLD_PLUGIN_PATH": "{MTOA}/shaders", - "MTOA_EXTENSIONS_PATH": { - "darwin": "{MTOA}/extensions", - "linux": "{MTOA}/extensions", - "windows": "{MTOA}/extensions" - }, - "MTOA_EXTENSIONS": { - "darwin": "{MTOA}/extensions", - "linux": "{MTOA}/extensions", - "windows": "{MTOA}/extensions" - }, - "DYLD_LIBRARY_PATH": { - "darwin": "{MTOA}/bin" - }, - "PATH": { - "windows": "{PATH};{MTOA}/bin" - } -} diff --git a/pype/settings/defaults/system_settings/environments/muster.json b/pype/settings/defaults/system_settings/environments/muster.json deleted file mode 100644 index 26f311146aa..00000000000 --- a/pype/settings/defaults/system_settings/environments/muster.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "MUSTER_REST_URL": "http://127.0.0.1:9890" -} diff --git a/pype/settings/defaults/system_settings/environments/nuke.json b/pype/settings/defaults/system_settings/environments/nuke.json deleted file mode 100644 index 50dd31ac911..00000000000 --- a/pype/settings/defaults/system_settings/environments/nuke.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "NUKE_PATH": [ - "{PYPE_SETUP_PATH}/repos/avalon-core/setup/nuke/nuke_path", - "{PYPE_MODULE_ROOT}/setup/nuke/nuke_path", - "{PYPE_STUDIO_PLUGINS}/nuke" - ], - "PATH": { - "windows": "C:/Program Files (x86)/QuickTime/QTSystem/;{PATH}" - }, - "PYPE_LOG_NO_COLORS": "True", - "PYTHONPATH": { - "windows": "{VIRTUAL_ENV}/Lib/site-packages;{PYTHONPATH}", - "linux": "{VIRTUAL_ENV}/lib/python3.6/site-packages:{PYTHONPATH}" - } -} diff --git a/pype/settings/defaults/system_settings/environments/nukestudio.json b/pype/settings/defaults/system_settings/environments/nukestudio.json deleted file mode 100644 index b05e2411f00..00000000000 --- a/pype/settings/defaults/system_settings/environments/nukestudio.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "HIERO_PLUGIN_PATH": [ - "{PYPE_MODULE_ROOT}/setup/nukestudio/hiero_plugin_path" - ], - "PATH": { - "windows": "C:/Program Files (x86)/QuickTime/QTSystem/;{PATH}" - }, - "WORKFILES_STARTUP": "0", - "TAG_ASSETBUILD_STARTUP": "0", - "PYPE_LOG_NO_COLORS": "True" -} diff --git a/pype/settings/defaults/system_settings/environments/nukestudio_10.0.json b/pype/settings/defaults/system_settings/environments/nukestudio_10.0.json deleted file mode 100644 index 9bdcef53c92..00000000000 --- a/pype/settings/defaults/system_settings/environments/nukestudio_10.0.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "PYPE_LOG_NO_COLORS": "Yes", - "QT_PREFERRED_BINDING": "PySide" -} \ No newline at end of file diff --git a/pype/settings/defaults/system_settings/environments/nukex.json b/pype/settings/defaults/system_settings/environments/nukex.json deleted file mode 100644 index 2b77f44076c..00000000000 --- a/pype/settings/defaults/system_settings/environments/nukex.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "NUKE_PATH": [ - "{PYPE_SETUP_PATH}/repos/avalon-core/setup/nuke/nuke_path", - "{PYPE_MODULE_ROOT}/setup/nuke/nuke_path", - "{PYPE_STUDIO_PLUGINS}/nuke" - ], - "PATH": { - "windows": "C:/Program Files (x86)/QuickTime/QTSystem/;{PATH}" - } -} diff --git a/pype/settings/defaults/system_settings/environments/nukex_10.0.json b/pype/settings/defaults/system_settings/environments/nukex_10.0.json deleted file mode 100644 index 9bdcef53c92..00000000000 --- a/pype/settings/defaults/system_settings/environments/nukex_10.0.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "PYPE_LOG_NO_COLORS": "Yes", - "QT_PREFERRED_BINDING": "PySide" -} \ No newline at end of file diff --git a/pype/settings/defaults/system_settings/environments/photoshop.json b/pype/settings/defaults/system_settings/environments/photoshop.json deleted file mode 100644 index 2208a88665c..00000000000 --- a/pype/settings/defaults/system_settings/environments/photoshop.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "AVALON_PHOTOSHOP_WORKFILES_ON_LAUNCH": "1", - "PYTHONPATH": "{PYTHONPATH}" -} diff --git a/pype/settings/defaults/system_settings/environments/premiere.json b/pype/settings/defaults/system_settings/environments/premiere.json deleted file mode 100644 index 27dc5c564b3..00000000000 --- a/pype/settings/defaults/system_settings/environments/premiere.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "EXTENSIONS_PATH": { - "windows": "{USERPROFILE}/AppData/Roaming/Adobe/CEP/extensions", - "darvin": "{USER}/Library/Application Support/Adobe/CEP/extensions" - }, - "EXTENSIONS_CACHE_PATH": { - "windows": "{USERPROFILE}/AppData/Local/Temp/cep_cache", - "darvin": "{USER}/Library/Application Support/Adobe/CEP/cep_cache" - }, - "installed_zxp": "" -} diff --git a/pype/settings/defaults/system_settings/environments/resolve.json b/pype/settings/defaults/system_settings/environments/resolve.json deleted file mode 100644 index 1ff197dd5aa..00000000000 --- a/pype/settings/defaults/system_settings/environments/resolve.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "RESOLVE_UTILITY_SCRIPTS_SOURCE_DIR": [ - "{STUDIO_SOFT}/davinci_resolve/scripts/python" - ], - "RESOLVE_SCRIPT_API": { - "windows": "{PROGRAMDATA}/Blackmagic Design/DaVinci Resolve/Support/Developer/Scripting", - "darvin": "/Library/Application Support/Blackmagic Design/DaVinci Resolve/Developer/Scripting", - "linux": "/opt/resolve/Developer/Scripting" - }, - "RESOLVE_SCRIPT_LIB": { - "windows": "C:/Program Files/Blackmagic Design/DaVinci Resolve/fusionscript.dll", - "darvin": "/Applications/DaVinci Resolve/DaVinci Resolve.app/Contents/Libraries/Fusion/fusionscript.so", - "linux": "/opt/resolve/libs/Fusion/fusionscript.so" - }, - "RESOLVE_UTILITY_SCRIPTS_DIR": { - "windows": "{PROGRAMDATA}/Blackmagic Design/DaVinci Resolve/Fusion/Scripts/Comp", - "darvin": "/Library/Application Support/Blackmagic Design/DaVinci Resolve/Fusion/Scripts/Comp", - "linux": "/opt/resolve/Fusion/Scripts/Comp" - }, - "PYTHON36_RESOLVE": { - "windows": "{LOCALAPPDATA}/Programs/Python/Python36", - "darvin": "~/Library/Python/3.6/bin", - "linux": "/opt/Python/3.6/bin" - }, - "PYTHONPATH": [ - "{PYTHON36_RESOLVE}/Lib/site-packages", - "{VIRTUAL_ENV}/Lib/site-packages", - "{PYTHONPATH}", - "{RESOLVE_SCRIPT_API}/Modules", - "{PYTHONPATH}" - ], - "PATH": [ - "{PYTHON36_RESOLVE}", - "{PYTHON36_RESOLVE}/Scripts", - "{PATH}" - ], - "PRE_PYTHON_SCRIPT": "{PYPE_MODULE_ROOT}/pype/resolve/preload_console.py", - "PYPE_LOG_NO_COLORS": "True", - "RESOLVE_DEV": "True" -} diff --git a/pype/settings/defaults/system_settings/environments/storyboardpro.json b/pype/settings/defaults/system_settings/environments/storyboardpro.json deleted file mode 100644 index 581ad4db45a..00000000000 --- a/pype/settings/defaults/system_settings/environments/storyboardpro.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "AVALON_TOONBOOM_WORKFILES_ON_LAUNCH": "1", - "PYBLISH_LITE_ALWAYS_EXEC": "1" -} diff --git a/pype/settings/defaults/system_settings/environments/unreal_4.24.json b/pype/settings/defaults/system_settings/environments/unreal_4.24.json deleted file mode 100644 index 8feeb0230f9..00000000000 --- a/pype/settings/defaults/system_settings/environments/unreal_4.24.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "AVALON_UNREAL_PLUGIN": "{PYPE_SETUP_PATH}/repos/avalon-unreal-integration", - "PYPE_LOG_NO_COLORS": "True", - "QT_PREFERRED_BINDING": "PySide" -} diff --git a/pype/settings/defaults/system_settings/environments/vray_4300.json b/pype/settings/defaults/system_settings/environments/vray_4300.json deleted file mode 100644 index 32121884419..00000000000 --- a/pype/settings/defaults/system_settings/environments/vray_4300.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "VRAY_VERSION": "43001", - "VRAY_ROOT": "C:/vray/vray_{VRAY_VERSION}", - "MAYA_RENDER_DESC_PATH": "{VRAY_ROOT}/maya_root/bin/rendererDesc", - "VRAY_FOR_MAYA2019_MAIN": "{VRAY_ROOT}/maya_vray", - "VRAY_FOR_MAYA2019_PLUGINS": "{VRAY_ROOT}/maya_vray/vrayplugins", - "VRAY_PLUGINS": "{VRAY_ROOT}/maya_vray/vrayplugins", - "VRAY_OSL_PATH_MAYA2019": "{VRAY_ROOT}/vray/opensl", - "PATH": "{VRAY_ROOT}/maya_root/bin;{PATH}", - "MAYA_PLUG_IN_PATH": "{VRAY_ROOT}/maya_vray/plug-ins", - "MAYA_SCRIPT_PATH": "{VRAY_ROOT}/maya_vray/scripts", - "PYTHONPATH": "{VRAY_ROOT}/maya_vray/scripts;{PYTHONPATH}", - "XBMLANGPATH": "{VRAY_ROOT}/maya_vray/icons;{XBMLANGPATH}", - "VRAY_AUTH_CLIENT_FILE_PATH": "{VRAY_ROOT}" -} diff --git a/pype/settings/defaults/system_settings/global/applications.json b/pype/settings/defaults/system_settings/global/applications.json deleted file mode 100644 index e85e5864d98..00000000000 --- a/pype/settings/defaults/system_settings/global/applications.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "blender_2.80": false, - "blender_2.81": false, - "blender_2.82": false, - "blender_2.83": true, - "celaction_local": true, - "celaction_remote": true, - "harmony_17": true, - "maya_2017": false, - "maya_2018": false, - "maya_2019": true, - "maya_2020": true, - "nuke_10.0": false, - "nuke_11.2": false, - "nuke_11.3": true, - "nuke_12.0": true, - "nukex_10.0": false, - "nukex_11.2": false, - "nukex_11.3": true, - "nukex_12.0": true, - "nukestudio_10.0": false, - "nukestudio_11.2": false, - "nukestudio_11.3": true, - "nukestudio_12.0": true, - "houdini_16": false, - "houdini_16.5": false, - "houdini_17": false, - "houdini_18": true, - "premiere_2019": false, - "premiere_2020": true, - "resolve_16": true, - "storyboardpro_7": true, - "unreal_4.24": true -} \ No newline at end of file diff --git a/pype/settings/defaults/system_settings/global/general.json b/pype/settings/defaults/system_settings/global/general.json deleted file mode 100644 index bd501b06eb6..00000000000 --- a/pype/settings/defaults/system_settings/global/general.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "studio_name": "", - "studio_code": "" -} \ No newline at end of file diff --git a/pype/settings/defaults/system_settings/global/intent.json b/pype/settings/defaults/system_settings/global/intent.json deleted file mode 100644 index 844bd1b5188..00000000000 --- a/pype/settings/defaults/system_settings/global/intent.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "items": { - "wip": "WIP", - "test": "TEST", - "final": "FINAL" - }, - "default": "wip" -} \ No newline at end of file diff --git a/pype/settings/defaults/system_settings/global/modules.json b/pype/settings/defaults/system_settings/global/modules.json deleted file mode 100644 index 9bd46602cfd..00000000000 --- a/pype/settings/defaults/system_settings/global/modules.json +++ /dev/null @@ -1,88 +0,0 @@ -{ - "Avalon": { - "AVALON_MONGO": "mongodb://localhost:2707", - "AVALON_DB_DATA": "{PYPE_SETUP_PATH}/../mongo_db_data", - "AVALON_THUMBNAIL_ROOT": "{PYPE_SETUP_PATH}/../avalon_thumails" - }, - "Ftrack": { - "enabled": true, - "ftrack_server": "https://pype.ftrackapp.com", - "ftrack_actions_path": [], - "ftrack_events_path": [], - "FTRACK_EVENTS_MONGO_DB": "pype", - "FTRACK_EVENTS_MONGO_COL": "ftrack_events", - "sync_to_avalon": { - "statuses_name_change": [ - "ready", - "not ready" - ] - }, - "status_version_to_task": {}, - "status_update": { - "Ready": [ - "Not Ready" - ], - "In Progress": [ - "_any_" - ] - }, - "intent": { - "items": { - "-": "-", - "wip": "WIP", - "final": "Final", - "test": "Test" - }, - "default": "-" - } - }, - "Rest Api": { - "default_port": 8021, - "exclude_ports": [] - }, - "Timers Manager": { - "enabled": true, - "full_time": 15.0, - "message_time": 0.5 - }, - "Clockify": { - "enabled": true, - "workspace_name": "studio name" - }, - "Deadline": { - "enabled": true, - "DEADLINE_REST_URL": "http://localhost:8082" - }, - "Muster": { - "enabled": false, - "MUSTER_REST_URL": "", - "templates_mapping": { - "file_layers": 7, - "mentalray": 2, - "mentalray_sf": 6, - "redshift": 55, - "renderman": 29, - "software": 1, - "software_sf": 5, - "turtle": 10, - "vector": 4, - "vray": 37, - "ffmpeg": 48 - } - }, - "Logging": { - "enabled": true - }, - "Adobe Communicator": { - "enabled": true - }, - "User setting": { - "enabled": true - }, - "Standalone Publish": { - "enabled": true - }, - "Idle Manager": { - "enabled": true - } -} \ No newline at end of file diff --git a/pype/settings/defaults/system_settings/global/tools.json b/pype/settings/defaults/system_settings/global/tools.json deleted file mode 100644 index 1f8c2ad1ea6..00000000000 --- a/pype/settings/defaults/system_settings/global/tools.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "mtoa_3.0.1": false, - "mtoa_3.1.1": false, - "mtoa_3.2.0": true, - "yeti_2.1.2": true -} \ No newline at end of file diff --git a/pype/settings/defaults/system_settings/launchers/blender_2.80.toml b/pype/settings/defaults/system_settings/launchers/blender_2.80.toml deleted file mode 100644 index 5fea78b7b0d..00000000000 --- a/pype/settings/defaults/system_settings/launchers/blender_2.80.toml +++ /dev/null @@ -1,7 +0,0 @@ -application_dir = "blender" -executable = "blender_2.80" -schema = "avalon-core:application-1.0" -label = "Blender 2.80" -ftrack_label = "Blender" -icon ="blender" -ftrack_icon = '{}/app_icons/blender.png' diff --git a/pype/settings/defaults/system_settings/launchers/blender_2.81.toml b/pype/settings/defaults/system_settings/launchers/blender_2.81.toml deleted file mode 100644 index 4f85ee55584..00000000000 --- a/pype/settings/defaults/system_settings/launchers/blender_2.81.toml +++ /dev/null @@ -1,7 +0,0 @@ -application_dir = "blender" -executable = "blender_2.81" -schema = "avalon-core:application-1.0" -label = "Blender 2.81" -ftrack_label = "Blender" -icon ="blender" -ftrack_icon = '{}/app_icons/blender.png' diff --git a/pype/settings/defaults/system_settings/launchers/blender_2.82.toml b/pype/settings/defaults/system_settings/launchers/blender_2.82.toml deleted file mode 100644 index 840001452e3..00000000000 --- a/pype/settings/defaults/system_settings/launchers/blender_2.82.toml +++ /dev/null @@ -1,7 +0,0 @@ -application_dir = "blender" -executable = "blender_2.82" -schema = "avalon-core:application-1.0" -label = "Blender 2.82" -ftrack_label = "Blender" -icon ="blender" -ftrack_icon = '{}/app_icons/blender.png' diff --git a/pype/settings/defaults/system_settings/launchers/blender_2.83.toml b/pype/settings/defaults/system_settings/launchers/blender_2.83.toml deleted file mode 100644 index 7fc8bf87b9c..00000000000 --- a/pype/settings/defaults/system_settings/launchers/blender_2.83.toml +++ /dev/null @@ -1,7 +0,0 @@ -application_dir = "blender" -executable = "blender_2.83" -schema = "avalon-core:application-1.0" -label = "Blender 2.83" -ftrack_label = "Blender" -icon ="blender" -ftrack_icon = '{}/app_icons/blender.png' diff --git a/pype/settings/defaults/system_settings/launchers/celaction_local.toml b/pype/settings/defaults/system_settings/launchers/celaction_local.toml deleted file mode 100644 index aef3548e084..00000000000 --- a/pype/settings/defaults/system_settings/launchers/celaction_local.toml +++ /dev/null @@ -1,8 +0,0 @@ -executable = "celaction_local" -schema = "avalon-core:application-1.0" -application_dir = "celaction" -label = "CelAction2D" -ftrack_label = "CelAction2D" -icon ="celaction_local" -launch_hook = "pype/hooks/celaction/prelaunch.py/CelactionPrelaunchHook" -ftrack_icon = '{}/app_icons/celaction_local.png' diff --git a/pype/settings/defaults/system_settings/launchers/celaction_publish.toml b/pype/settings/defaults/system_settings/launchers/celaction_publish.toml deleted file mode 100644 index 86f4ae39e7d..00000000000 --- a/pype/settings/defaults/system_settings/launchers/celaction_publish.toml +++ /dev/null @@ -1,7 +0,0 @@ -schema = "avalon-core:application-1.0" -application_dir = "shell" -executable = "celaction_publish" -label = "Shell" - -[environment] -CREATE_NEW_CONSOLE = "Yes" diff --git a/pype/settings/defaults/system_settings/launchers/darwin/blender_2.82 b/pype/settings/defaults/system_settings/launchers/darwin/blender_2.82 deleted file mode 100644 index 8254411ea26..00000000000 --- a/pype/settings/defaults/system_settings/launchers/darwin/blender_2.82 +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env bash -open -a blender $@ diff --git a/pype/settings/defaults/system_settings/launchers/darwin/harmony_17 b/pype/settings/defaults/system_settings/launchers/darwin/harmony_17 deleted file mode 100644 index b7eba2c2d0c..00000000000 --- a/pype/settings/defaults/system_settings/launchers/darwin/harmony_17 +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash -DIRNAME="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" -set >~/environment.tmp -if [ $? -ne -0 ] ; then - echo "ERROR: cannot write to '~/environment.tmp'!" - read -n 1 -s -r -p "Press any key to exit" - return -fi -open -a Terminal.app "$DIRNAME/harmony_17_launch" diff --git a/pype/settings/defaults/system_settings/launchers/darwin/harmony_17_launch b/pype/settings/defaults/system_settings/launchers/darwin/harmony_17_launch deleted file mode 100644 index 5dcf5db57e3..00000000000 --- a/pype/settings/defaults/system_settings/launchers/darwin/harmony_17_launch +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash -source ~/environment.tmp -export $(cut -d= -f1 ~/environment.tmp) -exe="/Applications/Toon Boom Harmony 17 Premium/Harmony Premium.app/Contents/MacOS/Harmony Premium" -$PYPE_PYTHON_EXE -c "import avalon.harmony;avalon.harmony.launch('$exe')" diff --git a/pype/settings/defaults/system_settings/launchers/darwin/python3 b/pype/settings/defaults/system_settings/launchers/darwin/python3 deleted file mode 100644 index c2b82c7638c..00000000000 --- a/pype/settings/defaults/system_settings/launchers/darwin/python3 +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env bash -open /usr/bin/python3 --args $@ diff --git a/pype/settings/defaults/system_settings/launchers/harmony_17.toml b/pype/settings/defaults/system_settings/launchers/harmony_17.toml deleted file mode 100644 index dbb76444a76..00000000000 --- a/pype/settings/defaults/system_settings/launchers/harmony_17.toml +++ /dev/null @@ -1,8 +0,0 @@ -application_dir = "harmony" -label = "Harmony 17" -ftrack_label = "Harmony" -schema = "avalon-core:application-1.0" -executable = "harmony_17" -description = "" -icon ="harmony_icon" -ftrack_icon = '{}/app_icons/harmony.png' diff --git a/pype/settings/defaults/system_settings/launchers/houdini_16.toml b/pype/settings/defaults/system_settings/launchers/houdini_16.toml deleted file mode 100644 index e29fa74cadd..00000000000 --- a/pype/settings/defaults/system_settings/launchers/houdini_16.toml +++ /dev/null @@ -1,7 +0,0 @@ -executable = "houdini_16" -schema = "avalon-core:application-1.0" -application_dir = "houdini" -label = "Houdini 16" -ftrack_label = "Houdini" -icon = "houdini_icon" -ftrack_icon = '{}/app_icons/houdini.png' diff --git a/pype/settings/defaults/system_settings/launchers/houdini_17.toml b/pype/settings/defaults/system_settings/launchers/houdini_17.toml deleted file mode 100644 index 5d01364330a..00000000000 --- a/pype/settings/defaults/system_settings/launchers/houdini_17.toml +++ /dev/null @@ -1,7 +0,0 @@ -executable = "houdini_17" -schema = "avalon-core:application-1.0" -application_dir = "houdini" -label = "Houdini 17.0" -ftrack_label = "Houdini" -icon = "houdini_icon" -ftrack_icon = '{}/app_icons/houdini.png' diff --git a/pype/settings/defaults/system_settings/launchers/houdini_18.toml b/pype/settings/defaults/system_settings/launchers/houdini_18.toml deleted file mode 100644 index 93b9a3334d9..00000000000 --- a/pype/settings/defaults/system_settings/launchers/houdini_18.toml +++ /dev/null @@ -1,7 +0,0 @@ -executable = "houdini_18" -schema = "avalon-core:application-1.0" -application_dir = "houdini" -label = "Houdini 18" -ftrack_label = "Houdini" -icon = "houdini_icon" -ftrack_icon = '{}/app_icons/houdini.png' diff --git a/pype/settings/defaults/system_settings/launchers/linux/maya2016 b/pype/settings/defaults/system_settings/launchers/linux/maya2016 deleted file mode 100644 index 98424304b16..00000000000 --- a/pype/settings/defaults/system_settings/launchers/linux/maya2016 +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash - -maya_path = "/usr/autodesk/maya2016/bin/maya" - -if [[ -z $PYPE_LOG_NO_COLORS ]]; then - $maya_path -file "$AVALON_LAST_WORKFILE" $@ -else - $maya_path $@ diff --git a/pype/settings/defaults/system_settings/launchers/linux/maya2017 b/pype/settings/defaults/system_settings/launchers/linux/maya2017 deleted file mode 100644 index 7a2662a55ec..00000000000 --- a/pype/settings/defaults/system_settings/launchers/linux/maya2017 +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash - -maya_path = "/usr/autodesk/maya2017/bin/maya" - -if [[ -z $AVALON_LAST_WORKFILE ]]; then - $maya_path -file "$AVALON_LAST_WORKFILE" $@ -else - $maya_path $@ diff --git a/pype/settings/defaults/system_settings/launchers/linux/maya2018 b/pype/settings/defaults/system_settings/launchers/linux/maya2018 deleted file mode 100644 index db832b3fe70..00000000000 --- a/pype/settings/defaults/system_settings/launchers/linux/maya2018 +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash - -maya_path = "/usr/autodesk/maya2018/bin/maya" - -if [[ -z $AVALON_LAST_WORKFILE ]]; then - $maya_path -file "$AVALON_LAST_WORKFILE" $@ -else - $maya_path $@ diff --git a/pype/settings/defaults/system_settings/launchers/linux/maya2019 b/pype/settings/defaults/system_settings/launchers/linux/maya2019 deleted file mode 100644 index 8398734ab9f..00000000000 --- a/pype/settings/defaults/system_settings/launchers/linux/maya2019 +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash - -maya_path = "/usr/autodesk/maya2019/bin/maya" - -if [[ -z $AVALON_LAST_WORKFILE ]]; then - $maya_path -file "$AVALON_LAST_WORKFILE" $@ -else - $maya_path $@ diff --git a/pype/settings/defaults/system_settings/launchers/linux/maya2020 b/pype/settings/defaults/system_settings/launchers/linux/maya2020 deleted file mode 100644 index 18a1edd5980..00000000000 --- a/pype/settings/defaults/system_settings/launchers/linux/maya2020 +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash - -maya_path = "/usr/autodesk/maya2020/bin/maya" - -if [[ -z $AVALON_LAST_WORKFILE ]]; then - $maya_path -file "$AVALON_LAST_WORKFILE" $@ -else - $maya_path $@ diff --git a/pype/settings/defaults/system_settings/launchers/linux/nuke11.3 b/pype/settings/defaults/system_settings/launchers/linux/nuke11.3 deleted file mode 100644 index b1c9a90d74c..00000000000 --- a/pype/settings/defaults/system_settings/launchers/linux/nuke11.3 +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env bash -gnome-terminal -e '/usr/local/Nuke11.3v5/Nuke11.3' diff --git a/pype/settings/defaults/system_settings/launchers/linux/nuke12.0 b/pype/settings/defaults/system_settings/launchers/linux/nuke12.0 deleted file mode 100644 index 99ea1a6b0c0..00000000000 --- a/pype/settings/defaults/system_settings/launchers/linux/nuke12.0 +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env bash -gnome-terminal -e '/usr/local/Nuke12.0v1/Nuke12.0' diff --git a/pype/settings/defaults/system_settings/launchers/linux/nukestudio11.3 b/pype/settings/defaults/system_settings/launchers/linux/nukestudio11.3 deleted file mode 100644 index 750d54a7d55..00000000000 --- a/pype/settings/defaults/system_settings/launchers/linux/nukestudio11.3 +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env bash -gnome-terminal -e '/usr/local/Nuke11.3v5/Nuke11.3 --studio' diff --git a/pype/settings/defaults/system_settings/launchers/linux/nukestudio12.0 b/pype/settings/defaults/system_settings/launchers/linux/nukestudio12.0 deleted file mode 100644 index ba5cf654a8d..00000000000 --- a/pype/settings/defaults/system_settings/launchers/linux/nukestudio12.0 +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env bash -gnome-terminal -e '/usr/local/Nuke12.0v1/Nuke12.0 --studio' diff --git a/pype/settings/defaults/system_settings/launchers/linux/nukex11.3 b/pype/settings/defaults/system_settings/launchers/linux/nukex11.3 deleted file mode 100644 index d913e4b9618..00000000000 --- a/pype/settings/defaults/system_settings/launchers/linux/nukex11.3 +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env bash -gnome-terminal -e '/usr/local/Nuke11.3v5/Nuke11.3 -nukex' diff --git a/pype/settings/defaults/system_settings/launchers/linux/nukex12.0 b/pype/settings/defaults/system_settings/launchers/linux/nukex12.0 deleted file mode 100644 index da2721c48ba..00000000000 --- a/pype/settings/defaults/system_settings/launchers/linux/nukex12.0 +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env bash -gnome-terminal -e '/usr/local/Nuke12.0v1/Nuke12.0 -nukex' diff --git a/pype/settings/defaults/system_settings/launchers/maya_2016.toml b/pype/settings/defaults/system_settings/launchers/maya_2016.toml deleted file mode 100644 index d69c4effaf4..00000000000 --- a/pype/settings/defaults/system_settings/launchers/maya_2016.toml +++ /dev/null @@ -1,26 +0,0 @@ -application_dir = "maya" -default_dirs = [ - "scenes", - "data", - "renderData/shaders", - "images" -] -label = "Autodesk Maya 2016x64" -ftrack_label = "Maya" -schema = "avalon-core:application-1.0" -executable = "maya2016" -description = "" -icon ="maya_icon" -ftrack_icon = '{}/app_icons/maya.png' - -[copy] -"{PYPE_MODULE_ROOT}/pype/resources/maya/workspace.mel" = "workspace.mel" - -[environment] -MAYA_DISABLE_CLIC_IPM = "Yes" # Disable the AdSSO process -MAYA_DISABLE_CIP = "Yes" # Shorten time to boot -MAYA_DISABLE_CER = "Yes" -PYTHONPATH = [ - "{AVALON_CORE}/setup/maya", - "{PYTHONPATH}" -] diff --git a/pype/settings/defaults/system_settings/launchers/maya_2017.toml b/pype/settings/defaults/system_settings/launchers/maya_2017.toml deleted file mode 100644 index 2d1c35b5302..00000000000 --- a/pype/settings/defaults/system_settings/launchers/maya_2017.toml +++ /dev/null @@ -1,28 +0,0 @@ -application_dir = "maya" -default_dirs = [ - "scenes", - "data", - "renderData/shaders", - "images" -] -label = "Autodesk Maya 2017" -ftrack_label = "Maya" -schema = "avalon-core:application-1.0" -executable = "maya2017" -description = "" -icon ="maya_icon" -ftrack_icon = '{}/app_icons/maya.png' - -[copy] -"{PYPE_MODULE_ROOT}/pype/resources/maya/workspace.mel" = "workspace.mel" - -[environment] -MAYA_DISABLE_CLIC_IPM = "Yes" # Disable the AdSSO process -MAYA_DISABLE_CIP = "Yes" # Shorten time to boot -MAYA_DISABLE_CER = "Yes" -PYMEL_SKIP_MEL_INIT = "Yes" -LC_ALL= "C" # Mute color management warnings -PYTHONPATH = [ - "{AVALON_CORE}/setup/maya", - "{PYTHONPATH}" -] diff --git a/pype/settings/defaults/system_settings/launchers/maya_2018.toml b/pype/settings/defaults/system_settings/launchers/maya_2018.toml deleted file mode 100644 index f180263fa2e..00000000000 --- a/pype/settings/defaults/system_settings/launchers/maya_2018.toml +++ /dev/null @@ -1,14 +0,0 @@ -application_dir = "maya" -default_dirs = [ - "renders" -] -label = "Autodesk Maya 2018" -ftrack_label = "Maya" -schema = "avalon-core:application-1.0" -executable = "maya2018" -description = "" -icon ="maya_icon" -ftrack_icon = '{}/app_icons/maya.png' - -[copy] -"{PYPE_MODULE_ROOT}/pype/resources/maya/workspace.mel" = "workspace.mel" diff --git a/pype/settings/defaults/system_settings/launchers/maya_2019.toml b/pype/settings/defaults/system_settings/launchers/maya_2019.toml deleted file mode 100644 index 7ec2cbcedd3..00000000000 --- a/pype/settings/defaults/system_settings/launchers/maya_2019.toml +++ /dev/null @@ -1,14 +0,0 @@ -application_dir = "maya" -default_dirs = [ - "renders" -] -label = "Autodesk Maya 2019" -ftrack_label = "Maya" -schema = "avalon-core:application-1.0" -executable = "maya2019" -description = "" -icon ="maya_icon" -ftrack_icon = '{}/app_icons/maya.png' - -[copy] -"{PYPE_MODULE_ROOT}/pype/resources/maya/workspace.mel" = "workspace.mel" diff --git a/pype/settings/defaults/system_settings/launchers/maya_2020.toml b/pype/settings/defaults/system_settings/launchers/maya_2020.toml deleted file mode 100644 index 49d84ef9a00..00000000000 --- a/pype/settings/defaults/system_settings/launchers/maya_2020.toml +++ /dev/null @@ -1,14 +0,0 @@ -application_dir = "maya" -default_dirs = [ - "renders" -] -label = "Autodesk Maya 2020" -ftrack_label = "Maya" -schema = "avalon-core:application-1.0" -executable = "maya2020" -description = "" -icon ="maya_icon" -ftrack_icon = '{}/app_icons/maya.png' - -[copy] -"{PYPE_MODULE_ROOT}/pype/resources/maya/workspace.mel" = "workspace.mel" diff --git a/pype/settings/defaults/system_settings/launchers/mayabatch_2019.toml b/pype/settings/defaults/system_settings/launchers/mayabatch_2019.toml deleted file mode 100644 index a928618d2b7..00000000000 --- a/pype/settings/defaults/system_settings/launchers/mayabatch_2019.toml +++ /dev/null @@ -1,17 +0,0 @@ -application_dir = "maya" -default_dirs = [ - "scenes", - "data", - "renderData/shaders", - "images" -] -label = "Autodesk Maya 2019x64" -schema = "avalon-core:application-1.0" -executable = "mayabatch2019" -description = "" - -[environment] -PYTHONPATH = [ - "{AVALON_CORE}/setup/maya", - "{PYTHONPATH}" -] diff --git a/pype/settings/defaults/system_settings/launchers/mayabatch_2020.toml b/pype/settings/defaults/system_settings/launchers/mayabatch_2020.toml deleted file mode 100644 index cd1e1e4474f..00000000000 --- a/pype/settings/defaults/system_settings/launchers/mayabatch_2020.toml +++ /dev/null @@ -1,17 +0,0 @@ -application_dir = "maya" -default_dirs = [ - "scenes", - "data", - "renderData/shaders", - "images" -] -label = "Autodesk Maya 2020x64" -schema = "avalon-core:application-1.0" -executable = "mayabatch2020" -description = "" - -[environment] -PYTHONPATH = [ - "{AVALON_CORE}/setup/maya", - "{PYTHONPATH}" -] diff --git a/pype/settings/defaults/system_settings/launchers/mayapy2016.toml b/pype/settings/defaults/system_settings/launchers/mayapy2016.toml deleted file mode 100644 index ad1e3dee86c..00000000000 --- a/pype/settings/defaults/system_settings/launchers/mayapy2016.toml +++ /dev/null @@ -1,17 +0,0 @@ -application_dir = "maya" -default_dirs = [ - "scenes", - "data", - "renderData/shaders", - "images" -] -label = "Autodesk Maya 2016x64" -schema = "avalon-core:application-1.0" -executable = "mayapy2016" -description = "" - -[environment] -PYTHONPATH = [ - "{AVALON_CORE}/setup/maya", - "{PYTHONPATH}" -] diff --git a/pype/settings/defaults/system_settings/launchers/mayapy2017.toml b/pype/settings/defaults/system_settings/launchers/mayapy2017.toml deleted file mode 100644 index 8d2095ff478..00000000000 --- a/pype/settings/defaults/system_settings/launchers/mayapy2017.toml +++ /dev/null @@ -1,17 +0,0 @@ -application_dir = "maya" -default_dirs = [ - "scenes", - "data", - "renderData/shaders", - "images" -] -label = "Autodesk Maya 2017x64" -schema = "avalon-core:application-1.0" -executable = "mayapy2017" -description = "" - -[environment] -PYTHONPATH = [ - "{AVALON_CORE}/setup/maya", - "{PYTHONPATH}" -] diff --git a/pype/settings/defaults/system_settings/launchers/mayapy2018.toml b/pype/settings/defaults/system_settings/launchers/mayapy2018.toml deleted file mode 100644 index 597744fd85e..00000000000 --- a/pype/settings/defaults/system_settings/launchers/mayapy2018.toml +++ /dev/null @@ -1,17 +0,0 @@ -application_dir = "maya" -default_dirs = [ - "scenes", - "data", - "renderData/shaders", - "images" -] -label = "Autodesk Maya 2018x64" -schema = "avalon-core:application-1.0" -executable = "mayapy2017" -description = "" - -[environment] -PYTHONPATH = [ - "{AVALON_CORE}/setup/maya", - "{PYTHONPATH}" -] diff --git a/pype/settings/defaults/system_settings/launchers/mayapy2019.toml b/pype/settings/defaults/system_settings/launchers/mayapy2019.toml deleted file mode 100644 index 3c8a9860f99..00000000000 --- a/pype/settings/defaults/system_settings/launchers/mayapy2019.toml +++ /dev/null @@ -1,17 +0,0 @@ -application_dir = "maya" -default_dirs = [ - "scenes", - "data", - "renderData/shaders", - "images" -] -label = "Autodesk Maya 2019x64" -schema = "avalon-core:application-1.0" -executable = "mayapy2019" -description = "" - -[environment] -PYTHONPATH = [ - "{AVALON_CORE}/setup/maya", - "{PYTHONPATH}" -] diff --git a/pype/settings/defaults/system_settings/launchers/mayapy2020.toml b/pype/settings/defaults/system_settings/launchers/mayapy2020.toml deleted file mode 100644 index 8f2d2e4a677..00000000000 --- a/pype/settings/defaults/system_settings/launchers/mayapy2020.toml +++ /dev/null @@ -1,17 +0,0 @@ -application_dir = "maya" -default_dirs = [ - "scenes", - "data", - "renderData/shaders", - "images" -] -label = "Autodesk Maya 2020x64" -schema = "avalon-core:application-1.0" -executable = "mayapy2020" -description = "" - -[environment] -PYTHONPATH = [ - "{AVALON_CORE}/setup/maya", - "{PYTHONPATH}" -] diff --git a/pype/settings/defaults/system_settings/launchers/myapp.toml b/pype/settings/defaults/system_settings/launchers/myapp.toml deleted file mode 100644 index 21da0d52b24..00000000000 --- a/pype/settings/defaults/system_settings/launchers/myapp.toml +++ /dev/null @@ -1,5 +0,0 @@ -executable = "python" -schema = "avalon-core:application-1.0" -application_dir = "myapp" -label = "My App" -arguments = [ "-c", "import sys; from Qt import QtWidgets; if __name__ == '__main__':;\n app = QtWidgets.QApplication(sys.argv);\n window = QtWidgets.QWidget();\n window.setWindowTitle(\"My App\");\n window.resize(400, 300);\n window.show();\n app.exec_();\n",] \ No newline at end of file diff --git a/pype/settings/defaults/system_settings/launchers/nuke_10.0.toml b/pype/settings/defaults/system_settings/launchers/nuke_10.0.toml deleted file mode 100644 index 2195fd3e82f..00000000000 --- a/pype/settings/defaults/system_settings/launchers/nuke_10.0.toml +++ /dev/null @@ -1,7 +0,0 @@ -executable = "nuke10.0" -schema = "avalon-core:application-1.0" -application_dir = "nuke" -label = "Nuke 10.0v4" -ftrack_label = "Nuke" -icon ="nuke_icon" -ftrack_icon = '{}/app_icons/nuke.png' diff --git a/pype/settings/defaults/system_settings/launchers/nuke_11.0.toml b/pype/settings/defaults/system_settings/launchers/nuke_11.0.toml deleted file mode 100644 index 0c981b479af..00000000000 --- a/pype/settings/defaults/system_settings/launchers/nuke_11.0.toml +++ /dev/null @@ -1,7 +0,0 @@ -executable = "nuke11.0" -schema = "avalon-core:application-1.0" -application_dir = "nuke" -label = "Nuke 11.0" -ftrack_label = "Nuke" -icon ="nuke_icon" -ftrack_icon = '{}/app_icons/nuke.png' diff --git a/pype/settings/defaults/system_settings/launchers/nuke_11.2.toml b/pype/settings/defaults/system_settings/launchers/nuke_11.2.toml deleted file mode 100644 index 57c962d126d..00000000000 --- a/pype/settings/defaults/system_settings/launchers/nuke_11.2.toml +++ /dev/null @@ -1,7 +0,0 @@ -executable = "nuke11.2" -schema = "avalon-core:application-1.0" -application_dir = "nuke" -label = "Nuke 11.2" -ftrack_label = "Nuke" -icon ="nuke_icon" -ftrack_icon = '{}/app_icons/nuke.png' diff --git a/pype/settings/defaults/system_settings/launchers/nuke_11.3.toml b/pype/settings/defaults/system_settings/launchers/nuke_11.3.toml deleted file mode 100644 index 87f769c23b2..00000000000 --- a/pype/settings/defaults/system_settings/launchers/nuke_11.3.toml +++ /dev/null @@ -1,7 +0,0 @@ -executable = "nuke11.3" -schema = "avalon-core:application-1.0" -application_dir = "nuke" -label = "Nuke 11.3" -ftrack_label = "Nuke" -icon ="nuke_icon" -ftrack_icon = '{}/app_icons/nuke.png' diff --git a/pype/settings/defaults/system_settings/launchers/nuke_12.0.toml b/pype/settings/defaults/system_settings/launchers/nuke_12.0.toml deleted file mode 100644 index 62936b4cdba..00000000000 --- a/pype/settings/defaults/system_settings/launchers/nuke_12.0.toml +++ /dev/null @@ -1,7 +0,0 @@ -executable = "nuke12.0" -schema = "avalon-core:application-1.0" -application_dir = "nuke" -label = "Nuke 12.0" -ftrack_label = "Nuke" -icon ="nuke_icon" -ftrack_icon = '{}/app_icons/nuke.png' diff --git a/pype/settings/defaults/system_settings/launchers/nukestudio_10.0.toml b/pype/settings/defaults/system_settings/launchers/nukestudio_10.0.toml deleted file mode 100644 index 41601e4d406..00000000000 --- a/pype/settings/defaults/system_settings/launchers/nukestudio_10.0.toml +++ /dev/null @@ -1,7 +0,0 @@ -executable = "nukestudio10.0" -schema = "avalon-core:application-1.0" -application_dir = "nukestudio" -label = "NukeStudio 10.0" -ftrack_label = "NukeStudio" -icon ="nuke_icon" -ftrack_icon = '{}/app_icons/nuke.png' diff --git a/pype/settings/defaults/system_settings/launchers/nukestudio_11.0.toml b/pype/settings/defaults/system_settings/launchers/nukestudio_11.0.toml deleted file mode 100644 index 7a9d84707a4..00000000000 --- a/pype/settings/defaults/system_settings/launchers/nukestudio_11.0.toml +++ /dev/null @@ -1,7 +0,0 @@ -executable = "nukestudio11.0" -schema = "avalon-core:application-1.0" -application_dir = "nukestudio" -label = "NukeStudio 11.0" -ftrack_label = "NukeStudio" -icon ="nuke_icon" -ftrack_icon = '{}/app_icons/nuke.png' diff --git a/pype/settings/defaults/system_settings/launchers/nukestudio_11.2.toml b/pype/settings/defaults/system_settings/launchers/nukestudio_11.2.toml deleted file mode 100644 index 21557033cac..00000000000 --- a/pype/settings/defaults/system_settings/launchers/nukestudio_11.2.toml +++ /dev/null @@ -1,7 +0,0 @@ -executable = "nukestudio11.2" -schema = "avalon-core:application-1.0" -application_dir = "nukestudio" -label = "NukeStudio 11.2" -ftrack_label = "NukeStudio" -icon ="nuke_icon" -ftrack_icon = '{}/app_icons/nuke.png' diff --git a/pype/settings/defaults/system_settings/launchers/nukestudio_11.3.toml b/pype/settings/defaults/system_settings/launchers/nukestudio_11.3.toml deleted file mode 100644 index 1946ad6c3b8..00000000000 --- a/pype/settings/defaults/system_settings/launchers/nukestudio_11.3.toml +++ /dev/null @@ -1,7 +0,0 @@ -executable = "nukestudio11.3" -schema = "avalon-core:application-1.0" -application_dir = "nukestudio" -label = "NukeStudio 11.3" -ftrack_label = "NukeStudio" -icon ="nuke_icon" -ftrack_icon = '{}/app_icons/nuke.png' diff --git a/pype/settings/defaults/system_settings/launchers/nukestudio_12.0.toml b/pype/settings/defaults/system_settings/launchers/nukestudio_12.0.toml deleted file mode 100644 index 4ce7f9b538d..00000000000 --- a/pype/settings/defaults/system_settings/launchers/nukestudio_12.0.toml +++ /dev/null @@ -1,7 +0,0 @@ -executable = "nukestudio12.0" -schema = "avalon-core:application-1.0" -application_dir = "nukestudio" -label = "NukeStudio 12.0" -ftrack_label = "NukeStudio" -icon ="nuke_icon" -ftrack_icon = '{}/app_icons/nuke.png' diff --git a/pype/settings/defaults/system_settings/launchers/nukex_10.0.toml b/pype/settings/defaults/system_settings/launchers/nukex_10.0.toml deleted file mode 100644 index 7dee22996d1..00000000000 --- a/pype/settings/defaults/system_settings/launchers/nukex_10.0.toml +++ /dev/null @@ -1,7 +0,0 @@ -executable = "nukex10.0" -schema = "avalon-core:application-1.0" -application_dir = "nuke" -label = "NukeX 10.0" -ftrack_label = "NukeX" -icon ="nuke_icon" -ftrack_icon = '{}/app_icons/nukex.png' diff --git a/pype/settings/defaults/system_settings/launchers/nukex_11.0.toml b/pype/settings/defaults/system_settings/launchers/nukex_11.0.toml deleted file mode 100644 index c2b4970a269..00000000000 --- a/pype/settings/defaults/system_settings/launchers/nukex_11.0.toml +++ /dev/null @@ -1,7 +0,0 @@ -executable = "nukex11.0" -schema = "avalon-core:application-1.0" -application_dir = "nuke" -label = "NukeX 11.2" -ftrack_label = "NukeX" -icon ="nuke_icon" -ftrack_icon = '{}/app_icons/nukex.png' diff --git a/pype/settings/defaults/system_settings/launchers/nukex_11.2.toml b/pype/settings/defaults/system_settings/launchers/nukex_11.2.toml deleted file mode 100644 index 3857b9995c3..00000000000 --- a/pype/settings/defaults/system_settings/launchers/nukex_11.2.toml +++ /dev/null @@ -1,7 +0,0 @@ -executable = "nukex11.2" -schema = "avalon-core:application-1.0" -application_dir = "nuke" -label = "NukeX 11.2" -ftrack_label = "NukeX" -icon ="nuke_icon" -ftrack_icon = '{}/app_icons/nukex.png' diff --git a/pype/settings/defaults/system_settings/launchers/nukex_11.3.toml b/pype/settings/defaults/system_settings/launchers/nukex_11.3.toml deleted file mode 100644 index 56428470ebc..00000000000 --- a/pype/settings/defaults/system_settings/launchers/nukex_11.3.toml +++ /dev/null @@ -1,7 +0,0 @@ -executable = "nukex11.3" -schema = "avalon-core:application-1.0" -application_dir = "nuke" -label = "NukeX 11.3" -ftrack_label = "NukeX" -icon ="nuke_icon" -ftrack_icon = '{}/app_icons/nukex.png' diff --git a/pype/settings/defaults/system_settings/launchers/nukex_12.0.toml b/pype/settings/defaults/system_settings/launchers/nukex_12.0.toml deleted file mode 100644 index 33d7fddb887..00000000000 --- a/pype/settings/defaults/system_settings/launchers/nukex_12.0.toml +++ /dev/null @@ -1,7 +0,0 @@ -executable = "nukex12.0" -schema = "avalon-core:application-1.0" -application_dir = "nuke" -label = "NukeX 12.0" -ftrack_label = "NukeX" -icon ="nuke_icon" -ftrack_icon = '{}/app_icons/nukex.png' diff --git a/pype/settings/defaults/system_settings/launchers/photoshop_2020.toml b/pype/settings/defaults/system_settings/launchers/photoshop_2020.toml deleted file mode 100644 index 117b668232c..00000000000 --- a/pype/settings/defaults/system_settings/launchers/photoshop_2020.toml +++ /dev/null @@ -1,8 +0,0 @@ -executable = "photoshop_2020" -schema = "avalon-core:application-1.0" -application_dir = "photoshop" -label = "Adobe Photoshop 2020" -icon ="photoshop_icon" -ftrack_label = "Photoshop" -ftrack_icon = '{}/app_icons/photoshop.png' -launch_hook = "pype/hooks/photoshop/prelaunch.py/PhotoshopPrelaunch" diff --git a/pype/settings/defaults/system_settings/launchers/premiere_2019.toml b/pype/settings/defaults/system_settings/launchers/premiere_2019.toml deleted file mode 100644 index f4c19c62cb6..00000000000 --- a/pype/settings/defaults/system_settings/launchers/premiere_2019.toml +++ /dev/null @@ -1,8 +0,0 @@ -executable = "premiere_pro_2019" -schema = "avalon-core:application-1.0" -application_dir = "premiere" -label = "Adobe Premiere Pro CC 2019" -icon ="premiere_icon" - -ftrack_label = "Premiere" -ftrack_icon = '{}/app_icons/premiere.png' diff --git a/pype/settings/defaults/system_settings/launchers/premiere_2020.toml b/pype/settings/defaults/system_settings/launchers/premiere_2020.toml deleted file mode 100644 index 4d721c898f7..00000000000 --- a/pype/settings/defaults/system_settings/launchers/premiere_2020.toml +++ /dev/null @@ -1,9 +0,0 @@ -executable = "premiere_pro_2020" -schema = "avalon-core:application-1.0" -application_dir = "premiere" -label = "Adobe Premiere Pro CC 2020" -launch_hook = "pype/hooks/premiere/prelaunch.py/PremierePrelaunch" -icon ="premiere_icon" - -ftrack_label = "Premiere" -ftrack_icon = '{}/app_icons/premiere.png' diff --git a/pype/settings/defaults/system_settings/launchers/python_2.toml b/pype/settings/defaults/system_settings/launchers/python_2.toml deleted file mode 100644 index e9e8dd78995..00000000000 --- a/pype/settings/defaults/system_settings/launchers/python_2.toml +++ /dev/null @@ -1,10 +0,0 @@ -schema = "avalon-core:application-1.0" -application_dir = "python" -executable = "python" -label = "Python 2" -ftrack_label = "Python" -icon ="python_icon" -ftrack_icon = '{}/app_icons/python.png' - -[environment] -CREATE_NEW_CONSOLE = "Yes" diff --git a/pype/settings/defaults/system_settings/launchers/python_3.toml b/pype/settings/defaults/system_settings/launchers/python_3.toml deleted file mode 100644 index 5cbd8b29438..00000000000 --- a/pype/settings/defaults/system_settings/launchers/python_3.toml +++ /dev/null @@ -1,10 +0,0 @@ -schema = "avalon-core:application-1.0" -application_dir = "python" -executable = "python3" -label = "Python 3" -ftrack_label = "Python" -icon ="python_icon" -ftrack_icon = '{}/app_icons/python.png' - -[environment] -CREATE_NEW_CONSOLE = "Yes" diff --git a/pype/settings/defaults/system_settings/launchers/resolve_16.toml b/pype/settings/defaults/system_settings/launchers/resolve_16.toml deleted file mode 100644 index 430fd1a6385..00000000000 --- a/pype/settings/defaults/system_settings/launchers/resolve_16.toml +++ /dev/null @@ -1,9 +0,0 @@ -executable = "resolve_16" -schema = "avalon-core:application-1.0" -application_dir = "resolve" -label = "BM DaVinci Resolve 16" -launch_hook = "pype/hooks/resolve/prelaunch.py/ResolvePrelaunch" -icon ="resolve" - -ftrack_label = "BM DaVinci Resolve" -ftrack_icon = '{}/app_icons/resolve.png' diff --git a/pype/settings/defaults/system_settings/launchers/shell.toml b/pype/settings/defaults/system_settings/launchers/shell.toml deleted file mode 100644 index 959ad392ea7..00000000000 --- a/pype/settings/defaults/system_settings/launchers/shell.toml +++ /dev/null @@ -1,7 +0,0 @@ -schema = "avalon-core:application-1.0" -application_dir = "shell" -executable = "shell" -label = "Shell" - -[environment] -CREATE_NEW_CONSOLE = "Yes" \ No newline at end of file diff --git a/pype/settings/defaults/system_settings/launchers/storyboardpro_7.toml b/pype/settings/defaults/system_settings/launchers/storyboardpro_7.toml deleted file mode 100644 index ce8e96a49dc..00000000000 --- a/pype/settings/defaults/system_settings/launchers/storyboardpro_7.toml +++ /dev/null @@ -1,8 +0,0 @@ -application_dir = "storyboardpro" -label = "Storyboard Pro 7" -ftrack_label = "Storyboard Pro" -schema = "avalon-core:application-1.0" -executable = "storyboardpro_7" -description = "" -icon ="storyboardpro_icon" -ftrack_icon = '{}/app_icons/storyboardpro.png' diff --git a/pype/settings/defaults/system_settings/launchers/unreal_4.24.toml b/pype/settings/defaults/system_settings/launchers/unreal_4.24.toml deleted file mode 100644 index 0a799e5dcb4..00000000000 --- a/pype/settings/defaults/system_settings/launchers/unreal_4.24.toml +++ /dev/null @@ -1,8 +0,0 @@ -executable = "unreal" -schema = "avalon-core:application-1.0" -application_dir = "unreal" -label = "Unreal Editor 4.24" -ftrack_label = "UnrealEditor" -icon ="ue4_icon" -launch_hook = "pype/hooks/unreal/unreal_prelaunch.py/UnrealPrelaunch" -ftrack_icon = '{}/app_icons/ue4.png' diff --git a/pype/settings/defaults/system_settings/launchers/windows/blender_2.80.bat b/pype/settings/defaults/system_settings/launchers/windows/blender_2.80.bat deleted file mode 100644 index 5b8a37356b5..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/blender_2.80.bat +++ /dev/null @@ -1,11 +0,0 @@ -set __app__="Blender" -set __exe__="C:\Program Files\Blender Foundation\Blender 2.80\blender.exe" -if not exist %__exe__% goto :missing_app - -start %__app__% %__exe__% %* - -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/blender_2.81.bat b/pype/settings/defaults/system_settings/launchers/windows/blender_2.81.bat deleted file mode 100644 index a900b18edaf..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/blender_2.81.bat +++ /dev/null @@ -1,11 +0,0 @@ -set __app__="Blender" -set __exe__="C:\Program Files\Blender Foundation\Blender 2.81\blender.exe" -if not exist %__exe__% goto :missing_app - -start %__app__% %__exe__% %* - -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/blender_2.82.bat b/pype/settings/defaults/system_settings/launchers/windows/blender_2.82.bat deleted file mode 100644 index 7105c1efe1c..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/blender_2.82.bat +++ /dev/null @@ -1,11 +0,0 @@ -set __app__="Blender" -set __exe__="C:\Program Files\Blender Foundation\Blender 2.82\blender.exe" --python-use-system-env -if not exist %__exe__% goto :missing_app - -start %__app__% %__exe__% %* - -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/blender_2.83.bat b/pype/settings/defaults/system_settings/launchers/windows/blender_2.83.bat deleted file mode 100644 index 671952f0d79..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/blender_2.83.bat +++ /dev/null @@ -1,11 +0,0 @@ -set __app__="Blender" -set __exe__="C:\Program Files\Blender Foundation\Blender 2.83\blender.exe" --python-use-system-env -if not exist %__exe__% goto :missing_app - -start %__app__% %__exe__% %* - -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/celaction_local.bat b/pype/settings/defaults/system_settings/launchers/windows/celaction_local.bat deleted file mode 100644 index 8f2171617ea..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/celaction_local.bat +++ /dev/null @@ -1,19 +0,0 @@ -set __app__="CelAction2D" -set __app_dir__="C:\Program Files (x86)\CelAction\" -set __exe__="C:\Program Files (x86)\CelAction\CelAction2D.exe" - -if not exist %__exe__% goto :missing_app - -pushd %__app_dir__% - -if "%PYPE_CELACTION_PROJECT_FILE%"=="" ( - start %__app__% %__exe__% %* -) else ( - start %__app__% %__exe__% "%PYPE_CELACTION_PROJECT_FILE%" %* -) - -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/celaction_publish.bat b/pype/settings/defaults/system_settings/launchers/windows/celaction_publish.bat deleted file mode 100644 index 77ec2ac24e7..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/celaction_publish.bat +++ /dev/null @@ -1,3 +0,0 @@ -echo %* - -%PYPE_PYTHON_EXE% "%PYPE_MODULE_ROOT%\pype\hosts\celaction\cli.py" %* diff --git a/pype/settings/defaults/system_settings/launchers/windows/harmony_17.bat b/pype/settings/defaults/system_settings/launchers/windows/harmony_17.bat deleted file mode 100644 index 08226508755..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/harmony_17.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off - -set __app__="Harmony 17" -set __exe__="C:/Program Files (x86)/Toon Boom Animation/Toon Boom Harmony 17 Premium/win64/bin/HarmonyPremium.exe" -if not exist %__exe__% goto :missing_app - -start %__app__% cmd.exe /k "python -c ^"import avalon.harmony;avalon.harmony.launch("%__exe__%")^"" - -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/houdini_16.bat b/pype/settings/defaults/system_settings/launchers/windows/houdini_16.bat deleted file mode 100644 index 018ba08b4c1..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/houdini_16.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off - -set __app__="Houdini 16.0" -set __exe__="C:\Program Files\Side Effects Software\Houdini 16.0.621\bin\houdini.exe" -if not exist %__exe__% goto :missing_app - -start %__app__% %__exe__% %* - -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/houdini_17.bat b/pype/settings/defaults/system_settings/launchers/windows/houdini_17.bat deleted file mode 100644 index 950a599623f..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/houdini_17.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off - -set __app__="Houdini 17.0" -set __exe__="C:\Program Files\Side Effects Software\Houdini 17.0.459\bin\houdini.exe" -if not exist %__exe__% goto :missing_app - -start %__app__% %__exe__% %* - -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/houdini_18.bat b/pype/settings/defaults/system_settings/launchers/windows/houdini_18.bat deleted file mode 100644 index 3d6b1ae258c..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/houdini_18.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off - -set __app__="Houdini 18.0" -set __exe__="C:\Program Files\Side Effects Software\Houdini 18.0.287\bin\houdini.exe" -if not exist %__exe__% goto :missing_app - -start %__app__% %__exe__% %* - -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/maya2016.bat b/pype/settings/defaults/system_settings/launchers/windows/maya2016.bat deleted file mode 100644 index 54f15cf269b..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/maya2016.bat +++ /dev/null @@ -1,17 +0,0 @@ -@echo off - -set __app__="Maya 2016" -set __exe__="C:\Program Files\Autodesk\Maya2016\bin\maya.exe" -if not exist %__exe__% goto :missing_app - -if "%AVALON_LAST_WORKFILE%"=="" ( - start %__app__% %__exe__% %* -) else ( - start %__app__% %__exe__% -file "%AVALON_LAST_WORKFILE%" %* -) - -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/maya2017.bat b/pype/settings/defaults/system_settings/launchers/windows/maya2017.bat deleted file mode 100644 index 5c2aeb495cd..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/maya2017.bat +++ /dev/null @@ -1,17 +0,0 @@ -@echo off - -set __app__="Maya 2017" -set __exe__="C:\Program Files\Autodesk\Maya2017\bin\maya.exe" -if not exist %__exe__% goto :missing_app - -if "%AVALON_LAST_WORKFILE%"=="" ( - start %__app__% %__exe__% %* -) else ( - start %__app__% %__exe__% -file "%AVALON_LAST_WORKFILE%" %* -) - -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/maya2018.bat b/pype/settings/defaults/system_settings/launchers/windows/maya2018.bat deleted file mode 100644 index 28cf776c779..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/maya2018.bat +++ /dev/null @@ -1,17 +0,0 @@ -@echo off - -set __app__="Maya 2018" -set __exe__="C:\Program Files\Autodesk\Maya2018\bin\maya.exe" -if not exist %__exe__% goto :missing_app - -if "%AVALON_LAST_WORKFILE%"=="" ( - start %__app__% %__exe__% %* -) else ( - start %__app__% %__exe__% -file "%AVALON_LAST_WORKFILE%" %* -) - -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/maya2019.bat b/pype/settings/defaults/system_settings/launchers/windows/maya2019.bat deleted file mode 100644 index 7e80dd25573..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/maya2019.bat +++ /dev/null @@ -1,17 +0,0 @@ -@echo off - -set __app__="Maya 2019" -set __exe__="C:\Program Files\Autodesk\Maya2019\bin\maya.exe" -if not exist %__exe__% goto :missing_app - -if "%AVALON_LAST_WORKFILE%"=="" ( - start %__app__% %__exe__% %* -) else ( - start %__app__% %__exe__% -file "%AVALON_LAST_WORKFILE%" %* -) - -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/maya2020.bat b/pype/settings/defaults/system_settings/launchers/windows/maya2020.bat deleted file mode 100644 index b2acb5df5aa..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/maya2020.bat +++ /dev/null @@ -1,17 +0,0 @@ -@echo off - -set __app__="Maya 2020" -set __exe__="C:\Program Files\Autodesk\maya2020\bin\maya.exe" -if not exist %__exe__% goto :missing_app - -if "%AVALON_LAST_WORKFILE%"=="" ( - start %__app__% %__exe__% %* -) else ( - start %__app__% %__exe__% -file "%AVALON_LAST_WORKFILE%" %* -) - -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/mayabatch2019.bat b/pype/settings/defaults/system_settings/launchers/windows/mayabatch2019.bat deleted file mode 100644 index ddd9b9b9564..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/mayabatch2019.bat +++ /dev/null @@ -1,14 +0,0 @@ -@echo off - -set __app__="Maya Batch 2019" -set __exe__="C:\Program Files\Autodesk\Maya2019\bin\mayabatch.exe" -if not exist %__exe__% goto :missing_app - -echo "running maya : %*" -%__exe__% %* -echo "done." -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/mayabatch2020.bat b/pype/settings/defaults/system_settings/launchers/windows/mayabatch2020.bat deleted file mode 100644 index b1cbc6dbb6e..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/mayabatch2020.bat +++ /dev/null @@ -1,14 +0,0 @@ -@echo off - -set __app__="Maya Batch 2020" -set __exe__="C:\Program Files\Autodesk\Maya2020\bin\mayabatch.exe" -if not exist %__exe__% goto :missing_app - -echo "running maya : %*" -%__exe__% %* -echo "done." -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/mayapy2016.bat b/pype/settings/defaults/system_settings/launchers/windows/mayapy2016.bat deleted file mode 100644 index 205991fd3d3..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/mayapy2016.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off - -set __app__="Mayapy 2016" -set __exe__="C:\Program Files\Autodesk\Maya2016\bin\mayapy.exe" -if not exist %__exe__% goto :missing_app - -call %__exe__% %* - -goto :eof - -:missing_app - echo ERROR: %__app__% not found at %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/mayapy2017.bat b/pype/settings/defaults/system_settings/launchers/windows/mayapy2017.bat deleted file mode 100644 index 14aacc5a7f9..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/mayapy2017.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off - -set __app__="Mayapy 2017" -set __exe__="C:\Program Files\Autodesk\Maya2017\bin\mayapy.exe" -if not exist %__exe__% goto :missing_app - -call %__exe__% %* - -goto :eof - -:missing_app - echo ERROR: %__app__% not found at %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/mayapy2018.bat b/pype/settings/defaults/system_settings/launchers/windows/mayapy2018.bat deleted file mode 100644 index c47c472f460..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/mayapy2018.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off - -set __app__="Mayapy 2018" -set __exe__="C:\Program Files\Autodesk\Maya2018\bin\mayapy.exe" -if not exist %__exe__% goto :missing_app - -call %__exe__% %* - -goto :eof - -:missing_app - echo ERROR: %__app__% not found at %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/mayapy2019.bat b/pype/settings/defaults/system_settings/launchers/windows/mayapy2019.bat deleted file mode 100644 index 73ca5b2d408..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/mayapy2019.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off - -set __app__="Mayapy 2019" -set __exe__="C:\Program Files\Autodesk\Maya2019\bin\mayapy.exe" -if not exist %__exe__% goto :missing_app - -call %__exe__% %* - -goto :eof - -:missing_app - echo ERROR: %__app__% not found at %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/mayapy2020.bat b/pype/settings/defaults/system_settings/launchers/windows/mayapy2020.bat deleted file mode 100644 index 770a03dcf55..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/mayapy2020.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off - -set __app__="Mayapy 2020" -set __exe__="C:\Program Files\Autodesk\Maya2020\bin\mayapy.exe" -if not exist %__exe__% goto :missing_app - -call %__exe__% %* - -goto :eofS - -:missing_app - echo ERROR: %__app__% not found at %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/nuke10.0.bat b/pype/settings/defaults/system_settings/launchers/windows/nuke10.0.bat deleted file mode 100644 index a47cbdfb207..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/nuke10.0.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off - -set __app__="Nuke10.0v4" -set __exe__="C:\Program Files\Nuke10.0v4\Nuke10.0.exe" -if not exist %__exe__% goto :missing_app - -start %__app__% %__exe__% %* - -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/nuke11.0.bat b/pype/settings/defaults/system_settings/launchers/windows/nuke11.0.bat deleted file mode 100644 index a374c5cf5bb..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/nuke11.0.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off - -set __app__="Nuke11.0v4" -set __exe__="C:\Program Files\Nuke11.0v4\Nuke11.0.exe" -if not exist %__exe__% goto :missing_app - -start %__app__% %__exe__% %* - -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/nuke11.2.bat b/pype/settings/defaults/system_settings/launchers/windows/nuke11.2.bat deleted file mode 100644 index 4c777ac28c4..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/nuke11.2.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off - -set __app__="Nuke11.2v3" -set __exe__="C:\Program Files\Nuke11.2v3\Nuke11.2.exe" -if not exist %__exe__% goto :missing_app - -start %__app__% %__exe__% %* - -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/nuke11.3.bat b/pype/settings/defaults/system_settings/launchers/windows/nuke11.3.bat deleted file mode 100644 index a023f5f46f9..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/nuke11.3.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off - -set __app__="Nuke11.3v1" -set __exe__="C:\Program Files\Nuke11.3v1\Nuke11.3.exe" -if not exist %__exe__% goto :missing_app - -start %__app__% %__exe__% %* - -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/nuke12.0.bat b/pype/settings/defaults/system_settings/launchers/windows/nuke12.0.bat deleted file mode 100644 index d8fb5772bbb..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/nuke12.0.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off - -set __app__="Nuke12.0v1" -set __exe__="C:\Program Files\Nuke12.0v1\Nuke12.0.exe" -if not exist %__exe__% goto :missing_app - -start %__app__% %__exe__% %* - -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/nukestudio10.0.bat b/pype/settings/defaults/system_settings/launchers/windows/nukestudio10.0.bat deleted file mode 100644 index 82f833667c9..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/nukestudio10.0.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off - -set __app__="NukeStudio10.0v4" -set __exe__="C:\Program Files\Nuke10.0v4\Nuke10.0.exe" --studio -if not exist %__exe__% goto :missing_app - -start %__app__% %__exe__% %* - -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/nukestudio11.0.bat b/pype/settings/defaults/system_settings/launchers/windows/nukestudio11.0.bat deleted file mode 100644 index b66797727e8..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/nukestudio11.0.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off - -set __app__="NukeStudio11.0v4" -set __exe__="C:\Program Files\Nuke11.0v4\Nuke11.0.exe" -studio -if not exist %__exe__% goto :missing_app - -start %__app__% %__exe__% %* - -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/nukestudio11.2.bat b/pype/settings/defaults/system_settings/launchers/windows/nukestudio11.2.bat deleted file mode 100644 index a653d816b49..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/nukestudio11.2.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off - -set __app__="NukeStudio11.2v3" -set __exe__="C:\Program Files\Nuke11.2v3\Nuke11.2.exe" -studio -if not exist %__exe__% goto :missing_app - -start %__app__% %__exe__% %* - -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/nukestudio11.3.bat b/pype/settings/defaults/system_settings/launchers/windows/nukestudio11.3.bat deleted file mode 100644 index 62c87188739..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/nukestudio11.3.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off - -set __app__="NukeStudio11.3v1" -set __exe__="C:\Program Files\Nuke11.3v1\Nuke11.3.exe" --studio -if not exist %__exe__% goto :missing_app - -start %__app__% %__exe__% %* - -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/nukestudio12.0.bat b/pype/settings/defaults/system_settings/launchers/windows/nukestudio12.0.bat deleted file mode 100644 index 488232bcbfa..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/nukestudio12.0.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off - -set __app__="NukeStudio12.0v1" -set __exe__="C:\Program Files\Nuke12.0v1\Nuke12.0.exe" --studio -if not exist %__exe__% goto :missing_app - -start %__app__% %__exe__% %* - -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/nukex10.0.bat b/pype/settings/defaults/system_settings/launchers/windows/nukex10.0.bat deleted file mode 100644 index 1759706a7b2..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/nukex10.0.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off - -set __app__="NukeX10.0v4" -set __exe__="C:\Program Files\Nuke10.0v4\Nuke10.0.exe" -nukex -if not exist %__exe__% goto :missing_app - -start %__app__% %__exe__% %* - -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/nukex11.0.bat b/pype/settings/defaults/system_settings/launchers/windows/nukex11.0.bat deleted file mode 100644 index b554a7b6fa7..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/nukex11.0.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off - -set __app__="NukeX11.0v4" -set __exe__="C:\Program Files\Nuke11.0v4\Nuke11.0.exe" --nukex -if not exist %__exe__% goto :missing_app - -start %__app__% %__exe__% %* - -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/nukex11.2.bat b/pype/settings/defaults/system_settings/launchers/windows/nukex11.2.bat deleted file mode 100644 index a4cb5dec5c3..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/nukex11.2.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off - -set __app__="NukeX11.2v3" -set __exe__="C:\Program Files\Nuke11.2v3\Nuke11.2.exe" --nukex -if not exist %__exe__% goto :missing_app - -start %__app__% %__exe__% %* - -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/nukex11.3.bat b/pype/settings/defaults/system_settings/launchers/windows/nukex11.3.bat deleted file mode 100644 index 490b55cf4c4..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/nukex11.3.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off - -set __app__="NukeX11.3v1" -set __exe__="C:\Program Files\Nuke11.3v1\Nuke11.3.exe" --nukex -if not exist %__exe__% goto :missing_app - -start %__app__% %__exe__% %* - -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/nukex12.0.bat b/pype/settings/defaults/system_settings/launchers/windows/nukex12.0.bat deleted file mode 100644 index 26adf0d3f15..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/nukex12.0.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off - -set __app__="NukeX12.0v1" -set __exe__="C:\Program Files\Nuke12.0v1\Nuke12.0.exe" --nukex -if not exist %__exe__% goto :missing_app - -start %__app__% %__exe__% %* - -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/photoshop_2020.bat b/pype/settings/defaults/system_settings/launchers/windows/photoshop_2020.bat deleted file mode 100644 index 6b90922ef6e..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/photoshop_2020.bat +++ /dev/null @@ -1,15 +0,0 @@ -@echo off - -set __app__="Photoshop 2020" -set __exe__="C:\Program Files\Adobe\Adobe Photoshop 2020\Photoshop.exe" -if not exist %__exe__% goto :missing_app - -start %__app__% cmd.exe /k "%PYPE_PYTHON_EXE% -c ^"import avalon.photoshop;avalon.photoshop.launch("%__exe__%")^"" - -goto :eof - -pause - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/premiere_pro_2019.bat b/pype/settings/defaults/system_settings/launchers/windows/premiere_pro_2019.bat deleted file mode 100644 index 4886737d2f2..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/premiere_pro_2019.bat +++ /dev/null @@ -1,14 +0,0 @@ -@echo off - -set __app__="Adobe Premiere Pro" -set __exe__="C:\Program Files\Adobe\Adobe Premiere Pro CC 2019\Adobe Premiere Pro.exe" -if not exist %__exe__% goto :missing_app - -python -u %PREMIERA_PATH%\init.py -start %__app__% %__exe__% %* - -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/premiere_pro_2020.bat b/pype/settings/defaults/system_settings/launchers/windows/premiere_pro_2020.bat deleted file mode 100644 index 14662d3be38..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/premiere_pro_2020.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off - -set __app__="Adobe Premiere Pro" -set __exe__="C:\Program Files\Adobe\Adobe Premiere Pro 2020\Adobe Premiere Pro.exe" -if not exist %__exe__% goto :missing_app - -start %__app__% %__exe__% %* - -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/python3.bat b/pype/settings/defaults/system_settings/launchers/windows/python3.bat deleted file mode 100644 index c7c116fe723..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/python3.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off - -set __app__="Python36" -set __exe__="C:\Python36\python.exe" -if not exist %__exe__% goto :missing_app - -start %__app__% %__exe__% %* - -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/resolve_16.bat b/pype/settings/defaults/system_settings/launchers/windows/resolve_16.bat deleted file mode 100644 index 1a5d964e6b1..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/resolve_16.bat +++ /dev/null @@ -1,17 +0,0 @@ -@echo off - -set __app__="Resolve" -set __appy__="Resolve Python Console" -set __exe__="C:/Program Files/Blackmagic Design/DaVinci Resolve/Resolve.exe" -set __py__="%PYTHON36_RESOLVE%/python.exe" - -if not exist %__exe__% goto :missing_app - -start %__app__% %__exe__% %* -IF "%RESOLVE_DEV%"=="True" (start %__appy__% %__py__% -i %PRE_PYTHON_SCRIPT%) - -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/shell.bat b/pype/settings/defaults/system_settings/launchers/windows/shell.bat deleted file mode 100644 index eb0895364f4..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/shell.bat +++ /dev/null @@ -1,2 +0,0 @@ -@echo off -start cmd diff --git a/pype/settings/defaults/system_settings/launchers/windows/storyboardpro_7.bat b/pype/settings/defaults/system_settings/launchers/windows/storyboardpro_7.bat deleted file mode 100644 index 122edac572a..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/storyboardpro_7.bat +++ /dev/null @@ -1,13 +0,0 @@ -@echo off - -set __app__="Storyboard Pro 7" -set __exe__="C:/Program Files (x86)/Toon Boom Animation/Toon Boom Storyboard Pro 7/win64/bin/StoryboardPro.exe" -if not exist %__exe__% goto :missing_app - -start %__app__% cmd.exe /k "python -c ^"import avalon.storyboardpro;avalon.storyboardpro.launch("%__exe__%")^"" - -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/launchers/windows/unreal.bat b/pype/settings/defaults/system_settings/launchers/windows/unreal.bat deleted file mode 100644 index 7771aaa5a56..00000000000 --- a/pype/settings/defaults/system_settings/launchers/windows/unreal.bat +++ /dev/null @@ -1,11 +0,0 @@ -set __app__="Unreal Editor" -set __exe__="%AVALON_CURRENT_UNREAL_ENGINE%\Engine\Binaries\Win64\UE4Editor.exe" -if not exist %__exe__% goto :missing_app - -start %__app__% %__exe__% %PYPE_UNREAL_PROJECT_FILE% %* - -goto :eof - -:missing_app - echo ERROR: %__app__% not found in %__exe__% - exit /B 1 diff --git a/pype/settings/defaults/system_settings/muster/templates_mapping.json b/pype/settings/defaults/system_settings/muster/templates_mapping.json deleted file mode 100644 index 0c091135151..00000000000 --- a/pype/settings/defaults/system_settings/muster/templates_mapping.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "3delight": 41, - "arnold": 46, - "arnold_sf": 57, - "gelato": 30, - "harware": 3, - "krakatoa": 51, - "file_layers": 7, - "mentalray": 2, - "mentalray_sf": 6, - "redshift": 55, - "renderman": 29, - "software": 1, - "software_sf": 5, - "turtle": 10, - "vector": 4, - "vray": 37, - "ffmpeg": 48 -} \ No newline at end of file diff --git a/pype/settings/defaults/system_settings/standalone_publish/families.json b/pype/settings/defaults/system_settings/standalone_publish/families.json deleted file mode 100644 index d05941cc261..00000000000 --- a/pype/settings/defaults/system_settings/standalone_publish/families.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "create_look": { - "name": "look", - "label": "Look", - "family": "look", - "icon": "paint-brush", - "defaults": ["Main"], - "help": "Shader connections defining shape look" - }, - "create_model": { - "name": "model", - "label": "Model", - "family": "model", - "icon": "cube", - "defaults": ["Main", "Proxy", "Sculpt"], - "help": "Polygonal static geometry" - }, - "create_workfile": { - "name": "workfile", - "label": "Workfile", - "family": "workfile", - "icon": "cube", - "defaults": ["Main"], - "help": "Working scene backup" - }, - "create_camera": { - "name": "camera", - "label": "Camera", - "family": "camera", - "icon": "video-camera", - "defaults": ["Main"], - "help": "Single baked camera" - }, - "create_pointcache": { - "name": "pointcache", - "label": "Pointcache", - "family": "pointcache", - "icon": "gears", - "defaults": ["Main"], - "help": "Alembic pointcache for animated data" - }, - "create_rig": { - "name": "rig", - "label": "Rig", - "family": "rig", - "icon": "wheelchair", - "defaults": ["Main"], - "help": "Artist-friendly rig with controls" - }, - "create_layout": { - "name": "layout", - "label": "Layout", - "family": "layout", - "icon": "cubes", - "defaults": ["Main"], - "help": "Simple scene for animators with camera" - }, - "create_plate": { - "name": "plate", - "label": "Plate", - "family": "plate", - "icon": "camera", - "defaults": ["Main", "BG", "Reference"], - "help": "Plates for compositors" - }, - "create_matchmove": { - "name": "matchmove", - "label": "Matchmove script", - "family": "matchmove", - "icon": "empire", - "defaults": ["Camera", "Object", "Mocap"], - "help": "Script exported from matchmoving application" - }, - "create_images": { - "name": "image", - "label": "Image file", - "family": "image", - "icon": "image", - "defaults": ["ConceptArt", "Reference", "Texture", "MattePaint"], - "help": "Holder for all kinds of image data" - }, - "create_editorial": { - "name": "editorial", - "label": "Editorial", - "family": "editorial", - "icon": "image", - "defaults": ["Main"], - "help": "Editorial files to generate shots." - } -} diff --git a/pype/settings/lib.py b/pype/settings/lib.py deleted file mode 100644 index 388557ca9bf..00000000000 --- a/pype/settings/lib.py +++ /dev/null @@ -1,258 +0,0 @@ -import os -import json -import logging -import copy - -log = logging.getLogger(__name__) - -# Metadata keys for work with studio and project overrides -OVERRIDEN_KEY = "__overriden_keys__" -# NOTE key popping not implemented yet -POP_KEY = "__pop_key__" - -# Folder where studio overrides are stored -STUDIO_OVERRIDES_PATH = os.environ["PYPE_PROJECT_CONFIGS"] - -# File where studio's system overrides are stored -SYSTEM_SETTINGS_KEY = "system_settings" -SYSTEM_SETTINGS_PATH = os.path.join( - STUDIO_OVERRIDES_PATH, SYSTEM_SETTINGS_KEY + ".json" -) - -# File where studio's default project overrides are stored -PROJECT_SETTINGS_KEY = "project_settings" -PROJECT_SETTINGS_FILENAME = PROJECT_SETTINGS_KEY + ".json" -PROJECT_SETTINGS_PATH = os.path.join( - STUDIO_OVERRIDES_PATH, PROJECT_SETTINGS_FILENAME -) - -PROJECT_ANATOMY_KEY = "project_anatomy" -PROJECT_ANATOMY_FILENAME = PROJECT_ANATOMY_KEY + ".json" -PROJECT_ANATOMY_PATH = os.path.join( - STUDIO_OVERRIDES_PATH, PROJECT_ANATOMY_FILENAME -) - -# Path to default settings -DEFAULTS_DIR = os.path.join(os.path.dirname(__file__), "defaults") - -# Variable where cache of default settings are stored -_DEFAULT_SETTINGS = None - - -def reset_default_settings(): - global _DEFAULT_SETTINGS - _DEFAULT_SETTINGS = None - - -def default_settings(): - global _DEFAULT_SETTINGS - if _DEFAULT_SETTINGS is None: - _DEFAULT_SETTINGS = load_jsons_from_dir(DEFAULTS_DIR) - return _DEFAULT_SETTINGS - - -def load_json(fpath): - # Load json data - with open(fpath, "r") as opened_file: - lines = opened_file.read().splitlines() - - # prepare json string - standard_json = "" - for line in lines: - # Remove all whitespace on both sides - line = line.strip() - - # Skip blank lines - if len(line) == 0: - continue - - standard_json += line - - # Check if has extra commas - extra_comma = False - if ",]" in standard_json or ",}" in standard_json: - extra_comma = True - standard_json = standard_json.replace(",]", "]") - standard_json = standard_json.replace(",}", "}") - - if extra_comma: - log.error("Extra comma in json file: \"{}\"".format(fpath)) - - # return empty dict if file is empty - if standard_json == "": - return {} - - # Try to parse string - try: - return json.loads(standard_json) - - except json.decoder.JSONDecodeError: - # Return empty dict if it is first time that decode error happened - return {} - - # Repreduce the exact same exception but traceback contains better - # information about position of error in the loaded json - try: - with open(fpath, "r") as opened_file: - json.load(opened_file) - - except json.decoder.JSONDecodeError: - log.warning( - "File has invalid json format \"{}\"".format(fpath), - exc_info=True - ) - - return {} - - -def subkey_merge(_dict, value, keys): - key = keys.pop(0) - if not keys: - _dict[key] = value - return _dict - - if key not in _dict: - _dict[key] = {} - _dict[key] = subkey_merge(_dict[key], value, keys) - - return _dict - - -def load_jsons_from_dir(path, *args, **kwargs): - output = {} - - path = os.path.normpath(path) - if not os.path.exists(path): - # TODO warning - return output - - sub_keys = list(kwargs.pop("subkeys", args)) - for sub_key in tuple(sub_keys): - _path = os.path.join(path, sub_key) - if not os.path.exists(_path): - break - - path = _path - sub_keys.pop(0) - - base_len = len(path) + 1 - for base, _directories, filenames in os.walk(path): - base_items_str = base[base_len:] - if not base_items_str: - base_items = [] - else: - base_items = base_items_str.split(os.path.sep) - - for filename in filenames: - basename, ext = os.path.splitext(filename) - if ext == ".json": - full_path = os.path.join(base, filename) - value = load_json(full_path) - dict_keys = base_items + [basename] - output = subkey_merge(output, value, dict_keys) - - for sub_key in sub_keys: - output = output[sub_key] - return output - - -def studio_system_settings(): - if os.path.exists(SYSTEM_SETTINGS_PATH): - return load_json(SYSTEM_SETTINGS_PATH) - return {} - - -def studio_project_settings(): - if os.path.exists(PROJECT_SETTINGS_PATH): - return load_json(PROJECT_SETTINGS_PATH) - return {} - - -def studio_project_anatomy(): - if os.path.exists(PROJECT_ANATOMY_PATH): - return load_json(PROJECT_ANATOMY_PATH) - return {} - - -def path_to_project_overrides(project_name): - return os.path.join( - STUDIO_OVERRIDES_PATH, - project_name, - PROJECT_SETTINGS_FILENAME - ) - - -def path_to_project_anatomy(project_name): - return os.path.join( - STUDIO_OVERRIDES_PATH, - project_name, - PROJECT_ANATOMY_FILENAME - ) - - -def project_settings_overrides(project_name): - if not project_name: - return {} - - path_to_json = path_to_project_overrides(project_name) - if not os.path.exists(path_to_json): - return {} - return load_json(path_to_json) - - -def project_anatomy_overrides(project_name): - if not project_name: - return {} - - path_to_json = path_to_project_anatomy(project_name) - if not os.path.exists(path_to_json): - return {} - return load_json(path_to_json) - - -def merge_overrides(global_dict, override_dict): - if OVERRIDEN_KEY in override_dict: - overriden_keys = set(override_dict.pop(OVERRIDEN_KEY)) - else: - overriden_keys = set() - - for key, value in override_dict.items(): - if value == POP_KEY: - global_dict.pop(key) - - elif ( - key in overriden_keys - or key not in global_dict - ): - global_dict[key] = value - - elif isinstance(value, dict) and isinstance(global_dict[key], dict): - global_dict[key] = merge_overrides(global_dict[key], value) - - else: - global_dict[key] = value - return global_dict - - -def apply_overrides(source_data, override_data): - if not override_data: - return source_data - _source_data = copy.deepcopy(source_data) - return merge_overrides(_source_data, override_data) - - -def system_settings(): - default_values = default_settings()[SYSTEM_SETTINGS_KEY] - studio_values = studio_system_settings() - return apply_overrides(default_values, studio_values) - - -def project_settings(project_name): - default_values = default_settings()[PROJECT_SETTINGS_KEY] - studio_values = studio_project_settings() - - studio_overrides = apply_overrides(default_values, studio_values) - - project_overrides = project_settings_overrides(project_name) - - return apply_overrides(studio_overrides, project_overrides) diff --git a/pype/tools/pyblish_pype/model.py b/pype/tools/pyblish_pype/model.py index 1482ff85b0b..3c9d4806ac2 100644 --- a/pype/tools/pyblish_pype/model.py +++ b/pype/tools/pyblish_pype/model.py @@ -1147,52 +1147,48 @@ def prepare_records(self, result, suspend_logs): return prepared_records - def append(self, record_items): - all_record_items = [] - for record_item in record_items: - record_type = record_item["type"] - - terminal_item_type = None - if record_type == "record": - for level, _type in self.level_to_record: - if level > record_item["levelno"]: - break - terminal_item_type = _type - - else: - terminal_item_type = record_type + def append(self, record_item): + record_type = record_item["type"] - icon_color = self.item_icon_colors.get(terminal_item_type) - icon_name = self.item_icon_name.get(record_type) + terminal_item_type = None + if record_type == "record": + for level, _type in self.level_to_record: + if level > record_item["levelno"]: + break + terminal_item_type = _type - top_item_icon = None - if icon_color and icon_name: - top_item_icon = QAwesomeIconFactory.icon(icon_name, icon_color) + else: + terminal_item_type = record_type - label = record_item["label"].split("\n")[0] + icon_color = self.item_icon_colors.get(terminal_item_type) + icon_name = self.item_icon_name.get(record_type) - top_item = QtGui.QStandardItem() - all_record_items.append(top_item) + top_item_icon = None + if icon_color and icon_name: + top_item_icon = QAwesomeIconFactory.icon(icon_name, icon_color) - detail_item = TerminalDetailItem(record_item) - top_item.appendRow(detail_item) + label = record_item["label"].split("\n")[0] - top_item.setData(TerminalLabelType, Roles.TypeRole) - top_item.setData(terminal_item_type, Roles.TerminalItemTypeRole) - top_item.setData(label, QtCore.Qt.DisplayRole) - top_item.setFlags( - QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled - ) + top_item = QtGui.QStandardItem() + top_item.setData(TerminalLabelType, Roles.TypeRole) + top_item.setData(terminal_item_type, Roles.TerminalItemTypeRole) + top_item.setData(label, QtCore.Qt.DisplayRole) + top_item.setFlags( + QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled + ) - if top_item_icon: - top_item.setData(top_item_icon, QtCore.Qt.DecorationRole) + if top_item_icon: + top_item.setData(top_item_icon, QtCore.Qt.DecorationRole) - detail_item.setData(TerminalDetailType, Roles.TypeRole) + self.appendRow(top_item) - self.invisibleRootItem().appendRows(all_record_items) + detail_item = TerminalDetailItem(record_item) + detail_item.setData(TerminalDetailType, Roles.TypeRole) + top_item.appendRow(detail_item) def update_with_result(self, result): - self.append(result["records"]) + for record in result["records"]: + self.append(record) class TerminalProxy(QtCore.QSortFilterProxyModel): diff --git a/pype/tools/pyblish_pype/window.py b/pype/tools/pyblish_pype/window.py index 2a037ba4bcb..76f31e2442e 100644 --- a/pype/tools/pyblish_pype/window.py +++ b/pype/tools/pyblish_pype/window.py @@ -1087,10 +1087,10 @@ def info(self, message): info.setText(message) # Include message in terminal - self.terminal_model.append([{ + self.terminal_model.append({ "label": message, "type": "info" - }]) + }) self.animation_info_msg.stop() self.animation_info_msg.start() diff --git a/pype/tools/settings/__init__.py b/pype/tools/settings/__init__.py deleted file mode 100644 index 7df121f06ea..00000000000 --- a/pype/tools/settings/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -from settings import style, MainWidget - - -__all__ = ( - "style", - "MainWidget" -) diff --git a/pype/tools/settings/__main__.py b/pype/tools/settings/__main__.py deleted file mode 100644 index 55a38b36041..00000000000 --- a/pype/tools/settings/__main__.py +++ /dev/null @@ -1,18 +0,0 @@ -import sys - -import settings -from Qt import QtWidgets, QtGui - - -if __name__ == "__main__": - app = QtWidgets.QApplication(sys.argv) - - stylesheet = settings.style.load_stylesheet() - app.setStyleSheet(stylesheet) - app.setWindowIcon(QtGui.QIcon(settings.style.app_icon_path())) - - develop = "-d" in sys.argv or "--develop" in sys.argv - widget = settings.MainWidget(develop) - widget.show() - - sys.exit(app.exec_()) diff --git a/pype/tools/settings/settings/README.md b/pype/tools/settings/settings/README.md deleted file mode 100644 index e8b7fcdb57f..00000000000 --- a/pype/tools/settings/settings/README.md +++ /dev/null @@ -1,387 +0,0 @@ -# Creating GUI schemas - -## Basic rules -- configurations does not define GUI, but GUI defines configurations! -- output is always json (yaml is not needed for anatomy templates anymore) -- GUI schema has multiple input types, all inputs are represented by a dictionary -- each input may have "input modifiers" (keys in dictionary) that are required or optional - - only required modifier for all input items is key `"type"` which says what type of item it is -- there are special keys across all inputs - - `"is_file"` - this key is for storing pype defaults in `pype` repo - - reasons of existence: developing new schemas does not require to create defaults manually - - key is validated, must be once in hierarchy else it won't be possible to store pype defaults - - `"is_group"` - define that all values under key in hierarchy will be overriden if any value is modified, this information is also stored to overrides - - this keys is not allowed for all inputs as they may have not reason for that - - key is validated, can be only once in hierarchy but is not required -- currently there are `system configurations` and `project configurations` - -## Inner schema -- GUI schemas are huge json files, to be able to split whole configuration into multiple schema there's type `schema` -- system configuration schemas are stored in `~/tools/settings/settings/gui_schemas/system_schema/` and project configurations in `~/tools/settings/settings/gui_schemas/projects_schema/` -- each schema name is filename of json file except extension (without ".json") - -### schema -- can have only key `"children"` which is list of strings, each string should represent another schema (order matters) string represebts name of the schema -- will just paste schemas from other schema file in order of "children" list - -``` -{ - "type": "schema", - "name": "my_schema_name" -} -``` - -## Basic Dictionary inputs -- these inputs wraps another inputs into {key: value} relation - -### dict-invisible -- this input gives ability to wrap another inputs but keep them in same widget without visible divider - - this is for example used as first input widget -- has required keys `"key"` and `"children"` - - "children" says what children inputs are underneath - - "key" is key under which will be stored value from it's children -- output is dictionary `{the "key": children values}` -- can't have `"is_group"` key set to True as it breaks visual override showing -``` -{ - "type": "dict-invisible", - "key": "global", - "children": [ - ...ITEMS... - ] -} -``` - -## dict -- this is another dictionary input wrapping more inputs but visually makes them different -- item may be used as widget (in `list` or `dict-modifiable`) - - in that case the only key modifier is `children` which is list of it's keys - - USAGE: e.g. List of dictionaries where each dictionary have same structure. -- item options if is not used as widget - - required keys are `"key"` under which will be stored and `"label"` which will be shown in GUI - - this input can be expandable - - that can be set with key `"expandable"` as `True`/`False` (Default: `True`) - - with key `"expanded"` as `True`/`False` can be set that is expanded when GUI is opened (Default: `False`) - - it is possible to add darker background with `"highlight_content"` (Default: `False`) - - darker background has limits of maximum applies after 3-4 nested highlighted items there is not difference in the color -``` -# Example -{ - "key": "applications", - "type": "dict", - "label": "Applications", - "expandable": true, - "highlight_content": true, - "is_group": true, - "is_file": true, - "children": [ - ...ITEMS... - ] -} - -# When used as widget -{ - "type": "list", - "key": "profiles", - "label": "Profiles", - "object_type": { - "type": "dict-item", - "children": [ - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, { - "key": "hosts", - "label": "Hosts", - "type": "list", - "object_type": "text" - } - ... - ] - } -} -``` - -## Inputs for setting any kind of value (`Pure` inputs) -- all these input must have defined `"key"` under which will be stored and `"label"` which will be shown next to input - - unless they are used in different types of inputs (later) "as widgets" in that case `"key"` and `"label"` are not required as there is not place where to set them - -### boolean -- simple checkbox, nothing more to set -``` -{ - "type": "boolean", - "key": "my_boolean_key", - "label": "Do you want to use Pype?" -} -``` - -### number -- number input, can be used for both integer and float - - key `"decimal"` defines how many decimal places will be used, 0 is for integer input (Default: `0`) - - key `"minimum"` as minimum allowed number to enter (Default: `-99999`) - - key `"maxium"` as maximum allowed number to enter (Default: `99999`) -``` -{ - "type": "number", - "key": "fps", - "label": "Frame rate (FPS)" - "decimal": 2, - "minimum": 1, - "maximum": 300000 -} -``` - -### text -- simple text input - - key `"multiline"` allows to enter multiple lines of text (Default: `False`) - - key `"placeholder"` allows to show text inside input when is empty (Default: `None`) - -``` -{ - "type": "text", - "key": "deadline_pool", - "label": "Deadline pool" -} -``` - -### path-input -- enhanced text input - - does not allow to enter backslash, is auto-converted to forward slash - - may be added another validations, like do not allow end path with slash -- this input is implemented to add additional features to text input -- this is meant to be used in proxy input `path-widget` - - DO NOT USE this input in schema please - -### raw-json -- a little bit enhanced text input for raw json -- has validations of json format - - empty value is invalid value, always must be at least `{}` of `[]` - -``` -{ - "type": "raw-json", - "key": "profiles", - "label": "Extract Review profiles" -} -``` - -### enum -- returns value of single on multiple items from predefined values -- multiselection can be allowed with setting key `"multiselection"` to `True` (Default: `False`) -- values are defined under value of key `"enum_items"` as list - - each item in list is simple dictionary where value is label and key is value which will be stored - - should be possible to enter single dictionary if order of items doesn't matter - -``` -{ - "key": "tags", - "label": "Tags", - "type": "enum", - "multiselection": true, - "enum_items": [ - {"burnin": "Add burnins"}, - {"ftrackreview": "Add to Ftrack"}, - {"delete": "Delete output"}, - {"slate-frame": "Add slate frame"}, - {"no-hnadles": "Skip handle frames"} - ] -} -``` - -## Inputs for setting value using Pure inputs -- these inputs also have required `"key"` and `"label"` -- they use Pure inputs "as widgets" - -### list -- output is list -- items can be added and removed -- items in list must be the same type -- type of items is defined with key `"object_type"` -- there are 2 possible ways how to set the type: - 1.) dictionary with item modifiers (`number` input has `minimum`, `maximum` and `decimals`) in that case item type must be set as value of `"type"` (example below) - 2.) item type name as string without modifiers (e.g. `text`) - -1.) with item modifiers -``` -{ - "type": "list", - "key": "exclude_ports", - "label": "Exclude ports", - "object_type": { - "type": "number", # number item type - "minimum": 1, # minimum modifier - "maximum": 65535 # maximum modifier - } -} -``` - -2.) without modifiers -``` -{ - "type": "list", - "key": "exclude_ports", - "label": "Exclude ports", - "object_type": "text" -} -``` - -### dict-modifiable -- one of dictionary inputs, this is only used as value input -- items in this input can be removed and added same way as in `list` input -- value items in dictionary must be the same type -- type of items is defined with key `"object_type"` -- there are 2 possible ways how to set the type: - 1.) dictionary with item modifiers (`number` input has `minimum`, `maximum` and `decimals`) in that case item type must be set as value of `"type"` (example below) - 2.) item type name as string without modifiers (e.g. `text`) -- this input can be expandable - - that can be set with key `"expandable"` as `True`/`False` (Default: `True`) - - with key `"expanded"` as `True`/`False` can be set that is expanded when GUI is opened (Default: `False`) - -1.) with item modifiers -``` -{ - "type": "dict-modifiable", - "object_type": { - "type": "number", - "minimum": 0, - "maximum": 300 - }, - "is_group": true, - "key": "templates_mapping", - "label": "Muster - Templates mapping", - "is_file": true -} -``` - -2.) without modifiers -``` -{ - "type": "dict-modifiable", - "object_type": "text", - "is_group": true, - "key": "templates_mapping", - "label": "Muster - Templates mapping", - "is_file": true -} -``` - -### path-widget -- input for paths, use `path-input` internally -- has 2 input modifiers `"multiplatform"` and `"multipath"` - - `"multiplatform"` - adds `"windows"`, `"linux"` and `"darwin"` path inputs result is dictionary - - `"multipath"` - it is possible to enter multiple paths - - if both are enabled result is dictionary with lists - -``` -{ - "type": "path-widget", - "key": "ffmpeg_path", - "label": "FFmpeg path", - "multiplatform": true, - "multipath": true -} -``` - -### list-strict -- input for strict number of items in list -- each child item can be different type with different possible modifiers -- it is possible to display them in horizontal or vertical layout - - key `"horizontal"` as `True`/`False` (Default: `True`) -- each child may have defined `"label"` which is shown next to input - - label does not reflect modifications or overrides (TODO) -- children item are defined under key `"object_types"` which is list of dictionaries - - key `"children"` is not used because is used for hierarchy validations in schema -- USAGE: For colors, transformations, etc. Custom number and different modifiers - give ability to define if color is HUE or RGB, 0-255, 0-1, 0-100 etc. - -``` -{ - "type": "list-strict", - "key": "color", - "label": "Color", - "object_types": [ - { - "label": "Red", - "type": "number", - "minimum": 0, - "maximum": 255, - "decimal": 0 - }, { - "label": "Green", - "type": "number", - "minimum": 0, - "maximum": 255, - "decimal": 0 - }, { - "label": "Blue", - "type": "number", - "minimum": 0, - "maximum": 255, - "decimal": 0 - }, { - "label": "Alpha", - "type": "number", - "minimum": 0, - "maximum": 1, - "decimal": 6 - } - ] -} -``` - - -## Noninteractive widgets -- have nothing to do with data - -### label -- add label with note or explanations -- it is possible to use html tags inside the label - -``` -{ - "type": "label", - "label": "RED LABEL: Normal label" -} -``` - -### splitter -- visual splitter of items (more divider than splitter) - -``` -{ - "type": "splitter" -} -``` - -## Proxy wrappers -- should wraps multiple inputs only visually -- these does not have `"key"` key and do not allow to have `"is_file"` or `"is_group"` modifiers enabled - -### form -- DEPRECATED - - may be used only in `dict` and `dict-invisible` where is currently used grid layout so form is not needed - - item is kept as still may be used in specific cases -- wraps inputs into form look layout -- should be used only for Pure inputs - -``` -{ - "type": "dict-form", - "children": [ - { - "type": "text", - "key": "deadline_department", - "label": "Deadline apartment" - }, { - "type": "number", - "key": "deadline_priority", - "label": "Deadline priority" - }, { - ... - } - ] -} -``` diff --git a/pype/tools/settings/settings/__init__.py b/pype/tools/settings/settings/__init__.py deleted file mode 100644 index 0c2fd6d4bb5..00000000000 --- a/pype/tools/settings/settings/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -from . import style -from .widgets import MainWidget - - -__all__ = ( - "style", - "MainWidget" -) diff --git a/pype/tools/settings/settings/gui_schemas/projects_schema/0_project_gui_schema.json b/pype/tools/settings/settings/gui_schemas/projects_schema/0_project_gui_schema.json deleted file mode 100644 index cf95bf4c458..00000000000 --- a/pype/tools/settings/settings/gui_schemas/projects_schema/0_project_gui_schema.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "key": "project", - "type": "dict-invisible", - "children": [ - { - "type": "anatomy", - "key": "project_anatomy", - "children": [ - { - "type": "anatomy_roots", - "key": "roots", - "is_file": true - }, { - "type": "anatomy_templates", - "key": "templates", - "is_file": true - } - ] - }, { - "type": "dict-invisible", - "key": "project_settings", - "children": [ - { - "type": "schema", - "name": "1_plugins_gui_schema" - } - ] - } - ] -} diff --git a/pype/tools/settings/settings/gui_schemas/projects_schema/1_plugins_gui_schema.json b/pype/tools/settings/settings/gui_schemas/projects_schema/1_plugins_gui_schema.json deleted file mode 100644 index 87912cfdc04..00000000000 --- a/pype/tools/settings/settings/gui_schemas/projects_schema/1_plugins_gui_schema.json +++ /dev/null @@ -1,614 +0,0 @@ -{ - "type": "dict", - "collapsable": true, - "key": "plugins", - "label": "Plugins", - "children": [{ - "type": "dict", - "collapsable": true, - "key": "celaction", - "label": "CelAction", - "children": [{ - "type": "dict", - "collapsable": true, - "key": "publish", - "label": "Publish plugins", - "is_file": true, - "children": [{ - "type": "dict", - "collapsable": true, - "checkbox_key": "enabled", - "key": "ExtractCelactionDeadline", - "label": "ExtractCelactionDeadline", - "is_group": true, - "children": [{ - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, { - "type": "text", - "key": "deadline_department", - "label": "Deadline apartment" - }, { - "type": "number", - "key": "deadline_priority", - "label": "Deadline priority" - }, { - "type": "text", - "key": "deadline_pool", - "label": "Deadline pool" - }, { - "type": "text", - "key": "deadline_pool_secondary", - "label": "Deadline pool (secondary)" - }, { - "type": "text", - "key": "deadline_group", - "label": "Deadline Group" - }, { - "type": "number", - "key": "deadline_chunk_size", - "label": "Deadline Chunk size" - }] - }] - }] - }, { - "type": "dict", - "collapsable": true, - "key": "ftrack", - "label": "Ftrack", - "children": [{ - "type": "dict", - "collapsable": true, - "key": "publish", - "label": "Publish plugins", - "is_file": true, - "children": [{ - "type": "dict", - "collapsable": true, - "checkbox_key": "enabled", - "key": "IntegrateFtrackNote", - "label": "IntegrateFtrackNote", - "is_group": true, - "children": [{ - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, { - "type": "text", - "key": "note_with_intent_template", - "label": "Note with intent template" - }, { - "type": "list", - "object_type": "text", - "key": "note_labels", - "label": "Note labels" - }] - }] - }] - }, { - "type": "dict", - "collapsable": true, - "key": "global", - "label": "Global", - "children": [{ - "type": "dict", - "collapsable": true, - "key": "publish", - "label": "Publish plugins", - "is_file": true, - "children": [{ - "type": "dict", - "collapsable": true, - "checkbox_key": "enabled", - "key": "IntegrateMasterVersion", - "label": "IntegrateMasterVersion", - "is_group": true, - "children": [{ - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }] - }, { - "type": "dict", - "collapsable": true, - "checkbox_key": "enabled", - "key": "ExtractJpegEXR", - "label": "ExtractJpegEXR", - "is_group": true, - "children": [{ - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, { - "type": "dict-invisible", - "key": "ffmpeg_args", - "children": [{ - "type": "list", - "object_type": "text", - "key": "input", - "label": "FFmpeg input arguments" - }, { - "type": "list", - "object_type": "text", - "key": "output", - "label": "FFmpeg output arguments" - }] - }] - }, { - "type": "dict", - "collapsable": true, - "key": "ExtractReview", - "label": "ExtractReview", - "checkbox_key": "enabled", - "is_group": true, - "children": [{ - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, { - "type": "list", - "key": "profiles", - "label": "Profiles", - "object_type": { - "type": "dict", - "children": [{ - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, { - "key": "hosts", - "label": "Hosts", - "type": "list", - "object_type": "text" - }, { - "type": "splitter" - }, { - "key": "outputs", - "label": "Output Definitions", - "type": "dict-modifiable", - "highlight_content": true, - "object_type": { - "type": "dict", - "children": [{ - "key": "ext", - "label": "Output extension", - "type": "text" - }, { - "key": "tags", - "label": "Tags", - "type": "enum", - "multiselection": true, - "enum_items": [{ - "burnin": "Add burnins" - }, - { - "ftrackreview": "Add to Ftrack" - }, - { - "delete": "Delete output" - }, - { - "slate-frame": "Add slate frame" - }, - { - "no-hnadles": "Skip handle frames" - } - ] - }, { - "key": "ffmpeg_args", - "label": "FFmpeg arguments", - "type": "dict", - "highlight_content": true, - "children": [{ - "key": "video_filters", - "label": "Video filters", - "type": "list", - "object_type": "text" - }, { - "type": "splitter" - }, { - "key": "audio_filters", - "label": "Audio filters", - "type": "list", - "object_type": "text" - }, { - "type": "splitter" - }, { - "key": "input", - "label": "Input arguments", - "type": "list", - "object_type": "text" - }, { - "type": "splitter" - }, { - "key": "output", - "label": "Output arguments", - "type": "list", - "object_type": "text" - }] - }, { - "key": "filter", - "label": "Additional output filtering", - "type": "dict", - "highlight_content": true, - "children": [{ - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }] - }] - } - }] - } - }] - }, { - "type": "dict", - "collapsable": true, - "key": "ExtractBurnin", - "label": "ExtractBurnin", - "checkbox_key": "enabled", - "is_group": true, - "children": [{ - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, { - "type": "dict", - "collapsable": true, - "key": "options", - "label": "Burnin formating options", - "children": [{ - "type": "number", - "key": "font_size", - "label": "Font size" - }, { - "type": "number", - "key": "opacity", - "label": "Font opacity" - }, { - "type": "number", - "key": "bg_opacity", - "label": "Background opacity" - }, { - "type": "number", - "key": "x_offset", - "label": "X Offset" - }, { - "type": "number", - "key": "y_offset", - "label": "Y Offset" - }, { - "type": "number", - "key": "bg_padding", - "label": "Padding aroung text" - }] - }, { - "type": "raw-json", - "key": "profiles", - "label": "Burnin profiles" - }] - }, { - "type": "dict", - "collapsable": true, - "key": "IntegrateAssetNew", - "label": "IntegrateAssetNew", - "is_group": true, - "children": [{ - "type": "raw-json", - "key": "template_name_profiles", - "label": "template_name_profiles" - }] - }, { - "type": "dict", - "collapsable": true, - "key": "ProcessSubmittedJobOnFarm", - "label": "ProcessSubmittedJobOnFarm", - "checkbox_key": "enabled", - "is_group": true, - "children": [{ - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, { - "type": "text", - "key": "deadline_department", - "label": "Deadline department" - }, { - "type": "text", - "key": "deadline_pool", - "label": "Deadline Pool" - }, { - "type": "text", - "key": "deadline_group", - "label": "Deadline Group" - }] - }] - }] - }, { - "type": "dict-invisible", - "collapsable": true, - "key": "maya", - "label": "Maya", - "children": [{ - "type": "dict", - "collapsable": true, - "key": "maya", - "label": "Maya", - "children": [ - - { - "type": "schema", - "name": "2_maya_capture" - }, - { - "type": "schema", - "name": "2_maya_plugins" - }, - { - "type": "schema", - "name": "2_maya_workfiles" - } - ] - }] - }, { - "type": "dict", - "collapsable": true, - "key": "nuke", - "label": "Nuke", - "children": [{ - "type": "dict", - "collapsable": true, - "key": "create", - "label": "Create plugins", - "is_file": true, - "children": [{ - "type": "dict", - "collapsable": false, - "key": "CreateWriteRender", - "label": "CreateWriteRender", - "is_group": true, - "children": [{ - "type": "text", - "key": "fpath_template", - "label": "Path template" - }] - }, { - "type": "dict", - "collapsable": false, - "key": "CreateWritePrerender", - "label": "CreateWritePrerender", - "is_group": true, - "children": [{ - "type": "text", - "key": "fpath_template", - "label": "Path template" - }] - }] - }, { - "type": "dict", - "collapsable": true, - "key": "publish", - "label": "Publish plugins", - "is_file": true, - "children": [{ - "type": "dict", - "collapsable": true, - "checkbox_key": "enabled", - "key": "ExtractThumbnail", - "label": "ExtractThumbnail", - "is_group": true, - "children": [{ - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, { - "type": "raw-json", - "key": "nodes", - "label": "Nodes" - }] - }, { - "type": "dict", - "collapsable": true, - "checkbox_key": "enabled", - "key": "ValidateNukeWriteKnobs", - "label": "ValidateNukeWriteKnobs", - "is_group": true, - "children": [{ - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, { - "type": "raw-json", - "key": "knobs", - "label": "Knobs" - }] - }, { - "type": "dict", - "collapsable": true, - "checkbox_key": "enabled", - "key": "ExtractReviewDataLut", - "label": "ExtractReviewDataLut", - "is_group": true, - "children": [{ - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }] - }, { - "type": "dict", - "collapsable": true, - "checkbox_key": "enabled", - "key": "ExtractReviewDataMov", - "label": "ExtractReviewDataMov", - "is_group": true, - "children": [{ - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, { - "type": "boolean", - "key": "viewer_lut_raw", - "label": "Viewer LUT raw" - }] - }, { - "type": "dict", - "collapsable": true, - "key": "ExtractSlateFrame", - "label": "ExtractSlateFrame", - "is_group": true, - "children": [{ - "type": "boolean", - "key": "viewer_lut_raw", - "label": "Viewer LUT raw" - }] - }, { - "type": "dict", - "collapsable": true, - "key": "NukeSubmitDeadline", - "label": "NukeSubmitDeadline", - "is_group": true, - "children": [{ - "type": "number", - "key": "deadline_priority", - "label": "deadline_priority" - }, { - "type": "text", - "key": "deadline_pool", - "label": "deadline_pool" - }, { - "type": "text", - "key": "deadline_pool_secondary", - "label": "deadline_pool_secondary" - }, { - "type": "number", - "key": "deadline_chunk_size", - "label": "deadline_chunk_size" - }] - }] - }, { - "type": "raw-json", - "key": "workfile_build", - "label": "Workfile Build logic", - "is_file": true - }] - }, { - "type": "dict", - "collapsable": true, - "key": "nukestudio", - "label": "NukeStudio", - "children": [{ - "type": "dict", - "collapsable": true, - "key": "publish", - "label": "Publish plugins", - "is_file": true, - "children": [{ - "type": "dict", - "collapsable": true, - "checkbox_key": "enabled", - "key": "CollectInstanceVersion", - "label": "Collect Instance Version", - "is_group": true, - "children": [{ - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }] - }, { - "type": "dict", - "collapsable": true, - "checkbox_key": "enabled", - "key": "ExtractReviewCutUpVideo", - "label": "Extract Review Cut Up Video", - "is_group": true, - "children": [{ - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, { - "type": "list", - "object_type": "text", - "key": "tags_addition", - "label": "Tags addition" - }] - }] - }] - }, { - "type": "dict", - "collapsable": true, - "key": "resolve", - "label": "DaVinci Resolve", - "children": [{ - "type": "dict", - "collapsable": true, - "key": "create", - "label": "Creator plugins", - "is_file": true, - "children": [{ - "type": "dict", - "collapsable": true, - "key": "CreateShotClip", - "label": "Create Shot Clip", - "is_group": true, - "children": [{ - "type": "text", - "key": "clipName", - "label": "Clip name template" - }, { - "type": "text", - "key": "folder", - "label": "Folder" - }, { - "type": "number", - "key": "steps", - "label": "Steps" - }] - } - - ] - }] - }, - { - "type": "dict", - "collapsable": true, - "key": "standalonepublisher", - "label": "Standalone Publisher", - "children": [{ - "type": "dict", - "collapsable": true, - "key": "publish", - "label": "Publish plugins", - "is_file": true, - "children": [{ - "type": "dict", - "collapsable": true, - "key": "ExtractThumbnailSP", - "label": "ExtractThumbnailSP", - "is_group": true, - "children": [{ - "type": "dict", - "collapsable": false, - "key": "ffmpeg_args", - "label": "ffmpeg_args", - "children": [{ - "type": "list", - "object_type": "text", - "key": "input", - "label": "input" - }, - { - "type": "list", - "object_type": "text", - "key": "output", - "label": "output" - } - ] - }] - }] - }] - } - ] -} diff --git a/pype/tools/settings/settings/gui_schemas/projects_schema/2_maya_capture.json b/pype/tools/settings/settings/gui_schemas/projects_schema/2_maya_capture.json deleted file mode 100644 index 836ad90404e..00000000000 --- a/pype/tools/settings/settings/gui_schemas/projects_schema/2_maya_capture.json +++ /dev/null @@ -1,522 +0,0 @@ -{ - "type": "dict", - "collapsable": true, - "key": "maya_capture", - "label": "Maya Capture settings", - "is_file": true, - "children": [ - { - "type": "dict-invisible", - "key": "Codec", - "label": "Codec", - "collapsable": false, - "children": [ - { - "type": "label", - "label": "Codec" - }, - { - "type": "text", - "key": "compression", - "label": "Compression type" - }, { - "type": "text", - "key": "format", - "label": "Data format" - }, { - "type": "number", - "key": "quality", - "label": "Quality", - "decimal": 0, - "minimum": 0, - "maximum": 100 - }, - - { - "type": "splitter" - } - ] - }, { - "type": "dict-invisible", - "key": "Display Options", - "label": "Display Options", - "collapsable": false, - "children": [ - { - "type": "label", - "label": "Display Options" - }, - { - "type": "list-strict", - "key": "background", - "label": "Background Color: ", - "object_types": [ - { - "label": "Red", - "type": "number", - "minimum": 0, - "maximum": 1, - "decimal": 3 - }, { - "label": "Green", - "type": "number", - "minimum": 0, - "maximum": 1, - "decimal": 3 - }, { - "label": "Blue", - "type": "number", - "minimum": 0, - "maximum": 1, - "decimal": 3 - } - ] - }, { - "type": "list-strict", - "key": "backgroundBottom", - "label": "Background Bottom: ", - "object_types": [ - { - "label": "Red", - "type": "number", - "minimum": 0, - "maximum": 1, - "decimal": 3 - }, { - "label": "Green", - "type": "number", - "minimum": 0, - "maximum": 1, - "decimal": 3 - }, { - "label": "Blue", - "type": "number", - "minimum": 0, - "maximum": 1, - "decimal": 3 - } - ] - }, { - "type": "list-strict", - "key": "backgroundTop", - "label": "Background Top: ", - "object_types": [ - { - "label": "Red", - "type": "number", - "minimum": 0, - "maximum": 1, - "decimal": 3 - }, { - "label": "Green", - "type": "number", - "minimum": 0, - "maximum": 1, - "decimal": 3 - }, { - "label": "Blue", - "type": "number", - "minimum": 0, - "maximum": 1, - "decimal": 3 - } - ] - }, { - "type": "boolean", - "key": "override_display", - "label": "Override display options" - } - ] - }, - { - "type": "splitter" - } , - { - "type": "dict-invisible", - "collapsable": true, - "key": "Generic", - "label": "Generic", - "children": [ - { - "type": "label", - "label": "Generic" - }, - { - "type": "boolean", - "key": "isolate_view", - "label": " Isolate view" - },{ - "type": "boolean", - "key": "off_screen", - "label": " Off Screen" - } - ] - },{ - "type": "dict-invisible", - "collapsable": true, - "key": "IO", - "label": "IO", - "children": [ - { - "type": "label", - "label": "IO" - }, - { - "type": "text", - "key": "name", - "label": "Name" - },{ - "type": "boolean", - "key": "open_finished", - "label": "Open finished" - },{ - "type": "boolean", - "key": "raw_frame_numbers", - "label": "Raw frame numbers" - },{ - "type": "list", - "key": "recent_playblasts", - "label": "Recent Playblasts", - "object_type": "text" - },{ - "type": "boolean", - "key": "save_file", - "label": "Save file" - } - ] - },{ - "type": "dict-invisible", - "collapsable": true, - "key": "PanZoom", - "label": "Pan Zoom", - "children": [ - { - "type": "boolean", - "key": "pan_zoom", - "label": " Pan Zoom" - } - ] - }, - { - "type": "splitter" - },{ - "type": "dict-invisible", - "collapsable": true, - "key": "Renderer", - "label": "Renderer", - "children": [ - - { - "type": "label", - "label": "Renderer" - }, - { - "type": "text", - "key": "rendererName", - "label": " Renderer name" - } - ] - },{ - "type": "dict-invisible", - "collapsable": true, - "key": "Resolution", - "label": "Resolution", - "children": [ - - { - "type": "splitter" - }, - { - "type": "label", - "label": "Resolution" - }, - { - "type": "number", - "key": "width", - "label": " Width", - "decimal": 0, - "minimum": 0, - "maximum": 99999 - },{ - "type": "number", - "key": "height", - "label": "Height", - "decimal": 0, - "minimum": 0, - "maximum": 99999 - },{ - "type": "number", - "key": "percent", - "label": "percent", - "decimal": 1, - "minimum": 0, - "maximum": 200 - },{ - "type": "text", - "key": "mode", - "label": "Mode" - } - ] - }, - { - "type": "splitter" - }, - { - "type": "dict-invisible", - "collapsable": true, - "key": "Time Range", - "label": "Time Range", - "children": [ - { - "type": "label", - "label": "Time Range" - }, - { - "type": "number", - "key": "start_frame", - "label": " Start frame", - "decimal": 0, - "minimum": 0, - "maximum": 999999 - },{ - "type": "number", - "key": "end_frame", - "label": "End frame", - "decimal": 0, - "minimum": 0, - "maximum": 999999 - },{ - "type": "text", - "key": "frame", - "label": "Frame" - },{ - "type": "text", - "key": "time", - "label": "Time" - } - ] - },{ - "type": "dict", - "collapsable": true, - "key": "Viewport Options", - "label": "Viewport Options", - "children": [ - { - "type": "boolean", - "key": "cameras", - "label": "cameras" - },{ - "type": "boolean", - "key": "clipGhosts", - "label": "clipGhosts" - },{ - "type": "boolean", - "key": "controlVertices", - "label": "controlVertices" - },{ - "type": "boolean", - "key": "deformers", - "label": "deformers" - },{ - "type": "boolean", - "key": "dimensions", - "label": "dimensions" - },{ - "type": "number", - "key": "displayLights", - "label": "displayLights", - "decimal": 0, - "minimum": 0, - "maximum": 10 - },{ - "type": "boolean", - "key": "dynamicConstraints", - "label": "dynamicConstraints" - },{ - "type": "boolean", - "key": "dynamics", - "label": "dynamics" - },{ - "type": "boolean", - "key": "fluids", - "label": "fluids" - },{ - "type": "boolean", - "key": "follicles", - "label": "follicles" - },{ - "type": "boolean", - "key": "gpuCacheDisplayFilter", - "label": "gpuCacheDisplayFilter" - },{ - "type": "boolean", - "key": "greasePencils", - "label": "greasePencils" - },{ - "type": "boolean", - "key": "grid", - "label": "grid" - },{ - "type": "boolean", - "key": "hairSystems", - "label": "hairSystems" - },{ - "type": "boolean", - "key": "handles", - "label": "handles" - },{ - "type": "boolean", - "key": "high_quality", - "label": "high_quality" - },{ - "type": "boolean", - "key": "hud", - "label": "hud" - },{ - "type": "boolean", - "key": "hulls", - "label": "hulls" - },{ - "type": "boolean", - "key": "ikHandles", - "label": "ikHandles" - },{ - "type": "boolean", - "key": "imagePlane", - "label": "imagePlane" - },{ - "type": "boolean", - "key": "joints", - "label": "joints" - },{ - "type": "boolean", - "key": "lights", - "label": "lights" - },{ - "type": "boolean", - "key": "locators", - "label": "locators" - },{ - "type": "boolean", - "key": "manipulators", - "label": "manipulators" - },{ - "type": "boolean", - "key": "motionTrails", - "label": "motionTrails" - },{ - "type": "boolean", - "key": "nCloths", - "label": "nCloths" - },{ - "type": "boolean", - "key": "nParticles", - "label": "nParticles" - },{ - "type": "boolean", - "key": "nRigids", - "label": "nRigids" - },{ - "type": "boolean", - "key": "nurbsCurves", - "label": "nurbsCurves" - },{ - "type": "boolean", - "key": "nurbsSurfaces", - "label": "nurbsSurfaces" - },{ - "type": "boolean", - "key": "override_viewport_options", - "label": "override_viewport_options" - },{ - "type": "boolean", - "key": "particleInstancers", - "label": "particleInstancers" - },{ - "type": "boolean", - "key": "pivots", - "label": "pivots" - },{ - "type": "boolean", - "key": "planes", - "label": "planes" - },{ - "type": "boolean", - "key": "pluginShapes", - "label": "pluginShapes" - },{ - "type": "boolean", - "key": "polymeshes", - "label": "polymeshes" - },{ - "type": "boolean", - "key": "shadows", - "label": "shadows" - },{ - "type": "boolean", - "key": "strokes", - "label": "strokes" - },{ - "type": "boolean", - "key": "subdivSurfaces", - "label": "subdivSurfaces" - },{ - "type": "boolean", - "key": "textures", - "label": "textures" - },{ - "type": "boolean", - "key": "twoSidedLighting", - "label": "twoSidedLighting" - } - ] - },{ - "type": "dict", - "collapsable": true, - "key": "Camera Options", - "label": "Camera Options", - "children": [ - { - "type": "boolean", - "key": "displayGateMask", - "label": "displayGateMask" - },{ - "type": "boolean", - "key": "displayResolution", - "label": "displayResolution" - },{ - "type": "boolean", - "key": "displayFilmGate", - "label": "displayFilmGate" - },{ - "type": "boolean", - "key": "displayFieldChart", - "label": "displayFieldChart" - },{ - "type": "boolean", - "key": "displaySafeAction", - "label": "displaySafeAction" - },{ - "type": "boolean", - "key": "displaySafeTitle", - "label": "displaySafeTitle" - },{ - "type": "boolean", - "key": "displayFilmPivot", - "label": "displayFilmPivot" - },{ - "type": "boolean", - "key": "displayFilmOrigin", - "label": "displayFilmOrigin" - },{ - "type": "number", - "key": "overscan", - "label": "overscan", - "decimal": 1, - "minimum": 0, - "maximum": 10 - } - ] - } - ] -} diff --git a/pype/tools/settings/settings/gui_schemas/projects_schema/2_maya_plugins.json b/pype/tools/settings/settings/gui_schemas/projects_schema/2_maya_plugins.json deleted file mode 100644 index 7ba9608610b..00000000000 --- a/pype/tools/settings/settings/gui_schemas/projects_schema/2_maya_plugins.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "type": "dict", - "collapsable": true, - "key": "publish", - "label": "Publish plugins", - "is_file": true, - "children": [ - { - "type": "dict", - "collapsable": true, - "key": "ValidateModelName", - "label": "Validate Model Name", - "checkbox_key": "enabled", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "label", - "label": "Path to material file defining list of material names to check. This is material name per line simple text file.
It will be checked against named group shader in your Validation regex.

For example:
^.*(?P=<shader>.+)_GEO

" - }, - { - "type": "path-widget", - "key": "material_file", - "label": "Material File", - "multiplatform": true, - "multipath": false - }, - { - "type": "text", - "key": "regex", - "label": "Validation regex" - } - ] - }, { - "type": "dict", - "collapsable": true, - "key": "ValidateAssemblyName", - "label": "Validate Assembly Name", - "checkbox_key": "enabled", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - } - ] - }, { - "type": "dict", - "collapsable": true, - "key": "ValidateShaderName", - "label": "ValidateShaderName", - "checkbox_key": "enabled", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, { - "type": "label", - "label": "Shader name regex can use named capture group asset to validate against current asset name.

Example:
^.*(?P=<asset>.+)_SHD

" - - }, { - "type": "text", - "key": "regex", - "label": "Validation regex" - } - ] - }, { - "type": "dict", - "collapsable": true, - "key": "ValidateMeshHasOverlappingUVs", - "label": "ValidateMeshHasOverlappingUVs", - "checkbox_key": "enabled", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - } - ] - } - ] - } diff --git a/pype/tools/settings/settings/gui_schemas/projects_schema/2_maya_workfiles.json b/pype/tools/settings/settings/gui_schemas/projects_schema/2_maya_workfiles.json deleted file mode 100644 index bae4d32abd7..00000000000 --- a/pype/tools/settings/settings/gui_schemas/projects_schema/2_maya_workfiles.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "type": "raw-json", - "key": "workfile_build", - "label": "Workfile Build logic", - "is_file": true -} diff --git a/pype/tools/settings/settings/gui_schemas/system_schema/0_system_gui_schema.json b/pype/tools/settings/settings/gui_schemas/system_schema/0_system_gui_schema.json deleted file mode 100644 index c5f229fc2f6..00000000000 --- a/pype/tools/settings/settings/gui_schemas/system_schema/0_system_gui_schema.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "key": "system", - "type": "dict-invisible", - "children": [ - { - "type": "dict-invisible", - "key": "global", - "children": [{ - "type": "schema", - "name": "1_intents_gui_schema" - },{ - "type": "schema", - "name": "1_modules_gui_schema" - }, { - "type": "schema", - "name": "1_applications_gui_schema" - }, { - "type": "schema", - "name": "1_tools_gui_schema" - }] - } - ] -} diff --git a/pype/tools/settings/settings/gui_schemas/system_schema/1_applications_gui_schema.json b/pype/tools/settings/settings/gui_schemas/system_schema/1_applications_gui_schema.json deleted file mode 100644 index 3427f982530..00000000000 --- a/pype/tools/settings/settings/gui_schemas/system_schema/1_applications_gui_schema.json +++ /dev/null @@ -1,139 +0,0 @@ -{ - "key": "applications", - "type": "dict", - "label": "Applications", - "collapsable": true, - "is_group": true, - "is_file": true, - "children": [ - { - "type": "boolean", - "key": "blender_2.80", - "label": "Blender 2.80" - }, { - "type": "boolean", - "key": "blender_2.81", - "label": "Blender 2.81" - }, { - "type": "boolean", - "key": "blender_2.82", - "label": "Blender 2.82" - }, { - "type": "boolean", - "key": "blender_2.83", - "label": "Blender 2.83" - }, { - "type": "boolean", - "key": "celaction_local", - "label": "Celaction Local" - }, { - "type": "boolean", - "key": "celaction_remote", - "label": "Celaction Remote" - }, { - "type": "boolean", - "key": "harmony_17", - "label": "Harmony 17" - }, { - "type": "boolean", - "key": "maya_2017", - "label": "Autodest Maya 2017" - }, { - "type": "boolean", - "key": "maya_2018", - "label": "Autodest Maya 2018" - }, { - "type": "boolean", - "key": "maya_2019", - "label": "Autodest Maya 2019" - }, { - "type": "boolean", - "key": "maya_2020", - "label": "Autodest Maya 2020" - }, { - "key": "nuke_10.0", - "type": "boolean", - "label": "Nuke 10.0" - }, { - "type": "boolean", - "key": "nuke_11.2", - "label": "Nuke 11.2" - }, { - "type": "boolean", - "key": "nuke_11.3", - "label": "Nuke 11.3" - }, { - "type": "boolean", - "key": "nuke_12.0", - "label": "Nuke 12.0" - }, { - "type": "boolean", - "key": "nukex_10.0", - "label": "NukeX 10.0" - }, { - "type": "boolean", - "key": "nukex_11.2", - "label": "NukeX 11.2" - }, { - "type": "boolean", - "key": "nukex_11.3", - "label": "NukeX 11.3" - }, { - "type": "boolean", - "key": "nukex_12.0", - "label": "NukeX 12.0" - }, { - "type": "boolean", - "key": "nukestudio_10.0", - "label": "NukeStudio 10.0" - }, { - "type": "boolean", - "key": "nukestudio_11.2", - "label": "NukeStudio 11.2" - }, { - "type": "boolean", - "key": "nukestudio_11.3", - "label": "NukeStudio 11.3" - }, { - "type": "boolean", - "key": "nukestudio_12.0", - "label": "NukeStudio 12.0" - }, { - "type": "boolean", - "key": "houdini_16", - "label": "Houdini 16" - }, { - "type": "boolean", - "key": "houdini_16.5", - "label": "Houdini 16.5" - }, { - "type": "boolean", - "key": "houdini_17", - "label": "Houdini 17" - }, { - "type": "boolean", - "key": "houdini_18", - "label": "Houdini 18" - }, { - "type": "boolean", - "key": "premiere_2019", - "label": "Premiere 2019" - }, { - "type": "boolean", - "key": "premiere_2020", - "label": "Premiere 2020" - }, { - "type": "boolean", - "key": "resolve_16", - "label": "BM DaVinci Resolve 16" - }, { - "type": "boolean", - "key": "storyboardpro_7", - "label": "Storyboard Pro 7" - }, { - "type": "boolean", - "key": "unreal_4.24", - "label": "Unreal Editor 4.24" - } - ] -} diff --git a/pype/tools/settings/settings/gui_schemas/system_schema/1_examples.json b/pype/tools/settings/settings/gui_schemas/system_schema/1_examples.json deleted file mode 100644 index dd0f7f20d1d..00000000000 --- a/pype/tools/settings/settings/gui_schemas/system_schema/1_examples.json +++ /dev/null @@ -1,391 +0,0 @@ -{ - "key": "example_dict", - "label": "Examples", - "type": "dict", - "is_file": true, - "children": [ - { - "key": "dict_wrapper", - "type": "dict-invisible", - "children": [ - { - "type": "enum", - "key": "test_enum_singleselection", - "label": "Enum Single Selection", - "enum_items": [ - {"value_1": "Label 1"}, - {"value_2": "Label 2"}, - {"value_3": "Label 3"} - ] - }, { - "type": "enum", - "key": "test_enum_multiselection", - "label": "Enum Multi Selection", - "multiselection": true, - "enum_items": [ - {"value_1": "Label 1"}, - {"value_2": "Label 2"}, - {"value_3": "Label 3"} - ] - }, { - "type": "boolean", - "key": "bool", - "label": "Boolean checkbox" - }, { - "type": "label", - "label": "NOTE: This is label" - }, { - "type": "splitter" - }, { - "type": "number", - "key": "integer", - "label": "Integer", - "decimal": 0, - "minimum": 0, - "maximum": 10 - }, { - "type": "number", - "key": "float", - "label": "Float (2 decimals)", - "decimal": 2, - "minimum": -10, - "maximum": -5 - }, { - "type": "text", - "key": "singleline_text", - "label": "Singleline text" - }, { - "type": "text", - "key": "multiline_text", - "label": "Multiline text", - "multiline": true - }, { - "type": "raw-json", - "key": "raw_json", - "label": "Raw json input" - }, { - "type": "list", - "key": "list_item_of_multiline_texts", - "label": "List of multiline texts", - "object_type": { - "type": "text", - "multiline": true - } - }, { - "type": "list", - "key": "list_item_of_floats", - "label": "List of floats", - "object_type": { - "type": "number", - "decimal": 3, - "minimum": 1000, - "maximum": 2000 - } - }, { - "type": "dict-modifiable", - "key": "modifiable_dict_of_integers", - "label": "Modifiable dict of integers", - "object_type": { - "type": "number", - "decimal": 0, - "minimum": 10, - "maximum": 100 - } - }, { - "type": "list-strict", - "key": "strict_list_labels_horizontal", - "label": "StrictList-labels-horizontal (color)", - "object_types": [ - { - "label": "Red", - "type": "number", - "minimum": 0, - "maximum": 255, - "decimal": 0 - }, { - "label": "Green", - "type": "number", - "minimum": 0, - "maximum": 255, - "decimal": 0 - }, { - "label": "Blue", - "type": "number", - "minimum": 0, - "maximum": 255, - "decimal": 0 - }, { - "label": "Alpha", - "type": "number", - "minimum": 0, - "maximum": 1, - "decimal": 6 - } - ] - }, { - "type": "list-strict", - "key": "strict_list_labels_vertical", - "label": "StrictList-labels-vertical (color)", - "horizontal": false, - "object_types": [ - { - "label": "Red", - "type": "number", - "minimum": 0, - "maximum": 255, - "decimal": 0 - }, { - "label": "Green", - "type": "number", - "minimum": 0, - "maximum": 255, - "decimal": 0 - }, { - "label": "Blue", - "type": "number", - "minimum": 0, - "maximum": 255, - "decimal": 0 - }, { - "label": "Alpha", - "type": "number", - "minimum": 0, - "maximum": 1, - "decimal": 6 - } - ] - }, { - "type": "list-strict", - "key": "strict_list_nolabels_horizontal", - "label": "StrictList-nolabels-horizontal (color)", - "object_types": [ - { - "type": "number", - "minimum": 0, - "maximum": 255, - "decimal": 0 - }, { - "type": "number", - "minimum": 0, - "maximum": 255, - "decimal": 0 - }, { - "type": "number", - "minimum": 0, - "maximum": 255, - "decimal": 0 - }, { - "type": "number", - "minimum": 0, - "maximum": 1, - "decimal": 6 - } - ] - }, { - "type": "list-strict", - "key": "strict_list_nolabels_vertical", - "label": "StrictList-nolabels-vertical (color)", - "horizontal": false, - "object_types": [ - { - "type": "number", - "minimum": 0, - "maximum": 255, - "decimal": 0 - }, { - "type": "number", - "minimum": 0, - "maximum": 255, - "decimal": 0 - }, { - "type": "number", - "minimum": 0, - "maximum": 255, - "decimal": 0 - }, { - "type": "number", - "minimum": 0, - "maximum": 1, - "decimal": 6 - } - ] - }, { - "type": "list", - "key": "dict_item", - "label": "DictItem in List", - "object_type": { - "type": "dict-item", - "children": [ - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, { - "key": "hosts", - "label": "Hosts", - "type": "list", - "object_type": "text" - } - ] - } - }, { - "type": "path-widget", - "key": "single_path_input", - "label": "Single path input", - "multiplatform": false, - "multipath": false - }, { - "type": "path-widget", - "key": "multi_path_input", - "label": "Multi path input", - "multiplatform": false, - "multipath": true - }, { - "type": "path-widget", - "key": "single_os_specific_path_input", - "label": "Single OS specific path input", - "multiplatform": true, - "multipath": false - }, { - "type": "path-widget", - "key": "multi_os_specific_path_input", - "label": "Multi OS specific path input", - "multiplatform": true, - "multipath": true - }, { - "key": "collapsable", - "type": "dict", - "label": "collapsable dictionary", - "collapsable": true, - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "_nothing", - "label": "Exmaple input" - } - ] - }, { - "key": "collapsable_expanded", - "type": "dict", - "label": "collapsable dictionary, expanded on creation", - "collapsable": true, - "collapsed": false, - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "_nothing", - "label": "Exmaple input" - } - ] - }, { - "key": "not_collapsable", - "type": "dict", - "label": "Not collapsable", - "collapsable": false, - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "_nothing", - "label": "Exmaple input" - } - ] - }, { - "key": "nested_dict_lvl1", - "type": "dict", - "label": "Nested dictionary (level 1)", - "children": [ - { - "key": "nested_dict_lvl2", - "type": "dict", - "label": "Nested dictionary (level 2)", - "is_group": true, - "children": [ - { - "key": "nested_dict_lvl3", - "type": "dict", - "label": "Nested dictionary (level 3)", - "children": [ - { - "type": "boolean", - "key": "_nothing", - "label": "Exmaple input" - } - ] - }, { - "key": "nested_dict_lvl3_2", - "type": "dict", - "label": "Nested dictionary (level 3) (2)", - "children": [ - { - "type": "text", - "key": "_nothing", - "label": "Exmaple input" - }, { - "type": "text", - "key": "_nothing2", - "label": "Exmaple input 2" - } - ] - } - ] - } - ] - }, { - "key": "form_examples", - "type": "dict", - "label": "Form examples", - "children": [ - { - "key": "inputs_without_form_example", - "type": "dict", - "label": "Inputs without form", - "children": [ - { - "type": "text", - "key": "_nothing_1", - "label": "Example label" - }, { - "type": "text", - "key": "_nothing_2", - "label": "Example label ####" - }, { - "type": "text", - "key": "_nothing_3", - "label": "Example label ########" - } - ] - }, { - "key": "inputs_with_form_example", - "type": "dict", - "label": "Inputs with form", - "children": [ - { - "type": "form", - "children": [ - { - "type": "text", - "key": "_nothing_1", - "label": "Example label" - }, { - "type": "text", - "key": "_nothing_2", - "label": "Example label ####" - }, { - "type": "text", - "key": "_nothing_3", - "label": "Example label ########" - } - ] - } - ] - } - ] - } - ] - } - ] -} diff --git a/pype/tools/settings/settings/gui_schemas/system_schema/1_intents_gui_schema.json b/pype/tools/settings/settings/gui_schemas/system_schema/1_intents_gui_schema.json deleted file mode 100644 index 7f71da26cd9..00000000000 --- a/pype/tools/settings/settings/gui_schemas/system_schema/1_intents_gui_schema.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "key": "general", - "type": "dict", - "label": "General", - "collapsable": true, - "is_file": true, - "children": [{ - "key": "studio_name", - "type": "text", - "label": "Studio Name" - },{ - "key": "studio_code", - "type": "text", - "label": "Studio Short Code" - } -]} diff --git a/pype/tools/settings/settings/gui_schemas/system_schema/1_modules_gui_schema.json b/pype/tools/settings/settings/gui_schemas/system_schema/1_modules_gui_schema.json deleted file mode 100644 index d78c11838ac..00000000000 --- a/pype/tools/settings/settings/gui_schemas/system_schema/1_modules_gui_schema.json +++ /dev/null @@ -1,283 +0,0 @@ -{ - "key": "modules", - "type": "dict", - "label": "Modules", - "collapsable": true, - "is_file": true, - "children": [{ - "type": "dict", - "key": "Avalon", - "label": "Avalon", - "collapsable": true, - "children": [ - { - "type": "text", - "key": "AVALON_MONGO", - "label": "Avalon Mongo URL" - }, - { - "type": "text", - "key": "AVALON_DB_DATA", - "label": "Avalon Mongo Data Location" - }, - { - "type": "text", - "key": "AVALON_THUMBNAIL_ROOT", - "label": "Thumbnail Storage Location" - } - ] - },{ - "type": "dict", - "key": "Ftrack", - "label": "Ftrack", - "collapsable": true, - "checkbox_key": "enabled", - "children": [{ - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "text", - "key": "ftrack_server", - "label": "Server" - }, - { - "type": "label", - "label": "Additional Ftrack paths" - }, - { - "type": "list", - "key": "ftrack_actions_path", - "label": "Action paths", - "object_type": "text" - }, - { - "type": "list", - "key": "ftrack_events_path", - "label": "Event paths", - "object_type": "text" - }, - { - "type": "label", - "label": "Ftrack event server advanced settings" - }, - { - "type": "text", - "key": "FTRACK_EVENTS_MONGO_DB", - "label": "Event Mongo DB" - }, - { - "type": "text", - "key": "FTRACK_EVENTS_MONGO_COL", - "label": "Events Mongo Collection" - }, - { - "type": "dict", - "key": "sync_to_avalon", - "label": "Sync to avalon", - "children": [{ - "type": "list", - "key": "statuses_name_change", - "label": "Status name change", - "object_type": { - "type": "text", - "multiline": false - } - }] - }, - { - "type": "dict-modifiable", - "key": "status_version_to_task", - "label": "Version to Task status mapping", - "object_type": "text" - }, - { - "type": "dict-modifiable", - "key": "status_update", - "label": "Status Updates", - "object_type": { - "type": "list", - "object_type": "text" - } - }, - { - "key": "intent", - "type": "dict-invisible", - "children": [ - { - "type": "dict-modifiable", - "object_type": "text", - "key": "items", - "label": "Intent Key/Label" - }, - { - "key": "default", - "type": "text", - "label": "Defautl Intent" - } - ] - } - ] - }, { - "type": "dict", - "key": "Rest Api", - "label": "Rest Api", - "collapsable": true, - "children": [{ - "type": "number", - "key": "default_port", - "label": "Default Port", - "minimum": 1, - "maximum": 65535 - }, - { - "type": "list", - "key": "exclude_ports", - "label": "Exclude ports", - "object_type": { - "type": "number", - "minimum": 1, - "maximum": 65535 - } - } - ] - }, { - "type": "dict", - "key": "Timers Manager", - "label": "Timers Manager", - "collapsable": true, - "checkbox_key": "enabled", - "children": [{ - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "number", - "decimal": 2, - "key": "full_time", - "label": "Max idle time" - }, { - "type": "number", - "decimal": 2, - "key": "message_time", - "label": "When dialog will show" - } - ] - }, { - "type": "dict", - "key": "Clockify", - "label": "Clockify", - "collapsable": true, - "checkbox_key": "enabled", - "children": [{ - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "text", - "key": "workspace_name", - "label": "Workspace name" - } - ] - }, { - "type": "dict", - "key": "Deadline", - "label": "Deadline", - "collapsable": true, - "checkbox_key": "enabled", - "children": [{ - "type": "boolean", - "key": "enabled", - "label": "Enabled" - },{ - "type": "text", - "key": "DEADLINE_REST_URL", - "label": "Deadline Resl URL" - }] - }, { - "type": "dict", - "key": "Muster", - "label": "Muster", - "collapsable": true, - "checkbox_key": "enabled", - "children": [{ - "type": "boolean", - "key": "enabled", - "label": "Enabled" - },{ - "type": "text", - "key": "MUSTER_REST_URL", - "label": "Muster Resl URL" - },{ - "type": "dict-modifiable", - "object_type": { - "type": "number", - "minimum": 0, - "maximum": 300 - }, - "is_group": true, - "key": "templates_mapping", - "label": "Templates mapping", - "is_file": true - }] - }, { - "type": "dict", - "key": "Logging", - "label": "Logging", - "collapsable": true, - "checkbox_key": "enabled", - "children": [{ - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }] - }, { - "type": "dict", - "key": "Adobe Communicator", - "label": "Adobe Communicator", - "collapsable": true, - "checkbox_key": "enabled", - "children": [{ - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }] - }, { - "type": "dict", - "key": "User setting", - "label": "User setting", - "collapsable": true, - "checkbox_key": "enabled", - "children": [{ - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }] - }, { - "type": "dict", - "key": "Standalone Publish", - "label": "Standalone Publish", - "collapsable": true, - "checkbox_key": "enabled", - "children": [{ - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }] - }, { - "type": "dict", - "key": "Idle Manager", - "label": "Idle Manager", - "collapsable": true, - "checkbox_key": "enabled", - "children": [{ - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }] - } - ] -} diff --git a/pype/tools/settings/settings/gui_schemas/system_schema/1_tools_gui_schema.json b/pype/tools/settings/settings/gui_schemas/system_schema/1_tools_gui_schema.json deleted file mode 100644 index 08b8d13d896..00000000000 --- a/pype/tools/settings/settings/gui_schemas/system_schema/1_tools_gui_schema.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "key": "tools", - "type": "dict", - "label": "Tools", - "collapsable": true, - "is_group": true, - "is_file": true, - "children": [ - { - "key": "mtoa_3.0.1", - "type": "boolean", - "label": "Arnold Maya 3.0.1" - }, { - "key": "mtoa_3.1.1", - "type": "boolean", - "label": "Arnold Maya 3.1.1" - }, { - "key": "mtoa_3.2.0", - "type": "boolean", - "label": "Arnold Maya 3.2.0" - }, { - "key": "yeti_2.1.2", - "type": "boolean", - "label": "Yeti 2.1.2" - } - ] -} diff --git a/pype/tools/settings/settings/style/__init__.py b/pype/tools/settings/settings/style/__init__.py deleted file mode 100644 index a8f202d97b1..00000000000 --- a/pype/tools/settings/settings/style/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -import os - - -def load_stylesheet(): - style_path = os.path.join(os.path.dirname(__file__), "style.css") - with open(style_path, "r") as style_file: - stylesheet = style_file.read() - return stylesheet - - -def app_icon_path(): - return os.path.join(os.path.dirname(__file__), "pype_icon.png") diff --git a/pype/tools/settings/settings/style/pype_icon.png b/pype/tools/settings/settings/style/pype_icon.png deleted file mode 100644 index bfacf6eeedc..00000000000 Binary files a/pype/tools/settings/settings/style/pype_icon.png and /dev/null differ diff --git a/pype/tools/settings/settings/style/style.css b/pype/tools/settings/settings/style/style.css deleted file mode 100644 index dcc7a5effe5..00000000000 --- a/pype/tools/settings/settings/style/style.css +++ /dev/null @@ -1,339 +0,0 @@ -QWidget { - color: #bfccd6; - background-color: #293742; - font-size: 12px; - border-radius: 0px; -} - -QMenu { - border: 1px solid #555555; - background-color: #1d272f; -} - -QMenu::item { - padding: 5px 10px 5px 10px; - border-left: 5px solid #313131; -} - -QMenu::item:selected { - border-left-color: #61839e; - background-color: #222d37; -} -QCheckBox { - spacing: 0px; -} -QCheckBox::indicator {} -QCheckBox::indicator:focus {} - -QLineEdit, QSpinBox, QDoubleSpinBox, QPlainTextEdit, QTextEdit { - border: 1px solid #aaaaaa; - border-radius: 3px; - background-color: #1d272f; -} - -QLineEdit:disabled, QSpinBox:disabled, QDoubleSpinBox:disabled, QPlainTextEdit:disabled, QTextEdit:disabled, QPushButton:disabled { - background-color: #4e6474; -} - -QLineEdit:focus, QSpinBox:focus, QDoubleSpinBox:focus, QPlainTextEdit:focus, QTextEdit:focus { - border: 1px solid #ffffff; -} - -QComboBox { - border: 1px solid #aaaaaa; - border-radius: 3px; - padding: 2px 2px 4px 4px; - background: #1d272f; -} - -QComboBox QAbstractItemView::item { - padding: 3px; -} - -QToolButton { - background: transparent; -} - -QLabel { - background: transparent; - color: #7390a5; -} -QLabel:hover {color: #839caf;} - -QLabel[state="studio"] {color: #bfccd6;} -QLabel[state="studio"]:hover {color: #ffffff;} -QLabel[state="modified"] {color: #137cbd;} -QLabel[state="modified"]:hover {color: #1798e8;} -QLabel[state="overriden-modified"] {color: #137cbd;} -QLabel[state="overriden-modified"]:hover {color: #1798e8;} -QLabel[state="overriden"] {color: #ff8c1a;} -QLabel[state="overriden"]:hover {color: #ffa64d;} -QLabel[state="invalid"] {color: #ad2e2e;} -QLabel[state="invalid"]:hover {color: #ad2e2e;} - - -QWidget[input-state="studio"] {border-color: #bfccd6;} -QWidget[input-state="modified"] {border-color: #137cbd;} -QWidget[input-state="overriden-modified"] {border-color: #137cbd;} -QWidget[input-state="overriden"] {border-color: #ff8c1a;} -QWidget[input-state="invalid"] {border-color: #ad2e2e;} - -QPushButton { - border: 1px solid #aaaaaa; - border-radius: 3px; - padding: 5px; -} -QPushButton:hover { - background-color: #31424e; -} -QPushButton[btn-type="tool-item"] { - border: 1px solid #bfccd6; - border-radius: 10px; -} - -QPushButton[btn-type="tool-item"]:hover { - border-color: #137cbd; - color: #137cbd; - background-color: transparent; -} - -QPushButton[btn-type="expand-toggle"] { - background: #1d272f; -} - -#GroupWidget { - border-bottom: 1px solid #1d272f; -} - -#ProjectListWidget QListView { - border: 1px solid #aaaaaa; - background: #1d272f; -} -#ProjectListWidget QLabel { - background: transparent; - font-weight: bold; -} - -#MultiSelectionComboBox { - font-size: 12px; -} - -#DictKey[state="studio"] {border-color: #bfccd6;} -#DictKey[state="modified"] {border-color: #137cbd;} -#DictKey[state="overriden"] {border-color: #00f;} -#DictKey[state="overriden-modified"] {border-color: #0f0;} -#DictKey[state="invalid"] {border-color: #ad2e2e;} - -#DictLabel { - font-weight: bold; -} - -#ContentWidget { - background-color: transparent; -} -#ContentWidget[content_state="hightlighted"] { - background-color: rgba(19, 26, 32, 15%); -} - -#SideLineWidget { - background-color: #31424e; - border-style: solid; - border-color: #3b4f5e; - border-left-width: 3px; - border-bottom-width: 0px; - border-right-width: 0px; - border-top-width: 0px; -} - -#SideLineWidget:hover { - border-color: #58768d; -} - -#SideLineWidget[state="child-studio"] {border-color: #455c6e;} -#SideLineWidget[state="child-studio"]:hover {border-color: #62839d;} - -#SideLineWidget[state="child-modified"] {border-color: #106aa2;} -#SideLineWidget[state="child-modified"]:hover {border-color: #137cbd;} - -#SideLineWidget[state="child-invalid"] {border-color: #ad2e2e;} -#SideLineWidget[state="child-invalid"]:hover {border-color: #c93636;} - -#SideLineWidget[state="child-overriden"] {border-color: #e67300;} -#SideLineWidget[state="child-overriden"]:hover {border-color: #ff8c1a;} - -#SideLineWidget[state="child-overriden-modified"] {border-color: #106aa2;} -#SideLineWidget[state="child-overriden-modified"]:hover {border-color: #137cbd;} - -#MainWidget { - background: #141a1f; -} - -#DictAsWidgetBody { - background: transparent; -} -#DictAsWidgetBody[show_borders="1"] { - border: 2px solid #cccccc; - border-radius: 5px; -} - -#SplitterItem { - background-color: #1d272f; -} - -QTabWidget::pane { - border-top-style: none; -} - -QTabBar { - background: transparent; -} - -QTabBar::tab { - border-top-left-radius: 4px; - border-top-right-radius: 4px; - padding: 5px; -} - -QTabBar::tab:selected { - background: #293742; - border-color: #9B9B9B; - border-bottom-color: #C2C7CB; -} - -QTabBar::tab:!selected { - margin-top: 2px; - background: #1d272f; -} - -QTabBar::tab:!selected:hover { - background: #3b4f5e; -} - - - -QTabBar::tab:first:selected { - margin-left: 0; -} - -QTabBar::tab:last:selected { - margin-right: 0; -} - -QTabBar::tab:only-one { - margin: 0; -} - -QScrollBar:horizontal { - height: 15px; - margin: 3px 15px 3px 15px; - border: 1px transparent #1d272f; - border-radius: 4px; - background-color: #1d272f; -} - -QScrollBar::handle:horizontal { - background-color: #61839e; - min-width: 5px; - border-radius: 4px; -} - -QScrollBar::add-line:horizontal { - margin: 0px 3px 0px 3px; - border-image: url(:/qss_icons/rc/right_arrow_disabled.png); - width: 10px; - height: 10px; - subcontrol-position: right; - subcontrol-origin: margin; -} - -QScrollBar::sub-line:horizontal { - margin: 0px 3px 0px 3px; - border-image: url(:/qss_icons/rc/left_arrow_disabled.png); - height: 10px; - width: 10px; - subcontrol-position: left; - subcontrol-origin: margin; -} - -QScrollBar::add-line:horizontal:hover,QScrollBar::add-line:horizontal:on { - border-image: url(:/qss_icons/rc/right_arrow.png); - height: 10px; - width: 10px; - subcontrol-position: right; - subcontrol-origin: margin; -} - -QScrollBar::sub-line:horizontal:hover, QScrollBar::sub-line:horizontal:on { - border-image: url(:/qss_icons/rc/left_arrow.png); - height: 10px; - width: 10px; - subcontrol-position: left; - subcontrol-origin: margin; -} - -QScrollBar::up-arrow:horizontal, QScrollBar::down-arrow:horizontal { - background: none; -} - -QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal { - background: none; -} - -QScrollBar:vertical { - background-color: #1d272f; - width: 15px; - margin: 15px 3px 15px 3px; - border: 1px transparent #1d272f; - border-radius: 4px; -} - -QScrollBar::handle:vertical { - background-color: #61839e; - min-height: 5px; - border-radius: 4px; -} - -QScrollBar::sub-line:vertical { - margin: 3px 0px 3px 0px; - border-image: url(:/qss_icons/rc/up_arrow_disabled.png); - height: 10px; - width: 10px; - subcontrol-position: top; - subcontrol-origin: margin; -} - -QScrollBar::add-line:vertical { - margin: 3px 0px 3px 0px; - border-image: url(:/qss_icons/rc/down_arrow_disabled.png); - height: 10px; - width: 10px; - subcontrol-position: bottom; - subcontrol-origin: margin; -} - -QScrollBar::sub-line:vertical:hover,QScrollBar::sub-line:vertical:on { - - border-image: url(:/qss_icons/rc/up_arrow.png); - height: 10px; - width: 10px; - subcontrol-position: top; - subcontrol-origin: margin; -} - - -QScrollBar::add-line:vertical:hover, QScrollBar::add-line:vertical:on { - border-image: url(:/qss_icons/rc/down_arrow.png); - height: 10px; - width: 10px; - subcontrol-position: bottom; - subcontrol-origin: margin; -} - -QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical { - background: none; -} - - -QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { - background: none; -} diff --git a/pype/tools/settings/settings/widgets/__init__.py b/pype/tools/settings/settings/widgets/__init__.py deleted file mode 100644 index 361fd9d23d9..00000000000 --- a/pype/tools/settings/settings/widgets/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -from .window import MainWidget -from . import item_types -from . import anatomy_types - -__all__ = [ - "MainWidget", - "item_types", - "anatomy_types" -] diff --git a/pype/tools/settings/settings/widgets/anatomy_types.py b/pype/tools/settings/settings/widgets/anatomy_types.py deleted file mode 100644 index e1a726187c8..00000000000 --- a/pype/tools/settings/settings/widgets/anatomy_types.py +++ /dev/null @@ -1,758 +0,0 @@ -from Qt import QtWidgets, QtCore -from .widgets import ExpandingWidget -from .item_types import ( - SettingObject, ModifiableDict, PathWidget, RawJsonWidget -) -from .lib import NOT_SET, TypeToKlass, CHILD_OFFSET, METADATA_KEY - - -class AnatomyWidget(QtWidgets.QWidget, SettingObject): - value_changed = QtCore.Signal(object) - template_keys = ( - "project[name]", - "project[code]", - "asset", - "task", - "subset", - "family", - "version", - "ext", - "representation" - ) - default_exmaple_data = { - "project": { - "name": "ProjectPype", - "code": "pp", - }, - "asset": "sq01sh0010", - "task": "compositing", - "subset": "renderMain", - "family": "render", - "version": 1, - "ext": ".png", - "representation": "png" - } - - def __init__( - self, input_data, parent, as_widget=False, label_widget=None - ): - if as_widget: - raise TypeError( - "`AnatomyWidget` does not allow to be used as widget." - ) - super(AnatomyWidget, self).__init__(parent) - self.setObjectName("AnatomyWidget") - - self.initial_attributes(input_data, parent, as_widget) - - self.key = input_data["key"] - - children_data = input_data["children"] - roots_input_data = {} - templates_input_data = {} - for child in children_data: - if child["type"] == "anatomy_roots": - roots_input_data = child - elif child["type"] == "anatomy_templates": - templates_input_data = child - - self.root_widget = RootsWidget(roots_input_data, self) - self.templates_widget = TemplatesWidget(templates_input_data, self) - - self.setAttribute(QtCore.Qt.WA_StyledBackground) - - body_widget = ExpandingWidget("Anatomy", self) - - layout = QtWidgets.QVBoxLayout(self) - layout.setContentsMargins(0, 0, 0, 0) - layout.setSpacing(0) - layout.addWidget(body_widget) - - content_widget = QtWidgets.QWidget(body_widget) - content_layout = QtWidgets.QVBoxLayout(content_widget) - content_layout.setContentsMargins(CHILD_OFFSET, 5, 0, 0) - content_layout.setSpacing(5) - - content_layout.addWidget(self.root_widget) - content_layout.addWidget(self.templates_widget) - - body_widget.set_content_widget(content_widget) - - self.body_widget = body_widget - self.label_widget = body_widget.label_widget - - self.root_widget.value_changed.connect(self._on_value_change) - self.templates_widget.value_changed.connect(self._on_value_change) - - def update_default_values(self, parent_values): - self._state = None - self._child_state = None - - if isinstance(parent_values, dict): - value = parent_values.get(self.key, NOT_SET) - else: - value = NOT_SET - - self.root_widget.update_default_values(value) - self.templates_widget.update_default_values(value) - - def update_studio_values(self, parent_values): - self._state = None - self._child_state = None - - if isinstance(parent_values, dict): - value = parent_values.get(self.key, NOT_SET) - else: - value = NOT_SET - - self.root_widget.update_studio_values(value) - self.templates_widget.update_studio_values(value) - - def apply_overrides(self, parent_values): - # Make sure this is set to False - self._state = None - self._child_state = None - - value = NOT_SET - if parent_values is not NOT_SET: - value = parent_values.get(self.key, value) - - self.root_widget.apply_overrides(value) - self.templates_widget.apply_overrides(value) - - def set_value(self, value): - raise TypeError("AnatomyWidget does not allow to use `set_value`") - - def _on_value_change(self, item=None): - if self.ignore_value_changes: - return - - self.hierarchical_style_update() - - self.value_changed.emit(self) - - def update_style(self, is_overriden=None): - child_has_studio_override = self.child_has_studio_override - child_modified = self.child_modified - child_invalid = self.child_invalid - child_state = self.style_state( - child_has_studio_override, - child_invalid, - self.child_overriden, - child_modified - ) - if child_state: - child_state = "child-{}".format(child_state) - - if child_state != self._child_state: - self.body_widget.side_line_widget.setProperty("state", child_state) - self.body_widget.side_line_widget.style().polish( - self.body_widget.side_line_widget - ) - self._child_state = child_state - - def hierarchical_style_update(self): - self.root_widget.hierarchical_style_update() - self.templates_widget.hierarchical_style_update() - self.update_style() - - @property - def child_has_studio_override(self): - return ( - self.root_widget.child_has_studio_override - or self.templates_widget.child_has_studio_override - ) - - @property - def child_modified(self): - return ( - self.root_widget.child_modified - or self.templates_widget.child_modified - ) - - @property - def child_overriden(self): - return ( - self.root_widget.child_overriden - or self.templates_widget.child_overriden - ) - - @property - def child_invalid(self): - return ( - self.root_widget.child_invalid - or self.templates_widget.child_invalid - ) - - def set_as_overriden(self): - self.root_widget.set_as_overriden() - self.templates_widget.set_as_overriden() - - def remove_overrides(self): - self.root_widget.remove_overrides() - self.templates_widget.remove_overrides() - - def reset_to_pype_default(self): - self.root_widget.reset_to_pype_default() - self.templates_widget.reset_to_pype_default() - - def set_studio_default(self): - self.root_widget.set_studio_default() - self.templates_widget.set_studio_default() - - def discard_changes(self): - self.root_widget.discard_changes() - self.templates_widget.discard_changes() - - def overrides(self): - if self.child_overriden: - return self.config_value(), True - return NOT_SET, False - - def item_value(self): - output = {} - output.update(self.root_widget.config_value()) - output.update(self.templates_widget.config_value()) - return output - - def studio_overrides(self): - if ( - self.root_widget.child_has_studio_override - or self.templates_widget.child_has_studio_override - ): - groups = [self.root_widget.key, self.templates_widget.key] - value = self.config_value() - value[self.key][METADATA_KEY] = {"groups": groups} - return value, True - return NOT_SET, False - - def config_value(self): - return {self.key: self.item_value()} - - -class RootsWidget(QtWidgets.QWidget, SettingObject): - value_changed = QtCore.Signal(object) - - def __init__(self, input_data, parent): - super(RootsWidget, self).__init__(parent) - self.setObjectName("RootsWidget") - - input_data["is_group"] = True - self.initial_attributes(input_data, parent, False) - - self.key = input_data["key"] - - self._multiroot_state = None - self.default_is_multiroot = False - self.studio_is_multiroot = False - self.was_multiroot = NOT_SET - - checkbox_widget = QtWidgets.QWidget(self) - multiroot_label = QtWidgets.QLabel( - "Use multiple roots", checkbox_widget - ) - multiroot_checkbox = QtWidgets.QCheckBox(checkbox_widget) - - checkbox_layout = QtWidgets.QHBoxLayout(checkbox_widget) - checkbox_layout.addWidget(multiroot_label, 0) - checkbox_layout.addWidget(multiroot_checkbox, 1) - - body_widget = ExpandingWidget("Roots", self) - content_widget = QtWidgets.QWidget(body_widget) - - path_widget_data = { - "key": self.key, - "multipath": False, - "multiplatform": True - } - singleroot_widget = PathWidget( - path_widget_data, self, - as_widget=True, parent_widget=content_widget - ) - multiroot_data = { - "key": self.key, - "expandable": False, - "object_type": { - "type": "path-widget", - "multiplatform": True - } - } - multiroot_widget = ModifiableDict( - multiroot_data, self, - as_widget=True, parent_widget=content_widget - ) - - content_layout = QtWidgets.QVBoxLayout(content_widget) - content_layout.setContentsMargins(0, 0, 0, 0) - content_layout.addWidget(checkbox_widget) - content_layout.addWidget(singleroot_widget) - content_layout.addWidget(multiroot_widget) - - body_widget.set_content_widget(content_widget) - self.label_widget = body_widget.label_widget - - main_layout = QtWidgets.QVBoxLayout(self) - main_layout.setContentsMargins(0, 0, 0, 0) - main_layout.addWidget(body_widget) - - self.body_widget = body_widget - self.multiroot_label = multiroot_label - self.multiroot_checkbox = multiroot_checkbox - self.singleroot_widget = singleroot_widget - self.multiroot_widget = multiroot_widget - - multiroot_checkbox.stateChanged.connect(self._on_multiroot_checkbox) - singleroot_widget.value_changed.connect(self._on_value_change) - multiroot_widget.value_changed.connect(self._on_value_change) - - self._on_multiroot_checkbox() - - @property - def is_multiroot(self): - return self.multiroot_checkbox.isChecked() - - def update_default_values(self, parent_values): - self._state = None - self._multiroot_state = None - self._is_modified = False - - if isinstance(parent_values, dict): - value = parent_values.get(self.key, NOT_SET) - else: - value = NOT_SET - - is_multiroot = False - if isinstance(value, dict): - for _value in value.values(): - if isinstance(_value, dict): - is_multiroot = True - break - - self.default_is_multiroot = is_multiroot - self.was_multiroot = is_multiroot - self.set_multiroot(is_multiroot) - - self._has_studio_override = False - self._had_studio_override = False - if is_multiroot: - for _value in value.values(): - singleroot_value = _value - break - - multiroot_value = value - else: - singleroot_value = value - multiroot_value = {"": value} - - self.singleroot_widget.update_default_values(singleroot_value) - self.multiroot_widget.update_default_values(multiroot_value) - - def update_studio_values(self, parent_values): - self._state = None - self._multiroot_state = None - self._is_modified = False - - if isinstance(parent_values, dict): - value = parent_values.get(self.key, NOT_SET) - else: - value = NOT_SET - - if value is NOT_SET: - is_multiroot = self.default_is_multiroot - self.studio_is_multiroot = NOT_SET - self._has_studio_override = False - self._had_studio_override = False - else: - is_multiroot = False - if isinstance(value, dict): - for _value in value.values(): - if isinstance(_value, dict): - is_multiroot = True - break - self.studio_is_multiroot = is_multiroot - self._has_studio_override = True - self._had_studio_override = True - - self.was_multiroot = is_multiroot - self.set_multiroot(is_multiroot) - - if is_multiroot: - self.multiroot_widget.update_studio_values(value) - else: - self.singleroot_widget.update_studio_values(value) - - def apply_overrides(self, parent_values): - # Make sure this is set to False - self._state = None - self._multiroot_state = None - self._is_modified = False - - value = NOT_SET - if parent_values is not NOT_SET: - value = parent_values.get(self.key, value) - - if value is NOT_SET: - is_multiroot = self.studio_is_multiroot - if is_multiroot is NOT_SET: - is_multiroot = self.default_is_multiroot - else: - is_multiroot = False - if isinstance(value, dict): - for _value in value.values(): - if isinstance(_value, dict): - is_multiroot = True - break - - self.was_multiroot = is_multiroot - self.set_multiroot(is_multiroot) - - if is_multiroot: - self._is_overriden = value is not NOT_SET - self._was_overriden = bool(self._is_overriden) - self.multiroot_widget.apply_overrides(value) - else: - self._is_overriden = value is not NOT_SET - self._was_overriden = bool(self._is_overriden) - self.singleroot_widget.apply_overrides(value) - - def hierarchical_style_update(self): - self.singleroot_widget.hierarchical_style_update() - self.multiroot_widget.hierarchical_style_update() - self.update_style() - - def update_style(self): - multiroot_state = self.style_state( - self.has_studio_override, - False, - False, - self.was_multiroot != self.is_multiroot - ) - if multiroot_state != self._multiroot_state: - self.multiroot_label.setProperty("state", multiroot_state) - self.multiroot_label.style().polish(self.multiroot_label) - self._multiroot_state = multiroot_state - - state = self.style_state( - self.has_studio_override, - self.child_invalid, - self.is_overriden, - self.is_modified - ) - if self._state == state: - return - - if state: - child_state = "child-{}".format(state) - else: - child_state = "" - - self.body_widget.side_line_widget.setProperty("state", child_state) - self.body_widget.side_line_widget.style().polish( - self.body_widget.side_line_widget - ) - - self.label_widget.setProperty("state", state) - self.label_widget.style().polish(self.label_widget) - - self._state = state - - def _on_multiroot_checkbox(self): - self.set_multiroot() - - def _on_value_change(self, item=None): - if self.ignore_value_changes: - return - - if item is not None and ( - (self.is_multiroot and item != self.multiroot_widget) - or (not self.is_multiroot and item != self.singleroot_widget) - ): - return - - if self.is_group and self.is_overidable: - self._is_overriden = True - - self._is_modified = ( - self.was_multiroot != self.is_multiroot - or self.child_modified - ) - - self.update_style() - - self.value_changed.emit(self) - - def _from_single_to_multi(self): - single_value = self.singleroot_widget.item_value() - mutli_value = self.multiroot_widget.item_value() - first_key = None - for key in mutli_value.keys(): - first_key = key - break - - if first_key is None: - first_key = "" - - mutli_value[first_key] = single_value - - self.multiroot_widget.set_value(mutli_value) - - def _from_multi_to_single(self): - mutli_value = self.multiroot_widget.all_item_values() - for value in mutli_value.values(): - single_value = value - break - - self.singleroot_widget.set_value(single_value) - - def set_multiroot(self, is_multiroot=None): - if is_multiroot is None: - is_multiroot = self.is_multiroot - if is_multiroot: - self._from_single_to_multi() - else: - self._from_multi_to_single() - - if is_multiroot != self.is_multiroot: - self.multiroot_checkbox.setChecked(is_multiroot) - - self.singleroot_widget.setVisible(not is_multiroot) - self.multiroot_widget.setVisible(is_multiroot) - - self._on_value_change() - - @property - def child_has_studio_override(self): - if self.is_multiroot: - return self.multiroot_widget.has_studio_override - else: - return self.singleroot_widget.has_studio_override - - @property - def child_modified(self): - if self.is_multiroot: - return self.multiroot_widget.child_modified - else: - return self.singleroot_widget.child_modified - - @property - def child_overriden(self): - if self.is_multiroot: - return ( - self.multiroot_widget.is_overriden - or self.multiroot_widget.child_overriden - ) - else: - return ( - self.singleroot_widget.is_overriden - or self.singleroot_widget.child_overriden - ) - - @property - def child_invalid(self): - if self.is_multiroot: - return self.multiroot_widget.child_invalid - else: - return self.singleroot_widget.child_invalid - - def remove_overrides(self): - self._is_overriden = False - self._is_modified = False - - if self.studio_is_multiroot is NOT_SET: - self.set_multiroot(self.default_is_multiroot) - else: - self.set_multiroot(self.studio_is_multiroot) - - if self.is_multiroot: - self.multiroot_widget.remove_overrides() - else: - self.singleroot_widget.remove_overrides() - - def reset_to_pype_default(self): - self.set_multiroot(self.default_is_multiroot) - if self.is_multiroot: - self.multiroot_widget.reset_to_pype_default() - else: - self.singleroot_widget.reset_to_pype_default() - self._has_studio_override = False - - def set_studio_default(self): - if self.is_multiroot: - self.multiroot_widget.reset_to_pype_default() - else: - self.singleroot_widget.reset_to_pype_default() - self._has_studio_override = True - - def discard_changes(self): - self._is_overriden = self._was_overriden - self._is_modified = False - if self._is_overriden: - self.set_multiroot(self.was_multiroot) - else: - if self.studio_is_multiroot is NOT_SET: - self.set_multiroot(self.default_is_multiroot) - else: - self.set_multiroot(self.studio_is_multiroot) - - if self.is_multiroot: - self.multiroot_widget.discard_changes() - else: - self.singleroot_widget.discard_changes() - - self._is_modified = self.child_modified - self._has_studio_override = self._had_studio_override - - def set_as_overriden(self): - self._is_overriden = True - self.singleroot_widget.set_as_overriden() - self.multiroot_widget.set_as_overriden() - - def item_value(self): - if self.is_multiroot: - return self.multiroot_widget.item_value() - else: - return self.singleroot_widget.item_value() - - def config_value(self): - return {self.key: self.item_value()} - - -class TemplatesWidget(QtWidgets.QWidget, SettingObject): - value_changed = QtCore.Signal(object) - - def __init__(self, input_data, parent): - super(TemplatesWidget, self).__init__(parent) - - input_data["is_group"] = True - self.initial_attributes(input_data, parent, False) - - self.key = input_data["key"] - - body_widget = ExpandingWidget("Templates", self) - content_widget = QtWidgets.QWidget(body_widget) - body_widget.set_content_widget(content_widget) - content_layout = QtWidgets.QVBoxLayout(content_widget) - - template_input_data = { - "key": self.key - } - self.body_widget = body_widget - self.label_widget = body_widget.label_widget - self.value_input = RawJsonWidget( - template_input_data, self, - label_widget=self.label_widget - ) - content_layout.addWidget(self.value_input) - - layout = QtWidgets.QVBoxLayout(self) - layout.setContentsMargins(0, 0, 0, 0) - layout.setSpacing(0) - - layout.addWidget(body_widget) - - self.value_input.value_changed.connect(self._on_value_change) - - def _on_value_change(self, item): - self.update_style() - - self.value_changed.emit(self) - - def update_default_values(self, values): - self._state = None - self.value_input.update_default_values(values) - - def update_studio_values(self, values): - self._state = None - self.value_input.update_studio_values(values) - - def apply_overrides(self, parent_values): - self._state = None - self.value_input.apply_overrides(parent_values) - - def hierarchical_style_update(self): - self.value_input.hierarchical_style_update() - self.update_style() - - def update_style(self): - state = self.style_state( - self.has_studio_override, - self.child_invalid, - self.child_overriden, - self.child_modified - ) - if self._state == state: - return - - if state: - child_state = "child-{}".format(state) - else: - child_state = "" - - self.body_widget.side_line_widget.setProperty("state", child_state) - self.body_widget.side_line_widget.style().polish( - self.body_widget.side_line_widget - ) - - self.label_widget.setProperty("state", state) - self.label_widget.style().polish(self.label_widget) - - self._state = state - - @property - def is_modified(self): - return self.value_input.is_modified - - @property - def is_overriden(self): - return self._is_overriden - - @property - def has_studio_override(self): - return self.value_input._has_studio_override - - @property - def child_has_studio_override(self): - return self.value_input.child_has_studio_override - - @property - def child_modified(self): - return self.value_input.child_modified - - @property - def child_overriden(self): - return self.value_input.child_overriden - - @property - def child_invalid(self): - return self.value_input.child_invalid - - def remove_overrides(self): - self.value_input.remove_overrides() - - def reset_to_pype_default(self): - self.value_input.reset_to_pype_default() - - def set_studio_default(self): - self.value_input.set_studio_default() - - def discard_changes(self): - self.value_input.discard_changes() - - def set_as_overriden(self): - self.value_input.set_as_overriden() - - def overrides(self): - if not self.child_overriden: - return NOT_SET, False - return self.config_value(), True - - def item_value(self): - return self.value_input.item_value() - - def config_value(self): - return self.value_input.config_value() - - -TypeToKlass.types["anatomy"] = AnatomyWidget -TypeToKlass.types["anatomy_roots"] = AnatomyWidget -TypeToKlass.types["anatomy_templates"] = AnatomyWidget diff --git a/pype/tools/settings/settings/widgets/base.py b/pype/tools/settings/settings/widgets/base.py deleted file mode 100644 index 243a8448e53..00000000000 --- a/pype/tools/settings/settings/widgets/base.py +++ /dev/null @@ -1,747 +0,0 @@ -import os -import json -from Qt import QtWidgets, QtCore, QtGui -from pype.settings.lib import ( - SYSTEM_SETTINGS_KEY, - SYSTEM_SETTINGS_PATH, - PROJECT_SETTINGS_KEY, - PROJECT_SETTINGS_PATH, - PROJECT_ANATOMY_KEY, - PROJECT_ANATOMY_PATH, - - DEFAULTS_DIR, - - reset_default_settings, - default_settings, - - studio_system_settings, - studio_project_settings, - studio_project_anatomy, - - project_settings_overrides, - project_anatomy_overrides, - - path_to_project_overrides, - path_to_project_anatomy -) -from .widgets import UnsavedChangesDialog -from . import lib -from avalon import io -from avalon.vendor import qtawesome - - -class SystemWidget(QtWidgets.QWidget): - is_overidable = False - has_studio_override = _has_studio_override = False - is_overriden = _is_overriden = False - as_widget = _as_widget = False - any_parent_as_widget = _any_parent_as_widget = False - is_group = _is_group = False - any_parent_is_group = _any_parent_is_group = False - - def __init__(self, develop_mode, parent=None): - super(SystemWidget, self).__init__(parent) - - self.develop_mode = develop_mode - self._hide_studio_overrides = False - self._ignore_value_changes = False - - self.input_fields = [] - - scroll_widget = QtWidgets.QScrollArea(self) - scroll_widget.setObjectName("GroupWidget") - content_widget = QtWidgets.QWidget(scroll_widget) - content_layout = QtWidgets.QVBoxLayout(content_widget) - content_layout.setContentsMargins(3, 3, 3, 3) - content_layout.setSpacing(0) - content_layout.setAlignment(QtCore.Qt.AlignTop) - content_widget.setLayout(content_layout) - - scroll_widget.setWidgetResizable(True) - scroll_widget.setWidget(content_widget) - - self.scroll_widget = scroll_widget - self.content_layout = content_layout - self.content_widget = content_widget - - footer_widget = QtWidgets.QWidget() - footer_layout = QtWidgets.QHBoxLayout(footer_widget) - - if self.develop_mode: - save_as_default_btn = QtWidgets.QPushButton("Save as Default") - save_as_default_btn.clicked.connect(self._save_as_defaults) - - refresh_icon = qtawesome.icon("fa.refresh", color="white") - refresh_button = QtWidgets.QPushButton() - refresh_button.setIcon(refresh_icon) - refresh_button.clicked.connect(self._on_refresh) - - hide_studio_overrides = QtWidgets.QCheckBox() - hide_studio_overrides.setChecked(self._hide_studio_overrides) - hide_studio_overrides.stateChanged.connect( - self._on_hide_studio_overrides - ) - - hide_studio_overrides_widget = QtWidgets.QWidget() - hide_studio_overrides_layout = QtWidgets.QHBoxLayout( - hide_studio_overrides_widget - ) - _label_widget = QtWidgets.QLabel( - "Hide studio overrides", hide_studio_overrides_widget - ) - hide_studio_overrides_layout.addWidget(_label_widget) - hide_studio_overrides_layout.addWidget(hide_studio_overrides) - - footer_layout.addWidget(save_as_default_btn, 0) - footer_layout.addWidget(refresh_button, 0) - footer_layout.addWidget(hide_studio_overrides_widget, 0) - - save_btn = QtWidgets.QPushButton("Save") - spacer_widget = QtWidgets.QWidget() - footer_layout.addWidget(spacer_widget, 1) - footer_layout.addWidget(save_btn, 0) - - layout = QtWidgets.QVBoxLayout(self) - layout.setContentsMargins(0, 0, 0, 0) - layout.setSpacing(0) - self.setLayout(layout) - - layout.addWidget(scroll_widget, 1) - layout.addWidget(footer_widget, 0) - - save_btn.clicked.connect(self._save) - - self.reset() - - def any_parent_overriden(self): - return False - - @property - def ignore_value_changes(self): - return self._ignore_value_changes - - @ignore_value_changes.setter - def ignore_value_changes(self, value): - self._ignore_value_changes = value - if value is False: - self.hierarchical_style_update() - - def hierarchical_style_update(self): - for input_field in self.input_fields: - input_field.hierarchical_style_update() - - def reset(self): - reset_default_settings() - - self.input_fields.clear() - while self.content_layout.count() != 0: - widget = self.content_layout.itemAt(0).widget() - self.content_layout.removeWidget(widget) - widget.deleteLater() - - self.schema = lib.gui_schema("system_schema", "0_system_gui_schema") - self.keys = self.schema.get("keys", []) - self.add_children_gui(self.schema) - self._update_values() - self.hierarchical_style_update() - - def _save(self): - has_invalid = False - for item in self.input_fields: - if item.child_invalid: - has_invalid = True - - if has_invalid: - invalid_items = [] - for item in self.input_fields: - invalid_items.extend(item.get_invalid()) - msg_box = QtWidgets.QMessageBox( - QtWidgets.QMessageBox.Warning, - "Invalid input", - "There is invalid value in one of inputs." - " Please lead red color and fix them." - ) - msg_box.setStandardButtons(QtWidgets.QMessageBox.Ok) - msg_box.exec_() - - first_invalid_item = invalid_items[0] - self.scroll_widget.ensureWidgetVisible(first_invalid_item) - if first_invalid_item.isVisible(): - first_invalid_item.setFocus(True) - return - - _data = {} - for input_field in self.input_fields: - value, is_group = input_field.studio_overrides() - if value is not lib.NOT_SET: - _data.update(value) - - values = lib.convert_gui_data_to_overrides(_data.get("system", {})) - - dirpath = os.path.dirname(SYSTEM_SETTINGS_PATH) - if not os.path.exists(dirpath): - os.makedirs(dirpath) - - print("Saving data to:", SYSTEM_SETTINGS_PATH) - with open(SYSTEM_SETTINGS_PATH, "w") as file_stream: - json.dump(values, file_stream, indent=4) - - self._update_values() - - def _on_refresh(self): - self.reset() - - def _on_hide_studio_overrides(self, state): - self._hide_studio_overrides = (state == QtCore.Qt.Checked) - self._update_values() - self.hierarchical_style_update() - - def _save_as_defaults(self): - output = {} - for item in self.input_fields: - output.update(item.config_value()) - - for key in reversed(self.keys): - _output = {key: output} - output = _output - - all_values = {} - for item in self.input_fields: - all_values.update(item.config_value()) - - for key in reversed(self.keys): - _all_values = {key: all_values} - all_values = _all_values - - # Skip first key - all_values = all_values["system"] - - prject_defaults_dir = os.path.join( - DEFAULTS_DIR, SYSTEM_SETTINGS_KEY - ) - keys_to_file = lib.file_keys_from_schema(self.schema) - for key_sequence in keys_to_file: - # Skip first key - key_sequence = key_sequence[1:] - subpath = "/".join(key_sequence) + ".json" - - new_values = all_values - for key in key_sequence: - new_values = new_values[key] - - output_path = os.path.join(prject_defaults_dir, subpath) - dirpath = os.path.dirname(output_path) - if not os.path.exists(dirpath): - os.makedirs(dirpath) - - print("Saving data to: ", subpath) - with open(output_path, "w") as file_stream: - json.dump(new_values, file_stream, indent=4) - - reset_default_settings() - - self._update_values() - self.hierarchical_style_update() - - def _update_values(self): - self.ignore_value_changes = True - - default_values = { - "system": default_settings()[SYSTEM_SETTINGS_KEY] - } - for input_field in self.input_fields: - input_field.update_default_values(default_values) - - if self._hide_studio_overrides: - system_values = lib.NOT_SET - else: - system_values = {"system": studio_system_settings()} - for input_field in self.input_fields: - input_field.update_studio_values(system_values) - - self.ignore_value_changes = False - - def add_children_gui(self, child_configuration): - item_type = child_configuration["type"] - klass = lib.TypeToKlass.types.get(item_type) - item = klass(child_configuration, self) - self.input_fields.append(item) - self.content_layout.addWidget(item, 0) - - # Add spacer to stretch children guis - spacer = QtWidgets.QWidget(self.content_widget) - self.content_layout.addWidget(spacer, 1) - - -class ProjectListView(QtWidgets.QListView): - left_mouse_released_at = QtCore.Signal(QtCore.QModelIndex) - - def mouseReleaseEvent(self, event): - if event.button() == QtCore.Qt.LeftButton: - index = self.indexAt(event.pos()) - self.left_mouse_released_at.emit(index) - super(ProjectListView, self).mouseReleaseEvent(event) - - -class ProjectListWidget(QtWidgets.QWidget): - default = "< Default >" - project_changed = QtCore.Signal() - - def __init__(self, parent): - self._parent = parent - - self.current_project = None - - super(ProjectListWidget, self).__init__(parent) - self.setObjectName("ProjectListWidget") - - label_widget = QtWidgets.QLabel("Projects") - label_widget.setProperty("state", "studio") - project_list = ProjectListView(self) - project_list.setModel(QtGui.QStandardItemModel()) - - # Do not allow editing - project_list.setEditTriggers( - QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers - ) - # Do not automatically handle selection - project_list.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection) - - layout = QtWidgets.QVBoxLayout(self) - layout.setSpacing(3) - layout.addWidget(label_widget, 0) - layout.addWidget(project_list, 1) - - project_list.left_mouse_released_at.connect(self.on_item_clicked) - - self.project_list = project_list - - self.refresh() - - def on_item_clicked(self, new_index): - new_project_name = new_index.data(QtCore.Qt.DisplayRole) - if new_project_name is None: - return - - if self.current_project == new_project_name: - return - - save_changes = False - change_project = False - if self.validate_context_change(): - change_project = True - - else: - dialog = UnsavedChangesDialog(self) - result = dialog.exec_() - if result == 1: - save_changes = True - change_project = True - - elif result == 2: - change_project = True - - if save_changes: - self._parent._save() - - if change_project: - self.select_project(new_project_name) - self.current_project = new_project_name - self.project_changed.emit() - else: - self.select_project(self.current_project) - - def validate_context_change(self): - # TODO add check if project can be changed (is modified) - for item in self._parent.input_fields: - is_modified = item.child_modified - if is_modified: - return False - return True - - def project_name(self): - if self.current_project == self.default: - return None - return self.current_project - - def select_project(self, project_name): - model = self.project_list.model() - found_items = model.findItems(project_name) - if not found_items: - found_items = model.findItems(self.default) - - index = model.indexFromItem(found_items[0]) - self.project_list.selectionModel().clear() - self.project_list.selectionModel().setCurrentIndex( - index, QtCore.QItemSelectionModel.SelectionFlag.SelectCurrent - ) - - def refresh(self): - selected_project = None - for index in self.project_list.selectedIndexes(): - selected_project = index.data(QtCore.Qt.DisplayRole) - break - - model = self.project_list.model() - model.clear() - items = [self.default] - io.install() - for project_doc in tuple(io.projects()): - items.append(project_doc["name"]) - - for item in items: - model.appendRow(QtGui.QStandardItem(item)) - - self.select_project(selected_project) - - self.current_project = self.project_list.currentIndex().data( - QtCore.Qt.DisplayRole - ) - - -class ProjectWidget(QtWidgets.QWidget): - has_studio_override = _has_studio_override = False - is_overriden = _is_overriden = False - as_widget = _as_widget = False - any_parent_as_widget = _any_parent_as_widget = False - is_group = _is_group = False - any_parent_is_group = _any_parent_is_group = False - - def __init__(self, develop_mode, parent=None): - super(ProjectWidget, self).__init__(parent) - - self.develop_mode = develop_mode - self._hide_studio_overrides = False - - self.is_overidable = False - self._ignore_value_changes = False - self.project_name = None - - self.input_fields = [] - - scroll_widget = QtWidgets.QScrollArea(self) - scroll_widget.setObjectName("GroupWidget") - content_widget = QtWidgets.QWidget(scroll_widget) - content_layout = QtWidgets.QVBoxLayout(content_widget) - content_layout.setContentsMargins(3, 3, 3, 3) - content_layout.setSpacing(0) - content_layout.setAlignment(QtCore.Qt.AlignTop) - content_widget.setLayout(content_layout) - - scroll_widget.setWidgetResizable(True) - scroll_widget.setWidget(content_widget) - - project_list_widget = ProjectListWidget(self) - content_layout.addWidget(project_list_widget) - - footer_widget = QtWidgets.QWidget() - footer_layout = QtWidgets.QHBoxLayout(footer_widget) - - if self.develop_mode: - save_as_default_btn = QtWidgets.QPushButton("Save as Default") - save_as_default_btn.clicked.connect(self._save_as_defaults) - - refresh_icon = qtawesome.icon("fa.refresh", color="white") - refresh_button = QtWidgets.QPushButton() - refresh_button.setIcon(refresh_icon) - refresh_button.clicked.connect(self._on_refresh) - - hide_studio_overrides = QtWidgets.QCheckBox() - hide_studio_overrides.setChecked(self._hide_studio_overrides) - hide_studio_overrides.stateChanged.connect( - self._on_hide_studio_overrides - ) - - hide_studio_overrides_widget = QtWidgets.QWidget() - hide_studio_overrides_layout = QtWidgets.QHBoxLayout( - hide_studio_overrides_widget - ) - _label_widget = QtWidgets.QLabel( - "Hide studio overrides", hide_studio_overrides_widget - ) - hide_studio_overrides_layout.addWidget(_label_widget) - hide_studio_overrides_layout.addWidget(hide_studio_overrides) - - footer_layout.addWidget(save_as_default_btn, 0) - footer_layout.addWidget(refresh_button, 0) - footer_layout.addWidget(hide_studio_overrides_widget, 0) - - save_btn = QtWidgets.QPushButton("Save") - spacer_widget = QtWidgets.QWidget() - footer_layout.addWidget(spacer_widget, 1) - footer_layout.addWidget(save_btn, 0) - - configurations_widget = QtWidgets.QWidget() - configurations_layout = QtWidgets.QVBoxLayout(configurations_widget) - configurations_layout.setContentsMargins(0, 0, 0, 0) - configurations_layout.setSpacing(0) - - configurations_layout.addWidget(scroll_widget, 1) - configurations_layout.addWidget(footer_widget, 0) - - layout = QtWidgets.QHBoxLayout(self) - layout.setContentsMargins(0, 0, 0, 0) - layout.setSpacing(0) - self.setLayout(layout) - - layout.addWidget(project_list_widget, 0) - layout.addWidget(configurations_widget, 1) - - save_btn.clicked.connect(self._save) - project_list_widget.project_changed.connect(self._on_project_change) - - self.project_list_widget = project_list_widget - self.scroll_widget = scroll_widget - self.content_layout = content_layout - self.content_widget = content_widget - - self.reset() - - def any_parent_overriden(self): - return False - - @property - def ignore_value_changes(self): - return self._ignore_value_changes - - @ignore_value_changes.setter - def ignore_value_changes(self, value): - self._ignore_value_changes = value - if value is False: - self.hierarchical_style_update() - - def hierarchical_style_update(self): - for input_field in self.input_fields: - input_field.hierarchical_style_update() - - def reset(self): - if self.content_layout.count() != 0: - for widget in self.input_fields: - self.content_layout.removeWidget(widget) - widget.deleteLater() - self.input_fields.clear() - - self.schema = lib.gui_schema("projects_schema", "0_project_gui_schema") - self.keys = self.schema.get("keys", []) - self.add_children_gui(self.schema) - self._update_values() - self.hierarchical_style_update() - - def add_children_gui(self, child_configuration): - item_type = child_configuration["type"] - klass = lib.TypeToKlass.types.get(item_type) - item = klass(child_configuration, self) - self.input_fields.append(item) - self.content_layout.addWidget(item, 0) - - # Add spacer to stretch children guis - spacer = QtWidgets.QWidget(self.content_widget) - self.content_layout.addWidget(spacer, 1) - - def _on_project_change(self): - project_name = self.project_list_widget.project_name() - if project_name is None: - _project_overrides = lib.NOT_SET - _project_anatomy = lib.NOT_SET - self.is_overidable = False - else: - _project_overrides = project_settings_overrides(project_name) - _project_anatomy = project_anatomy_overrides(project_name) - self.is_overidable = True - - overrides = {"project": { - PROJECT_SETTINGS_KEY: lib.convert_overrides_to_gui_data( - _project_overrides - ), - PROJECT_ANATOMY_KEY: lib.convert_overrides_to_gui_data( - _project_anatomy - ) - }} - self.project_name = project_name - self.ignore_value_changes = True - for item in self.input_fields: - item.apply_overrides(overrides) - self.ignore_value_changes = False - - def _save_as_defaults(self): - output = {} - for item in self.input_fields: - output.update(item.config_value()) - - for key in reversed(self.keys): - _output = {key: output} - output = _output - - all_values = {} - for item in self.input_fields: - all_values.update(item.config_value()) - - for key in reversed(self.keys): - _all_values = {key: all_values} - all_values = _all_values - - # Skip first key - all_values = all_values["project"] - - keys_to_file = lib.file_keys_from_schema(self.schema) - for key_sequence in keys_to_file: - # Skip first key - key_sequence = key_sequence[1:] - subpath = "/".join(key_sequence) + ".json" - - new_values = all_values - for key in key_sequence: - new_values = new_values[key] - - output_path = os.path.join(DEFAULTS_DIR, subpath) - dirpath = os.path.dirname(output_path) - if not os.path.exists(dirpath): - os.makedirs(dirpath) - - print("Saving data to: ", subpath) - with open(output_path, "w") as file_stream: - json.dump(new_values, file_stream, indent=4) - - reset_default_settings() - - self._update_values() - self.hierarchical_style_update() - - def _save(self): - has_invalid = False - for item in self.input_fields: - if item.child_invalid: - has_invalid = True - - if has_invalid: - invalid_items = [] - for item in self.input_fields: - invalid_items.extend(item.get_invalid()) - msg_box = QtWidgets.QMessageBox( - QtWidgets.QMessageBox.Warning, - "Invalid input", - "There is invalid value in one of inputs." - " Please lead red color and fix them." - ) - msg_box.setStandardButtons(QtWidgets.QMessageBox.Ok) - msg_box.exec_() - - first_invalid_item = invalid_items[0] - self.scroll_widget.ensureWidgetVisible(first_invalid_item) - if first_invalid_item.isVisible(): - first_invalid_item.setFocus(True) - return - - if self.project_name is None: - self._save_studio_overrides() - else: - self._save_overrides() - - def _on_refresh(self): - self.reset() - - def _on_hide_studio_overrides(self, state): - self._hide_studio_overrides = (state == QtCore.Qt.Checked) - self._update_values() - self.hierarchical_style_update() - - def _save_overrides(self): - data = {} - for item in self.input_fields: - value, is_group = item.overrides() - if value is not lib.NOT_SET: - data.update(value) - - output_data = lib.convert_gui_data_to_overrides( - data.get("project") or {} - ) - - # Saving overrides data - project_overrides_data = output_data.get( - PROJECT_SETTINGS_KEY, {} - ) - project_overrides_json_path = path_to_project_overrides( - self.project_name - ) - dirpath = os.path.dirname(project_overrides_json_path) - if not os.path.exists(dirpath): - os.makedirs(dirpath) - - print("Saving data to:", project_overrides_json_path) - with open(project_overrides_json_path, "w") as file_stream: - json.dump(project_overrides_data, file_stream, indent=4) - - # Saving anatomy data - project_anatomy_data = output_data.get( - PROJECT_ANATOMY_KEY, {} - ) - project_anatomy_json_path = path_to_project_anatomy( - self.project_name - ) - dirpath = os.path.dirname(project_anatomy_json_path) - if not os.path.exists(dirpath): - os.makedirs(dirpath) - - print("Saving data to:", project_anatomy_json_path) - with open(project_anatomy_json_path, "w") as file_stream: - json.dump(project_anatomy_data, file_stream, indent=4) - - # Refill values with overrides - self._on_project_change() - - def _save_studio_overrides(self): - data = {} - for input_field in self.input_fields: - value, is_group = input_field.studio_overrides() - if value is not lib.NOT_SET: - data.update(value) - - output_data = lib.convert_gui_data_to_overrides( - data.get("project", {}) - ) - - # Project overrides data - project_overrides_data = output_data.get( - PROJECT_SETTINGS_KEY, {} - ) - dirpath = os.path.dirname(PROJECT_SETTINGS_PATH) - if not os.path.exists(dirpath): - os.makedirs(dirpath) - - print("Saving data to:", PROJECT_SETTINGS_PATH) - with open(PROJECT_SETTINGS_PATH, "w") as file_stream: - json.dump(project_overrides_data, file_stream, indent=4) - - # Project Anatomy data - project_anatomy_data = output_data.get( - PROJECT_ANATOMY_KEY, {} - ) - dirpath = os.path.dirname(PROJECT_ANATOMY_PATH) - if not os.path.exists(dirpath): - os.makedirs(dirpath) - - print("Saving data to:", PROJECT_ANATOMY_PATH) - with open(PROJECT_ANATOMY_PATH, "w") as file_stream: - json.dump(project_anatomy_data, file_stream, indent=4) - - # Update saved values - self._update_values() - - def _update_values(self): - self.ignore_value_changes = True - - default_values = {"project": default_settings()} - for input_field in self.input_fields: - input_field.update_default_values(default_values) - - if self._hide_studio_overrides: - studio_values = lib.NOT_SET - else: - studio_values = {"project": { - PROJECT_SETTINGS_KEY: studio_project_settings(), - PROJECT_ANATOMY_KEY: studio_project_anatomy() - }} - for input_field in self.input_fields: - input_field.update_studio_values(studio_values) - - self.ignore_value_changes = False diff --git a/pype/tools/settings/settings/widgets/item_types.py b/pype/tools/settings/settings/widgets/item_types.py deleted file mode 100644 index 4124c32ba83..00000000000 --- a/pype/tools/settings/settings/widgets/item_types.py +++ /dev/null @@ -1,3434 +0,0 @@ -import json -import collections -from Qt import QtWidgets, QtCore, QtGui -from .widgets import ( - ExpandingWidget, - NumberSpinBox, - PathInput, - GridLabelWidget, - ComboBox -) -from .multiselection_combobox import MultiSelectionComboBox -from .lib import NOT_SET, METADATA_KEY, TypeToKlass, CHILD_OFFSET -from pype.api import Logger -from avalon.vendor import qtawesome - - -class SettingObject: - """Partially abstract class for Setting's item type workflow.""" - # `is_input_type` attribute says if has implemented item type methods - is_input_type = True - # Each input must have implemented default value for development - # when defaults are not filled yet. - default_input_value = NOT_SET - # Will allow to show actions for the item type (disabled for proxies) else - # item is skipped and try to trigger actions on it's parent. - allow_actions = True - # All item types must have implemented Qt signal which is emitted when - # it's or it's children value has changed, - value_changed = None - # Item will expand to full width in grid layout - expand_in_grid = False - - def _set_default_attributes(self): - """Create and reset attributes required for all item types. - - They may not be used in the item but are required to be set. - """ - # Default input attributes - self._has_studio_override = False - self._had_studio_override = False - - self._is_overriden = False - self._was_overriden = False - - self._is_modified = False - self._is_invalid = False - - self._is_nullable = False - self._as_widget = False - self._is_group = False - - self._any_parent_as_widget = None - self._any_parent_is_group = None - - # Parent input - self._parent = None - - # States of inputs - self._state = None - self._child_state = None - - # Attributes where values are stored - self.default_value = NOT_SET - self.studio_value = NOT_SET - self.override_value = NOT_SET - - # Log object - self._log = None - - # Only for develop mode - self.defaults_not_set = False - - def initial_attributes(self, input_data, parent, as_widget): - """Prepare attributes based on entered arguments. - - This method should be same for each item type. Few item types - may require to extend with specific attributes for their case. - """ - self._set_default_attributes() - - self._parent = parent - self._as_widget = as_widget - - self._is_group = input_data.get("is_group", False) - # TODO not implemented yet - self._is_nullable = input_data.get("is_nullable", False) - - any_parent_as_widget = parent.as_widget - if not any_parent_as_widget: - any_parent_as_widget = parent.any_parent_as_widget - - self._any_parent_as_widget = any_parent_as_widget - - any_parent_is_group = parent.is_group - if not any_parent_is_group: - any_parent_is_group = parent.any_parent_is_group - - self._any_parent_is_group = any_parent_is_group - - @property - def develop_mode(self): - """Tool is in develop mode or not. - - Returns: - bool - - """ - return self._parent.develop_mode - - @property - def log(self): - """Auto created logger for debugging.""" - if self._log is None: - self._log = Logger().get_logger(self.__class__.__name__) - return self._log - - @property - def had_studio_override(self): - """Item had studio overrides on refresh. - - Use attribute `_had_studio_override` which should be changed only - during methods `update_studio_values` and `update_default_values`. - - Returns: - bool - - """ - return self._had_studio_override - - @property - def has_studio_override(self): - """Item has studio override at the moment. - - With combination of `had_studio_override` is possible to know if item - is modified (not value change). - - Returns: - bool - - """ - return self._has_studio_override or self._parent.has_studio_override - - @property - def as_widget(self): - """Item is used as widget in parent item. - - Returns: - bool - - """ - return self._as_widget - - @property - def any_parent_as_widget(self): - """Any parent of item is used as widget. - - Attribute holding this information is set during creation and - stored to `_any_parent_as_widget`. - - Why is this information useful: If any parent is used as widget then - modifications and override are not important for whole part. - - Returns: - bool - - """ - if self._any_parent_as_widget is None: - return super(SettingObject, self).any_parent_as_widget - return self._any_parent_as_widget - - @property - def is_group(self): - """Item represents key that can be overriden. - - Attribute `is_group` can be set to True only once in item hierarchy. - - Returns: - bool - - """ - return self._is_group - - @property - def any_parent_is_group(self): - """Any parent of item is group. - - Attribute holding this information is set during creation and - stored to `_any_parent_is_group`. - - Why is this information useful: If any parent is group and - the parent is set as overriden, this item is overriden too. - - Returns: - bool - - """ - if self._any_parent_is_group is None: - return super(SettingObject, self).any_parent_is_group - return self._any_parent_is_group - - @property - def is_modified(self): - """Has object any changes that require saving.""" - if self.any_parent_as_widget: - return self._is_modified - - if self._is_modified or self.defaults_not_set: - return True - - if self.is_overidable: - return self.was_overriden != self.is_overriden - else: - return self.has_studio_override != self.had_studio_override - - @property - def is_overriden(self): - """Is object overriden so should be saved to overrides.""" - return self._is_overriden or self._parent.is_overriden - - @property - def was_overriden(self): - """Item had set value of project overrides on project change.""" - if self._as_widget: - return self._parent.was_overriden - return self._was_overriden - - @property - def is_invalid(self): - """Value set in is not valid.""" - return self._is_invalid - - @property - def is_nullable(self): - """Value of item can be set to None. - - NOT IMPLEMENTED! - """ - return self._is_nullable - - @property - def is_overidable(self): - """ care about overrides.""" - - return self._parent.is_overidable - - def any_parent_overriden(self): - """Any of parent objects up to top hiearchy item is overriden. - - Returns: - bool - - """ - - if self._parent._is_overriden: - return True - return self._parent.any_parent_overriden() - - @property - def ignore_value_changes(self): - """Most of attribute changes are ignored on value change when True.""" - return self._parent.ignore_value_changes - - @ignore_value_changes.setter - def ignore_value_changes(self, value): - """Setter for global parent item to apply changes for all inputs.""" - self._parent.ignore_value_changes = value - - def config_value(self): - """Output for saving changes or overrides.""" - return {self.key: self.item_value()} - - @classmethod - def style_state( - cls, has_studio_override, is_invalid, is_overriden, is_modified - ): - """Return stylesheet state by intered booleans.""" - items = [] - if is_invalid: - items.append("invalid") - else: - if is_overriden: - items.append("overriden") - if is_modified: - items.append("modified") - - if not items and has_studio_override: - items.append("studio") - - return "-".join(items) or "" - - def show_actions_menu(self, event=None): - if event and event.button() != QtCore.Qt.RightButton: - return - - if not self.allow_actions: - if event: - return self.mouseReleaseEvent(event) - return - - menu = QtWidgets.QMenu() - - actions_mapping = {} - if self.child_modified: - action = QtWidgets.QAction("Discard changes") - actions_mapping[action] = self._discard_changes - menu.addAction(action) - - if ( - self.is_overidable - and not self.is_overriden - and not self.any_parent_is_group - ): - action = QtWidgets.QAction("Set project override") - actions_mapping[action] = self._set_as_overriden - menu.addAction(action) - - if ( - not self.is_overidable - and ( - self.has_studio_override - ) - ): - action = QtWidgets.QAction("Reset to pype default") - actions_mapping[action] = self._reset_to_pype_default - menu.addAction(action) - - if ( - not self.is_overidable - and not self.is_overriden - and not self.any_parent_is_group - and not self._had_studio_override - ): - action = QtWidgets.QAction("Set studio default") - actions_mapping[action] = self._set_studio_default - menu.addAction(action) - - if ( - not self.any_parent_overriden() - and (self.is_overriden or self.child_overriden) - ): - # TODO better label - action = QtWidgets.QAction("Remove project override") - actions_mapping[action] = self._remove_overrides - menu.addAction(action) - - if not actions_mapping: - action = QtWidgets.QAction("< No action >") - actions_mapping[action] = None - menu.addAction(action) - - result = menu.exec_(QtGui.QCursor.pos()) - if result: - to_run = actions_mapping[result] - if to_run: - to_run() - - def mouseReleaseEvent(self, event): - if self.allow_actions and event.button() == QtCore.Qt.RightButton: - return self.show_actions_menu() - - mro = type(self).mro() - index = mro.index(self.__class__) - item = None - for idx in range(index + 1, len(mro)): - _item = mro[idx] - if hasattr(_item, "mouseReleaseEvent"): - item = _item - break - - if item: - return item.mouseReleaseEvent(self, event) - - def _discard_changes(self): - self.ignore_value_changes = True - self.discard_changes() - self.ignore_value_changes = False - - def discard_changes(self): - """Item's implementation to discard all changes made by user. - - Reset all values to same values as had when opened GUI - or when changed project. - - Must not affect `had_studio_override` value or `was_overriden` - value. It must be marked that there are keys/values which are not in - defaults or overrides. - """ - raise NotImplementedError( - "{} Method `discard_changes` not implemented!".format( - repr(self) - ) - ) - - def _set_studio_default(self): - self.ignore_value_changes = True - self.set_studio_default() - self.ignore_value_changes = False - - def set_studio_default(self): - """Item's implementation to set current values as studio's overrides. - - Mark item and it's children as they have studio overrides. - """ - raise NotImplementedError( - "{} Method `set_studio_default` not implemented!".format( - repr(self) - ) - ) - - def _reset_to_pype_default(self): - self.ignore_value_changes = True - self.reset_to_pype_default() - self.ignore_value_changes = False - - def reset_to_pype_default(self): - """Item's implementation to remove studio overrides. - - Mark item as it does not have studio overrides unset studio - override values. - """ - raise NotImplementedError( - "{} Method `reset_to_pype_default` not implemented!".format( - repr(self) - ) - ) - - def _remove_overrides(self): - self.ignore_value_changes = True - self.remove_overrides() - self.ignore_value_changes = False - - def remove_overrides(self): - """Item's implementation to remove project overrides. - - Mark item as does not have project overrides. Must not change - `was_overriden` attribute value. - """ - raise NotImplementedError( - "{} Method `remove_overrides` not implemented!".format( - repr(self) - ) - ) - - def _set_as_overriden(self): - self.ignore_value_changes = True - self.set_as_overriden() - self.ignore_value_changes = False - - def set_as_overriden(self): - """Item's implementation to set values as overriden for project. - - Mark item and all it's children as they're overriden. Must skip - items with children items that has attributes `is_group` - and `any_parent_is_group` set to False. In that case those items - are not meant to be overridable and should trigger the method on it's - children. - - """ - raise NotImplementedError( - "{} Method `set_as_overriden` not implemented!".format(repr(self)) - ) - - def hierarchical_style_update(self): - """Trigger update style method down the hierarchy.""" - raise NotImplementedError( - "{} Method `hierarchical_style_update` not implemented!".format( - repr(self) - ) - ) - - def update_default_values(self, parent_values): - """Fill default values on startup or on refresh. - - Default values stored in `pype` repository should update all items in - schema. Each item should take values for his key and set it's value or - pass values down to children items. - - Args: - parent_values (dict): Values of parent's item. But in case item is - used as widget, `parent_values` contain value for item. - """ - raise NotImplementedError( - "{} does not have implemented `update_default_values`".format(self) - ) - - def update_studio_values(self, parent_values): - """Fill studio override values on startup or on refresh. - - Set studio value if is not set to NOT_SET, in that case studio - overrides are not set yet. - - Args: - parent_values (dict): Values of parent's item. But in case item is - used as widget, `parent_values` contain value for item. - """ - raise NotImplementedError( - "{} does not have implemented `update_studio_values`".format(self) - ) - - def apply_overrides(self, parent_values): - """Fill project override values on startup, refresh or project change. - - Set project value if is not set to NOT_SET, in that case project - overrides are not set yet. - - Args: - parent_values (dict): Values of parent's item. But in case item is - used as widget, `parent_values` contain value for item. - """ - raise NotImplementedError( - "{} does not have implemented `apply_overrides`".format(self) - ) - - @property - def child_has_studio_override(self): - """Any children item has studio overrides.""" - raise NotImplementedError( - "{} does not have implemented `child_has_studio_override`".format( - self - ) - ) - - @property - def child_modified(self): - """Any children item is modified.""" - raise NotImplementedError( - "{} does not have implemented `child_modified`".format(self) - ) - - @property - def child_overriden(self): - """Any children item has project overrides.""" - raise NotImplementedError( - "{} does not have implemented `child_overriden`".format(self) - ) - - @property - def child_invalid(self): - """Any children item does not have valid value.""" - raise NotImplementedError( - "{} does not have implemented `child_invalid`".format(self) - ) - - def get_invalid(self): - """Return invalid item types all down the hierarchy.""" - raise NotImplementedError( - "{} does not have implemented `get_invalid`".format(self) - ) - - def item_value(self): - """Value of an item without key.""" - raise NotImplementedError( - "Method `item_value` not implemented!" - ) - - -class InputObject(SettingObject): - """Class for inputs with pre-implemented methods. - - Class is for item types not creating or using other item types, most - of methods has same code in that case. - """ - - def update_default_values(self, parent_values): - self._state = None - self._is_modified = False - - value = NOT_SET - if self._as_widget: - value = parent_values - elif parent_values is not NOT_SET: - value = parent_values.get(self.key, NOT_SET) - - if value is NOT_SET: - if self.develop_mode: - self.defaults_not_set = True - value = self.default_input_value - if value is NOT_SET: - raise NotImplementedError(( - "{} Does not have implemented" - " attribute `default_input_value`" - ).format(self)) - - else: - raise ValueError( - "Default value is not set. This is implementation BUG." - ) - else: - self.defaults_not_set = False - - self.default_value = value - self._has_studio_override = False - self._had_studio_override = False - self.set_value(value) - - def update_studio_values(self, parent_values): - self._state = None - self._is_modified = False - - value = NOT_SET - if self._as_widget: - value = parent_values - elif parent_values is not NOT_SET: - value = parent_values.get(self.key, NOT_SET) - - self.studio_value = value - if value is not NOT_SET: - self._has_studio_override = True - self._had_studio_override = True - self.set_value(value) - - else: - self._has_studio_override = False - self._had_studio_override = False - self.set_value(self.default_value) - - def apply_overrides(self, parent_values): - self._is_modified = False - self._state = None - self._had_studio_override = bool(self._has_studio_override) - if self._as_widget: - override_value = parent_values - elif parent_values is NOT_SET or self.key not in parent_values: - override_value = NOT_SET - else: - override_value = parent_values[self.key] - - self.override_value = override_value - - if override_value is NOT_SET: - self._is_overriden = False - self._was_overriden = False - if self.has_studio_override: - value = self.studio_value - else: - value = self.default_value - else: - self._is_overriden = True - self._was_overriden = True - value = override_value - - self.set_value(value) - - def _on_value_change(self, item=None): - if self.ignore_value_changes: - return - - if not self.any_parent_as_widget: - if self.is_overidable: - self._is_overriden = True - else: - self._has_studio_override = True - - if self._is_invalid: - self._is_modified = True - elif self._is_overriden: - self._is_modified = self.item_value() != self.override_value - elif self._has_studio_override: - self._is_modified = self.item_value() != self.studio_value - else: - self._is_modified = self.item_value() != self.default_value - - self.update_style() - - self.value_changed.emit(self) - - def studio_overrides(self): - if ( - not (self.as_widget or self.any_parent_as_widget) - and not self.has_studio_override - ): - return NOT_SET, False - return self.config_value(), self.is_group - - def overrides(self): - if ( - not (self.as_widget or self.any_parent_as_widget) - and not self.is_overriden - ): - return NOT_SET, False - return self.config_value(), self.is_group - - def hierarchical_style_update(self): - self.update_style() - - def _style_state(self): - if self.as_widget: - state = self.style_state( - False, - self._is_invalid, - False, - self._is_modified - ) - else: - state = self.style_state( - self.has_studio_override, - self.is_invalid, - self.is_overriden, - self.is_modified - ) - return state - - def update_style(self): - state = self._style_state() - if self._state == state: - return - - self._state = state - - self.input_field.setProperty("input-state", state) - self.input_field.style().polish(self.input_field) - if self.label_widget: - self.label_widget.setProperty("state", state) - self.label_widget.style().polish(self.label_widget) - - def remove_overrides(self): - self._is_overriden = False - self._is_modified = False - if self.has_studio_override: - self.set_value(self.studio_value) - else: - self.set_value(self.default_value) - self._is_overriden = False - self._is_modified = False - - def reset_to_pype_default(self): - self.set_value(self.default_value) - self._has_studio_override = False - - def set_studio_default(self): - self._has_studio_override = True - - def discard_changes(self): - self._is_overriden = self._was_overriden - self._has_studio_override = self._had_studio_override - if self.is_overidable: - if self._was_overriden and self.override_value is not NOT_SET: - self.set_value(self.override_value) - else: - if self._had_studio_override: - self.set_value(self.studio_value) - else: - self.set_value(self.default_value) - - if not self.is_overidable: - if self.has_studio_override: - self._is_modified = self.studio_value != self.item_value() - else: - self._is_modified = self.default_value != self.item_value() - self._is_overriden = False - return - - self._is_modified = False - self._is_overriden = self._was_overriden - - def set_as_overriden(self): - self._is_overriden = True - - @property - def child_has_studio_override(self): - return self._has_studio_override - - @property - def child_modified(self): - return self.is_modified - - @property - def child_overriden(self): - return self._is_overriden - - @property - def child_invalid(self): - return self.is_invalid - - def get_invalid(self): - output = [] - if self.is_invalid: - output.append(self) - return output - - def reset_children_attributes(self): - return - - -class BooleanWidget(QtWidgets.QWidget, InputObject): - default_input_value = True - value_changed = QtCore.Signal(object) - - def __init__( - self, input_data, parent, - as_widget=False, label_widget=None, parent_widget=None - ): - if parent_widget is None: - parent_widget = parent - super(BooleanWidget, self).__init__(parent_widget) - - self.initial_attributes(input_data, parent, as_widget) - - layout = QtWidgets.QHBoxLayout(self) - layout.setContentsMargins(0, 0, 0, 0) - layout.setSpacing(5) - - if not self.as_widget: - self.key = input_data["key"] - if not label_widget: - label = input_data["label"] - label_widget = QtWidgets.QLabel(label) - label_widget.setAttribute(QtCore.Qt.WA_TranslucentBackground) - layout.addWidget(label_widget, 0) - self.label_widget = label_widget - - self.input_field = QtWidgets.QCheckBox(self) - spacer = QtWidgets.QWidget(self) - spacer.setAttribute(QtCore.Qt.WA_TranslucentBackground) - - layout.addWidget(self.input_field, 0) - layout.addWidget(spacer, 1) - - self.setFocusProxy(self.input_field) - - self.input_field.stateChanged.connect(self._on_value_change) - - def set_value(self, value): - # Ignore value change because if `self.isChecked()` has same - # value as `value` the `_on_value_change` is not triggered - self.input_field.setChecked(value) - - def item_value(self): - return self.input_field.isChecked() - - -class NumberWidget(QtWidgets.QWidget, InputObject): - default_input_value = 0 - value_changed = QtCore.Signal(object) - input_modifiers = ("minimum", "maximum", "decimal") - - def __init__( - self, input_data, parent, - as_widget=False, label_widget=None, parent_widget=None - ): - if parent_widget is None: - parent_widget = parent - super(NumberWidget, self).__init__(parent_widget) - - self.initial_attributes(input_data, parent, as_widget) - - layout = QtWidgets.QHBoxLayout(self) - layout.setContentsMargins(0, 0, 0, 0) - layout.setSpacing(5) - - kwargs = { - modifier: input_data.get(modifier) - for modifier in self.input_modifiers - if input_data.get(modifier) - } - self.input_field = NumberSpinBox(self, **kwargs) - - self.setFocusProxy(self.input_field) - - if not self._as_widget: - self.key = input_data["key"] - if not label_widget: - label = input_data["label"] - label_widget = QtWidgets.QLabel(label) - layout.addWidget(label_widget, 0) - self.label_widget = label_widget - - layout.addWidget(self.input_field, 1) - - self.input_field.valueChanged.connect(self._on_value_change) - - def set_value(self, value): - self.input_field.setValue(value) - - def item_value(self): - return self.input_field.value() - - -class TextWidget(QtWidgets.QWidget, InputObject): - default_input_value = "" - value_changed = QtCore.Signal(object) - - def __init__( - self, input_data, parent, - as_widget=False, label_widget=None, parent_widget=None - ): - if parent_widget is None: - parent_widget = parent - super(TextWidget, self).__init__(parent_widget) - - self.initial_attributes(input_data, parent, as_widget) - - self.multiline = input_data.get("multiline", False) - placeholder = input_data.get("placeholder") - - layout = QtWidgets.QHBoxLayout(self) - layout.setContentsMargins(0, 0, 0, 0) - layout.setSpacing(5) - - if self.multiline: - self.input_field = QtWidgets.QPlainTextEdit(self) - else: - self.input_field = QtWidgets.QLineEdit(self) - - if placeholder: - self.input_field.setPlaceholderText(placeholder) - - self.setFocusProxy(self.input_field) - - layout_kwargs = {} - if self.multiline: - layout_kwargs["alignment"] = QtCore.Qt.AlignTop - - if not self._as_widget: - self.key = input_data["key"] - if not label_widget: - label = input_data["label"] - label_widget = QtWidgets.QLabel(label) - layout.addWidget(label_widget, 0, **layout_kwargs) - self.label_widget = label_widget - - layout.addWidget(self.input_field, 1, **layout_kwargs) - - self.input_field.textChanged.connect(self._on_value_change) - - def set_value(self, value): - if self.multiline: - self.input_field.setPlainText(value) - else: - self.input_field.setText(value) - - def item_value(self): - if self.multiline: - return self.input_field.toPlainText() - else: - return self.input_field.text() - - -class PathInputWidget(QtWidgets.QWidget, InputObject): - default_input_value = "" - value_changed = QtCore.Signal(object) - - def __init__( - self, input_data, parent, - as_widget=False, label_widget=None, parent_widget=None - ): - if parent_widget is None: - parent_widget = parent - super(PathInputWidget, self).__init__(parent_widget) - - self.initial_attributes(input_data, parent, as_widget) - - layout = QtWidgets.QHBoxLayout(self) - layout.setContentsMargins(0, 0, 0, 0) - layout.setSpacing(5) - - if not self._as_widget: - self.key = input_data["key"] - if not label_widget: - label = input_data["label"] - label_widget = QtWidgets.QLabel(label) - layout.addWidget(label_widget, 0) - self.label_widget = label_widget - - self.input_field = PathInput(self) - self.setFocusProxy(self.input_field) - layout.addWidget(self.input_field, 1) - - self.input_field.textChanged.connect(self._on_value_change) - - def set_value(self, value): - self.input_field.setText(value) - - def focusOutEvent(self, event): - self.input_field.clear_end_path() - super(PathInput, self).focusOutEvent(event) - - def item_value(self): - return self.input_field.text() - - -class EnumeratorWidget(QtWidgets.QWidget, InputObject): - default_input_value = True - value_changed = QtCore.Signal(object) - - def __init__( - self, input_data, parent, - as_widget=False, label_widget=None, parent_widget=None - ): - if parent_widget is None: - parent_widget = parent - super(EnumeratorWidget, self).__init__(parent_widget) - - self.initial_attributes(input_data, parent, as_widget) - self.multiselection = input_data.get("multiselection") - self.enum_items = input_data["enum_items"] - if not self.enum_items: - raise ValueError("Attribute `enum_items` is not defined.") - - layout = QtWidgets.QHBoxLayout(self) - layout.setContentsMargins(0, 0, 0, 0) - layout.setSpacing(5) - - if not self._as_widget: - self.key = input_data["key"] - if not label_widget: - label = input_data["label"] - label_widget = QtWidgets.QLabel(label) - label_widget.setAttribute(QtCore.Qt.WA_TranslucentBackground) - layout.addWidget(label_widget, 0) - self.label_widget = label_widget - - if self.multiselection: - placeholder = input_data.get("placeholder") - self.input_field = MultiSelectionComboBox( - placeholder=placeholder, parent=self - ) - else: - self.input_field = ComboBox(self) - - first_value = NOT_SET - for enum_item in self.enum_items: - for value, label in enum_item.items(): - if first_value is NOT_SET: - first_value = value - self.input_field.addItem(label, value) - self._first_value = first_value - - if self.multiselection: - model = self.input_field.model() - for idx in range(self.input_field.count()): - model.item(idx).setCheckable(True) - - layout.addWidget(self.input_field, 0) - - self.setFocusProxy(self.input_field) - - self.input_field.value_changed.connect(self._on_value_change) - - @property - def default_input_value(self): - if self.multiselection: - return [] - return self._first_value - - def set_value(self, value): - # Ignore value change because if `self.isChecked()` has same - # value as `value` the `_on_value_change` is not triggered - self.input_field.set_value(value) - - def update_style(self): - if self.as_widget: - state = self.style_state( - False, - self._is_invalid, - False, - self._is_modified - ) - else: - state = self.style_state( - self.has_studio_override, - self.is_invalid, - self.is_overriden, - self.is_modified - ) - - if self._state == state: - return - - self._state = state - self.input_field.setProperty("input-state", state) - self.input_field.style().polish(self.input_field) - if self.label_widget: - self.label_widget.setProperty("state", state) - self.label_widget.style().polish(self.label_widget) - - def item_value(self): - return self.input_field.value() - - -class RawJsonInput(QtWidgets.QPlainTextEdit): - tab_length = 4 - - def __init__(self, *args, **kwargs): - super(RawJsonInput, self).__init__(*args, **kwargs) - self.setObjectName("RawJsonInput") - self.setTabStopDistance( - QtGui.QFontMetricsF( - self.font() - ).horizontalAdvance(" ") * self.tab_length - ) - - def sizeHint(self): - document = self.document() - layout = document.documentLayout() - - height = document.documentMargin() + 2 * self.frameWidth() + 1 - block = document.begin() - while block != document.end(): - height += layout.blockBoundingRect(block).height() - block = block.next() - - hint = super(RawJsonInput, self).sizeHint() - hint.setHeight(height) - - return hint - - def set_value(self, value): - if value is NOT_SET: - value = "" - elif not isinstance(value, str): - try: - value = json.dumps(value, indent=4) - except Exception: - value = "" - self.setPlainText(value) - - def json_value(self): - return json.loads(self.toPlainText()) - - def has_invalid_value(self): - try: - self.json_value() - return False - except Exception: - return True - - def resizeEvent(self, event): - self.updateGeometry() - super(RawJsonInput, self).resizeEvent(event) - - -class RawJsonWidget(QtWidgets.QWidget, InputObject): - default_input_value = "{}" - value_changed = QtCore.Signal(object) - - def __init__( - self, input_data, parent, - as_widget=False, label_widget=None, parent_widget=None - ): - if parent_widget is None: - parent_widget = parent - super(RawJsonWidget, self).__init__(parent_widget) - - self.initial_attributes(input_data, parent, as_widget) - - layout = QtWidgets.QHBoxLayout(self) - layout.setContentsMargins(0, 0, 0, 0) - layout.setSpacing(5) - - self.input_field = RawJsonInput(self) - self.input_field.setSizePolicy( - QtWidgets.QSizePolicy.Minimum, - QtWidgets.QSizePolicy.MinimumExpanding - ) - - self.setFocusProxy(self.input_field) - - if not self.as_widget: - self.key = input_data["key"] - if not label_widget: - label = input_data["label"] - label_widget = QtWidgets.QLabel(label) - layout.addWidget(label_widget, 0, alignment=QtCore.Qt.AlignTop) - self.label_widget = label_widget - - layout.addWidget(self.input_field, 1, alignment=QtCore.Qt.AlignTop) - - self.input_field.textChanged.connect(self._on_value_change) - - def update_studio_values(self, parent_values): - self._is_invalid = self.input_field.has_invalid_value() - return super(RawJsonWidget, self).update_studio_values(parent_values) - - def set_value(self, value): - self.input_field.set_value(value) - - def _on_value_change(self, *args, **kwargs): - self._is_invalid = self.input_field.has_invalid_value() - return super(RawJsonWidget, self)._on_value_change(*args, **kwargs) - - def item_value(self): - if self.is_invalid: - return NOT_SET - return self.input_field.json_value() - - -class ListItem(QtWidgets.QWidget, SettingObject): - _btn_size = 20 - value_changed = QtCore.Signal(object) - - def __init__( - self, item_schema, config_parent, parent, is_strict=False - ): - super(ListItem, self).__init__(parent) - - self._set_default_attributes() - - self._is_strict = is_strict - - self._parent = config_parent - self._any_parent_is_group = True - self._is_empty = False - - layout = QtWidgets.QHBoxLayout(self) - layout.setContentsMargins(0, 0, 0, 0) - layout.setSpacing(3) - - char_up = qtawesome.charmap("fa.angle-up") - char_down = qtawesome.charmap("fa.angle-down") - - if not self._is_strict: - self.add_btn = QtWidgets.QPushButton("+") - self.remove_btn = QtWidgets.QPushButton("-") - self.up_btn = QtWidgets.QPushButton(char_up) - self.down_btn = QtWidgets.QPushButton(char_down) - - font_up_down = qtawesome.font("fa", 13) - self.up_btn.setFont(font_up_down) - self.down_btn.setFont(font_up_down) - - self.add_btn.setFocusPolicy(QtCore.Qt.ClickFocus) - self.remove_btn.setFocusPolicy(QtCore.Qt.ClickFocus) - self.up_btn.setFocusPolicy(QtCore.Qt.ClickFocus) - self.down_btn.setFocusPolicy(QtCore.Qt.ClickFocus) - - self.add_btn.setFixedSize(self._btn_size, self._btn_size) - self.remove_btn.setFixedSize(self._btn_size, self._btn_size) - self.up_btn.setFixedSize(self._btn_size, self._btn_size) - self.down_btn.setFixedSize(self._btn_size, self._btn_size) - - self.add_btn.setProperty("btn-type", "tool-item") - self.remove_btn.setProperty("btn-type", "tool-item") - self.up_btn.setProperty("btn-type", "tool-item") - self.down_btn.setProperty("btn-type", "tool-item") - - self.add_btn.clicked.connect(self._on_add_clicked) - self.remove_btn.clicked.connect(self._on_remove_clicked) - self.up_btn.clicked.connect(self._on_up_clicked) - self.down_btn.clicked.connect(self._on_down_clicked) - - layout.addWidget(self.add_btn, 0) - layout.addWidget(self.remove_btn, 0) - - ItemKlass = TypeToKlass.types[item_schema["type"]] - self.value_input = ItemKlass( - item_schema, - self, - as_widget=True, - label_widget=None - ) - - layout.addWidget(self.value_input, 1) - - if not self._is_strict: - self.spacer_widget = QtWidgets.QWidget(self) - self.spacer_widget.setAttribute(QtCore.Qt.WA_TranslucentBackground) - self.spacer_widget.setVisible(False) - - layout.addWidget(self.spacer_widget, 1) - - layout.addWidget(self.up_btn, 0) - layout.addWidget(self.down_btn, 0) - - self.value_input.value_changed.connect(self._on_value_change) - - @property - def as_widget(self): - return self._parent.as_widget - - @property - def any_parent_as_widget(self): - return self.as_widget or self._parent.any_parent_as_widget - - def set_as_empty(self, is_empty=True): - self._is_empty = is_empty - - self.spacer_widget.setVisible(is_empty) - self.value_input.setVisible(not is_empty) - self.remove_btn.setEnabled(not is_empty) - self.up_btn.setVisible(not is_empty) - self.down_btn.setVisible(not is_empty) - self.order_changed() - self._on_value_change() - - def order_changed(self): - row = self.row() - parent_row_count = self.parent_rows_count() - if parent_row_count == 1: - self.up_btn.setVisible(False) - self.down_btn.setVisible(False) - return - - if not self.up_btn.isVisible(): - self.up_btn.setVisible(True) - self.down_btn.setVisible(True) - - if row == 0: - self.up_btn.setEnabled(False) - self.down_btn.setEnabled(True) - - elif row == parent_row_count - 1: - self.up_btn.setEnabled(True) - self.down_btn.setEnabled(False) - - else: - self.up_btn.setEnabled(True) - self.down_btn.setEnabled(True) - - def _on_value_change(self, item=None): - self.value_changed.emit(self) - - def row(self): - return self._parent.input_fields.index(self) - - def parent_rows_count(self): - return len(self._parent.input_fields) - - def _on_add_clicked(self): - if self._is_empty: - self.set_as_empty(False) - else: - self._parent.add_row(row=self.row() + 1) - - def _on_remove_clicked(self): - self._parent.remove_row(self) - - def _on_up_clicked(self): - row = self.row() - self._parent.swap_rows(row - 1, row) - - def _on_down_clicked(self): - row = self.row() - self._parent.swap_rows(row, row + 1) - - def config_value(self): - if not self._is_empty: - return self.value_input.item_value() - return NOT_SET - - @property - def child_has_studio_override(self): - return self.value_input.child_has_studio_override - - @property - def child_modified(self): - return self.value_input.child_modified - - @property - def child_overriden(self): - return self.value_input.child_overriden - - def hierarchical_style_update(self): - self.value_input.hierarchical_style_update() - - def mouseReleaseEvent(self, event): - return QtWidgets.QWidget.mouseReleaseEvent(self, event) - - def update_default_values(self, value): - self.value_input.update_default_values(value) - - def update_studio_values(self, value): - self.value_input.update_studio_values(value) - - def apply_overrides(self, value): - self.value_input.apply_overrides(value) - - -class ListWidget(QtWidgets.QWidget, InputObject): - default_input_value = [] - value_changed = QtCore.Signal(object) - - def __init__( - self, input_data, parent, - as_widget=False, label_widget=None, parent_widget=None - ): - if parent_widget is None: - parent_widget = parent - super(ListWidget, self).__init__(parent_widget) - self.setObjectName("ListWidget") - - self.initial_attributes(input_data, parent, as_widget) - - object_type = input_data["object_type"] - if isinstance(object_type, dict): - self.item_schema = object_type - else: - self.item_schema = { - "type": object_type - } - # Backwards compatibility - input_modifiers = input_data.get("input_modifiers") or {} - if input_modifiers: - self.log.warning(( - "Used deprecated key `input_modifiers` to define item." - " Rather use `object_type` as dictionary with modifiers." - )) - self.item_schema.update(input_modifiers) - - self.input_fields = [] - - layout = QtWidgets.QHBoxLayout(self) - layout.setContentsMargins(0, 0, 0, 5) - layout.setSpacing(5) - - if not self.as_widget: - self.key = input_data["key"] - if not label_widget: - label_widget = QtWidgets.QLabel(input_data["label"], self) - layout.addWidget(label_widget, alignment=QtCore.Qt.AlignTop) - - self.label_widget = label_widget - - inputs_widget = QtWidgets.QWidget(self) - inputs_widget.setAttribute(QtCore.Qt.WA_TranslucentBackground) - layout.addWidget(inputs_widget) - - inputs_layout = QtWidgets.QVBoxLayout(inputs_widget) - inputs_layout.setContentsMargins(0, 0, 0, 0) - inputs_layout.setSpacing(3) - - self.inputs_widget = inputs_widget - self.inputs_layout = inputs_layout - - self.add_row(is_empty=True) - - def count(self): - return len(self.input_fields) - - def update_studio_values(self, parent_values): - super(ListWidget, self).update_studio_values(parent_values) - - self.hierarchical_style_update() - - def set_value(self, value): - previous_inputs = tuple(self.input_fields) - for item_value in value: - self.add_row(value=item_value) - - for input_field in previous_inputs: - self.remove_row(input_field) - - if self.count() == 0: - self.add_row(is_empty=True) - - def swap_rows(self, row_1, row_2): - if row_1 == row_2: - return - - if row_1 > row_2: - row_1, row_2 = row_2, row_1 - - field_1 = self.input_fields[row_1] - field_2 = self.input_fields[row_2] - - self.input_fields[row_1] = field_2 - self.input_fields[row_2] = field_1 - - layout_index = self.inputs_layout.indexOf(field_1) - self.inputs_layout.insertWidget(layout_index + 1, field_1) - - field_1.order_changed() - field_2.order_changed() - - def add_row(self, row=None, value=None, is_empty=False): - # Create new item - item_widget = ListItem(self.item_schema, self, self.inputs_widget) - - previous_field = None - next_field = None - - if row is None: - if self.input_fields: - previous_field = self.input_fields[-1] - self.inputs_layout.addWidget(item_widget) - self.input_fields.append(item_widget) - else: - if row > 0: - previous_field = self.input_fields[row - 1] - - max_index = self.count() - if row < max_index: - next_field = self.input_fields[row] - - self.inputs_layout.insertWidget(row, item_widget) - self.input_fields.insert(row, item_widget) - - if previous_field: - previous_field.order_changed() - - if next_field: - next_field.order_changed() - - if is_empty: - item_widget.set_as_empty() - item_widget.value_changed.connect(self._on_value_change) - - item_widget.order_changed() - - previous_input = None - for input_field in self.input_fields: - if previous_input is not None: - self.setTabOrder( - previous_input, input_field.value_input.focusProxy() - ) - previous_input = input_field.value_input.focusProxy() - - # Set text if entered text is not None - # else (when add button clicked) trigger `_on_value_change` - if value is not None: - if self._is_overriden: - item_widget.apply_overrides(value) - elif not self._has_studio_override: - item_widget.update_default_values(value) - else: - item_widget.update_studio_values(value) - self.hierarchical_style_update() - else: - self._on_value_change() - self.updateGeometry() - - def remove_row(self, item_widget): - item_widget.value_changed.disconnect() - - row = self.input_fields.index(item_widget) - previous_field = None - next_field = None - if row > 0: - previous_field = self.input_fields[row - 1] - - if row != len(self.input_fields) - 1: - next_field = self.input_fields[row + 1] - - self.inputs_layout.removeWidget(item_widget) - self.input_fields.pop(row) - item_widget.setParent(None) - item_widget.deleteLater() - - if previous_field: - previous_field.order_changed() - - if next_field: - next_field.order_changed() - - if self.count() == 0: - self.add_row(is_empty=True) - - self._on_value_change() - self.updateGeometry() - - def apply_overrides(self, parent_values): - self._is_modified = False - if parent_values is NOT_SET or self.key not in parent_values: - override_value = NOT_SET - else: - override_value = parent_values[self.key] - - self.override_value = override_value - - if override_value is NOT_SET: - self._is_overriden = False - self._was_overriden = False - if self.has_studio_override: - value = self.studio_value - else: - value = self.default_value - else: - self._is_overriden = True - self._was_overriden = True - value = override_value - - self._is_modified = False - self._state = None - - self.set_value(value) - - def hierarchical_style_update(self): - for input_field in self.input_fields: - input_field.hierarchical_style_update() - self.update_style() - - def update_style(self): - if not self.label_widget: - return - - state = self._style_state() - if self._state == state: - return - - self._state = state - self.label_widget.setProperty("state", state) - self.label_widget.style().polish(self.label_widget) - - def item_value(self): - output = [] - for item in self.input_fields: - value = item.config_value() - if value is not NOT_SET: - output.append(value) - return output - - -class ListStrictWidget(QtWidgets.QWidget, InputObject): - value_changed = QtCore.Signal(object) - _default_input_value = None - - def __init__( - self, input_data, parent, - as_widget=False, label_widget=None, parent_widget=None - ): - if parent_widget is None: - parent_widget = parent - super(ListStrictWidget, self).__init__(parent_widget) - self.setObjectName("ListStrictWidget") - - self.initial_attributes(input_data, parent, as_widget) - - self.input_fields = [] - - layout = QtWidgets.QHBoxLayout(self) - layout.setContentsMargins(0, 0, 0, 5) - layout.setSpacing(5) - - if not self.as_widget: - self.key = input_data["key"] - if not label_widget: - label_widget = QtWidgets.QLabel(input_data["label"], self) - layout.addWidget(label_widget, alignment=QtCore.Qt.AlignTop) - - self.label_widget = label_widget - - self._add_children(layout, input_data) - - def _add_children(self, layout, input_data): - inputs_widget = QtWidgets.QWidget(self) - inputs_widget.setAttribute(QtCore.Qt.WA_TranslucentBackground) - layout.addWidget(inputs_widget) - - horizontal = input_data.get("horizontal", True) - if horizontal: - inputs_layout = QtWidgets.QHBoxLayout(inputs_widget) - else: - inputs_layout = QtWidgets.QGridLayout(inputs_widget) - - inputs_layout.setContentsMargins(0, 0, 0, 0) - inputs_layout.setSpacing(3) - - self.inputs_widget = inputs_widget - self.inputs_layout = inputs_layout - - children_item_mapping = [] - for child_configuration in input_data["object_types"]: - item_widget = ListItem( - child_configuration, self, self.inputs_widget, is_strict=True - ) - - self.input_fields.append(item_widget) - item_widget.value_changed.connect(self._on_value_change) - - label = child_configuration.get("label") - label_widget = None - if label: - label_widget = QtWidgets.QLabel(label, self) - - children_item_mapping.append((label_widget, item_widget)) - - if horizontal: - self._add_children_horizontally(children_item_mapping) - else: - self._add_children_vertically(children_item_mapping) - - self.updateGeometry() - - def _add_children_vertically(self, children_item_mapping): - any_has_label = False - for item_mapping in children_item_mapping: - if item_mapping[0]: - any_has_label = True - break - - row = self.inputs_layout.count() - if not any_has_label: - self.inputs_layout.setColumnStretch(1, 1) - for item_mapping in children_item_mapping: - item_widget = item_mapping[1] - self.inputs_layout.addWidget(item_widget, row, 0, 1, 1) - - spacer_widget = QtWidgets.QWidget(self.inputs_widget) - self.inputs_layout.addWidget(spacer_widget, row, 1, 1, 1) - row += 1 - - else: - self.inputs_layout.setColumnStretch(2, 1) - for label_widget, item_widget in children_item_mapping: - self.inputs_layout.addWidget( - label_widget, row, 0, 1, 1, - alignment=QtCore.Qt.AlignRight | QtCore.Qt.AlignTop - ) - self.inputs_layout.addWidget(item_widget, row, 1, 1, 1) - - spacer_widget = QtWidgets.QWidget(self.inputs_widget) - self.inputs_layout.addWidget(spacer_widget, row, 2, 1, 1) - row += 1 - - def _add_children_horizontally(self, children_item_mapping): - for label_widget, item_widget in children_item_mapping: - if label_widget: - self.inputs_layout.addWidget(label_widget, 0) - self.inputs_layout.addWidget(item_widget, 0) - - spacer_widget = QtWidgets.QWidget(self.inputs_widget) - self.inputs_layout.addWidget(spacer_widget, 1) - - @property - def default_input_value(self): - if self._default_input_value is None: - self.set_value(NOT_SET) - self._default_input_value = self.item_value() - return self._default_input_value - - def set_value(self, value): - if self._is_overriden: - method_name = "apply_overrides" - elif not self._has_studio_override: - method_name = "update_default_values" - else: - method_name = "update_studio_values" - - for idx, input_field in enumerate(self.input_fields): - if value is NOT_SET: - _value = value - else: - if idx > len(value) - 1: - _value = NOT_SET - else: - _value = value[idx] - _method = getattr(input_field, method_name) - _method(_value) - - def hierarchical_style_update(self): - for input_field in self.input_fields: - input_field.hierarchical_style_update() - self.update_style() - - def update_style(self): - if not self.label_widget: - return - - state = self._style_state() - - if self._state == state: - return - - self._state = state - self.label_widget.setProperty("state", state) - self.label_widget.style().polish(self.label_widget) - - def item_value(self): - output = [] - for item in self.input_fields: - output.append(item.config_value()) - return output - - -class ModifiableDictItem(QtWidgets.QWidget, SettingObject): - _btn_size = 20 - value_changed = QtCore.Signal(object) - - def __init__(self, item_schema, config_parent, parent): - super(ModifiableDictItem, self).__init__(parent) - - self._set_default_attributes() - self._parent = config_parent - - any_parent_as_widget = config_parent.as_widget - if not any_parent_as_widget: - any_parent_as_widget = config_parent.any_parent_as_widget - - self._any_parent_as_widget = any_parent_as_widget - self._any_parent_is_group = True - - self._is_empty = False - self.is_key_duplicated = False - - layout = QtWidgets.QHBoxLayout(self) - layout.setContentsMargins(0, 0, 0, 0) - layout.setSpacing(3) - - ItemKlass = TypeToKlass.types[item_schema["type"]] - - self.key_input = QtWidgets.QLineEdit(self) - self.key_input.setObjectName("DictKey") - - self.value_input = ItemKlass( - item_schema, - self, - as_widget=True, - label_widget=None - ) - self.add_btn = QtWidgets.QPushButton("+") - self.remove_btn = QtWidgets.QPushButton("-") - - self.add_btn.setFocusPolicy(QtCore.Qt.ClickFocus) - self.remove_btn.setFocusPolicy(QtCore.Qt.ClickFocus) - - self.add_btn.setProperty("btn-type", "tool-item") - self.remove_btn.setProperty("btn-type", "tool-item") - - self.spacer_widget = QtWidgets.QWidget(self) - self.spacer_widget.setAttribute(QtCore.Qt.WA_TranslucentBackground) - self.spacer_widget.setVisible(False) - - layout.addWidget(self.add_btn, 0) - layout.addWidget(self.remove_btn, 0) - layout.addWidget(self.key_input, 0) - layout.addWidget(self.spacer_widget, 1) - layout.addWidget(self.value_input, 1) - - self.setFocusProxy(self.value_input) - - self.add_btn.setFixedSize(self._btn_size, self._btn_size) - self.remove_btn.setFixedSize(self._btn_size, self._btn_size) - self.add_btn.clicked.connect(self.on_add_clicked) - self.remove_btn.clicked.connect(self.on_remove_clicked) - - self.key_input.textChanged.connect(self._on_value_change) - self.value_input.value_changed.connect(self._on_value_change) - - self.origin_key = NOT_SET - - def key_value(self): - return self.key_input.text() - - def is_key_invalid(self): - if self._is_empty: - return False - - if self.key_value() == "": - return True - - if self.is_key_duplicated: - return True - return False - - def _on_value_change(self, item=None): - self.update_style() - self.value_changed.emit(self) - - def update_default_values(self, key, value): - self.origin_key = key - self.key_input.setText(key) - self.value_input.update_default_values(value) - - def update_studio_values(self, key, value): - self.origin_key = key - self.key_input.setText(key) - self.value_input.update_studio_values(value) - - def apply_overrides(self, key, value): - self.origin_key = key - self.key_input.setText(key) - self.value_input.apply_overrides(value) - - @property - def is_group(self): - return self._parent.is_group - - def on_add_clicked(self): - if self._is_empty: - self.set_as_empty(False) - else: - self._parent.add_row(row=self.row() + 1) - - def on_remove_clicked(self): - self._parent.remove_row(self) - - def set_as_empty(self, is_empty=True): - self._is_empty = is_empty - - self.key_input.setVisible(not is_empty) - self.value_input.setVisible(not is_empty) - self.remove_btn.setEnabled(not is_empty) - self.spacer_widget.setVisible(is_empty) - self._on_value_change() - - @property - def any_parent_is_group(self): - return self._parent.any_parent_is_group - - def is_key_modified(self): - return self.key_value() != self.origin_key - - def is_value_modified(self): - return self.value_input.is_modified - - @property - def is_modified(self): - return self.is_value_modified() or self.is_key_modified() - - def hierarchical_style_update(self): - self.value_input.hierarchical_style_update() - self.update_style() - - @property - def is_invalid(self): - if self._is_empty: - return False - return self.is_key_invalid() or self.value_input.is_invalid - - def update_style(self): - state = "" - if not self._is_empty: - if self.is_key_invalid(): - state = "invalid" - elif self.is_key_modified(): - state = "modified" - - self.key_input.setProperty("state", state) - self.key_input.style().polish(self.key_input) - - def row(self): - return self._parent.input_fields.index(self) - - def item_value(self): - key = self.key_input.text() - value = self.value_input.item_value() - return {key: value} - - def config_value(self): - if self._is_empty: - return {} - return self.item_value() - - def mouseReleaseEvent(self, event): - return QtWidgets.QWidget.mouseReleaseEvent(self, event) - - -class ModifiableDict(QtWidgets.QWidget, InputObject): - default_input_value = {} - # Should be used only for dictionary with one datatype as value - # TODO this is actually input field (do not care if is group or not) - value_changed = QtCore.Signal(object) - expand_in_grid = True - - def __init__( - self, input_data, parent, - as_widget=False, label_widget=None, parent_widget=None - ): - if parent_widget is None: - parent_widget = parent - super(ModifiableDict, self).__init__(parent_widget) - self.setObjectName("ModifiableDict") - - self.initial_attributes(input_data, parent, as_widget) - - self.input_fields = [] - - self.key = input_data["key"] - - object_type = input_data["object_type"] - if isinstance(object_type, dict): - self.item_schema = object_type - else: - # Backwards compatibility - self.item_schema = { - "type": object_type - } - input_modifiers = input_data.get("input_modifiers") or {} - if input_modifiers: - self.log.warning(( - "Used deprecated key `input_modifiers` to define item." - " Rather use `object_type` as dictionary with modifiers." - )) - self.item_schema.update(input_modifiers) - - if input_data.get("highlight_content", False): - content_state = "hightlighted" - bottom_margin = 5 - else: - content_state = "" - bottom_margin = 0 - - main_layout = QtWidgets.QHBoxLayout(self) - main_layout.setContentsMargins(0, 0, 0, 0) - main_layout.setSpacing(0) - - if as_widget: - body_widget = None - self.label_widget = label_widget - else: - body_widget = ExpandingWidget(input_data["label"], self) - main_layout.addWidget(body_widget) - - self.body_widget = body_widget - self.label_widget = body_widget.label_widget - - collapsable = input_data.get("collapsable", True) - if collapsable: - collapsed = input_data.get("collapsed", True) - if not collapsed: - body_widget.toggle_content() - - else: - body_widget.hide_toolbox(hide_content=False) - - if body_widget is None: - content_parent_widget = self - else: - content_parent_widget = body_widget - - content_widget = QtWidgets.QWidget(content_parent_widget) - content_widget.setObjectName("ContentWidget") - content_widget.setProperty("content_state", content_state) - content_layout = QtWidgets.QVBoxLayout(content_widget) - content_layout.setContentsMargins(CHILD_OFFSET, 3, 0, bottom_margin) - - if body_widget is None: - main_layout.addWidget(content_widget) - else: - body_widget.set_content_widget(content_widget) - - self.body_widget = body_widget - self.content_widget = content_widget - self.content_layout = content_layout - - self.setAttribute(QtCore.Qt.WA_TranslucentBackground) - - self.add_row(is_empty=True) - - def count(self): - return len(self.input_fields) - - def set_value(self, value): - previous_inputs = tuple(self.input_fields) - for item_key, item_value in value.items(): - self.add_row(key=item_key, value=item_value) - - for input_field in previous_inputs: - self.remove_row(input_field) - - if self.count() == 0: - self.add_row(is_empty=True) - - def _on_value_change(self, item=None): - if self.ignore_value_changes: - return - - fields_by_keys = collections.defaultdict(list) - for input_field in self.input_fields: - key = input_field.key_value() - fields_by_keys[key].append(input_field) - - for fields in fields_by_keys.values(): - if len(fields) == 1: - field = fields[0] - if field.is_key_duplicated: - field.is_key_duplicated = False - field.update_style() - else: - for field in fields: - field.is_key_duplicated = True - field.update_style() - - if self.is_overidable: - self._is_overriden = True - else: - self._has_studio_override = True - - if self._is_invalid: - self._is_modified = True - elif self._is_overriden: - self._is_modified = self.item_value() != self.override_value - elif self._has_studio_override: - self._is_modified = self.item_value() != self.studio_value - else: - self._is_modified = self.item_value() != self.default_value - - self.update_style() - - self.value_changed.emit(self) - - def hierarchical_style_update(self): - for input_field in self.input_fields: - input_field.hierarchical_style_update() - self.update_style() - - def update_style(self): - state = self._style_state() - - if self._state == state: - return - - self._state = state - - if self.label_widget: - self.label_widget.setProperty("state", state) - self.label_widget.style().polish(self.label_widget) - - if not self.body_widget: - return - - if state: - child_state = "child-{}".format(state) - else: - child_state = "" - - self.body_widget.side_line_widget.setProperty("state", child_state) - self.body_widget.side_line_widget.style().polish( - self.body_widget.side_line_widget - ) - - def all_item_values(self): - output = {} - for item in self.input_fields: - output.update(item.item_value()) - return output - - def item_value(self): - output = {} - for item in self.input_fields: - output.update(item.config_value()) - return output - - def add_row(self, row=None, key=None, value=None, is_empty=False): - # Create new item - item_widget = ModifiableDictItem( - self.item_schema, self, self.content_widget - ) - if is_empty: - item_widget.set_as_empty() - - item_widget.value_changed.connect(self._on_value_change) - - if row is None: - self.content_layout.addWidget(item_widget) - self.input_fields.append(item_widget) - else: - self.content_layout.insertWidget(row, item_widget) - self.input_fields.insert(row, item_widget) - - previous_input = None - for input_field in self.input_fields: - if previous_input is not None: - self.setTabOrder( - previous_input, input_field.key_input - ) - previous_input = input_field.value_input.focusProxy() - self.setTabOrder( - input_field.key_input, previous_input - ) - - # Set value if entered value is not None - # else (when add button clicked) trigger `_on_value_change` - if value is not None and key is not None: - if not self._has_studio_override: - item_widget.update_default_values(key, value) - elif self._is_overriden: - item_widget.apply_overrides(key, value) - else: - item_widget.update_studio_values(key, value) - self.hierarchical_style_update() - else: - self._on_value_change() - self.parent().updateGeometry() - - def remove_row(self, item_widget): - item_widget.value_changed.disconnect() - - self.content_layout.removeWidget(item_widget) - self.input_fields.remove(item_widget) - item_widget.setParent(None) - item_widget.deleteLater() - - if self.count() == 0: - self.add_row(is_empty=True) - - self._on_value_change() - self.parent().updateGeometry() - - @property - def is_invalid(self): - return self._is_invalid or self.child_invalid - - @property - def child_invalid(self): - for input_field in self.input_fields: - if input_field.is_invalid: - return True - return False - - -# Dictionaries -class DictWidget(QtWidgets.QWidget, SettingObject): - value_changed = QtCore.Signal(object) - expand_in_grid = True - - def __init__( - self, input_data, parent, - as_widget=False, label_widget=None, parent_widget=None - ): - if parent_widget is None: - parent_widget = parent - super(DictWidget, self).__init__(parent_widget) - - self.initial_attributes(input_data, parent, as_widget) - - self.input_fields = [] - - self.checkbox_widget = None - self.checkbox_key = input_data.get("checkbox_key") - - self.label_widget = label_widget - - if self.as_widget: - self._ui_as_widget(input_data) - else: - self._ui_as_item(input_data) - - def _ui_as_item(self, input_data): - self.key = input_data["key"] - if input_data.get("highlight_content", False): - content_state = "hightlighted" - bottom_margin = 5 - else: - content_state = "" - bottom_margin = 0 - - main_layout = QtWidgets.QHBoxLayout(self) - main_layout.setContentsMargins(0, 0, 0, 0) - main_layout.setSpacing(0) - - body_widget = ExpandingWidget(input_data["label"], self) - - main_layout.addWidget(body_widget) - - content_widget = QtWidgets.QWidget(body_widget) - content_widget.setObjectName("ContentWidget") - content_widget.setProperty("content_state", content_state) - content_layout = QtWidgets.QGridLayout(content_widget) - content_layout.setContentsMargins(CHILD_OFFSET, 5, 0, bottom_margin) - - body_widget.set_content_widget(content_widget) - - self.body_widget = body_widget - self.content_widget = content_widget - self.content_layout = content_layout - - self.label_widget = body_widget.label_widget - - for child_data in input_data.get("children", []): - self.add_children_gui(child_data) - - collapsable = input_data.get("collapsable", True) - if len(self.input_fields) == 1 and self.checkbox_widget: - body_widget.hide_toolbox(hide_content=True) - - elif collapsable: - collapsed = input_data.get("collapsed", True) - if not collapsed: - body_widget.toggle_content() - else: - body_widget.hide_toolbox(hide_content=False) - - def _ui_as_widget(self, input_data): - body = QtWidgets.QWidget(self) - body.setObjectName("DictAsWidgetBody") - show_borders = str(int(input_data.get("show_borders", True))) - body.setProperty("show_borders", show_borders) - - content_layout = QtWidgets.QGridLayout(body) - content_layout.setContentsMargins(5, 5, 5, 5) - self.content_layout = content_layout - - layout = QtWidgets.QHBoxLayout(self) - layout.setContentsMargins(0, 0, 0, 0) - layout.setSpacing(5) - layout.addWidget(body) - - for child_configuration in input_data["children"]: - self.add_children_gui(child_configuration) - - def add_children_gui(self, child_configuration): - item_type = child_configuration["type"] - klass = TypeToKlass.types.get(item_type) - - row = self.content_layout.rowCount() - if not getattr(klass, "is_input_type", False): - item = klass(child_configuration, self) - self.content_layout.addWidget(item, row, 0, 1, 2) - return item - - if self.checkbox_key and not self.checkbox_widget: - key = child_configuration.get("key") - if key == self.checkbox_key: - if child_configuration["type"] != "boolean": - self.log.warning(( - "SCHEMA BUG: Dictionary item has set as checkbox" - " item invalid type \"{}\". Expected \"boolean\"." - ).format(child_configuration["type"])) - else: - return self._add_checkbox_child(child_configuration) - - label_widget = None - if not klass.expand_in_grid: - label = child_configuration.get("label") - if label is not None: - label_widget = GridLabelWidget(label, self) - self.content_layout.addWidget(label_widget, row, 0, 1, 1) - - item = klass(child_configuration, self, label_widget=label_widget) - item.value_changed.connect(self._on_value_change) - - if label_widget: - label_widget.input_field = item - self.content_layout.addWidget(item, row, 1, 1, 1) - else: - self.content_layout.addWidget(item, row, 0, 1, 2) - - self.input_fields.append(item) - return item - - def _add_checkbox_child(self, child_configuration): - item = BooleanWidget( - child_configuration, self, label_widget=self.label_widget - ) - item.value_changed.connect(self._on_value_change) - - self.body_widget.add_widget_before_label(item) - self.checkbox_widget = item - self.input_fields.append(item) - return item - - def remove_overrides(self): - self._is_overriden = False - self._is_modified = False - for input_field in self.input_fields: - input_field.remove_overrides() - - def reset_to_pype_default(self): - for input_field in self.input_fields: - input_field.reset_to_pype_default() - self._has_studio_override = False - - def set_studio_default(self): - for input_field in self.input_fields: - input_field.set_studio_default() - - if self.is_group: - self._has_studio_override = True - - def discard_changes(self): - self._is_overriden = self._was_overriden - self._is_modified = False - - for input_field in self.input_fields: - input_field.discard_changes() - - self._is_modified = self.child_modified - - def set_as_overriden(self): - if self.is_overriden: - return - - if self.is_group: - self._is_overriden = True - return - - for item in self.input_fields: - item.set_as_overriden() - - def update_default_values(self, parent_values): - # Make sure this is set to False - self._state = None - self._child_state = None - - value = NOT_SET - if self.as_widget: - value = parent_values - elif parent_values is not NOT_SET: - value = parent_values.get(self.key, NOT_SET) - - for item in self.input_fields: - item.update_default_values(value) - - def update_studio_values(self, parent_values): - # Make sure this is set to False - self._state = None - self._child_state = None - value = NOT_SET - if self.as_widget: - value = parent_values - else: - if parent_values is not NOT_SET: - value = parent_values.get(self.key, NOT_SET) - - self._has_studio_override = False - if self.is_group and value is not NOT_SET: - self._has_studio_override = True - - self._had_studio_override = bool(self._has_studio_override) - - for item in self.input_fields: - item.update_studio_values(value) - - def apply_overrides(self, parent_values): - # Make sure this is set to False - self._state = None - self._child_state = None - - if self.as_widget: - override_values = parent_values - else: - metadata = {} - groups = tuple() - override_values = NOT_SET - if parent_values is not NOT_SET: - metadata = parent_values.get(METADATA_KEY) or metadata - groups = metadata.get("groups") or groups - override_values = parent_values.get(self.key, override_values) - - self._is_overriden = self.key in groups - - for item in self.input_fields: - item.apply_overrides(override_values) - - if not self.as_widget: - if not self._is_overriden: - self._is_overriden = ( - self.is_group - and self.is_overidable - and self.child_overriden - ) - self._was_overriden = bool(self._is_overriden) - - def _on_value_change(self, item=None): - if self.ignore_value_changes: - return - - if self.is_group and not (self.as_widget or self.any_parent_as_widget): - if self.is_overidable: - self._is_overriden = True - else: - self._has_studio_override = True - - # TODO check if this is required - self.hierarchical_style_update() - - self.value_changed.emit(self) - - self.update_style() - - def hierarchical_style_update(self): - for input_field in self.input_fields: - input_field.hierarchical_style_update() - self.update_style() - - def update_style(self, is_overriden=None): - # TODO add style update when used as widget - if self.as_widget: - return - - child_has_studio_override = self.child_has_studio_override - child_modified = self.child_modified - child_invalid = self.child_invalid - child_state = self.style_state( - child_has_studio_override, - child_invalid, - self.child_overriden, - child_modified - ) - if child_state: - child_state = "child-{}".format(child_state) - - if child_state != self._child_state: - self.body_widget.side_line_widget.setProperty("state", child_state) - self.body_widget.side_line_widget.style().polish( - self.body_widget.side_line_widget - ) - self._child_state = child_state - - state = self.style_state( - self.had_studio_override, - child_invalid, - self.is_overriden, - self.is_modified - ) - if self._state == state: - return - - self.label_widget.setProperty("state", state) - self.label_widget.style().polish(self.label_widget) - - self._state = state - - @property - def is_modified(self): - if self.is_group: - return self._is_modified or self.child_modified - return False - - @property - def child_has_studio_override(self): - for input_field in self.input_fields: - if ( - input_field.has_studio_override - or input_field.child_has_studio_override - ): - return True - return False - - @property - def child_modified(self): - for input_field in self.input_fields: - if input_field.child_modified: - return True - return False - - @property - def child_overriden(self): - for input_field in self.input_fields: - if input_field.is_overriden or input_field.child_overriden: - return True - return False - - @property - def child_invalid(self): - for input_field in self.input_fields: - if input_field.child_invalid: - return True - return False - - def get_invalid(self): - output = [] - for input_field in self.input_fields: - output.extend(input_field.get_invalid()) - return output - - def item_value(self): - output = {} - for input_field in self.input_fields: - # TODO maybe merge instead of update should be used - # NOTE merge is custom function which merges 2 dicts - output.update(input_field.config_value()) - return output - - def studio_overrides(self): - if ( - not (self.as_widget or self.any_parent_as_widget) - and not self.has_studio_override - and not self.child_has_studio_override - ): - return NOT_SET, False - - values = {} - groups = [] - for input_field in self.input_fields: - value, is_group = input_field.studio_overrides() - if value is not NOT_SET: - values.update(value) - if is_group: - groups.extend(value.keys()) - if groups: - values[METADATA_KEY] = {"groups": groups} - return {self.key: values}, self.is_group - - def overrides(self): - if not self.is_overriden and not self.child_overriden: - return NOT_SET, False - - values = {} - groups = [] - for input_field in self.input_fields: - value, is_group = input_field.overrides() - if value is not NOT_SET: - values.update(value) - if is_group: - groups.extend(value.keys()) - if groups: - values[METADATA_KEY] = {"groups": groups} - return {self.key: values}, self.is_group - - -class DictInvisible(QtWidgets.QWidget, SettingObject): - # TODO is not overridable by itself - value_changed = QtCore.Signal(object) - allow_actions = False - expand_in_grid = True - - def __init__( - self, input_data, parent, - as_widget=False, label_widget=None, parent_widget=None - ): - if parent_widget is None: - parent_widget = parent - super(DictInvisible, self).__init__(parent_widget) - self.setObjectName("DictInvisible") - - self.initial_attributes(input_data, parent, as_widget) - - if self._is_group: - raise TypeError("DictInvisible can't be marked as group input.") - - self.setAttribute(QtCore.Qt.WA_TranslucentBackground) - - layout = QtWidgets.QGridLayout(self) - layout.setContentsMargins(0, 0, 0, 0) - layout.setSpacing(5) - - self.content_layout = layout - - self.input_fields = [] - - self.key = input_data["key"] - - for child_data in input_data.get("children", []): - self.add_children_gui(child_data) - - def add_children_gui(self, child_configuration): - item_type = child_configuration["type"] - klass = TypeToKlass.types.get(item_type) - - row = self.content_layout.rowCount() - if not getattr(klass, "is_input_type", False): - item = klass(child_configuration, self) - self.content_layout.addWidget(item, row, 0, 1, 2) - return item - - label_widget = None - if not klass.expand_in_grid: - label = child_configuration.get("label") - if label is not None: - label_widget = GridLabelWidget(label, self) - self.content_layout.addWidget(label_widget, row, 0, 1, 1) - - item = klass(child_configuration, self, label_widget=label_widget) - item.value_changed.connect(self._on_value_change) - - if label_widget: - label_widget.input_field = item - self.content_layout.addWidget(item, row, 1, 1, 1) - else: - self.content_layout.addWidget(item, row, 0, 1, 2) - - self.input_fields.append(item) - return item - - def update_style(self, *args, **kwargs): - return - - @property - def child_has_studio_override(self): - for input_field in self.input_fields: - if ( - input_field.has_studio_override - or input_field.child_has_studio_override - ): - return True - return False - - @property - def child_modified(self): - for input_field in self.input_fields: - if input_field.child_modified: - return True - return False - - @property - def child_overriden(self): - for input_field in self.input_fields: - if input_field.is_overriden or input_field.child_overriden: - return True - return False - - @property - def child_invalid(self): - for input_field in self.input_fields: - if input_field.child_invalid: - return True - return False - - def get_invalid(self): - output = [] - for input_field in self.input_fields: - output.extend(input_field.get_invalid()) - return output - - def item_value(self): - output = {} - for input_field in self.input_fields: - # TODO maybe merge instead of update should be used - # NOTE merge is custom function which merges 2 dicts - output.update(input_field.config_value()) - return output - - def _on_value_change(self, item=None): - if self.ignore_value_changes: - return - - if self.is_group and not self.any_parent_as_widget: - if self.is_overidable: - self._is_overriden = True - else: - self._has_studio_override = True - self.hierarchical_style_update() - - self.value_changed.emit(self) - - def hierarchical_style_update(self): - for input_field in self.input_fields: - input_field.hierarchical_style_update() - self.update_style() - - def remove_overrides(self): - self._is_overriden = False - self._is_modified = False - for input_field in self.input_fields: - input_field.remove_overrides() - - def reset_to_pype_default(self): - for input_field in self.input_fields: - input_field.reset_to_pype_default() - self._has_studio_override = False - - def set_studio_default(self): - for input_field in self.input_fields: - input_field.set_studio_default() - - if self.is_group: - self._has_studio_override = True - - def discard_changes(self): - self._is_modified = False - self._is_overriden = self._was_overriden - - for input_field in self.input_fields: - input_field.discard_changes() - - self._is_modified = self.child_modified - - def set_as_overriden(self): - if self.is_overriden: - return - - if self.is_group: - self._is_overriden = True - return - - for item in self.input_fields: - item.set_as_overriden() - - def update_default_values(self, parent_values): - value = NOT_SET - if self._as_widget: - value = parent_values - elif parent_values is not NOT_SET: - value = parent_values.get(self.key, NOT_SET) - - for item in self.input_fields: - item.update_default_values(value) - - def update_studio_values(self, parent_values): - value = NOT_SET - if parent_values is not NOT_SET: - value = parent_values.get(self.key, NOT_SET) - - for item in self.input_fields: - item.update_studio_values(value) - - def apply_overrides(self, parent_values): - # Make sure this is set to False - self._state = None - self._child_state = None - - metadata = {} - groups = tuple() - override_values = NOT_SET - if parent_values is not NOT_SET: - metadata = parent_values.get(METADATA_KEY) or metadata - groups = metadata.get("groups") or groups - override_values = parent_values.get(self.key, override_values) - - self._is_overriden = self.key in groups - - for item in self.input_fields: - item.apply_overrides(override_values) - - if not self._is_overriden: - self._is_overriden = ( - self.is_group - and self.is_overidable - and self.child_overriden - ) - self._was_overriden = bool(self._is_overriden) - - def studio_overrides(self): - if ( - not (self.as_widget or self.any_parent_as_widget) - and not self.has_studio_override - and not self.child_has_studio_override - ): - return NOT_SET, False - - values = {} - groups = [] - for input_field in self.input_fields: - value, is_group = input_field.studio_overrides() - if value is not NOT_SET: - values.update(value) - if is_group: - groups.extend(value.keys()) - if groups: - values[METADATA_KEY] = {"groups": groups} - return {self.key: values}, self.is_group - - def overrides(self): - if not self.is_overriden and not self.child_overriden: - return NOT_SET, False - - values = {} - groups = [] - for input_field in self.input_fields: - value, is_group = input_field.overrides() - if value is not NOT_SET: - values.update(value) - if is_group: - groups.extend(value.keys()) - if groups: - values[METADATA_KEY] = {"groups": groups} - return {self.key: values}, self.is_group - - -class PathWidget(QtWidgets.QWidget, SettingObject): - value_changed = QtCore.Signal(object) - platforms = ("windows", "darwin", "linux") - platform_labels_mapping = { - "windows": "Windows", - "darwin": "MacOS", - "linux": "Linux" - } - - def __init__( - self, input_data, parent, - as_widget=False, label_widget=None, parent_widget=None - ): - if parent_widget is None: - parent_widget = parent - super(PathWidget, self).__init__(parent_widget) - - self.initial_attributes(input_data, parent, as_widget) - - # This is partial input and dictionary input - if not self.any_parent_is_group and not self._as_widget: - self._is_group = True - else: - self._is_group = False - - self.multiplatform = input_data.get("multiplatform", False) - self.multipath = input_data.get("multipath", False) - - self.input_field = None - - layout = QtWidgets.QHBoxLayout(self) - layout.setContentsMargins(0, 0, 0, 0) - layout.setSpacing(5) - - if not self.as_widget: - self.key = input_data["key"] - if not label_widget: - label = input_data["label"] - label_widget = QtWidgets.QLabel(label) - label_widget.setAttribute(QtCore.Qt.WA_TranslucentBackground) - layout.addWidget(label_widget, 0, alignment=QtCore.Qt.AlignTop) - self.label_widget = label_widget - - self.content_widget = QtWidgets.QWidget(self) - self.content_layout = QtWidgets.QVBoxLayout(self.content_widget) - self.content_layout.setSpacing(0) - self.content_layout.setContentsMargins(0, 0, 0, 0) - - layout.addWidget(self.content_widget) - - self.create_gui() - - @property - def default_input_value(self): - if self.multipath: - value_type = list - else: - value_type = str - - if self.multiplatform: - return { - platform: value_type() - for platform in self.platforms - } - return value_type() - - def create_gui(self): - if not self.multiplatform and not self.multipath: - input_data = {"key": self.key} - path_input = PathInputWidget( - input_data, self, - as_widget=True, label_widget=self.label_widget - ) - self.setFocusProxy(path_input) - self.content_layout.addWidget(path_input) - self.input_field = path_input - path_input.value_changed.connect(self._on_value_change) - return - - if not self.multiplatform: - item_schema = { - "key": self.key, - "object_type": "path-input" - } - input_widget = ListWidget( - item_schema, self, - as_widget=True, label_widget=self.label_widget - ) - self.setFocusProxy(input_widget) - self.content_layout.addWidget(input_widget) - self.input_field = input_widget - input_widget.value_changed.connect(self._on_value_change) - return - - item_schema = { - "type": "dict", - "show_borders": False, - "children": [] - } - for platform_key in self.platforms: - platform_label = self.platform_labels_mapping[platform_key] - child_item = { - "key": platform_key, - "label": platform_label - } - if self.multipath: - child_item["type"] = "list" - child_item["object_type"] = "path-input" - else: - child_item["type"] = "path-input" - - item_schema["children"].append(child_item) - - input_widget = DictWidget( - item_schema, self, as_widget=True, label_widget=self.label_widget - ) - self.content_layout.addWidget(input_widget) - self.input_field = input_widget - input_widget.value_changed.connect(self._on_value_change) - - def update_default_values(self, parent_values): - self._state = None - self._child_state = None - self._is_modified = False - - value = NOT_SET - if self.as_widget: - value = parent_values - elif parent_values is not NOT_SET: - value = parent_values.get(self.key, NOT_SET) - - if value is NOT_SET: - if self.develop_mode: - self.defaults_not_set = True - value = self.default_input_value - if value is NOT_SET: - raise NotImplementedError(( - "{} Does not have implemented" - " attribute `default_input_value`" - ).format(self)) - - else: - raise ValueError( - "Default value is not set. This is implementation BUG." - ) - else: - self.defaults_not_set = False - - self.default_value = value - self._has_studio_override = False - self._had_studio_override = False - - # TODO handle invalid value type - self.input_field.update_default_values(value) - - def update_studio_values(self, parent_values): - self._state = None - self._child_state = None - self._is_modified = False - - value = NOT_SET - if self.as_widget: - value = parent_values - elif parent_values is not NOT_SET: - value = parent_values.get(self.key, NOT_SET) - - self.studio_value = value - if value is not NOT_SET: - self._has_studio_override = True - self._had_studio_override = True - else: - self._has_studio_override = False - self._had_studio_override = False - - # TODO handle invalid value type - self.input_field.update_studio_values(value) - - def apply_overrides(self, parent_values): - self._is_modified = False - self._state = None - self._child_state = None - - override_values = NOT_SET - if self._as_widget: - override_values = parent_values - elif parent_values is not NOT_SET: - override_values = parent_values.get(self.key, NOT_SET) - - self._is_overriden = override_values is not NOT_SET - self._was_overriden = bool(self._is_overriden) - - # TODO handle invalid value type - self.input_field.update_studio_values(override_values) - - if not self._is_overriden: - self._is_overriden = ( - self.is_group - and self.is_overidable - and self.child_overriden - ) - self._is_modified = False - self._was_overriden = bool(self._is_overriden) - - def set_value(self, value): - if not self.multiplatform: - return self.input_field.set_value(value) - - for _input_field in self.input_field.input_fields: - _value = value.get(_input_field.key, NOT_SET) - if _value is NOT_SET: - continue - _input_field.set_value(_value) - - def _on_value_change(self, item=None): - if self.ignore_value_changes: - return - - if not self.any_parent_as_widget: - if self.is_overidable: - self._is_overriden = True - else: - self._has_studio_override = True - - if self._is_invalid: - self._is_modified = True - elif self._is_overriden: - self._is_modified = self.item_value() != self.override_value - elif self._has_studio_override: - self._is_modified = self.item_value() != self.studio_value - else: - self._is_modified = self.item_value() != self.default_value - - self.hierarchical_style_update() - - self.value_changed.emit(self) - - def update_style(self, is_overriden=None): - child_has_studio_override = self.child_has_studio_override - child_modified = self.child_modified - child_invalid = self.child_invalid - child_state = self.style_state( - child_has_studio_override, - child_invalid, - self.child_overriden, - child_modified - ) - if child_state: - child_state = "child-{}".format(child_state) - - if child_state != self._child_state: - self.setProperty("state", child_state) - self.style().polish(self) - self._child_state = child_state - - if self.label_widget: - state = self.style_state( - child_has_studio_override, - child_invalid, - self.is_overriden, - self.is_modified - ) - if self._state == state: - return - - self.label_widget.setProperty("state", state) - self.label_widget.style().polish(self.label_widget) - - self._state = state - - def remove_overrides(self): - self._is_overriden = False - self._is_modified = False - self.input_field.remove_overrides() - - def reset_to_pype_default(self): - self.input_field.reset_to_pype_default() - self._has_studio_override = False - - def set_studio_default(self): - self.input_field.set_studio_default() - - if self.is_group: - self._has_studio_override = True - - def discard_changes(self): - self._is_overriden = self._was_overriden - self._has_studio_override = self._had_studio_override - - self.input_field.discard_changes() - - if not self.is_overidable: - if self.has_studio_override: - self._is_modified = self.studio_value != self.item_value() - else: - self._is_modified = self.default_value != self.item_value() - self._is_overriden = False - return - - self._is_modified = False - self._is_overriden = self._was_overriden - - def set_as_overriden(self): - self._is_overriden = True - - @property - def child_has_studio_override(self): - return self.has_studio_override - - @property - def child_modified(self): - return self.is_modified - - @property - def child_overriden(self): - return self.is_overriden - - @property - def child_invalid(self): - return self.input_field.child_invalid - - def hierarchical_style_update(self): - self.input_field.hierarchical_style_update() - self.update_style() - - def item_value(self): - return self.input_field.item_value() - - def studio_overrides(self): - if ( - not (self.as_widget or self.any_parent_as_widget) - and not self.has_studio_override - and not self.child_has_studio_override - ): - return NOT_SET, False - - value = {self.key: self.item_value()} - return value, self.is_group - - def overrides(self): - if not self.is_overriden and not self.child_overriden: - return NOT_SET, False - - value = {self.key: self.item_value()} - return value, self.is_group - - -# Proxy for form layout -class FormLabel(QtWidgets.QLabel): - def __init__(self, *args, **kwargs): - super(FormLabel, self).__init__(*args, **kwargs) - self.item = None - - -class DictFormWidget(QtWidgets.QWidget, SettingObject): - value_changed = QtCore.Signal(object) - allow_actions = False - expand_in_grid = True - - def __init__( - self, input_data, parent, - as_widget=False, label_widget=None, parent_widget=None - ): - if parent_widget is None: - parent_widget = parent - super(DictFormWidget, self).__init__(parent_widget) - - self.initial_attributes(input_data, parent, as_widget) - - self._as_widget = False - self._is_group = False - - self.input_fields = [] - self.content_layout = QtWidgets.QFormLayout(self) - self.content_layout.setContentsMargins(0, 0, 0, 0) - - for child_data in input_data.get("children", []): - self.add_children_gui(child_data) - - self.setAttribute(QtCore.Qt.WA_TranslucentBackground) - - def add_children_gui(self, child_configuration): - item_type = child_configuration["type"] - # Pop label to not be set in child - label = child_configuration["label"] - - klass = TypeToKlass.types.get(item_type) - - label_widget = FormLabel(label, self) - - item = klass(child_configuration, self, label_widget=label_widget) - label_widget.item = item - - item.value_changed.connect(self._on_value_change) - self.content_layout.addRow(label_widget, item) - self.input_fields.append(item) - return item - - def mouseReleaseEvent(self, event): - if event.button() == QtCore.Qt.RightButton: - position = self.mapFromGlobal(QtGui.QCursor().pos()) - widget = self.childAt(position) - if widget and isinstance(widget, FormLabel): - widget.item.mouseReleaseEvent(event) - event.accept() - return - super(DictFormWidget, self).mouseReleaseEvent(event) - - def apply_overrides(self, parent_values): - for item in self.input_fields: - item.apply_overrides(parent_values) - - def discard_changes(self): - self._is_modified = False - self._is_overriden = self._was_overriden - - for item in self.input_fields: - item.discard_changes() - - self._is_modified = self.child_modified - - def remove_overrides(self): - self._is_overriden = False - self._is_modified = False - for input_field in self.input_fields: - input_field.remove_overrides() - - def reset_to_pype_default(self): - for input_field in self.input_fields: - input_field.reset_to_pype_default() - self._has_studio_override = False - - def set_studio_default(self): - for input_field in self.input_fields: - input_field.set_studio_default() - - if self.is_group: - self._has_studio_override = True - - def set_as_overriden(self): - if self.is_overriden: - return - - if self.is_group: - self._is_overriden = True - return - - for item in self.input_fields: - item.set_as_overriden() - - def update_default_values(self, value): - for item in self.input_fields: - item.update_default_values(value) - - def update_studio_values(self, value): - for item in self.input_fields: - item.update_studio_values(value) - - def _on_value_change(self, item=None): - if self.ignore_value_changes: - return - - self.value_changed.emit(self) - if self.any_parent_is_group: - self.hierarchical_style_update() - - @property - def child_has_studio_override(self): - for input_field in self.input_fields: - if ( - input_field.has_studio_override - or input_field.child_has_studio_override - ): - return True - return False - - @property - def child_modified(self): - for input_field in self.input_fields: - if input_field.child_modified: - return True - return False - - @property - def child_overriden(self): - for input_field in self.input_fields: - if input_field.is_overriden or input_field.child_overriden: - return True - return False - - @property - def child_invalid(self): - for input_field in self.input_fields: - if input_field.child_invalid: - return True - return False - - def get_invalid(self): - output = [] - for input_field in self.input_fields: - output.extend(input_field.get_invalid()) - return output - - def hierarchical_style_update(self): - for input_field in self.input_fields: - input_field.hierarchical_style_update() - - def item_value(self): - output = {} - for input_field in self.input_fields: - # TODO maybe merge instead of update should be used - # NOTE merge is custom function which merges 2 dicts - output.update(input_field.config_value()) - return output - - def config_value(self): - return self.item_value() - - def studio_overrides(self): - if ( - not (self.as_widget or self.any_parent_as_widget) - and not self.has_studio_override - and not self.child_has_studio_override - ): - return NOT_SET, False - - values = {} - groups = [] - for input_field in self.input_fields: - value, is_group = input_field.studio_overrides() - if value is not NOT_SET: - values.update(value) - if is_group: - groups.extend(value.keys()) - if groups: - values[METADATA_KEY] = {"groups": groups} - return values, self.is_group - - def overrides(self): - if not self.is_overriden and not self.child_overriden: - return NOT_SET, False - - values = {} - groups = [] - for input_field in self.input_fields: - value, is_group = input_field.overrides() - if value is not NOT_SET: - values.update(value) - if is_group: - groups.extend(value.keys()) - if groups: - values[METADATA_KEY] = {"groups": groups} - return values, self.is_group - - -class LabelWidget(QtWidgets.QWidget): - is_input_type = False - - def __init__(self, configuration, parent=None): - super(LabelWidget, self).__init__(parent) - self.setObjectName("LabelWidget") - - label = configuration["label"] - - layout = QtWidgets.QHBoxLayout(self) - layout.setContentsMargins(5, 5, 5, 5) - label_widget = QtWidgets.QLabel(label, self) - layout.addWidget(label_widget) - - -class SplitterWidget(QtWidgets.QWidget): - is_input_type = False - _height = 2 - - def __init__(self, configuration, parent=None): - super(SplitterWidget, self).__init__(parent) - - layout = QtWidgets.QHBoxLayout(self) - layout.setContentsMargins(5, 5, 5, 5) - splitter_item = QtWidgets.QWidget(self) - splitter_item.setObjectName("SplitterItem") - splitter_item.setMinimumHeight(self._height) - splitter_item.setMaximumHeight(self._height) - layout.addWidget(splitter_item) - - -TypeToKlass.types["boolean"] = BooleanWidget -TypeToKlass.types["number"] = NumberWidget -TypeToKlass.types["text"] = TextWidget -TypeToKlass.types["path-input"] = PathInputWidget -TypeToKlass.types["raw-json"] = RawJsonWidget -TypeToKlass.types["list"] = ListWidget -TypeToKlass.types["list-strict"] = ListStrictWidget -TypeToKlass.types["enum"] = EnumeratorWidget -TypeToKlass.types["dict-modifiable"] = ModifiableDict -# DEPRECATED - remove when removed from schemas -TypeToKlass.types["dict-item"] = DictWidget -TypeToKlass.types["dict"] = DictWidget -TypeToKlass.types["dict-invisible"] = DictInvisible -TypeToKlass.types["path-widget"] = PathWidget -TypeToKlass.types["form"] = DictFormWidget - -TypeToKlass.types["label"] = LabelWidget -TypeToKlass.types["splitter"] = SplitterWidget diff --git a/pype/tools/settings/settings/widgets/lib.py b/pype/tools/settings/settings/widgets/lib.py deleted file mode 100644 index cf2bd7f8afb..00000000000 --- a/pype/tools/settings/settings/widgets/lib.py +++ /dev/null @@ -1,314 +0,0 @@ -import os -import json -import copy -from pype.settings.lib import OVERRIDEN_KEY -from queue import Queue - - -# Singleton database of available inputs -class TypeToKlass: - types = {} - - -NOT_SET = type("NOT_SET", (), {"__bool__": lambda obj: False})() -METADATA_KEY = type("METADATA_KEY", (), {}) -OVERRIDE_VERSION = 1 -CHILD_OFFSET = 15 - - -def convert_gui_data_to_overrides(data, first=True): - if not data or not isinstance(data, dict): - return data - - output = {} - if first: - output["__override_version__"] = OVERRIDE_VERSION - - if METADATA_KEY in data: - metadata = data.pop(METADATA_KEY) - for key, value in metadata.items(): - if key == "groups": - output[OVERRIDEN_KEY] = value - else: - KeyError("Unknown metadata key \"{}\"".format(key)) - - for key, value in data.items(): - output[key] = convert_gui_data_to_overrides(value, False) - return output - - -def convert_overrides_to_gui_data(data, first=True): - if not data or not isinstance(data, dict): - return data - - output = {} - if OVERRIDEN_KEY in data: - groups = data.pop(OVERRIDEN_KEY) - if METADATA_KEY not in output: - output[METADATA_KEY] = {} - output[METADATA_KEY]["groups"] = groups - - for key, value in data.items(): - output[key] = convert_overrides_to_gui_data(value, False) - - return output - - -def _fill_inner_schemas(schema_data, schema_collection): - if schema_data["type"] == "schema": - raise ValueError("First item in schema data can't be schema.") - - children = schema_data.get("children") - if not children: - return schema_data - - new_children = [] - for child in children: - if child["type"] != "schema": - new_child = _fill_inner_schemas(child, schema_collection) - new_children.append(new_child) - continue - - new_child = _fill_inner_schemas( - schema_collection[child["name"]], - schema_collection - ) - new_children.append(new_child) - - schema_data["children"] = new_children - return schema_data - - -class SchemaMissingFileInfo(Exception): - def __init__(self, invalid): - full_path_keys = [] - for item in invalid: - full_path_keys.append("\"{}\"".format("/".join(item))) - - msg = ( - "Schema has missing definition of output file (\"is_file\" key)" - " for keys. [{}]" - ).format(", ".join(full_path_keys)) - super(SchemaMissingFileInfo, self).__init__(msg) - - -class SchemeGroupHierarchyBug(Exception): - def __init__(self, invalid): - full_path_keys = [] - for item in invalid: - full_path_keys.append("\"{}\"".format("/".join(item))) - - msg = ( - "Items with attribute \"is_group\" can't have another item with" - " \"is_group\" attribute as child. Error happened for keys: [{}]" - ).format(", ".join(full_path_keys)) - super(SchemeGroupHierarchyBug, self).__init__(msg) - - -class SchemaDuplicatedKeys(Exception): - def __init__(self, invalid): - items = [] - for key_path, keys in invalid.items(): - joined_keys = ", ".join([ - "\"{}\"".format(key) for key in keys - ]) - items.append("\"{}\" ({})".format(key_path, joined_keys)) - - msg = ( - "Schema items contain duplicated keys in one hierarchy level. {}" - ).format(" || ".join(items)) - super(SchemaDuplicatedKeys, self).__init__(msg) - - -def file_keys_from_schema(schema_data): - output = [] - item_type = schema_data["type"] - klass = TypeToKlass.types[item_type] - if not klass.is_input_type: - return output - - keys = [] - key = schema_data.get("key") - if key: - keys.append(key) - - for child in schema_data["children"]: - if child.get("is_file"): - _keys = copy.deepcopy(keys) - _keys.append(child["key"]) - output.append(_keys) - continue - - for result in file_keys_from_schema(child): - _keys = copy.deepcopy(keys) - _keys.extend(result) - output.append(_keys) - return output - - -def validate_all_has_ending_file(schema_data, is_top=True): - item_type = schema_data["type"] - klass = TypeToKlass.types[item_type] - if not klass.is_input_type: - return None - - if schema_data.get("is_file"): - return None - - children = schema_data.get("children") - if not children: - return [[schema_data["key"]]] - - invalid = [] - keyless = "key" not in schema_data - for child in children: - result = validate_all_has_ending_file(child, False) - if result is None: - continue - - if keyless: - invalid.extend(result) - else: - for item in result: - new_invalid = [schema_data["key"]] - new_invalid.extend(item) - invalid.append(new_invalid) - - if not invalid: - return None - - if not is_top: - return invalid - - raise SchemaMissingFileInfo(invalid) - - -def validate_is_group_is_unique_in_hierarchy( - schema_data, any_parent_is_group=False, keys=None -): - is_top = keys is None - if keys is None: - keys = [] - - keyless = "key" not in schema_data - - if not keyless: - keys.append(schema_data["key"]) - - invalid = [] - is_group = schema_data.get("is_group") - if is_group and any_parent_is_group: - invalid.append(copy.deepcopy(keys)) - - if is_group: - any_parent_is_group = is_group - - children = schema_data.get("children") - if not children: - return invalid - - for child in children: - result = validate_is_group_is_unique_in_hierarchy( - child, any_parent_is_group, copy.deepcopy(keys) - ) - if not result: - continue - - invalid.extend(result) - - if invalid and is_group and keys not in invalid: - invalid.append(copy.deepcopy(keys)) - - if not is_top: - return invalid - - if invalid: - raise SchemeGroupHierarchyBug(invalid) - - -def validate_keys_are_unique(schema_data, keys=None): - children = schema_data.get("children") - if not children: - return - - is_top = keys is None - if keys is None: - keys = [schema_data["key"]] - else: - keys.append(schema_data["key"]) - - child_queue = Queue() - for child in children: - child_queue.put(child) - - child_inputs = [] - while not child_queue.empty(): - child = child_queue.get() - if "key" not in child: - _children = child.get("children") or [] - for _child in _children: - child_queue.put(_child) - else: - child_inputs.append(child) - - duplicated_keys = set() - child_keys = set() - for child in child_inputs: - key = child["key"] - if key in child_keys: - duplicated_keys.add(key) - else: - child_keys.add(key) - - invalid = {} - if duplicated_keys: - joined_keys = "/".join(keys) - invalid[joined_keys] = duplicated_keys - - for child in child_inputs: - result = validate_keys_are_unique(child, copy.deepcopy(keys)) - if result: - invalid.update(result) - - if not is_top: - return invalid - - if invalid: - raise SchemaDuplicatedKeys(invalid) - - -def validate_schema(schema_data): - validate_all_has_ending_file(schema_data) - validate_is_group_is_unique_in_hierarchy(schema_data) - validate_keys_are_unique(schema_data) - - -def gui_schema(subfolder, main_schema_name): - subfolder, main_schema_name - dirpath = os.path.join( - os.path.dirname(os.path.dirname(__file__)), - "gui_schemas", - subfolder - ) - - loaded_schemas = {} - for filename in os.listdir(dirpath): - basename, ext = os.path.splitext(filename) - if ext != ".json": - continue - - filepath = os.path.join(dirpath, filename) - with open(filepath, "r") as json_stream: - try: - schema_data = json.load(json_stream) - except Exception as e: - raise Exception((f"Unable to parse JSON file {json_stream}\n " - f" - {e}")) from e - loaded_schemas[basename] = schema_data - - main_schema = _fill_inner_schemas( - loaded_schemas[main_schema_name], - loaded_schemas - ) - validate_schema(main_schema) - return main_schema diff --git a/pype/tools/settings/settings/widgets/multiselection_combobox.py b/pype/tools/settings/settings/widgets/multiselection_combobox.py deleted file mode 100644 index 9a99561ea8c..00000000000 --- a/pype/tools/settings/settings/widgets/multiselection_combobox.py +++ /dev/null @@ -1,317 +0,0 @@ -from Qt import QtCore, QtGui, QtWidgets - - -class ComboItemDelegate(QtWidgets.QStyledItemDelegate): - """ - Helper styled delegate (mostly based on existing private Qt's - delegate used by the QtWidgets.QComboBox). Used to style the popup like a - list view (e.g windows style). - """ - - def paint(self, painter, option, index): - option = QtWidgets.QStyleOptionViewItem(option) - option.showDecorationSelected = True - - # option.state &= ( - # ~QtWidgets.QStyle.State_HasFocus - # & ~QtWidgets.QStyle.State_MouseOver - # ) - super(ComboItemDelegate, self).paint(painter, option, index) - - -class MultiSelectionComboBox(QtWidgets.QComboBox): - value_changed = QtCore.Signal() - ignored_keys = { - QtCore.Qt.Key_Up, - QtCore.Qt.Key_Down, - QtCore.Qt.Key_PageDown, - QtCore.Qt.Key_PageUp, - QtCore.Qt.Key_Home, - QtCore.Qt.Key_End - } - - top_bottom_padding = 2 - left_right_padding = 3 - left_offset = 4 - top_bottom_margins = 2 - item_spacing = 5 - - item_bg_color = QtGui.QColor("#31424e") - - def __init__( - self, parent=None, placeholder="", separator=", ", **kwargs - ): - super(MultiSelectionComboBox, self).__init__(parent=parent, **kwargs) - self.setObjectName("MultiSelectionComboBox") - self.setFocusPolicy(QtCore.Qt.StrongFocus) - - self._popup_is_shown = False - self._block_mouse_release_timer = QtCore.QTimer(self, singleShot=True) - self._initial_mouse_pos = None - self._separator = separator - self.placeholder_text = placeholder - self.delegate = ComboItemDelegate(self) - self.setItemDelegate(self.delegate) - - self.lines = {} - self.item_height = ( - self.fontMetrics().height() - + (2 * self.top_bottom_padding) - + (2 * self.top_bottom_margins) - ) - - def mousePressEvent(self, event): - """Reimplemented.""" - self._popup_is_shown = False - super(MultiSelectionComboBox, self).mousePressEvent(event) - if self._popup_is_shown: - self._initial_mouse_pos = self.mapToGlobal(event.pos()) - self._block_mouse_release_timer.start( - QtWidgets.QApplication.doubleClickInterval() - ) - - def showPopup(self): - """Reimplemented.""" - super(MultiSelectionComboBox, self).showPopup() - view = self.view() - view.installEventFilter(self) - view.viewport().installEventFilter(self) - self._popup_is_shown = True - - def hidePopup(self): - """Reimplemented.""" - self.view().removeEventFilter(self) - self.view().viewport().removeEventFilter(self) - self._popup_is_shown = False - self._initial_mouse_pos = None - super(MultiSelectionComboBox, self).hidePopup() - self.view().clearFocus() - - def _event_popup_shown(self, obj, event): - if not self._popup_is_shown: - return - - current_index = self.view().currentIndex() - model = self.model() - - if event.type() == QtCore.QEvent.MouseMove: - if ( - self.view().isVisible() - and self._initial_mouse_pos is not None - and self._block_mouse_release_timer.isActive() - ): - diff = obj.mapToGlobal(event.pos()) - self._initial_mouse_pos - if diff.manhattanLength() > 9: - self._block_mouse_release_timer.stop() - return - - index_flags = current_index.flags() - state = current_index.data(QtCore.Qt.CheckStateRole) - new_state = None - - if event.type() == QtCore.QEvent.MouseButtonRelease: - if ( - self._block_mouse_release_timer.isActive() - or not current_index.isValid() - or not self.view().isVisible() - or not self.view().rect().contains(event.pos()) - or not index_flags & QtCore.Qt.ItemIsSelectable - or not index_flags & QtCore.Qt.ItemIsEnabled - or not index_flags & QtCore.Qt.ItemIsUserCheckable - ): - return - - if state == QtCore.Qt.Unchecked: - new_state = QtCore.Qt.Checked - else: - new_state = QtCore.Qt.Unchecked - - elif event.type() == QtCore.QEvent.KeyPress: - # TODO: handle QtCore.Qt.Key_Enter, Key_Return? - if event.key() == QtCore.Qt.Key_Space: - # toogle the current items check state - if ( - index_flags & QtCore.Qt.ItemIsUserCheckable - and index_flags & QtCore.Qt.ItemIsTristate - ): - new_state = QtCore.Qt.CheckState((int(state) + 1) % 3) - - elif index_flags & QtCore.Qt.ItemIsUserCheckable: - if state != QtCore.Qt.Checked: - new_state = QtCore.Qt.Checked - else: - new_state = QtCore.Qt.Unchecked - - if new_state is not None: - model.setData(current_index, new_state, QtCore.Qt.CheckStateRole) - self.view().update(current_index) - self.update_size_hint() - self.value_changed.emit() - return True - - def eventFilter(self, obj, event): - """Reimplemented.""" - result = self._event_popup_shown(obj, event) - if result is not None: - return result - - return super(MultiSelectionComboBox, self).eventFilter(obj, event) - - def paintEvent(self, event): - """Reimplemented.""" - painter = QtWidgets.QStylePainter(self) - option = QtWidgets.QStyleOptionComboBox() - self.initStyleOption(option) - painter.drawComplexControl(QtWidgets.QStyle.CC_ComboBox, option) - - # draw the icon and text - items = self.checked_items_text() - if not items: - option.currentText = self.placeholder_text - option.palette.setCurrentColorGroup(QtGui.QPalette.Disabled) - painter.drawControl(QtWidgets.QStyle.CE_ComboBoxLabel, option) - return - - font_metricts = self.fontMetrics() - for line, items in self.lines.items(): - top_y = ( - option.rect.top() - + (line * self.item_height) - + self.top_bottom_margins - ) - left_x = option.rect.left() + self.left_offset - for item in items: - label_rect = font_metricts.boundingRect(item) - label_height = label_rect.height() - - label_rect.moveTop(top_y) - label_rect.moveLeft(left_x) - label_rect.setHeight(self.item_height) - - bg_rect = QtCore.QRectF(label_rect) - bg_rect.setWidth( - label_rect.width() - + (2 * self.left_right_padding) - ) - left_x = bg_rect.right() + self.item_spacing - - label_rect.moveLeft(label_rect.x() + self.left_right_padding) - - bg_rect.setHeight(label_height + (2 * self.top_bottom_padding)) - bg_rect.moveTop(bg_rect.top() + self.top_bottom_margins) - - path = QtGui.QPainterPath() - path.addRoundedRect(bg_rect, 5, 5) - - painter.fillPath(path, self.item_bg_color) - - painter.drawText( - label_rect, - QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter, - item - ) - - def resizeEvent(self, *args, **kwargs): - super(MultiSelectionComboBox, self).resizeEvent(*args, **kwargs) - self.update_size_hint() - - def update_size_hint(self): - self.lines = {} - - items = self.checked_items_text() - if not items: - self.update() - return - - option = QtWidgets.QStyleOptionComboBox() - self.initStyleOption(option) - btn_rect = self.style().subControlRect( - QtWidgets.QStyle.CC_ComboBox, - option, - QtWidgets.QStyle.SC_ComboBoxArrow - ) - total_width = option.rect.width() - btn_rect.width() - font_metricts = self.fontMetrics() - - line = 0 - self.lines = {line: []} - - font_metricts = self.fontMetrics() - default_left_x = 0 + self.left_offset - left_x = int(default_left_x) - for item in items: - rect = font_metricts.boundingRect(item) - width = rect.width() + (2 * self.left_right_padding) - right_x = left_x + width - if right_x > total_width: - left_x = int(default_left_x) - if self.lines.get(line): - line += 1 - self.lines[line] = [item] - left_x += width - else: - self.lines[line] = [item] - line += 1 - else: - self.lines[line].append(item) - left_x = left_x + width + self.item_spacing - - self.update() - self.updateGeometry() - - def sizeHint(self): - value = super(MultiSelectionComboBox, self).sizeHint() - lines = len(self.lines) - if lines == 0: - lines = 1 - value.setHeight( - (lines * self.item_height) - + (2 * self.top_bottom_margins) - ) - return value - - def setItemCheckState(self, index, state): - self.setItemData(index, state, QtCore.Qt.CheckStateRole) - - def set_value(self, values): - for idx in range(self.count()): - value = self.itemData(idx, role=QtCore.Qt.UserRole) - if value in values: - check_state = QtCore.Qt.Checked - else: - check_state = QtCore.Qt.Unchecked - self.setItemData(idx, check_state, QtCore.Qt.CheckStateRole) - self.update_size_hint() - - def value(self): - items = list() - for idx in range(self.count()): - state = self.itemData(idx, role=QtCore.Qt.CheckStateRole) - if state == QtCore.Qt.Checked: - items.append( - self.itemData(idx, role=QtCore.Qt.UserRole) - ) - return items - - def checked_items_text(self): - items = list() - for idx in range(self.count()): - state = self.itemData(idx, role=QtCore.Qt.CheckStateRole) - if state == QtCore.Qt.Checked: - items.append(self.itemText(idx)) - return items - - def wheelEvent(self, event): - event.ignore() - - def keyPressEvent(self, event): - if ( - event.key() == QtCore.Qt.Key_Down - and event.modifiers() & QtCore.Qt.AltModifier - ): - return self.showPopup() - - if event.key() in self.ignored_keys: - return event.ignore() - - return super(MultiSelectionComboBox, self).keyPressEvent(event) diff --git a/pype/tools/settings/settings/widgets/tests.py b/pype/tools/settings/settings/widgets/tests.py deleted file mode 100644 index fc53e38ad5a..00000000000 --- a/pype/tools/settings/settings/widgets/tests.py +++ /dev/null @@ -1,136 +0,0 @@ -from Qt import QtWidgets, QtCore - - -def indented_print(data, indent=0): - spaces = " " * (indent * 4) - if not isinstance(data, dict): - print("{}{}".format(spaces, data)) - return - - for key, value in data.items(): - print("{}{}".format(spaces, key)) - indented_print(value, indent + 1) - - -class SelectableMenu(QtWidgets.QMenu): - - selection_changed = QtCore.Signal() - - def mouseReleaseEvent(self, event): - action = self.activeAction() - if action and action.isEnabled(): - action.trigger() - self.selection_changed.emit() - else: - super(SelectableMenu, self).mouseReleaseEvent(event) - - def event(self, event): - result = super(SelectableMenu, self).event(event) - if event.type() == QtCore.QEvent.Show: - parent = self.parent() - - move_point = parent.mapToGlobal(QtCore.QPoint(0, parent.height())) - check_point = ( - move_point - + QtCore.QPoint(self.width(), self.height()) - ) - visibility_check = ( - QtWidgets.QApplication.desktop().rect().contains(check_point) - ) - if not visibility_check: - move_point -= QtCore.QPoint(0, parent.height() + self.height()) - self.move(move_point) - - self.updateGeometry() - self.repaint() - - return result - - -class AddibleComboBox(QtWidgets.QComboBox): - """Searchable ComboBox with empty placeholder value as first value""" - - def __init__(self, placeholder="", parent=None): - super(AddibleComboBox, self).__init__(parent) - - self.setEditable(True) - # self.setInsertPolicy(self.NoInsert) - - self.lineEdit().setPlaceholderText(placeholder) - # self.lineEdit().returnPressed.connect(self.on_return_pressed) - - # Apply completer settings - completer = self.completer() - completer.setCompletionMode(completer.PopupCompletion) - completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive) - - # def on_return_pressed(self): - # text = self.lineEdit().text().strip() - # if not text: - # return - # - # index = self.findText(text) - # if index < 0: - # self.addItems([text]) - # index = self.findText(text) - - def populate(self, items): - self.clear() - # self.addItems([""]) # ensure first item is placeholder - self.addItems(items) - - def get_valid_value(self): - """Return the current text if it's a valid value else None - - Note: The empty placeholder value is valid and returns as "" - - """ - - text = self.currentText() - lookup = set(self.itemText(i) for i in range(self.count())) - if text not in lookup: - return None - - return text or None - - -class MultiselectEnum(QtWidgets.QWidget): - - selection_changed = QtCore.Signal() - - def __init__(self, title, parent=None): - super(MultiselectEnum, self).__init__(parent) - toolbutton = QtWidgets.QToolButton(self) - toolbutton.setText(title) - - toolmenu = SelectableMenu(toolbutton) - - toolbutton.setMenu(toolmenu) - toolbutton.setPopupMode(QtWidgets.QToolButton.MenuButtonPopup) - - layout = QtWidgets.QHBoxLayout() - layout.setContentsMargins(0, 0, 0, 0) - layout.addWidget(toolbutton) - - self.setLayout(layout) - - toolmenu.selection_changed.connect(self.selection_changed) - - self.toolbutton = toolbutton - self.toolmenu = toolmenu - self.main_layout = layout - - def populate(self, items): - self.toolmenu.clear() - self.addItems(items) - - def addItems(self, items): - for item in items: - action = self.toolmenu.addAction(item) - action.setCheckable(True) - action.setChecked(True) - self.toolmenu.addAction(action) - - def items(self): - for action in self.toolmenu.actions(): - yield action diff --git a/pype/tools/settings/settings/widgets/widgets.py b/pype/tools/settings/settings/widgets/widgets.py deleted file mode 100644 index b0bcf059a5a..00000000000 --- a/pype/tools/settings/settings/widgets/widgets.py +++ /dev/null @@ -1,290 +0,0 @@ -from Qt import QtWidgets, QtCore, QtGui - - -class NumberSpinBox(QtWidgets.QDoubleSpinBox): - def __init__(self, *args, **kwargs): - min_value = kwargs.pop("minimum", -99999) - max_value = kwargs.pop("maximum", 99999) - decimals = kwargs.pop("decimal", 0) - super(NumberSpinBox, self).__init__(*args, **kwargs) - self.setFocusPolicy(QtCore.Qt.StrongFocus) - self.setDecimals(decimals) - self.setMinimum(min_value) - self.setMaximum(max_value) - - def wheelEvent(self, event): - if self.hasFocus(): - super(NumberSpinBox, self).wheelEvent(event) - else: - event.ignore() - - def value(self): - output = super(NumberSpinBox, self).value() - if self.decimals() == 0: - output = int(output) - return output - - -class ComboBox(QtWidgets.QComboBox): - value_changed = QtCore.Signal() - - def __init__(self, *args, **kwargs): - super(ComboBox, self).__init__(*args, **kwargs) - - self.currentIndexChanged.connect(self._on_change) - - def _on_change(self, *args, **kwargs): - self.value_changed.emit() - - def set_value(self, value): - for idx in range(self.count()): - _value = self.itemData(idx, role=QtCore.Qt.UserRole) - if _value == value: - self.setCurrentIndex(idx) - break - - def value(self): - return self.itemData(self.currentIndex(), role=QtCore.Qt.UserRole) - - -class PathInput(QtWidgets.QLineEdit): - def clear_end_path(self): - value = self.text().strip() - if value.endswith("/"): - while value and value[-1] == "/": - value = value[:-1] - self.setText(value) - - def keyPressEvent(self, event): - # Always change backslash `\` for forwardslash `/` - if event.key() == QtCore.Qt.Key_Backslash: - event.accept() - new_event = QtGui.QKeyEvent( - event.type(), - QtCore.Qt.Key_Slash, - event.modifiers(), - "/", - event.isAutoRepeat(), - event.count() - ) - QtWidgets.QApplication.sendEvent(self, new_event) - return - super(PathInput, self).keyPressEvent(event) - - def focusOutEvent(self, event): - super(PathInput, self).focusOutEvent(event) - self.clear_end_path() - - -class ClickableWidget(QtWidgets.QWidget): - clicked = QtCore.Signal() - - def mouseReleaseEvent(self, event): - if event.button() == QtCore.Qt.LeftButton: - self.clicked.emit() - super(ClickableWidget, self).mouseReleaseEvent(event) - - -class ExpandingWidget(QtWidgets.QWidget): - def __init__(self, label, parent): - super(ExpandingWidget, self).__init__(parent) - - self.toolbox_hidden = False - - top_part = ClickableWidget(parent=self) - - side_line_widget = QtWidgets.QWidget(top_part) - side_line_widget.setObjectName("SideLineWidget") - - button_size = QtCore.QSize(5, 5) - button_toggle = QtWidgets.QToolButton(parent=side_line_widget) - button_toggle.setProperty("btn-type", "expand-toggle") - button_toggle.setIconSize(button_size) - button_toggle.setArrowType(QtCore.Qt.RightArrow) - button_toggle.setCheckable(True) - button_toggle.setChecked(False) - - label_widget = QtWidgets.QLabel(label, parent=side_line_widget) - label_widget.setObjectName("DictLabel") - - before_label_widget = QtWidgets.QWidget(side_line_widget) - before_label_layout = QtWidgets.QVBoxLayout(before_label_widget) - before_label_layout.setContentsMargins(0, 0, 0, 0) - - after_label_widget = QtWidgets.QWidget(side_line_widget) - after_label_layout = QtWidgets.QVBoxLayout(after_label_widget) - after_label_layout.setContentsMargins(0, 0, 0, 0) - - spacer_widget = QtWidgets.QWidget(side_line_widget) - - side_line_layout = QtWidgets.QHBoxLayout(side_line_widget) - side_line_layout.setContentsMargins(5, 10, 0, 10) - side_line_layout.addWidget(button_toggle) - side_line_layout.addWidget(before_label_widget) - side_line_layout.addWidget(label_widget) - side_line_layout.addWidget(after_label_widget) - side_line_layout.addWidget(spacer_widget, 1) - - top_part_layout = QtWidgets.QHBoxLayout(top_part) - top_part_layout.setContentsMargins(0, 0, 0, 0) - top_part_layout.addWidget(side_line_widget) - - before_label_widget.setAttribute(QtCore.Qt.WA_TranslucentBackground) - after_label_widget.setAttribute(QtCore.Qt.WA_TranslucentBackground) - spacer_widget.setAttribute(QtCore.Qt.WA_TranslucentBackground) - label_widget.setAttribute(QtCore.Qt.WA_TranslucentBackground) - self.setAttribute(QtCore.Qt.WA_TranslucentBackground) - - self.top_part_ending = None - self.after_label_layout = after_label_layout - self.before_label_layout = before_label_layout - - self.side_line_widget = side_line_widget - self.side_line_layout = side_line_layout - self.button_toggle = button_toggle - self.label_widget = label_widget - - top_part.clicked.connect(self._top_part_clicked) - self.button_toggle.clicked.connect(self._btn_clicked) - - self.main_layout = QtWidgets.QVBoxLayout(self) - self.main_layout.setContentsMargins(0, 0, 0, 0) - self.main_layout.setSpacing(0) - self.main_layout.addWidget(top_part) - - def hide_toolbox(self, hide_content=False): - self.button_toggle.setArrowType(QtCore.Qt.NoArrow) - self.toolbox_hidden = True - self.content_widget.setVisible(not hide_content) - self.parent().updateGeometry() - - def set_content_widget(self, content_widget): - content_widget.setVisible(False) - self.main_layout.addWidget(content_widget) - self.content_widget = content_widget - - def _btn_clicked(self): - self.toggle_content(self.button_toggle.isChecked()) - - def _top_part_clicked(self): - self.toggle_content() - - def toggle_content(self, *args): - if self.toolbox_hidden: - return - - if len(args) > 0: - checked = args[0] - else: - checked = not self.button_toggle.isChecked() - arrow_type = QtCore.Qt.RightArrow - if checked: - arrow_type = QtCore.Qt.DownArrow - self.button_toggle.setChecked(checked) - self.button_toggle.setArrowType(arrow_type) - self.content_widget.setVisible(checked) - self.parent().updateGeometry() - - def add_widget_after_label(self, widget): - self.after_label_layout.addWidget(widget) - - def add_widget_before_label(self, widget): - self.before_label_layout.addWidget(widget) - - def resizeEvent(self, event): - super(ExpandingWidget, self).resizeEvent(event) - self.content_widget.updateGeometry() - - -class UnsavedChangesDialog(QtWidgets.QDialog): - message = "You have unsaved changes. What do you want to do with them?" - - def __init__(self, parent=None): - super().__init__(parent) - message_label = QtWidgets.QLabel(self.message) - - btns_widget = QtWidgets.QWidget(self) - btns_layout = QtWidgets.QHBoxLayout(btns_widget) - - btn_ok = QtWidgets.QPushButton("Save") - btn_ok.clicked.connect(self.on_ok_pressed) - btn_discard = QtWidgets.QPushButton("Discard") - btn_discard.clicked.connect(self.on_discard_pressed) - btn_cancel = QtWidgets.QPushButton("Cancel") - btn_cancel.clicked.connect(self.on_cancel_pressed) - - btns_layout.addWidget(btn_ok) - btns_layout.addWidget(btn_discard) - btns_layout.addWidget(btn_cancel) - - layout = QtWidgets.QVBoxLayout(self) - layout.addWidget(message_label) - layout.addWidget(btns_widget) - - self.state = None - - def on_cancel_pressed(self): - self.done(0) - - def on_ok_pressed(self): - self.done(1) - - def on_discard_pressed(self): - self.done(2) - - -class SpacerWidget(QtWidgets.QWidget): - def __init__(self, parent=None): - super(SpacerWidget, self).__init__(parent) - self.setAttribute(QtCore.Qt.WA_TranslucentBackground) - - -class GridLabelWidget(QtWidgets.QWidget): - def __init__(self, label, parent=None): - super(GridLabelWidget, self).__init__(parent) - - self.input_field = None - - self.properties = {} - - layout = QtWidgets.QVBoxLayout(self) - layout.setContentsMargins(0, 2, 0, 0) - layout.setSpacing(0) - - label_proxy = QtWidgets.QWidget(self) - - label_proxy_layout = QtWidgets.QHBoxLayout(label_proxy) - label_proxy_layout.setContentsMargins(0, 0, 0, 0) - label_proxy_layout.setSpacing(0) - - label_widget = QtWidgets.QLabel(label, label_proxy) - spacer_widget_h = SpacerWidget(label_proxy) - label_proxy_layout.addWidget( - spacer_widget_h, 0, alignment=QtCore.Qt.AlignRight - ) - label_proxy_layout.addWidget( - label_widget, 0, alignment=QtCore.Qt.AlignRight - ) - - spacer_widget_v = SpacerWidget(self) - - layout.addWidget(label_proxy, 0) - layout.addWidget(spacer_widget_v, 1) - - label_proxy.setAttribute(QtCore.Qt.WA_TranslucentBackground) - label_widget.setAttribute(QtCore.Qt.WA_TranslucentBackground) - - self.label_widget = label_widget - - def setProperty(self, name, value): - cur_value = self.properties.get(name) - if cur_value == value: - return - - self.label_widget.setProperty(name, value) - self.label_widget.style().polish(self.label_widget) - - def mouseReleaseEvent(self, event): - if self.input_field: - return self.input_field.show_actions_menu(event) - return super(GridLabelWidget, self).mouseReleaseEvent(event) diff --git a/pype/tools/settings/settings/widgets/window.py b/pype/tools/settings/settings/widgets/window.py deleted file mode 100644 index f83da8efe08..00000000000 --- a/pype/tools/settings/settings/widgets/window.py +++ /dev/null @@ -1,28 +0,0 @@ -from Qt import QtWidgets -from .base import SystemWidget, ProjectWidget - - -class MainWidget(QtWidgets.QWidget): - widget_width = 1000 - widget_height = 600 - - def __init__(self, develop, parent=None): - super(MainWidget, self).__init__(parent) - self.setObjectName("MainWidget") - self.setWindowTitle("Pype Settings") - - self.resize(self.widget_width, self.widget_height) - - header_tab_widget = QtWidgets.QTabWidget(parent=self) - - studio_widget = SystemWidget(develop, header_tab_widget) - project_widget = ProjectWidget(develop, header_tab_widget) - header_tab_widget.addTab(studio_widget, "System") - header_tab_widget.addTab(project_widget, "Project") - - layout = QtWidgets.QVBoxLayout(self) - layout.setContentsMargins(5, 5, 5, 5) - layout.setSpacing(0) - layout.addWidget(header_tab_widget) - - self.setLayout(layout) diff --git a/pype/version.py b/pype/version.py index 96fc614cb22..95a6d3a792f 100644 --- a/pype/version.py +++ b/pype/version.py @@ -1 +1 @@ -__version__ = "2.12.1" +__version__ = "2.12.0" diff --git a/schema/config-1.1.json b/schema/config-1.1.json new file mode 100644 index 00000000000..5f4fe4b2fb1 --- /dev/null +++ b/schema/config-1.1.json @@ -0,0 +1,83 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + + "title": "avalon-core:config-1.1", + "description": "A project configuration.", + + "type": "object", + + "additionalProperties": false, + "required": [ + "template", + "tasks", + "apps" + ], + + "properties": { + "schema": { + "description": "Schema identifier for payload", + "type": "string" + }, + "template": { + "type": "object", + "additionalProperties": false, + "patternProperties": { + "^.*$": { + "type": "string" + } + } + }, + "tasks": { + "type": "object", + "properties": { + "short_name": {"type": "string"}, + "icon": {"type": "string"}, + "group": {"type": "string"}, + "label": {"type": "string"} + }, + "required": ["short_name"] + }, + "apps": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": {"type": "string"}, + "icon": {"type": "string"}, + "group": {"type": "string"}, + "label": {"type": "string"} + }, + "required": ["name"] + } + }, + "families": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": {"type": "string"}, + "icon": {"type": "string"}, + "label": {"type": "string"}, + "hideFilter": {"type": "boolean"} + }, + "required": ["name"] + } + }, + "groups": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": {"type": "string"}, + "icon": {"type": "string"}, + "color": {"type": "string"}, + "order": {"type": ["integer", "number"]} + }, + "required": ["name"] + } + }, + "copy": { + "type": "object" + } + } +} diff --git a/schema/inventory-1.1.json b/schema/inventory-1.1.json new file mode 100644 index 00000000000..f46df6973dd --- /dev/null +++ b/schema/inventory-1.1.json @@ -0,0 +1,10 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + + "title": "avalon-core:config-1.1", + "description": "A project configuration.", + + "type": "object", + + "additionalProperties": true +} diff --git a/schema/project-2.1.json b/schema/project-2.1.json new file mode 100644 index 00000000000..22327b2f06d --- /dev/null +++ b/schema/project-2.1.json @@ -0,0 +1,86 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + + "title": "avalon-core:project-2.1", + "description": "A unit of data", + + "type": "object", + + "additionalProperties": true, + + "required": [ + "schema", + "type", + "name", + "data", + "config" + ], + + "properties": { + "schema": { + "description": "Schema identifier for payload", + "type": "string", + "enum": ["avalon-core:project-2.1"], + "example": "avalon-core:project-2.1" + }, + "type": { + "description": "The type of document", + "type": "string", + "enum": ["project"], + "example": "project" + }, + "parent": { + "description": "Unique identifier to parent document", + "example": "592c33475f8c1b064c4d1696" + }, + "name": { + "description": "Name of directory", + "type": "string", + "pattern": "^[a-zA-Z0-9_.]*$", + "example": "hulk" + }, + "data": { + "description": "Document metadata", + "type": "object", + "example": { + "fps": 24, + "width": 1920, + "height": 1080 + } + }, + "config": { + "type": "object", + "description": "Document metadata", + "example": { + "schema": "avalon-core:config-1.1", + "apps": [ + { + "name": "maya2016", + "label": "Autodesk Maya 2016" + }, + { + "name": "nuke10", + "label": "The Foundry Nuke 10.0" + } + ], + "tasks": { + "Model": {"short_name": "mdl"}, + "Render": {"short_name": "rnd"}, + "Animate": {"short_name": "anim"}, + "Rig": {"short_name": "rig"}, + "Lookdev": {"short_name": "look"}, + "Layout": {"short_name": "lay"} + }, + "template": { + "work": + "{root}/{project}/{silo}/{asset}/work/{task}/{app}", + "publish": + "{root}/{project}/{silo}/{asset}/publish/{subset}/v{version:0>3}/{subset}.{representation}" + } + }, + "$ref": "config-1.1.json" + } + }, + + "definitions": {} +}