class Feed : Gtk.EventBox { public string _id; public string _title; public string _link; public string _source; public string _icon; public Gee.ArrayList _items; public Client _client; private Gtk.Alignment align; private Gtk.Alignment left_align; private Gtk.Alignment right_align; private Gtk.VBox left_vbox; private Gtk.VBox right_vbox; private Gtk.Alignment items_align; private Gtk.VBox items_vbox; private Gtk.HBox main_hbox; private Gtk.Label title_label; private Gtk.Alignment icon_align; private Gtk.EventBox icon_eventbox; private Gtk.Image icon_image; private Gtk.Alignment remove_align; private Gtk.EventBox remove_eventbox; private Gtk.Image remove_image; construct { /* main object with padding */ align = new Gtk.Alignment(0.0f, 0.0f, 0.0f, 0.0f); add(align); main_hbox = new Gtk.HBox(false, 5); align.add(main_hbox); /* left part with icon and remove button */ left_align = new Gtk.Alignment(0.0f, 0.0f, 0.0f, 1.0f); main_hbox.pack_start(left_align); left_vbox = new Gtk.VBox(false, 0); left_align.add(left_vbox); /* icon */ icon_align = new Gtk.Alignment (0.0f, 0.0f, 0.0f, 0.0f); icon_eventbox = new Gtk.EventBox(); icon_align.add(icon_eventbox); icon_image = new Gtk.Image(); icon_eventbox.add(icon_image); left_vbox.pack_start(icon_align); /* remove button */ remove_align = new Gtk.Alignment(0.0f, 1.0f, 0.0f, 0.0f); remove_eventbox = new Gtk.EventBox(); remove_align.add(remove_eventbox); remove_image = new Gtk.Image.from_icon_name("list-remove-symbolic", Gtk.IconSize.BUTTON); remove_eventbox.add(remove_image); left_vbox.pack_end(remove_align); /* right part with title of feed and items */ right_align = new Gtk.Alignment(0.0f, 0.0f, 0.0f, 0.0f); main_hbox.pack_end(right_align); right_vbox = new Gtk.VBox(false, 0); right_align.add(right_vbox); title_label = new Gtk.Label(""); title_label.set_alignment(0.0f, 0.0f); right_vbox.pack_start(title_label); items_align = new Gtk.Alignment(0.0f, 0.0f, 0.0f, 0.0f); items_vbox = new Gtk.VBox(false, 0); items_align.add(items_vbox); right_vbox.pack_end(items_align); } public void fetch() { _id = _client.add_feed(_source); render(); } public void render() { /* after construction of GTK, create */ load(); load_items(); remove_eventbox.button_press_event.connect(() => { _client.remove_feed(_id); destroy(); return true; }); title_label.set_markup("" + _title + ""); icon_image.set_from_file(_icon); var items_buf = new Gtk.VBox(false, 0); foreach (Item cur_item in _items) { stderr.printf("%s %s\n", cur_item._title, cur_item._date); //if (cur_item._read == "0") { cur_item.render(); items_vbox.pack_start(cur_item); //} } items_vbox = items_buf; show_all(); } public void load() { stderr.printf("JSON: %s\n", _client.get_feed_details(_id)); var parser = new Json.Parser(); parser.load_from_data(_client.get_feed_details(_id)); var cur_object = parser.get_root().get_object().get_object_member("0"); _title = cur_object.get_string_member("title"); _link = cur_object.get_string_member("link"); _source = cur_object.get_string_member("source"); _icon = "../favicon.ico"; } private void load_items() { /* init array */ _items = new Gee.ArrayList(); /* load all items for better performance */ stderr.printf("JSON: %s\n", _client.get_items(_id)); var parser = new Json.Parser(); parser.load_from_data(_client.get_items(_id)); var root_object_items = parser.get_root().get_object(); for (int item_index = 0; root_object_items.has_member(item_index.to_string()); item_index++) { var cur_object_item = root_object_items.get_object_member(item_index.to_string()); var cur_item = new Item(); cur_item._id = cur_object_item.get_string_member("id"); cur_item._title = cur_object_item.get_string_member("title"); cur_item._link = cur_object_item.get_string_member("link"); cur_item._date = cur_object_item.get_string_member("date"); cur_item._read = cur_object_item.get_string_member("read"); cur_item._client = _client; _items.add(cur_item); } /* sort items by date (new first, old at end) */ _items.sort_with_data((CompareDataFunc) sort_func_items); } }