diff options
author | Vsevolod Kukol <sevoku@xamarin.com> | 2015-12-18 12:50:08 +0300 |
---|---|---|
committer | Vsevolod Kukol <sevoku@xamarin.com> | 2015-12-18 12:50:08 +0300 |
commit | ef8d04c02a27e3764b62100d096508dd8161f9b7 (patch) | |
tree | c6ea5094d809d6f109f0b1934b45d3ebf4854db8 /main | |
parent | 6bc0ba573753df90d0c0397244a8d96df0ee92ae (diff) |
[Ide] Clickable popover pager arrows
(fixes bug #7508)
Diffstat (limited to 'main')
5 files changed, 138 insertions, 32 deletions
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/PopoverWindow.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/PopoverWindow.cs index 5070c95ea6..87b61d689f 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/PopoverWindow.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/PopoverWindow.cs @@ -62,6 +62,7 @@ namespace MonoDevelop.Components AppPaintable = true; TypeHint = WindowTypeHint.Tooltip; CheckScreenColormap (); + AddEvents ((int)EventMask.ButtonReleaseMask); alignment = new Alignment (0, 0, 1f, 1f); alignment.Show (); @@ -198,6 +199,8 @@ namespace MonoDevelop.Components set; } + protected PopupPosition CurrentPosition { get { return position; }} + public virtual void RepositionWindow (Gdk.Rectangle? newCaret = null) { if (parent == null) @@ -460,6 +463,35 @@ namespace MonoDevelop.Components return rect; } } + + public event EventHandler PagerLeftClicked; + public event EventHandler PagerRightClicked; + + protected virtual void OnPagerLeftClicked () + { + if (PagerLeftClicked != null) + PagerLeftClicked (this, null); + } + + protected virtual void OnPagerRightClicked () + { + if (PagerRightClicked != null) + PagerRightClicked (this, null); + } + + protected override bool OnButtonReleaseEvent (EventButton evnt) + { + if (evnt.Button != 1 || !Theme.DrawPager) + return base.OnButtonPressEvent (evnt); + + var retval = false; + if (retval = Theme.HitTestPagerLeftArrow (PangoContext, BorderAllocation, new Point ((int)evnt.X, (int)evnt.Y))) + OnPagerLeftClicked (); + else if (retval = Theme.HitTestPagerRightArrow (PangoContext, BorderAllocation, new Point ((int)evnt.X, (int)evnt.Y))) + OnPagerRightClicked (); + + return retval; + } } } diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/PopoverWindowTheme.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/PopoverWindowTheme.cs index 5000908d81..c08e8f4734 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/PopoverWindowTheme.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Components/PopoverWindowTheme.cs @@ -64,6 +64,7 @@ namespace MonoDevelop.Components bool pagerVertical; bool showArrow; PopupPosition targetPosition; + static readonly int pagerArrowPadding = 4; public event EventHandler RedrawNeeded; @@ -365,33 +366,60 @@ namespace MonoDevelop.Components CairoExtensions.RoundedRectangle (context, region.X, region.Y, region.Width, region.Height, CornerRadius); context.Clip (); - Pango.Layout layout = SetupPagerText (context, pangoContext); - int textWidth, textHeight; - layout.GetPixelSize (out textWidth, out textHeight); - - int width = textWidth + Styles.PopoverWindow.PagerTriangleSize * 2 + 20; - int height = Styles.PopoverWindow.PagerHeight; + Pango.Layout layout = SetupPagerText (pangoContext); + var boundingBox = GetPagerBounds (layout, region); - Gdk.Rectangle boundingBox = new Gdk.Rectangle (region.X + region.Width - width, 0, width, height); RenderPagerBackground (context, boundingBox); - int arrowPadding = 4; - Gdk.Rectangle arrowRect = new Gdk.Rectangle (boundingBox.X + arrowPadding, + Gdk.Rectangle arrowRect = new Gdk.Rectangle (boundingBox.X + pagerArrowPadding, boundingBox.Y + (boundingBox.Height - Styles.PopoverWindow.PagerTriangleSize) / 2, Styles.PopoverWindow.PagerTriangleSize, Styles.PopoverWindow.PagerTriangleSize); RenderPagerArrow (context, arrowRect, PagerVertical ? ArrowType.Up : ArrowType.Left); - arrowRect.X = boundingBox.X + boundingBox.Width - (arrowPadding + Styles.PopoverWindow.PagerTriangleSize); + arrowRect.X = boundingBox.X + boundingBox.Width - (pagerArrowPadding + Styles.PopoverWindow.PagerTriangleSize); RenderPagerArrow (context, arrowRect, PagerVertical ? ArrowType.Down : ArrowType.Right); RenderPagerText (context, layout, boundingBox); } + Gdk.Rectangle GetPagerBounds (Pango.Layout layout, Gdk.Rectangle region) + { + int textWidth, textHeight; + layout.GetPixelSize (out textWidth, out textHeight); + + int width = textWidth + Styles.PopoverWindow.PagerTriangleSize * 2 + 20; + int height = Styles.PopoverWindow.PagerHeight; + + return new Gdk.Rectangle (region.X + region.Width - width, 0, width, height); + } + + public bool HitTestPagerLeftArrow (Pango.Context pangoContext, Gdk.Rectangle region, Gdk.Point hitPoint) + { + Pango.Layout layout = SetupPagerText (pangoContext); + var boundingBox = GetPagerBounds (layout, region); + Gdk.Rectangle arrowActiveRect = new Gdk.Rectangle (boundingBox.X, + boundingBox.Y, + Styles.PopoverWindow.PagerTriangleSize + (pagerArrowPadding * 2), + boundingBox.Height); + return arrowActiveRect.Contains (hitPoint); + } + + public bool HitTestPagerRightArrow (Pango.Context pangoContext, Gdk.Rectangle region, Gdk.Point hitPoint) + { + Pango.Layout layout = SetupPagerText (pangoContext); + var boundingBox = GetPagerBounds (layout, region); + Gdk.Rectangle arrowActiveRect = new Gdk.Rectangle (boundingBox.X + boundingBox.Width - (pagerArrowPadding * 2 + Styles.PopoverWindow.PagerTriangleSize), + boundingBox.Y, + Styles.PopoverWindow.PagerTriangleSize + (pagerArrowPadding * 2), + boundingBox.Height); + return arrowActiveRect.Contains (hitPoint); + } + /// <summary> /// Sets the Pango.Layout for pager text as it will be rendered. This will be used to perform sizing on the rest of the pager. /// </summary> - protected virtual Pango.Layout SetupPagerText (Cairo.Context context, Pango.Context pangoContext) + protected virtual Pango.Layout SetupPagerText (Pango.Context pangoContext) { Pango.Layout pl = new Pango.Layout (pangoContext); pl.SetText (string.Format ("{0} of {1}", CurrentPage + 1, NumPages)); diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ParameterInformationWindow.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ParameterInformationWindow.cs index c6e37b361a..7ecf55c38a 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ParameterInformationWindow.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ParameterInformationWindow.cs @@ -235,6 +235,20 @@ namespace MonoDevelop.Ide.CodeCompletion lastParam = -2; ResetTooltipInformation (); } + + protected override void OnPagerLeftClicked () + { + if (Ext != null && Widget != null) + ParameterInformationWindowManager.OverloadUp (Ext, Widget); + base.OnPagerRightClicked (); + } + + protected override void OnPagerRightClicked () + { + if (Ext != null && Widget != null) + ParameterInformationWindowManager.OverloadDown (Ext, Widget); + base.OnPagerRightClicked (); + } public void HideParameterInfo () { diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ParameterInformationWindowManager.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ParameterInformationWindowManager.cs index 0a3fdadabc..22cbeff405 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ParameterInformationWindowManager.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ParameterInformationWindowManager.cs @@ -66,28 +66,10 @@ namespace MonoDevelop.Ide.CodeCompletion if (methods.Count == 0) return false; - MethodData cmd = methods [methods.Count - 1]; - if (descriptor.SpecialKey == SpecialKey.Down) { - if (cmd.MethodProvider.Count <= 1) - return false; - if (cmd.CurrentOverload < cmd.MethodProvider.Count - 1) - cmd.CurrentOverload ++; - else - cmd.CurrentOverload = 0; - window.ChangeOverload (); - UpdateWindow (ext, widget); - return true; + return OverloadDown (ext, widget); } else if (descriptor.SpecialKey == SpecialKey.Up) { - if (cmd.MethodProvider.Count <= 1) - return false; - if (cmd.CurrentOverload > 0) - cmd.CurrentOverload --; - else - cmd.CurrentOverload = cmd.MethodProvider.Count - 1; - window.ChangeOverload (); - UpdateWindow (ext, widget); - return true; + return OverloadUp (ext, widget); } else if (descriptor.SpecialKey == SpecialKey.Escape) { HideWindow (ext, widget); @@ -95,6 +77,38 @@ namespace MonoDevelop.Ide.CodeCompletion } return false; } + + internal static bool OverloadDown (CompletionTextEditorExtension ext, ICompletionWidget widget) + { + if (methods.Count == 0) + return false; + MethodData cmd = methods [methods.Count - 1]; + if (cmd.MethodProvider.Count <= 1) + return false; + if (cmd.CurrentOverload < cmd.MethodProvider.Count - 1) + cmd.CurrentOverload ++; + else + cmd.CurrentOverload = 0; + window.ChangeOverload (); + UpdateWindow (ext, widget); + return true; + } + + internal static bool OverloadUp (CompletionTextEditorExtension ext, ICompletionWidget widget) + { + if (methods.Count == 0) + return false; + MethodData cmd = methods [methods.Count - 1]; + if (cmd.MethodProvider.Count <= 1) + return false; + if (cmd.CurrentOverload > 0) + cmd.CurrentOverload --; + else + cmd.CurrentOverload = cmd.MethodProvider.Count - 1; + window.ChangeOverload (); + UpdateWindow (ext, widget); + return true; + } internal static void PostProcessKeyEvent (CompletionTextEditorExtension ext, ICompletionWidget widget, KeyDescriptor descriptor) { diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/TooltipInformationWindow.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/TooltipInformationWindow.cs index 90b024c42c..14bda68a54 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/TooltipInformationWindow.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/TooltipInformationWindow.cs @@ -153,7 +153,13 @@ namespace MonoDevelop.Ide.CodeCompletion descriptionBox.ShowAll (); } Theme.CurrentPage = current_overload; - QueueResize (); + // if the target is not on the left or top side, we may loose the arrow alignment on our target + // and must reposition + if (!CurrentPosition.HasFlag (PopupPosition.Left) && + !CurrentPosition.HasFlag (PopupPosition.Top)) + RepositionWindow (); + else + QueueResize (); } } @@ -303,6 +309,18 @@ namespace MonoDevelop.Ide.CodeCompletion }); } + protected override void OnPagerLeftClicked () + { + OverloadLeft (); + base.OnPagerLeftClicked (); + } + + protected override void OnPagerRightClicked () + { + OverloadRight (); + base.OnPagerRightClicked (); + } + void HandleSkinChanged (object sender, EventArgs e) { SetDefaultScheme (); |