Skip to content
Snippets Groups Projects
operators.py 72.3 KiB
Newer Older
# ##### BEGIN GPL LICENSE BLOCK #####
#
#  This program is free software; you can redistribute it and/or
#  modify it under the terms of the GNU General Public License
#  as published by the Free Software Foundation; either version 2
#  of the License, or (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software Foundation,
#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####

# Copyright 2011, Ryan Inch

from copy import deepcopy

from bpy.types import (
    Operator,
)

from bpy.props import (
    BoolProperty,
    StringProperty,
    IntProperty
)

from .internals import (
    expanded,
    layer_collections,
    update_property_group,
)

rto_history = {
    "exclude": {},
    "exclude_all": {},
    "select": {},
    "select_all": {},
    "hide": {},
    "hide_all": {},
    "disable": {},
    "disable_all": {},
    "render": {},
    "render_all": {}
}

copy_buffer = {"RTO": "", "values": []}
swap_buffer = {"A": {"RTO": "", "values": []}, "B": {"RTO": "", "values": []}}

class ExpandAllOperator(Operator):
    '''Expand/Collapse all collections'''
    bl_label = "Expand All Items"
    bl_idname = "view3d.expand_all_items"
    bl_options = {'REGISTER', 'UNDO'}
    def execute(self, context):
        if len(expanded) > 0:
            expanded.clear()
        else:
            for laycol in layer_collections.values():
                if laycol["ptr"].children:
                    expanded.append(laycol["name"])
        # update tree view
        update_property_group(context)
expand_history = {"target": "", "history": []}
class ExpandSublevelOperator(Operator):
    '''  * Ctrl-Click to expand/collapse all sublevels\n  * Shift-Click to isolate/restore tree\n  * Alt-Click to discard history'''
    bl_label = "Expand Sublevel Items"
    bl_idname = "view3d.expand_sublevel"
    bl_options = {'REGISTER', 'UNDO'}
    expand: BoolProperty()
    name: StringProperty()
    index: IntProperty()
    # static class var
    isolated = False

    def invoke(self, context, event):
        global expand_history
        cls = ExpandSublevelOperator

        modifiers = get_modifiers(event)

        if modifiers == {"alt"}:
            expand_history["target"] = ""
            expand_history["history"].clear()
            cls.isolated = False

        elif modifiers == {"ctrl"}:
            # expand/collapse all subcollections
            expand = None
            # check whether to expand or collapse
            if self.name in expanded:
                expanded.remove(self.name)
                expand = False
            else:
                expanded.append(self.name)
                expand = True
            # do expanding/collapsing
            def loop(laycol):
                for item in laycol.children:
                    if expand:
                        if not item.name in expanded:
                            expanded.append(item.name)
                    else:
                        if item.name in expanded:
                            expanded.remove(item.name)
                    if len(item.children) > 0:
                        loop(item)
            loop(layer_collections[self.name]["ptr"])
            expand_history["target"] = ""
            expand_history["history"].clear()
            cls.isolated = False

        elif modifiers == {"shift"}:
            def isolate_tree(current_laycol):
                parent = current_laycol["parent"]

                for laycol in parent["children"]:
                    if laycol["name"] != current_laycol["name"] and laycol["name"] in expanded:
                        expanded.remove(laycol["name"])
                        expand_history["history"].append(laycol["name"])

                if parent["parent"]:
                    isolate_tree(parent)

            if cls.isolated:
                for item in expand_history["history"]:
                    expanded.append(item)

                expand_history["target"] = ""
                expand_history["history"].clear()
                cls.isolated = False

            else:
                isolate_tree(layer_collections[self.name])
                expand_history["target"] = self.name
                cls.isolated = True

        else:
            # expand/collapse collection
            if self.expand:
                expanded.append(self.name)
            else:
                expanded.remove(self.name)
            expand_history["target"] = ""
            expand_history["history"].clear()
            cls.isolated = False

        # set selected row to the collection you're expanding/collapsing and update tree view
        context.scene.collection_manager.cm_list_index = self.index
        update_property_group(context)
class CMSetCollectionOperator(Operator):
    '''  * Click to move object to collection.\n  * Shift-Click to add/remove object from collection'''
    bl_label = "Set Object Collection"
    bl_idname = "view3d.set_collection"
    bl_options = {'REGISTER', 'UNDO'}
    collection_index: IntProperty()
    collection_name: StringProperty()
    def invoke(self, context, event):
        collection = layer_collections[self.collection_name]["ptr"].collection
        if event.shift:
            # add object to collection
            # check if in collection
            if context.active_object.name not in collection.objects:
                # add to collection
                bpy.ops.object.link_to_collection(collection_index=self.collection_index)
Loading
Loading full blame...