~lubuntu-software-center-team/lubuntu-software-center/vala-port

« back to all changes in this revision

Viewing changes to src/Widgets/Pages/CategoriesView.vala

  • Committer: Stephen Smally
  • Date: 2012-03-18 10:38:53 UTC
  • Revision ID: eco.stefi@fastwebnet.it-20120318103853-v7wg1qfuifjkc3gc
Implemented dynamic category view

Show diffs side-by-side

added added

removed removed

Lines of Context:
2
2
using Gtk;
3
3
 
4
4
namespace Lsc.Widgets {
5
 
    public class CategoryButton : Button {
6
 
        public CategoryButton (string icon, string name, bool fill = false) {
7
 
            get_style_context ().add_provider (CategoriesView.style_provider, -1);
8
 
            can_focus = false;
 
5
    public class Category : Object {
 
6
        public string image;
 
7
        public string name;
 
8
        
 
9
        public Category (string image, string group) {
 
10
            this.image = image;
 
11
            name = group;
 
12
        }
 
13
    }
 
14
    
 
15
    public class CategoryButton : EventBox {
 
16
        public CategoryButton (Category desc, bool fill = false) {
9
17
            sensitive = ! fill;
10
 
            if (icon != "" && ! fill) {
 
18
            visible_window = false;
 
19
            
 
20
            if (desc.image != "" && ! fill) {
11
21
                Box container = new Box(Orientation.HORIZONTAL, 3);
 
22
                container.border_width = 5;
12
23
                Box label_box = new Box(Orientation.VERTICAL, 0);
13
24
                label_box.valign = Align.CENTER;
14
 
                Image image_widget = new Image.from_icon_name(icon, IconSize.LARGE_TOOLBAR);
 
25
                Image image_widget = new Image.from_icon_name(desc.image, IconSize.DND);
15
26
                
16
 
                Label title = new Label("<b>"+name+"</b>");
 
27
                Label title = new Label("<b>"+Utils.nicer_pkg_name(desc.name)+"</b>");
17
28
                title.ellipsize = Pango.EllipsizeMode.END;
18
29
                title.halign = Align.START;
19
30
                title.valign = Align.END;
35
46
        }
36
47
    }
37
48
    
38
 
    public class CategoriesView : Box {
39
 
        // Css Provider
40
 
        private string CSS_STYLE = """
41
 
        .CategoriesView *:first-child .button:first-child {
42
 
            border-width: 1 0 0 1;
43
 
            border-radius: 4 0 0 0;
44
 
            -unico-outer-stroke-width: 1 0 0 1;
45
 
        }
46
 
        
47
 
        .CategoriesView *:first-child .button {
48
 
            border-width: 1 0 0 1;
49
 
            border-radius: 0 0 0 0;
50
 
            -unico-outer-stroke-width: 1 0 0 0;
51
 
        }
52
 
        
53
 
        .CategoriesView *:first-child .button:last-child {
54
 
            border-width: 1 1 0 1;
55
 
            border-radius: 0 4 0 0;
56
 
            -unico-outer-stroke-width: 1 1 0 0;
57
 
        }
58
 
        
59
 
        .CategoriesView *.button:first-child {
60
 
            padding: 0;
61
 
            margin: 0;
62
 
            border-width: 1 0 0 1;
63
 
            border-radius: 0 0 0 0;
64
 
            -unico-outer-stroke-width: 0 0 0 1;
65
 
        }
66
 
        
67
 
        .CategoriesView *.button {
68
 
            padding: 0;
69
 
            margin: 0;
70
 
            border-width: 1 0 0 1;
71
 
            border-radius: 0 0 0 0;
72
 
            -unico-outer-stroke-width: 0 0 0 0;
73
 
        }
74
 
        
75
 
        .CategoriesView *.button:last-child {
76
 
            padding: 0;
77
 
            margin: 0;
78
 
            border-width: 1 1 0 1;
79
 
            border-radius: 0 0 0 0;
80
 
            -unico-outer-stroke-width: 0 1 0 0;
81
 
        }
82
 
        
83
 
        .CategoriesView *:last-child .button:first-child {
84
 
            border-width: 1 0 1 1;
85
 
            border-radius: 0 0 0 4;
86
 
            -unico-outer-stroke-width: 0 0 1 1;
87
 
        }
88
 
        
89
 
        .CategoriesView *:last-child .button {
90
 
            border-width: 1 0 1 1;
91
 
            border-radius: 0 0 0 0;
92
 
            -unico-outer-stroke-width: 0 0 1 0;
93
 
        }
94
 
        
95
 
        .CategoriesView *:last-child .button:last-child {
96
 
            border-width: 1 1 1 1;
97
 
            border-radius: 0 0 4 0;
98
 
            -unico-outer-stroke-width: 0 1 1 0;
99
 
        }
100
 
        """;
101
 
        internal static CssProvider style_provider;
102
 
        
103
 
        public signal void category_choosed ();
 
49
    public class CategoriesView : RoundBox {
 
50
        public signal void category_choosed (string group);
104
51
        
105
52
        // Vars
106
 
        public Box box_child;
 
53
        private Box box_child;
 
54
        private Box main;
 
55
        private Separator separator;
107
56
        private CategoryButton button_child;
108
 
        private int columns;
 
57
        public int columns { get; set; }
109
58
        private int actual_col;
110
 
        
111
 
        public void add_category (string image, string name) {
112
 
            if (actual_col == columns) {
113
 
                box_child = new Box(Orientation.HORIZONTAL, 0);
114
 
                box_child.homogeneous = true;
115
 
                box_child.show();
116
 
                pack_start(box_child, true, true, 0);
117
 
                actual_col = 0;
118
 
            }
119
 
            
120
 
            button_child = new CategoryButton(image, name);
121
 
            button_child.clicked.connect(() => { category_choosed(); });
122
 
            button_child.show_all();
123
 
            
124
 
            box_child.pack_start(button_child, true, true, 0);
125
 
            actual_col++;
126
 
        }
127
 
        
128
 
        public void fill_space () {
 
59
        private new List<Category> children = null;
 
60
        
 
61
        private void pack_separator () {
 
62
            separator = new Separator(Orientation.HORIZONTAL);
 
63
            separator.margin_left = 1;
 
64
            separator.margin_right = 1;
 
65
            
 
66
            pack_start(separator, false, false, 0);
 
67
        }
 
68
        
 
69
        public void add_category (string image, string group) {
 
70
            children.append(new Category(image, group));
 
71
        }
 
72
        
 
73
        public void reconfigure_grid () {
 
74
            foreach (Widget widget in main.get_children()) {
 
75
                main.remove(widget);
 
76
            }
 
77
            box_child = null;
 
78
            actual_col = columns;
 
79
            
 
80
            foreach (Category button_desc in children) {
 
81
                if (actual_col == columns) {
 
82
                    box_child = new Box(Orientation.HORIZONTAL, 5);
 
83
                    box_child.homogeneous = true;
 
84
                    box_child.show();
 
85
                    main.pack_start(box_child, true, true, 0);
 
86
                    actual_col = 0;
 
87
                }
 
88
                button_child = new CategoryButton(button_desc);
 
89
                button_child.button_press_event.connect(() => {
 
90
                    category_choosed("cat");
 
91
                    return true;
 
92
                });
 
93
            
 
94
                box_child.pack_start(button_child, true, true, 0);
 
95
                button_child.show_all();
 
96
                
 
97
                actual_col++;
 
98
            }
 
99
            
129
100
            while (actual_col != columns) {
130
 
                button_child = new CategoryButton("", "", true);
131
 
                button_child.clicked.connect(() => { category_choosed(); });
 
101
                button_child = new CategoryButton(new Category("", ""), true);
 
102
                box_child.pack_start(button_child, true, true, 0);
132
103
                button_child.show_all();
133
 
                box_child.pack_start(button_child, true, true, 0);
134
104
                actual_col++;
135
105
            }
136
106
        }
137
107
        
138
 
        public CategoriesView (int cols) {
139
 
            columns = cols;
 
108
        public CategoriesView () {
 
109
            base(Orientation.VERTICAL, 0);
 
110
            columns = 0;
140
111
            actual_col = 0;
141
112
            
142
 
            if (style_provider == null) {
143
 
                style_provider = new CssProvider();
144
 
                try {
145
 
                    style_provider.load_from_data (CSS_STYLE, -1);
146
 
                } catch (Error e) {
147
 
                    warning ("CategoryView: %s. The widget will not look as intended", e.message);
148
 
                }
149
 
            }
150
 
            
151
 
            orientation = Orientation.VERTICAL;
152
 
            spacing = 0;
153
 
            get_style_context().add_class("CategoriesView");
154
 
            
155
 
            box_child = new Box(Orientation.HORIZONTAL, 0);
 
113
            main = new Box(Orientation.VERTICAL, 5);
 
114
            main.border_width = 5;
 
115
            
 
116
            box_child = new Box(Orientation.HORIZONTAL, 5);
156
117
            box_child.homogeneous = true;
157
 
            pack_start(box_child, true, true, 0);
 
118
            main.pack_start(box_child, true, true, 0);
 
119
            
 
120
            Label title = new Label("<b>Categories</b>");
 
121
            title.use_markup = true;
 
122
            title.halign = Align.START;
 
123
            title.margin = 5;
 
124
            
 
125
            pack_start(title, false, false, 0);
 
126
            pack_separator();
 
127
            pack_start(main, false, false, 0);
 
128
            
 
129
            notify["columns"].connect(reconfigure_grid);
158
130
        }
159
131
    }
160
132
}