]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/menu-div0test/item/dialog.c
change "" references and tests to string_null whereever possible
[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))
23
24         METHOD(Dialog, TD, void(entity, float, float, entity))
25         METHOD(Dialog, TDempty, void(entity, float))
26         METHOD(Dialog, setFirstColumn, void(entity, float))
27         METHOD(Dialog, TR, void(entity))
28         METHOD(Dialog, gotoXY, void(entity, float, float))
29
30         ATTRIB(Dialog, isTabRoot, float, 1)
31         ATTRIB(Dialog, closeButton, entity, NULL)
32         ATTRIB(Dialog, intendedHeight, float, 0)
33         ATTRIB(Dialog, itemOrigin, vector, '0 0 0')
34         ATTRIB(Dialog, itemSize, vector, '0 0 0')
35         ATTRIB(Dialog, itemSpacing, vector, '0 0 0')
36         ATTRIB(Dialog, currentRow, float, 0)
37         ATTRIB(Dialog, currentColumn, float, 0)
38         ATTRIB(Dialog, firstColumn, float, 0)
39
40         // to be customized
41         ATTRIB(Dialog, closable, float, 1)
42         ATTRIB(Dialog, title, string, "Form1") // ;)
43         ATTRIB(Dialog, color, vector, '1 0.5 1')
44         ATTRIB(Dialog, intendedWidth, float, 0)
45         ATTRIB(Dialog, rows, float, 3)
46         ATTRIB(Dialog, columns, float, 2)
47
48         ATTRIB(Dialog, marginTop, float, 0) // pixels
49         ATTRIB(Dialog, marginBottom, float, 0) // pixels
50         ATTRIB(Dialog, marginLeft, float, 0) // pixels
51         ATTRIB(Dialog, marginRight, float, 0) // pixels
52         ATTRIB(Dialog, columnSpacing, float, 0) // pixels
53         ATTRIB(Dialog, rowSpacing, float, 0) // pixels
54         ATTRIB(Dialog, rowHeight, float, 0) // pixels
55         ATTRIB(Dialog, titleHeight, float, 0) // pixels
56         ATTRIB(Dialog, titleFontSize, float, 0) // pixels; if 0, title causes no margin
57
58         ATTRIB(Dialog, backgroundImage, string, string_null)
59         ATTRIB(Dialog, closeButtonImage, string, string_null)
60 ENDCLASS(Dialog)
61 #endif
62
63 #ifdef IMPLEMENTATION
64 void Dialog_Close(entity button, entity me)
65 {
66         me.close(me);
67 }
68
69 void fillDialog(entity me)
70 {
71 }
72
73 void addItemSimpleDialog(entity me, float row, float col, float rowspan, float colspan, entity e)
74 {
75         //print(vtos(me.itemSpacing), " ", vtos(me.itemSize), "\n");
76         me.addItem(me, e,
77                 me.itemOrigin + eX * ( col          * me.itemSpacing_x) + eY * ( row          * me.itemSpacing_y),
78                 me.itemSize   + eX * ((colspan - 1) * me.itemSpacing_x) + eY * ((rowspan - 1) * me.itemSpacing_y),
79                 1);
80 }
81
82 void gotoXYDialog(entity me, float row, float col)
83 {
84         me.currentRow = row;
85         me.currentColumn = col;
86 }
87
88 void TRDialog(entity me)
89 {
90         me.currentRow += 1;
91         me.currentColumn = me.firstColumn;
92 }
93
94 void TDDialog(entity me, float rowspan, float colspan, entity e)
95 {
96         me.addItemSimple(me, me.currentRow, me.currentColumn, rowspan, colspan, e);
97         me.currentColumn += colspan;
98 }
99
100 void setFirstColumnDialog(entity me, float col)
101 {
102         me.firstColumn = col;
103 }
104
105 void TDemptyDialog(entity me, float colspan)
106 {
107         me.currentColumn += colspan;
108 }
109
110 void configureDialogDialog(entity me)
111 {
112         entity frame, closebutton;
113         float absWidth, absHeight;
114
115         frame = spawnBorderImage();
116         frame.configureBorderImage(frame, me.title, me.titleFontSize, me.color, me.backgroundImage, me.titleHeight);
117         me.addItem(me, frame, '0 0 0', '1 1 0', 1);
118
119         if not(me.titleFontSize)
120                 me.titleHeight = 0; // no title bar
121
122         absWidth = me.intendedWidth * cvar("vid_conwidth");
123         absHeight = me.titleHeight + me.marginTop + me.rows * me.rowHeight + (me.rows - 1) * me.rowSpacing + me.marginBottom;
124         me.itemOrigin  = eX * (me.marginLeft / absWidth)
125                        + eY * ((me.titleHeight + me.marginTop) / absHeight);
126         me.itemSize    = eX * ((1 - (me.marginLeft + me.marginRight + me.columnSpacing * (me.columns - 1)) / absWidth) / me.columns)
127                        + eY * (me.rowHeight / absHeight);
128         me.itemSpacing = me.itemSize
129                        + eX * (me.columnSpacing / absWidth)
130                        + eY * (me.rowSpacing / absHeight);
131         me.intendedHeight = absHeight / cvar("vid_conheight");
132         me.currentRow = -1;
133         me.currentColumn = -1;
134
135         me.fill(me);
136
137         if(me.closable)
138         {
139                 closebutton = me.closeButton = spawnButton();
140                 closebutton.configureButton(closebutton, "Close", 0, me.closeButtonImage);
141                 closebutton.onClick = Dialog_Close; closebutton.onClickEntity = me;
142                 closebutton.srcMulti = 0;
143                 me.addItem(me, closebutton, '0 0 0', '1 1 0', 1); // put it as LAST
144         }
145
146         frame.closeButton = closebutton;
147 }
148
149 void closeDialog(entity me)
150 {
151         if(me.parent.instanceOfNexposee)
152         {
153                 ExposeeCloseButton_Click(me, me.parent);
154         }
155         else if(me.parent.instanceOfModalController)
156         {
157                 DialogCloseButton_Click(me, me);
158         }
159 }
160
161 float keyDownDialog(entity me, float key, float ascii, float shift)
162 {
163         if(me.closable)
164         {
165                 if(key == K_ESCAPE)
166                 {
167                         me.close(me);
168                         return 1;
169                 }
170         }
171         return keyDownInputContainer(me, key, ascii, shift);
172 }
173 #endif