OSDN Git Service

Added status and user data store
authorHirotaka Kawata <hktechno@hotmail.com>
Fri, 19 Feb 2010 18:03:38 +0000 (03:03 +0900)
committerHirotaka Kawata <hktechno@hotmail.com>
Fri, 19 Feb 2010 18:03:38 +0000 (03:03 +0900)
main.py
timeline.py
twitterapi.py

diff --git a/main.py b/main.py
index b2ac70a..408579a 100644 (file)
--- a/main.py
+++ b/main.py
@@ -66,7 +66,7 @@ class Main:
     # Window close event
     def close(self, widget):
         gtk.main_quit()
-
+    
     # Get text
     def _get_text(self):
         buf = self.obj.textview1.get_buffer()
@@ -99,6 +99,13 @@ class Main:
         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
@@ -118,80 +125,76 @@ class Main:
     
     # 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)
index fb054c2..57cd4dd 100644 (file)
@@ -14,7 +14,7 @@ import webbrowser
 
 class timeline:
     def __init__(self, api, icons, iconmode = True):
-        self.api = api
+        self.twitter = api
         self.icons = icons
         
         # Base scrolledwindow
@@ -22,9 +22,7 @@ class timeline:
         
         # 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
@@ -55,7 +53,7 @@ class timeline:
         # 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
@@ -70,8 +68,9 @@ class timeline:
     
     # 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()
@@ -88,28 +87,27 @@ class timeline:
     # 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 & -> &amp;
     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)
         
@@ -154,8 +152,7 @@ class timeline:
     
     # 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
@@ -166,6 +163,8 @@ class timeline:
         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
@@ -178,10 +177,10 @@ class timeline:
                 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
@@ -191,10 +190,7 @@ class timeline:
             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()
@@ -204,17 +200,15 @@ class timeline:
         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)
@@ -230,7 +224,7 @@ class timeline:
             
             # 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)
index 02595cf..dfe584a 100644 (file)
@@ -11,15 +11,34 @@ class twitterapi():
     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):
@@ -32,7 +51,7 @@ class timeline_thread(threading.Thread):
         self.sleep = sleep
         self.lastid = None
         self.timeline = list()
-
+        
         # API Arguments
         self.args = args
         self.kwargs = kwargs
@@ -50,11 +69,15 @@ class timeline_thread(threading.Thread):
             
             # 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)