This repository has been archived on 2025-01-01. You can view files and clone it, but cannot push or open issues or pull requests.
ShiftOS_TheReturn/ShiftOS.Frontend/Apps/FileSkimmer.cs
2017-08-02 11:14:29 -04:00

175 lines
5.3 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Xna.Framework;
using ShiftOS.Engine;
using static ShiftOS.Objects.ShiftFS.Utils;
namespace ShiftOS.Frontend.Apps
{
[WinOpen("fileskimmer")]
[Launcher("File Skimmer", false, null, "System")]
[DefaultTitle("File Skimmer")]
public class FileSkimmer : GUI.Control, IShiftOSWindow
{
private string _currentdirectory = "0:";
private const string SD_SYSTEM = "__system";
private GUI.ListBox _fList = null;
private GUI.TextControl _currentdirtext = null;
public void OnLoad()
{
if (Hacking.CurrentHackable != null)
{
if (Hacking.CurrentHackable.VectorsUnlocked.Contains(Objects.SystemType.FileServer))
{
if (Mounts.Count > 2)
{
Mounts.RemoveAt(2);
}
var dir = new Objects.ShiftFS.Directory();
dir.Name = $"{Hacking.CurrentHackable.Data.SystemName} (ftp)";
Mounts.Add(dir);
foreach (var loot in Hacking.CurrentHackable.ServerFTPLoot)
{
if(!FileExists("2:/" + loot.LootName))
{
var bytes = Hacking.GetLootBytes(loot.PointTo);
WriteAllBytes($"2:/{loot.LootName}", bytes);
}
}
}
}
Width = 720;
Height = 480;
_fList = new GUI.ListBox();
_fList.KeyEvent += (e) =>
{
if(e.Key == Microsoft.Xna.Framework.Input.Keys.Enter)
{
Navigate(_fList.SelectedItem.ToString());
}
};
_fList.DoubleClick += () =>
{
try
{
Navigate(_fList.SelectedItem.ToString());
}
catch { }
};
AddControl(_fList);
_currentdirtext = new GUI.TextControl();
_currentdirtext.AutoSize = true;
AddControl(_currentdirtext);
ResetList();
}
public void Navigate(string relativepath)
{
if (relativepath == "Up one...")
{
if (_currentdirectory.Contains('/'))
{
int _index = _currentdirectory.LastIndexOf('/');
int _len = _currentdirectory.Length - _index;
_currentdirectory = _currentdirectory.Remove(_index, _len);
ResetList();
}
else
{
_currentdirectory = SD_SYSTEM;
ResetList();
}
return;
}
string path = "";
if (_currentdirectory == SD_SYSTEM)
path = relativepath;
else
path = _currentdirectory + "/" + relativepath;
if (DirectoryExists(path))
{
_currentdirectory = path;
ResetList();
}
else if (FileExists(path))
{
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.");
}
}
}
public void OnSkinLoad()
{
_currentdirtext.Font = SkinEngine.LoadedSkin.Header3Font;
}
public bool OnUnload()
{
return true;
}
public void OnUpgrade()
{
}
public void ResetList()
{
if (_currentdirectory == SD_SYSTEM)
_currentdirtext.Text = "My storage drives";
else
_currentdirtext.Text = _currentdirectory;
_fList.ClearItems();
if (_currentdirectory != SD_SYSTEM)
_fList.AddItem("Up one...");
if(_currentdirectory == SD_SYSTEM)
{
foreach(var mount in Mounts)
{
_fList.AddItem(Mounts.IndexOf(mount) + ":");
}
}
else
{
foreach(var dir in GetDirectories(_currentdirectory))
{
var dinf = GetDirectoryInfo(dir);
_fList.AddItem(dinf.Name);
}
foreach (var dir in GetFiles(_currentdirectory))
{
var dinf = GetFileInfo(dir);
_fList.AddItem(dinf.Name);
}
}
InvalidateTopLevel();
}
protected override void OnLayout(GameTime gameTime)
{
try
{
_currentdirtext.Layout(gameTime);
_fList.X = 0;
_fList.Y = 0;
_fList.Width = Width;
_fList.Height = Height - _currentdirtext.Height;
_currentdirtext.X = (Width - _currentdirtext.Width) / 2;
_currentdirtext.Y = _fList.Height;
}
catch { }
}
}
}