# Window close event
def close(self, widget):
gtk.main_quit()
-
+
# Get text
def _get_text(self):
buf = self.obj.textview1.get_buffer()
tl.treeview.connect(
"row-activated",
self.on_treeview_row_activated)
+
+ def get_selected_status(self):
+ n = self.obj.notebook1.get_current_page()
+ return self.timelines[n].get_selected_status()
+
+ def get_current_tab(self):
+ return self.obj.notebook1.get_current_page()
########################################
# Gtk Signal Events
# Reply if double-clicked status
def on_treeview_row_activated(self, treeview, path, view_column):
- n = self.obj.notebook1.get_current_page()
- status = self.timelines[n].get_status(path)
+ status = self.get_selected_status()
self.re = status.id
name = status.user.screen_name
buf = self.obj.textview1.get_buffer()
buf.set_text("@%s " % (name))
self.obj.textview1.grab_focus()
-
- def on_menuitem_usertl_activate(self, menuitem):
- n = self.obj.notebook1.get_current_page()
- status = self.timelines[n].get_selected_status()
- sname = status.user.screen_name
- self._tab_append("@%s" % sname, "user_timeline", 60, user = sname)
-
+ # Same....
def on_menuitem_reply_activate(self, menuitem):
- n = self.obj.notebook1.get_current_page()
- status = self.timelines[n].get_selected_status()
+ status = self.get_selected_status()
self.re = status.id
name = status.user.screen_name
buf = self.obj.textview1.get_buffer()
buf.set_text("@%s " % (name))
self.obj.textview1.grab_focus()
-
+
+ # Retweet menu clicked
def on_menuitem_retweet_activate(self, memuitem):
- n = self.obj.notebook1.get_current_page()
- status = self.timelines[n].get_selected_status()
+ status = self.get_selected_status()
self.twitter.api.status_retweet(status.id)
-
+
+ # Retweet with comment menu clicked
def on_menuitem_reteet_with_comment_activate(self, memuitem):
- n = self.obj.notebook1.get_current_page()
- status = self.timelines[n].get_selected_status()
+ status = self.get_selected_status()
self.re = status.id
name = status.user.screen_name
text = status.text
buf = self.obj.textview1.get_buffer()
buf.set_text("RT @%s: %s" % (name, text))
- self.obj.textview1.grab_focus()
-
+ self.obj.textview1.grab_focus()
+
+ # Added user timeline tab
+ def on_menuitem_usertl_activate(self, menuitem):
+ status = self.get_selected_status()
+ sname = status.user.screen_name
+ self._tab_append("@%s" % sname, "user_timeline", 60, user = sname)
+
# Status Clicked
def on_treeview_cursor_changed(self, treeview):
- n = self.obj.notebook1.get_current_page()
- status = self.timelines[n].get_selected_status()
-
- id = status.id
- uid = status.user.id
- to = status.in_reply_to_status_id
- to_uid = status.in_reply_to_user_id
+ status = self.get_selected_status()
+ user = status.user
- me = self.twitter.api.user.id
- myname = self.twitter.api.user.screen_name
+ me = self.twitter.users[self.twitter.myid]
- store = self.timelines[n].store
+ store = self.timelines[self.get_current_tab()].store
i = store.get_iter_first()
# Colord status
while i:
- itext, iid, iuid, ito, ito_uid = store.get(i, 1, 2, 3, 4, 5)
- if iuid == me:
+ id = store.get_value(i, 2)
+ s = self.twitter.statuses[id]
+ u = s.user
+
+ if u.id == me.id:
# My status (Green)
bg = "#CCFFCC"
- elif ito_uid == me or itext.find(myname) != -1:
+ elif s.in_reply_to_user_id == me.id or \
+ s.text.find("@%s" % me.screen_name) != -1:
# Reply to me (Red)
bg = "#FFCCCC"
- elif iid == to:
+ elif s.id == status.in_reply_to_status_id:
# Reply to (Orange)
bg = "#FFCC99"
- elif iuid == to_uid:
+ elif u.id == status.in_reply_to_user_id:
# Reply to other (Yellow)
bg = "#FFFFCC"
- elif iuid == uid:
+ elif u.id == user.id:
# Selected user (Blue)
bg = "#CCCCFF"
else:
bg = None
- store.set_value(i, 6, bg)
+ store.set_value(i, 5, bg)
i = store.iter_next(i)
class timeline:
def __init__(self, api, icons, iconmode = True):
- self.api = api
+ self.twitter = api
self.icons = icons
# Base scrolledwindow
# Liststore column setting
self.store = gtk.ListStore(
- gtk.gdk.Pixbuf, str,
- object, object, object, object,
- str, object)
+ gtk.gdk.Pixbuf, str, object, object, str, object)
self.treeview = gtk.TreeView(self.store)
# Add treeview to scrolledwindow
# Add Column
for i in tcol:
i.add_attribute(
- i.get_cell_renderers()[0], "cell-background", 6)
+ i.get_cell_renderers()[0], "cell-background", 4)
self.treeview.append_column(i)
# Auto scroll to top setup
# Start Sync Timeline (new twitter timeline thread create)
def start_sync(self, method, time, args, kwargs):
- self.timeline = self.api.create_timeline(
+ self.timeline = self.twitter.create_timeline(
method, time, args, kwargs)
+
# Set Event Hander (exec in every get timeline
self.timeline.reloadEventHandler = self._prepend_new_statuses
self.timeline.start()
# Add popup menu
def add_popup(self, menu):
self.pmenu = menu
- self.treeview.connect(
- "button-press-event",
- self.on_treeview_button_press)
-
- # Get timeline list
- def get_timeline(self):
+ self.treeview.connect("button-press-event",
+ self.on_treeview_button_press)
+
+ # Get timeline ids
+ def get_timeline_ids(self):
return self.timeline.timeline
# Get selected status
def get_selected_status(self):
- return self.timeline.timeline[
- -1 - self.treeview.get_cursor()[0][0]]
-
+ path = self.treeview.get_cursor()[0]
+ return self.get_status(path)
+
# Get status from treeview path
def get_status(self, path):
- return self.timeline.timeline[-1 - path[0]]
+ id = self.store[path][2]
+ return self.twitter.statuses[id]
# Replace & -> &
def _replace_amp(self, string):
amp = string.find('&')
- if amp == -1:
- return string
+ if amp == -1: return string
entity_match = self.noent_amp.finditer(string)
# Scroll to top if upper(list length) changed Event
def _vadj_changed(self, adj):
- if not self.vadj_lock and \
- self.vadj_upper < adj.upper:
+ if not self.vadj_lock and self.vadj_upper < adj.upper:
if len(self.store):
self.treeview.scroll_to_cell((0,))
self.vadj_upper = adj.upper
vadj = self.scrwin.get_vadjustment()
self.vadj_lock = True if vadj.value != 0.0 else False
+ myname = self.twitter.users[self.twitter.myid].screen_name
+
# Insert New Status
for i in new_timeline:
# colord url
i.user.screen_name, text)
# If my status, change background color
- if i.user.id == self.api.api.user.id:
+ if i.user.id == self.twitter.myid:
background = "#CCFFCC"
- elif i.in_reply_to_user_id == self.api.api.user.id or \
- i.text.find(self.api.api.user.screen_name) != -1:
+ elif i.in_reply_to_user_id == self.twitter.myid or \
+ i.text.find(myname) != -1:
background = "#FFCCCC"
else:
background = None
self.store.prepend(
(self.icons.get(i.user),
text,
- i.id,
- i.user.id,
- i.in_reply_to_status_id,
- i.in_reply_to_user_id,
+ i.id, i.user.id,
background,
urls))
gtk.gdk.threads_leave()
if event.button == 3:
# Get Urls
it = self.store.get_iter(self.treeview.get_cursor()[0])
- urls = self.store.get_value(it, 7)
+ urls = self.store.get_value(it, 5)
m = gtk.Menu()
if urls:
# if exist url in text, add menu
for i in urls:
- if len(i) > 50:
- label = "%s..." % i[:47]
- else:
- label = i
+ label = "%s..." % i[:47] if len(i) > 50 else i
+
# Menuitem create
item = gtk.MenuItem(label)
# Connect click event (open browser)
# urls submenu append
self.pmenu.get_children()[-1].set_submenu(m)
-
+
# Show popup menu
m.show_all()
self.pmenu.popup(None, None, None, event.button, event.time)
def __init__(self, keys, maxn):
# Generate API Library instance
self.api = twoauth.api(*keys)
- self.maxn = maxn
self.threads = list()
+
+ # User, Status Buffer
+ self.users = dict()
+ self.statuses = dict()
+
+ self.maxn = maxn
+ self.myid = self.api.user.id
+ self.users[self.myid] = self.api.user
def create_timeline(self, func, sleep, args, kwargs):
# Add New Timeline Thread
th = timeline_thread(getattr(self.api, func),
sleep, self.maxn, args, kwargs)
+ th.added_event = self.add_status
self.threads.append(th)
return th
+
+ def add_statuses(self, slist):
+ for i in slist:
+ self.add_status(i)
+
+ def add_status(self, status):
+ self.statuses[status.id] = status
+ self.add_user(status.user)
+
+ def add_user(self, user):
+ self.users[user.id] = user
# Timeline Thread
class timeline_thread(threading.Thread):
self.sleep = sleep
self.lastid = None
self.timeline = list()
-
+
# API Arguments
self.args = args
self.kwargs = kwargs
# If Timeline update
if self.last:
- # append new statuses to timeline buffer
- self.timeline.extend(self.last)
+ for i in self.last:
+ # append new statuses to timeline buffer
+ self.timeline.append(i.id)
+ self.added_event(i)
+
# update lastid
self.lastid = self.last[-1].id
self.kwargs["since_id"] = self.lastid
+
# exec EventHander (TreeView Refresh
self.reloadEventHandler(self.last)