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
58 ATTRIB(Dialog, zoomedOutTitleBarPosition, float, -1)
60 ATTRIB(Dialog, backgroundImage, string, string_null)
61 ATTRIB(Dialog, closeButtonImage, string, string_null)
63 ATTRIB(Dialog, frame, entity, NULL)
68 void Dialog_Close(entity button, entity me)
73 void fillDialog(entity me)
77 void addItemSimpleDialog(entity me, float row, float col, float rowspan, float colspan, entity e, vector v)
79 //print(vtos(me.itemSpacing), " ", vtos(me.itemSize), "\n");
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);
90 void gotoXYDialog(entity me, float row, float col)
93 me.currentColumn = col;
96 void TRDialog(entity me)
99 me.currentColumn = me.firstColumn;
102 void TDDialog(entity me, float rowspan, float colspan, entity e)
104 me.addItemSimple(me, me.currentRow, me.currentColumn, rowspan, colspan, e, '0 0 0');
105 me.currentColumn += colspan;
108 void TDNoMarginDialog(entity me, float rowspan, float colspan, entity e, vector v)
110 me.addItemSimple(me, me.currentRow, me.currentColumn, rowspan, colspan, e, v);
111 me.currentColumn += colspan;
114 void setFirstColumnDialog(entity me, float col)
116 me.firstColumn = col;
119 void TDemptyDialog(entity me, float colspan)
121 me.currentColumn += colspan;
124 void configureDialogDialog(entity me)
127 float absWidth, absHeight;
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);
134 if not(me.titleFontSize)
135 me.titleHeight = 0; // no title bar
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;
148 me.currentColumn = -1;
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
161 me.frame.closeButton = closebutton;
164 void closeDialog(entity me)
166 if(me.parent.instanceOfNexposee)
168 ExposeeCloseButton_Click(me, me.parent);
170 else if(me.parent.instanceOfModalController)
172 DialogCloseButton_Click(me, me);
176 float keyDownDialog(entity me, float key, float ascii, float shift)
186 return keyDownInputContainer(me, key, ascii, shift);