69 using System.Collections.Generic;
190 m_screenRect = screenRect;
191 buttonWidth = (int) m_screenRect.width / 3;
193 m_callback = callback;
201 m_screenRect = screenRect;
202 buttonWidth = (int) m_screenRect.width / 3;
204 m_callback = callback;
210 m_newDirectory = directory;
214 if (m_newDirectory == null || m_currentDirectory == m_newDirectory) {
218 m_scrollPosition = Vector2.zero;
219 m_selectedDirectory = m_selectedNonMatchingDirectory = m_selectedFile = -1;
224 if (m_currentDirectory ==
"/") {
225 m_currentDirectoryParts =
new string[] {
""};
226 m_currentDirectoryMatches =
false;
228 m_currentDirectoryParts = m_currentDirectory.Split(Path.DirectorySeparatorChar);
230 string[] generation =
Directory.GetDirectories(
231 Path.GetDirectoryName(m_currentDirectory),
234 m_currentDirectoryMatches = Array.IndexOf(generation, m_currentDirectory) >= 0;
236 m_currentDirectoryMatches =
false;
241 m_directories =
Directory.GetDirectories(m_currentDirectory);
242 m_nonMatchingDirectories =
new string[0];
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);
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);
256 Array.Sort(m_nonMatchingDirectories);
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);
264 m_files =
Directory.GetFiles(m_currentDirectory);
265 m_nonMatchingFiles =
new string[0];
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);
274 m_nonMatchingFiles = nonMatchingFiles.ToArray();
275 for (
int i = 0; i < m_nonMatchingFiles.Length; ++i) {
276 m_nonMatchingFiles[i] = Path.GetFileName(m_nonMatchingFiles[i]);
278 Array.Sort(m_nonMatchingFiles);
280 for (
int i = 0; i < m_files.Length; ++i) {
281 m_files[i] = Path.GetFileName(m_files[i]);
285 m_newDirectory = null;
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);
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);
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);
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);
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])) {
319 for (
int i = m_currentDirectoryParts.Length - 1; i > parentIndex; --i) {
320 parentDirectoryName = Path.GetDirectoryName(parentDirectoryName);
325 GUILayout.FlexibleSpace();
326 GUILayout.EndHorizontal();
327 m_scrollPosition = GUILayout.BeginScrollView(
331 GUI.skin.horizontalScrollbar,
332 GUI.skin.verticalScrollbar,
337 m_directoriesWithImages,
340 if (m_selectedDirectory > -1) {
341 m_selectedFile = m_selectedNonMatchingDirectory = -1;
344 m_selectedNonMatchingDirectory,
345 m_nonMatchingDirectoriesWithImages,
348 if (m_selectedNonMatchingDirectory > -1) {
349 m_selectedDirectory = m_selectedFile = -1;
358 if (m_selectedFile > -1) {
359 m_selectedDirectory = m_selectedNonMatchingDirectory = -1;
364 m_nonMatchingFilesWithImages
367 GUILayout.EndScrollView();
368 GUILayout.BeginHorizontal();
372 GUILayout.EndHorizontal();
373 GUILayout.BeginHorizontal();
374 GUILayout.FlexibleSpace();
375 if (GUILayout.Button(
"Cancel", GUILayout.Width(buttonWidth))) {
379 GUI.enabled = m_selectedFile > -1;
382 GUI.enabled = m_selectedDirectory > -1;
384 GUI.enabled = m_selectedDirectory > -1 ||
386 m_currentDirectoryMatches &&
387 m_selectedNonMatchingDirectory == -1 &&
392 if (GUILayout.Button(
"Select", GUILayout.Width(buttonWidth))) {
394 m_callback(Path.Combine(m_currentDirectory, m_files[m_selectedFile]));
396 if (m_selectedDirectory > -1) {
397 m_callback(Path.Combine(m_currentDirectory, m_directories[m_selectedDirectory]));
404 GUILayout.EndHorizontal();
407 if (Event.current.type == EventType.Repaint) {
414 m_callback(Path.Combine(m_currentDirectory, m_files[i]));
423 SetNewDirectory(Path.Combine(m_currentDirectory, m_nonMatchingDirectories[i]));
static int SelectionList(int selected, GUIContent[] list)
ImprovedFileBrowser(Rect screenRect, string name, FinishedCallback callback)
void SwitchDirectoryNow()
FinishedCallback m_callback
ImprovedFileBrowser(Rect screenRect, string name, FinishedCallback callback, string startingPath)
void DirectoryDoubleClickCallback(int i)
string[] m_currentDirectoryParts
FileBrowserType BrowserType
void ReadDirectoryContents()
string m_currentDirectory
delegate void FinishedCallback(string path)
string[] m_nonMatchingFiles
GUIContent[] m_nonMatchingFilesWithImages
int m_selectedNonMatchingDirectory
void FileDoubleClickCallback(int i)
FileBrowserType m_browserType
!WiP Includes FLAGS of GUI.
Texture2D m_directoryImage
void SetNewDirectory(string directory)
void NonMatchingDirectoryDoubleClickCallback(int i)
GUIContent[] m_nonMatchingDirectoriesWithImages
bool m_currentDirectoryMatches
GUIContent[] m_filesWithImages
GUIContent[] m_directoriesWithImages
string[] m_nonMatchingDirectories