~gotwig/gazette/global-service-states

« back to all changes in this revision

Viewing changes to plugins/News.vala

  • Committer: Santiago Ocamica
  • Date: 2013-04-26 23:06:22 UTC
  • Revision ID: santi6982@gmail.com-20130426230622-6zs94h7yyh1pqsdn
Started restructure of the project

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
 
 
2
public class News : Service
 
3
{
 
4
        struct News {
 
5
                string title;
 
6
                string url;
 
7
        }
 
8
 
 
9
        Settings settings;
 
10
        Soup.Session session;
 
11
        Soup.Message message;
 
12
        ShadowedLabel label_list;
 
13
        ShadowedLabel reload;
 
14
        News[] news;
 
15
 
 
16
        public News ()
 
17
        {
 
18
                base ("news");
 
19
        reload = get_reload_label(_("news"));
 
20
                reload.hide();
 
21
                label_list = new ShadowedLabel("");
 
22
                label_list.hide();
 
23
            label_list.reactive = true;
 
24
            label_list.button_release_event.connect ((e) => {
 
25
                    float root_x, root_y;
 
26
                    label_list.get_transformed_position (out root_x, out root_y);
 
27
                    var url = news[int.min ((int)((e.y - root_y) / ((label_list.height - 20) / 10.0f)), 9)].url;
 
28
                    var uris = new List<string> ();
 
29
                    uris.append (url);
 
30
                    try {
 
31
                            AppInfo.get_default_for_uri_scheme ("http").launch_uris (uris, null);
 
32
                    } catch (Error e) { warning (e.message); }
 
33
 
 
34
                    return true;
 
35
            });
 
36
                settings = new Settings ("org.pantheon.gazette.news");
 
37
                settings.changed.connect( (key) => { if (key != "update-interval") update(); });
 
38
                session = new Soup.SessionAsync ();
 
39
        load();
 
40
            Timeout.add(settings.get_int("update-interval"), update);
 
41
                var label = new ShadowedLabel ("<span font='20' face='Raleway'>%s</span>".printf (_("News")));
 
42
                label_list.y = label.height + 12;
 
43
                label_list.x = 12;
 
44
        reload.y = label_list.y;
 
45
        reload.x = label_list.x;
 
46
                add_child (label);
 
47
                add_child(reload);
 
48
                add_child (label_list);
 
49
        }
 
50
 
 
51
        public override void create ()
 
52
        {
 
53
                
 
54
        }
 
55
        public override bool update ()
 
56
        {   debug("Updating News");
 
57
            reload.hide();
 
58
            label_list.reactive = false;
 
59
            label_list.show();
 
60
            label_list.label = "<span face='Open Sans Light' font='16'>" + _("Loading news,\nplease wait.") + "</span>";
 
61
        var soup_url = settings.get_string ("rss-url");
 
62
                message = new Soup.Message ("GET", soup_url);
 
63
            session.queue_message (message, (session, m) => 
 
64
            {
 
65
                    var output = (string)m.response_body.data;
 
66
            if (output == null) {
 
67
                label_list.hide ();
 
68
                reload.show ();
 
69
                return;
 
70
            }
 
71
                    var offset = output.index_of ("<item>");
 
72
                    news = new News[10];
 
73
                    for (var i = 0; i < 10; i++) {
 
74
                            offset = output.index_of ("<title>", offset) + 7;
 
75
                            var title = output.substring (offset, output.index_of ("</title>", offset) - offset);
 
76
                            offset = output.index_of ("<link>", offset) + 6;
 
77
                            var url = output.substring (offset, output.index_of ("</link>", offset) - offset);
 
78
                            news[i] = {ellipsize(title, 40), url};
 
79
                    }
 
80
                    var list = "<span font='12' face='Open Sans'>";
 
81
                    for (var i = 0; i < news.length; i++) {
 
82
                            list += news[i].title + "\n";
 
83
                    }
 
84
                    label_list.label = list + "</span>";
 
85
                    label_list.reactive = true;
 
86
                });
 
87
            return true;
 
88
        }
 
89
        
 
90
}
 
91
 
 
92