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