mattercontrol/ActionBar/PrinterActionRow.cs

239 lines
8.9 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using MatterHackers.Agg.Image;
using MatterHackers.Agg;
using MatterHackers.Agg.UI;
using MatterHackers.VectorMath;
using MatterHackers.MatterControl;
using MatterHackers.MatterControl.PrintQueue;
using MatterHackers.MatterControl.DataStorage;
using MatterHackers.MatterControl.PrinterControls.PrinterConnections;
using MatterHackers.Localizations;
namespace MatterHackers.MatterControl.ActionBar
{
class PrinterActionRow : ActionRowBase
{
TextImageButtonFactory actionBarButtonFactory = new TextImageButtonFactory();
Button connectPrinterButton;
Button disconnectPrinterButton;
Button selectActivePrinterButton;
ConnectionWindow connectionWindow;
bool connectionWindowIsOpen = false;
protected override void Initialize()
{
actionBarButtonFactory.normalTextColor = RGBA_Bytes.White;
actionBarButtonFactory.hoverTextColor = RGBA_Bytes.White;
actionBarButtonFactory.pressedTextColor = RGBA_Bytes.White;
actionBarButtonFactory.disabledTextColor = RGBA_Bytes.LightGray;
actionBarButtonFactory.disabledFillColor = ActiveTheme.Instance.PrimaryBackgroundColor;
actionBarButtonFactory.disabledBorderColor = ActiveTheme.Instance.PrimaryBackgroundColor;
actionBarButtonFactory.invertImageLocation = true;
actionBarButtonFactory.borderWidth = 0;
this.BackgroundColor = ActiveTheme.Instance.PrimaryBackgroundColor;
}
protected override void AddChildElements()
{
actionBarButtonFactory.invertImageLocation = false;
string connectString = new LocalizedString("Connect").Translated;
connectPrinterButton = actionBarButtonFactory.Generate(connectString, "icon_power_32x32.png");
connectPrinterButton.Margin = new BorderDouble(3, 0);
connectPrinterButton.VAnchor = VAnchor.ParentCenter;
connectPrinterButton.Cursor = Cursors.Hand;
string disconnectString = new LocalizedString("Disconnect").Translated;
disconnectPrinterButton = actionBarButtonFactory.Generate(disconnectString, "icon_power_32x32.png");
disconnectPrinterButton.Margin = new BorderDouble(3, 0);
disconnectPrinterButton.VAnchor = VAnchor.ParentCenter;
disconnectPrinterButton.Visible = false;
disconnectPrinterButton.Cursor = Cursors.Hand;
selectActivePrinterButton = new PrinterSelectButton();
selectActivePrinterButton.HAnchor = HAnchor.ParentLeftRight;
selectActivePrinterButton.Cursor = Cursors.Hand;
actionBarButtonFactory.invertImageLocation = true;
this.AddChild(connectPrinterButton);
this.AddChild(disconnectPrinterButton);
this.AddChild(selectActivePrinterButton);
this.AddChild(CreateOptionsMenu());
}
GuiWidget CreateOptionsMenu()
{
ImageBuffer gearImage = new ImageBuffer();
string imagePathAndFile = Path.Combine(ApplicationDataStorage.Instance.ApplicationStaticDataPath, "gear_icon.png");
ImageBMPIO.LoadImageData(imagePathAndFile, gearImage);
FlowLayoutWidget leftToRight = new FlowLayoutWidget();
leftToRight.Margin = new BorderDouble(5, 0);
string optionsString = new LocalizedString("Options").Translated;
TextWidget optionsText = new TextWidget(optionsString, textColor: RGBA_Bytes.White);
optionsText.VAnchor = Agg.UI.VAnchor.ParentCenter;
optionsText.Margin = new BorderDouble(0, 0, 3, 0);
leftToRight.AddChild(optionsText);
GuiWidget gearWidget = new ImageWidget(gearImage);
gearWidget.VAnchor = Agg.UI.VAnchor.ParentCenter;
leftToRight.AddChild(gearWidget);
leftToRight.HAnchor = HAnchor.FitToChildren;
leftToRight.VAnchor = VAnchor.FitToChildren;
Menu optionMenu = new Menu(leftToRight);
optionMenu.OpenOffset = new Vector2(-2, -10);
optionMenu.VAnchor = Agg.UI.VAnchor.ParentCenter;
optionMenu.MenuItems.Add(new MenuItem(new ThemeColorSelectorWidget()));
return optionMenu;
}
event EventHandler unregisterEvents;
protected override void AddHandlers()
{
ActivePrinterProfile.Instance.ActivePrinterChanged.RegisterEvent(ReloadPrinterSelectionWidget, ref unregisterEvents);
ActivePrinterProfile.Instance.ActivePrinterChanged.RegisterEvent(onActivePrinterChanged, ref unregisterEvents);
PrinterCommunication.Instance.EnableChanged.RegisterEvent(onPrinterStatusChanged, ref unregisterEvents);
PrinterCommunication.Instance.ConnectionStateChanged.RegisterEvent(onPrinterStatusChanged, ref unregisterEvents);
selectActivePrinterButton.Click += new ButtonBase.ButtonEventHandler(onSelectActivePrinterButton_Click);
connectPrinterButton.Click += new ButtonBase.ButtonEventHandler(onConnectButton_Click);
disconnectPrinterButton.Click += new ButtonBase.ButtonEventHandler(onDisconnectButtonClick);
base.AddHandlers();
}
public override void OnClosed(EventArgs e)
{
if (unregisterEvents != null)
{
unregisterEvents(this, null);
}
base.OnClosed(e);
}
void onConnectButton_Click(object sender, MouseEventArgs mouseEvent)
{
Button buttonClicked = ((Button)sender);
if (buttonClicked.Enabled)
{
if (ActivePrinterProfile.Instance.ActivePrinter == null)
{
OpenConnectionWindow();
}
else
{
ConnectToActivePrinter();
}
}
}
void ConnectToActivePrinter()
{
PrinterCommunication.Instance.HaltConnectionThread();
PrinterCommunication.Instance.ConnectToActivePrinter();
}
void onSelectActivePrinterButton_Click(object sender, MouseEventArgs mouseEvent)
{
OpenConnectionWindow();
}
void OpenConnectionWindow()
{
if (this.connectionWindowIsOpen == false)
{
connectionWindow = new ConnectionWindow();
this.connectionWindowIsOpen = true;
connectionWindow.Closed += new EventHandler(ConnectionWindow_Closed);
}
else
{
if (connectionWindow != null)
{
connectionWindow.BringToFront();
}
}
}
void ConnectionWindow_Closed(object sender, EventArgs e)
{
this.connectionWindowIsOpen = false;
}
void ReloadPrinterSelectionWidget(object sender, EventArgs e)
{
//selectActivePrinterButton.Invalidate();
}
void onActivePrinterChanged(object sender, EventArgs e)
{
connectPrinterButton.Enabled = true;
}
void onDisconnectButtonClick(object sender, MouseEventArgs e)
{
UiThread.RunOnIdle(OnIdleDisconnect);
}
void OnIdleDisconnect(object state)
{
bool doCancel = true;
if (PrinterCommunication.Instance.PrinterIsPrinting)
{
if (StyledMessageBox.ShowMessageBox("Disconnect and cancel the current print?", "WARNING: Disconneccting will cancel the current print.\n\nDo you want to disconnect?", StyledMessageBox.MessageType.YES_NO))
{
PrinterCommunication.Instance.Stop();
}
else
{
doCancel = false;
}
}
if (doCancel)
{
PrinterCommunication.Instance.Disable();
disconnectPrinterButton.Visible = false;
connectPrinterButton.Visible = true;
connectPrinterButton.Enabled = true;
selectActivePrinterButton.Invalidate();
}
}
void onPrinterStatusChanged(object sender, EventArgs e)
{
if (PrinterCommunication.Instance.PrinterIsConnected)
{
onConnectionSuccess();
}
else
{
onConnectionFailed();
}
}
void onConnectionFailed()
{
disconnectPrinterButton.Visible = false;
connectPrinterButton.Visible = true;
connectPrinterButton.Enabled = true;
}
void onConnectionSuccess()
{
disconnectPrinterButton.Visible = true;
connectPrinterButton.Visible = false;
}
}
}