module Dynamic2; private { import xf.hybrid.Hybrid; import xf.hybrid.backend.GL; import xf.hybrid.WidgetFactory; import xf.hybrid.Property; // for Thread.yield import tango.core.Thread; } void main() { gui.vfsMountDir(`../../`); scope cfg = loadHybridConfig(`./Dynamic2.cfg`); scope renderer = new Renderer; char[][] widgetsToUse = [ "Button", "Check", "Label", "Combo", "Input", "InputArea", "Progressbar", "FloatInputSpinner" ]; IWidget[char[]] createdWidgets; gui.begin(cfg); foreach (name; widgetsToUse) { createdWidgets[name] = createWidget(name) .layoutAttribs("hexpand vexpand hfill vfill"); } gui.end(); bool programRunning = true; while (programRunning) { gui.begin(cfg); if (gui().getProperty!(bool)("main.frame.closeClicked")) { programRunning = false; } auto dynWidgetParent = Group(`main.dynamicWidget`); VBox(`main.controls`) [{ auto combo = Combo(); if (0 == combo.items.length) { foreach (w; widgetsToUse) { combo.addItem(w); } } auto sel = combo.selected(); if (auto w = sel in createdWidgets) { dynWidgetParent.addChild(*w); int i = 0; foreach (prop; &w.iterExportedProperties) { if (prop.readOnly) { continue; } HBox(i++).cfg(`layout = { spacing = 5; }`) [{ Label().text(prop.name).halign(2) .layoutAttribs(`vexpand`).userSize = vec2(75, 0); if (prop.type is typeid(char[])) { auto editField = Input(); editField.layoutAttribs("hexpand hfill vexpand"); char[] backup = void; bool backupValid = false; try { backup = getProperty!(char[])(*w, prop.name); backupValid = true; } catch {} if (backupValid && Button().text("get").clicked) { try { editField.text = backup; } catch {} } if (Button().text("set").clicked) { try { setProperty(*w, prop.name, editField.text); } catch { if (backupValid) { setProperty(*w, prop.name, backup); } } } } }]; } } }]; gui.end(); gui.render(renderer); Thread.yield(); } }