12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138 |
- using UnitTests;
- using Xunit.Abstractions;
- namespace Terminal.Gui.ViewsTests;
- public class ContextMenuTests (ITestOutputHelper output)
- {
- [Fact]
- [AutoInitShutdown]
- public void ContextMenu_Constructors ()
- {
- var cm = new ContextMenu ();
- var top = new Toplevel ();
- Application.Begin (top);
- Assert.Equal (Point.Empty, cm.Position);
- Assert.Null (cm.MenuItems);
- Assert.Null (cm.Host);
- cm.Position = new Point (20, 10);
- var menuItems = new MenuBarItem (
- [
- new MenuItem ("First", "", null)
- ]
- );
- cm.Show (menuItems);
- Assert.Equal (new Point (20, 10), cm.Position);
- Assert.Single (cm.MenuItems!.Children);
- cm = new ContextMenu
- {
- Position = new Point (5, 10)
- };
- menuItems = new MenuBarItem (
- new [] { new MenuItem ("One", "", null), new MenuItem ("Two", "", null) }
- );
- cm.Show (menuItems);
- Assert.Equal (new Point (5, 10), cm.Position);
- Assert.Equal (2, cm.MenuItems!.Children.Length);
- Assert.Null (cm.Host);
- var view = new View { X = 5, Y = 10 };
- top.Add (view);
- cm = new ContextMenu
- {
- Host = view,
- Position = new Point (5, 10)
- };
- menuItems = new MenuBarItem (
- new [] { new MenuItem ("One", "", null), new MenuItem ("Two", "", null) }
- );
- cm.Show (menuItems);
- Assert.Equal (new Point (5, 10), cm.Position);
- Assert.Equal (2, cm.MenuItems.Children.Length);
- Assert.NotNull (cm.Host);
- top.Dispose ();
- }
- [Fact]
- [AutoInitShutdown]
- public void ContextMenu_Is_Closed_If_Another_MenuBar_Is_Open_Or_Vice_Versa ()
- {
- var cm = new ContextMenu
- {
- Position = new Point (10, 5)
- };
- var menuItems = new MenuBarItem (
- [
- new MenuItem ("One", "", null),
- new MenuItem ("Two", "", null)
- ]
- );
- var menuBar = new MenuBar
- {
- Menus =
- [
- new MenuBarItem ("File", "", null),
- new MenuBarItem ("Edit", "", null)
- ]
- };
- var top = new Toplevel ();
- top.Add (menuBar);
- Application.Begin (top);
- Assert.Null (Application.MouseGrabView);
- cm.Show (menuItems);
- Assert.True (ContextMenu.IsShow);
- Menu menu = (Menu)top.SubViews.First (v => v is Menu);
- Assert.Equal (menu, Application.MouseGrabView);
- Assert.False (menuBar.IsMenuOpen);
- Assert.True (menuBar.NewKeyDownEvent (menuBar.Key));
- Assert.False (ContextMenu.IsShow);
- Assert.Equal (menuBar, Application.MouseGrabView);
- Assert.True (menuBar.IsMenuOpen);
- cm.Show (menuItems);
- Assert.True (ContextMenu.IsShow);
- menu = (Menu)top.SubViews.First (v => v is Menu);
- Assert.Equal (menu, Application.MouseGrabView);
- Assert.False (menuBar.IsMenuOpen);
- #if SUPPORT_ALT_TO_ACTIVATE_MENU
- Assert.True (Application.Top.ProcessKeyUp (new (Key.AltMask)));
- Assert.False (ContextMenu.IsShow);
- Assert.Equal (menu, Application.MouseGrabView);
- Assert.True (menu.IsMenuOpen);
- #endif
- cm.Show (menuItems);
- Assert.True (ContextMenu.IsShow);
- menu = (Menu)top.SubViews.First (v => v is Menu);
- Assert.Equal (menu, Application.MouseGrabView);
- Assert.False (menuBar.IsMenuOpen);
- Assert.False (menuBar.NewMouseEvent (new MouseEventArgs { Position = new (1, 0), Flags = MouseFlags.ReportMousePosition, View = menuBar }));
- Assert.True (ContextMenu.IsShow);
- Assert.Equal (menu, Application.MouseGrabView);
- Assert.False (menuBar.IsMenuOpen);
- Assert.True (menuBar.NewMouseEvent (new MouseEventArgs { Position = new (1, 0), Flags = MouseFlags.Button1Clicked, View = menuBar }));
- Assert.False (ContextMenu.IsShow);
- Assert.Equal (menuBar, Application.MouseGrabView);
- Assert.True (menuBar.IsMenuOpen);
- top.Dispose ();
- }
- [Fact (Skip = "#3798 Broke. Will fix in #2975")]
- [AutoInitShutdown]
- public void Draw_A_ContextMenu_Over_A_Borderless_Top ()
- {
- ((FakeDriver)Application.Driver!).SetBufferSize (20, 15);
- Assert.Equal (new Rectangle (0, 0, 20, 15), View.GetClip ()!.GetBounds ());
- DriverAssert.AssertDriverContentsWithFrameAre ("", output);
- var top = new Toplevel { X = 2, Y = 2, Width = 15, Height = 4 };
- top.Add (new TextField { X = Pos.Center (), Width = 10, Text = "Test" });
- RunState rs = Application.Begin (top);
- Application.RunIteration (ref rs);
- Assert.Equal (new Rectangle (2, 2, 15, 4), top.Frame);
- Assert.Equal (top, Application.Top);
- DriverAssert.AssertDriverContentsWithFrameAre (
- @"
- Test",
- output
- );
- Application.RaiseMouseEvent (new MouseEventArgs { ScreenPosition = new (8, 2), Flags = MouseFlags.Button3Clicked });
- Application.RunIteration (ref rs);
- DriverAssert.AssertDriverContentsWithFrameAre (
- @"
- Test
- ┌───────────────────
- │ Select All Ctrl+
- │ Delete All Ctrl+
- │ Copy Ctrl+
- │ Cut Ctrl+
- │ Paste Ctrl+
- │ Undo Ctrl+
- │ Redo Ctrl+
- └───────────────────",
- output
- );
- Application.End (rs);
- top.Dispose ();
- }
- [Fact (Skip = "#3798 Broke. Will fix in #2975")]
- [AutoInitShutdown]
- public void Draw_A_ContextMenu_Over_A_Dialog ()
- {
- Toplevel top = new ();
- var win = new Window ();
- top.Add (win);
- RunState rsTop = Application.Begin (top);
- ((FakeDriver)Application.Driver!).SetBufferSize (20, 15);
- Assert.Equal (new Rectangle (0, 0, 20, 15), win.Frame);
- DriverAssert.AssertDriverContentsWithFrameAre (
- @"
- ┌──────────────────┐
- │ │
- │ │
- │ │
- │ │
- │ │
- │ │
- │ │
- │ │
- │ │
- │ │
- │ │
- │ │
- │ │
- └──────────────────┘",
- output
- );
- // Don't use Dialog here as it has more layout logic. Use Window instead.
- var testWindow = new Window { X = 2, Y = 2, Width = 15, Height = 4 };
- testWindow.Add (new TextField { X = Pos.Center (), Width = 10, Text = "Test" });
- RunState rsDialog = Application.Begin (testWindow);
- Application.LayoutAndDraw ();
- Assert.Equal (new Rectangle (2, 2, 15, 4), testWindow.Frame);
- DriverAssert.AssertDriverContentsWithFrameAre (
- @"
- ┌──────────────────┐
- │ │
- │ ┌─────────────┐ │
- │ │ Test │ │
- │ │ │ │
- │ └─────────────┘ │
- │ │
- │ │
- │ │
- │ │
- │ │
- │ │
- │ │
- │ │
- └──────────────────┘",
- output
- );
- Application.RaiseMouseEvent (new MouseEventArgs { ScreenPosition = new (9, 3), Flags = MouseFlags.Button3Clicked });
- Application.RunIteration (ref rsDialog);
- DriverAssert.AssertDriverContentsWithFrameAre (
- @"
- ┌──────────────────┐
- │ │
- │ ┌─────────────┐ │
- │ │ Test │ │
- ┌───────────────────
- │ Select All Ctrl+
- │ Delete All Ctrl+
- │ Copy Ctrl+
- │ Cut Ctrl+
- │ Paste Ctrl+
- │ Undo Ctrl+
- │ Redo Ctrl+
- └───────────────────
- │ │
- └──────────────────┘",
- output
- );
- Application.End (rsDialog);
- Application.End (rsTop);
- top.Dispose ();
- }
- [Fact (Skip = "#3798 Broke. Will fix in #2975")]
- [AutoInitShutdown]
- public void Draw_A_ContextMenu_Over_A_Top_Dialog ()
- {
- ((FakeDriver)Application.Driver!).SetBufferSize (20, 15);
- Assert.Equal (new Rectangle (0, 0, 20, 15), View.GetClip ()!.GetBounds ());
- DriverAssert.AssertDriverContentsWithFrameAre ("", output);
- // Don't use Dialog here as it has more layout logic. Use Window instead.
- var dialog = new Window { X = 2, Y = 2, Width = 15, Height = 4 };
- dialog.Add (new TextField { X = Pos.Center (), Width = 10, Text = "Test" });
- RunState rs = Application.Begin (dialog);
- Application.LayoutAndDraw ();
- Assert.Equal (new Rectangle (2, 2, 15, 4), dialog.Frame);
- Assert.Equal (dialog, Application.Top);
- DriverAssert.AssertDriverContentsWithFrameAre (
- @"
- ┌─────────────┐
- │ Test │
- │ │
- └─────────────┘",
- output
- );
- Application.RaiseMouseEvent (new MouseEventArgs { ScreenPosition = new (9, 3), Flags = MouseFlags.Button3Clicked });
- var firstIteration = false;
- Application.RunIteration (ref rs, firstIteration);
- DriverAssert.AssertDriverContentsWithFrameAre (
- @"
- ┌─────────────┐
- │ Test │
- ┌───────────────────
- │ Select All Ctrl+
- │ Delete All Ctrl+
- │ Copy Ctrl+
- │ Cut Ctrl+
- │ Paste Ctrl+
- │ Undo Ctrl+
- │ Redo Ctrl+
- └───────────────────",
- output
- );
- Application.End (rs);
- dialog.Dispose ();
- }
- [Fact]
- [AutoInitShutdown]
- public void ForceMinimumPosToZero_True_False ()
- {
- var cm = new ContextMenu
- {
- Position = new Point (-1, -2)
- };
- var menuItems = new MenuBarItem (
- [
- new MenuItem ("One", "", null),
- new MenuItem ("Two", "", null)
- ]
- );
- Assert.Equal (new Point (-1, -2), cm.Position);
- Toplevel top = new ();
- Application.Begin (top);
- cm.Show (menuItems);
- Assert.Equal (new Point (-1, -2), cm.Position);
- Application.LayoutAndDraw ();
- var expected = @"
- ┌──────┐
- │ One │
- │ Two │
- └──────┘
- ";
- Rectangle pos = DriverAssert.AssertDriverContentsWithFrameAre (expected, output);
- Assert.Equal (new Rectangle (0, 1, 8, 4), pos);
- cm.ForceMinimumPosToZero = false;
- cm.Show (menuItems);
- Assert.Equal (new Point (-1, -2), cm.Position);
- Application.LayoutAndDraw ();
- expected = @"
- One │
- Two │
- ──────┘
- ";
- pos = DriverAssert.AssertDriverContentsWithFrameAre (expected, output);
- Assert.Equal (new Rectangle (1, 0, 7, 3), pos);
- top.Dispose ();
- }
- [Fact]
- [AutoInitShutdown]
- public void Hide_Is_Invoke_At_Container_Closing ()
- {
- var cm = new ContextMenu
- {
- Position = new Point (80, 25)
- };
- var menuItems = new MenuBarItem (
- [
- new MenuItem ("One", "", null),
- new MenuItem ("Two", "", null)
- ]
- );
- Toplevel top = new ();
- Application.Begin (top);
- top.Running = true;
- Assert.False (ContextMenu.IsShow);
- cm.Show (menuItems);
- Assert.True (ContextMenu.IsShow);
- top.RequestStop ();
- Assert.False (ContextMenu.IsShow);
- top.Dispose ();
- }
- [Fact]
- [AutoInitShutdown]
- public void Key_Open_And_Close_The_ContextMenu ()
- {
- var tf = new TextField ();
- var top = new Toplevel ();
- top.Add (tf);
- Application.Begin (top);
- Assert.True (Application.RaiseKeyDownEvent (ContextMenu.DefaultKey));
- Assert.True (tf.ContextMenu.MenuBar!.IsMenuOpen);
- Assert.True (Application.RaiseKeyDownEvent (ContextMenu.DefaultKey));
- // The last context menu bar opened is always preserved
- Assert.NotNull (tf.ContextMenu.MenuBar);
- top.Dispose ();
- }
- [Fact]
- [AutoInitShutdown]
- public void KeyChanged_Event ()
- {
- var oldKey = Key.Empty;
- var cm = new ContextMenu ();
- cm.KeyChanged += (s, e) => oldKey = e.OldKey;
- cm.Key = Key.Space.WithCtrl;
- Assert.Equal (Key.Space.WithCtrl, cm.Key);
- Assert.Equal (ContextMenu.DefaultKey, oldKey);
- }
- [Fact]
- [AutoInitShutdown]
- public void MenuItens_Changing ()
- {
- var cm = new ContextMenu
- {
- Position = new Point (10, 5)
- };
- var menuItems = new MenuBarItem (
- [
- new MenuItem ("One", "", null),
- new MenuItem ("Two", "", null)
- ]
- );
- Toplevel top = new ();
- Application.Begin (top);
- cm.Show (menuItems);
- Application.LayoutAndDraw ();
- var expected = @"
- ┌──────┐
- │ One │
- │ Two │
- └──────┘
- ";
- DriverAssert.AssertDriverContentsAre (expected, output);
- menuItems = new MenuBarItem (
- [
- new MenuItem ("First", "", null),
- new MenuItem ("Second", "", null),
- new MenuItem ("Third", "", null)
- ]
- );
- cm.Show (menuItems);
- Application.LayoutAndDraw ();
- expected = @"
- ┌─────────┐
- │ First │
- │ Second │
- │ Third │
- └─────────┘
- ";
- DriverAssert.AssertDriverContentsAre (expected, output);
- top.Dispose ();
- }
- [Fact]
- [AutoInitShutdown]
- public void Menus_And_SubMenus_Always_Try_To_Be_On_Screen ()
- {
- var cm = new ContextMenu
- {
- Position = new Point (-1, -2)
- };
- var menuItems = new MenuBarItem (
- [
- new MenuItem ("One", "", null),
- new MenuItem ("Two", "", null),
- new MenuItem ("Three", "", null),
- new MenuBarItem (
- "Four",
- [
- new MenuItem ("SubMenu1", "", null),
- new MenuItem ("SubMenu2", "", null),
- new MenuItem ("SubMenu3", "", null),
- new MenuItem ("SubMenu4", "", null),
- new MenuItem ("SubMenu5", "", null),
- new MenuItem ("SubMenu6", "", null),
- new MenuItem ("SubMenu7", "", null)
- ]
- ),
- new MenuItem ("Five", "", null),
- new MenuItem ("Six", "", null)
- ]
- );
- Assert.Equal (new Point (-1, -2), cm.Position);
- Toplevel top = new ();
- RunState rs = Application.Begin (top);
- cm.Show (menuItems);
- Application.RunIteration (ref rs);
- Assert.Equal (new Point (-1, -2), cm.Position);
- DriverAssert.AssertDriverContentsWithFrameAre (
- @"
- ┌────────┐
- │ One │
- │ Two │
- │ Three │
- │ Four ►│
- │ Five │
- │ Six │
- └────────┘
- ",
- output
- );
- View menu = top.SubViews.First (v => v is Menu);
- Assert.True (
- menu
- .NewMouseEvent (
- new MouseEventArgs { Position = new (0, 3), Flags = MouseFlags.ReportMousePosition, View = menu }
- )
- );
- Application.RunIteration (ref rs);
- Assert.Equal (new Point (-1, -2), cm.Position);
- DriverAssert.AssertDriverContentsWithFrameAre (
- @"
- ┌────────┐
- │ One │
- │ Two │
- │ Three │
- │ Four ►│┌───────────┐
- │ Five ││ SubMenu1 │
- │ Six ││ SubMenu2 │
- └────────┘│ SubMenu3 │
- │ SubMenu4 │
- │ SubMenu5 │
- │ SubMenu6 │
- │ SubMenu7 │
- └───────────┘
- ",
- output
- );
- ((FakeDriver)Application.Driver!).SetBufferSize (40, 20);
- cm.Position = new Point (41, -2);
- cm.Show (menuItems);
- Application.RunIteration (ref rs);
- Assert.Equal (new Point (41, -2), cm.Position);
- DriverAssert.AssertDriverContentsWithFrameAre (
- @"
- ┌────────┐
- │ One │
- │ Two │
- │ Three │
- │ Four ►│
- │ Five │
- │ Six │
- └────────┘
- ",
- output
- );
- menu = top.SubViews.First (v => v is Menu);
- Assert.True (
- menu
- .NewMouseEvent (
- new MouseEventArgs { Position = new (30, 3), Flags = MouseFlags.ReportMousePosition, View = menu }
- )
- );
- Application.RunIteration (ref rs);
- Assert.Equal (new Point (41, -2), cm.Position);
- DriverAssert.AssertDriverContentsWithFrameAre (
- @"
- ┌────────┐
- │ One │
- │ Two │
- │ Three │
- ┌───────────┐│ Four ►│
- │ SubMenu1 ││ Five │
- │ SubMenu2 ││ Six │
- │ SubMenu3 │└────────┘
- │ SubMenu4 │
- │ SubMenu5 │
- │ SubMenu6 │
- │ SubMenu7 │
- └───────────┘
- ",
- output
- );
- cm.Position = new Point (41, 9);
- cm.Show (menuItems);
- Application.RunIteration (ref rs);
- Assert.Equal (new Point (41, 9), cm.Position);
- DriverAssert.AssertDriverContentsWithFrameAre (
- @"
- ┌────────┐
- │ One │
- │ Two │
- │ Three │
- │ Four ►│
- │ Five │
- │ Six │
- └────────┘
- ",
- output
- );
- menu = top.SubViews.First (v => v is Menu);
- Assert.True (
- menu
- .NewMouseEvent (
- new MouseEventArgs { Position = new (30, 3), Flags = MouseFlags.ReportMousePosition, View = menu }
- )
- );
- Application.RunIteration (ref rs);
- Assert.Equal (new Point (41, 9), cm.Position);
- DriverAssert.AssertDriverContentsWithFrameAre (
- @"
- ┌────────┐
- ┌───────────┐│ One │
- │ SubMenu1 ││ Two │
- │ SubMenu2 ││ Three │
- │ SubMenu3 ││ Four ►│
- │ SubMenu4 ││ Five │
- │ SubMenu5 ││ Six │
- │ SubMenu6 │└────────┘
- │ SubMenu7 │
- └───────────┘
- ",
- output
- );
- cm.Position = new Point (41, 22);
- cm.Show (menuItems);
- Application.RunIteration (ref rs);
- Assert.Equal (new Point (41, 22), cm.Position);
- DriverAssert.AssertDriverContentsWithFrameAre (
- @"
- ┌────────┐
- │ One │
- │ Two │
- │ Three │
- │ Four ►│
- │ Five │
- │ Six │
- └────────┘
- ",
- output
- );
- menu = top.SubViews.First (v => v is Menu);
- Assert.True (
- menu
- .NewMouseEvent (
- new MouseEventArgs { Position = new (30, 3), Flags = MouseFlags.ReportMousePosition, View = menu }
- )
- );
- Application.RunIteration (ref rs);
- Assert.Equal (new Point (41, 22), cm.Position);
- DriverAssert.AssertDriverContentsWithFrameAre (
- @"
- ┌───────────┐
- │ SubMenu1 │┌────────┐
- │ SubMenu2 ││ One │
- │ SubMenu3 ││ Two │
- │ SubMenu4 ││ Three │
- │ SubMenu5 ││ Four ►│
- │ SubMenu6 ││ Five │
- │ SubMenu7 ││ Six │
- └───────────┘└────────┘
- ",
- output
- );
- ((FakeDriver)Application.Driver!).SetBufferSize (18, 8);
- cm.Position = new Point (19, 10);
- cm.Show (menuItems);
- Application.RunIteration (ref rs);
- Assert.Equal (new Point (19, 10), cm.Position);
- DriverAssert.AssertDriverContentsWithFrameAre (
- @"
- ┌────────┐
- │ One │
- │ Two │
- │ Three │
- │ Four ►│
- │ Five │
- │ Six │
- └────────┘
- ",
- output
- );
- menu = top.SubViews.First (v => v is Menu);
- Assert.True (
- menu
- .NewMouseEvent (
- new MouseEventArgs { Position = new (30, 3), Flags = MouseFlags.ReportMousePosition, View = menu }
- )
- );
- Application.RunIteration (ref rs);
- Assert.Equal (new Point (19, 10), cm.Position);
- DriverAssert.AssertDriverContentsWithFrameAre (
- @"
- ┌───────────┐────┐
- │ SubMenu1 │ │
- │ SubMenu2 │ │
- │ SubMenu3 │ee │
- │ SubMenu4 │r ►│
- │ SubMenu5 │e │
- │ SubMenu6 │ │
- │ SubMenu7 │────┘
- ",
- output
- );
- top.Dispose ();
- }
- [Fact]
- [AutoInitShutdown]
- public void MouseFlags_Changing ()
- {
- var lbl = new Label { Text = "Original" };
- var cm = new ContextMenu ();
- lbl.MouseClick += (s, e) =>
- {
- if (e.Flags == cm.MouseFlags)
- {
- lbl.Text = "Replaced";
- e.Handled = true;
- }
- };
- Toplevel top = new ();
- top.Add (lbl);
- Application.Begin (top);
- Assert.True (lbl.NewMouseEvent (new MouseEventArgs { Flags = cm.MouseFlags }));
- Assert.Equal ("Replaced", lbl.Text);
- lbl.Text = "Original";
- cm.MouseFlags = MouseFlags.Button2Clicked;
- Assert.True (lbl.NewMouseEvent (new MouseEventArgs { Flags = cm.MouseFlags }));
- Assert.Equal ("Replaced", lbl.Text);
- top.Dispose ();
- }
- [Fact]
- public void MouseFlagsChanged_Event ()
- {
- var oldMouseFlags = new MouseFlags ();
- var cm = new ContextMenu ();
- cm.MouseFlagsChanged += (s, e) => oldMouseFlags = e.OldValue;
- cm.MouseFlags = MouseFlags.Button2Clicked;
- Assert.Equal (MouseFlags.Button2Clicked, cm.MouseFlags);
- Assert.Equal (MouseFlags.Button3Clicked, oldMouseFlags);
- }
- [Fact]
- [AutoInitShutdown]
- public void Position_Changing ()
- {
- var cm = new ContextMenu
- {
- Position = new Point (10, 5)
- };
- var menuItems = new MenuBarItem (
- [
- new MenuItem ("One", "", null),
- new MenuItem ("Two", "", null)
- ]
- );
- Toplevel top = new ();
- Application.Begin (top);
- cm.Show (menuItems);
- Application.LayoutAndDraw ();
- var expected = @"
- ┌──────┐
- │ One │
- │ Two │
- └──────┘
- ";
- DriverAssert.AssertDriverContentsAre (expected, output);
- cm.Position = new Point (5, 10);
- cm.Show (menuItems);
- Application.LayoutAndDraw ();
- expected = @"
- ┌──────┐
- │ One │
- │ Two │
- └──────┘
- ";
- DriverAssert.AssertDriverContentsAre (expected, output);
- top.Dispose ();
- }
- [Fact]
- [AutoInitShutdown]
- public void RequestStop_While_ContextMenu_Is_Open_Does_Not_Throws ()
- {
- ContextMenu cm = new ContextMenu
- {
- Position = new Point (10, 5)
- };
- var menuItems = new MenuBarItem (
- new MenuItem [] { new ("One", "", null), new ("Two", "", null) }
- );
- Toplevel top = new ();
- var isMenuAllClosed = false;
- MenuBarItem mi = null;
- int iterations = -1;
- Application.Iteration += (s, a) =>
- {
- iterations++;
- if (iterations == 0)
- {
- cm.Show (menuItems);
- Assert.True (ContextMenu.IsShow);
- mi = cm.MenuBar.Menus [0];
- mi.Action = () =>
- {
- Assert.True (ContextMenu.IsShow);
- var dialog1 = new Dialog () { Id = "dialog1" };
- Application.Run (dialog1);
- dialog1.Dispose ();
- Assert.False (ContextMenu.IsShow);
- Assert.True (isMenuAllClosed);
- };
- cm.MenuBar.MenuAllClosed += (_, _) => isMenuAllClosed = true;
- }
- else if (iterations == 1)
- {
- mi.Action ();
- }
- else if (iterations == 2)
- {
- Application.RequestStop ();
- }
- else if (iterations == 3)
- {
- isMenuAllClosed = false;
- cm.Show (menuItems);
- Assert.True (ContextMenu.IsShow);
- cm.MenuBar.MenuAllClosed += (_, _) => isMenuAllClosed = true;
- }
- else if (iterations == 4)
- {
- Exception exception = Record.Exception (() => Application.RequestStop ());
- Assert.Null (exception);
- }
- else
- {
- Application.RequestStop ();
- }
- };
- var isTopClosed = false;
- top.Closing += (_, _) =>
- {
- var dialog2 = new Dialog () { Id = "dialog2" };
- Application.Run (dialog2);
- dialog2.Dispose ();
- Assert.False (ContextMenu.IsShow);
- Assert.True (isMenuAllClosed);
- isTopClosed = true;
- };
- Application.Run (top);
- Assert.True (isTopClosed);
- Assert.False (ContextMenu.IsShow);
- Assert.True (isMenuAllClosed);
- top.Dispose ();
- }
- [Fact]
- [AutoInitShutdown]
- public void Show_Display_At_Zero_If_The_Toplevel_Height_Is_Less_Than_The_Menu_Height ()
- {
- ((FakeDriver)Application.Driver!).SetBufferSize (80, 3);
- var cm = new ContextMenu
- {
- Position = Point.Empty
- };
- var menuItems = new MenuBarItem (
- [
- new MenuItem ("One", "", null),
- new MenuItem ("Two", "", null)
- ]
- );
- Assert.Equal (Point.Empty, cm.Position);
- Toplevel top = new ();
- Application.Begin (top);
- cm.Show (menuItems);
- Assert.Equal (Point.Empty, cm.Position);
- Application.LayoutAndDraw ();
- var expected = @"
- ┌──────┐
- │ One │
- │ Two │";
- Rectangle pos = DriverAssert.AssertDriverContentsWithFrameAre (expected, output);
- Assert.Equal (new Rectangle (0, 0, 8, 3), pos);
- cm.Hide ();
- Assert.Equal (Point.Empty, cm.Position);
- top.Dispose ();
- }
- [Fact]
- [AutoInitShutdown]
- public void Show_Display_At_Zero_If_The_Toplevel_Width_Is_Less_Than_The_Menu_Width ()
- {
- ((FakeDriver)Application.Driver!).SetBufferSize (5, 25);
- var cm = new ContextMenu
- {
- Position = Point.Empty
- };
- var menuItems = new MenuBarItem (
- [
- new MenuItem ("One", "", null),
- new MenuItem ("Two", "", null)
- ]
- );
- Assert.Equal (Point.Empty, cm.Position);
- Toplevel top = new ();
- Application.Begin (top);
- cm.Show (menuItems);
- Assert.Equal (Point.Empty, cm.Position);
- Application.LayoutAndDraw ();
- var expected = @"
- ┌────
- │ One
- │ Two
- └────";
- Rectangle pos = DriverAssert.AssertDriverContentsWithFrameAre (expected, output);
- Assert.Equal (new Rectangle (0, 1, 5, 4), pos);
- cm.Hide ();
- Assert.Equal (Point.Empty, cm.Position);
- top.Dispose ();
- }
- [Fact]
- [AutoInitShutdown]
- public void Show_Display_Below_The_Bottom_Host_If_Has_Enough_Space ()
- {
- var view = new View
- {
- X = 10,
- Y = 5,
- Width = 10,
- Height = 1,
- Text = "View"
- };
- var cm = new ContextMenu
- {
- Host = view,
- Position = new Point (10, 5)
- };
- var menuItems = new MenuBarItem (
- [
- new MenuItem ("One", "", null),
- new MenuItem ("Two", "", null)
- ]
- );
- var top = new Toplevel ();
- top.Add (view);
- Application.Begin (top);
- Assert.Equal (new Point (10, 5), cm.Position);
- cm.Show (menuItems);
- top.Draw ();
- Assert.Equal (new Point (10, 5), cm.Position);
- var expected = @"
- View
- ┌──────┐
- │ One │
- │ Two │
- └──────┘
- ";
- Rectangle pos = DriverAssert.AssertDriverContentsWithFrameAre (expected, output);
- Assert.Equal (new Rectangle (10, 5, 18, 5), pos);
- cm.Hide ();
- Assert.Equal (new Point (10, 5), cm.Position);
- cm.Host.X = 5;
- cm.Host.Y = 10;
- cm.Host.Height = 3;
- cm.Show (menuItems);
- View.SetClipToScreen ();
- Application.Top.Draw ();
- Assert.Equal (new Point (5, 12), cm.Position);
- expected = @"
- View
-
-
- ┌──────┐
- │ One │
- │ Two │
- └──────┘
- ";
- pos = DriverAssert.AssertDriverContentsWithFrameAre (expected, output);
- Assert.Equal (new Rectangle (5, 10, 13, 7), pos);
- cm.Hide ();
- Assert.Equal (new Point (5, 12), cm.Position);
- top.Dispose ();
- }
- [Fact]
- [AutoInitShutdown]
- public void Show_Ensures_Display_Inside_The_Container_But_Preserves_Position ()
- {
- var cm = new ContextMenu
- {
- Position = new Point (80, 25)
- };
- var menuItems = new MenuBarItem (
- [
- new MenuItem ("One", "", null),
- new MenuItem ("Two", "", null)
- ]
- );
- Assert.Equal (new Point (80, 25), cm.Position);
- Toplevel top = new ();
- Application.Begin (top);
- cm.Show (menuItems);
- Assert.Equal (new Point (80, 25), cm.Position);
- Application.LayoutAndDraw ();
- var expected = @"
- ┌──────┐
- │ One │
- │ Two │
- └──────┘
- ";
- Rectangle pos = DriverAssert.AssertDriverContentsWithFrameAre (expected, output);
- Assert.Equal (new Rectangle (72, 21, 80, 4), pos);
- cm.Hide ();
- Assert.Equal (new Point (80, 25), cm.Position);
- top.Dispose ();
- }
- [Fact]
- [AutoInitShutdown]
- public void Show_Ensures_Display_Inside_The_Container_Without_Overlap_The_Host ()
- {
- var view = new View
- {
- X = Pos.AnchorEnd (10),
- Y = Pos.AnchorEnd (1),
- Width = 10,
- Height = 1,
- Text = "View"
- };
- var cm = new ContextMenu
- {
- Host = view
- };
- var menuItems = new MenuBarItem (
- [
- new MenuItem ("One", "", null),
- new MenuItem ("Two", "", null)
- ]
- );
- var top = new Toplevel ();
- top.Add (view);
- Application.Begin (top);
- Assert.Equal (new Rectangle (70, 24, 10, 1), view.Frame);
- Assert.Equal (Point.Empty, cm.Position);
- cm.Show (menuItems);
- Assert.Equal (new Point (70, 24), cm.Position);
- top.Draw ();
- var expected = @"
- ┌──────┐
- │ One │
- │ Two │
- └──────┘
- View
- ";
- Rectangle pos = DriverAssert.AssertDriverContentsWithFrameAre (expected, output);
- Assert.Equal (new Rectangle (70, 20, 78, 5), pos);
- cm.Hide ();
- Assert.Equal (new Point (70, 24), cm.Position);
- top.Dispose ();
- }
- [Fact]
- [AutoInitShutdown]
- public void Show_Hide_IsShow ()
- {
- ContextMenu cm = new ContextMenu
- {
- Position = new Point (10, 5)
- };
- var menuItems = new MenuBarItem (
- new MenuItem [] { new ("One", "", null), new ("Two", "", null) }
- );
- Toplevel top = new ();
- Application.Begin (top);
- cm.Show (menuItems);
- Assert.True (ContextMenu.IsShow);
- Application.LayoutAndDraw ();
- var expected = @"
- ┌──────┐
- │ One │
- │ Two │
- └──────┘
- ";
- DriverAssert.AssertDriverContentsAre (expected, output);
- cm.Hide ();
- Assert.False (ContextMenu.IsShow);
- Application.LayoutAndDraw ();
- expected = "";
- DriverAssert.AssertDriverContentsAre (expected, output);
- top.Dispose ();
- }
- [Fact]
- [AutoInitShutdown]
- public void UseSubMenusSingleFrame_True_By_Mouse ()
- {
- var cm = new ContextMenu
- {
- Position = new Point (5, 10),
- UseSubMenusSingleFrame = true
- };
- var menuItems = new MenuBarItem (
- "Numbers",
- [
- new MenuItem ("One", "", null),
- new MenuBarItem (
- "Two",
- [
- new MenuItem (
- "Sub-Menu 1",
- "",
- null
- ),
- new MenuItem ("Sub-Menu 2", "", null)
- ]
- ),
- new MenuItem ("Three", "", null)
- ]
- );
- Toplevel top = new ();
- RunState rs = Application.Begin (top);
- cm.Show (menuItems);
- var menu = Application.Top!.SubViews.First (v => v is Menu);
- Assert.Equal (new Rectangle (5, 11, 10, 5), menu.Frame);
- Application.LayoutAndDraw ();
- DriverAssert.AssertDriverContentsWithFrameAre (
- @"
- ┌────────┐
- │ One │
- │ Two ►│
- │ Three │
- └────────┘",
- output
- );
- // X=5 is the border and so need to use at least one more
- Application.RaiseMouseEvent (new MouseEventArgs { ScreenPosition = new (6, 13), Flags = MouseFlags.Button1Clicked });
- var firstIteration = false;
- Application.RunIteration (ref rs, firstIteration);
- menu = Application.Top!.SubViews.First (v => v is Menu);
- Assert.Equal (new Rectangle (5, 11, 10, 5), menu.Frame);
- menu = Application.Top!.SubViews.Last (v => v is Menu);
- Assert.Equal (new Rectangle (5, 11, 15, 6), menu.Frame);
- DriverAssert.AssertDriverContentsWithFrameAre (
- @"
- ┌─────────────┐
- │◄ Two │
- ├─────────────┤
- │ Sub-Menu 1 │
- │ Sub-Menu 2 │
- └─────────────┘",
- output
- );
- Application.RaiseMouseEvent (new MouseEventArgs { ScreenPosition = new (6, 12), Flags = MouseFlags.Button1Clicked });
- firstIteration = false;
- Application.RunIteration (ref rs, firstIteration);
- menu = Application.Top!.SubViews.First (v => v is Menu);
- Assert.Equal (new Rectangle (5, 11, 10, 5), menu.Frame);
- DriverAssert.AssertDriverContentsWithFrameAre (
- @"
- ┌────────┐
- │ One │
- │ Two ►│
- │ Three │
- └────────┘",
- output
- );
- Application.End (rs);
- top.Dispose ();
- }
- [Fact]
- [AutoInitShutdown]
- public void UseSubMenusSingleFrame_False_By_Mouse ()
- {
- var cm = new ContextMenu
- {
- Position = new Point (5, 10)
- };
- var menuItems = new MenuBarItem (
- "Numbers",
- [
- new MenuItem ("One", "", null),
- new MenuBarItem (
- "Two",
- [
- new MenuItem (
- "Two-Menu 1",
- "",
- null
- ),
- new MenuItem ("Two-Menu 2", "", null)
- ]
- ),
- new MenuBarItem (
- "Three",
- [
- new MenuItem (
- "Three-Menu 1",
- "",
- null
- ),
- new MenuItem ("Three-Menu 2", "", null)
- ]
- )
- ]
- );
- Toplevel top = new ();
- RunState rs = Application.Begin (top);
- cm.Show (menuItems);
- var menu = Application.Top!.SubViews.First (v => v is Menu);
- Assert.Equal (new Rectangle (5, 11, 10, 5), menu.Frame);
- Application.LayoutAndDraw ();
- DriverAssert.AssertDriverContentsWithFrameAre (
- @"
- ┌────────┐
- │ One │
- │ Two ►│
- │ Three ►│
- └────────┘",
- output
- );
- Application.RaiseMouseEvent (new MouseEventArgs { ScreenPosition = new (6, 13), Flags = MouseFlags.ReportMousePosition });
- var firstIteration = false;
- Application.RunIteration (ref rs, firstIteration);
- menu = Application.Top!.SubViews.First (v => v is Menu);
- Assert.Equal (new Rectangle (5, 11, 10, 5), menu.Frame);
- DriverAssert.AssertDriverContentsWithFrameAre (
- @"
- ┌────────┐
- │ One │
- │ Two ►│┌─────────────┐
- │ Three ►││ Two-Menu 1 │
- └────────┘│ Two-Menu 2 │
- └─────────────┘",
- output
- );
- Application.RaiseMouseEvent (new MouseEventArgs { ScreenPosition = new (6, 14), Flags = MouseFlags.ReportMousePosition });
- firstIteration = false;
- Application.RunIteration (ref rs, firstIteration);
- menu = Application.Top!.SubViews.First (v => v is Menu);
- Assert.Equal (new Rectangle (5, 11, 10, 5), menu.Frame);
- DriverAssert.AssertDriverContentsWithFrameAre (
- @"
- ┌────────┐
- │ One │
- │ Two ►│
- │ Three ►│┌───────────────┐
- └────────┘│ Three-Menu 1 │
- │ Three-Menu 2 │
- └───────────────┘",
- output
- );
- Application.RaiseMouseEvent (new MouseEventArgs { ScreenPosition = new (6, 13), Flags = MouseFlags.ReportMousePosition });
- firstIteration = false;
- Application.RunIteration (ref rs, firstIteration);
- menu = Application.Top!.SubViews.First (v => v is Menu);
- Assert.Equal (new Rectangle (5, 11, 10, 5), menu.Frame);
- DriverAssert.AssertDriverContentsWithFrameAre (
- @"
- ┌────────┐
- │ One │
- │ Two ►│┌─────────────┐
- │ Three ►││ Two-Menu 1 │
- └────────┘│ Two-Menu 2 │
- └─────────────┘",
- output
- );
- Application.End (rs);
- top.Dispose ();
- }
- [Fact]
- [AutoInitShutdown]
- public void Handling_TextField_With_Opened_ContextMenu_By_Mouse_HasFocus ()
- {
- var tf1 = new TextField { Width = 10, Text = "TextField 1" };
- var tf2 = new TextField { Y = 2, Width = 10, Text = "TextField 2" };
- var win = new Window ();
- win.Add (tf1, tf2);
- var rs = Application.Begin (win);
- Assert.True (tf1.HasFocus);
- Assert.False (tf2.HasFocus);
- Assert.Equal (4, win.SubViews.Count); // TF & TV add autocomplete popup's to their superviews.
- Assert.Empty (Application._cachedViewsUnderMouse);
- // Right click on tf2 to open context menu
- Application.RaiseMouseEvent (new () { ScreenPosition = new (1, 3), Flags = MouseFlags.Button3Clicked });
- Assert.False (tf1.HasFocus);
- Assert.False (tf2.HasFocus);
- Assert.Equal (6, win.SubViews.Count);
- Assert.True (tf2.ContextMenu.MenuBar.IsMenuOpen);
- Assert.True (win.Focused is Menu);
- Assert.True (Application.MouseGrabView is Menu);
- Assert.Equal (tf2, Application._cachedViewsUnderMouse.LastOrDefault ());
- // Click on tf1 to focus it, which cause context menu being closed
- Application.RaiseMouseEvent (new () { ScreenPosition = new (1, 1), Flags = MouseFlags.Button1Clicked });
- Assert.True (tf1.HasFocus);
- Assert.False (tf2.HasFocus);
- Assert.Equal (5, win.SubViews.Count);
- // The last context menu bar opened is always preserved
- Assert.NotNull (tf2.ContextMenu.MenuBar);
- Assert.Equal (win.Focused, tf1);
- Assert.Null (Application.MouseGrabView);
- Assert.Equal (tf1, Application._cachedViewsUnderMouse.LastOrDefault ());
- // Click on tf2 to focus it
- Application.RaiseMouseEvent (new () { ScreenPosition = new (1, 3), Flags = MouseFlags.Button1Clicked });
- Assert.False (tf1.HasFocus);
- Assert.True (tf2.HasFocus);
- Assert.Equal (5, win.SubViews.Count);
- // The last context menu bar opened is always preserved
- Assert.NotNull (tf2.ContextMenu.MenuBar);
- Assert.Equal (win.Focused, tf2);
- Assert.Null (Application.MouseGrabView);
- Assert.Equal (tf2, Application._cachedViewsUnderMouse.LastOrDefault ());
- Application.End (rs);
- win.Dispose ();
- }
- [Fact]
- [AutoInitShutdown]
- public void Empty_Menus_Items_Children_Does_Not_Open_The_Menu ()
- {
- var cm = new ContextMenu ();
- Assert.Null (cm.MenuItems);
- var top = new Toplevel ();
- Application.Begin (top);
- cm.Show (cm.MenuItems);
- Assert.Null (cm.MenuBar);
- top.Dispose ();
- }
- [Fact]
- [AutoInitShutdown]
- public void KeyBindings_Removed_On_Close_ContextMenu ()
- {
- var newFile = false;
- var renameFile = false;
- var deleteFile = false;
- var cm = new ContextMenu ();
- var menuItems = new MenuBarItem (
- [
- new MenuItem ("New File", string.Empty, New, null, null, Key.N.WithCtrl),
- new MenuItem ("Rename File", string.Empty, Rename, null, null, Key.R.WithCtrl),
- new MenuItem ("Delete File", string.Empty, Delete, null, null, Key.D.WithCtrl)
- ]
- );
- var top = new Toplevel ();
- Application.Begin (top);
- Assert.Null (cm.MenuBar);
- Assert.False (Application.RaiseKeyDownEvent (Key.N.WithCtrl));
- Assert.False (Application.RaiseKeyDownEvent (Key.R.WithCtrl));
- Assert.False (Application.RaiseKeyDownEvent (Key.D.WithCtrl));
- Assert.False (newFile);
- Assert.False (renameFile);
- Assert.False (deleteFile);
- cm.Show (menuItems);
- Assert.True (cm.MenuBar!.HotKeyBindings.TryGet (Key.N.WithCtrl, out _));
- Assert.True (cm.MenuBar.HotKeyBindings.TryGet (Key.R.WithCtrl, out _));
- Assert.True (cm.MenuBar.HotKeyBindings.TryGet (Key.D.WithCtrl, out _));
- Assert.True (Application.RaiseKeyDownEvent (Key.N.WithCtrl));
- Application.MainLoop!.RunIteration ();
- Assert.True (newFile);
- Assert.False (cm.MenuBar!.IsMenuOpen);
- cm.Show (menuItems);
- Assert.True (Application.RaiseKeyDownEvent (Key.R.WithCtrl));
- Application.MainLoop!.RunIteration ();
- Assert.True (renameFile);
- Assert.False (cm.MenuBar.IsMenuOpen);
- cm.Show (menuItems);
- Assert.True (Application.RaiseKeyDownEvent (Key.D.WithCtrl));
- Application.MainLoop!.RunIteration ();
- Assert.True (deleteFile);
- Assert.False (cm.MenuBar.IsMenuOpen);
- Assert.False (cm.MenuBar.HotKeyBindings.TryGet (Key.N.WithCtrl, out _));
- Assert.False (cm.MenuBar.HotKeyBindings.TryGet (Key.R.WithCtrl, out _));
- Assert.False (cm.MenuBar.HotKeyBindings.TryGet (Key.D.WithCtrl, out _));
- newFile = false;
- renameFile = false;
- deleteFile = false;
- Assert.False (Application.RaiseKeyDownEvent (Key.N.WithCtrl));
- Assert.False (Application.RaiseKeyDownEvent (Key.R.WithCtrl));
- Assert.False (Application.RaiseKeyDownEvent (Key.D.WithCtrl));
- Assert.False (newFile);
- Assert.False (renameFile);
- Assert.False (deleteFile);
- top.Dispose ();
- void New () { newFile = true; }
- void Rename () { renameFile = true; }
- void Delete () { deleteFile = true; }
- }
- [Fact]
- [AutoInitShutdown]
- public void KeyBindings_With_ContextMenu_And_MenuBar ()
- {
- var newFile = false;
- var renameFile = false;
- var menuBar = new MenuBar
- {
- Menus =
- [
- new (
- "File",
- new MenuItem []
- {
- new ("New", string.Empty, New, null, null, Key.N.WithCtrl)
- })
- ]
- };
- var cm = new ContextMenu ();
- var menuItems = new MenuBarItem (
- [
- new ("Rename File", string.Empty, Rename, null, null, Key.R.WithCtrl),
- ]
- );
- var top = new Toplevel ();
- top.Add (menuBar);
- Application.Begin (top);
- Assert.True (menuBar.HotKeyBindings.TryGet (Key.N.WithCtrl, out _));
- Assert.False (menuBar.HotKeyBindings.TryGet (Key.R.WithCtrl, out _));
- Assert.Null (cm.MenuBar);
- Assert.True (Application.RaiseKeyDownEvent (Key.N.WithCtrl));
- Assert.False (Application.RaiseKeyDownEvent (Key.R.WithCtrl));
- Application.MainLoop!.RunIteration ();
- Assert.True (newFile);
- Assert.False (renameFile);
- newFile = false;
- cm.Show (menuItems);
- Assert.True (menuBar.HotKeyBindings.TryGet (Key.N.WithCtrl, out _));
- Assert.False (menuBar.HotKeyBindings.TryGet (Key.R.WithCtrl, out _));
- Assert.False (cm.MenuBar!.HotKeyBindings.TryGet (Key.N.WithCtrl, out _));
- Assert.True (cm.MenuBar.HotKeyBindings.TryGet (Key.R.WithCtrl, out _));
- Assert.True (cm.MenuBar.IsMenuOpen);
- Assert.True (Application.RaiseKeyDownEvent (Key.N.WithCtrl));
- Application.MainLoop!.RunIteration ();
- Assert.True (newFile);
- Assert.False (cm.MenuBar!.IsMenuOpen);
- cm.Show (menuItems);
- Assert.True (Application.RaiseKeyDownEvent (Key.R.WithCtrl));
- Application.MainLoop!.RunIteration ();
- Assert.True (renameFile);
- Assert.False (cm.MenuBar.IsMenuOpen);
- Assert.True (menuBar.HotKeyBindings.TryGet (Key.N.WithCtrl, out _));
- Assert.False (menuBar.HotKeyBindings.TryGet (Key.R.WithCtrl, out _));
- Assert.False (cm.MenuBar.HotKeyBindings.TryGet (Key.N.WithCtrl, out _));
- Assert.False (cm.MenuBar.HotKeyBindings.TryGet (Key.R.WithCtrl, out _));
- newFile = false;
- renameFile = false;
- Assert.True (Application.RaiseKeyDownEvent (Key.N.WithCtrl));
- Assert.False (Application.RaiseKeyDownEvent (Key.R.WithCtrl));
- Application.MainLoop!.RunIteration ();
- Assert.True (newFile);
- Assert.False (renameFile);
- top.Dispose ();
- void New () { newFile = true; }
- void Rename () { renameFile = true; }
- }
- [Fact]
- [AutoInitShutdown]
- public void KeyBindings_With_Same_Shortcut_ContextMenu_And_MenuBar ()
- {
- var newMenuBar = false;
- var newContextMenu = false;
- var menuBar = new MenuBar
- {
- Menus =
- [
- new (
- "File",
- new MenuItem []
- {
- new ("New", string.Empty, NewMenuBar, null, null, Key.N.WithCtrl)
- })
- ]
- };
- var cm = new ContextMenu ();
- var menuItems = new MenuBarItem (
- [
- new ("New File", string.Empty, NewContextMenu, null, null, Key.N.WithCtrl),
- ]
- );
- var top = new Toplevel ();
- top.Add (menuBar);
- Application.Begin (top);
- Assert.True (menuBar.HotKeyBindings.TryGet (Key.N.WithCtrl, out _));
- Assert.Null (cm.MenuBar);
- Assert.True (Application.RaiseKeyDownEvent (Key.N.WithCtrl));
- Application.MainLoop!.RunIteration ();
- Assert.True (newMenuBar);
- Assert.False (newContextMenu);
- newMenuBar = false;
- cm.Show (menuItems);
- Assert.True (menuBar.HotKeyBindings.TryGet (Key.N.WithCtrl, out _));
- Assert.True (cm.MenuBar!.HotKeyBindings.TryGet (Key.N.WithCtrl, out _));
- Assert.True (cm.MenuBar.IsMenuOpen);
- Assert.True (Application.RaiseKeyDownEvent (Key.N.WithCtrl));
- Application.MainLoop!.RunIteration ();
- Assert.False (newMenuBar);
- // The most focused shortcut is executed
- Assert.True (newContextMenu);
- Assert.False (cm.MenuBar!.IsMenuOpen);
- Assert.True (menuBar.HotKeyBindings.TryGet (Key.N.WithCtrl, out _));
- Assert.False (cm.MenuBar.HotKeyBindings.TryGet (Key.N.WithCtrl, out _));
- newMenuBar = false;
- newContextMenu = false;
- Assert.True (Application.RaiseKeyDownEvent (Key.N.WithCtrl));
- Application.MainLoop!.RunIteration ();
- Assert.True (newMenuBar);
- Assert.False (newContextMenu);
- top.Dispose ();
- void NewMenuBar () { newMenuBar = true; }
- void NewContextMenu () { newContextMenu = true; }
- }
- [Fact]
- [AutoInitShutdown]
- public void HotKeys_Removed_On_Close_ContextMenu ()
- {
- var newFile = false;
- var renameFile = false;
- var deleteFile = false;
- var cm = new ContextMenu ();
- var menuItems = new MenuBarItem (
- [
- new ("_New File", string.Empty, New, null, null),
- new ("_Rename File", string.Empty, Rename, null, null),
- new ("_Delete File", string.Empty, Delete, null, null)
- ]
- );
- var top = new Toplevel ();
- Application.Begin (top);
- Assert.Null (cm.MenuBar);
- Assert.False (Application.RaiseKeyDownEvent (Key.N.WithAlt));
- Assert.False (Application.RaiseKeyDownEvent (Key.R.WithAlt));
- Assert.False (Application.RaiseKeyDownEvent (Key.D.WithAlt));
- Assert.False (newFile);
- Assert.False (renameFile);
- Assert.False (deleteFile);
- cm.Show (menuItems);
- Assert.True (cm.MenuBar!.IsMenuOpen);
- Assert.False (cm.MenuBar!.HotKeyBindings.TryGet (Key.N.WithAlt, out _));
- Assert.False (cm.MenuBar!.HotKeyBindings.TryGet (Key.N.NoShift, out _));
- Assert.False (cm.MenuBar.HotKeyBindings.TryGet (Key.R.WithAlt, out _));
- Assert.False (cm.MenuBar.HotKeyBindings.TryGet (Key.R.NoShift, out _));
- Assert.False (cm.MenuBar.HotKeyBindings.TryGet (Key.D.WithAlt, out _));
- Assert.False (cm.MenuBar.HotKeyBindings.TryGet (Key.D.NoShift, out _));
- Assert.Equal (2, Application.Top!.SubViews.Count);
- View [] menus = Application.Top!.SubViews.Where (v => v is Menu m && m.Host == cm.MenuBar).ToArray ();
- Assert.True (menus [0].HotKeyBindings.TryGet (Key.N.WithAlt, out _));
- Assert.True (menus [0].HotKeyBindings.TryGet (Key.N.NoShift, out _));
- Assert.True (menus [0].HotKeyBindings.TryGet (Key.R.WithAlt, out _));
- Assert.True (menus [0].HotKeyBindings.TryGet (Key.R.NoShift, out _));
- Assert.True (menus [0].HotKeyBindings.TryGet (Key.D.WithAlt, out _));
- Assert.True (menus [0].HotKeyBindings.TryGet (Key.D.NoShift, out _));
- Assert.True (Application.RaiseKeyDownEvent (Key.N.WithAlt));
- Assert.False (cm.MenuBar!.IsMenuOpen);
- Application.MainLoop!.RunIteration ();
- Assert.True (newFile);
- cm.Show (menuItems);
- Assert.True (Application.RaiseKeyDownEvent (Key.R.WithAlt));
- Assert.False (cm.MenuBar.IsMenuOpen);
- Application.MainLoop!.RunIteration ();
- Assert.True (renameFile);
- cm.Show (menuItems);
- Assert.True (Application.RaiseKeyDownEvent (Key.D.WithAlt));
- Assert.False (cm.MenuBar.IsMenuOpen);
- Application.MainLoop!.RunIteration ();
- Assert.True (deleteFile);
- Assert.False (cm.MenuBar.HotKeyBindings.TryGet (Key.N.WithAlt, out _));
- Assert.False (cm.MenuBar.HotKeyBindings.TryGet (Key.N.NoShift, out _));
- Assert.False (cm.MenuBar.HotKeyBindings.TryGet (Key.R.WithAlt, out _));
- Assert.False (cm.MenuBar.HotKeyBindings.TryGet (Key.R.NoShift, out _));
- Assert.False (cm.MenuBar.HotKeyBindings.TryGet (Key.D.WithAlt, out _));
- Assert.False (cm.MenuBar.HotKeyBindings.TryGet (Key.D.NoShift, out _));
- newFile = false;
- renameFile = false;
- deleteFile = false;
- Assert.False (Application.RaiseKeyDownEvent (Key.N.WithAlt));
- Assert.False (Application.RaiseKeyDownEvent (Key.R.WithAlt));
- Assert.False (Application.RaiseKeyDownEvent (Key.D.WithAlt));
- Assert.False (newFile);
- Assert.False (renameFile);
- Assert.False (deleteFile);
- top.Dispose ();
- void New () { newFile = true; }
- void Rename () { renameFile = true; }
- void Delete () { deleteFile = true; }
- }
- [Fact]
- [AutoInitShutdown]
- public void HotKeys_With_ContextMenu_And_MenuBar ()
- {
- var newFile = false;
- var renameFile = false;
- var menuBar = new MenuBar
- {
- Menus =
- [
- new (
- "_File",
- new MenuItem []
- {
- new ("_New", string.Empty, New)
- })
- ]
- };
- var cm = new ContextMenu ();
- var menuItems = new MenuBarItem (
- [
- new MenuBarItem (
- "_Edit",
- new MenuItem []
- {
- new ("_Rename File", string.Empty, Rename)
- }
- )
- ]
- );
- var top = new Toplevel ();
- top.Add (menuBar);
- Application.Begin (top);
- Assert.True (menuBar.HotKeyBindings.TryGet (Key.F.WithAlt, out _));
- Assert.False (menuBar.HotKeyBindings.TryGet (Key.N.WithAlt, out _));
- Assert.False (menuBar.HotKeyBindings.TryGet (Key.R.WithAlt, out _));
- View [] menus = Application.Top!.SubViews.Where (v => v is Menu m && m.Host == menuBar).ToArray ();
- Assert.Empty (menus);
- Assert.Null (cm.MenuBar);
- Assert.True (Application.RaiseKeyDownEvent (Key.F.WithAlt));
- Assert.True (menuBar.IsMenuOpen);
- Assert.Equal (2, Application.Top!.SubViews.Count);
- menus = Application.Top!.SubViews.Where (v => v is Menu m && m.Host == menuBar).ToArray ();
- Assert.True (menus [0].HotKeyBindings.TryGet (Key.N.WithAlt, out _));
- Assert.True (Application.RaiseKeyDownEvent (Key.N.WithAlt));
- Assert.False (menuBar.IsMenuOpen);
- Assert.False (Application.RaiseKeyDownEvent (Key.R.WithAlt));
- Application.MainLoop!.RunIteration ();
- Assert.True (newFile);
- Assert.False (renameFile);
- newFile = false;
- cm.Show (menuItems);
- Assert.True (menuBar.HotKeyBindings.TryGet (Key.F.WithAlt, out _));
- Assert.True (menuBar.HotKeyBindings.TryGet (Key.F.NoShift, out _));
- Assert.False (menuBar.HotKeyBindings.TryGet (Key.N.WithAlt, out _));
- Assert.False (menuBar.HotKeyBindings.TryGet (Key.N.NoShift, out _));
- Assert.False (menuBar.HotKeyBindings.TryGet (Key.E.WithAlt, out _));
- Assert.False (menuBar.HotKeyBindings.TryGet (Key.E.NoShift, out _));
- Assert.False (menuBar.HotKeyBindings.TryGet (Key.R.WithAlt, out _));
- Assert.False (menuBar.HotKeyBindings.TryGet (Key.R.NoShift, out _));
- Assert.True (cm.MenuBar!.IsMenuOpen);
- Assert.False (cm.MenuBar!.HotKeyBindings.TryGet (Key.F.WithAlt, out _));
- Assert.False (cm.MenuBar!.HotKeyBindings.TryGet (Key.F.NoShift, out _));
- Assert.False (cm.MenuBar!.HotKeyBindings.TryGet (Key.N.WithAlt, out _));
- Assert.False (cm.MenuBar!.HotKeyBindings.TryGet (Key.N.NoShift, out _));
- Assert.False (cm.MenuBar!.HotKeyBindings.TryGet (Key.E.WithAlt, out _));
- Assert.False (cm.MenuBar!.HotKeyBindings.TryGet (Key.E.NoShift, out _));
- Assert.False (cm.MenuBar.HotKeyBindings.TryGet (Key.R.WithAlt, out _));
- Assert.False (cm.MenuBar.HotKeyBindings.TryGet (Key.R.NoShift, out _));
- Assert.Equal (4, Application.Top!.SubViews.Count);
- menus = Application.Top!.SubViews.Where (v => v is Menu m && m.Host == cm.MenuBar).ToArray ();
- Assert.True (menus [0].HotKeyBindings.TryGet (Key.E.WithAlt, out _));
- Assert.True (menus [0].HotKeyBindings.TryGet (Key.E.NoShift, out _));
- Assert.True (menus [1].HotKeyBindings.TryGet (Key.R.WithAlt, out _));
- Assert.True (menus [1].HotKeyBindings.TryGet (Key.R.NoShift, out _));
- Assert.True (cm.MenuBar.IsMenuOpen);
- Assert.True (Application.RaiseKeyDownEvent (Key.F.WithAlt));
- Assert.False (cm.MenuBar.IsMenuOpen);
- Assert.True (Application.RaiseKeyDownEvent (Key.N.WithAlt));
- Application.MainLoop!.RunIteration ();
- Assert.True (newFile);
- cm.Show (menuItems);
- Assert.True (cm.MenuBar.IsMenuOpen);
- Assert.Equal (4, Application.Top!.SubViews.Count);
- menus = Application.Top!.SubViews.Where (v => v is Menu m && m.Host == cm.MenuBar).ToArray ();
- Assert.True (menus [0].HotKeyBindings.TryGet (Key.E.WithAlt, out _));
- Assert.True (menus [0].HotKeyBindings.TryGet (Key.E.NoShift, out _));
- Assert.False (menus [0].HotKeyBindings.TryGet (Key.R.WithAlt, out _));
- Assert.False (menus [0].HotKeyBindings.TryGet (Key.R.NoShift, out _));
- Assert.False (menus [1].HotKeyBindings.TryGet (Key.E.WithAlt, out _));
- Assert.False (menus [1].HotKeyBindings.TryGet (Key.E.NoShift, out _));
- Assert.True (menus [1].HotKeyBindings.TryGet (Key.R.WithAlt, out _));
- Assert.True (menus [1].HotKeyBindings.TryGet (Key.R.NoShift, out _));
- Assert.True (Application.RaiseKeyDownEvent (Key.E.NoShift));
- Assert.True (Application.RaiseKeyDownEvent (Key.R.WithAlt));
- Assert.False (cm.MenuBar.IsMenuOpen);
- Application.MainLoop!.RunIteration ();
- Assert.True (renameFile);
- Assert.Equal (2, Application.Top!.SubViews.Count);
- Assert.True (menuBar.HotKeyBindings.TryGet (Key.F.WithAlt, out _));
- Assert.True (menuBar.HotKeyBindings.TryGet (Key.F.NoShift, out _));
- Assert.False (menuBar.HotKeyBindings.TryGet (Key.N.WithAlt, out _));
- Assert.False (menuBar.HotKeyBindings.TryGet (Key.N.NoShift, out _));
- Assert.False (cm.MenuBar.HotKeyBindings.TryGet (Key.E.WithAlt, out _));
- Assert.False (cm.MenuBar.HotKeyBindings.TryGet (Key.E.NoShift, out _));
- Assert.False (cm.MenuBar.HotKeyBindings.TryGet (Key.R.WithAlt, out _));
- Assert.False (cm.MenuBar.HotKeyBindings.TryGet (Key.R.NoShift, out _));
- newFile = false;
- renameFile = false;
- Assert.True (Application.RaiseKeyDownEvent (Key.F.WithAlt));
- Assert.True (Application.RaiseKeyDownEvent (Key.N.WithAlt));
- Assert.False (Application.RaiseKeyDownEvent (Key.R.WithAlt));
- Application.MainLoop!.RunIteration ();
- Assert.True (newFile);
- Assert.False (renameFile);
- top.Dispose ();
- void New () { newFile = true; }
- void Rename () { renameFile = true; }
- }
- [Fact]
- [AutoInitShutdown]
- public void Opened_MenuBar_Is_Closed_When_Another_MenuBar_Is_Opening_Also_By_HotKey ()
- {
- var menuBar = new MenuBar
- {
- Menus =
- [
- new (
- "_File",
- new MenuItem []
- {
- new ("_New", string.Empty, null)
- })
- ]
- };
- var cm = new ContextMenu ();
- var menuItems = new MenuBarItem (
- [
- new MenuBarItem (
- "_Edit",
- new MenuItem []
- {
- new ("_Rename File", string.Empty, null)
- }
- )
- ]
- );
- var top = new Toplevel ();
- top.Add (menuBar);
- Application.Begin (top);
- Assert.True (Application.RaiseKeyDownEvent (Key.F.WithAlt));
- Assert.True (menuBar.IsMenuOpen);
- cm.Show (menuItems);
- Assert.False (menuBar.IsMenuOpen);
- Assert.True (cm.MenuBar!.IsMenuOpen);
- Assert.True (Application.RaiseKeyDownEvent (Key.F.WithAlt));
- Assert.True (menuBar.IsMenuOpen);
- Assert.False (cm.MenuBar!.IsMenuOpen);
- top.Dispose ();
- }
- [Theory]
- [InlineData (1)]
- [InlineData (2)]
- [InlineData (3)]
- [AutoInitShutdown]
- public void Mouse_Pressed_Released_Clicked (int button)
- {
- var actionRaised = false;
- var menuBar = new MenuBar
- {
- Menus =
- [
- new (
- "_File",
- new MenuItem []
- {
- new ("_New", string.Empty, () => actionRaised = true)
- })
- ]
- };
- var cm = new ContextMenu ();
- var menuItems = new MenuBarItem (
- [
- new ("_Rename File", string.Empty, () => actionRaised = true)
- ]
- );
- var top = new Toplevel ();
- top.MouseClick += (s, e) =>
- {
- if (e.Flags == cm.MouseFlags)
- {
- cm.Position = new (e.Position.X, e.Position.Y);
- cm.Show (menuItems);
- e.Handled = true;
- }
- };
- top.Add (menuBar);
- Application.Begin (top);
- // MenuBar
- Application.RaiseMouseEvent (new () { Flags = MouseFlags.Button1Pressed });
- Assert.True (menuBar.IsMenuOpen);
- switch (button)
- {
- // Left Button
- case 1:
- Application.RaiseMouseEvent (new () { ScreenPosition = new (1, 2), Flags = MouseFlags.Button1Pressed });
- Assert.True (menuBar.IsMenuOpen);
- Application.MainLoop.RunIteration ();
- Assert.False (actionRaised);
- Application.RaiseMouseEvent (new () { ScreenPosition = new (1, 2), Flags = MouseFlags.Button1Released });
- Assert.True (menuBar.IsMenuOpen);
- Application.MainLoop.RunIteration ();
- Assert.False (actionRaised);
- Application.RaiseMouseEvent (new () { ScreenPosition = new (1, 2), Flags = MouseFlags.Button1Clicked });
- Assert.False (menuBar.IsMenuOpen);
- Application.MainLoop.RunIteration ();
- Assert.True (actionRaised);
- actionRaised = false;
- break;
- // Middle Button
- case 2:
- // Right Button
- case 3:
- Application.RaiseMouseEvent (new () { ScreenPosition = new (1, 2), Flags = MouseFlags.Button3Pressed });
- Assert.True (menuBar.IsMenuOpen);
- Application.MainLoop.RunIteration ();
- Assert.False (actionRaised);
- Application.RaiseMouseEvent (new () { ScreenPosition = new (1, 2), Flags = MouseFlags.Button3Released });
- Assert.True (menuBar.IsMenuOpen);
- Application.MainLoop.RunIteration ();
- Assert.False (actionRaised);
- Application.RaiseMouseEvent (new () { ScreenPosition = new (1, 2), Flags = MouseFlags.Button3Clicked });
- Assert.True (menuBar.IsMenuOpen);
- Application.MainLoop.RunIteration ();
- Assert.False (actionRaised);
- break;
- }
- // ContextMenu
- Application.RaiseMouseEvent (new () { ScreenPosition = new (0, 4), Flags = cm.MouseFlags });
- Assert.False (menuBar.IsMenuOpen);
- Assert.True (cm.MenuBar!.IsMenuOpen);
- switch (button)
- {
- // Left Button
- case 1:
- Application.RaiseMouseEvent (new () { ScreenPosition = new (1, 6), Flags = MouseFlags.Button1Pressed });
- Assert.True (cm.MenuBar!.IsMenuOpen);
- Application.MainLoop.RunIteration ();
- Assert.False (actionRaised);
- Application.RaiseMouseEvent (new () { ScreenPosition = new (1, 6), Flags = MouseFlags.Button1Released });
- Assert.True (cm.MenuBar!.IsMenuOpen);
- Application.MainLoop.RunIteration ();
- Assert.False (actionRaised);
- Application.RaiseMouseEvent (new () { ScreenPosition = new (1, 6), Flags = MouseFlags.Button1Clicked });
- Assert.False (cm.MenuBar!.IsMenuOpen);
- Application.MainLoop.RunIteration ();
- Assert.True (actionRaised);
- actionRaised = false;
- break;
- // Middle Button
- case 2:
- Application.RaiseMouseEvent (new () { ScreenPosition = new (1, 4), Flags = MouseFlags.Button2Pressed });
- Assert.False (cm.MenuBar!.IsMenuOpen);
- Application.MainLoop.RunIteration ();
- Assert.False (actionRaised);
- Application.RaiseMouseEvent (new () { ScreenPosition = new (1, 4), Flags = MouseFlags.Button2Released });
- Assert.False (cm.MenuBar!.IsMenuOpen);
- Application.MainLoop.RunIteration ();
- Assert.False (actionRaised);
- Application.RaiseMouseEvent (new () { ScreenPosition = new (1, 4), Flags = MouseFlags.Button2Clicked });
- Assert.False (cm.MenuBar!.IsMenuOpen);
- Application.MainLoop.RunIteration ();
- Assert.False (actionRaised);
- break;
- // Right Button
- case 3:
- Application.RaiseMouseEvent (new () { ScreenPosition = new (1, 4), Flags = MouseFlags.Button3Pressed });
- Assert.False (cm.MenuBar!.IsMenuOpen);
- Application.MainLoop.RunIteration ();
- Assert.False (actionRaised);
- Application.RaiseMouseEvent (new () { ScreenPosition = new (1, 4), Flags = MouseFlags.Button3Released });
- Assert.False (cm.MenuBar!.IsMenuOpen);
- Application.MainLoop.RunIteration ();
- Assert.False (actionRaised);
- Application.RaiseMouseEvent (new () { ScreenPosition = new (1, 4), Flags = MouseFlags.Button3Clicked });
- // MouseFlags is the same as cm.MouseFlags. So the context menu is closed and reopened again
- Assert.True (cm.MenuBar!.IsMenuOpen);
- Application.MainLoop.RunIteration ();
- Assert.False (actionRaised);
- break;
- }
- top.Dispose ();
- }
- [Fact]
- [AutoInitShutdown]
- public void Menu_Without_SubMenu_Is_Closed_When_Pressing_Key_Right_Or_Key_Left ()
- {
- var cm = new ContextMenu ();
- var menuItems = new MenuBarItem (
- [
- new ("_New", string.Empty, null),
- new ("_Save", string.Empty, null)
- ]
- );
- var top = new Toplevel ();
- Application.Begin (top);
- cm.Show (menuItems);
- Assert.True (cm.MenuBar!.IsMenuOpen);
- Assert.True (Application.RaiseKeyDownEvent (Key.CursorRight));
- Assert.False (cm.MenuBar!.IsMenuOpen);
- cm.Show (menuItems);
- Assert.True (cm.MenuBar!.IsMenuOpen);
- Assert.True (Application.RaiseKeyDownEvent (Key.CursorLeft));
- Assert.False (cm.MenuBar!.IsMenuOpen);
- top.Dispose ();
- }
- }
|