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
18 #include "inputcontainer.qc"
19 CLASS(Dialog, InputContainer)
20 METHOD(Dialog, configureDialog, void(entity)); // no runtime configuration, all parameters are given in the code!
21 METHOD(Dialog, fill, void(entity)); // to be overridden by user to fill the dialog with controls
22 METHOD(Dialog, keyDown, float(entity, float, float, float));
23 METHOD(Dialog, close, void(entity));
24 METHOD(Dialog, addItemSimple, void(entity, float, float, float, float, entity, vector));
26 METHOD(Dialog, TD, void(entity, float, float, entity));
27 METHOD(Dialog, TDNoMargin, void(entity, float, float, entity, vector));
28 METHOD(Dialog, TDempty, void(entity, float));
29 METHOD(Dialog, setFirstColumn, void(entity, float));
30 METHOD(Dialog, TR, void(entity));
31 METHOD(Dialog, gotoRC, void(entity, float, float));
33 ATTRIB(Dialog, isTabRoot, float, 1)
34 ATTRIB(Dialog, closeButton, entity, NULL)
35 ATTRIB(Dialog, intendedHeight, float, 0)
36 ATTRIB(Dialog, itemOrigin, vector, '0 0 0')
37 ATTRIB(Dialog, itemSize, vector, '0 0 0')
38 ATTRIB(Dialog, itemSpacing, vector, '0 0 0')
39 ATTRIB(Dialog, currentRow, float, 0)
40 ATTRIB(Dialog, currentColumn, float, 0)
41 ATTRIB(Dialog, firstColumn, float, 0)
44 ATTRIB(Dialog, closable, float, 1)
45 ATTRIB(Dialog, title, string, "Form1") // ;)
46 ATTRIB(Dialog, color, vector, '1 0.5 1')
47 ATTRIB(Dialog, intendedWidth, float, 0)
48 ATTRIB(Dialog, rows, float, 3)
49 ATTRIB(Dialog, columns, float, 2)
51 ATTRIB(Dialog, marginTop, float, 0) // pixels
52 ATTRIB(Dialog, marginBottom, float, 0) // pixels
53 ATTRIB(Dialog, marginLeft, float, 0) // pixels
54 ATTRIB(Dialog, marginRight, float, 0) // pixels
55 ATTRIB(Dialog, columnSpacing, float, 0) // pixels
56 ATTRIB(Dialog, rowSpacing, float, 0) // pixels
57 ATTRIB(Dialog, rowHeight, float, 0) // pixels
58 ATTRIB(Dialog, titleHeight, float, 0) // pixels
59 ATTRIB(Dialog, titleFontSize, float, 0) // pixels; if 0, title causes no margin
60 ATTRIB(Dialog, zoomedOutTitleBarPosition, float, 0)
61 ATTRIB(Dialog, zoomedOutTitleBar, float, 0)
63 ATTRIB(Dialog, requiresConnection, float, 0) // set to true if the dialog requires a connection to be opened
65 ATTRIB(Dialog, backgroundImage, string, string_null)
66 ATTRIB(Dialog, borderLines, float, 1)
67 ATTRIB(Dialog, closeButtonImage, string, string_null)
69 ATTRIB(Dialog, frame, entity, NULL)
74 void Dialog_Close(entity button, entity me)
79 void Dialog_fill(entity me)
83 void Dialog_addItemSimple(entity me, float row, float col, float rowspan, float colspan, entity e, vector v)
86 o = me.itemOrigin + eX * ( col * me.itemSpacing.x) + eY * ( row * me.itemSpacing.y);
87 s = me.itemSize + eX * ((colspan - 1) * me.itemSpacing.x) + eY * ((rowspan - 1) * me.itemSpacing.y);
88 o.x -= 0.5 * (me.itemSpacing.x - me.itemSize.x) * v.x;
89 s.x += (me.itemSpacing.x - me.itemSize.x) * v.x;
90 o.y -= 0.5 * (me.itemSpacing.y - me.itemSize.y) * v.y;
91 s.y += (me.itemSpacing.y - me.itemSize.y) * v.y;
92 me.addItem(me, e, o, s, 1);
95 void Dialog_gotoRC(entity me, float row, float col)
98 me.currentColumn = col;
101 void Dialog_TR(entity me)
104 me.currentColumn = me.firstColumn;
107 void Dialog_TD(entity me, float rowspan, float colspan, entity e)
109 me.addItemSimple(me, me.currentRow, me.currentColumn, rowspan, colspan, e, '0 0 0');
110 me.currentColumn += colspan;
113 void Dialog_TDNoMargin(entity me, float rowspan, float colspan, entity e, vector v)
115 me.addItemSimple(me, me.currentRow, me.currentColumn, rowspan, colspan, e, v);
116 me.currentColumn += colspan;
119 void Dialog_setFirstColumn(entity me, float col)
121 me.firstColumn = col;
124 void Dialog_TDempty(entity me, float colspan)
126 me.currentColumn += colspan;
129 void Dialog_configureDialog(entity me)
131 float absWidth, absHeight;
135 me.frame = NEW(BorderImage);
136 me.frame.configureBorderImage(me.frame, me.title, me.titleFontSize, me.color, me.backgroundImage, me.borderLines * me.titleHeight);
137 me.frame.zoomedOutTitleBarPosition = me.zoomedOutTitleBarPosition;
138 me.frame.zoomedOutTitleBar = me.zoomedOutTitleBar;
139 me.frame.alpha = me.alpha;
140 me.addItem(me, me.frame, '0 0 0', '1 1 0', 1);
143 if (!me.titleFontSize)
144 me.titleHeight = 0; // no title bar
146 absWidth = me.intendedWidth * conwidth;
147 absHeight = me.borderLines * me.titleHeight + me.marginTop + me.rows * me.rowHeight + (me.rows - 1) * me.rowSpacing + me.marginBottom;
148 me.itemOrigin = eX * (me.marginLeft / absWidth)
149 + eY * ((me.borderLines * me.titleHeight + me.marginTop) / absHeight);
150 me.itemSize = eX * ((1 - (me.marginLeft + me.marginRight + me.columnSpacing * (me.columns - 1)) / absWidth) / me.columns)
151 + eY * (me.rowHeight / absHeight);
152 me.itemSpacing = me.itemSize
153 + eX * (me.columnSpacing / absWidth)
154 + eY * (me.rowSpacing / absHeight);
155 me.intendedHeight = absHeight / conheight;
157 me.currentColumn = -1;
161 if(me.isTabRoot && me.closable && me.borderLines > 0)
164 closebutton = me.closeButton = me.frame.closeButton = NEW(Button);
165 closebutton.configureButton(closebutton, "", 0, me.closeButtonImage);
166 closebutton.onClick = Dialog_Close; closebutton.onClickEntity = me;
167 closebutton.srcMulti = 0;
168 me.addItem(me, closebutton, '0 0 0', '1 1 0', 1); // put it as LAST
172 void Dialog_close(entity me)
174 if(me.parent.instanceOfNexposee)
176 ExposeeCloseButton_Click(me, me.parent);
178 else if(me.parent.instanceOfModalController)
180 DialogCloseButton_Click(me, me);
184 float Dialog_keyDown(entity me, float key, float ascii, float shift)
190 m_play_click_sound(MENU_SOUND_CLOSE);
195 return SUPER(Dialog).keyDown(me, key, ascii, shift);