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