]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/menu/nexuiz/slider_resolution.c
show only available resolutions
[divverent/nexuiz.git] / data / qcsrc / menu / nexuiz / slider_resolution.c
1 #ifdef INTERFACE
2 CLASS(NexuizResolutionSlider) EXTENDS(NexuizTextSlider)
3         METHOD(NexuizResolutionSlider, configureNexuizResolutionSlider, void(entity))
4         METHOD(NexuizResolutionSlider, addResolution, void(entity, float, float, float, float))
5         METHOD(NexuizResolutionSlider, loadCvars, void(entity))
6         METHOD(NexuizResolutionSlider, saveCvars, void(entity))
7 ENDCLASS(NexuizResolutionSlider)
8 entity makeNexuizResolutionSlider();
9 #endif
10
11 #ifdef IMPLEMENTATION
12 entity makeNexuizResolutionSlider()
13 {
14         entity me;
15         me = spawnNexuizResolutionSlider();
16         me.configureNexuizResolutionSlider(me);
17         return me;
18 }
19 void addResolutionNexuizResolutionSlider(entity me, float w, float h, float cw, float ch)
20 {
21         float f;
22         f = max(cw / w, ch / h);
23         if(f > 1)
24         {
25                 cw = rint(cw / f);
26                 ch = rint(ch / f);
27         }
28         me.addValue(me, strzone(strcat(ftos(w), "x", ftos(h))), strzone(strcat(ftos(w), " ", ftos(h), " ", ftos(cw), " ", ftos(ch))));
29         // FIXME (in case you ever want to dynamically instantiate this): THIS IS NEVER FREED
30 }
31 void configureNexuizResolutionSliderNexuizResolutionSlider(entity me)
32 {
33         float i;
34         vector r0, r, c;
35
36         me.configureNexuizTextSlider(me, "vid_width");
37
38         c = '0 0 0';
39         r0 = '0 0 0';
40         for(i = 0;; ++i)
41         {
42                 r = getresolution(i);
43                 if(r_x == 0 && r_y == 0)
44                         break;
45                 if(r == r0)
46                         continue;
47                 r0 = r;
48                 if(r_x < 640 || r_y < 400)
49                         continue;
50                 c_x = 800;
51                 c_y = rint(c_x * r_y / r_x);
52                 if(c_y >= 600)
53                 {
54                         me.addResolution(me, r_x, r_y, c_x, c_y);
55                         continue;
56                 }
57                 c_y = 600;
58                 c_x = rint(c_y * r_x / r_y);
59                 me.addResolution(me, r_x, r_y, c_x, c_y);
60         }
61
62         me.configureNexuizTextSliderValues(me);
63 }
64 void loadCvarsNexuizResolutionSlider(entity me)
65 {
66         me.setValueFromIdentifier(me, strcat(cvar_string("vid_width"), " ", cvar_string("vid_height"), " ", cvar_string("menu_vid_conwidth"), " ", cvar_string("menu_vid_conheight")));
67 }
68 void saveCvarsNexuizResolutionSlider(entity me)
69 {
70         if(me.value >= 0 || me.value < me.nValues)
71         {
72                 tokenize_console(me.getIdentifier(me));
73                 cvar_set("vid_width", argv(0));
74                 cvar_set("vid_height", argv(1));
75                 cvar_set("menu_vid_conwidth", argv(2));
76                 cvar_set("menu_vid_conheight", argv(3));
77         }
78 }
79 #endif