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); } } } } }]; }