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.Wpf/Startup.cs
2017-01-08 10:17:07 -05:00

351 lines
11 KiB
C#

/*
* MIT License
*
* Copyright (c) 2017 Michael VanOverbeek and ShiftOS devs
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Threading;
using ShiftOS.Engine;
using static ShiftOS.Engine.SkinEngine;
namespace ShiftOS.Wpf
{
public static class ShiftOSSkin
{
public static Brush GetAppButtonHoverBrush(DependencyObject obj)
{
return (Brush)obj.GetValue(AppButtonHoverBrushProperty);
}
public static void SetAppButtonHoverBrush(DependencyObject obj, Brush value)
{
obj.SetValue(AppButtonHoverBrushProperty, value);
}
public static readonly DependencyProperty AppButtonHoverBrushProperty =
DependencyProperty.RegisterAttached(
"AppButtonHoverBrush",
typeof(Brush),
typeof(ShiftOSSkin),
new FrameworkPropertyMetadata(LoadedSkin.Menu_MenuItemSelected.CreateBrush()));
}
public static class Startup
{
private static Visibility getVisibility(string upg)
{
if (Shiftorium.UpgradeInstalled(upg))
{
return Visibility.Visible;
}
else
{
return Visibility.Collapsed;
}
}
public static void Upgrade(this Control ctrl, string upg)
{
ctrl.Visibility = getVisibility(upg);
}
public static void Upgrade(this UIElement ctrl, string upg)
{
ctrl.Visibility = getVisibility(upg);
}
static public void BringToFront(this UserControl pToMove, Canvas pParent)
{
int currentIndex = Canvas.GetZIndex(pToMove);
int zIndex = 0;
int maxZ = 0;
UserControl child;
for (int i = 0; i < pParent.Children.Count; i++)
{
if (pParent.Children[i] is UserControl &&
pParent.Children[i] != pToMove)
{
child = pParent.Children[i] as UserControl;
zIndex = Canvas.GetZIndex(child);
maxZ = Math.Max(maxZ, zIndex);
if (zIndex > currentIndex)
{
Canvas.SetZIndex(child, zIndex - 1);
}
}
}
Canvas.SetZIndex(pToMove, maxZ);
}
public static void SetTitle(this IShiftOSWindow win, string title)
{
foreach(var frm in AppearanceManager.OpenForms)
{
if(frm.ParentWindow == win)
{
frm.Text = title;
}
}
}
public static void InitiateEngine(System.IO.TextWriter writer)
{
OutOfBoxExperience.Init(new OOBE());
AppearanceManager.Initiate(new WpfWindowManager());
Infobox.Init(new WpfInfoboxFrontend());
FileSkimmerBackend.Init(new Applications.WpfFSFrontend());
if (writer != null)
{
Console.SetOut(writer);
}
SaveSystem.Begin(false);
AppearanceManager.OnExit += () =>
{
Environment.Exit(0);
};
}
public static void SetMouseOverStyle(this Control button, string style = "")
{
var bg = button.Background;
var fg = button.Foreground;
var border = button.BorderThickness;
var borderfg = button.BorderBrush;
button.MouseEnter += (o, a) =>
{
try
{
switch (style)
{
case "menuitem":
button.Background = LoadedSkin.Menu_MenuItemSelected.CreateBrush();
button.Foreground = LoadedSkin.Menu_SelectedTextColor.CreateBrush();
button.BorderBrush = LoadedSkin.Menu_MenuItemBorder.CreateBrush();
break;
}
}
catch { }
};
button.MouseLeave += (o, a) =>
{
try
{
button.Background = bg;
button.Foreground = fg;
button.BorderThickness = border;
button.BorderBrush = borderfg;
}
catch
{
}
};
}
public static void DestroyShiftOSEngine()
{
ServerManager.Disconnect();
}
public static TextBox ConsoleOut { get; set; }
public static SolidColorBrush CreateBrush(this System.Drawing.Color color)
{
return new SolidColorBrush(Color.FromArgb(color.A, color.R, color.G, color.B));
}
public struct Font
{
public FontFamily FontFamily { get; set; }
public double FontSize { get; set; }
public FontStyle FontStyle { get; set; }
public FontWeight FontWeight { get; set; }
}
private static Font createFont(System.Drawing.Font f)
{
var font = new Font();
font.FontFamily = new FontFamily(f.Name);
font.FontSize = f.Size;
switch (f.Style)
{
case System.Drawing.FontStyle.Bold:
font.FontWeight = FontWeights.Bold;
break;
case System.Drawing.FontStyle.Italic:
font.FontStyle = FontStyles.Oblique;
break;
default:
case System.Drawing.FontStyle.Regular:
font.FontStyle = FontStyles.Normal;
break;
}
return font;
}
public static void SetFont(this Control ctrl, System.Drawing.Font f)
{
var font = createFont(f);
ctrl.FontFamily = font.FontFamily;
ctrl.FontSize = PointsToPixels(font.FontSize);
ctrl.FontStyle = font.FontStyle;
ctrl.FontWeight = font.FontWeight;
}
private static double PointsToPixels(double points)
{
return points * (96.0 / 72.0);
}
public static void SetFont(this TextBlock ui, System.Drawing.Font f)
{
var font = createFont(f);
ui.FontFamily = font.FontFamily;
ui.FontSize = PointsToPixels(font.FontSize);
ui.FontStyle = font.FontStyle;
ui.FontWeight = font.FontWeight;
}
public static BitmapImage ToBitmapImage(this System.Drawing.Image img)
{
using(var str = new MemoryStream())
{
img.Save(str, System.Drawing.Imaging.ImageFormat.Png);
return ToBitmapImage(str.ToArray());
}
}
public static BitmapImage ToBitmapImage(this byte[] imgSource)
{
using(MemoryStream ms = new MemoryStream(imgSource))
{
var img = new BitmapImage();
img.BeginInit();
img.StreamSource = ms;
img.CacheOption = BitmapCacheOption.OnLoad;
img.EndInit();
return img;
}
}
}
public class WpfTerminalTextWriter : TextWriter
{
public override Encoding Encoding
{
get
{
return Encoding.Unicode;
}
}
public TextBox UnderlyingControl
{
get
{
return Startup.ConsoleOut;
}
}
public void select()
{
try
{
UnderlyingControl.Select(UnderlyingControl.Text.Length, 0);
UnderlyingControl.ScrollToEnd();
UnderlyingControl.Focus();
AppearanceManager.CurrentPosition = 1;
AppearanceManager.LastLength = UnderlyingControl.Text.Length - 1;
}
catch { }
}
public override void Write(char value)
{
try
{
UnderlyingControl.Dispatcher.Invoke(new Action(() =>
{
UnderlyingControl.AppendText(value.ToString());
select();
}));
}
catch { }
}
public override void WriteLine(string value)
{
try
{
UnderlyingControl.Dispatcher.Invoke(new Action(() =>
{
UnderlyingControl.AppendText(ShiftOS.Engine.Localization.Parse(value) + Environment.NewLine);
select();
}));
}
catch { }
}
public void SetLastText()
{
if (SaveSystem.CurrentSave != null)
{
if (!Shiftorium.UpgradeInstalled("window_manager"))
AppearanceManager.LastTerminalText = UnderlyingControl.Text;
}
}
public override void Write(string value)
{
try
{
UnderlyingControl.Dispatcher.Invoke(new Action(() =>
{
UnderlyingControl.AppendText(ShiftOS.Engine.Localization.Parse(value));
select();
}));
}
catch { }
}
}
}