Add refilter call for update the filter model
[moonshot-ui.git] / src / moonshot-custom-vbox.vala
1 using Gtk;
2
3 class CustomVBox : VBox
4 {
5     public IdCardWidget current_idcard { get; set; default = null; }
6
7     private ListStore listmodel;
8     private TreeModelFilter filter;
9
10     private string search_text;
11
12     private enum Columns
13     {
14         IDCARD_COL,
15         LOGO_COL,
16         ISSUER_COL,
17         USERNAME_COL,
18         PASSWORD_COL,
19         N_COLUMNS
20     }
21
22     private bool visible_func (TreeModel model, TreeIter iter)
23     {
24         string issuer;
25         string issuer_casefold;
26         string search_text_casefold;
27
28         model.get (iter,
29                    Columns.ISSUER_COL, out issuer);
30
31         issuer_casefold = issuer.casefold ();
32         search_text_casefold = search_text.casefold ();
33
34         if (issuer_casefold.contains (search_text_casefold))
35             return true;
36
37         return false;
38     }
39
40     private void setup_identities_list ()
41     {
42        this.listmodel = new ListStore (Columns.N_COLUMNS, typeof (IdCard),
43                                                           typeof (Gdk.Pixbuf),
44                                                           typeof (string),
45                                                           typeof (string),
46                                                           typeof (string));
47       this.filter = new TreeModelFilter (listmodel, null);
48
49       filter.set_visible_func (visible_func);
50     }
51
52     public CustomVBox (bool homogeneous, int spacing)
53     {
54         this.set_homogeneous (homogeneous);
55         this.set_spacing (spacing);
56
57         setup_identities_list();
58     }
59
60     public void new_text_in_search_entry (string search_text)
61     {
62         this.search_text = search_text;
63
64         filter.refilter ();
65     }
66
67     public void receive_expanded_event (IdCardWidget id_card_widget)
68     {
69         var list = this.get_children ();
70         foreach (Widget id_card in list)
71         {
72             if (id_card != id_card_widget)
73                 ((IdCardWidget) id_card).collapse ();
74         }
75     }
76
77     public void add_id_card_widget (IdCardWidget id_card_widget)
78     {
79         TreeIter iter;
80
81         this.pack_start (id_card_widget, false, false);
82
83         var id_card = id_card_widget.id_card;
84
85         this.listmodel.append (out iter);
86         listmodel.set (iter,
87                        Columns.IDCARD_COL, id_card,
88                        Columns.LOGO_COL, id_card.pixbuf,
89                        Columns.ISSUER_COL, id_card.issuer,
90                        Columns.USERNAME_COL, id_card.username,
91                        Columns.PASSWORD_COL, id_card.password);
92     }
93
94     public void remove_id_card_widget (IdCardWidget id_card_widget)
95     {
96         TreeIter iter;
97         string issuer;
98
99         this.remove (id_card_widget);
100
101         if (listmodel.get_iter_first (out iter))
102         {
103             do
104             {
105                 listmodel.get (iter,
106                                Columns.ISSUER_COL, out issuer);
107
108                 if (id_card_widget.id_card.issuer == issuer)
109                 {
110                     listmodel.remove (iter);
111                     break;
112                 }
113             }
114             while (listmodel.iter_next (ref iter));
115         }
116     }
117 }