OSDN Git Service

update on the implementation of console
authorShyouzou Sugitani <shy@users.sourceforge.jp>
Sun, 3 Nov 2013 14:03:30 +0000 (23:03 +0900)
committerShyouzou Sugitani <shy@users.sourceforge.jp>
Sun, 3 Nov 2013 14:03:30 +0000 (23:03 +0900)
ChangeLog
lib/ninix_main.py

index 78ef46a..04715ac 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,6 @@
+Sun November 3 2013   Shyouzou Sugitani <shy@users.sourceforge.jp>
+       * loggigモジュールへの出力をコンソールにも出すようにした.
+
 Wed August 28 2013   Shyouzou Sugitani <shy@users.sourceforge.jp>
        * バージョン4.99.17リリース.
 
index 217ff91..329cfc8 100644 (file)
@@ -20,6 +20,7 @@ import os
 import socket
 import sys
 import logging
+import logging.handlers
 import shutil
 import random
 import traceback
@@ -1312,19 +1313,44 @@ class Console:
         self.app = app
         self.dialog = Gtk.Dialog()
         self.dialog.connect('delete_event', lambda *a: True) # XXX
-        self.darea = Gtk.DrawingArea()
-        self.darea.set_events(Gdk.EventMask.EXPOSURE_MASK)
-        self.darea.connect('drag_data_received', self.drag_data_received)
-        # DnD data types
-        dnd_targets = [Gtk.TargetEntry.new('text/uri-list', 0, 0)]
-        self.darea.drag_dest_set(Gtk.DestDefaults.ALL, dnd_targets,
-                                 Gdk.DragAction.COPY)
-        self.darea.drag_dest_add_uri_targets()
-        self.darea.set_size_request(330, 110) ## FIXME
-        self.darea.connect('draw', self.redraw)
+        self.log_handler = logging.handlers.BufferingHandler(0)
+        self.log_handler.shouldFlush = self.shouldFlush
+        logging.getLogger().addHandler(self.log_handler)
+        self.sw = Gtk.ScrolledWindow()
+        self.sw.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.ALWAYS)
+        self.sw.show()
+        self.tv = Gtk.TextView()
+        self.tv.set_wrap_mode(Gtk.WrapMode.CHAR)
+        self.tv.override_background_color(
+            Gtk.StateFlags.NORMAL, Gdk.RGBA(0, 0, 0, 255))
+        self.tv.set_cursor_visible(True)
+        self.tv.set_editable(True) # important
+        self.tb = self.tv.get_buffer()
+        self.tag_critical = self.tb.create_tag()
+        self.tag_critical.set_property('foreground', 'red')
+        self.tag_error = self.tb.create_tag()
+        self.tag_error.set_property('foreground', 'red')
+        self.tag_warning = self.tb.create_tag()
+        self.tag_warning.set_property('foreground', 'orange')
+        self.tag_info = self.tb.create_tag()
+        self.tag_info.set_property('foreground', 'green')
+        self.tag_debug = self.tb.create_tag()
+        self.tag_debug.set_property('foreground', 'yellow')
+        self.tag_notset = self.tb.create_tag()
+        self.tag_notset.set_property('foreground', 'blue')
+        ## DnD data types
+        ##dnd_targets = [Gtk.TargetEntry.new('text/uri-list', 0, 0)]
+        ##self.tv.drag_dest_set(Gtk.DestDefaults.ALL, dnd_targets,
+        ##                             Gdk.DragAction.COPY)
+        self.tv.drag_dest_set_target_list(None) # important
+        self.tv.drag_dest_add_uri_targets()
+        self.tv.connect('drag_data_received', self.drag_data_received)
+        self.tv.show()
+        self.sw.add(self.tv)
+        self.tv.set_size_request(400, 250)
+        self.sw.set_size_request(400, 250)
         content_area = self.dialog.get_content_area()
-        content_area.pack_start(self.darea, True, True, 0)
-        self.darea.show()
+        content_area.pack_start(self.sw, True, True, 0)
         self.dialog.add_button('Install', 1)
         self.dialog.add_button(Gtk.STOCK_CLOSE, Gtk.ResponseType.CLOSE)
         self.dialog.connect('response', self.response)
@@ -1347,8 +1373,45 @@ class Console:
         self.file_chooser.add_filter(filter)
         self.opened = 0
 
-    def update(self): ## FIXME
-        self.darea.queue_draw()
+    def shouldFlush(self, record):
+        it = self.tb.get_end_iter()
+        if record.levelno >= 50:
+            tag = self.tag_critical
+        elif record.levelno >= 40:
+            tag = self.tag_error
+        elif record.levelno >= 30:
+            tag = self.tag_warning
+        elif record.levelno >= 20:
+            tag = self.tag_info
+        elif record.levelno >= 10:
+            tag = self.tag_debug
+        else:
+            tag = self.tag_notset
+        self.tb.insert_with_tags(
+            it,
+            ''.join((record.levelname, ':', record.getMessage(), '\n')),
+            tag)
+        it = self.tb.get_end_iter()
+        # scroll_to_iter may not have the desired effect.
+        mark = self.tb.create_mark("end", it, False)
+        self.tv.scroll_to_mark(mark, 0.0, False, 0.5, 0.5)
+
+    def update(self):
+        ghosts, balloons = self.app.search_ghosts() # XXX
+        if ghosts > 0 and balloons > 0:
+            self.dialog.set_title(_('Console'))
+            logging.info('Ghosts: {0:d}'.format(ghosts))
+            logging.info('Balloons: {0:d}'.format(balloons))
+        else:
+            self.dialog.set_title(_('Nanntokashitekudasai.'))
+            if ghosts > 0:
+                logging.info('Ghosts: {0:d}'.format(ghosts))
+            else:
+                logging.warning('Ghosts: {0:d}'.format(ghosts))
+            if balloons > 0:
+                logging.info('Balloons: {0:d}'.format(balloons))
+            else:
+                logging.warning('Balloons: {0:d}'.format(balloons))
 
     def open(self):
         if self.opened:
@@ -1382,40 +1445,6 @@ class Console:
             pass
         self.file_chooser.hide()
 
-    def draw_message(self, text): ## FIXME
-        pass
-
-    def redraw(self, widget, cr):
-        ghosts, balloons = self.app.search_ghosts() # XXX
-        if ghosts > 0 and balloons > 0:
-            self.dialog.set_title(_('Console'))
-        else:
-            self.dialog.set_title(_('Nanntokashitekudasai.'))
-        layout = Pango.Layout(widget.get_pango_context())
-        font_desc = Pango.FontDescription()
-        font_desc.set_size(9 * Pango.SCALE)
-        font_desc.set_family('Sans') # FIXME
-        layout.set_font_description(font_desc)
-        cr.set_source_rgb(0.0, 0.0, 0.0) # black
-        cr.paint()
-        layout.set_text('Ghosts: {0:d}'.format(ghosts), -1)
-        if ghosts == 0:
-            cr.set_source_rgb(1.0, 0.2, 0.2) # red
-        else:
-            cr.set_source_rgb(0.8, 0.8, 0.8) # gray
-        cr.move_to(20, 15)
-        PangoCairo.update_layout(cr, layout)
-        PangoCairo.show_layout(cr, layout)
-        w, h = layout.get_pixel_size()
-        layout.set_text('Balloons: {0:d}'.format(balloons), -1)
-        if balloons == 0:
-            cr.set_source_rgb(1.0, 0.2, 0.2) # red
-        else:
-            cr.set_source_rgb(0.8, 0.8, 0.8) # gray
-        cr.move_to(20, 15 + h)
-        PangoCairo.update_layout(cr, layout)
-        PangoCairo.show_layout(cr, layout)
-
     def drag_data_received(self, widget, context, x, y, data, info, time):
         filelist = []
         for uri in data.get_uris():