UnityMol  0.9.6-875
UnityMol viewer / In developement
ImprovedFileBrowser.cs
Go to the documentation of this file.
1 
66 using UnityEngine;
67 using System;
68 using System.IO;
69 using System.Collections.Generic;
70 
71 /*
72  File browser for selecting files or folders at runtime.
73  */
74 using UI;
75 
76 public enum FileBrowserType {
77  File,
78  Directory
79 }
80 
81 public class ImprovedFileBrowser {
82 
83  private int buttonWidth;
84 
85  // Called when the user clicks cancel or select
86  public delegate void FinishedCallback(string path);
87  // Defaults to working directory
88  public string CurrentDirectory {
89  get {
90  return m_currentDirectory;
91  }
92  set {
93  SetNewDirectory(value);
95  }
96  }
97  protected string m_currentDirectory;
98  // Optional pattern for filtering selectable files/folders. See:
99  // http://msdn.microsoft.com/en-us/library/wz42302f(v=VS.90).aspx
100  // and
101  // http://msdn.microsoft.com/en-us/library/6ff71z1w(v=VS.90).aspx
102  public string SelectionPattern {
103  get {
104  return m_filePattern;
105  }
106  set {
107  m_filePattern = value;
109  }
110  }
111  protected string m_filePattern;
112 
113  // Optional image for directories
114  public Texture2D DirectoryImage {
115  get {
116  return m_directoryImage;
117  }
118  set {
119  m_directoryImage = value;
120  BuildContent();
121  }
122  }
123  protected Texture2D m_directoryImage;
124 
125  // Optional image for files
126  public Texture2D FileImage {
127  get {
128  return m_fileImage;
129  }
130  set {
131  m_fileImage = value;
132  BuildContent();
133  }
134  }
135  protected Texture2D m_fileImage;
136 
137  // Browser type. Defaults to File, but can be set to Folder
139  get {
140  return m_browserType;
141  }
142  set {
143  m_browserType = value;
145  }
146  }
148  protected string m_newDirectory;
149  protected string[] m_currentDirectoryParts;
150 
151  protected string[] m_files;
152  protected GUIContent[] m_filesWithImages;
153  protected int m_selectedFile;
154 
155  protected string[] m_nonMatchingFiles;
156  protected GUIContent[] m_nonMatchingFilesWithImages;
158 
159  protected string[] m_directories;
160  protected GUIContent[] m_directoriesWithImages;
161  protected int m_selectedDirectory;
162 
163  protected string[] m_nonMatchingDirectories;
164  protected GUIContent[] m_nonMatchingDirectoriesWithImages;
165 
167 
168  protected GUIStyle CentredText {
169  get {
170  if (m_centredText == null) {
171  m_centredText = new GUIStyle(GUI.skin.label);
172  m_centredText.alignment = TextAnchor.MiddleLeft;
173  m_centredText.fixedHeight = GUI.skin.button.fixedHeight;
174  }
175  return m_centredText;
176  }
177  }
178  protected GUIStyle m_centredText;
179 
180  protected string m_name;
181  protected Rect m_screenRect;
182 
183  protected Vector2 m_scrollPosition;
184 
186 
187  // Browsers need at least a rect, name and callback
188  public ImprovedFileBrowser(Rect screenRect, string name, FinishedCallback callback) {
189  m_name = name;
190  m_screenRect = screenRect;
191  buttonWidth = (int) m_screenRect.width / 3;
192  m_browserType = FileBrowserType.File;
193  m_callback = callback;
194  SetNewDirectory(Directory.GetCurrentDirectory());
196  }
197 
198  //Alex Tek modif
199  public ImprovedFileBrowser(Rect screenRect, string name, FinishedCallback callback, string startingPath) {
200  m_name = name;
201  m_screenRect = screenRect;
202  buttonWidth = (int) m_screenRect.width / 3;
203  m_browserType = FileBrowserType.File;
204  m_callback = callback;
205  SetNewDirectory(startingPath);
207  }
208 
209  protected void SetNewDirectory(string directory) {
210  m_newDirectory = directory;
211  }
212 
213  protected void SwitchDirectoryNow() {
214  if (m_newDirectory == null || m_currentDirectory == m_newDirectory) {
215  return;
216  }
217  m_currentDirectory = m_newDirectory;
218  m_scrollPosition = Vector2.zero;
219  m_selectedDirectory = m_selectedNonMatchingDirectory = m_selectedFile = -1;
221  }
222 
223  protected void ReadDirectoryContents() {
224  if (m_currentDirectory == "/") {
225  m_currentDirectoryParts = new string[] {""};
226  m_currentDirectoryMatches = false;
227  } else {
228  m_currentDirectoryParts = m_currentDirectory.Split(Path.DirectorySeparatorChar);
229  if (SelectionPattern != null) {
230  string[] generation = Directory.GetDirectories(
231  Path.GetDirectoryName(m_currentDirectory),
233  );
234  m_currentDirectoryMatches = Array.IndexOf(generation, m_currentDirectory) >= 0;
235  } else {
236  m_currentDirectoryMatches = false;
237  }
238  }
239 
240  if (BrowserType == FileBrowserType.File || SelectionPattern == null) {
241  m_directories = Directory.GetDirectories(m_currentDirectory);
242  m_nonMatchingDirectories = new string[0];
243  } else {
244  m_directories = Directory.GetDirectories(m_currentDirectory, SelectionPattern);
245  var nonMatchingDirectories = new List<string>();
246  foreach (string directoryPath in Directory.GetDirectories(m_currentDirectory)) {
247  if (Array.IndexOf(m_directories, directoryPath) < 0) {
248  nonMatchingDirectories.Add(directoryPath);
249  }
250  }
251  m_nonMatchingDirectories = nonMatchingDirectories.ToArray();
252  for (int i = 0; i < m_nonMatchingDirectories.Length; ++i) {
253  int lastSeparator = m_nonMatchingDirectories[i].LastIndexOf(Path.DirectorySeparatorChar);
254  m_nonMatchingDirectories[i] = m_nonMatchingDirectories[i].Substring(lastSeparator + 1);
255  }
256  Array.Sort(m_nonMatchingDirectories);
257  }
258 
259  for (int i = 0; i < m_directories.Length; ++i) {
260  m_directories[i] = m_directories[i].Substring(m_directories[i].LastIndexOf(Path.DirectorySeparatorChar) + 1);
261  }
262 
263  if (BrowserType == FileBrowserType.Directory || SelectionPattern == null) {
264  m_files = Directory.GetFiles(m_currentDirectory);
265  m_nonMatchingFiles = new string[0];
266  } else {
267  m_files = Directory.GetFiles(m_currentDirectory, SelectionPattern);
268  var nonMatchingFiles = new List<string>();
269  foreach (string filePath in Directory.GetFiles(m_currentDirectory)) {
270  if (Array.IndexOf(m_files, filePath) < 0) {
271  nonMatchingFiles.Add(filePath);
272  }
273  }
274  m_nonMatchingFiles = nonMatchingFiles.ToArray();
275  for (int i = 0; i < m_nonMatchingFiles.Length; ++i) {
276  m_nonMatchingFiles[i] = Path.GetFileName(m_nonMatchingFiles[i]);
277  }
278  Array.Sort(m_nonMatchingFiles);
279  }
280  for (int i = 0; i < m_files.Length; ++i) {
281  m_files[i] = Path.GetFileName(m_files[i]);
282  }
283  Array.Sort(m_files);
284  BuildContent();
285  m_newDirectory = null;
286  }
287 
288  protected void BuildContent() {
289  m_directoriesWithImages = new GUIContent[m_directories.Length];
290  for (int i = 0; i < m_directoriesWithImages.Length; ++i) {
291  m_directoriesWithImages[i] = new GUIContent(m_directories[i], DirectoryImage);
292  }
293  m_nonMatchingDirectoriesWithImages = new GUIContent[m_nonMatchingDirectories.Length];
294  for (int i = 0; i < m_nonMatchingDirectoriesWithImages.Length; ++i) {
295  m_nonMatchingDirectoriesWithImages[i] = new GUIContent(m_nonMatchingDirectories[i], DirectoryImage);
296  }
297  m_filesWithImages = new GUIContent[m_files.Length];
298  for (int i = 0; i < m_filesWithImages.Length; ++i) {
299  m_filesWithImages[i] = new GUIContent(m_files[i], FileImage);
300  }
301  m_nonMatchingFilesWithImages = new GUIContent[m_nonMatchingFiles.Length];
302  for (int i = 0; i < m_nonMatchingFilesWithImages.Length; ++i) {
303  m_nonMatchingFilesWithImages[i] = new GUIContent(m_nonMatchingFiles[i], FileImage);
304  }
305  }
306 
307  public void OnGUI() {
308  GUILayout.BeginArea(
309  m_screenRect,
310  m_name,
311  GUI.skin.window
312  );
313  GUILayout.BeginHorizontal();
314  for (int parentIndex = 0; parentIndex < m_currentDirectoryParts.Length; ++parentIndex) {
315  if (parentIndex == m_currentDirectoryParts.Length - 1) {
316  GUILayout.Label(m_currentDirectoryParts[parentIndex], CentredText);
317  } else if (GUILayout.Button(m_currentDirectoryParts[parentIndex])) {
318  string parentDirectoryName = m_currentDirectory;
319  for (int i = m_currentDirectoryParts.Length - 1; i > parentIndex; --i) {
320  parentDirectoryName = Path.GetDirectoryName(parentDirectoryName);
321  }
322  SetNewDirectory(parentDirectoryName);
323  }
324  }
325  GUILayout.FlexibleSpace();
326  GUILayout.EndHorizontal();
327  m_scrollPosition = GUILayout.BeginScrollView(
328  m_scrollPosition,
329  false,
330  true,
331  GUI.skin.horizontalScrollbar,
332  GUI.skin.verticalScrollbar,
333  GUI.skin.box
334  );
335  m_selectedDirectory = GUILayoutx.SelectionList(
336  m_selectedDirectory,
337  m_directoriesWithImages,
339  );
340  if (m_selectedDirectory > -1) {
341  m_selectedFile = m_selectedNonMatchingDirectory = -1;
342  }
343  m_selectedNonMatchingDirectory = GUILayoutx.SelectionList(
344  m_selectedNonMatchingDirectory,
345  m_nonMatchingDirectoriesWithImages,
347  );
348  if (m_selectedNonMatchingDirectory > -1) {
349  m_selectedDirectory = m_selectedFile = -1;
350  }
351  GUI.enabled = BrowserType == FileBrowserType.File;
352  m_selectedFile = GUILayoutx.SelectionList(
353  m_selectedFile,
354  m_filesWithImages,
356  );
357  GUI.enabled = true;
358  if (m_selectedFile > -1) {
359  m_selectedDirectory = m_selectedNonMatchingDirectory = -1;
360  }
361  GUI.enabled = false;
363  -1,
364  m_nonMatchingFilesWithImages
365  );
366  GUI.enabled = true;
367  GUILayout.EndScrollView();
368  GUILayout.BeginHorizontal();
369  UIData.loadHireRNA = GUILayout.Toggle(UIData.loadHireRNA, "HiRERNA model");
370  UIData.readHetAtom = GUILayout.Toggle (UIData.readHetAtom, "Read HetAtm?");
371  UIData.readWater = GUILayout.Toggle (UIData.readWater, "Read Water?");
372  GUILayout.EndHorizontal();
373  GUILayout.BeginHorizontal();
374  GUILayout.FlexibleSpace();
375  if (GUILayout.Button("Cancel", GUILayout.Width(buttonWidth))) {
376  m_callback(null);
377  }
378  if (BrowserType == FileBrowserType.File) {
379  GUI.enabled = m_selectedFile > -1;
380  } else {
381  if (SelectionPattern == null) {
382  GUI.enabled = m_selectedDirectory > -1;
383  } else {
384  GUI.enabled = m_selectedDirectory > -1 ||
385  (
386  m_currentDirectoryMatches &&
387  m_selectedNonMatchingDirectory == -1 &&
388  m_selectedFile == -1
389  );
390  }
391  }
392  if (GUILayout.Button("Select", GUILayout.Width(buttonWidth))) {
393  if (BrowserType == FileBrowserType.File) {
394  m_callback(Path.Combine(m_currentDirectory, m_files[m_selectedFile]));
395  } else {
396  if (m_selectedDirectory > -1) {
397  m_callback(Path.Combine(m_currentDirectory, m_directories[m_selectedDirectory]));
398  } else {
399  m_callback(m_currentDirectory);
400  }
401  }
402  }
403  GUI.enabled = true;
404  GUILayout.EndHorizontal();
405  GUILayout.EndArea();
406 
407  if (Event.current.type == EventType.Repaint) {
409  }
410  }
411 
412  protected void FileDoubleClickCallback(int i) {
413  if (BrowserType == FileBrowserType.File) {
414  m_callback(Path.Combine(m_currentDirectory, m_files[i]));
415  }
416  }
417 
418  protected void DirectoryDoubleClickCallback(int i) {
419  SetNewDirectory(Path.Combine(m_currentDirectory, m_directories[i]));
420  }
421 
423  SetNewDirectory(Path.Combine(m_currentDirectory, m_nonMatchingDirectories[i]));
424  }
425 
426 }
static int SelectionList(int selected, GUIContent[] list)
Definition: GUILayoutx.cs:72
ImprovedFileBrowser(Rect screenRect, string name, FinishedCallback callback)
FinishedCallback m_callback
ImprovedFileBrowser(Rect screenRect, string name, FinishedCallback callback, string startingPath)
void DirectoryDoubleClickCallback(int i)
FileBrowserType BrowserType
delegate void FinishedCallback(string path)
GUIContent[] m_nonMatchingFilesWithImages
void FileDoubleClickCallback(int i)
FileBrowserType m_browserType
static bool loadHireRNA
Definition: UIData.cs:240
static bool readWater
Definition: UIData.cs:111
!WiP Includes FLAGS of GUI.
Definition: UIData.cs:78
void SetNewDirectory(string directory)
void NonMatchingDirectoryDoubleClickCallback(int i)
static bool readHetAtom
Definition: UIData.cs:110
GUIContent[] m_nonMatchingDirectoriesWithImages
GUIContent[] m_filesWithImages
GUIContent[] m_directoriesWithImages
FileBrowserType
Definition: GUIDisplay.cs:66