Exemple #1
0
        public TextureBrowserDialog(string initialSelectedPath)
        {
            InitializeComponent();
            int initialSelectedNodeIndex = -1;

            graphicsControl.Size = new Size(0, 0);
            ResizePanel();

            paths = TextureLoader.GetAllPaths();
            foreach (string path in paths)
            {
                //Check if the folderNode is created
                Node parent      = MakeFolderNode(path);
                Node textureNode = new Node(path.Substring(path.LastIndexOfAny(new[] { '\\', '/' }) + 1));
                textureNode.Image = File;
                textureNode.Tag   = textureNodes.Count;

                if (path == initialSelectedPath)
                {
                    initialSelectedNodeIndex = textureNodes.Count;
                }
                textureNodes.Add(textureNode);
                if (parent != null)
                {
                    parents[textureNode] = parent;
                }
            }

            //Build the tree view
            includeSnapshots.Add(new List <int>());
            int i = 0;

            foreach (Node textureNode in textureNodes)
            {
                includeSnapshots[0].Add(i++);
                Node node   = textureNode;
                Node parent = parents.ContainsKey(node) ? parents[node] : null;
                while (parent != null)
                {
                    if (parent.Nodes.Contains(node))
                    {
                        node = null;
                        break;
                    }
                    parent.Nodes.Add(node);
                    node   = parent;
                    parent = parents.ContainsKey(node) ? parents[node] : null;
                }
                if (node != null && !model.Nodes.Contains(node))
                {
                    model.Nodes.Add(node);
                }
            }
            TVTextures.Model = model;
            if (initialSelectedNodeIndex != -1)
            {
                initialSelection = TVTextures.FindNode(model.GetPath(textureNodes[initialSelectedNodeIndex]));
            }
        }
Exemple #2
0
 private void TextureBrowserDialog_Load(object sender, EventArgs e)
 {
     if (initialSelection != null)
     {
         TVTextures.SelectedNode = initialSelection;
         TVTextures.EnsureVisible(initialSelection);
         TVTextures.ScrollTo(initialSelection);
         TVTextures.Focus();
     }
 }
Exemple #3
0
 public void setupNewSearch(string initialSelectedPath)
 {
     for (int i = 0; i < paths.Count; ++i)
     {
         if (paths[i] == initialSelectedPath)
         {
             initialSelection = TVTextures.FindNode(model.GetPath(textureNodes[i]));
             break;
         }
     }
 }
Exemple #4
0
        private void TBSearch_TextChanged(object sender, EventArgs e)
        {
            string newSearchText = TBSearch.Text.ToLower();

            if (prevSearchText == newSearchText)
            {
                return;
            }
            TVTextures.BeginUpdate();
            if (prevSearchText == "" || newSearchText.StartsWith(prevSearchText))
            {
                //Stuff added. Find latest snapshot
                List <int> snapshot = includeSnapshots[prevSearchText.Length];
                //Remove stuff from it
                List <int>  nextSnapshot          = new List <int>();
                List <Node> possibleDeleteFolders = new List <Node>();
                foreach (int s in snapshot)
                {
                    if (paths[s].ToLower().Contains(newSearchText))
                    {
                        nextSnapshot.Add(s);
                    }
                    else
                    {
                        //Remove it from the tree view
                        Node node = textureNodes[s];
                        if (parents.ContainsKey(node))
                        {
                            Node parent = parents[node];
                            parent.Nodes.Remove(node);
                            if (!possibleDeleteFolders.Contains(parent))
                            {
                                possibleDeleteFolders.Add(parent);
                            }
                        }
                        else
                        {
                            model.Nodes.Remove(node);
                        }
                    }
                }
                //Remove folders with no children
                while (possibleDeleteFolders.Count > 0)
                {
                    Node node = possibleDeleteFolders[0];
                    possibleDeleteFolders.RemoveAt(0);
                    if (node.Nodes.Count == 0)
                    {
                        if (parents.ContainsKey(node))
                        {
                            Node parent = parents[node];
                            parent.Nodes.Remove(node);
                            if (!possibleDeleteFolders.Contains(parent))
                            {
                                possibleDeleteFolders.Add(parent);
                            }
                        }
                        else
                        {
                            model.Nodes.Remove(node);
                        }
                    }
                }
                //Update includeSnapshots
                while (includeSnapshots.Count <= newSearchText.Length)
                {
                    includeSnapshots.Add(null);
                }
                includeSnapshots[newSearchText.Length] = nextSnapshot;
            }
            else if (newSearchText == "" || prevSearchText.StartsWith(newSearchText))
            {
                //We deleted something in the back.
                //Check if we already have the target snapshot cached
                List <int> snapshot = includeSnapshots[newSearchText.Length];

                if (snapshot != null)
                {
                    //Add stuff to match current snapshot
                    var  newSnapshotEnum  = snapshot.GetEnumerator();
                    var  currSnapshotEnum = includeSnapshots[prevSearchText.Length].GetEnumerator();
                    bool currHasMore      = currSnapshotEnum.MoveNext();
                    while (newSnapshotEnum.MoveNext())
                    {
                        if (currHasMore && currSnapshotEnum.Current == newSnapshotEnum.Current)
                        {
                            currHasMore = currSnapshotEnum.MoveNext();
                            continue;
                        }
                        Node node = textureNodes[newSnapshotEnum.Current];
                        if (parents.ContainsKey(node))
                        {
                            Node n      = node;
                            Node parent = parents[n];
                            parent.Nodes.Add(n);
                            while (parent.Nodes.Count == 1)
                            {
                                n = parent;
                                if (parents.ContainsKey(n))
                                {
                                    parent = parents[n];
                                    parent.Nodes.Add(n);
                                }
                                else
                                {
                                    model.Nodes.Add(n);
                                    break;
                                }
                            }
                        }
                        else
                        {
                            model.Nodes.Add(node);
                        }
                    }
                    //Update snapshots
                    while (includeSnapshots.Count > newSearchText.Length + 1)
                    {
                        includeSnapshots.RemoveAt(includeSnapshots.Count - 1);
                    }
                }
                else
                {
                    //Loop through and add stuff that matches

                    List <int> nextSnapshot     = new List <int>();
                    var        currSnapshotEnum = includeSnapshots[prevSearchText.Length].GetEnumerator();
                    bool       currHasMore      = currSnapshotEnum.MoveNext();
                    for (int i = 0; i < textureNodes.Count; i++)
                    {
                        if (currHasMore && currSnapshotEnum.Current == i)
                        {
                            currHasMore = currSnapshotEnum.MoveNext();
                            nextSnapshot.Add(i);
                            continue;
                        }
                        if (!paths[i].Contains(newSearchText))
                        {
                            continue;
                        }
                        nextSnapshot.Add(i);
                        Node node = textureNodes[i];
                        if (parents.ContainsKey(node))
                        {
                            Node n      = node;
                            Node parent = parents[n];
                            parent.Nodes.Add(n);
                            while (parent.Nodes.Count == 1)
                            {
                                n = parent;
                                if (parents.ContainsKey(n))
                                {
                                    parent = parents[n];
                                    parent.Nodes.Add(n);
                                }
                                else
                                {
                                    model.Nodes.Add(node);
                                    break;
                                }
                            }
                        }
                        else
                        {
                            model.Nodes.Add(node);
                        }
                    }
                    //Update snapshots
                    while (includeSnapshots.Count > newSearchText.Length + 1)
                    {
                        includeSnapshots.RemoveAt(includeSnapshots.Count - 1);
                    }
                    includeSnapshots[newSearchText.Length] = nextSnapshot;
                }
            }
            else
            {
                //None of them are prefixes of the other.
                //Find nearest valid snapshot
                int validSnapshotIndex;
                for (validSnapshotIndex = 0; validSnapshotIndex < Math.Min(prevSearchText.Length, newSearchText.Length); validSnapshotIndex++)
                {
                    if (prevSearchText[validSnapshotIndex] != newSearchText[validSnapshotIndex])
                    {
                        break;
                    }
                }
                List <int> newestValidSnapshot = includeSnapshots[prevSearchText.Length];
                while (includeSnapshots.Count > validSnapshotIndex + 1)
                {
                    includeSnapshots.RemoveAt(includeSnapshots.Count - 1);
                }

                List <int>  nextSnapshot          = new List <int>();
                var         newestValidEnum       = newestValidSnapshot.GetEnumerator();
                bool        newestEnumHasMore     = newestValidEnum.MoveNext();
                List <Node> possibleDeleteFolders = new List <Node>();
                for (int i = 0; i < textureNodes.Count; i++)
                {
                    bool shouldBeAdded = paths[i].Contains(newSearchText);
                    if (shouldBeAdded)
                    {
                        nextSnapshot.Add(i);
                    }
                    Node node = textureNodes[i];
                    if (newestEnumHasMore && newestValidEnum.Current == i)
                    {
                        if (!shouldBeAdded)
                        {
                            //Remove it from the tree view
                            if (parents.ContainsKey(node))
                            {
                                Node parent = parents[node];
                                parent.Nodes.Remove(node);
                                if (!possibleDeleteFolders.Contains(parent))
                                {
                                    possibleDeleteFolders.Add(parent);
                                }
                            }
                            else
                            {
                                model.Nodes.Remove(node);
                            }
                        }
                        newestEnumHasMore = newestValidEnum.MoveNext();
                        continue;
                    }
                    if (!shouldBeAdded)
                    {
                        continue;
                    }
                    if (parents.ContainsKey(node))
                    {
                        Node n      = node;
                        Node parent = parents[n];
                        parent.Nodes.Add(n);
                        while (parent.Parent == null)
                        {
                            n = parent;
                            if (parents.ContainsKey(n))
                            {
                                parent = parents[n];
                                parent.Nodes.Add(n);
                            }
                            else
                            {
                                model.Nodes.Add(n);
                                break;
                            }
                        }
                    }
                    else
                    {
                        model.Nodes.Add(node);
                    }
                }
                //Remove folders with no children
                while (possibleDeleteFolders.Count > 0)
                {
                    Node node = possibleDeleteFolders[0];
                    possibleDeleteFolders.RemoveAt(0);
                    if (node.Nodes.Count == 0)
                    {
                        if (parents.ContainsKey(node))
                        {
                            Node parent = parents[node];
                            parent.Nodes.Remove(node);
                            if (!possibleDeleteFolders.Contains(parent))
                            {
                                possibleDeleteFolders.Add(parent);
                            }
                        }
                        else
                        {
                            model.Nodes.Remove(node);
                        }
                    }
                }
                //Update includeSnapshots
                while (includeSnapshots.Count <= newSearchText.Length)
                {
                    includeSnapshots.Add(null);
                }
                includeSnapshots[newSearchText.Length] = nextSnapshot;
            }
            TVTextures.EndUpdate();
            prevSearchText = newSearchText;
        }