<property name="visible">True</property>
<property name="image">image1</property>
<property name="use_stock">False</property>
+ <property name="always_show_image">True</property>
<signal name="activate" handler="on_menuitem_reply_activate"/>
</object>
</child>
<property name="visible">True</property>
<property name="image">image2</property>
<property name="use_stock">False</property>
+ <property name="always_show_image">True</property>
<signal name="activate" handler="on_menuitem_retweet_activate"/>
</object>
</child>
<property name="visible">True</property>
<property name="image">image5</property>
<property name="use_stock">False</property>
+ <property name="always_show_image">True</property>
<signal name="activate" handler="on_menuitem_reteet_with_comment_activate"/>
</object>
</child>
<property name="visible">True</property>
<property name="image">image3</property>
<property name="use_stock">False</property>
+ <property name="always_show_image">True</property>
<signal name="activate" handler="on_menuitem_fav_activate"/>
</object>
</child>
<property name="visible">True</property>
<property name="image">image8</property>
<property name="use_stock">False</property>
+ <property name="always_show_image">True</property>
<signal name="activate" handler="on_menuitem_destroy_activate"/>
</object>
</child>
</object>
</child>
<child>
+ <object class="GtkImageMenuItem" id="menuitem_detail">
+ <property name="label" translatable="yes">Detail</property>
+ <property name="visible">True</property>
+ <property name="image">image11</property>
+ <property name="use_stock">False</property>
+ <property name="always_show_image">True</property>
+ <signal name="activate" handler="on_menuitem_detail_activate"/>
+ </object>
+ </child>
+ <child>
<object class="GtkImageMenuItem" id="menuitem_usertl">
<property name="label" translatable="yes">User Timeline</property>
<property name="visible">True</property>
<property name="image">image4</property>
<property name="use_stock">False</property>
+ <property name="always_show_image">True</property>
<signal name="activate" handler="on_menuitem_usertl_activate"/>
</object>
</child>
<property name="visible">True</property>
<property name="image">image7</property>
<property name="use_stock">False</property>
+ <property name="always_show_image">True</property>
</object>
</child>
<child>
<property name="visible">True</property>
<property name="image">image6</property>
<property name="use_stock">False</property>
+ <property name="always_show_image">True</property>
</object>
</child>
</object>
<object class="GtkTextBuffer" id="textbuffer1">
<signal name="changed" handler="on_textbuffer1_changed"/>
</object>
+ <object class="GtkImage" id="image11">
+ <property name="visible">True</property>
+ <property name="stock">gtk-info</property>
+ </object>
</interface>
self.store = gtk.ListStore(gtk.gdk.Pixbuf, str, gobject.TYPE_INT64, gobject.TYPE_INT64, gtk.gdk.Pixbuf, str)
self.treeview = gtk.TreeView(self.store)
self.treeview.set_headers_visible(False)
+ self.treeview.set_rules_hint(True)
self.treeview.connect("row-activated", self.on_treeview_row_activated)
self.treeview.append_column(
import time
import uuid
-from timeline import timeline
-from twitterapi import twitterapi
+from timeline import Timeline
+from twitterapi import TwitterAPI
from iconstore import IconStore
from saveconfig import save_configs, save_config, get_config, get_configs
from userselection import UserSelection
from listsselection import ListsSelection
+from statusdetail import StatusDetail
import twittertools
# Main Class
gobject.threads_init()
# Twitter class instance
- self.twitter = twitterapi(screen_name, *keys)
+ self.twitter = TwitterAPI(screen_name, *keys)
self.twitter.init_twitpic(self.twitpic_apikey)
# GtkBuilder instance
# Create new Timeline and append to notebook
def new_timeline(self, label, method, *args, **kwargs):
# Create Timeline Object
- tl = timeline(self.twitter, self.icons, self.iconmode)
+ tl = Timeline(self.twitter, self.icons, self.iconmode)
interval = self.get_default_interval(method)
self.new_timeline("@%s" % status.user.screen_name,
"user_timeline", user = status.user.id)
+ # Status detail
+ def on_menuitem_detail_activate(self, menuitem):
+ status = self.get_selected_status()
+ detail = StatusDetail(status, self.twitter, self.icons)
+ self.new_tab(detail, "S: %d" % status.id)
+
# favorite
def on_menuitem_fav_activate(self, menuitem):
status = self.get_selected_status()
if self.builder.get_object("checkbutton_home").get_active():
home = self.builder.get_object("spinbutton_home").get_value_as_int()
else:
+ self.charcount.set_markup("<b><span foreground='#FF0000'>%s</span></b>" % n)
+ self.btnupdate.set_sensitive(False)
home = -1
if self.builder.get_object("checkbutton_mentions").get_active():
mentions = self.builder.get_object("spinbutton_mentions").get_value_as_int()
--- /dev/null
+#!/usr/bin/env python
+#-*- coding: utf-8 -*-
+
+import pygtk
+pygtk.require('2.0')
+import gtk
+import gobject
+
+import threading
+
+class StatusDetail(gtk.ScrolledWindow):
+ _old_alloc = None
+
+ def __init__(self, status, twitterapi, icons):
+ gtk.ScrolledWindow.__init__(self)
+ self.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+
+ ico = gtk.image_new_from_pixbuf(icons.get(status.user))
+ markup = "<big><b>%s</b></big> - %s\n%s\n<small><span foreground='#666666'>%s via %s</span></small>"
+ text = gtk.Label()
+ text.set_padding(30, 10)
+ text.set_alignment(0, 0.5)
+ text.set_line_wrap(True)
+ label_text = markup % (
+ status.user.screen_name,
+ status.user.name,
+ status.text,
+ status.created_at.strftime("%Y/%m/%d %H:%M:%S"),
+ status.source_name)
+ text.set_markup(label_text)
+
+ hbox = gtk.HBox()
+ hbox.pack_start(ico, expand = False, fill = False)
+ hbox.pack_start(text)
+
+ self.store = gtk.ListStore(gtk.gdk.Pixbuf, str, gobject.TYPE_INT64)
+ treeview = gtk.TreeView(self.store)
+ treeview.set_headers_visible(False)
+ treeview.set_rules_hint(True)
+ treeview.append_column(gtk.TreeViewColumn("Icon", gtk.CellRendererPixbuf(), pixbuf = 0))
+ treeview.append_column(gtk.TreeViewColumn("Status", gtk.CellRendererText(), markup = 1))
+
+ vbox = gtk.VBox()
+ vbox.pack_start(hbox)
+ vbox.pack_start(treeview)
+ self.add_with_viewport(vbox)
+
+ self.twitter = twitterapi
+ self.icons = icons
+
+ t = threading.Thread(target = self.get_conversation, args = (status,))
+ t.setDaemon(True)
+ t.start()
+
+ self.show_all()
+
+ def get_conversation(self, status):
+ s = status
+ i = s.in_reply_to_status_id
+
+ while i != None:
+ if i in self.twitter.statuses:
+ s = self.twitter.statuses[i]
+ self.store.append(
+ (self.icons.get(s.user),
+ "<b>%s</b>\n%s" % (s.user.screen_name, s.text),
+ s.user.id))
+ i = s.in_reply_to_status_id
+ else:
+ statuses = self.twitter.api.user_timeline(s.in_reply_to_user_id, count = 200, max_id = i)
+ self.twitter.add_statuses(statuses)
import threading
import webbrowser
-class timeline:
+class Timeline:
color = (None, None, None, None, None)
def __init__(self, api, icons, iconmode):
import twoauth
# Twitter API Class
-class twitterapi():
+class TwitterAPI():
def __init__(self, screen_name, ckey, csecret, atoken, asecret):
# Generate API Library instance
self.api = twoauth.api(ckey, csecret, atoken, asecret, screen_name)
def create_timeline(self, method, interval, counts, args = (), kwargs = {}):
# Add New Timeline Thread
- th = timeline_thread(getattr(self.api, method), interval, counts, args, kwargs)
+ th = TimelineThread(getattr(self.api, method), interval, counts, args, kwargs)
th.added_event = self.add_status
th.statuses = self.statuses
#self.threads.append(th)
self.api.status_update(status)
# Timeline Thread
-class timeline_thread(threading.Thread):
+class TimelineThread(threading.Thread):
def __init__(self, method, interval, counts, args, kwargs):
# Thread Initialize
threading.Thread.__init__(self)
# setup treeview
self.treeview = gtk.TreeView(self.store)
self.treeview.set_headers_visible(False)
+ self.treeview.set_rules_hint(True)
self.treeview.set_enable_search(True)
self.treeview.set_search_column(3)
self.treeview.connect("cursor-changed", self.on_treeview_cursor_changed)