1 module ircclient.ui.settingsdlg;
2
3 import dlangui.core.stdaction;
4 import dlangui.dialogs.dialog;
5 import dlangui.widgets.widget;
6 import dlangui.dml.parser;
7 import ircclient.ui.frame;
8 import ircclient.ui.settings;
9 import std.utf : toUTF32;
10 import std.conv : to;
11
12 class SettingsDialog : Dialog {
13 IRCFrame _frame;
14 IRCSettings _settings;
15 bool _allowConnect;
16 this(IRCFrame parent, IRCSettings settings, bool allowConnect) {
17 super(UIString.fromRaw("IRC Client Settings"d), parent.window,
18 DialogFlag.Modal | DialogFlag.Resizable | DialogFlag.Popup, 500, 400);
19 _icon = "dlangui-logo1";
20 _frame = parent;
21 _settings = settings;
22 _allowConnect = allowConnect;
23 }
24
25 /// override to implement creation of dialog controls
26 override void initialize() {
27 super.initialize();
28 Widget content;
29 try {
30 content = parseML(q{
31 VerticalLayout {
32 id: vlayout
33 padding: Rect { 5, 5, 5, 5 }
34 layoutWidth: fill; layoutHeight: fill
35 TableLayout {
36 margins: 5
37 colCount: 2
38 layoutWidth: fill; layoutHeight: wrap
39
40 TextWidget { text: "IRC Server host name" }
41 EditLine { id: edHost; layoutWidth: fill; minWidth: 400 }
42 TextWidget { text: "IRC Server port" }
43 EditLine { id: edPort; layoutWidth: fill }
44 TextWidget { text: " " }
45 TextWidget { text: " " }
46 TextWidget { text: "Nickname" }
47 EditLine { id: edNick; layoutWidth: fill }
48 TextWidget { text: "Alternate nickname" }
49 EditLine { id: edAlternateNick; layoutWidth: fill }
50 TextWidget { text: "Username" }
51 EditLine { id: edUsername; layoutWidth: fill }
52 TextWidget { text: "Real name" }
53 EditLine { id: edRealName; layoutWidth: fill }
54 TextWidget { text: " " }
55 TextWidget { text: " " }
56 TextWidget { text: "Channel to join on connect" }
57 EditLine { id: edChannel; layoutWidth: fill }
58 TextWidget { text: " " }
59 CheckBox { id: cbCreateWorkspace; text: "Connect on startup"; checked: true }
60 }
61 TextWidget { id: statusText; text: ""; layoutWidth: fill }
62 }
63 });
64 } catch (Exception e) {
65 Log.e("Exceptin while parsing DML", e);
66 throw e;
67 }
68 addChild(content);
69 addChild(createButtonsPanel(_allowConnect ? [ACTION_CONNECT, ACTION_APPLY, ACTION_CANCEL] : [ACTION_APPLY, ACTION_CANCEL], 0, 0));
70 settingsToControls();
71 }
72
73 void settingsToControls() {
74 childById("edHost").text = toUTF32(_settings.host);
75 childById("edPort").text = toUTF32(to!string(_settings.port));
76 childById("edNick").text = toUTF32(_settings.nick);
77 childById("edAlternateNick").text = toUTF32(_settings.alternateNick);
78 childById("edUsername").text = toUTF32(_settings.userName);
79 childById("edRealName").text = toUTF32(_settings.userRealName);
80 childById("edChannel").text = toUTF32(_settings.defChannel);
81 }
82
83 void controlsToSettings() {
84 _settings.host = toUTF8(childById("edHost").text);
85 try {
86 _settings.port = cast(ushort)to!ulong(childById("edPort").text);
87 } catch (Exception e) {
88 // ignore
89 _settings.port = 6667;
90 }
91 _settings.nick = toUTF8(childById("edNick").text);
92 _settings.alternateNick = toUTF8(childById("edAlternateNick").text);
93 _settings.userName = toUTF8(childById("edUsername").text);
94 _settings.userRealName = toUTF8(childById("edRealName").text);
95 _settings.defChannel = toUTF8(childById("edChannel").text);
96 }
97
98 override void close(const Action action) {
99 Action newaction = action.clone();
100 if (action.id != ACTION_CANCEL.id) {
101 controlsToSettings();
102 // TODO: validate
103 }
104 //if (action.id == IDEActions.FileNewWorkspace || action.id == IDEActions.FileNewProject) {
105 // newaction.objectParam = _result;
106 //}
107 super.close(newaction);
108 }
109 }