46 title =
_(
"Add Network Share (SMB / NAS)");
49 set_transient_for(parent);
52 set_default_size(520, -1);
55 add_css_class(
"smb-dialog");
60 entry_server.text = prefill.server;
61 entry_share.text = prefill.share;
62 entry_subpath.text = prefill.subpath;
63 entry_user.text = prefill.username;
64 entry_domain.text = prefill.domain;
65 entry_label.text = prefill.label;
66 chk_anonymous.active = (prefill.username.length == 0);
71 close_request.connect(() => {
79 var outer =
new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
80 outer.margin_start = 22;
81 outer.margin_end = 22;
82 outer.margin_top = 18;
83 outer.margin_bottom = 16;
88 var title_label =
new Gtk.Label(
_(
"Add Network Share (SMB / NAS)"));
89 title_label.xalign = 0.0f;
90 title_label.add_css_class(
"smb-title");
91 outer.append(title_label);
94 var intro =
new Gtk.Label(
95 _(
"Enter the address of your NAS or shared folder.")
97 +
_(
"Example: server = nas.local, share = backups"));
100 intro.wrap_mode = Pango.WrapMode.WORD;
101 intro.add_css_class(
"smb-subtitle");
104 var grid =
new Gtk.Grid();
105 grid.row_spacing = 8;
106 grid.column_spacing = 12;
115 entry_label =
add_row(grid, row++,
_(
"Label"),
_(
"Optional — friendly name shown in the list"));
118 var sep =
new Gtk.Separator(Gtk.Orientation.HORIZONTAL);
120 sep.margin_bottom = 6;
121 grid.attach(sep, 0, row++, 2, 1);
124 chk_anonymous =
new Gtk.CheckButton.with_label(
_(
"Connect anonymously (guest access)"));
130 entry_password.visibility =
false;
131 entry_password.input_purpose = Gtk.InputPurpose.PASSWORD;
134 var sep2 =
new Gtk.Separator(Gtk.Orientation.HORIZONTAL);
136 sep2.margin_bottom = 6;
137 grid.attach(sep2, 0, row++, 2, 1);
140 _(
"Remember this share (the password is never saved)"));
141 chk_remember.active =
true;
146 lbl_status.xalign = 0.0f;
147 lbl_status.wrap =
true;
148 lbl_status.wrap_mode = Pango.WrapMode.WORD;
149 lbl_status.visible =
false;
150 lbl_status.margin_top = 8;
155 var btn_box =
new Gtk.Box(Gtk.Orientation.HORIZONTAL, 8);
156 btn_box.halign = Gtk.Align.END;
157 btn_box.margin_top = 14;
158 outer.append(btn_box);
160 btn_cancel =
new Gtk.Button.with_label(
_(
"Cancel"));
183 private Gtk.Entry
add_row(Gtk.Grid grid,
int row,
string label_text,
string placeholder){
184 var lbl =
new Gtk.Label(label_text);
186 lbl.halign = Gtk.Align.START;
187 lbl.valign = Gtk.Align.CENTER;
188 grid.attach(lbl, 0, row, 1, 1);
190 var entry =
new Gtk.Entry();
191 entry.hexpand =
true;
192 if (placeholder.length > 0){
193 entry.placeholder_text = placeholder;
195 grid.attach(entry, 1, row, 1, 1);
221 s.subpath =
entry_subpath.text.strip().replace(
"\\",
"/").strip();
229 if (s.server.has_prefix(
"smb://")){
230 s.server = s.server.substring(6);
232 while (s.server.has_prefix(
"/")){
233 s.server = s.server.substring(1);
236 if (s.share.length == 0 && s.server.contains(
"/")){
237 int idx = s.server.index_of(
"/");
238 s.share = s.server.substring(idx + 1);
239 s.server = s.server.substring(0, idx);
242 if (s.server.length == 0 || s.share.length == 0){
243 show_error(
_(
"Please fill in both Server and Share."));
249 btn_connect.sensitive =
false;
250 btn_cancel.sensitive =
false;
256 btn_connect.sensitive =
true;
257 btn_cancel.sensitive =
true;
265 if (s.save_credentials){