From ec363f09caa99f8b0ffa9351950fed5629f396f7 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 5 Aug 2017 15:44:09 -0400 Subject: file skimmer icons --- ShiftOS.Frontend/Apps/FileSkimmer.cs | 130 +++++++++++++++++++++++++++++------ 1 file changed, 108 insertions(+), 22 deletions(-) (limited to 'ShiftOS.Frontend/Apps') diff --git a/ShiftOS.Frontend/Apps/FileSkimmer.cs b/ShiftOS.Frontend/Apps/FileSkimmer.cs index 9249595..315e7ad 100644 --- a/ShiftOS.Frontend/Apps/FileSkimmer.cs +++ b/ShiftOS.Frontend/Apps/FileSkimmer.cs @@ -1,10 +1,14 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; using ShiftOS.Engine; +using ShiftOS.Frontend.GraphicsSubsystem; +using ShiftOS.Frontend.GUI; using static ShiftOS.Objects.ShiftFS.Utils; namespace ShiftOS.Frontend.Apps @@ -16,7 +20,7 @@ namespace ShiftOS.Frontend.Apps { private string _currentdirectory = "0:"; private const string SD_SYSTEM = "__system"; - private GUI.ListBox _fList = null; + private GUI.ListView _fList = null; private GUI.TextControl _currentdirtext = null; public void OnLoad() @@ -46,19 +50,21 @@ namespace ShiftOS.Frontend.Apps Width = 720; Height = 480; - _fList = new GUI.ListBox(); + _fList = new GUI.ListView(); + //TODO: keyboard support in listviews + /* _fList.KeyEvent += (e) => { if(e.Key == Microsoft.Xna.Framework.Input.Keys.Enter) { Navigate(_fList.SelectedItem.ToString()); } - }; + };*/ _fList.DoubleClick += () => { try { - Navigate(_fList.SelectedItem.ToString()); + Navigate(_fList.SelectedItem.Tag); } catch { } }; @@ -69,30 +75,28 @@ namespace ShiftOS.Frontend.Apps ResetList(); } - public void Navigate(string relativepath) + public void Navigate(string path) { - if (relativepath == "Up one...") + if(path == "__up") { - if (_currentdirectory.Contains('/')) + if (_currentdirectory == SD_SYSTEM) + throw new NaughtyDeveloperException("Someone tried to make it so you can go \"up one directory\" in the mounts list."); + if (_currentdirectory.EndsWith(":")) { - int _index = _currentdirectory.LastIndexOf('/'); - int _len = _currentdirectory.Length - _index; - _currentdirectory = _currentdirectory.Remove(_index, _len); + _currentdirectory = SD_SYSTEM; ResetList(); + return; } else { - _currentdirectory = SD_SYSTEM; + int slashlast = _currentdirectory.LastIndexOf("/"); + int len = _currentdirectory.Length - slashlast; + _currentdirectory = _currentdirectory.Remove(slashlast, len); ResetList(); + return; } - return; } - string path = ""; - if (_currentdirectory == SD_SYSTEM) - path = relativepath; - else - path = _currentdirectory + "/" + relativepath; if (DirectoryExists(path)) { _currentdirectory = path; @@ -102,16 +106,73 @@ namespace ShiftOS.Frontend.Apps { if (!FileSkimmerBackend.OpenFile(path)) { - Engine.Infobox.Show("File Skimmer can't open this file!", "A program that can open files of this type was not found on your computer."); + Engine.Infobox.Show("File Skimmer can't open this file!", "File Skimmer couldn't find a program that can open a file of this type. Please install a program that can handle this file and try again."); + } + } + } + + public Texture2D ToTexture2D(System.Drawing.Image img) + { + if (img == null) + return null; + using(var bmp = new System.Drawing.Bitmap(img)) + { + var lck = bmp.LockBits(new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); + var arr = new byte[Math.Abs(lck.Stride) * lck.Height]; + Marshal.Copy(lck.Scan0, arr, 0, arr.Length); + for(int i = 0; i < arr.Length; i += 4) + { + byte r = arr[i]; + byte b = arr[i + 2]; + arr[i] = b; + arr[i + 2] = r; } + var tex2 = new Texture2D(UIManager.GraphicsDevice, bmp.Width, bmp.Height); + tex2.SetData(arr); + bmp.UnlockBits(lck); + return tex2; } } public void OnSkinLoad() { + foreach(var name in Enum.GetNames(typeof(FileType))) + { + FileType ftype = (FileType)Enum.Parse(typeof(FileType), name); + var img = ToTexture2D(GetImage(ftype)); + _fList.SetImage(name, img); + } + + _currentdirtext.Font = SkinEngine.LoadedSkin.Header3Font; } + public System.Drawing.Image GetImage(FileType type) + { + switch (type) + { + case FileType.UpOne: + return Properties.Resources.fileicon5; + case FileType.Mount: + case FileType.Directory: + return Properties.Resources.fileicon0; + case FileType.Executable: + case FileType.Lua: + case FileType.Python: + return Properties.Resources.fileiconsaa; + case FileType.Image: + return Properties.Resources.fileicon3; + case FileType.Skin: + return Properties.Resources.fileicon10; + case FileType.TextFile: + return Properties.Resources.fileicon2; + case FileType.CommandFormat: + return Properties.Resources.fileiconcf; + default: + return Properties.Resources.fileicon1; + } + } + public bool OnUnload() { return true; @@ -130,13 +191,25 @@ namespace ShiftOS.Frontend.Apps _fList.ClearItems(); if (_currentdirectory != SD_SYSTEM) - _fList.AddItem("Up one..."); + _fList.AddItem(new GUI.ListViewItem + { + Text = "Up one...", + Tag = "__up", + ImageKey = FileType.UpOne.ToString() + }); if(_currentdirectory == SD_SYSTEM) { foreach(var mount in Mounts) { - _fList.AddItem(Mounts.IndexOf(mount) + ":"); + string mountpath = $"{Mounts.IndexOf(mount)}:"; + string name = $"{mount.Name} ({mountpath})"; + _fList.AddItem(new ListViewItem + { + Text = name, + Tag = mountpath, + ImageKey = FileType.Mount.ToString() + }); } } else @@ -144,12 +217,25 @@ namespace ShiftOS.Frontend.Apps foreach(var dir in GetDirectories(_currentdirectory)) { var dinf = GetDirectoryInfo(dir); - _fList.AddItem(dinf.Name); + _fList.AddItem(new ListViewItem + { + Text = dinf.Name, + Tag = dir, + ImageKey = FileType.Directory.ToString() + }); } foreach (var dir in GetFiles(_currentdirectory)) { var dinf = GetFileInfo(dir); - _fList.AddItem(dinf.Name); + var ext = FileSkimmerBackend.GetFileType(dir); + + + _fList.AddItem(new ListViewItem + { + Text = dinf.Name, + Tag = dir, + ImageKey = ext.ToString() + }); } } -- cgit v1.2.3