]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
add a language selector
authorRudolf Polzer <divverent@alientrap.org>
Tue, 18 Jan 2011 08:15:01 +0000 (09:15 +0100)
committerRudolf Polzer <divverent@alientrap.org>
Tue, 18 Jan 2011 08:16:08 +0000 (09:16 +0100)
languages.txt [new file with mode: 0644]
qcsrc/menu/classes.c
qcsrc/menu/gamecommand.qc
qcsrc/menu/menu.qc
qcsrc/menu/menu.qh
qcsrc/menu/xonotic/languagelist.c [new file with mode: 0644]

diff --git a/languages.txt b/languages.txt
new file mode 100644 (file)
index 0000000..15b3491
--- /dev/null
@@ -0,0 +1,3 @@
+de German "Deutsch"
+en English "English"
+fr French "Français"
index db01a6ae60f2768142f0ddd5cc4ee73b6e0fd447..b85546569a862e7c6d163d98833bd9a168ee53be 100644 (file)
@@ -62,6 +62,7 @@
 #include "xonotic/gametypelist.c"
 #include "xonotic/maplist.c"
 #include "xonotic/skinlist.c"
+#include "xonotic/languagelist.c"
 #include "xonotic/image.c"
 #include "xonotic/crosshairbutton.c"
 #include "xonotic/playermodel.c"
index 2b5862c82315bea7d8ac98d58e2e00ac71c71eef..f3d780b6f55fe7edf13e8e18129b44199b110a6a 100644 (file)
@@ -100,6 +100,12 @@ void GameCommand(string theCommand)
                return;
        }
 
+       if(argv(0) == "languageselect")
+       {
+               m_goto_language_selector();
+               return;
+       }
+
        if(argv(0) == "videosettings")
        {
                m_goto_video_settings();
index fbdbdd2e7f7edd36b6a90f6ba243d03fc5768018..8e95cc1dbd036ae6900074cbf219183689973dda 100644 (file)
@@ -853,10 +853,18 @@ void() m_goto_skin_selector =
        m_goto("skinselector");
 }
 
+void() m_goto_language_selector =
+{
+       if(!menuInitialized)
+               return;
+       // TODO add code to switch back to the language selector (no idea how to do it now)
+       m_goto("languageselector");
+}
+
 void() m_goto_video_settings =
 {
        if(!menuInitialized)
                return;
-       // TODO add code to switch back to the skin selector (no idea how to do it now)
+       // TODO add code to switch back to the video settings (no idea how to do it now)
        m_goto("videosettings");
 }
index 903700d5d54d5529e174a07feb4fc9a797569c6d..e42595e58265e8ba3553a2a3fd698931f2b6a2c6 100644 (file)
@@ -27,6 +27,7 @@ void m_hide();
 void m_display();
 void m_goto(string name);
 void m_goto_skin_selector();
+void m_goto_language_selector();
 void m_goto_video_settings();
 .string name;
 
diff --git a/qcsrc/menu/xonotic/languagelist.c b/qcsrc/menu/xonotic/languagelist.c
new file mode 100644 (file)
index 0000000..510c7a9
--- /dev/null
@@ -0,0 +1,188 @@
+#ifdef INTERFACE
+CLASS(XonoticLanguageList) EXTENDS(XonoticListBox)
+       METHOD(XonoticLanguageList, configureXonoticLanguageList, void(entity))
+       ATTRIB(XonoticLanguageList, rowsPerItem, float, 1)
+       METHOD(XonoticLanguageList, drawListBoxItem, void(entity, float, vector, float))
+       METHOD(XonoticLanguageList, resizeNotify, void(entity, vector, vector, vector, vector))
+       METHOD(XonoticLanguageList, setSelected, void(entity, float))
+       METHOD(XonoticLanguageList, loadCvars, void(entity))
+       METHOD(XonoticLanguageList, saveCvars, void(entity))
+
+       ATTRIB(XonoticLanguageList, realFontSize, vector, '0 0 0')
+       ATTRIB(XonoticLanguageList, realUpperMargin, float, 0)
+       ATTRIB(XonoticLanguageList, columnNameOrigin, float, 0)
+       ATTRIB(XonoticLanguageList, columnNameSize, float, 0)
+
+       METHOD(XonoticLanguageList, clickListBoxItem, void(entity, float, vector)) // double click handling
+       METHOD(XonoticLanguageList, keyDown, float(entity, float, float, float)) // enter handling
+       ATTRIB(XonoticLanguageList, lastClickedLanguage, float, -1)
+       ATTRIB(XonoticLanguageList, lastClickedTime, float, 0)
+
+       METHOD(XonoticLanguageList, destroy, void(entity))
+
+       ATTRIB(XonoticLanguageList, languagelist, float, -1)
+       METHOD(XonoticLanguageList, getLanguages, void(entity))
+       METHOD(XonoticLanguageList, setLanguage, void(entity))
+       METHOD(XonoticLanguageList, languageParameter, string(entity, float, float))
+
+       ATTRIB(XonoticLanguageList, name, string, "languageselector") // change this to make it noninteractive (for first run dialog)
+ENDCLASS(XonoticLanguageList)
+
+entity makeXonoticLanguageList();
+void SetLanguage_Click(entity btn, entity me);
+#endif
+
+#ifdef IMPLEMENTATION
+
+#define LANGPARM_ID 0
+#define LANGPARM_NAME 1
+#define LANGPARM_NAME_LOCALIZED 2
+#define LANGPARM_COUNT 3
+
+entity makeXonoticLanguageList()
+{
+       entity me;
+       me = spawnXonoticLanguageList();
+       me.configureXonoticLanguageList(me);
+       return me;
+}
+
+void XonoticLanguageList_configureXonoticLanguageList(entity me)
+{
+       me.configureXonoticListBox(me);
+       me.getLanguages(me);
+       me.loadCvars(me);
+}
+
+void XonoticLanguageList_drawListBoxItem(entity me, float i, vector absSize, float isSelected)
+{
+       string s;
+       if(isSelected)
+               draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED);
+       s = me.languageParameter(me, i, LANGPARM_NAME_LOCALIZED);
+       draw_Text(me.realUpperMargin * eY + (me.columnNameOrigin + (me.columnNameSize - draw_TextWidth(s, 0, me.realFontSize)) * 0.5) * eX, s, me.realFontSize, '1 1 1', SKINALPHA_TEXT, 0);
+}
+
+void XonoticLanguageList_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
+{
+       SUPER(XonoticLanguageList).resizeNotify(me, relOrigin, relSize, absOrigin, absSize);
+       me.realFontSize_y = me.fontSize / (absSize_y * me.itemHeight);
+       me.realFontSize_x = me.fontSize / (absSize_x * (1 - me.controlWidth));
+       me.realUpperMargin = 0.5 * (1 - me.realFontSize_y);
+       me.columnNameOrigin = 0;
+       me.columnNameSize = 1;
+}
+
+void XonoticLanguageList_setSelected(entity me, float i)
+{
+       SUPER(XonoticLanguageList).setSelected(me, i);
+       me.saveCvars(me);
+}
+
+void XonoticLanguageList_loadCvars(entity me)
+{
+       string s;
+       float i, n;
+       s = cvar_string("prvm_language");
+       n = me.nItems;
+
+       // default to English
+       for(i = 0; i < n; ++i)
+       {
+               if(me.languageParameter(me, i, LANGPARM_ID) == "en")
+               {
+                       me.selectedItem = i;
+                       break;
+               }
+       }
+
+        // otherwise, find the language
+       for(i = 0; i < n; ++i)
+       {
+               if(me.languageParameter(me, i, LANGPARM_ID) == s)
+               {
+                       me.selectedItem = i;
+                       break;
+               }
+       }
+}
+
+void XonoticLanguageList_saveCvars(entity me)
+{
+       cvar_set("prvm_language", me.languageParameter(me, me.selectedItem, LANGPARM_ID));
+}
+
+void XonoticLanguageList_clickListBoxItem(entity me, float i, vector where)
+{
+       if(me.name != "languageselector")
+               return;
+       if(i == me.lastClickedLanguage)
+               if(time < me.lastClickedTime + 0.3)
+               {
+                       // DOUBLE CLICK!
+                       me.setSelected(me, i);
+                       me.setLanguage(me);
+               }
+       me.lastClickedLanguage = i;
+       me.lastClickedTime = time;
+}
+
+float XonoticLanguageList_keyDown(entity me, float scan, float ascii, float shift)
+{
+       if(me.name != "languageselector")
+               return SUPER(XonoticLanguageList).keyDown(me, scan, ascii, shift);
+       if(scan == K_ENTER || scan == K_KP_ENTER) {
+               me.setLanguage(me);
+               return 1;
+       }
+       else
+               return SUPER(XonoticLanguageList).keyDown(me, scan, ascii, shift);
+}
+
+void XonoticLanguageList_destroy(entity me)
+{
+       buf_del(me.languagelist);
+}
+
+void XonoticLanguageList_getLanguages(entity me)
+{
+       float buf, i, n, fh;
+       string s;
+
+       buf = buf_create();
+
+       fh = fopen("languages.txt", FILE_READ);
+       while((s = fgets(fh)))
+       {
+               n = tokenize_console(s);
+               if(n < 3)
+                       continue;
+               bufstr_set(buf, i * LANGPARM_COUNT + LANGPARM_ID, argv(0));
+               bufstr_set(buf, i * LANGPARM_COUNT + LANGPARM_NAME, argv(1));
+               bufstr_set(buf, i * LANGPARM_COUNT + LANGPARM_NAME_LOCALIZED, argv(2));
+               ++i;
+       }
+       fclose(fh);
+
+       me.languagelist = buf;
+       me.nItems = i;
+}
+
+void XonoticLanguageList_setLanguage(entity me)
+{
+       if(me.name != "languageselector")
+               return;
+       localcmd("\nmenu_restart\ntogglemenu\ndefer 0.1 \"menu_cmd languageselect\"\n");
+}
+
+string XonoticLanguageList_languageParameter(entity me, float i, float key)
+{
+       return bufstr_get(me.languagelist, i * LANGPARM_COUNT + key);
+}
+
+void SetLanguage_Click(entity btn, entity me)
+{
+       me.setLanguage(me);
+}
+
+#endif