diff --git a/mytwitter.py b/mytwitter.py index 00581a4..e923bd3 100755 --- a/mytwitter.py +++ b/mytwitter.py @@ -2,7 +2,7 @@ # # Custom twitter client... mostly for learning Python -import sys, twitter, ConfigParser, os, datetime, dateutil.tz, gtk, gtk.glade, gobject +import sys, twitter, ConfigParser, os, datetime, dateutil.tz, gtk, gtk.glade, gobject, re class MyTwitter(): @@ -23,9 +23,9 @@ class MyTwitter(): if self.refresh_time < 10: self.refresh_time = 10 - self.labels = [] - self.texts = [] + self.tweets = [] self.list = None + self.reply_id = None # Authenticate with twitter, set up the API object self.api = twitter.Api(username=self.username, password=self.password) @@ -48,26 +48,10 @@ class MyTwitter(): # Build us some labels... for i in range(0, self.num_entries): - ## Build the header - self.labels.append(gtk.Label()) - label_eb = gtk.EventBox() - label_eb.add(self.labels[i]) - label_eb.modify_text(gtk.STATE_NORMAL,gtk.gdk.color_parse("#ffffff")) - label_eb.modify_bg(gtk.STATE_NORMAL,gtk.gdk.color_parse("#8888ff")) - self.tweet_box.pack_start(label_eb) - self.labels[i].set_alignment(0.0, 0.0) - self.labels[i].set_selectable(True) - self.labels[i].set_line_wrap(True) - ## Build the text - self.texts.append(gtk.Label()) - text_align = gtk.Alignment() - text_align.set_padding(2, 10, 3, 0) - text_align.add(self.texts[i]) - self.tweet_box.pack_start(text_align) - self.texts[i].set_alignment(0.0, 0.0) - self.texts[i].set_selectable(True) - self.texts[i].set_line_wrap(True) - + self.tweets.append(TweetBox()) + self.tweet_box.pack_start(self.tweets[i]) + self.tweets[i].reply_button.connect('clicked', self.on_reply) + self.tweets[i].retweet_button.connect('clicked', self.on_retweet) self.tweet_box.show_all() # Fill the ComboBox with entries @@ -82,9 +66,6 @@ class MyTwitter(): def update_window(self): - timezone = dateutil.tz.gettz() - time_format = "%Y.%m.%d %H:%M:%S %Z" - if self.list is None or self.list == 'Home': statuses = self.api.GetFriendsTimeline(self.username, count=self.num_entries) elif self.list == '@' + self.username: @@ -94,18 +75,7 @@ class MyTwitter(): for i in range(0, self.num_entries): if i < len(statuses): - # Update the label with the user's name and screen name - user = statuses[i].user - - timestamp = datetime.datetime.strptime(statuses[i].created_at, "%a %b %d %H:%M:%S +0000 %Y") - timestamp = timestamp.replace(tzinfo=dateutil.tz.gettz('UTC')) - timestring = timestamp.astimezone(timezone).strftime(time_format) - - labeltext = user.name + " (" + user.screen_name + ") " + timestring - self.labels[i].set_markup(labeltext) - - # Display the text of the tweet - self.texts[i].set_markup(statuses[i].text) + self.tweets[i].set_status(statuses[i]) def update_window_callback(self, widget): @@ -140,7 +110,95 @@ class MyTwitter(): self.list = widget.get_active_text() self.update_window() -### end class TwitWindow + + # fixme: these are stubs + def on_reply(self, reply): + pass + + + def on_retweet(self, retweet): + pass + +### end class MyTwitter + + +class TweetBox(gtk.VBox): + + ''' + GUI for displaying one tweet and associated buttons + + Also stores the data necessary for replying or retweeting (id, screen name) + ''' + + def __init__(self): + gtk.VBox.__init__(self) + + self.screen_name = None + self.id = None + + self.init_widgets() + + + def init_widgets(self): + ## Build the header + self.header = gtk.Label() + label_eb = gtk.EventBox() + label_eb.add(self.header) + self.pack_start(label_eb) + + # Set the header's properties + label_eb.modify_text(gtk.STATE_NORMAL,gtk.gdk.color_parse("#ffffff")) + label_eb.modify_bg(gtk.STATE_NORMAL,gtk.gdk.color_parse("#8888ff")) + self.header.set_alignment(0.0, 0.0) + self.header.set_selectable(True) + self.header.set_line_wrap(True) + + ## Build the text + self.text = gtk.Label() + text_align = gtk.Alignment() + text_align.add(self.text) + self.pack_start(text_align) + + # Set the text's properties + text_align.set_padding(2, 10, 3, 0) + self.text.set_alignment(0.0, 0.0) + self.text.set_selectable(True) + self.text.set_line_wrap(True) + + button_box = gtk.HBox() + self.pack_start(button_box) + + self.reply_button = gtk.Button("Reply") + button_box.pack_start(self.reply_button, expand=False) + self.retweet_button = gtk.Button("Retweet") + button_box.pack_start(self.retweet_button, expand=False) + # the parent object will bind reply and retweet + + + def set_status(self, status): + timezone = dateutil.tz.gettz() + time_format = "%Y.%m.%d %H:%M:%S %Z" + + # Get the user object + user = status.user + + # Get user's data for retweeting / replying + self.screen_name = user.screen_name + self.id = status.id + + # ... and a formatted timestamp + timestamp = datetime.datetime.strptime(status.created_at, "%a %b %d %H:%M:%S +0000 %Y") + timestamp = timestamp.replace(tzinfo=dateutil.tz.gettz('UTC')) + timestring = timestamp.astimezone(timezone).strftime(time_format) + + # Set the header + self.header.set_markup(user.name + " (" + user.screen_name + ") " + timestring) + + # and the text + self.text.set_markup(status.text) + +# end class TweetBox + # main