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):
# 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)
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
# 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()
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)
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()
# 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
# 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
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):
--- /dev/null
+#!/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)