192
184
cancellable = new GLib.Cancellable ();
194
186
update_selection_size (); /* Start counting first to get number of selected files and folders */
188
/* create some widgets first (may be hidden by update_selection_size ()) */
189
var file_pix = goffile.get_icon_pixbuf (48, false, GOF.FileIconFlags.NONE);
190
var file_icon = new Gtk.Image.from_pixbuf (file_pix);
191
overlay_emblems (file_icon, goffile.emblems_list);
193
/* Build header box */
194
if (count > 1 || (count == 1 && !goffile.is_writable ())) {
195
var label = new Gtk.Label (get_selected_label (selected_folders, selected_files));
196
label.halign = Gtk.Align.START;
197
header_title = label;
198
} else if (count == 1 && goffile.is_writable ()) {
199
entry = new Gtk.Entry ();
200
original_name = goffile.info.get_name ();
203
entry.activate.connect (() => {
204
rename_file (goffile, entry.get_text ());
207
entry.focus_out_event.connect (() => {
208
rename_file (goffile, entry.get_text ());
211
header_title = entry;
214
create_header_title ();
197
216
/* Permissions */
198
217
/* Don't show permissions for uri scheme trash and archives */
320
339
entry.set_text (original_name);
323
private void build_header_box () {
324
/* create some widgets first (may be hidden by update_selection_size ()) */
325
var file_pix = goffile.get_icon_pixbuf (48, false, GOF.FileIconFlags.NONE);
326
var file_icon = new Gtk.Image.from_pixbuf (file_pix);
327
overlay_emblems (file_icon, goffile.emblems_list);
329
/* Build header box */
330
if (count > 1 || (count == 1 && !goffile.is_writable ())) {
331
var label = new Gtk.Label (get_selected_label (selected_folders, selected_files));
332
label.halign = Gtk.Align.START;
333
header_title = label;
334
} else if (count == 1 && goffile.is_writable ()) {
335
entry = new Gtk.Entry ();
336
original_name = goffile.info.get_name ();
339
entry.activate.connect (() => {
340
rename_file (goffile, entry.get_text ());
343
entry.focus_out_event.connect (() => {
344
rename_file (goffile, entry.get_text ());
347
header_title = entry;
350
create_header_title ();
353
342
private string? get_common_ftype () {
354
343
string? ftype = null;
355
344
if (files == null)
528
if (file.formated_modified != null) {
523
var time_modified = PF.FileUtils.get_formatted_time_attribute_from_info (file.info, FileAttribute.TIME_MODIFIED);
524
if (time_modified != "") {
529
525
var key_label = new KeyLabel (_("Modified:"));
530
var value_label = new ValueLabel (file.formated_modified);
531
info_grid.attach (key_label, 0, n, 1, 1);
532
info_grid.attach_next_to (value_label, key_label, Gtk.PositionType.RIGHT, 3, 1);
536
var time_last_access = file.get_formated_time (FileAttribute.TIME_ACCESS);
537
if (time_last_access != null) {
538
var key_label = new KeyLabel (_("Last Access:"));
539
var value_label = new ValueLabel (time_last_access);
526
var value_label = new ValueLabel (time_modified);
540
527
info_grid.attach (key_label, 0, n, 1, 1);
541
528
info_grid.attach_next_to (value_label, key_label, Gtk.PositionType.RIGHT, 3, 1);
666
private void toggle_button_add_label (Gtk.ToggleButton btn, string str) {
667
var l_read = new Gtk.Label ("<span size='small'>"+ str + "</span>");
668
l_read.set_use_markup (true);
672
private void update_perm_codes (PermissionType pt, int val, int mult) {
653
private void update_perm_codes (Permissions.Type pt, int val, int mult) {
674
case PermissionType.USER:
655
case Permissions.Type.USER:
675
656
owner_perm_code += mult*val;
677
case PermissionType.GROUP:
658
case Permissions.Type.GROUP:
678
659
group_perm_code += mult*val;
680
case PermissionType.OTHER:
661
case Permissions.Type.OTHER:
681
662
everyone_perm_code += mult*val;
686
private void action_toggled_read (Gtk.ToggleButton btn) {
687
unowned PermissionType pt = btn.get_data ("permissiontype");
667
private void permission_button_toggle (Gtk.ToggleButton btn) {
668
unowned Permissions.Type pt = btn.get_data ("permissiontype");
669
unowned Permissions.Value permission_value = btn.get_data ("permissionvalue");
690
672
reset_and_cancel_perm_timeout ();
691
if (!btn.get_active ())
674
if (!btn.get_active ()) {
693
update_perm_codes (pt, 4, mult);
694
if (perm_code_should_update)
678
switch (permission_value) {
679
case Permissions.Value.READ:
680
update_perm_codes (pt, 4, mult);
682
case Permissions.Value.WRITE:
683
update_perm_codes (pt, 2, mult);
685
case Permissions.Value.EXE:
686
update_perm_codes (pt, 1, mult);
690
if (perm_code_should_update) {
695
691
perm_code.set_text ("%d%d%d".printf (owner_perm_code, group_perm_code, everyone_perm_code));
698
private void action_toggled_write (Gtk.ToggleButton btn) {
699
unowned PermissionType pt = btn.get_data ("permissiontype");
702
reset_and_cancel_perm_timeout ();
703
if (!btn.get_active ())
705
update_perm_codes (pt, 2, mult);
706
if (perm_code_should_update)
707
perm_code.set_text ("%d%d%d".printf(owner_perm_code, group_perm_code, everyone_perm_code));
710
private void action_toggled_execute (Gtk.ToggleButton btn) {
711
unowned PermissionType pt = btn.get_data ("permissiontype");
714
reset_and_cancel_perm_timeout ();
715
if (!btn.get_active ())
717
update_perm_codes (pt, 1, mult);
718
if (perm_code_should_update)
719
perm_code.set_text ("%d%d%d".printf(owner_perm_code, group_perm_code, everyone_perm_code));
722
private Gtk.Box create_perm_choice (PermissionType pt) {
725
hbox = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 0);
726
hbox.homogeneous = true;
727
hbox.get_style_context ().add_class (Gtk.STYLE_CLASS_LINKED);
728
var btn_read = new Gtk.ToggleButton ();
729
toggle_button_add_label (btn_read, _("Read"));
730
btn_read.set_data ("permissiontype", pt);
731
btn_read.toggled.connect (action_toggled_read);
732
var btn_write = new Gtk.ToggleButton ();
733
toggle_button_add_label (btn_write, _("Write"));
734
btn_write.set_data ("permissiontype", pt);
735
btn_write.toggled.connect (action_toggled_write);
736
var btn_exe = new Gtk.ToggleButton ();
737
toggle_button_add_label (btn_exe, _("Execute"));
738
btn_exe.set_data ("permissiontype", pt);
739
btn_exe.toggled.connect (action_toggled_execute);
740
hbox.pack_start (btn_read);
741
hbox.pack_start (btn_write);
742
hbox.pack_start (btn_exe);
695
private PermissionButton create_perm_choice (Permissions.Type pt) {
696
var permission_button = new PermissionButton (pt);
697
permission_button.btn_read.toggled.connect (permission_button_toggle);
698
permission_button.btn_write.toggled.connect (permission_button_toggle);
699
permission_button.btn_exe.toggled.connect (permission_button_toggle);
700
return permission_button;
747
703
private uint32 get_perm_from_chmod_unit (uint32 vfs_perm, int nb,
748
int chmod, PermissionType pt) {
704
int chmod, Permissions.Type pt) {
749
705
if (nb > 7 || nb < 0)
750
706
critical ("erroned chmod code %d %d", chmod, nb);
770
726
vfs_perm = get_perm_from_chmod_unit (vfs_perm, (int) chmod / 100,
771
chmod, PermissionType.USER);
727
chmod, Permissions.Type.USER);
773
729
vfs_perm = get_perm_from_chmod_unit (vfs_perm, (int) (chmod / 10) % 10,
774
chmod, PermissionType.GROUP);
730
chmod, Permissions.Type.GROUP);
776
732
vfs_perm = get_perm_from_chmod_unit (vfs_perm, (int) chmod % 10,
777
chmod, PermissionType.OTHER);
733
chmod, Permissions.Type.OTHER);
782
private void update_permission_type_buttons (Gtk.Box hbox, uint32 permissions, PermissionType pt) {
784
foreach (var widget in hbox.get_children ()) {
785
Gtk.ToggleButton btn = (Gtk.ToggleButton) widget;
786
((permissions & vfs_perms[pt, i]) != 0) ? btn.active = true : btn.active = false;
791
739
private void update_perm_grid_toggle_states (uint32 permissions) {
795
hbox = (Gtk.Box) perm_grid.get_child_at (1,3);
796
update_permission_type_buttons (hbox, permissions, PermissionType.USER);
799
hbox = (Gtk.Box) perm_grid.get_child_at (1,4);
800
update_permission_type_buttons (hbox, permissions, PermissionType.GROUP);
802
/* update OTHER row */
803
hbox = (Gtk.Box) perm_grid.get_child_at (1,5);
804
update_permission_type_buttons (hbox, permissions, PermissionType.OTHER);
807
private bool is_chmod_code (string str) {
809
var regex = new Regex ("^[0-7]{3}$");
810
if (regex.match (str))
812
} catch (RegexError e) {
813
assert_not_reached ();
740
perm_button_user.update_buttons (permissions);
741
perm_button_group.update_buttons (permissions);
742
perm_button_other.update_buttons (permissions);
819
745
private void reset_and_cancel_perm_timeout () {
934
863
private Gtk.Grid construct_perm_panel () {
864
var owner_user_label = new KeyLabel (_("Owner:"));
866
var owner_user_choice = create_owner_choice ();
868
var group_combo_label = new KeyLabel (_("Group:"));
869
group_combo_label.margin_bottom = 12;
871
var group_combo = create_group_choice ();
872
group_combo.margin_bottom = 12;
874
var owner_label = new KeyLabel (_("Owner:"));
875
perm_button_user = create_perm_choice (Permissions.Type.USER);
877
var group_label = new KeyLabel (_("Group:"));
878
perm_button_group = create_perm_choice (Permissions.Type.GROUP);
880
var other_label = new KeyLabel (_("Everyone:"));
881
perm_button_other = create_perm_choice (Permissions.Type.OTHER);
883
perm_code = new Gtk.Entry ();
884
perm_code.text = "000";
885
perm_code.max_length = perm_code.max_width_chars = perm_code.width_chars = 3;
887
l_perm = new Gtk.Label ("<tt>%s</tt>".printf (goffile.get_permissions_as_string ()));
888
l_perm.halign = Gtk.Align.START;
889
l_perm.use_markup = true;
935
891
perm_grid = new Gtk.Grid ();
936
892
perm_grid.column_spacing = 6;
937
893
perm_grid.row_spacing = 6;
938
894
perm_grid.halign = Gtk.Align.CENTER;
940
Gtk.Widget key_label;
941
Gtk.Widget value_label;
942
Gtk.Box value_hlabel;
944
key_label = new Gtk.Label (_("Owner:"));
945
key_label.halign = Gtk.Align.END;
946
perm_grid.attach (key_label, 0, 1, 1, 1);
947
value_label = create_owner_choice ();
948
perm_grid.attach (value_label, 1, 1, 2, 1);
950
key_label = new Gtk.Label (_("Group:"));
951
key_label.halign = Gtk.Align.END;
952
perm_grid.attach (key_label, 0, 2, 1, 1);
953
value_label = create_group_choice ();
954
perm_grid.attach (value_label, 1, 2, 2, 1);
956
/* make a separator with margins */
957
key_label.margin_bottom = 12;
958
value_label.margin_bottom = 12;
960
key_label = new KeyLabel (_("Owner:"));
961
value_hlabel = create_perm_choice (PermissionType.USER);
962
perm_grid.attach (key_label, 0, 3, 1, 1);
963
perm_grid.attach (value_hlabel, 1, 3, 2, 1);
964
key_label = new KeyLabel (_("Group:"));
965
value_hlabel = create_perm_choice (PermissionType.GROUP);
966
perm_grid.attach (key_label, 0, 4, 1, 1);
967
perm_grid.attach (value_hlabel, 1, 4, 2, 1);
968
key_label = new KeyLabel (_("Everyone:"));
969
value_hlabel = create_perm_choice (PermissionType.OTHER);
970
perm_grid.attach (key_label, 0, 5, 1, 1);
971
perm_grid.attach (value_hlabel, 1, 5, 2, 1);
973
perm_code = new Granite.Widgets.XsEntry ();
974
perm_code.set_text ("000");
975
perm_code.set_max_length (3);
976
perm_code.set_size_request (35, -1);
978
l_perm = new Gtk.Label (goffile.get_permissions_as_string ());
895
perm_grid.attach (owner_user_label, 0, 1, 1, 1);
896
perm_grid.attach (owner_user_choice, 1, 1, 2, 1);
897
perm_grid.attach (group_combo_label, 0, 2, 1, 1);
898
perm_grid.attach (group_combo, 1, 2, 2, 1);
899
perm_grid.attach (owner_label, 0, 3, 1, 1);
900
perm_grid.attach (perm_button_user, 1, 3, 2, 1);
901
perm_grid.attach (group_label, 0, 4, 1, 1);
902
perm_grid.attach (perm_button_group, 1, 4, 2, 1);
903
perm_grid.attach (other_label, 0, 5, 1, 1);
904
perm_grid.attach (perm_button_other, 1, 5, 2, 1);
980
905
perm_grid.attach (l_perm, 1, 6, 1, 1);
981
906
perm_grid.attach (perm_code, 2, 6, 1, 1);
1210
1135
private string get_contains_value (uint folders, uint files) {
1136
string folders_txt = "";
1137
string files_txt = "";
1212
1139
if (folders > 0) {
1216
txt = _("%u subfolders and %u files").printf (folders, files);
1218
txt = _("%u subfolders and %u file").printf (folders,files);
1221
txt = _("%u subfolders").printf (folders);
1226
txt = _("%u subfolder and %u files").printf (folders, files);
1228
txt = _("%u subfolder and %u file").printf (folders, files);
1231
txt = _("%u folder").printf (folders);
1140
folders_txt = (ngettext ("%u subfolder", "%u subfolders", folders)).printf (folders);
1144
files_txt = (ngettext ("%u file", "%u files", files)).printf (files);
1147
if (folders > 0 && files > 0) {
1148
///TRANSLATORS: folders, files
1149
return _("%s, %s").printf (folders_txt, files_txt);
1150
} else if (files > 0) {
1237
txt = _("%u files").printf (files);
1239
txt = _("%u file").printf (files);
1247
1157
private string get_selected_label (uint folders, uint files) {
1249
uint total = folders + files;
1158
string folders_txt = "";
1159
string files_txt = "";
1251
1161
if (folders > 0) {
1255
txt = _("%u selected items (%u folders and %u files)").printf (total, folders, files);
1257
txt = _("%u selected items (%u folders and %u file)").printf (total, folders, files);
1260
txt = _("%u folders").printf (folders);
1265
txt = _("%u selected items (%u folder and %u files)").printf (total, folders,files);
1267
txt = _("%u selected items (%u folder and %u file)").printf (total, folders,files);
1270
txt = _("%u folder").printf (folders); /* displayed for background folder*/
1162
folders_txt = (ngettext ("%u folder", "%u folders", folders)).printf (folders);
1166
files_txt = (ngettext ("%u file", "%u files", files)).printf (files);
1169
if (files > 0 && folders > 0) {
1170
string total_txt = (ngettext ("%u selected item", "%u selected items", folders + files)).printf (folders + files);
1171
///TRANSLATORS: total (folders, files)
1172
return _("%s (%s, %s)").printf (total_txt, folders_txt, files_txt);
1173
} else if (files > 0) {
1276
txt = _("%u files").printf (files);
1278
txt = _("%u file").printf (files); /* should not be displayed - entry instead */
1283
/* The selection should never be empty */
1287
1180
/** Hide certain widgets under certain conditions **/