1 // Note: this class is called Dialog, but it can also handle a tab under the following conditions:
3 // - backgroundImage is the tab's background
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
14 // a subclass may help with using this as a tab
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))
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))
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)
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)
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
59 ATTRIB(Dialog, backgroundImage, string, string_null)
60 ATTRIB(Dialog, closeButtonImage, string, string_null)
65 void Dialog_Close(entity button, entity me)
70 void fillDialog(entity me)
74 void addItemSimpleDialog(entity me, float row, float col, float rowspan, float colspan, entity e, vector v)
76 //print(vtos(me.itemSpacing), " ", vtos(me.itemSize), "\n");
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);
87 void gotoXYDialog(entity me, float row, float col)
90 me.currentColumn = col;
93 void TRDialog(entity me)
96 me.currentColumn = me.firstColumn;
99 void TDDialog(entity me, float rowspan, float colspan, entity e)
101 me.addItemSimple(me, me.currentRow, me.currentColumn, rowspan, colspan, e, '0 0 0');
102 me.currentColumn += colspan;
105 void TDNoMarginDialog(entity me, float rowspan, float colspan, entity e, vector v)
107 me.addItemSimple(me, me.currentRow, me.currentColumn, rowspan, colspan, e, v);
108 me.currentColumn += colspan;
111 void setFirstColumnDialog(entity me, float col)
113 me.firstColumn = col;
116 void TDemptyDialog(entity me, float colspan)
118 me.currentColumn += colspan;
121 void configureDialogDialog(entity me)
123 entity frame, closebutton;
124 float absWidth, absHeight;
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);
130 if not(me.titleFontSize)
131 me.titleHeight = 0; // no title bar
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");
144 me.currentColumn = -1;
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
157 frame.closeButton = closebutton;
160 void closeDialog(entity me)
162 if(me.parent.instanceOfNexposee)
164 ExposeeCloseButton_Click(me, me.parent);
166 else if(me.parent.instanceOfModalController)
168 DialogCloseButton_Click(me, me);
172 float keyDownDialog(entity me, float key, float ascii, float shift)
182 return keyDownInputContainer(me, key, ascii, shift);