~jeremywootten/pantheon-files/fix-1604300-merge-find-functionalities-part1

« back to all changes in this revision

Viewing changes to src/Dialogs/PropertiesWindow.vala

  • Committer: Jeremy Wootten
  • Date: 2017-01-13 13:31:06 UTC
  • mfrom: (2412.1.32 pantheon-files)
  • Revision ID: jeremy@elementaryos.org-20170113133106-v9l164ms13lh3p0a
Merge trunk to r2444 and resolve conflicts

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
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)
4
4
*
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 {
24
24
 
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;
29
29
 
97
97
        ICON
98
98
    }
99
99
 
100
 
    public enum PermissionType {
101
 
        USER,
102
 
        GROUP,
103
 
        OTHER
104
 
    }
105
 
 
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 ();
191
185
 
192
186
        update_selection_size (); /* Start counting first to get number of selected files and folders */    
193
 
        build_header_box ();
 
187
 
 
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);
 
192
 
 
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 ();
 
201
            reset_entry_text ();
 
202
 
 
203
            entry.activate.connect (() => {
 
204
                rename_file (goffile, entry.get_text ());
 
205
            });
 
206
 
 
207
            entry.focus_out_event.connect (() => {
 
208
                rename_file (goffile, entry.get_text ());
 
209
                return false;
 
210
            });
 
211
            header_title = entry;
 
212
        }
 
213
 
 
214
        create_header_title ();
194
215
 
195
216
        /* Permissions */
196
217
        /* Don't show permissions for uri scheme trash and archives */
318
339
        entry.set_text (original_name);
319
340
    }
320
341
 
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);
326
 
 
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 ();
335
 
            reset_entry_text ();
336
 
 
337
 
            entry.activate.connect (() => {
338
 
                rename_file (goffile, entry.get_text ());
339
 
            });
340
 
 
341
 
            entry.focus_out_event.connect (() => {
342
 
                rename_file (goffile, entry.get_text ());
343
 
                return false;
344
 
            });
345
 
            header_title = entry;
346
 
        }
347
 
 
348
 
        create_header_title ();
349
 
    }
350
 
 
351
342
    private string? get_common_ftype () {
352
343
        string? ftype = null;
353
344
        if (files == null)
659
650
        return false;
660
651
    }
661
652
 
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) {
663
654
        switch (pt) {
664
 
        case PermissionType.USER:
 
655
        case Permissions.Type.USER:
665
656
            owner_perm_code += mult*val;
666
657
            break;
667
 
        case PermissionType.GROUP:
 
658
        case Permissions.Type.GROUP:
668
659
            group_perm_code += mult*val;
669
660
            break;
670
 
        case PermissionType.OTHER:
 
661
        case Permissions.Type.OTHER:
671
662
            everyone_perm_code += mult*val;
672
663
            break;
673
664
        }
674
665
    }
675
666
 
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");
679
670
        int mult = 1;
680
671
 
681
672
        reset_and_cancel_perm_timeout ();
685
676
        }
686
677
 
687
678
        switch (permission_value) {
688
 
            case PermissionButton.Value.READ:
 
679
            case Permissions.Value.READ:
689
680
                update_perm_codes (pt, 4, mult);
690
681
                break;
691
 
            case PermissionButton.Value.WRITE:
 
682
            case Permissions.Value.WRITE:
692
683
                update_perm_codes (pt, 2, mult);
693
684
                break;
694
 
            case PermissionButton.Value.EXE:
 
685
            case Permissions.Value.EXE:
695
686
                update_perm_codes (pt, 1, mult);
696
687
                break;
697
688
        }
701
692
        }
702
693
    }
703
694
 
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);
710
701
    }
711
702
 
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);
716
707
 
733
724
 
734
725
        /* user */
735
726
        vfs_perm = get_perm_from_chmod_unit (vfs_perm, (int) chmod / 100,
736
 
                                             chmod, PermissionType.USER);
 
727
                                             chmod, Permissions.Type.USER);
737
728
        /* group */
738
729
        vfs_perm = get_perm_from_chmod_unit (vfs_perm, (int) (chmod / 10) % 10,
739
 
                                             chmod, PermissionType.GROUP);
 
730
                                             chmod, Permissions.Type.GROUP);
740
731
        /* other */
741
732
        vfs_perm = get_perm_from_chmod_unit (vfs_perm, (int) chmod % 10,
742
 
                                             chmod, PermissionType.OTHER);
 
733
                                             chmod, Permissions.Type.OTHER);
743
734
 
744
735
        return vfs_perm;
745
736
    }
746
737
 
747
 
    private void update_permission_type_buttons (PermissionButton hbox, uint32 permissions, PermissionType pt) {
748
 
        int i=0;
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;
752
 
            i++;
753
 
        }
754
 
    }
755
738
 
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);
760
 
    }
761
 
 
762
 
    private bool is_chmod_code (string str) {
763
 
        try {
764
 
            var regex = new Regex ("^[0-7]{3}$");
765
 
            if (regex.match (str))
766
 
                return true;
767
 
        } catch (RegexError e) {
768
 
            assert_not_reached ();
769
 
        }
770
 
 
771
 
        return false;
 
740
        perm_button_user.update_buttons (permissions);
 
741
        perm_button_group.update_buttons (permissions);
 
742
        perm_button_other.update_buttons (permissions);
772
743
    }
773
744
 
774
745
    private void reset_and_cancel_perm_timeout () {
801
772
 
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;
 
786
 
815
787
                        /* update permission label once */
816
 
                        if (n<1)
817
 
                            l_perm.set_text (goffile.get_permissions_as_string ());
 
788
                        if (n < 1) {
 
789
                            l_perm.label = "<tt>%s</tt>".printf (goffile.get_permissions_as_string ());
 
790
                        }
 
791
 
818
792
                        /* real update permissions */
819
793
                        file_set_attributes.begin (gof, FileAttribute.UNIX_MODE, perm, cancellable);
820
794
                        n++;
898
872
        group_combo.margin_bottom = 12;
899
873
 
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);
902
876
 
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);
905
879
 
906
880
        var other_label = new KeyLabel (_("Everyone:"));
907
 
        perm_button_other = create_perm_choice (PermissionType.OTHER);
908
 
 
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);
913
 
 
914
 
        l_perm = new Gtk.Label (goffile.get_permissions_as_string ());
 
881
        perm_button_other = create_perm_choice (Permissions.Type.OTHER);
 
882
 
 
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;
 
886
 
 
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;
915
890
 
916
891
        perm_grid = new Gtk.Grid ();
917
892
        perm_grid.column_spacing = 6;