]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/menu-div0test/item/dialog.c
preload all pictures; actually edit g_maplist; add all/none buttons
[divverent/nexuiz.git] / data / qcsrc / menu-div0test / item / dialog.c
1 // Note: this class is called Dialog, but it can also handle a tab under the following conditions:
2 // - isTabRoot is 0
3 // - backgroundImage is the tab's background
4 // - closable is 0
5 // - rootDialog is 0
6 // - title is ""
7 // - marginTop is 
8 // - intendedHeight ends up to be the tab's actual height, or at least close
9 // - titleFontSize is 0
10 // - marginTop cancels out as much of titleHeight as needed (that is, it should be actualMarginTop - titleHeight)
11 // To ensure the latter, you best create all tabs FIRST and insert the tabbed
12 // control to your dialog THEN - with the right height
13 //
14 // a subclass may help with using this as a tab
15
16 #ifdef INTERFACE
17 CLASS(Dialog) EXTENDS(InputContainer)
18         METHOD(Dialog, configureDialog, void(entity)) // no runtime configuration, all parameters are given in the code!
19         METHOD(Dialog, fill, void(entity)) // to be overridden by user to fill the dialog with controls
20         METHOD(Dialog, keyDown, float(entity, float, float, float))
21         METHOD(Dialog, close, void(entity))
22         METHOD(Dialog, addItemSimple, void(entity, float, float, float, float, entity, vector))
23
24         METHOD(Dialog, TD, void(entity, float, float, entity))
25         METHOD(Dialog, TDNoMargin, void(entity, float, float, entity, vector))
26         METHOD(Dialog, TDempty, void(entity, float))
27         METHOD(Dialog, setFirstColumn, void(entity, float))
28         METHOD(Dialog, TR, void(entity))
29         METHOD(Dialog, gotoXY, void(entity, float, float))
30
31         ATTRIB(Dialog, isTabRoot, float, 1)
32         ATTRIB(Dialog, closeButton, entity, NULL)
33         ATTRIB(Dialog, intendedHeight, float, 0)
34         ATTRIB(Dialog, itemOrigin, vector, '0 0 0')
35         ATTRIB(Dialog, itemSize, vector, '0 0 0')
36         ATTRIB(Dialog, itemSpacing, vector, '0 0 0')
37         ATTRIB(Dialog, currentRow, float, 0)
38         ATTRIB(Dialog, currentColumn, float, 0)
39         ATTRIB(Dialog, firstColumn, float, 0)
40
41         // to be customized
42         ATTRIB(Dialog, closable, float, 1)
43         ATTRIB(Dialog, title, string, "Form1") // ;)
44         ATTRIB(Dialog, color, vector, '1 0.5 1')
45         ATTRIB(Dialog, intendedWidth, float, 0)
46         ATTRIB(Dialog, rows, float, 3)
47         ATTRIB(Dialog, columns, float, 2)
48
49         ATTRIB(Dialog, marginTop, float, 0) // pixels
50         ATTRIB(Dialog, marginBottom, float, 0) // pixels
51         ATTRIB(Dialog, marginLeft, float, 0) // pixels
52         ATTRIB(Dialog, marginRight, float, 0) // pixels
53         ATTRIB(Dialog, columnSpacing, float, 0) // pixels
54         ATTRIB(Dialog, rowSpacing, float, 0) // pixels
55         ATTRIB(Dialog, rowHeight, float, 0) // pixels
56         ATTRIB(Dialog, titleHeight, float, 0) // pixels
57         ATTRIB(Dialog, titleFontSize, float, 0) // pixels; if 0, title causes no margin
58
59         ATTRIB(Dialog, backgroundImage, string, string_null)
60         ATTRIB(Dialog, closeButtonImage, string, string_null)
61 ENDCLASS(Dialog)
62 #endif
63
64 #ifdef IMPLEMENTATION
65 void Dialog_Close(entity button, entity me)
66 {
67         me.close(me);
68 }
69
70 void fillDialog(entity me)
71 {
72 }
73
74 void addItemSimpleDialog(entity me, float row, float col, float rowspan, float colspan, entity e, vector v)
75 {
76         //print(vtos(me.itemSpacing), " ", vtos(me.itemSize), "\n");
77         vector o, s;
78         o = me.itemOrigin + eX * ( col          * me.itemSpacing_x) + eY * ( row          * me.itemSpacing_y);
79         s = me.itemSize   + eX * ((colspan - 1) * me.itemSpacing_x) + eY * ((rowspan - 1) * me.itemSpacing_y);
80         o_x -= 0.5 * (me.itemSpacing_x - me.itemSize_x) * v_x;
81         s_x +=       (me.itemSpacing_x - me.itemSize_x) * v_x;
82         o_y -= 0.5 * (me.itemSpacing_y - me.itemSize_y) * v_y;
83         s_y +=       (me.itemSpacing_y - me.itemSize_y) * v_y;
84         me.addItem(me, e, o, s, 1);
85 }
86
87 void gotoXYDialog(entity me, float row, float col)
88 {
89         me.currentRow = row;
90         me.currentColumn = col;
91 }
92
93 void TRDialog(entity me)
94 {
95         me.currentRow += 1;
96         me.currentColumn = me.firstColumn;
97 }
98
99 void TDDialog(entity me, float rowspan, float colspan, entity e)
100 {
101         me.addItemSimple(me, me.currentRow, me.currentColumn, rowspan, colspan, e, '0 0 0');
102         me.currentColumn += colspan;
103 }
104
105 void TDNoMarginDialog(entity me, float rowspan, float colspan, entity e, vector v)
106 {
107         me.addItemSimple(me, me.currentRow, me.currentColumn, rowspan, colspan, e, v);
108         me.currentColumn += colspan;
109 }
110
111 void setFirstColumnDialog(entity me, float col)
112 {
113         me.firstColumn = col;
114 }
115
116 void TDemptyDialog(entity me, float colspan)
117 {
118         me.currentColumn += colspan;
119 }
120
121 void configureDialogDialog(entity me)
122 {
123         entity frame, closebutton;
124         float absWidth, absHeight;
125
126         frame = spawnBorderImage();
127         frame.configureBorderImage(frame, me.title, me.titleFontSize, me.color, me.backgroundImage, me.titleHeight);
128         me.addItem(me, frame, '0 0 0', '1 1 0', 1);
129
130         if not(me.titleFontSize)
131                 me.titleHeight = 0; // no title bar
132
133         absWidth = me.intendedWidth * cvar("vid_conwidth");
134         absHeight = me.titleHeight + me.marginTop + me.rows * me.rowHeight + (me.rows - 1) * me.rowSpacing + me.marginBottom;
135         me.itemOrigin  = eX * (me.marginLeft / absWidth)
136                        + eY * ((me.titleHeight + me.marginTop) / absHeight);
137         me.itemSize    = eX * ((1 - (me.marginLeft + me.marginRight + me.columnSpacing * (me.columns - 1)) / absWidth) / me.columns)
138                        + eY * (me.rowHeight / absHeight);
139         me.itemSpacing = me.itemSize
140                        + eX * (me.columnSpacing / absWidth)
141                        + eY * (me.rowSpacing / absHeight);
142         me.intendedHeight = absHeight / cvar("vid_conheight");
143         me.currentRow = -1;
144         me.currentColumn = -1;
145
146         me.fill(me);
147
148         if(me.closable)
149         {
150                 closebutton = me.closeButton = spawnButton();
151                 closebutton.configureButton(closebutton, "Close", 0, me.closeButtonImage);
152                 closebutton.onClick = Dialog_Close; closebutton.onClickEntity = me;
153                 closebutton.srcMulti = 0;
154                 me.addItem(me, closebutton, '0 0 0', '1 1 0', 1); // put it as LAST
155         }
156
157         frame.closeButton = closebutton;
158 }
159
160 void closeDialog(entity me)
161 {
162         if(me.parent.instanceOfNexposee)
163         {
164                 ExposeeCloseButton_Click(me, me.parent);
165         }
166         else if(me.parent.instanceOfModalController)
167         {
168                 DialogCloseButton_Click(me, me);
169         }
170 }
171
172 float keyDownDialog(entity me, float key, float ascii, float shift)
173 {
174         if(me.closable)
175         {
176                 if(key == K_ESCAPE)
177                 {
178                         me.close(me);
179                         return 1;
180                 }
181         }
182         return keyDownInputContainer(me, key, ascii, shift);
183 }
184 #endif