diff options
author | Vsevolod Kukol <sevo@xamarin.com> | 2016-02-08 17:57:50 +0300 |
---|---|---|
committer | Vsevolod Kukol <sevo@xamarin.com> | 2016-02-08 17:57:50 +0300 |
commit | 82b2666fb604fee11309960225c6de1d41a9307e (patch) | |
tree | a3d32fa6d8a13790cd65b1cd4b3cb11801025e14 | |
parent | b12e79c085fc317695688aed2bbded7a45a837fe (diff) | |
parent | 9cee0e6dd9d445a95beb0b6528de78fc633a4039 (diff) |
Merge remote-tracking branch 'origin/master' into image-loaderimage-loader
-rw-r--r-- | Xwt.Gtk/Xwt.GtkBackend/PopoverBackend.cs | 3 | ||||
-rw-r--r-- | Xwt.Gtk/Xwt.GtkBackend/TextLayoutBackendHandler.cs | 10 | ||||
-rw-r--r-- | Xwt.WPF/Xwt.WPFBackend/TextLayoutBackendHandler.cs | 9 | ||||
-rw-r--r-- | Xwt.WPF/Xwt.WPFBackend/WPFEngine.cs | 2 | ||||
-rw-r--r-- | Xwt.XamMac/Xwt.Mac/TextLayoutBackendHandler.cs | 6 | ||||
-rw-r--r-- | Xwt/Xwt.Backends/TextLayoutBackendHandler.cs | 1 | ||||
-rw-r--r-- | Xwt/Xwt.Drawing/Font.cs | 16 | ||||
-rw-r--r-- | Xwt/Xwt.Drawing/TextLayout.cs | 9 | ||||
-rw-r--r-- | Xwt/Xwt/Toolkit.cs | 28 |
9 files changed, 74 insertions, 10 deletions
diff --git a/Xwt.Gtk/Xwt.GtkBackend/PopoverBackend.cs b/Xwt.Gtk/Xwt.GtkBackend/PopoverBackend.cs index 959766ce..7f3a779f 100644 --- a/Xwt.Gtk/Xwt.GtkBackend/PopoverBackend.cs +++ b/Xwt.Gtk/Xwt.GtkBackend/PopoverBackend.cs @@ -304,6 +304,9 @@ namespace Xwt.GtkBackend public void Dispose () { + if (popover.TransientFor != null) + popover.TransientFor.FocusInEvent -= HandleParentFocusInEvent; + popover.Destroy (); popover.Dispose (); } diff --git a/Xwt.Gtk/Xwt.GtkBackend/TextLayoutBackendHandler.cs b/Xwt.Gtk/Xwt.GtkBackend/TextLayoutBackendHandler.cs index a5d6f609..5b63e2bb 100644 --- a/Xwt.Gtk/Xwt.GtkBackend/TextLayoutBackendHandler.cs +++ b/Xwt.Gtk/Xwt.GtkBackend/TextLayoutBackendHandler.cs @@ -214,6 +214,16 @@ namespace Xwt.GtkBackend return Pango.Units.ToPixels (iter.Baseline); } + public override double GetMeanline (object backend) + { + var tl = (PangoBackend)backend; + var baseline = 0; + using (var iter = tl.Layout.Iter) + baseline = iter.Baseline; + var font = tl.Layout.Context.LoadFont (tl.Layout.FontDescription); + return Pango.Units.ToPixels (baseline - font.GetMetrics (Pango.Language.Default).StrikethroughPosition); + } + public override void Dispose (object backend) { var tl = (IDisposable) backend; diff --git a/Xwt.WPF/Xwt.WPFBackend/TextLayoutBackendHandler.cs b/Xwt.WPF/Xwt.WPFBackend/TextLayoutBackendHandler.cs index bc36a718..d55d75b1 100644 --- a/Xwt.WPF/Xwt.WPFBackend/TextLayoutBackendHandler.cs +++ b/Xwt.WPF/Xwt.WPFBackend/TextLayoutBackendHandler.cs @@ -96,6 +96,15 @@ namespace Xwt.WPFBackend return t.FormattedText.Baseline; } + public override double GetMeanline (object backend) + { + var t = (TextLayoutBackend)backend; + var fd = (FontData)Toolkit.GetBackend(t.Font); + var tf = new Typeface (fd.Family, fd.Style, fd.Weight, fd.Stretch); + + return t.FormattedText.Baseline + tf.StrikethroughPosition * fd.Size; + } + public override void AddAttribute (object backend, TextAttribute attribute) { var t = (TextLayoutBackend)backend; diff --git a/Xwt.WPF/Xwt.WPFBackend/WPFEngine.cs b/Xwt.WPF/Xwt.WPFBackend/WPFEngine.cs index 7cf0b3ba..497cebe2 100644 --- a/Xwt.WPF/Xwt.WPFBackend/WPFEngine.cs +++ b/Xwt.WPF/Xwt.WPFBackend/WPFEngine.cs @@ -209,7 +209,7 @@ namespace Xwt.WPFBackend if (b is XwtWidgetBackend)
b = ((XwtWidgetBackend)b).NativeBackend;
IWpfWidgetBackend wb = (IWpfWidgetBackend)b;
- return wb.Widget.Parent != null;
+ return VisualTreeHelper.GetParent (wb.Widget) != null;
}
public override object GetNativeImage (Image image)
diff --git a/Xwt.XamMac/Xwt.Mac/TextLayoutBackendHandler.cs b/Xwt.XamMac/Xwt.Mac/TextLayoutBackendHandler.cs index a8aedb5d..1e202d14 100644 --- a/Xwt.XamMac/Xwt.Mac/TextLayoutBackendHandler.cs +++ b/Xwt.XamMac/Xwt.Mac/TextLayoutBackendHandler.cs @@ -146,6 +146,12 @@ namespace Xwt.Mac } } + public override double GetMeanline (object backend) + { + LayoutInfo li = (LayoutInfo)backend; + return GetBaseline (backend) - li.Font.XHeight / 2; + } + static CTFrame CreateFrame (LayoutInfo li) { if (string.IsNullOrEmpty (li.Text)) diff --git a/Xwt/Xwt.Backends/TextLayoutBackendHandler.cs b/Xwt/Xwt.Backends/TextLayoutBackendHandler.cs index 196995da..c9311a96 100644 --- a/Xwt/Xwt.Backends/TextLayoutBackendHandler.cs +++ b/Xwt/Xwt.Backends/TextLayoutBackendHandler.cs @@ -44,6 +44,7 @@ namespace Xwt.Backends public abstract int GetIndexFromCoordinates (object backend, double x, double y); public abstract Point GetCoordinateFromIndex (object backend, int index); public abstract double GetBaseline (object backend); + public abstract double GetMeanline (object backend); public abstract void AddAttribute (object backend, TextAttribute attribute); public abstract void ClearAttributes (object backend); diff --git a/Xwt/Xwt.Drawing/Font.cs b/Xwt/Xwt.Drawing/Font.cs index c267eeaa..1a674f93 100644 --- a/Xwt/Xwt.Drawing/Font.cs +++ b/Xwt/Xwt.Drawing/Font.cs @@ -302,7 +302,7 @@ namespace Xwt.Drawing public Font WithSize (double size) { - return new Font (handler.SetSize (Backend, size)); + return new Font (handler.SetSize (Backend, size), ToolkitEngine); } public Font WithScaledSize (double scale) @@ -343,6 +343,20 @@ namespace Xwt.Drawing return new Font (handler.SetStretch (Backend, stretch), ToolkitEngine); } + public Font WithSettings (Font fromFont) + { + return WithSettings (fromFont.Size, fromFont.Style, fromFont.Weight, fromFont.Stretch); + } + + public Font WithSettings (double size, FontStyle style, FontWeight weight, FontStretch stretch) + { + var newHandler = handler.SetSize (Backend, size); + newHandler = handler.SetStyle (Backend, style); + newHandler = handler.SetWeight (Backend, weight); + newHandler = handler.SetStretch (Backend, stretch); + return new Font (newHandler, ToolkitEngine); + } + public override string ToString () { StringBuilder sb = new StringBuilder (Family); diff --git a/Xwt/Xwt.Drawing/TextLayout.cs b/Xwt/Xwt.Drawing/TextLayout.cs index b2ead316..ecf09ae9 100644 --- a/Xwt/Xwt.Drawing/TextLayout.cs +++ b/Xwt/Xwt.Drawing/TextLayout.cs @@ -182,6 +182,15 @@ namespace Xwt.Drawing } } + /// <summary> + /// Get the distance in pixels between the top of the layout bounds and the first line's meanline (usually equivalent to the baseline minus half of the x-height) + /// </summary> + public double Meanline { + get { + return handler.GetMeanline (Backend); + } + } + public TextTrimming Trimming { get { return textTrimming; } set { textTrimming = value; handler.SetTrimming (Backend, value); } diff --git a/Xwt/Xwt/Toolkit.cs b/Xwt/Xwt/Toolkit.cs index 9e9d765c..8e38d5c2 100644 --- a/Xwt/Xwt/Toolkit.cs +++ b/Xwt/Xwt/Toolkit.cs @@ -514,14 +514,26 @@ namespace Xwt // to not corrupt the backend of the singletons if (font.ToolkitEngine != null) { var fbh = font.ToolkitEngine.FontBackendHandler; - if (font == fbh.SystemFont) - return FontBackendHandler.SystemFont; - if (font == fbh.SystemMonospaceFont) - return FontBackendHandler.SystemMonospaceFont; - if (font == fbh.SystemSansSerifFont) - return FontBackendHandler.SystemSansSerifFont; - if (font == fbh.SystemSerifFont) - return FontBackendHandler.SystemSerifFont; + if (font.Family == fbh.SystemFont.Family) { + if (font == fbh.SystemFont) + return FontBackendHandler.SystemFont; + return FontBackendHandler.SystemFont.WithSettings (font); + } + if (font.Family == fbh.SystemMonospaceFont.Family) { + if (font == fbh.SystemMonospaceFont) + return FontBackendHandler.SystemMonospaceFont; + return FontBackendHandler.SystemMonospaceFont.WithSettings (font); + } + if (font.Family == fbh.SystemSansSerifFont.Family) { + if (font == fbh.SystemSansSerifFont) + return FontBackendHandler.SystemSansSerifFont; + return FontBackendHandler.SystemSansSerifFont.WithSettings (font); + } + if (font.Family == fbh.SystemSerifFont.Family) { + if (font == fbh.SystemSerifFont) + return FontBackendHandler.SystemSerifFont; + return FontBackendHandler.SystemSerifFont.WithSettings (font); + } } font.InitForToolkit (this); |