OSDN Git Service

Added UserSelection Tab
authorHirotaka Kawata <hktechno@hotmail.com>
Mon, 8 Mar 2010 20:20:02 +0000 (05:20 +0900)
committerHirotaka Kawata <hktechno@hotmail.com>
Mon, 8 Mar 2010 20:20:02 +0000 (05:20 +0900)
iconstore.py
main.py
timeline.py
twitterapi.py
userselection.py [new file with mode: 0644]

index 87db701..a8e2f64 100644 (file)
@@ -36,8 +36,8 @@ class IconStore:
         return gtk.gdk.Pixbuf(
             gtk.gdk.COLORSPACE_RGB, True, 8, 48, 48)
     
-    def add_store(self, store):
-        self.stores.append(store)
+    def add_store(self, store, n):
+        self.stores.append((store, n))
 
 class NewIcon(threading.Thread):
     def __init__(self, user, stores, icons):
@@ -84,10 +84,10 @@ class NewIcon(threading.Thread):
         
         # Icon Refresh
         gtk.gdk.threads_enter()
-        for store in self.stores:
+        for store, n in self.stores:
             i = store.get_iter_first()
             while i:
-                uid = store.get_value(i, 3)
+                uid = store.get_value(i, n)
                 if uid == self.user.id:
                     store.set_value(i, 0, icopix)
                 i = store.iter_next(i)
diff --git a/main.py b/main.py
index faebd17..ceae58c 100644 (file)
--- a/main.py
+++ b/main.py
@@ -16,6 +16,7 @@ from timeline import timeline
 from twitterapi import twitterapi
 from iconstore import IconStore
 from saveconfig import save_configs, save_config, get_config
+from userselection import UserSelection
 import twittertools
 
 # Main Class
@@ -90,6 +91,14 @@ class Main:
             # insert little delay
             time.sleep(random.random())
         
+        # Users tab append
+        users = UserSelection()
+        users.twitter = self.twitter
+        users.new_timeline = self.new_timeline
+        self.icons.add_store(users.store, 1)
+        users.set_userdict(self.twitter.users, self.icons)
+        self.new_tab(users, "Users")
+        
         self.obj.notebook1.set_current_page(0)
         gtk.gdk.threads_leave()
     
@@ -107,10 +116,9 @@ class Main:
         self.timelines.append(tl)
         
         # Start sync timeline
-        if method:
-            tl.init_timeline(method, sleep, args, kwargs)
-            tl.timeline.on_timeline_refresh = self.on_timeline_refresh
-            tl.start_timeline()
+        tl.init_timeline(method, sleep, args, kwargs)
+        tl.timeline.on_timeline_refresh = self.on_timeline_refresh
+        tl.start_timeline()
         
         # Add Notebook (Tab view)
         tl.add_notebook(self.obj.notebook1, name)
@@ -130,6 +138,11 @@ class Main:
         
         n = self.obj.notebook1.get_n_pages()
         self.obj.notebook1.set_current_page(n - 1)
+
+    def new_tab(self, widget, label):
+        self.obj.notebook1.append_page(widget, gtk.Label(label))
+        self.obj.notebook1.show_all()
+        self.timelines.append(None)
     
     def get_selected_status(self):
         n = self.obj.notebook1.get_current_page()
index 7b728c6..80097fa 100644 (file)
@@ -79,7 +79,7 @@ class timeline:
         # Set Event Hander (exec in every get timeline
         self.timeline.reloadEventHandler = self.prepend_new_statuses    
         # Add timeline to IconStore
-        self.icons.add_store(self.store)
+        self.icons.add_store(self.store, 3)
     
     def start_timeline(self):
         # Start Timeline sync thread
@@ -326,16 +326,14 @@ class timeline:
 
     # Add user timeline tab if mentioned user menu clicked
     def on_menuitem_user_clicked(self, menuitem, sname):
-        # search user from screen_name
-        for user in self.twitter.users.itervalues():
-            if user.screen_name == sname:
-                self.new_timeline("@%s" % sname, "user_timeline", -1,
-                                 user = user.id)
-                return True
-            
-        # force specify screen_name if not found
-        self.new_timeline("@%s" % sname, "user_timeline", -1,
-                         user = sname, sn = True)
+        user = self.twitter.get_user_from_screen_name(sname)
+        if user != None:
+            self.new_timeline("@%s" % sname, "user_timeline", -1,
+                              user = user.id)
+        else:
+            # force specify screen_name if not found
+            self.new_timeline("@%s" % sname, "user_timeline", -1,
+                              user = sname, sn = True)
         return True
     
     # Status Clicked
index fd3f0ca..585aeb9 100644 (file)
@@ -43,6 +43,14 @@ class twitterapi():
     def add_user(self, user):
         self.users[user.id] = user
 
+    def get_user_from_screen_name(self, screen_name):
+        # search user from screen_name
+        for user in self.users.itervalues():
+            if user.screen_name == screen_name:
+                return user
+        
+        return None
+
 # Timeline Thread
 class timeline_thread(threading.Thread):
     def __init__(self, func, interval, maxn, args, kwargs):
diff --git a/userselection.py b/userselection.py
new file mode 100644 (file)
index 0000000..3b13202
--- /dev/null
@@ -0,0 +1,122 @@
+#!/usr/bin/env python
+#-*- coding: utf-8 -*-
+
+import pygtk
+pygtk.require('2.0')
+import gtk
+import gobject
+
+import threading
+import sched
+import time
+
+class UserSelection(gtk.VBox):
+    def __init__(self):
+        gtk.VBox.__init__(self, spacing = 5)        
+        hbox = gtk.HBox()
+
+        entry = gtk.Entry()
+        entry.connect("activate", self.on_entry_activate)
+        #entry.connect("focus-in-event", self.on_etnry_focus_in)
+        #entry.connect("focus-out-event", self.on_entry_focus_out)
+        hbox.pack_start(entry)
+
+        button = gtk.Button()
+        button.set_image(gtk.image_new_from_stock("gtk-add", gtk.ICON_SIZE_BUTTON))
+        button.connect("clicked", self.on_button_clicked)
+        hbox.pack_start(button, expand = False)
+
+        self.pack_start(hbox, expand = False)
+        
+        self.store = gtk.ListStore(gtk.gdk.Pixbuf, str, gobject.TYPE_INT64)
+        self.store.set_sort_column_id(1, gtk.SORT_ASCENDING)
+
+        self.treeview = gtk.TreeView(self.store)
+        self.treeview.set_headers_visible(False)
+        self.treeview.set_enable_search(True)
+        self.treeview.set_search_entry(entry)
+        self.treeview.connect("cursor-changed", self.on_treeview_cursor_changed)
+        self.treeview.connect("row-activated", self.on_treeview_row_activated)
+        self.treeview.append_column(
+            gtk.TreeViewColumn(
+                "Icon", gtk.CellRendererPixbuf(), pixbuf = 0))
+        self.treeview.append_column(
+            gtk.TreeViewColumn(
+                "screen_name", gtk.CellRendererText(), text = 1))
+        
+        self.scrwin = gtk.ScrolledWindow()
+        self.scrwin.set_policy(
+            gtk.POLICY_NEVER, gtk.POLICY_ALWAYS)
+        self.scrwin.set_shadow_type(gtk.SHADOW_IN)
+        self.scrwin.add(self.treeview)
+        
+        self.pack_start(self.scrwin)
+    
+    def set_userdict(self, userdict, iconstore):
+        self.users = userdict
+        self.icons = iconstore
+        self.userids = frozenset()
+        
+        self.scheduler = sched.scheduler(self.user_count, self.delay)
+        t = threading.Thread(target=self.scheduler_run)
+        t.setDaemon(True)
+        t.start()
+    
+    def delay(self, n):
+        time.sleep(10)
+
+    def user_count(self):
+        return int(len(self.users))
+    
+    def scheduler_run(self):
+        while True:
+            self.scheduler.enter(1, 1, self.refresh_users, ())
+            self.scheduler.run()
+    
+    def refresh_users(self):
+        now = frozenset(self.users.keys())
+        diff = now.difference(self.userids)
+        
+        for uid in diff:
+            user = self.users[uid]
+            gtk.gdk.threads_enter()  
+            self.store.prepend(
+                (self.icons.get(user),
+                 user.screen_name,
+                 user.id,))
+            gtk.gdk.threads_leave()
+        
+        self.userids = now
+
+    def activate_user(self, sname):
+        if sname == "":
+            return True
+        
+        user = self.twitter.get_user_from_screen_name(sname)
+        if user != None:
+            self.new_timeline("@%s" % sname, "user_timeline", -1,
+                              user = user.id)
+        else:
+            self.new_timeline("@%s" % sname, "user_timeline", -1,
+                              user = sname, sn = True)
+
+    def on_entry_activate(self, entry):
+        sname = entry.get_text()
+        return self.activate_user(sname)
+    
+    def on_button_clicked(self, button):
+        entry = self.treeview.get_search_entry()
+        sname = entry.get_text()
+        return self.activate_user(sname)
+
+    def on_treeview_row_activated(self, treeview, path, view_column):
+        entry = self.treeview.get_search_entry()
+        sname = entry.get_text()
+        return self.activate_user(sname)
+    
+    def on_treeview_cursor_changed(self, treeview):
+        entry = treeview.get_search_entry()
+        if not entry.is_focus():
+            path, column = treeview.get_cursor()
+            uid = treeview.get_model()[path][2]
+            entry.set_text(self.users[uid].screen_name)