Browse Source

Make TextBox work (a bit).

pull/10/head
Steven Kirk 12 years ago
parent
commit
127c27fd6b
  1. 11
      Cairo/Perspex.Cairo/Media/TextService.cs
  2. 3
      Gtk/Perspex.Gtk/GtkPlatform.cs
  3. 22
      Gtk/Perspex.Gtk/Input/GtkKeyboardDevice.cs
  4. 2
      Gtk/Perspex.Gtk/WindowImpl.cs
  5. 252
      Perspex.Controls/TextBoxView.cs
  6. 42
      Perspex.SceneGraph/Platform/ITextService.cs

11
Cairo/Perspex.Cairo/Media/TextService.cs

@ -49,15 +49,20 @@ namespace Perspex.Cairo.Media
var layout = this.CreateLayout(text); var layout = this.CreateLayout(text);
int result; int result;
int trailing; int trailing;
layout.XyToIndex((int)point.X, (int)point.Y, out result, out trailing); return layout.XyToIndex(
return result; Pango.Units.FromDouble(point.X),
Pango.Units.FromDouble(point.Y),
out result,
out trailing) ? result : text.Text.Length;
} }
public Point GetCaretPosition(FormattedText text, int caretIndex, Size constraint) public Point GetCaretPosition(FormattedText text, int caretIndex, Size constraint)
{ {
// TODO: Rather than have this and GetLineHeights, might be best to just return
// the rect if that's also possible in Direct2D backend.
var layout = this.CreateLayout(text); var layout = this.CreateLayout(text);
var rect = layout.IndexToPos(caretIndex); var rect = layout.IndexToPos(caretIndex);
return new Point(rect.X, rect.Y); return new Point(Pango.Units.ToDouble(rect.X), Pango.Units.ToDouble(rect.Y));
} }
public double[] GetLineHeights(FormattedText text, Size constraint) public double[] GetLineHeights(FormattedText text, Size constraint)

3
Gtk/Perspex.Gtk/GtkPlatform.cs

@ -8,6 +8,7 @@ namespace Perspex.Gtk
{ {
using System; using System;
using System.Reactive.Disposables; using System.Reactive.Disposables;
using Perspex.Input;
using Perspex.Platform; using Perspex.Platform;
using Splat; using Splat;
using Gtk = global::Gtk; using Gtk = global::Gtk;
@ -25,7 +26,7 @@ namespace Perspex.Gtk
{ {
var locator = Locator.CurrentMutable; var locator = Locator.CurrentMutable;
locator.Register(() => new WindowImpl(), typeof(IWindowImpl)); locator.Register(() => new WindowImpl(), typeof(IWindowImpl));
//locator.Register(() => WindowsKeyboardDevice.Instance, typeof(IKeyboardDevice)); locator.Register(() => GtkKeyboardDevice.Instance, typeof(IKeyboardDevice));
locator.Register(() => instance, typeof(IPlatformThreadingInterface)); locator.Register(() => instance, typeof(IPlatformThreadingInterface));
} }

22
Gtk/Perspex.Gtk/Input/GtkKeyboardDevice.cs

@ -3,8 +3,10 @@
// Copyright 2014 MIT Licence. See licence.md for more information. // Copyright 2014 MIT Licence. See licence.md for more information.
// </copyright> // </copyright>
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
namespace Perspex.Gtk namespace Perspex.Gtk
{ {
using System;
using Perspex.Input; using Perspex.Input;
public class GtkKeyboardDevice : KeyboardDevice public class GtkKeyboardDevice : KeyboardDevice
@ -32,7 +34,25 @@ namespace Perspex.Gtk
public static Perspex.Input.Key ConvertKey(Gdk.Key key) public static Perspex.Input.Key ConvertKey(Gdk.Key key)
{ {
return Key.X; // TODO: Don't use reflection for this! My eyes!!!
if (key == Gdk.Key.BackSpace)
{
return Perspex.Input.Key.Back;
}
else
{
var s = Enum.GetName(typeof(Gdk.Key), key);
Perspex.Input.Key result;
if (Enum.TryParse(s, true, out result))
{
return result;
}
else
{
return Perspex.Input.Key.None;
}
}
} }
} }
} }

2
Gtk/Perspex.Gtk/WindowImpl.cs

@ -111,7 +111,7 @@ namespace Perspex.Gtk
GtkKeyboardDevice.Instance, GtkKeyboardDevice.Instance,
RawKeyEventType.KeyDown, RawKeyEventType.KeyDown,
GtkKeyboardDevice.ConvertKey(evnt.Key), GtkKeyboardDevice.ConvertKey(evnt.Key),
"X"); new string((char)Gdk.Keyval.ToUnicode((uint)evnt.Key), 1));
this.Input(e); this.Input(e);
return true; return true;
} }

252
Perspex.Controls/TextBoxView.cs

@ -1,126 +1,126 @@
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// <copyright file="TextBoxView.cs" company="Steven Kirk"> // <copyright file="TextBoxView.cs" company="Steven Kirk">
// Copyright 2013 MIT Licence. See licence.md for more information. // Copyright 2013 MIT Licence. See licence.md for more information.
// </copyright> // </copyright>
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
namespace Perspex.Controls namespace Perspex.Controls
{ {
using System; using System;
using Perspex.Media; using Perspex.Media;
using Perspex.Platform; using Perspex.Platform;
using Perspex.Threading; using Perspex.Threading;
using Splat; using Splat;
internal class TextBoxView : Control internal class TextBoxView : Control
{ {
private TextBox parent; private TextBox parent;
private FormattedText formattedText; private FormattedText formattedText;
private DispatcherTimer caretTimer; private DispatcherTimer caretTimer;
private bool caretBlink; private bool caretBlink;
public TextBoxView(TextBox parent) public TextBoxView(TextBox parent)
{ {
this.caretTimer = new DispatcherTimer(); this.caretTimer = new DispatcherTimer();
this.caretTimer.Interval = TimeSpan.FromMilliseconds(500); this.caretTimer.Interval = TimeSpan.FromMilliseconds(500);
this.caretTimer.Tick += this.CaretTimerTick; this.caretTimer.Tick += this.CaretTimerTick;
this.parent = parent; this.parent = parent;
} }
public FormattedText FormattedText public FormattedText FormattedText
{ {
get get
{ {
if (this.formattedText == null) if (this.formattedText == null)
{ {
this.formattedText = this.CreateFormattedText(); this.formattedText = this.CreateFormattedText();
} }
return this.formattedText; return this.formattedText;
} }
} }
public new void GotFocus() public new void GotFocus()
{ {
this.caretBlink = true; this.caretBlink = true;
this.caretTimer.Start(); this.caretTimer.Start();
} }
public new void LostFocus() public new void LostFocus()
{ {
this.caretTimer.Stop(); this.caretTimer.Stop();
this.InvalidateVisual(); this.InvalidateVisual();
} }
public void InvalidateText() public void InvalidateText()
{ {
this.formattedText = null; this.formattedText = null;
this.InvalidateMeasure(); this.InvalidateMeasure();
} }
internal void CaretMoved() internal void CaretMoved()
{ {
this.caretBlink = true; this.caretBlink = true;
this.caretTimer.Stop(); this.caretTimer.Stop();
this.caretTimer.Start(); this.caretTimer.Start();
this.InvalidateVisual(); this.InvalidateVisual();
} }
public override void Render(IDrawingContext context) public override void Render(IDrawingContext context)
{ {
Rect rect = new Rect(this.ActualSize); Rect rect = new Rect(this.ActualSize);
context.DrawText(Brushes.Black, rect, this.FormattedText); context.DrawText(Brushes.Black, rect, this.FormattedText);
if (this.parent.IsFocused) if (this.parent.IsFocused)
{ {
ITextService textService = Locator.Current.GetService<ITextService>(); ITextService textService = Locator.Current.GetService<ITextService>();
Point caretPos = textService.GetCaretPosition( Point caretPos = textService.GetCaretPosition(
this.formattedText, this.formattedText,
this.parent.CaretIndex, this.parent.CaretIndex,
this.ActualSize); this.ActualSize);
double[] lineHeights = textService.GetLineHeights(this.formattedText, this.ActualSize); double[] lineHeights = textService.GetLineHeights(this.formattedText, this.ActualSize);
Brush caretBrush = Brushes.Black; Brush caretBrush = Brushes.Black;
if (this.caretBlink) if (this.caretBlink)
{ {
context.DrawLine( context.DrawLine(
new Pen(caretBrush, 1), new Pen(caretBrush, 1),
caretPos, caretPos,
new Point(caretPos.X, caretPos.Y + lineHeights[0])); new Point(caretPos.X, caretPos.Y + lineHeights[0]));
} }
} }
} }
protected override Size MeasureOverride(Size constraint) protected override Size MeasureOverride(Size constraint)
{ {
if (!string.IsNullOrEmpty(this.parent.Text)) if (!string.IsNullOrEmpty(this.parent.Text))
{ {
ITextService textService = Locator.Current.GetService<ITextService>(); ITextService textService = Locator.Current.GetService<ITextService>();
return textService.Measure(this.FormattedText, constraint); return textService.Measure(this.FormattedText, constraint);
} }
return new Size(); return new Size();
} }
private FormattedText CreateFormattedText() private FormattedText CreateFormattedText()
{ {
return new FormattedText return new FormattedText
{ {
FontFamilyName = "Segoe UI", FontFamilyName = "Segoe UI",
FontSize = this.GetValue(TextBlock.FontSizeProperty), FontSize = this.GetValue(TextBlock.FontSizeProperty),
FontStyle = this.GetValue(TextBlock.FontStyleProperty), FontStyle = this.GetValue(TextBlock.FontStyleProperty),
Text = this.parent.Text, Text = this.parent.Text,
}; };
} }
private void CaretTimerTick(object sender, EventArgs e) private void CaretTimerTick(object sender, EventArgs e)
{ {
this.caretBlink = !this.caretBlink; this.caretBlink = !this.caretBlink;
this.InvalidateVisual(); this.InvalidateVisual();
} }
} }
} }

42
Perspex.SceneGraph/Platform/ITextService.cs

@ -1,21 +1,21 @@
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// <copyright file="ITextService.cs" company="Steven Kirk"> // <copyright file="ITextService.cs" company="Steven Kirk">
// Copyright 2014 MIT Licence. See licence.md for more information. // Copyright 2014 MIT Licence. See licence.md for more information.
// </copyright> // </copyright>
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
namespace Perspex.Platform namespace Perspex.Platform
{ {
using Perspex.Media; using Perspex.Media;
public interface ITextService public interface ITextService
{ {
int GetCaretIndex(FormattedText text, Point point, Size constraint); int GetCaretIndex(FormattedText text, Point point, Size constraint);
Point GetCaretPosition(FormattedText text, int caretIndex, Size constraint); Point GetCaretPosition(FormattedText text, int caretIndex, Size constraint);
double[] GetLineHeights(FormattedText text, Size constraint); double[] GetLineHeights(FormattedText text, Size constraint);
Size Measure(FormattedText text, Size constraint); Size Measure(FormattedText text, Size constraint);
} }
} }

Loading…
Cancel
Save