ShiftOS-C-/source/ShiftUI/Theming/ThemeElementsMemphis.cs
2016-07-22 12:23:28 -04:00

279 lines
12 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ShiftUI.Theming.Default;
using System.Drawing;
using ShiftUI.ShiftOS;
using System.Drawing.Drawing2D;
namespace ShiftUI.Theming
{
class ThemeElementsMemphis : ThemeElementsDefault
{
public ThemeElementsMemphis()
{
}
public override ButtonPainter ButtonPainter
{
get
{
return new Memphis.ButtonPainter();
}
}
public override CheckBoxPainter CheckBoxPainter
{
get
{
return new Memphis.CheckBoxPainter();
}
}
}
namespace Memphis
{
internal class CheckBoxPainter : Default.CheckBoxPainter
{
#region Standard
public override void DrawNormalCheckBox(Graphics g, Rectangle bounds, Color backColor, Color foreColor, CheckState state)
{
int check_box_visible_size = (bounds.Height > bounds.Width) ? bounds.Width : bounds.Height;
int x_pos = Math.Max(0, bounds.X + (bounds.Width / 2) - check_box_visible_size / 2);
int y_pos = Math.Max(0, bounds.Y + (bounds.Height / 2) - check_box_visible_size / 2);
Rectangle rect = new Rectangle(x_pos, y_pos, check_box_visible_size, check_box_visible_size);
g.FillRectangle(new SolidBrush(Application.CurrentSkin.CheckBoxBackgroundColor), rect.X + 2, rect.Y + 2, rect.Width - 3, rect.Height - 3);
Pen pen = new Pen(Application.CurrentSkin.Border3DTopLeftInner, 1);
g.DrawLine(pen, rect.X, rect.Y, rect.X, rect.Bottom - 2);
g.DrawLine(pen, rect.X + 1, rect.Y, rect.Right - 2, rect.Y);
pen = new Pen(Application.CurrentSkin.Border3DBottomRight, 1);
g.DrawLine(pen, rect.X + 1, rect.Y + 1, rect.X + 1, rect.Bottom - 3);
g.DrawLine(pen, rect.X + 2, rect.Y + 1, rect.Right - 3, rect.Y + 1);
pen = new Pen(Application.CurrentSkin.Border3DTopLeftInner, 1);
g.DrawLine(pen, rect.Right - 1, rect.Y, rect.Right - 1, rect.Bottom - 1);
g.DrawLine(pen, rect.X, rect.Bottom - 1, rect.Right - 1, rect.Bottom - 1);
// oh boy, matching ms is like fighting against windmills
using (Pen h_pen = new Pen(Application.CurrentSkin.CheckBoxCheckColor))
{
g.DrawLine(h_pen, rect.X + 1, rect.Bottom - 2, rect.Right - 2, rect.Bottom - 2);
g.DrawLine(h_pen, rect.Right - 2, rect.Y + 1, rect.Right - 2, rect.Bottom - 2);
}
if (state == CheckState.Checked)
DrawCheck(g, bounds, Application.CurrentSkin.CheckBoxCheckColor);
else if (state == CheckState.Indeterminate)
DrawCheck(g, bounds, Application.CurrentSkin.CheckBoxCheckColor);
}
public override void DrawHotCheckBox(Graphics g, Rectangle bounds, Color backColor, Color foreColor, CheckState state)
{
DrawNormalCheckBox(g, bounds, backColor, foreColor, state);
}
public override void DrawPressedCheckBox(Graphics g, Rectangle bounds, Color backColor, Color foreColor, CheckState state)
{
int check_box_visible_size = (bounds.Height > bounds.Width) ? bounds.Width : bounds.Height;
int x_pos = Math.Max(0, bounds.X + (bounds.Width / 2) - check_box_visible_size / 2);
int y_pos = Math.Max(0, bounds.Y + (bounds.Height / 2) - check_box_visible_size / 2);
Rectangle rect = new Rectangle(x_pos, y_pos, check_box_visible_size, check_box_visible_size);
g.FillRectangle(new SolidBrush(Application.CurrentSkin.CheckBoxCheckColor), rect.X + 2, rect.Y + 2, rect.Width - 3, rect.Height - 3);
Pen pen = new Pen(Application.CurrentSkin.Border3DBottomRightInner, 1);
g.DrawLine(pen, rect.X, rect.Y, rect.X, rect.Bottom - 2);
g.DrawLine(pen, rect.X + 1, rect.Y, rect.Right - 2, rect.Y);
pen = new Pen(Application.CurrentSkin.Border3DBottomRight, 1);
g.DrawLine(pen, rect.X + 1, rect.Y + 1, rect.X + 1, rect.Bottom - 3);
g.DrawLine(pen, rect.X + 2, rect.Y + 1, rect.Right - 3, rect.Y + 1);
pen = new Pen(Application.CurrentSkin.Border3DTopLeftInner, 1);
g.DrawLine(pen, rect.Right - 1, rect.Y, rect.Right - 1, rect.Bottom - 1);
g.DrawLine(pen, rect.X, rect.Bottom - 1, rect.Right - 1, rect.Bottom - 1);
// oh boy, matching ms is like fighting against windmills
using (Pen h_pen = new Pen(Application.CurrentSkin.CheckBoxCheckColor))
{
g.DrawLine(h_pen, rect.X + 1, rect.Bottom - 2, rect.Right - 2, rect.Bottom - 2);
g.DrawLine(h_pen, rect.Right - 2, rect.Y + 1, rect.Right - 2, rect.Bottom - 2);
}
if (state == CheckState.Checked)
DrawCheck(g, bounds, Application.CurrentSkin.CheckBoxCheckColor);
else if (state == CheckState.Indeterminate)
DrawCheck(g, bounds, Application.CurrentSkin.CheckBoxCheckColor);
}
public override void DrawDisabledCheckBox(Graphics g, Rectangle bounds, Color backColor, Color foreColor, CheckState state)
{
DrawPressedCheckBox(g, bounds, backColor, foreColor, CheckState.Unchecked);
if (state == CheckState.Checked || state == CheckState.Indeterminate)
DrawCheck(g, bounds, SystemColors.ControlDark);
}
#endregion
#region FlatStyle
public override void DrawFlatNormalCheckBox(Graphics g, Rectangle bounds, Color backColor, Color foreColor, CheckState state)
{
DrawNormalCheckBox(g, bounds, backColor, foreColor, state);
}
public override void DrawFlatHotCheckBox(Graphics g, Rectangle bounds, Color backColor, Color foreColor, CheckState state)
{
DrawFlatNormalCheckBox(g, bounds, backColor, foreColor, state);
}
public override void DrawFlatPressedCheckBox(Graphics g, Rectangle bounds, Color backColor, Color foreColor, CheckState state)
{
DrawPressedCheckBox(g, bounds, backColor, foreColor, state);
}
/* public override void DrawFlatDisabledCheckBox(Graphics g, Rectangle bounds, Color backColor, Color foreColor, CheckState state)
{
Rectangle checkbox_rectangle;
checkbox_rectangle = new Rectangle(bounds.X, bounds.Y, Math.Max(bounds.Width - 2, 0), Math.Max(bounds.Height - 2, 0));
WidgetPaint.DrawBorder(g, checkbox_rectangle, foreColor, ButtonBorderStyle.Solid);
bounds.Offset(-1, 0);
if (state == CheckState.Checked || state == CheckState.Indeterminate)
DrawCheck(g, bounds, SystemColors.ControlDarkDark);
}*/
#endregion
#region Popup
public override void DrawPopupNormalCheckBox(Graphics g, Rectangle bounds, Color backColor, Color foreColor, CheckState state)
{
DrawFlatNormalCheckBox(g, bounds, backColor, foreColor, state);
}
public override void DrawPopupHotCheckBox(Graphics g, Rectangle bounds, Color backColor, Color foreColor, CheckState state)
{
DrawFlatNormalCheckBox(g, bounds, backColor, foreColor, state);
}
public override void DrawPopupPressedCheckBox(Graphics g, Rectangle bounds, Color backColor, Color foreColor, CheckState state)
{
DrawFlatPressedCheckBox(g, bounds, backColor, foreColor, state);
}
public override void DrawPopupDisabledCheckBox(Graphics g, Rectangle bounds, Color backColor, Color foreColor, CheckState state)
{
}
#endregion
#region Check
public override void DrawCheck(Graphics g, Rectangle bounds, Color checkColor)
{
int check_size = (bounds.Height > bounds.Width) ? bounds.Width / 2 : bounds.Height / 2;
Pen check_pen = ResPool.GetPen(checkColor);
if (check_size < 7)
{
int lineWidth = Math.Max(3, check_size / 3);
int Scale = Math.Max(1, check_size / 9);
Rectangle rect = new Rectangle(bounds.X + (bounds.Width / 2) - (check_size / 2) - 1, bounds.Y + (bounds.Height / 2) - (check_size / 2) - 1,
check_size, check_size);
for (int i = 0; i < lineWidth; i++)
{
g.DrawLine(check_pen, rect.Left + lineWidth / 2, rect.Top + lineWidth + i, rect.Left + lineWidth / 2 + 2 * Scale, rect.Top + lineWidth + 2 * Scale + i);
g.DrawLine(check_pen, rect.Left + lineWidth / 2 + 2 * Scale, rect.Top + lineWidth + 2 * Scale + i, rect.Left + lineWidth / 2 + 6 * Scale, rect.Top + lineWidth - 2 * Scale + i);
}
}
else
{
int lineWidth = Math.Max(3, check_size / 3) + 1;
int x_half = bounds.Width / 2;
int y_half = bounds.Height / 2;
Rectangle rect = new Rectangle(bounds.X + x_half - (check_size / 2) - 1, bounds.Y + y_half - (check_size / 2),
check_size, check_size);
int gradient_left = check_size / 3;
int gradient_right = check_size - gradient_left - 1;
for (int i = 0; i < lineWidth; i++)
{
g.DrawLine(check_pen, rect.X, rect.Bottom - 1 - gradient_left - i, rect.X + gradient_left, rect.Bottom - 1 - i);
g.DrawLine(check_pen, rect.X + gradient_left, rect.Bottom - 1 - i, rect.Right - 1, rect.Bottom - i - 1 - gradient_right);
}
}
}
#endregion
}
internal class ButtonPainter : Default.ButtonPainter
{
#region Buttons
#region Standard Button
public override void Draw(Graphics g, Rectangle bounds, ButtonThemeState state, Color backColor, Color foreColor)
{
bool is_themecolor = backColor.ToArgb() == ThemeEngine.Current.ColorControl.ToArgb() || backColor == Color.Empty ? true : false;
CPColor cpcolor = is_themecolor ? CPColor.Empty : ResPool.GetCPColor(backColor);
Pen pen;
switch (state)
{
case ButtonThemeState.Disabled:
case ButtonThemeState.Normal:
case ButtonThemeState.Entered:
case ButtonThemeState.Default:
pen = new Pen(foreColor, Application.CurrentSkin.ButtonBorderWidth);
g.DrawRectangle(pen, bounds);
break;
case ButtonThemeState.Pressed:
g.FillRectangle(new SolidBrush(backColor), bounds);
pen = new Pen(foreColor, Application.CurrentSkin.ButtonBorderWidth);
g.DrawRectangle(pen, bounds);
break;
}
}
#endregion
#region FlatStyle Button
public override void DrawFlat(Graphics g, Rectangle bounds, ButtonThemeState state, Color backColor, Color foreColor, FlatButtonAppearance appearance)
{
Draw(g, bounds, state, backColor, foreColor);
}
#endregion
#region Popup Button
public override void DrawPopup(Graphics g, Rectangle bounds, ButtonThemeState state, Color backColor, Color foreColor)
{
Draw(g, bounds, state, backColor, foreColor);
}
#endregion
#endregion
private static Color ChangeIntensity(Color baseColor, float percent)
{
int H, I, S;
WidgetPaint.Color2HBS(baseColor, out H, out I, out S);
int NewIntensity = Math.Min(255, (int)(I * percent));
return WidgetPaint.HBS2Color(H, NewIntensity, S);
}
}
}
}