From 3357249d282a0e5689693e64a3c4af01046aa13d Mon Sep 17 00:00:00 2001 From: Anna Date: Tue, 18 May 2010 12:26:31 -0400 Subject: [PATCH] Initial commit of 'conversation' button... needs a lot of work still --- apithreads.py | 47 +++++++++++++++++++++++++++++++++++++++++++++++ mytwitter.py | 18 ++++++++++++++---- twitterwidgets.py | 21 +++++++++++++++++++++ 3 files changed, 82 insertions(+), 4 deletions(-) diff --git a/apithreads.py b/apithreads.py index 4658cdc..1229728 100644 --- a/apithreads.py +++ b/apithreads.py @@ -145,6 +145,53 @@ class GetSingleTweet(ApiThread): +class GetConversation(ApiThread): + def __init__(self, api, pane, root_tweet_id): + ApiThread.__init__(self, api) + self.pane = pane + self.root_tweet_id = root_tweet_id + + + def run(self): + statuses = [] + last_tweet = None + + # Get the root tweet + try: + with self.api.lock: + last_tweet = self.api.GetStatus(self.single_tweet) + statuses.append(last_tweet) + except (HTTPError, URLError): + statuses = None + last_tweet = None + + # get tweets in a loop, until there is no in_reply_to_status_id + if last_tweet is not None: + while last_tweet.in_reply_to_status_id is not None: + try: + with self.api.lock: + last_tweet = self.api.GetStatus(self.single_tweet) + statuses.append(last_tweet) + except (HTTPError, URLError): + last_tweet = None + + # In case we've never seen some of these users, grab their profile images and cache them + for status in statuses: + avcache.add_to_cache(status.user) + + statuses.reverse() + + gtk.gdk.threads_enter() + try: + self.pane.update_window(statuses) + finally: + gtk.gdk.threads_leave() + + +### End class GetConversation + + + class GetFollowing(ApiThread): def __init__(self, api, pane, user): ApiThread.__init__(self, api) diff --git a/mytwitter.py b/mytwitter.py index 8bf1d35..ccc7db1 100755 --- a/mytwitter.py +++ b/mytwitter.py @@ -238,6 +238,10 @@ class MyTwitter(): self.add_to_notebook(data['name'], data['id']) + def on_conversation(self, widget, data): + self.add_to_notebook(data['name'], data['id'], True) + + def on_view_selected(self, event, username, name): if name == 'Home' or name == 'Direct Messages': full_name = username + '/' + name @@ -269,7 +273,7 @@ class MyTwitter(): self.remove_view(name, single_tweet) - def add_to_notebook(self, name, single_tweet=None): + def add_to_notebook(self, name, single_tweet=None, conversation=False): # If it already exists, don't add it, just switch to it for i in range(self.tweet_notebook.get_n_pages()): pane = self.tweet_notebook.get_nth_page(i) @@ -305,15 +309,21 @@ class MyTwitter(): new_pane.connect('tweet-reply', self.on_reply) new_pane.connect('tweet-retweet', self.on_retweet) new_pane.connect('tweet-in-reply-to', self.on_reply_to) + new_pane.connect('tweet-conversation', self.on_conversation) new_pane.connect('show-user', self.show_user_callback) new_pane.connect('following-set', self.update_follow_button) new_pane.connect('verified-set', self.update_verified_label) # Special logic for single tweet pane if single_tweet is not None: - apithreads.GetSingleTweet(api=self.api, - pane=new_pane, - single_tweet=single_tweet).start() + if conversation: + apithreads.GetConversation(api=self.api, + pane=new_pane, + root_tweet_id=single_tweet).start() + else: + apithreads.GetSingleTweet(api=self.api, + pane=new_pane, + single_tweet=single_tweet).start() else: self.update_single_window(new_pane) diff --git a/twitterwidgets.py b/twitterwidgets.py index 7412001..0b05650 100644 --- a/twitterwidgets.py +++ b/twitterwidgets.py @@ -63,6 +63,7 @@ class TweetPane(gtk.ScrolledWindow): self.tweets[i].connect('reply', self.on_tweet_reply) self.tweets[i].connect('retweet', self.on_retweet) self.tweets[i].connect('in-reply-to', self.on_tweet_reply_to) + self.tweets[i].connect('conversation', self.on_tweet_conversation) self.tweets[i].connect('show-user', self.on_show_user) viewport.add(tweet_box) @@ -173,6 +174,9 @@ class TweetPane(gtk.ScrolledWindow): self.emit('tweet-in-reply-to', data) + def on_tweet_conversation(self, widget, data): + self.emit('tweet-conversation', data) + def on_show_user(self, widget, data): self.emit('show-user', data) @@ -216,6 +220,9 @@ gobject.signal_new("tweet-retweet", TweetPane, gobject.signal_new("tweet-in-reply-to", TweetPane, gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,)) +gobject.signal_new("tweet-conversation", TweetPane, + gobject.SIGNAL_RUN_LAST, + gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,)) gobject.signal_new("show-user", TweetPane, gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,)) @@ -300,6 +307,11 @@ class TweetBox(gtk.HBox): self.reply_to_button.set_relief(gtk.RELIEF_NONE) button_box.pack_start(self.reply_to_button, expand=False) self.reply_to_button.connect("clicked", self.on_in_reply_to_clicked) + + self.conversation_button = gtk.Button("Conversation") + self.conversation_button.set_relief(gtk.RELIEF_NONE) + button_box.pack_start(self.conversation_button, expand=False) + self.conversation_button.connect("clicked", self.on_conversation_clicked) reply_button = gtk.Button("Reply") reply_button.set_relief(gtk.RELIEF_HALF) @@ -356,6 +368,7 @@ class TweetBox(gtk.HBox): # If this is in reply to something, set appropriate label if self.in_reply_to_screen_name and self.in_reply_to_id: self.reply_to_button.set_label('in reply to ' + self.in_reply_to_screen_name) + self.conversation_button.show() def clear_status(self): @@ -365,6 +378,7 @@ class TweetBox(gtk.HBox): self.id = None self.set_read(True) self.reply_to_button.set_label('') + self.conversation_button.hide() self.avatar.hide() @@ -389,6 +403,10 @@ class TweetBox(gtk.HBox): self.emit('in-reply-to', {'id': self.in_reply_to_id, 'name': self.in_reply_to_screen_name}) + def on_conversation_clicked(self, widget): + self.emit('in-reply-to', {'id': self.in_reply_to_id, 'name': self.in_reply_to_screen_name}) + + def on_user_clicked(self, widget): self.emit('show-user', self.screen_name) @@ -418,6 +436,9 @@ gobject.signal_new("retweet", TweetBox, gobject.signal_new("in-reply-to", TweetBox, gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,)) +gobject.signal_new("conversation", TweetBox, + gobject.SIGNAL_RUN_LAST, + gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,)) gobject.signal_new("show-user", TweetBox, gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,))