using SCI.CursesWrapper; using SCI.CursesWrapper.UiElements; using ANSI_Fahrplan.Screens; using Mindmagma.Curses; namespace ANSI_Fahrplan; class Program { private static void Main (string [] args) { /** * General procedure: * - Draw welcome screen * - User picks the view they want to see * - Data is being pulled from server * - Data is being read, processed and displayed in the selected view * - User can scroll up and down with Up and Down the view if it is longer than one page * - User can change date, room, speaker etc. by pressing left and right * - User can change the list type with function keys **/ var screen = CursesWrapper.InitNCurses (); // -- Screen-wide input handler -- // var inputHandler = new InputHandler (); inputHandler.StartListening (); // Register global quit key inputHandler.OnKeyPressPrivileged += (object sender, NCursesKeyPressEventArgs e) => { if (!CursesWrapper.KeyPressIsCtrl (e.KeyCode, 'q')) return; NCurses.EndWin (); Console.WriteLine ("Bye-bye!"); Environment.Exit (0); }; // -- Content Window -- // // // This window contains all the dynamic content between // the menu and status bars var contentWindow = new ContentWindow (screen, inputHandler) { BorderEnabled = true }; // -- Intro screen -- // var introScreen = new IntroScreen (contentWindow); introScreen.RegisterInputHandler (inputHandler); introScreen.SetWindowActive (); // Wait until intro screen is closed while (introScreen.WindowId > -1) Thread.Sleep (50); // TODO; Unjank this introScreen = null; // -- Create footer bar -- // var footerWindow = new FooterWindow (screen); footerWindow.DrawFooter ("Fahrplan", "LLLeft", "RRRRRight"); // -- Create menu bar -- // var topMenu = new TopMenu (screen, inputHandler, CreateMenuItems (contentWindow)); topMenu.ActivateItem (topMenu.MenuItems [1]); // Wait until the input handler routine stops while (inputHandler.IsListening ()) Thread.Sleep (50); NCurses.EndWin (); Console.WriteLine ("Oh wow, the input handler crashed, that's not supposed to happen. Sorry!"); Environment.Exit (1); } private static List CreateMenuItems (ContentWindow contentWindow) { var helpItem = new MenuItem ("Help", "F1"); var upcomingItem = new MenuItem ("Upcoming", "F2"); var byDayItem = new MenuItem ("By Day", "F3"); var byRoomItem = new MenuItem ("By Room", "F4"); var bySpeakerItem = new MenuItem ("By Speaker", "F5"); var quitItem = new MenuItem ("Quit (C-q)"); helpItem.OnItemActivated += (object sender, MenuItemActivatedEventArgs e) => { var scrollWindow = contentWindow.CreateInnerScrollWindow (); for (int i = 0; i <= 100; i++) scrollWindow.AddContent ($"Line {i} {AsciiArt.lorem_ipsum}\n"); scrollWindow.RenderCurrentViewport (); }; upcomingItem.OnItemActivated += (object sender, MenuItemActivatedEventArgs e) => { var scrollWindow = contentWindow.CreateInnerScrollWindow (); scrollWindow.AddContent ("-- Upcoming --"); scrollWindow.RenderCurrentViewport (); }; return new List { helpItem, upcomingItem, byDayItem, byRoomItem, bySpeakerItem, quitItem }; } }