Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require "gtk3"
- require "webkit-gtk"
- require "rss"
- require "open-uri"
- require "forwardable"
- class FeedCollector
- attr_reader :feeds
- def initialize
- feeds = %w(
- http://hosted.ap.org/lineups/TOPHEADS.rss?SITE=AP&SECTION=HOME
- http://feeds.feedburner.com/cnet/tcoc?format=xml
- http://www.google.com/doodles/doodles.xml
- )
- feed = nil
- threads = []
- for uri in feeds
- threads << Thread.new(uri) do |u|
- text = ""
- open(u) do |f|
- text = f.read
- end
- rss = RSS::Parser.parse(text, false)
- Thread.current[:feed] = rss
- end
- end
- @feeds = []
- threads.each do |t|
- t.join
- @feeds.push t[:feed]
- end
- end
- end
- class MainWindow < Gtk::Window
- def initialize
- super
- Gtk.init
- self.signal_connect "destroy" do
- Gtk.main_quit
- end
- @layout = Gtk::Box.new(Gtk::Orientation::HORIZONTAL)
- self.add(@layout)
- end
- def l_add(widget)
- @layout.add(widget)
- end
- def pack_start(widget)
- @layout.pack_start(widget)
- end
- def pack_end(widget)
- @layout.pack_end(widget)
- end
- end
- class FeedList < Gtk::ScrolledWindow
- def initialize(feeds, parent)
- super()
- @feeds = feeds
- @layout = Gtk::Box.new(Gtk::Orientation::VERTICAL)
- @feeds.each do |feed|
- @layout.add(FeedListItem.new(feed, parent))
- end
- self.add(@layout)
- end
- class FeedListItem < Gtk::Button
- def initialize(feed, parent)
- super()
- @layout = Gtk::Box.new(Gtk::Orientation::HORIZONTAL)
- @feed, @title, @count = feed, feed.channel.title, feed.items.size
- @f_name = Gtk::Label.new
- @f_name.set_wrap(true)
- @f_name.set_alignment(0, 0)
- @f_name.set_markup "<b>#{@title}</b>"
- @f_count = Gtk::Label.new
- @f_count.set_wrap(true)
- @f_count.set_alignment(1, 0)
- @f_count.set_markup "<b>#{@count}</b>"
- @layout.pack_start(@f_name)
- @layout.pack_end(@f_count)
- self.add(@layout)
- self.signal_connect "clicked" do
- parent.feed = feed
- end
- end
- end
- end
- class FeedListWindow < Gtk::Box
- def initialize(feeds, parent)
- super(Gtk::Orientation::VERTICAL)
- @label = Gtk::Label.new
- @label.set_markup "<b>Feeds</b>"
- self.add(@label)
- self.pack_end(FeedList.new(feeds, parent))
- self.set_size_request(200, -1)
- end
- end
- class FeedItems < Gtk::ScrolledWindow
- def initialize(items, parent = nil)
- super()
- @items = items
- @layout = Gtk::Box.new(Gtk::Orientation::VERTICAL)
- @items.each do |item|
- item = FeedItem.new(parent, item.title, item.link, item.date, item.description)
- @layout.add(item)
- end
- self.add(@layout)
- end
- class FeedItem < Gtk::ToggleButton
- attr_reader :title, :link, :date, :description
- attr :timestamp
- def initialize(parent, title, link, date, description)
- super()
- @layout = Gtk::Box.new(Gtk::Orientation::VERTICAL)
- @timestamp = Date.new
- @title, @link, @date ,@description = title, link, date, description
- @short_desc = @description[0..100] + "..."
- @header = Gtk::Label.new
- @header.set_wrap(true)
- @header.set_alignment(0, 0)
- @header.set_markup "<b>#{@title}</b>"
- @desc = Gtk::Label.new
- @desc.set_wrap(true)
- @desc.set_alignment(0, 1)
- @desc.set_text "#{@short_desc}"
- @layout.pack_start(@header)
- @layout.pack_end(@desc)
- self.add(@layout)
- self.signal_connect "clicked" do
- parent.load_html(@description, "./")
- end
- end
- end
- end
- class FeedWindow < Gtk::Box
- def initialize(feed, parent)
- super(Gtk::Orientation::VERTICAL)
- @parent = parent
- @title, @count = feed.channel.title, feed.items.size
- @label = Gtk::Label.new
- @label.set_markup "<b>#{@title} (#{@count} articles)</b>"
- self.add(@label)
- @feed = FeedItems.new(feed.items, @parent)
- self.pack_end(@feed)
- self.set_size_request(375, -1)
- end
- def feed=(feed)
- @feed.destroy()
- @title, @count = feed.channel.title, feed.items.size
- @label.set_markup "<b>#{@title} (#{@count} articles)</b>"
- @feed = FeedItems.new(feed.items, @parent)
- self.pack_end(@feed)
- @feed.show()
- end
- end
- class Browser < Gtk::ScrolledWindow
- extend Forwardable
- def_delegator :@browser, :load_html_string, :load_html
- def initialize
- super()
- @browser = WebKitGtk::WebView.new
- self.add(@browser)
- end
- end
- if __FILE__ == $PROGRAM_NAME
- window = MainWindow.new
- uri = "http://hosted.ap.org/lineups/TOPHEADS.rss?SITE=AP&SECTION=HOME"
- text = ""
- open(uri) do |f|
- text = f.read
- end
- rss = RSS::Parser.parse(text, false)
- collector = FeedCollector.new
- web = Browser.new
- feed = FeedWindow.new(rss, web)
- list = FeedListWindow.new(collector.feeds, feed)
- window.l_add(list)
- window.l_add(feed)
- window.pack_end(web)
- window.show_all
- Gtk.main
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement