aboutsummaryrefslogtreecommitdiffstatsci
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/GraphicObjects/Label.cs85
-rw-r--r--src/GraphicObjects/MessageBox.cs83
-rw-r--r--src/GraphicObjects/Window.cs46
3 files changed, 143 insertions, 71 deletions
diff --git a/src/GraphicObjects/Label.cs b/src/GraphicObjects/Label.cs
index 56508d23..1189b0e0 100644
--- a/src/GraphicObjects/Label.cs
+++ b/src/GraphicObjects/Label.cs
@@ -55,6 +55,7 @@ namespace Crow
public virtual void OnTextChanged(Object sender, TextChangeEventArgs e)
{
+ textMeasureIsUpToDate = false;
NotifyValueChanged ("Text", Text);
TextChanged.Raise (this, e);
}
@@ -437,48 +438,49 @@ namespace Crow
CurrentColumn = 0;
OnTextChanged (this, new TextChangeEventArgs (Text));
}
+ bool textMeasureIsUpToDate = false;
+ Size cachedTextSize = default(Size);
#region GraphicObject overrides
protected override int measureRawSize(LayoutingType lt)
- {
+ {
if (lines == null)
lines = getLines;
+ if (!textMeasureIsUpToDate) {
+ using (ImageSurface img = new ImageSurface (Format.Argb32, 10, 10)) {
+ using (Context gr = new Context (img)) {
+ //Cairo.FontFace cf = gr.GetContextFontFace ();
- using (ImageSurface img = new ImageSurface (Format.Argb32, 10, 10)) {
- using (Context gr = new Context (img)) {
- //Cairo.FontFace cf = gr.GetContextFontFace ();
-
- gr.SelectFontFace (Font.Name, Font.Slant, Font.Wheight);
- gr.SetFontSize (Font.Size);
+ gr.SelectFontFace (Font.Name, Font.Slant, Font.Wheight);
+ gr.SetFontSize (Font.Size);
+ gr.FontOptions = Interface.FontRenderingOptions;
+ gr.Antialias = Interface.Antialias;
+ fe = gr.FontExtents;
+ te = new TextExtents ();
- fe = gr.FontExtents;
- te = new TextExtents();
+ cachedTextSize.Height = (int)Math.Ceiling ((fe.Ascent+fe.Descent) * Math.Max (1, lines.Count)) + Margin * 2;
- if (lt == LayoutingType.Height){
- int lc = lines.Count;
- //ensure minimal height = text line height
- if (lc == 0)
- lc = 1;
-
- return (int)Math.Ceiling(fe.Height * lc) + Margin * 2;
- }
- try {
- foreach (string s in lines) {
- string l = s.Replace("\t", new String (' ', Interface.TabSize));
+ try {
+ foreach (string s in lines) {
+ string l = s.Replace ("\t", new String (' ', Interface.TabSize));
- TextExtents tmp = gr.TextExtents (l);
+ TextExtents tmp = gr.TextExtents (l);
- if (tmp.XAdvance > te.XAdvance)
- te = tmp;
- }
- } catch (Exception ex) {
- return -1;
+ if (tmp.XAdvance > te.XAdvance)
+ te = tmp;
+ }
+ cachedTextSize.Width = (int)Math.Ceiling (te.XAdvance) + Margin * 2;
+ textMeasureIsUpToDate = true;
+ } catch {
+ return -1;
+ }
}
- return (int)Math.Ceiling (te.XAdvance) + Margin * 2;
}
+
}
- }
+ return lt == LayoutingType.Height ? cachedTextSize.Height : cachedTextSize.Width;
+ }
protected override void onDraw (Context gr)
{
base.onDraw (gr);
@@ -552,11 +554,12 @@ namespace Crow
break;
case Alignment.Center://ok
rText.X = cb.X + cb.Width / 2 - rText.Width / 2;
- rText.Y = cb.Y + cb.Height / 2 - rText.Height / 2;
+ //rText.Y = cb.Y + cb.Height / 2 - rText.Height / 2;
+ rText.Y = cb.Y + (int)Math.Floor((double)cb.Height / 2.0 - (double)rText.Height / 2.0);
break;
}
- gr.FontMatrix = new Matrix(widthRatio * (float)Font.Size, 0, 0, heightRatio * (float)Font.Size, 0, 0);
+ //gr.FontMatrix = new Matrix(widthRatio * (float)Font.Size, 0, 0, heightRatio * (float)Font.Size, 0, 0);
fe = gr.FontExtents;
#region draw text cursor
@@ -586,8 +589,8 @@ namespace Crow
Foreground.SetAsSource (gr);
gr.LineWidth = 1.0;
- gr.MoveTo (0.5 + textCursorPos + rText.X, rText.Y + CurrentLine * fe.Height);
- gr.LineTo (0.5 + textCursorPos + rText.X, rText.Y + (CurrentLine + 1) * fe.Height);
+ gr.MoveTo (0.5 + textCursorPos + rText.X, rText.Y + CurrentLine * (fe.Ascent+fe.Descent));
+ gr.LineTo (0.5 + textCursorPos + rText.X, rText.Y + (CurrentLine + 1) * (fe.Ascent+fe.Descent));
gr.Stroke();
}
#endregion
@@ -597,9 +600,9 @@ namespace Crow
// new SolidColor(Color.DarkGreen).SetAsSource(gr);
// Rectangle R = new Rectangle (
// rText.X + (int)SelEndCursorPos - 3,
-// rText.Y + (int)(SelRelease.Y * fe.Height),
+// rText.Y + (int)(SelRelease.Y * (fe.Ascent+fe.Descent)),
// 6,
-// (int)fe.Height);
+// (int)(fe.Ascent+fe.Descent));
// gr.Rectangle (R);
// gr.Fill ();
// }
@@ -607,9 +610,9 @@ namespace Crow
// new SolidColor(Color.DarkRed).SetAsSource(gr);
// Rectangle R = new Rectangle (
// rText.X + (int)SelStartCursorPos - 3,
-// rText.Y + (int)(SelBegin.Y * fe.Height),
+// rText.Y + (int)(SelBegin.Y * (fe.Ascent+fe.Descent)),
// 6,
-// (int)fe.Height);
+// (int)(fe.Ascent+fe.Descent));
// gr.Rectangle (R);
// gr.Fill ();
// }
@@ -620,9 +623,9 @@ namespace Crow
int lineLength = (int)gr.TextExtents (l).XAdvance;
Rectangle lineRect = new Rectangle (
rText.X,
- rText.Y + (int)Math.Ceiling(i * fe.Height),
+ rText.Y + (int)Math.Floor((double)i * (fe.Ascent+fe.Descent)),
lineLength,
- (int)Math.Ceiling(fe.Height));
+ (int)Math.Ceiling((fe.Ascent+fe.Descent)));
// if (TextAlignment == Alignment.Center ||
// TextAlignment == Alignment.Top ||
@@ -636,7 +639,7 @@ namespace Crow
continue;
Foreground.SetAsSource (gr);
- gr.MoveTo (lineRect.X, rText.Y + fe.Ascent + fe.Height * i);
+ gr.MoveTo (lineRect.X,(double)rText.Y + fe.Ascent + (fe.Ascent+fe.Descent) * i) ;
gr.ShowText (l);
gr.Fill ();
@@ -666,7 +669,7 @@ namespace Crow
gr.Save ();
gr.Clip ();
gr.SetSourceColor (SelectionForeground);
- gr.MoveTo (lineRect.X, rText.Y + fe.Ascent + fe.Height * i);
+ gr.MoveTo (lineRect.X, (double)rText.Y + fe.Ascent + (fe.Ascent+fe.Descent) * i);
gr.ShowText (l);
gr.Fill ();
gr.Restore ();
@@ -774,7 +777,7 @@ namespace Crow
double cPos = 0f;
- CurrentLine = (int)(mouseLocalPos.Y / fe.Height);
+ CurrentLine = (int)(mouseLocalPos.Y / (fe.Ascent+fe.Descent));
//fix cu
if (CurrentLine >= lines.Count)
diff --git a/src/GraphicObjects/MessageBox.cs b/src/GraphicObjects/MessageBox.cs
index e59e0e63..45ef1e00 100644
--- a/src/GraphicObjects/MessageBox.cs
+++ b/src/GraphicObjects/MessageBox.cs
@@ -38,10 +38,13 @@ namespace Crow
#endregion
public enum Type {
+ None,
Information,
- YesNo,
Alert,
- Error
+ Error,
+ YesNo,
+ YesNoCancel,
+
}
protected override void loadTemplate (GraphicObject template)
@@ -49,13 +52,14 @@ namespace Crow
base.loadTemplate (template);
NotifyValueChanged ("MsgIcon", "#Crow.Images.Icons.Informations.svg");
}
- string message, okMessage, cancelMessage;
- Type msgType = Type.Information;
+ string message, okMessage, cancelMessage, noMessage;
+ Type msgType = Type.None;
- public event EventHandler Ok;
+ public event EventHandler Yes;
+ public event EventHandler No;
public event EventHandler Cancel;
- [XmlAttributeAttribute][DefaultValue("Informations")]
+ [DefaultValue("Informations")]
public virtual string Message
{
get { return message; }
@@ -66,7 +70,7 @@ namespace Crow
NotifyValueChanged ("Message", message);
}
}
- [XmlAttributeAttribute][DefaultValue("Ok")]
+ [DefaultValue("Ok")]
public virtual string OkMessage
{
get { return okMessage; }
@@ -77,7 +81,7 @@ namespace Crow
NotifyValueChanged ("OkMessage", okMessage);
}
}
- [XmlAttributeAttribute][DefaultValue("Cancel")]
+ [DefaultValue("Cancel")]
public virtual string CancelMessage
{
get { return cancelMessage; }
@@ -88,7 +92,18 @@ namespace Crow
NotifyValueChanged ("CancelMessage", cancelMessage);
}
}
- [XmlAttributeAttribute][DefaultValue("Information")]
+ [DefaultValue("No")]
+ public virtual string NoMessage
+ {
+ get { return cancelMessage; }
+ set {
+ if (cancelMessage == value)
+ return;
+ cancelMessage = value;
+ NotifyValueChanged ("NoMessage", cancelMessage);
+ }
+ }
+ [DefaultValue("Information")]
public virtual Type MsgType
{
get { return msgType; }
@@ -99,34 +114,58 @@ namespace Crow
NotifyValueChanged ("MsgType", msgType);
switch (msgType) {
case Type.Information:
- NotifyValueChanged ("MsgIcon", "#Crow.Images.Icons.Informations.svg");
+ MsgIcon = "#Crow.Images.Icons.Informations.svg";
Caption = "Informations";
OkMessage = "Ok";
- CancelMessage = "Cancel";
+ NotifyValueChanged ("CancelButIsVisible", false);
+ NotifyValueChanged ("NoButIsVisible", false);
break;
case Type.YesNo:
- NotifyValueChanged ("MsgIcon", "#Crow.Icons.question.svg");
+ case Type.YesNoCancel:
+ MsgIcon = "#Crow.Icons.question.svg";
Caption = "Choice";
OkMessage = "Yes";
- CancelMessage = "No";
+ NoMessage = "No";
+ NotifyValueChanged ("CancelButIsVisible", msgType == Type.YesNoCancel);
+ NotifyValueChanged ("NoButIsVisible", true);
break;
case Type.Alert:
- NotifyValueChanged ("MsgIcon", "#Crow.Images.Icons.IconAlerte.svg");
+ MsgIcon = "#Crow.Images.Icons.IconAlerte.svg";
Caption = "Alert";
OkMessage = "Ok";
CancelMessage = "Cancel";
+ NotifyValueChanged ("CancelButIsVisible", true);
+ NotifyValueChanged ("NoButIsVisible", false);
break;
case Type.Error:
- NotifyValueChanged ("MsgIcon", "#Crow.Images.Icons.exit.svg");
+ MsgIcon = "#Crow.Images.Icons.exit.svg";
Caption = "Error";
OkMessage = "Ok";
+ NotifyValueChanged ("CancelButIsVisible", false);
+ NotifyValueChanged ("NoButIsVisible", false);
break;
}
}
}
+
+ string msgIcon = null;
+ public string MsgIcon {
+ get { return msgIcon; }
+ set {
+ if (value == MsgIcon)
+ return;
+ msgIcon = value;
+ NotifyValueChanged ("MsgIcon", MsgIcon);
+ }
+ }
void onOkButtonClick (object sender, EventArgs e)
{
- Ok.Raise (this, null);
+ Yes.Raise (this, null);
+ close ();
+ }
+ void onNoButtonClick (object sender, EventArgs e)
+ {
+ No.Raise (this, null);
close ();
}
void onCancelButtonClick (object sender, EventArgs e)
@@ -147,6 +186,18 @@ namespace Crow
return mb;
}
}
+ public static MessageBox ShowModal (Interface iface, Type msgBoxType, string message){
+ lock (iface.UpdateMutex) {
+ MessageBox mb = new MessageBox (iface) {
+ Modal = true,
+ MsgType = msgBoxType,
+ Message = message
+ };
+
+ iface.AddWidget (mb);
+ return mb;
+ }
+ }
}
}
diff --git a/src/GraphicObjects/Window.cs b/src/GraphicObjects/Window.cs
index cff96a75..4eef9696 100644
--- a/src/GraphicObjects/Window.cs
+++ b/src/GraphicObjects/Window.cs
@@ -47,8 +47,9 @@ namespace Crow
}
string _icon;
- bool _resizable;
- bool _movable;
+ bool resizable;
+ bool movable;
+ bool modal;
protected bool hoverBorder = false;
bool alwaysOnTop = false;
Fill titleBarBackground = Color.UnitedNationsBlue;
@@ -124,25 +125,37 @@ namespace Crow
[XmlAttributeAttribute][DefaultValue(true)]
public bool Resizable {
get {
- return _resizable;
+ return resizable;
}
set {
- if (_resizable == value)
+ if (resizable == value)
return;
- _resizable = value;
- NotifyValueChanged ("Resizable", _resizable);
+ resizable = value;
+ NotifyValueChanged ("Resizable", resizable);
}
}
[XmlAttributeAttribute][DefaultValue(true)]
public bool Movable {
get {
- return _movable;
+ return movable;
}
set {
- if (_movable == value)
+ if (movable == value)
return;
- _movable = value;
- NotifyValueChanged ("Movable", _movable);
+ movable = value;
+ NotifyValueChanged ("Movable", movable);
+ }
+ }
+ [XmlAttributeAttribute][DefaultValue(false)]
+ public bool Modal {
+ get {
+ return modal;
+ }
+ set {
+ if (modal == value)
+ return;
+ modal = value;
+ NotifyValueChanged ("Modal", modal);
}
}
[XmlAttributeAttribute][DefaultValue(false)]
@@ -167,17 +180,18 @@ namespace Crow
[XmlAttributeAttribute][DefaultValue(false)]
public bool AlwaysOnTop {
get {
- return alwaysOnTop;
+ return modal ? true : alwaysOnTop;
}
set {
if (alwaysOnTop == value)
return;
+
alwaysOnTop = value;
- if (alwaysOnTop && Parent != null)
+ if (AlwaysOnTop && Parent != null)
IFace.PutOnTop (this);
- NotifyValueChanged ("AlwaysOnTop", alwaysOnTop);
+ NotifyValueChanged ("AlwaysOnTop", AlwaysOnTop);
}
}
// [XmlAttributeAttribute()][DefaultValue(WindowState.Normal)]
@@ -286,7 +300,7 @@ namespace Crow
return;
}
- if (this.HasFocus && _movable) {
+ if (this.HasFocus && movable) {
if (e.Mouse.IsButtonDown (MouseButton.Left)) {
MoveAndResize (e.XDelta, e.YDelta, currentDirection);
return;
@@ -353,6 +367,10 @@ namespace Crow
{
base.onMouseDown (sender, e);
}
+ public override bool MouseIsIn (Point m)
+ {
+ return modal ? true : base.MouseIsIn (m);
+ }
#endregion
protected void onMaximized (object sender, EventArgs e){