OSDN Git Service

Added status detail class (widget)
authorHirotaka Kawata <info@techno-st.net>
Mon, 12 Jul 2010 23:17:15 +0000 (08:17 +0900)
committerHirotaka Kawata <info@techno-st.net>
Mon, 12 Jul 2010 23:17:15 +0000 (08:17 +0900)
gwit/glade/gwit.glade
gwit/listsselection.py
gwit/main.py
gwit/statusdetail.py [new file with mode: 0644]
gwit/timeline.py
gwit/twitterapi.py
gwit/userselection.py

index 4d278ba..7f6f3be 100644 (file)
         <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>
@@ -1356,4 +1374,8 @@ and more Tsukulug members...</property>
   <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>
index 8cf781e..e0c5acc 100644 (file)
@@ -14,6 +14,7 @@ class ListsView(gtk.ScrolledWindow):
         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(
index 26ad4b7..a90816b 100644 (file)
@@ -14,12 +14,13 @@ import random
 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
@@ -52,7 +53,7 @@ class Main:
         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
@@ -148,7 +149,7 @@ class Main:
     # 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)
         
@@ -534,6 +535,12 @@ class Main:
         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()
@@ -636,6 +643,8 @@ class Main:
         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()
diff --git a/gwit/statusdetail.py b/gwit/statusdetail.py
new file mode 100644 (file)
index 0000000..3e0114b
--- /dev/null
@@ -0,0 +1,71 @@
+#!/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)
index d33494a..76051f7 100644 (file)
@@ -14,7 +14,7 @@ import time
 import threading
 import webbrowser
 
-class timeline:
+class Timeline:
     color = (None, None, None, None, None)
     
     def __init__(self, api, icons, iconmode):
index 74b2ede..3f3bad7 100644 (file)
@@ -11,7 +11,7 @@ import socket
 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)
@@ -40,7 +40,7 @@ class twitterapi():
     
     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)
@@ -82,7 +82,7 @@ class twitterapi():
             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)
index 60bd192..ff49254 100644 (file)
@@ -42,6 +42,7 @@ class UserSelection(gtk.VBox):
         # 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)