]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/menu-div0test/item/dialog.c
add map info dialog
[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
62         ATTRIB(Dialog, frame, entity, NULL)
63 ENDCLASS(Dialog)
64 #endif
65
66 #ifdef IMPLEMENTATION
67 void Dialog_Close(entity button, entity me)
68 {
69         me.close(me);
70 }
71
72 void fillDialog(entity me)
73 {
74 }
75
76 void addItemSimpleDialog(entity me, float row, float col, float rowspan, float colspan, entity e, vector v)
77 {
78         //print(vtos(me.itemSpacing), " ", vtos(me.itemSize), "\n");
79         vector o, s;
80         o = me.itemOrigin + eX * ( col          * me.itemSpacing_x) + eY * ( row          * me.itemSpacing_y);
81         s = me.itemSize   + eX * ((colspan - 1) * me.itemSpacing_x) + eY * ((rowspan - 1) * me.itemSpacing_y);
82         o_x -= 0.5 * (me.itemSpacing_x - me.itemSize_x) * v_x;
83         s_x +=       (me.itemSpacing_x - me.itemSize_x) * v_x;
84         o_y -= 0.5 * (me.itemSpacing_y - me.itemSize_y) * v_y;
85         s_y +=       (me.itemSpacing_y - me.itemSize_y) * v_y;
86         me.addItem(me, e, o, s, 1);
87 }
88
89 void gotoXYDialog(entity me, float row, float col)
90 {
91         me.currentRow = row;
92         me.currentColumn = col;
93 }
94
95 void TRDialog(entity me)
96 {
97         me.currentRow += 1;
98         me.currentColumn = me.firstColumn;
99 }
100
101 void TDDialog(entity me, float rowspan, float colspan, entity e)
102 {
103         me.addItemSimple(me, me.currentRow, me.currentColumn, rowspan, colspan, e, '0 0 0');
104         me.currentColumn += colspan;
105 }
106
107 void TDNoMarginDialog(entity me, float rowspan, float colspan, entity e, vector v)
108 {
109         me.addItemSimple(me, me.currentRow, me.currentColumn, rowspan, colspan, e, v);
110         me.currentColumn += colspan;
111 }
112
113 void setFirstColumnDialog(entity me, float col)
114 {
115         me.firstColumn = col;
116 }
117
118 void TDemptyDialog(entity me, float colspan)
119 {
120         me.currentColumn += colspan;
121 }
122
123 void configureDialogDialog(entity me)
124 {
125         entity closebutton;
126         float absWidth, absHeight;
127
128         me.frame = spawnBorderImage();
129         me.frame.configureBorderImage(me.frame, me.title, me.titleFontSize, me.color, me.backgroundImage, me.titleHeight);
130         me.addItem(me, me.frame, '0 0 0', '1 1 0', 1);
131
132         if not(me.titleFontSize)
133                 me.titleHeight = 0; // no title bar
134
135         absWidth = me.intendedWidth * cvar("vid_conwidth");
136         absHeight = me.titleHeight + me.marginTop + me.rows * me.rowHeight + (me.rows - 1) * me.rowSpacing + me.marginBottom;
137         me.itemOrigin  = eX * (me.marginLeft / absWidth)
138                        + eY * ((me.titleHeight + me.marginTop) / absHeight);
139         me.itemSize    = eX * ((1 - (me.marginLeft + me.marginRight + me.columnSpacing * (me.columns - 1)) / absWidth) / me.columns)
140                        + eY * (me.rowHeight / absHeight);
141         me.itemSpacing = me.itemSize
142                        + eX * (me.columnSpacing / absWidth)
143                        + eY * (me.rowSpacing / absHeight);
144         me.intendedHeight = absHeight / cvar("vid_conheight");
145         me.currentRow = -1;
146         me.currentColumn = -1;
147
148         me.fill(me);
149
150         if(me.closable)
151         {
152                 closebutton = me.closeButton = spawnButton();
153                 closebutton.configureButton(closebutton, "Close", 0, me.closeButtonImage);
154                 closebutton.onClick = Dialog_Close; closebutton.onClickEntity = me;
155                 closebutton.srcMulti = 0;
156                 me.addItem(me, closebutton, '0 0 0', '1 1 0', 1); // put it as LAST
157         }
158
159         me.frame.closeButton = closebutton;
160 }
161
162 void closeDialog(entity me)
163 {
164         if(me.parent.instanceOfNexposee)
165         {
166                 ExposeeCloseButton_Click(me, me.parent);
167         }
168         else if(me.parent.instanceOfModalController)
169         {
170                 DialogCloseButton_Click(me, me);
171         }
172 }
173
174 float keyDownDialog(entity me, float key, float ascii, float shift)
175 {
176         if(me.closable)
177         {
178                 if(key == K_ESCAPE)
179                 {
180                         me.close(me);
181                         return 1;
182                 }
183         }
184         return keyDownInputContainer(me, key, ascii, shift);
185 }
186 #endif