Exemplo n.º 1
0
    string GetEntryTypeString(SpriteCollectionEditorEntry.Type kind)
    {
        switch (kind)
        {
        case SpriteCollectionEditorEntry.Type.Sprite: return("Sprites");

        case SpriteCollectionEditorEntry.Type.SpriteSheet: return("Sprite Sheets");

        case SpriteCollectionEditorEntry.Type.Font: return("Fonts");
        }

        Debug.LogError("Unhandled type");
        return("");
    }
Exemplo n.º 2
0
    void DrawSpriteList()
    {
        if (spriteCollectionProxy != null && spriteCollectionProxy.Empty)
        {
            DrawDropZone();
            return;
        }

        spriteListScroll = GUILayout.BeginScrollView(spriteListScroll, GUILayout.Width(leftBarWidth));
        GUILayout.BeginVertical(tk2dEditorSkin.SC_ListBoxBG, GUILayout.ExpandWidth(true), GUILayout.ExpandHeight(true));

        bool multiSelectKey = (Application.platform == RuntimePlatform.OSXEditor)?Event.current.command:Event.current.control;
        bool shiftSelectKey = Event.current.shift;

        bool selectionChanged = false;

        SpriteCollectionEditorEntry.Type lastType = SpriteCollectionEditorEntry.Type.None;
        foreach (var entry in entries)
        {
            if (lastType != entry.type)
            {
                if (lastType != SpriteCollectionEditorEntry.Type.None)
                {
                    GUILayout.Space(8);
                }
                else
                {
                    GUI.SetNextControlName("firstLabel");
                }

                GUILayout.Label(GetEntryTypeString(entry.type), tk2dEditorSkin.SC_ListBoxSectionHeader, GUILayout.ExpandWidth(true));
                lastType = entry.type;
            }

            bool newSelected = GUILayout.Toggle(entry.selected, entry.name, tk2dEditorSkin.SC_ListBoxItem, GUILayout.ExpandWidth(true));
            if (newSelected != entry.selected)
            {
                GUI.FocusControl("firstLabel");

                entry.selectionKey = spriteListSelectionKey++;
                if (multiSelectKey)
                {
                    // Only allow multiselection with sprites
                    bool selectionAllowed = entry.type == SpriteCollectionEditorEntry.Type.Sprite;
                    foreach (var e in entries)
                    {
                        if (e != entry && e.selected && e.type != entry.type)
                        {
                            selectionAllowed = false;
                            break;
                        }
                    }

                    if (selectionAllowed)
                    {
                        entry.selected   = newSelected;
                        selectionChanged = true;
                    }
                    else
                    {
                        foreach (var e in entries)
                        {
                            e.selected = false;
                        }
                        entry.selected   = true;
                        selectionChanged = true;
                    }
                }
                else if (shiftSelectKey)
                {
                    // find first selected entry in list
                    int firstSelection = int.MaxValue;
                    foreach (var e in entries)
                    {
                        if (e.selected && e.listIndex < firstSelection)
                        {
                            firstSelection = e.listIndex;
                        }
                    }
                    int lastSelection = entry.listIndex;
                    if (lastSelection < firstSelection)
                    {
                        lastSelection  = firstSelection;
                        firstSelection = entry.listIndex;
                    }
                    // Filter for multiselection
                    if (entry.type == SpriteCollectionEditorEntry.Type.Sprite)
                    {
                        for (int i = firstSelection; i <= lastSelection; ++i)
                        {
                            if (entries[i].type != entry.type)
                            {
                                firstSelection = entry.listIndex;
                                lastSelection  = entry.listIndex;
                            }
                        }
                    }
                    else
                    {
                        firstSelection = lastSelection = entry.listIndex;
                    }
                    foreach (var e in entries)
                    {
                        e.selected = (e.listIndex >= firstSelection && e.listIndex <= lastSelection);
                    }
                    selectionChanged = true;
                }
                else
                {
                    foreach (var e in entries)
                    {
                        e.selected = false;
                    }
                    entry.selected   = true;
                    selectionChanged = true;
                }
            }
        }

        if (selectionChanged)
        {
            UpdateSelection();
            Repaint();
        }

        GUILayout.EndVertical();
        GUILayout.EndScrollView();
    }
    void DrawSpriteList()
    {
        if (spriteCollectionProxy != null && spriteCollectionProxy.Empty)
        {
            DrawDropZone();
            return;
        }

        int spriteListControlId = GUIUtility.GetControlID("tk2d.SpriteList".GetHashCode(), FocusType.Keyboard);

        HandleListKeyboardShortcuts(spriteListControlId);

        spriteListScroll = GUILayout.BeginScrollView(spriteListScroll, GUILayout.Width(leftBarWidth));

        bool multiSelectKey = (Application.platform == RuntimePlatform.OSXEditor)?Event.current.command:Event.current.control;
        bool shiftSelectKey = Event.current.shift;

        bool selectionChanged = false;

        SpriteCollectionEditorEntry.Type lastType = SpriteCollectionEditorEntry.Type.None;

        // Run through the list, measure total height
        // Its significantly faster with loads of sprites in there.
        int height      = 0;
        int labelHeight = (int)tk2dEditorSkin.SC_ListBoxSectionHeader.CalcHeight(GUIContent.none, 100);
        int itemHeight  = (int)tk2dEditorSkin.SC_ListBoxItem.CalcHeight(GUIContent.none, 100);
        int spacing     = 8;

        foreach (var entry in entries)
        {
            if (lastType != entry.type)
            {
                if (lastType != SpriteCollectionEditorEntry.Type.None)
                {
                    height += spacing;
                }
                height  += labelHeight;
                lastType = entry.type;
            }
            height += itemHeight;
        }

        Rect rect  = GUILayoutUtility.GetRect(1, height, GUILayout.ExpandWidth(true));
        int  width = Mathf.Max((int)rect.width, 100);
        int  y     = 0;

        // Second pass, just draw what is visible
        // Don't care about the section labels, theres only a max of 4 of those.
        lastType = SpriteCollectionEditorEntry.Type.None;
        foreach (var entry in entries)
        {
            if (lastType != entry.type)
            {
                if (lastType != SpriteCollectionEditorEntry.Type.None)
                {
                    y += spacing;
                }
                else
                {
                    GUI.SetNextControlName("firstLabel");
                }

                GUI.Label(new Rect(0, y, width, labelHeight), GetEntryTypeString(entry.type), tk2dEditorSkin.SC_ListBoxSectionHeader);
                y       += labelHeight;
                lastType = entry.type;
            }

            bool  newSelected = entry.selected;
            float realY       = y - spriteListScroll.y + itemHeight;
            if (realY > 0 && realY < Screen.height)               // screen.height is wrong, but is conservative
            {
                newSelected = GUI.Toggle(new Rect(0, y, width, itemHeight), entry.selected, entry.name, tk2dEditorSkin.SC_ListBoxItem);
            }
            y += itemHeight;
            if (newSelected != entry.selected)
            {
                GUI.FocusControl("firstLabel");

                entry.selectionKey = spriteListSelectionKey++;
                if (multiSelectKey)
                {
                    // Only allow multiselection with sprites
                    bool selectionAllowed = entry.type == SpriteCollectionEditorEntry.Type.Sprite;
                    foreach (var e in entries)
                    {
                        if (e != entry && e.selected && e.type != entry.type)
                        {
                            selectionAllowed = false;
                            break;
                        }
                    }

                    if (selectionAllowed)
                    {
                        entry.selected   = newSelected;
                        selectionChanged = true;
                    }
                    else
                    {
                        foreach (var e in entries)
                        {
                            e.selected = false;
                        }
                        entry.selected   = true;
                        selectionChanged = true;
                    }
                }
                else if (shiftSelectKey)
                {
                    // find first selected entry in list
                    int firstSelection = int.MaxValue;
                    foreach (var e in entries)
                    {
                        if (e.selected && e.listIndex < firstSelection)
                        {
                            firstSelection = e.listIndex;
                        }
                    }
                    int lastSelection = entry.listIndex;
                    if (lastSelection < firstSelection)
                    {
                        lastSelection  = firstSelection;
                        firstSelection = entry.listIndex;
                    }
                    // Filter for multiselection
                    if (entry.type == SpriteCollectionEditorEntry.Type.Sprite)
                    {
                        for (int i = firstSelection; i <= lastSelection; ++i)
                        {
                            if (entries[i].type != entry.type)
                            {
                                firstSelection = entry.listIndex;
                                lastSelection  = entry.listIndex;
                            }
                        }
                    }
                    else
                    {
                        firstSelection = lastSelection = entry.listIndex;
                    }
                    foreach (var e in entries)
                    {
                        e.selected = (e.listIndex >= firstSelection && e.listIndex <= lastSelection);
                    }
                    selectionChanged = true;
                }
                else
                {
                    foreach (var e in entries)
                    {
                        e.selected = false;
                    }
                    entry.selected   = true;
                    selectionChanged = true;
                }
            }
        }

        if (selectionChanged)
        {
            GUIUtility.keyboardControl = spriteListControlId;
            UpdateSelection();
            Repaint();
        }

        GUILayout.EndScrollView();

        Rect viewRect = GUILayoutUtility.GetLastRect();

        tk2dPreferences.inst.spriteCollectionListWidth = (int)tk2dGuiUtility.DragableHandle(4819283,
                                                                                            viewRect, tk2dPreferences.inst.spriteCollectionListWidth,
                                                                                            tk2dGuiUtility.DragDirection.Horizontal);
    }