]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/menu/command/menu_cmd.qc
Merge MR 'Various Q3 and QL map entity features and fixes'
[xonotic/xonotic-data.pk3dir.git] / qcsrc / menu / command / menu_cmd.qc
index bd45230c97ab61964f43a7153d69242fb896e38c..97deef1d47210678c81f470a22514cd7b7639bfd 100644 (file)
@@ -3,10 +3,12 @@
 #include "../menu.qh"
 #include "../item.qh"
 
+#include <menu/item/dialog.qh>
 #include <menu/mutators/_mod.qh>
 
 #include <common/command/_mod.qh>
 
+.void(entity me, int argsbuf) readInputArgs;
 .entity firstChild, nextSibling;
 
 string _dumptree_space;
@@ -43,14 +45,17 @@ void GameCommand(string theCommand)
        int argc = tokenize_console(theCommand);
        string ss = strtolower(argv(0));
 
+       // TODO port these commands to the command system
        if (argv(0) == "help" || argc == 0)
        {
-               LOG_INFO(_("Usage: menu_cmd command..., where possible commands are:"));
-               LOG_INFO(_("  sync - reloads all cvars on the current menu page"));
-               LOG_INFO(_("  directmenu ITEM - select a menu item as main item"));
-               LOG_INFO(_("  dumptree - dump the state of the menu as a tree to the console"));
-
-               LOG_INFO("Generic commands shared by all programs:");
+               LOG_HELP("Usage:^3 menu_cmd <command> [<item>], where possible commands are:");
+               LOG_HELP("  'sync' reloads all cvars on the current menu page");
+               LOG_HELP("  'directmenu' shows the menu window named <item> (or the menu window containing an item named <item>)");
+               LOG_HELP("  'closemenu' closes the menu window named <item> (or the menu window containing an item named <item>)");
+               LOG_HELP("   if <item> is not specified it shows the list of available items in the console");
+               LOG_HELP("  'dumptree' dumps the state of the menu as a tree to the console");
+
+               LOG_HELP("\nGeneric commands shared by all programs:");
                GenericCommand_macro_help();
 
                return;
@@ -70,14 +75,25 @@ void GameCommand(string theCommand)
                return;
        }
 
-       if (argv(0) == "directmenu" || argv(0) == "directpanelhudmenu")
+       string cmd = argv(0);
+       string filter = string_null;
+       bool close_mode = false;
+       if (cmd == "closemenu")
+       {
+               close_mode = true;
+               cmd = "directmenu";
+       }
+       else if (cmd == "directpanelhudmenu")
        {
-               string filter = string_null;
-               if (argv(0) == "directpanelhudmenu") filter = "HUD";
+               filter = "HUD";
+               cmd = "directmenu";
+       }
 
+       if (cmd == "directmenu")
+       {
                if (argc == 1)
                {
-                       LOG_INFO(_("Available options:"));
+                       LOG_HELP("Available items (* = closable):");
 
                        FOREACH_ENTITY_ORDERED(it.name != "", {
                                if (it.classname == "vtbl") continue;
@@ -87,14 +103,64 @@ void GameCommand(string theCommand)
                                        if (!startsWith(s, filter)) continue;
                                        s = substring(s, strlen(filter), strlen(s) - strlen(filter));
                                }
-                               LOG_INFOF(" %s", s);
+                               if (it.instanceOfContainer && it.closable)
+                                       LOG_HELP(" * ", s);
+                               else
+                                       LOG_HELP("   ", s);
                        });
                }
-               else if (argc == 2 && !isdemo())     // don't allow this command in demos
+               else if (argc == 2 && !close_mode && (!isdemo() || argv(1) == "Welcome")) // don't allow this command in demos
                {
                        m_play_click_sound(MENU_SOUND_OPEN);
                        m_goto(strcat(filter, argv(1))); // switch to a menu item
                }
+               else if(argc > 2 && (!isdemo() || argv(1) == "Welcome"))
+               {
+                       entity e = NULL;
+                       float argsbuf = 0;
+                       string s = strzone(argv(1)); // dialog name
+                       for(int i = 0; (e = nextent(e)); )
+                               if(e.classname != "vtbl" && e.name == strcat(filter, s))
+                               {
+                                       argsbuf = buf_create();
+                                       if(argsbuf >= 0)
+                                       if(e.readInputArgs)
+                                       {
+                                               for(i = 2; i < argc; ++i)
+                                                       bufstr_add(argsbuf, argv(i), 1);
+                                               e.readInputArgs(e, argsbuf);
+                                               if (!close_mode)
+                                                       m_goto(strcat(filter, s));
+                                       }
+                                       if(argsbuf >= 0)
+                                               buf_del(argsbuf);
+
+                                       // NOTE input args are read even in close mode
+                                       if (close_mode)
+                                       {
+                                               if (e.instanceOfContainer && e.closable && e.focused)
+                                                       Dialog_Close(e, e);
+                                       }
+                               }
+               }
+               return;
+       }
+
+       if (argv(0) == "nexposee")
+       {
+               m_goto("nexposee");
+               return;
+       }
+
+       if (argv(0) == "servers")
+       {
+               m_goto("servers");
+               return;
+       }
+
+       if (argv(0) == "profile")
+       {
+               m_goto("profile");
                return;
        }
 
@@ -110,6 +176,18 @@ void GameCommand(string theCommand)
                return;
        }
 
+       if (argv(0) == "settings")
+       {
+               m_goto("settings");
+               return;
+       }
+
+       if (argv(0) == "inputsettings")
+       {
+               m_goto("inputsettings");
+               return;
+       }
+
        if (argv(0) == "videosettings")
        {
                m_goto("videosettings");
@@ -126,5 +204,5 @@ void GameCommand(string theCommand)
        if(MUTATOR_CALLHOOK(Menu_ConsoleCommand, ss, argc, theCommand)) // handled by a mutator
                return;
 
-       LOG_INFO(_("Invalid command. For a list of supported commands, try menu_cmd help."));
+       LOG_INFO("Invalid command. For a list of supported commands, try menu_cmd help.");
 }