mattercontrol/WidescreenPanel.cs

318 lines
14 KiB
C#
Raw Normal View History

2014-01-29 19:09:30 -08:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MatterHackers.Agg;
using MatterHackers.Agg.Transform;
using MatterHackers.Agg.Image;
using MatterHackers.Agg.VertexSource;
using MatterHackers.Agg.UI;
using MatterHackers.Agg.Font;
using MatterHackers.VectorMath;
using MatterHackers.MatterControl;
using MatterHackers.MatterControl.PrintQueue;
using MatterHackers.MatterControl.PrintLibrary;
using MatterHackers.MatterControl.DataStorage;
using MatterHackers.Localizations;
namespace MatterHackers.MatterControl
{
public class WidescreenPanel : Splitter
{
SimpleTextTabWidget aboutTabView;
static WidescreenPanel globalInstance;
TabControl advancedControlsTabControl;
TabControl mainControlsTabControl;
SliceSettingsWidget sliceSettingsWidget;
TabControl advancedControls;
private delegate void ReloadPanel();
public TabPage QueueTabPage;
public TabPage AboutTabPage;
TextImageButtonFactory advancedControlsButtonFactory = new TextImageButtonFactory();
RGBA_Bytes unselectedTextColor = ActiveTheme.Instance.TabLabelUnselected;
public WidescreenPanel()
: base()
{
PrinterCommunication.Instance.ActivePrinterChanged.RegisterEvent(LoadSettingsOnPrinterChanged, ref unregisterEvents);
// do the front panel stuff
{
// first add the print progress bar
this.Panel1.AddChild(new PrintProgressBar());
// construct the main controls tab control
mainControlsTabControl = new TabControl();
mainControlsTabControl.TabBar.BackgroundColor = ActiveTheme.Instance.PrimaryBackgroundColor;
mainControlsTabControl.TabBar.BorderColor = new RGBA_Bytes(0, 0, 0, 0);
mainControlsTabControl.TabBar.Margin = new BorderDouble(0, 0);
mainControlsTabControl.TabBar.Padding = new BorderDouble(0, 2);
QueueTabPage = new TabPage(new QueueControlsWidget(), "Queue");
NumQueueItemsChanged(this, null);
mainControlsTabControl.AddTab(new SimpleTextTabWidget(QueueTabPage, 18,
ActiveTheme.Instance.PrimaryTextColor, new RGBA_Bytes(), unselectedTextColor, new RGBA_Bytes()));
//mainControlsTabControl.AddTab(new SimpleTextTabWidget(new TabPage(new GuiWidget(), "History"), 18,
// ActiveTheme.Instance.PrimaryTextColor, new RGBA_Bytes(), unselectedTextColor, new RGBA_Bytes()));
mainControlsTabControl.AddTab(new SimpleTextTabWidget(new TabPage(new PrintLibraryWidget(), "Library"), 18,
ActiveTheme.Instance.PrimaryTextColor, new RGBA_Bytes(), unselectedTextColor, new RGBA_Bytes()));
AboutTabPage = new TabPage(new AboutPage(), "About");
aboutTabView = new SimpleTextTabWidget(AboutTabPage, 18,
ActiveTheme.Instance.PrimaryTextColor, new RGBA_Bytes(), unselectedTextColor, new RGBA_Bytes());
mainControlsTabControl.AddTab(aboutTabView);
advancedControlsButtonFactory.normalTextColor = RGBA_Bytes.White;
advancedControlsButtonFactory.hoverTextColor = RGBA_Bytes.White;
advancedControlsButtonFactory.pressedTextColor = RGBA_Bytes.White;
advancedControlsButtonFactory.fontSize = 10;
advancedControlsButtonFactory.disabledTextColor = RGBA_Bytes.LightGray;
advancedControlsButtonFactory.disabledFillColor = ActiveTheme.Instance.PrimaryBackgroundColor;
advancedControlsButtonFactory.disabledBorderColor = ActiveTheme.Instance.PrimaryBackgroundColor;
advancedControlsButtonFactory.invertImageLocation = true;
Button advancedControlsLinkButton = advancedControlsButtonFactory.Generate("Advanced\nControls", "icon_arrow_right_32x32.png");
advancedControlsLinkButton.Margin = new BorderDouble(right: 3);
advancedControlsLinkButton.VAnchor = VAnchor.ParentBottom;
advancedControlsLinkButton.Cursor = Cursors.Hand;
advancedControlsLinkButton.Click += new ButtonBase.ButtonEventHandler(AdvancedControlsButton_Click);
advancedControlsLinkButton.MouseEnterBounds += new EventHandler(onMouseEnterBoundsAdvancedControlsLink);
advancedControlsLinkButton.MouseLeaveBounds += new EventHandler(onMouseLeaveBoundsAdvancedControlsLink);
GuiWidget hSpacer = new GuiWidget();
hSpacer.HAnchor = HAnchor.ParentLeftRight;
mainControlsTabControl.TabBar.AddChild(hSpacer);
//mainControlsTabControl.TabBar.AddChild(advancedControlsLinkButton);
// and add it
this.Panel1.AddChild(mainControlsTabControl);
SetUpdateNotification(this, null);
}
// do the back panel
{
advancedControlsTabControl = CreateNewAdvancedControlsTab(new SliceSettingsWidget.UiState());
this.Panel2.AddChild(advancedControlsTabControl);
//this.Panel2.AddChild(new PrintProgressBar());
}
AddHandlers();
}
void AdvancedControlsButton_Click(object sender, MouseEventArgs mouseEvent)
{
if (MainSlidePanel.Instance.PannelIndex == 0)
{
MainSlidePanel.Instance.PannelIndex = 1;
}
else
{
MainSlidePanel.Instance.PannelIndex = 0;
}
}
void onMouseEnterBoundsAdvancedControlsLink(Object sender, EventArgs e)
{
HelpTextWidget.Instance.ShowHoverText("View Manual Printer Controls and Slicing Settings");
}
void onMouseLeaveBoundsAdvancedControlsLink(Object sender, EventArgs e)
{
HelpTextWidget.Instance.HideHoverText();
}
void onMouseEnterBoundsPrintQueueLink(Object sender, EventArgs e)
{
HelpTextWidget.Instance.ShowHoverText("View Queue and Library");
}
void onMouseLeaveBoundsPrintQueueLink(Object sender, EventArgs e)
{
HelpTextWidget.Instance.HideHoverText();
}
public static WidescreenPanel Instance
{
get
{
if (globalInstance == null)
{
globalInstance = new WidescreenPanel();
}
return globalInstance;
}
}
public override void OnClosed(EventArgs e)
{
if (unregisterEvents != null)
{
unregisterEvents(this, null);
}
base.OnClosed(e);
}
void DoNotChangePanel()
{
//Empty function used as placeholder
}
SliceSettingsWidget.UiState sliceSettingsUiState;
void DoChangePanel(object state)
{
// remember which tab we were on
int topTabIndex = this.advancedControlsTabControl.SelectedTabIndex;
// remove the advance control and replace it with new ones build for the selected printer
int advancedControlsWidgetIndex = Panel2.GetChildIndex(this.advancedControlsTabControl);
Panel2.RemoveChild(advancedControlsWidgetIndex);
this.advancedControlsTabControl = CreateNewAdvancedControlsTab(sliceSettingsUiState);
Panel2.AddChild(this.advancedControlsTabControl, advancedControlsWidgetIndex);
// set the selected tab back to the one it was before we replace the control
this.advancedControlsTabControl.SelectTab(topTabIndex);
// This is a hack to make the pannel remain on the screen. It would be great to debug it and understand
// why it does not work without this code in here.
RectangleDouble localBounds = this.LocalBounds;
this.LocalBounds = new RectangleDouble(0, 0, this.LocalBounds.Width - 1, 10);
this.LocalBounds = localBounds;
}
TabControl CreateNewAdvancedControlsTab(SliceSettingsWidget.UiState sliceSettingsUiState)
{
advancedControls = new TabControl();
advancedControls.BackgroundColor = ActiveTheme.Instance.PrimaryAccentColor;
advancedControls.TabBar.BorderColor = RGBA_Bytes.White;
advancedControls.TabBar.Margin = new BorderDouble(0, 0);
advancedControls.TabBar.Padding = new BorderDouble(0, 2);
advancedControlsButtonFactory.invertImageLocation = false;
Button advancedControlsLinkButton = advancedControlsButtonFactory.Generate("Print\nQueue", "icon_arrow_left_32x32.png");
advancedControlsLinkButton.Margin = new BorderDouble(right: 3);
advancedControlsLinkButton.VAnchor = VAnchor.ParentBottom;
advancedControlsLinkButton.Cursor = Cursors.Hand;
advancedControlsLinkButton.Click += new ButtonBase.ButtonEventHandler(AdvancedControlsButton_Click);
advancedControlsLinkButton.MouseEnterBounds += new EventHandler(onMouseEnterBoundsPrintQueueLink);
advancedControlsLinkButton.MouseLeaveBounds += new EventHandler(onMouseLeaveBoundsPrintQueueLink);
//advancedControls.TabBar.AddChild(advancedControlsLinkButton);
GuiWidget manualPrinterControls = new ManualPrinterControls();
ScrollableWidget manualPrinterControlsScrollArea = new ScrollableWidget(true);
manualPrinterControlsScrollArea.ScrollArea.HAnchor |= Agg.UI.HAnchor.ParentLeftRight;
manualPrinterControlsScrollArea.AnchorAll();
manualPrinterControlsScrollArea.AddChild(manualPrinterControls);
advancedControls.AddTab(new SimpleTextTabWidget(new TabPage(manualPrinterControlsScrollArea, "Printer Controls"), 18,
ActiveTheme.Instance.PrimaryTextColor, new RGBA_Bytes(), unselectedTextColor, new RGBA_Bytes()));
sliceSettingsWidget = new SliceSettingsWidget(sliceSettingsUiState);
advancedControls.AddTab(new SimpleTextTabWidget(new TabPage(sliceSettingsWidget, "Slice Settings"), 18,
ActiveTheme.Instance.PrimaryTextColor, new RGBA_Bytes(), unselectedTextColor, new RGBA_Bytes()));
return advancedControls;
}
bool UpdateIsAvailable()
{
string currentBuildToken = ApplicationSettings.Instance.get("CurrentBuildToken");
string applicationBuildToken = VersionInfo.Instance.BuildToken;
if (applicationBuildToken == currentBuildToken || currentBuildToken == null)
{
return false;
}
else
{
return true;
}
}
event EventHandler unregisterEvents;
void AddHandlers()
{
ActiveTheme.Instance.ThemeChanged.RegisterEvent(onThemeChanged, ref unregisterEvents);
PrintQueue.PrintQueueControl.Instance.ItemAdded.RegisterEvent(NumQueueItemsChanged, ref unregisterEvents);
PrintQueue.PrintQueueControl.Instance.ItemRemoved.RegisterEvent(NumQueueItemsChanged, ref unregisterEvents);
}
class NotificationWidget : GuiWidget
{
public NotificationWidget()
: base(12, 12)
{
}
public override void OnDraw(Graphics2D graphics2D)
{
graphics2D.Circle(Width / 2, Height / 2, Width / 2, RGBA_Bytes.White);
graphics2D.Circle(Width / 2, Height / 2, Width / 2 - 1, RGBA_Bytes.Red);
graphics2D.FillRectangle(Width / 2 - 1, Height / 2 - 3, Width / 2 + 1, Height / 2 + 3, RGBA_Bytes.White);
//graphics2D.DrawString("1", Width / 2, Height / 2 + 1, 8, Justification.Center, Baseline.BoundsCenter, RGBA_Bytes.White);
base.OnDraw(graphics2D);
}
}
GuiWidget addedUpdateMark = null;
public void SetUpdateNotification(object sender, EventArgs widgetEvent)
{
if (this.UpdateIsAvailable() || UpdateControl.NeedToCheckForUpdateFirstTimeEver)
{
#if true
if (addedUpdateMark == null)
{
UpdateControl.NeedToCheckForUpdateFirstTimeEver = false;
addedUpdateMark = new NotificationWidget();
addedUpdateMark.OriginRelativeParent = new Vector2(63, 10);
aboutTabView.AddChild(addedUpdateMark);
}
#else
AboutTabPage.Text = string.Format("About (!)");
#endif
}
else
{
if (addedUpdateMark != null)
{
addedUpdateMark.Visible = false;
}
AboutTabPage.Text = string.Format("About");
}
}
void NumQueueItemsChanged(object sender, EventArgs widgetEvent)
{
string queueString = new LocalizedString("Queue ({0})").Translated;
QueueTabPage.Text = string.Format(queueString, PrintQueue.PrintQueueControl.Instance.Count);
}
private void onThemeChanged(object sender, EventArgs e)
{
this.advancedControls.BackgroundColor = ActiveTheme.Instance.PrimaryAccentColor;
this.advancedControls.Invalidate();
}
public void ReloadBackPanel()
{
sliceSettingsUiState = new SliceSettingsWidget.UiState(sliceSettingsWidget);
UiThread.RunOnIdle(DoChangePanel);
}
public void LoadSettingsOnPrinterChanged(object sender, EventArgs e)
{
ActiveSliceSettings.Instance.LoadSettingsForPrinter();
MainSlidePanel.Instance.ReloadBackPanel();
}
}
}