Reworked how adding lists is handled (so the child thread does the actual work and we can employ a Condition object to allow the add_to_notebook function to have the list information available) and put in code that should list the lists a user is in. Currently seems to not function as expected, however.
This commit is contained in:
parent
48cce6a353
commit
8fac5ad7c2
|
@ -22,21 +22,14 @@ class CustomApi(OAuthApi):
|
||||||
instantiated
|
instantiated
|
||||||
'''
|
'''
|
||||||
|
|
||||||
def __init__(self, access_token):
|
def __init__(self, access_token, hrafn_obj):
|
||||||
OAuthApi.__init__(self, CONSUMER_KEY, CONSUMER_SECRET, access_token)
|
OAuthApi.__init__(self, CONSUMER_KEY, CONSUMER_SECRET, access_token)
|
||||||
self.lock = RLock()
|
self.lock = RLock()
|
||||||
self.sig_proxy = SigProxy()
|
|
||||||
|
|
||||||
self.username = self.GetUserInfo().screen_name
|
self.username = self.GetUserInfo().screen_name
|
||||||
self._username = self.username
|
self._username = self.username
|
||||||
|
|
||||||
thread = GetUserLists(api=self)
|
thread = GetUserLists(self, hrafn_obj).start()
|
||||||
thread.sig_proxy.connect('lists-ready', self.on_lists_ready)
|
|
||||||
thread.start()
|
|
||||||
|
|
||||||
|
|
||||||
def on_lists_ready(self, widget, lists, ignored):
|
|
||||||
self.sig_proxy.emit('lists-ready', self.username, lists)
|
|
||||||
|
|
||||||
# End class CustomApi
|
# End class CustomApi
|
||||||
|
|
||||||
|
@ -250,9 +243,9 @@ class GetUserInfo(ApiThread):
|
||||||
|
|
||||||
|
|
||||||
class GetUserLists(ApiThread):
|
class GetUserLists(ApiThread):
|
||||||
def __init__(self, api):
|
def __init__(self, api, hrafn_obj):
|
||||||
ApiThread.__init__(self, api)
|
ApiThread.__init__(self, api)
|
||||||
self.sig_proxy = SigProxy()
|
self.hrafn_obj = hrafn_obj
|
||||||
|
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
|
@ -272,7 +265,11 @@ class GetUserLists(ApiThread):
|
||||||
sleep(30)
|
sleep(30)
|
||||||
done = False
|
done = False
|
||||||
|
|
||||||
self.sig_proxy.emit('lists-ready', lists, None)
|
gtk.gdk.threads_enter()
|
||||||
|
try:
|
||||||
|
self.hrafn_obj.add_lists(self.api.username, lists)
|
||||||
|
finally:
|
||||||
|
gtk.gdk.threads_leave()
|
||||||
|
|
||||||
### End class GetUserLists
|
### End class GetUserLists
|
||||||
|
|
||||||
|
@ -374,10 +371,6 @@ class SigProxy(gtk.Alignment):
|
||||||
|
|
||||||
# End class SigProxy
|
# End class SigProxy
|
||||||
|
|
||||||
gobject.signal_new("lists-ready", SigProxy,
|
|
||||||
gobject.SIGNAL_RUN_LAST,
|
|
||||||
gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,gobject.TYPE_PYOBJECT))
|
|
||||||
|
|
||||||
gobject.signal_new("update-posted", SigProxy,
|
gobject.signal_new("update-posted", SigProxy,
|
||||||
gobject.SIGNAL_RUN_LAST,
|
gobject.SIGNAL_RUN_LAST,
|
||||||
gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,))
|
gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,))
|
||||||
|
|
44
hrafn.py
44
hrafn.py
|
@ -6,7 +6,7 @@ import sys, ConfigParser, os, re, optparse, shelve
|
||||||
import gtk, gtk.glade, gobject
|
import gtk, gtk.glade, gobject
|
||||||
from urllib2 import HTTPError,URLError
|
from urllib2 import HTTPError,URLError
|
||||||
from twitterwidgets import TweetPane
|
from twitterwidgets import TweetPane
|
||||||
from threading import enumerate
|
from threading import enumerate,Condition
|
||||||
import apithreads
|
import apithreads
|
||||||
|
|
||||||
|
|
||||||
|
@ -61,7 +61,7 @@ class Hrafn():
|
||||||
# Now set up the accounts and their corresponding APIs
|
# Now set up the accounts and their corresponding APIs
|
||||||
self.accounts = {}
|
self.accounts = {}
|
||||||
for token in self.db['tokens']:
|
for token in self.db['tokens']:
|
||||||
api = apithreads.CustomApi(token)
|
api = apithreads.CustomApi(token, self)
|
||||||
self.add_account(api)
|
self.add_account(api)
|
||||||
|
|
||||||
self.username = self.db['active_user']
|
self.username = self.db['active_user']
|
||||||
|
@ -82,6 +82,7 @@ class Hrafn():
|
||||||
self.reply_id = None
|
self.reply_id = None
|
||||||
|
|
||||||
self.lists = {}
|
self.lists = {}
|
||||||
|
self.lists_cond = Condition()
|
||||||
|
|
||||||
# Load up all the programmatic GUI stuff
|
# Load up all the programmatic GUI stuff
|
||||||
self.init_widgets()
|
self.init_widgets()
|
||||||
|
@ -335,6 +336,29 @@ class Hrafn():
|
||||||
new_pane.connect('tweets-read', self.on_read_tweets_changed)
|
new_pane.connect('tweets-read', self.on_read_tweets_changed)
|
||||||
|
|
||||||
if is_user:
|
if is_user:
|
||||||
|
# Find the lists this user is currently in, and pass those
|
||||||
|
# to the pane
|
||||||
|
found_lists = []
|
||||||
|
username = re.sub('user: ', '', name)
|
||||||
|
|
||||||
|
|
||||||
|
# We're not going to change the data, just access it.
|
||||||
|
# This condition only exists to let us know when the lists are
|
||||||
|
# ready
|
||||||
|
# Ergo, we can release it right after we get out of the conditional
|
||||||
|
self.lists_cond.acquire()
|
||||||
|
while not self.lists.has_key(self.username):
|
||||||
|
self.lists_cond.wait()
|
||||||
|
self.lists_cond.release()
|
||||||
|
|
||||||
|
for list_name in self.lists[self.username].keys():
|
||||||
|
try:
|
||||||
|
i = self.lists[self.username][list_name].index(username)
|
||||||
|
found_lists.append(list_name)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
new_pane.set_lists(found_lists)
|
||||||
|
|
||||||
new_pane.connect('at-clicked', self.on_at_button_clicked)
|
new_pane.connect('at-clicked', self.on_at_button_clicked)
|
||||||
new_pane.connect('follow-clicked', self.on_follow_button_clicked)
|
new_pane.connect('follow-clicked', self.on_follow_button_clicked)
|
||||||
apithreads.GetFollowing(api=self.api, pane=new_pane, user=name).start()
|
apithreads.GetFollowing(api=self.api, pane=new_pane, user=name).start()
|
||||||
|
@ -491,8 +515,12 @@ class Hrafn():
|
||||||
apithreads.GetFollowing(api=self.api, pane=pane, user=user).start()
|
apithreads.GetFollowing(api=self.api, pane=pane, user=user).start()
|
||||||
|
|
||||||
|
|
||||||
def on_lists_ready(self, widget, username, list_data):
|
def add_lists(self, username, list_data):
|
||||||
''' This callback takes information from a child thread that grabs list info from the API, and stores that info for later use '''
|
'''
|
||||||
|
This function is called by a child thread.
|
||||||
|
It takes list info from the API, stores it for later use, and uses
|
||||||
|
the data to populate the Views menu
|
||||||
|
'''
|
||||||
|
|
||||||
# Setup the new sub-menu
|
# Setup the new sub-menu
|
||||||
outer_menu_item = gtk.MenuItem(username, False)
|
outer_menu_item = gtk.MenuItem(username, False)
|
||||||
|
@ -500,9 +528,14 @@ class Hrafn():
|
||||||
new_menu = gtk.Menu()
|
new_menu = gtk.Menu()
|
||||||
outer_menu_item.set_submenu(new_menu)
|
outer_menu_item.set_submenu(new_menu)
|
||||||
|
|
||||||
|
self.lists_cond.acquire()
|
||||||
|
|
||||||
# Save the member info in a data structure for later usage
|
# Save the member info in a data structure for later usage
|
||||||
self.lists[username] = list_data
|
self.lists[username] = list_data
|
||||||
|
|
||||||
|
self.lists_cond.notify()
|
||||||
|
self.lists_cond.release()
|
||||||
|
|
||||||
list_names = list_data.keys()
|
list_names = list_data.keys()
|
||||||
list_names.sort()
|
list_names.sort()
|
||||||
|
|
||||||
|
@ -557,7 +590,7 @@ class Hrafn():
|
||||||
if token is None:
|
if token is None:
|
||||||
return
|
return
|
||||||
|
|
||||||
api = apithreads.CustomApi(token)
|
api = apithreads.CustomApi(token, self)
|
||||||
|
|
||||||
if not self.accounts.has_key(api.username):
|
if not self.accounts.has_key(api.username):
|
||||||
tokens = self.db['tokens']
|
tokens = self.db['tokens']
|
||||||
|
@ -569,7 +602,6 @@ class Hrafn():
|
||||||
def add_account(self, api):
|
def add_account(self, api):
|
||||||
username = api.username
|
username = api.username
|
||||||
self.accounts[username] = api
|
self.accounts[username] = api
|
||||||
self.accounts[username].sig_proxy.connect('lists-ready', self.on_lists_ready)
|
|
||||||
|
|
||||||
# Add account's menu item
|
# Add account's menu item
|
||||||
menu_item = gtk.RadioMenuItem(self.first_account_item, label=username, use_underline=False)
|
menu_item = gtk.RadioMenuItem(self.first_account_item, label=username, use_underline=False)
|
||||||
|
|
|
@ -225,6 +225,13 @@ class TweetPane(gtk.ScrolledWindow):
|
||||||
def on_follow_clicked(self, widget, data):
|
def on_follow_clicked(self, widget, data):
|
||||||
self.emit('follow-clicked', data)
|
self.emit('follow-clicked', data)
|
||||||
|
|
||||||
|
|
||||||
|
def set_lists(self, lists):
|
||||||
|
if not self.is_user:
|
||||||
|
return
|
||||||
|
|
||||||
|
self.user_box.set_lists(lists)
|
||||||
|
|
||||||
### end class TweetPane
|
### end class TweetPane
|
||||||
|
|
||||||
# signals for TweetPane
|
# signals for TweetPane
|
||||||
|
@ -629,15 +636,19 @@ class UserBox(gtk.VBox):
|
||||||
self.at_button = gtk.Button('@')
|
self.at_button = gtk.Button('@')
|
||||||
self.follow_label = gtk.Label('You are following this user')
|
self.follow_label = gtk.Label('You are following this user')
|
||||||
self.verified_label = gtk.Label('Verified account')
|
self.verified_label = gtk.Label('Verified account')
|
||||||
|
self.list_box = gtk.combo_box_entry_new_text()
|
||||||
|
self.list_label = gtk.Label('')
|
||||||
|
|
||||||
self.name_label.set_alignment(0.0, 0.0)
|
self.name_label.set_alignment(0.0, 0.0)
|
||||||
self.follow_label.set_alignment(0.0, 0.0)
|
self.follow_label.set_alignment(0.0, 0.0)
|
||||||
self.verified_label.set_alignment(0.0, 0.0)
|
self.verified_label.set_alignment(0.0, 0.0)
|
||||||
|
self.list_label.set_alignment(0.0, 0.0)
|
||||||
|
|
||||||
text_col = gtk.VBox()
|
text_col = gtk.VBox()
|
||||||
text_col.pack_start(self.name_label, expand=False)
|
text_col.pack_start(self.name_label, expand=False)
|
||||||
text_col.pack_start(self.verified_label, expand=False)
|
text_col.pack_start(self.verified_label, expand=False)
|
||||||
text_col.pack_start(self.follow_label, expand=False)
|
text_col.pack_start(self.follow_label, expand=False)
|
||||||
|
text_col.pack_start(self.list_label, expand=False)
|
||||||
|
|
||||||
info_row = gtk.HBox()
|
info_row = gtk.HBox()
|
||||||
info_row.pack_start(self.avatar, expand=False)
|
info_row.pack_start(self.avatar, expand=False)
|
||||||
|
@ -693,6 +704,9 @@ class UserBox(gtk.VBox):
|
||||||
self.at_button.show()
|
self.at_button.show()
|
||||||
self.follow_button.show()
|
self.follow_button.show()
|
||||||
|
|
||||||
|
if self.list_label.get_text() != '':
|
||||||
|
self.list_label.show()
|
||||||
|
|
||||||
self.info_loaded = True
|
self.info_loaded = True
|
||||||
|
|
||||||
|
|
||||||
|
@ -740,6 +754,18 @@ class UserBox(gtk.VBox):
|
||||||
self.name_label.hide()
|
self.name_label.hide()
|
||||||
self.avatar.hide()
|
self.avatar.hide()
|
||||||
|
|
||||||
|
|
||||||
|
def set_lists(self, lists):
|
||||||
|
if not lists:
|
||||||
|
return
|
||||||
|
|
||||||
|
list_label_text = 'In lists: '
|
||||||
|
|
||||||
|
for l in lists:
|
||||||
|
list_label_text += l + ' '
|
||||||
|
|
||||||
|
self.list_label.set_text(list_label_text)
|
||||||
|
|
||||||
# end class UserBox
|
# end class UserBox
|
||||||
|
|
||||||
# signals for UserBox
|
# signals for UserBox
|
||||||
|
|
Reference in New Issue
Block a user