152 lines
5.5 KiB
C#
152 lines
5.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
|
|
using MatterHackers.Agg;
|
|
using MatterHackers.Agg.UI;
|
|
|
|
namespace MatterHackers.MatterControl
|
|
{
|
|
public class EditableNumberDisplay : FlowLayoutWidget
|
|
{
|
|
protected ClickWidget clickableValueContainer;
|
|
protected Button setButton;
|
|
protected MHNumberEdit numberInputField;
|
|
protected TextWidget valueDisplay;
|
|
|
|
public event EventHandler EditComplete;
|
|
public event EventHandler EditEnabled;
|
|
|
|
public EditableNumberDisplay(TextImageButtonFactory textImageButtonFactory, string startingValue, string largestPossibleValue)
|
|
: base(Agg.UI.FlowDirection.LeftToRight)
|
|
{
|
|
this.Margin = new BorderDouble(3, 0);
|
|
this.VAnchor |= VAnchor.ParentBottomTop;
|
|
|
|
clickableValueContainer = new ClickWidget();
|
|
clickableValueContainer.VAnchor = VAnchor.ParentBottomTop;
|
|
clickableValueContainer.Cursor = Cursors.Hand;
|
|
clickableValueContainer.BorderWidth = 1;
|
|
clickableValueContainer.BorderColor = new RGBA_Bytes(255, 255, 255, 140);
|
|
|
|
|
|
clickableValueContainer.MouseEnterBounds += (sender, e) =>
|
|
{
|
|
clickableValueContainer.BorderWidth = 2;
|
|
clickableValueContainer.BorderColor = new RGBA_Bytes(255, 255, 255, 255);
|
|
};
|
|
|
|
clickableValueContainer.MouseLeaveBounds += (sender, e) =>
|
|
{
|
|
clickableValueContainer.BorderWidth = 1;
|
|
clickableValueContainer.BorderColor = new RGBA_Bytes(255, 255, 255, 140);
|
|
};
|
|
|
|
valueDisplay = new TextWidget(largestPossibleValue, pointSize: 12);
|
|
valueDisplay.VAnchor = VAnchor.ParentCenter;
|
|
valueDisplay.HAnchor = HAnchor.ParentLeft;
|
|
valueDisplay.TextColor = ActiveTheme.Instance.PrimaryTextColor;
|
|
valueDisplay.Margin = new BorderDouble(6);
|
|
|
|
clickableValueContainer.Click += new ClickWidget.ButtonEventHandler(editField_Click);
|
|
|
|
clickableValueContainer.AddChild(valueDisplay);
|
|
clickableValueContainer.SetBoundsToEncloseChildren();
|
|
valueDisplay.Text = startingValue;
|
|
|
|
numberInputField = new MHNumberEdit(0, pixelWidth: 40, allowDecimals: true);
|
|
numberInputField.VAnchor = VAnchor.ParentCenter;
|
|
numberInputField.Margin = new BorderDouble(left: 6);
|
|
numberInputField.Visible = false;
|
|
|
|
// This is a hack to make sure the control is tall enough.
|
|
// TODO: This hack needs a unit test and then pass and then remove this line.
|
|
this.MinimumSize = new VectorMath.Vector2(0, numberInputField.Height);
|
|
|
|
setButton = textImageButtonFactory.Generate("SET");
|
|
setButton.VAnchor = VAnchor.ParentCenter;
|
|
setButton.Margin = new BorderDouble(left: 6);
|
|
setButton.Visible = false;
|
|
|
|
numberInputField.ActuallNumberEdit.EnterPressed += new KeyEventHandler(ActuallNumberEdit_EnterPressed);
|
|
|
|
numberInputField.KeyDown += (sender, e) =>
|
|
{
|
|
if (e.KeyCode == Keys.Escape)
|
|
{
|
|
clickableValueContainer.Visible = true;
|
|
numberInputField.Visible = false;
|
|
setButton.Visible = false;
|
|
}
|
|
};
|
|
|
|
setButton.Click += new ButtonBase.ButtonEventHandler(setButton_Click);
|
|
|
|
this.AddChild(clickableValueContainer);
|
|
this.AddChild(numberInputField);
|
|
this.AddChild(setButton);
|
|
}
|
|
|
|
void editField_Click(object sender, MouseEventArgs mouseEvent)
|
|
{
|
|
clickableValueContainer.Visible = false;
|
|
numberInputField.Visible = true;
|
|
|
|
// This is trying to get all the numbers to the left of the decimal. We could do a better
|
|
// job of finding the number. 6546431321654
|
|
string displayString = valueDisplay.Text.Split('.')[0];
|
|
if (displayString != null && displayString != "")
|
|
{
|
|
double displayStringAsValue;
|
|
double.TryParse(displayString, out displayStringAsValue);
|
|
numberInputField.ActuallNumberEdit.Value = displayStringAsValue;
|
|
}
|
|
|
|
numberInputField.ActuallNumberEdit.InternalNumberEdit.Focus();
|
|
numberInputField.ActuallNumberEdit.InternalNumberEdit.SelectAll();
|
|
setButton.Visible = true;
|
|
OnEditEnabled();
|
|
}
|
|
|
|
public void OnEditEnabled()
|
|
{
|
|
if (EditEnabled != null)
|
|
{
|
|
EditEnabled(this, null);
|
|
}
|
|
}
|
|
|
|
public void OnEditComplete()
|
|
{
|
|
if (EditComplete != null)
|
|
{
|
|
EditComplete(this, null);
|
|
}
|
|
}
|
|
|
|
void setButton_Click(object sender, MouseEventArgs mouseEvent)
|
|
{
|
|
OnEditComplete();
|
|
}
|
|
|
|
void ActuallNumberEdit_EnterPressed(object sender, KeyEventArgs keyEvent)
|
|
{
|
|
OnEditComplete();
|
|
}
|
|
|
|
public void SetDisplayString(string displayString)
|
|
{
|
|
valueDisplay.Text = displayString;
|
|
clickableValueContainer.Visible = true;
|
|
numberInputField.Visible = false;
|
|
setButton.Visible = false;
|
|
}
|
|
|
|
public double GetValue()
|
|
{
|
|
double targetTemp = Convert.ToDouble(numberInputField.Text);
|
|
return targetTemp;
|
|
}
|
|
}
|
|
}
|