2
2
* Copyright (c) 2011 Marlin Developers (http://launchpad.net/marlin)
3
* Copyright (c) 2015-2016 elementary LLC (http://launchpad.net/pantheon-files)
3
* Copyright (c) 2015-2017 elementary LLC (http://launchpad.net/pantheon-files)
5
5
* This program is free software; you can redistribute it and/or
6
6
* modify it under the terms of the GNU General Public
23
23
namespace Marlin.View {
25
25
public class PropertiesWindow : AbstractPropertiesDialog {
26
private Granite.Widgets.XsEntry perm_code;
26
private Gtk.Entry perm_code;
27
27
private bool perm_code_should_update = true;
28
28
private Gtk.Label l_perm;
100
public enum PermissionType {
106
100
private Posix.mode_t[,] vfs_perms = {
107
101
{ Posix.S_IRUSR, Posix.S_IWUSR, Posix.S_IXUSR },
108
102
{ Posix.S_IRGRP, Posix.S_IWGRP, Posix.S_IXGRP },
190
184
cancellable = new GLib.Cancellable ();
192
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 ();
195
216
/* Permissions */
196
217
/* Don't show permissions for uri scheme trash and archives */
318
339
entry.set_text (original_name);
321
private void build_header_box () {
322
/* create some widgets first (may be hidden by update_selection_size ()) */
323
var file_pix = goffile.get_icon_pixbuf (48, false, GOF.FileIconFlags.NONE);
324
var file_icon = new Gtk.Image.from_pixbuf (file_pix);
325
overlay_emblems (file_icon, goffile.emblems_list);
327
/* Build header box */
328
if (count > 1 || (count == 1 && !goffile.is_writable ())) {
329
var label = new Gtk.Label (get_selected_label (selected_folders, selected_files));
330
label.halign = Gtk.Align.START;
331
header_title = label;
332
} else if (count == 1 && goffile.is_writable ()) {
333
entry = new Gtk.Entry ();
334
original_name = goffile.info.get_name ();
337
entry.activate.connect (() => {
338
rename_file (goffile, entry.get_text ());
341
entry.focus_out_event.connect (() => {
342
rename_file (goffile, entry.get_text ());
345
header_title = entry;
348
create_header_title ();
351
342
private string? get_common_ftype () {
352
343
string? ftype = null;
353
344
if (files == null)
662
private void update_perm_codes (PermissionType pt, int val, int mult) {
653
private void update_perm_codes (Permissions.Type pt, int val, int mult) {
664
case PermissionType.USER:
655
case Permissions.Type.USER:
665
656
owner_perm_code += mult*val;
667
case PermissionType.GROUP:
658
case Permissions.Type.GROUP:
668
659
group_perm_code += mult*val;
670
case PermissionType.OTHER:
661
case Permissions.Type.OTHER:
671
662
everyone_perm_code += mult*val;
676
667
private void permission_button_toggle (Gtk.ToggleButton btn) {
677
unowned PermissionType pt = btn.get_data ("permissiontype");
678
unowned PermissionButton.Value permission_value = btn.get_data ("permissionvalue");
668
unowned Permissions.Type pt = btn.get_data ("permissiontype");
669
unowned Permissions.Value permission_value = btn.get_data ("permissionvalue");
681
672
reset_and_cancel_perm_timeout ();
687
678
switch (permission_value) {
688
case PermissionButton.Value.READ:
679
case Permissions.Value.READ:
689
680
update_perm_codes (pt, 4, mult);
691
case PermissionButton.Value.WRITE:
682
case Permissions.Value.WRITE:
692
683
update_perm_codes (pt, 2, mult);
694
case PermissionButton.Value.EXE:
685
case Permissions.Value.EXE:
695
686
update_perm_codes (pt, 1, mult);
704
private PermissionButton create_perm_choice (PermissionType pt) {
695
private PermissionButton create_perm_choice (Permissions.Type pt) {
705
696
var permission_button = new PermissionButton (pt);
706
697
permission_button.btn_read.toggled.connect (permission_button_toggle);
707
698
permission_button.btn_write.toggled.connect (permission_button_toggle);
712
703
private uint32 get_perm_from_chmod_unit (uint32 vfs_perm, int nb,
713
int chmod, PermissionType pt) {
704
int chmod, Permissions.Type pt) {
714
705
if (nb > 7 || nb < 0)
715
706
critical ("erroned chmod code %d %d", chmod, nb);
735
726
vfs_perm = get_perm_from_chmod_unit (vfs_perm, (int) chmod / 100,
736
chmod, PermissionType.USER);
727
chmod, Permissions.Type.USER);
738
729
vfs_perm = get_perm_from_chmod_unit (vfs_perm, (int) (chmod / 10) % 10,
739
chmod, PermissionType.GROUP);
730
chmod, Permissions.Type.GROUP);
741
732
vfs_perm = get_perm_from_chmod_unit (vfs_perm, (int) chmod % 10,
742
chmod, PermissionType.OTHER);
733
chmod, Permissions.Type.OTHER);
747
private void update_permission_type_buttons (PermissionButton hbox, uint32 permissions, PermissionType pt) {
749
foreach (var widget in hbox.get_children ()) {
750
Gtk.ToggleButton btn = (Gtk.ToggleButton) widget;
751
((permissions & vfs_perms[pt, i]) != 0) ? btn.active = true : btn.active = false;
756
739
private void update_perm_grid_toggle_states (uint32 permissions) {
757
update_permission_type_buttons (perm_button_user, permissions, PermissionType.USER);
758
update_permission_type_buttons (perm_button_group, permissions, PermissionType.GROUP);
759
update_permission_type_buttons (perm_button_other, permissions, PermissionType.OTHER);
762
private bool is_chmod_code (string str) {
764
var regex = new Regex ("^[0-7]{3}$");
765
if (regex.match (str))
767
} catch (RegexError e) {
768
assert_not_reached ();
740
perm_button_user.update_buttons (permissions);
741
perm_button_group.update_buttons (permissions);
742
perm_button_other.update_buttons (permissions);
774
745
private void reset_and_cancel_perm_timeout () {
802
773
private void entry_changed () {
803
774
var str = perm_code.get_text ();
804
if (is_chmod_code (str)) {
775
if (Permissions.is_chmod_code (str)) {
805
776
reset_and_cancel_perm_timeout ();
806
777
timeout_perm = Timeout.add (60, () => {
807
778
uint32 perm = chmod_to_vfs (int.parse (str));
812
783
foreach (GOF.File gof in files) {
813
784
if (gof.can_set_permissions() && gof.permissions != perm) {
814
785
gof.permissions = perm;
815
787
/* update permission label once */
817
l_perm.set_text (goffile.get_permissions_as_string ());
789
l_perm.label = "<tt>%s</tt>".printf (goffile.get_permissions_as_string ());
818
792
/* real update permissions */
819
793
file_set_attributes.begin (gof, FileAttribute.UNIX_MODE, perm, cancellable);
898
872
group_combo.margin_bottom = 12;
900
874
var owner_label = new KeyLabel (_("Owner:"));
901
perm_button_user = create_perm_choice (PermissionType.USER);
875
perm_button_user = create_perm_choice (Permissions.Type.USER);
903
877
var group_label = new KeyLabel (_("Group:"));
904
perm_button_group = create_perm_choice (PermissionType.GROUP);
878
perm_button_group = create_perm_choice (Permissions.Type.GROUP);
906
880
var other_label = new KeyLabel (_("Everyone:"));
907
perm_button_other = create_perm_choice (PermissionType.OTHER);
909
perm_code = new Granite.Widgets.XsEntry ();
910
perm_code.set_text ("000");
911
perm_code.set_max_length (3);
912
perm_code.set_size_request (35, -1);
914
l_perm = new Gtk.Label (goffile.get_permissions_as_string ());
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;
916
891
perm_grid = new Gtk.Grid ();
917
892
perm_grid.column_spacing = 6;