import socket
import sys
import logging
+import logging.handlers
import shutil
import random
import traceback
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)
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:
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():