|
|
|
@ -186,72 +186,72 @@ class _ThreadManager(object):
|
|
|
|
|
# ---------------------------------------------------------------------- |
|
|
|
|
# Custom cell renderer |
|
|
|
|
# ---------------------------------------------------------------------- |
|
|
|
|
class CellRendererNetworkData(gtk.GenericCellrenderer): |
|
|
|
|
"""A customized cell renderer for messages.""" |
|
|
|
|
|
|
|
|
|
__gproperties__ = { |
|
|
|
|
'message': (gobject.TYPE_PYOBJECT, |
|
|
|
|
'message', |
|
|
|
|
'A NetworkData object to be rendered', |
|
|
|
|
'', |
|
|
|
|
gobject.PARAM_WRITABLE) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
def __init__(self): |
|
|
|
|
super(CellrendererNetworkData, self).__init__(self) |
|
|
|
|
self.set_property('mode', gtk.CELL_RENDERER_MODE_ACTIVATABLE) |
|
|
|
|
return |
|
|
|
|
|
|
|
|
|
def on_render(self, window, widget, bg_area, cell_area, exp_area, flags): |
|
|
|
|
"""The render() method invokes the virtual render function of the |
|
|
|
|
gtk.CellRenderer. The three passed-in rectangles are areas of window. |
|
|
|
|
Most renderers will draw within cell_area; the xalign, yalign, xpad, |
|
|
|
|
and ypad properties of the gtk.CellRenderer should be honored with |
|
|
|
|
respect to cell_area. background_area includes the blank space around |
|
|
|
|
the cell, and also the area containing the tree expander; so the |
|
|
|
|
background_area rectangles for all cells tile to cover the entire |
|
|
|
|
window. expose_area is a clip rectangle. |
|
|
|
|
|
|
|
|
|
The flags value is one of: gtk.CELL_RENDERER_SELECTED, |
|
|
|
|
gtk.CELL_RENDERER_PRELIT, gtk.CELL_RENDERER_INSENSITIVE or |
|
|
|
|
gtk.CELL_RENDERER_SORTED""" |
|
|
|
|
|
|
|
|
|
layout = self.get_layout(widget) |
|
|
|
|
|
|
|
|
|
if flags & gtk.CELL_RENDERER_SELECTED: |
|
|
|
|
if widget.get_property('has-focus'): |
|
|
|
|
state = gtk.STATE_SELECTED |
|
|
|
|
else: |
|
|
|
|
satte = gtk.STATE_ACTIVE |
|
|
|
|
else: |
|
|
|
|
state = gtk.STATE_NORMAL |
|
|
|
|
|
|
|
|
|
widget.style.paint_layout( |
|
|
|
|
window, |
|
|
|
|
state, |
|
|
|
|
True, |
|
|
|
|
cell_area, |
|
|
|
|
widget, |
|
|
|
|
'foo', |
|
|
|
|
cell_area.x + x_offset, |
|
|
|
|
cell_area.y + y_offset, |
|
|
|
|
layout |
|
|
|
|
) |
|
|
|
|
return |
|
|
|
|
|
|
|
|
|
def on_get_size(sel, widget, cell_area): |
|
|
|
|
"""The get_size() method obtains the width and height needed to render |
|
|
|
|
the cell. These values are returned as part of a tuple containing the |
|
|
|
|
x_offset, y_offset, width and height. get_size() is used by view |
|
|
|
|
widgets to determine the appropriate size for the cell_area to be |
|
|
|
|
passed to the gtk.CellRenderer.render() method. If cell_area is not |
|
|
|
|
None, the x and y offsets of the cell relative to this location are |
|
|
|
|
returned. Please note that the values set in the returned width and |
|
|
|
|
height, as well as those in x_offset and y_offset are inclusive of the |
|
|
|
|
xpad and ypad properties.""" |
|
|
|
|
return (x_offset, y_offset, width, height) |
|
|
|
|
|
|
|
|
|
gobject.type_register(CellRendererNetworkData) |
|
|
|
|
#class CellRendererNetworkData(gtk.GenericCellRenderer): |
|
|
|
|
# """A customized cell renderer for messages.""" |
|
|
|
|
# |
|
|
|
|
# __gproperties__ = { |
|
|
|
|
# 'message': (gobject.TYPE_PYOBJECT, |
|
|
|
|
# 'message', |
|
|
|
|
# 'A NetworkData object to be rendered', |
|
|
|
|
# '', |
|
|
|
|
# gobject.PARAM_WRITABLE) |
|
|
|
|
# } |
|
|
|
|
# |
|
|
|
|
# def __init__(self): |
|
|
|
|
# super(CellrendererNetworkData, self).__init__(self) |
|
|
|
|
# self.set_property('mode', gtk.CELL_RENDERER_MODE_ACTIVATABLE) |
|
|
|
|
# return |
|
|
|
|
# |
|
|
|
|
# def on_render(self, window, widget, bg_area, cell_area, exp_area, flags): |
|
|
|
|
# """The render() method invokes the virtual render function of the |
|
|
|
|
# gtk.CellRenderer. The three passed-in rectangles are areas of window. |
|
|
|
|
# Most renderers will draw within cell_area; the xalign, yalign, xpad, |
|
|
|
|
# and ypad properties of the gtk.CellRenderer should be honored with |
|
|
|
|
# respect to cell_area. background_area includes the blank space around |
|
|
|
|
# the cell, and also the area containing the tree expander; so the |
|
|
|
|
# background_area rectangles for all cells tile to cover the entire |
|
|
|
|
# window. expose_area is a clip rectangle. |
|
|
|
|
# |
|
|
|
|
# # The flags value is one of: gtk.CELL_RENDERER_SELECTED, |
|
|
|
|
# gtk.CELL_RENDERER_PRELIT, gtk.CELL_RENDERER_INSENSITIVE or |
|
|
|
|
# gtk.CELL_RENDERER_SORTED""" |
|
|
|
|
# |
|
|
|
|
# layout = self.get_layout(widget) |
|
|
|
|
# |
|
|
|
|
# if flags & gtk.CELL_RENDERER_SELECTED: |
|
|
|
|
# if widget.get_property('has-focus'): |
|
|
|
|
# state = gtk.STATE_SELECTED |
|
|
|
|
# else: |
|
|
|
|
# satte = gtk.STATE_ACTIVE |
|
|
|
|
# else: |
|
|
|
|
# state = gtk.STATE_NORMAL |
|
|
|
|
# |
|
|
|
|
# widget.style.paint_layout( |
|
|
|
|
# window, |
|
|
|
|
# state, |
|
|
|
|
# True, |
|
|
|
|
# cell_area, |
|
|
|
|
# widget, |
|
|
|
|
# 'foo', |
|
|
|
|
# cell_area.x + x_offset, |
|
|
|
|
# cell_area.y + y_offset, |
|
|
|
|
# layout |
|
|
|
|
# ) |
|
|
|
|
# return |
|
|
|
|
# |
|
|
|
|
# def on_get_size(sel, widget, cell_area): |
|
|
|
|
# """The get_size() method obtains the width and height needed to render |
|
|
|
|
# the cell. These values are returned as part of a tuple containing the |
|
|
|
|
# x_offset, y_offset, width and height. get_size() is used by view |
|
|
|
|
# widgets to determine the appropriate size for the cell_area to be |
|
|
|
|
# passed to the gtk.CellRenderer.render() method. If cell_area is not |
|
|
|
|
# None, the x and y offsets of the cell relative to this location are |
|
|
|
|
# returned. Please note that the values set in the returned width and |
|
|
|
|
# height, as well as those in x_offset and y_offset are inclusive of the |
|
|
|
|
# xpad and ypad properties.""" |
|
|
|
|
# return (x_offset, y_offset, width, height) |
|
|
|
|
# |
|
|
|
|
#gobject.type_register(CellRendererNetworkData) |
|
|
|
|
|
|
|
|
|
# ---------------------------------------------------------------------- |
|
|
|
|
# Mitter interface object |
|
|
|
@ -265,48 +265,11 @@ class Interface(object):
|
|
|
|
|
# ------------------------------------------------------------ |
|
|
|
|
# Widget creation functions |
|
|
|
|
# ------------------------------------------------------------ |
|
|
|
|
def _systray_setup(self): |
|
|
|
|
if not (self._app_icon and self._app_icon_alert): |
|
|
|
|
self._systray = None |
|
|
|
|
return |
|
|
|
|
|
|
|
|
|
self._systray = gtk.StatusIcon() |
|
|
|
|
self._systray.set_from_file(self._app_icon) |
|
|
|
|
|
|
|
|
|
#where is systray_cb??? |
|
|
|
|
self._systray.connect('activate', self.systray_cb) |
|
|
|
|
self._systray.connect('popup-menu', self.systray_popup) |
|
|
|
|
|
|
|
|
|
# should set tooltip to msg text if that come? |
|
|
|
|
self._systray.set_tooltip('Mitter: Click to toggle window visibility.') |
|
|
|
|
self._systray.set_visible(True) |
|
|
|
|
return |
|
|
|
|
|
|
|
|
|
def systray_popup(self, icon, button, time): |
|
|
|
|
sys_popup = gtk.Menu() |
|
|
|
|
restore = gtk.MenuItem("Restore", False) |
|
|
|
|
exit = gtk.MenuItem("Exit", False) |
|
|
|
|
sys_popup.append(restore) |
|
|
|
|
sys_popup.append(exit) |
|
|
|
|
sys_popup.popup(None, None, None, 3, time) |
|
|
|
|
sys_popup.show_all() |
|
|
|
|
|
|
|
|
|
def systray_cb(self, icon): |
|
|
|
|
|
|
|
|
|
#why window location move down and down? |
|
|
|
|
if self._main_window.is_active(): |
|
|
|
|
self._main_window.hide() |
|
|
|
|
else: |
|
|
|
|
self._main_window.show() |
|
|
|
|
|
|
|
|
|
def _create_main_window(self): |
|
|
|
|
"""Returns the object with the main window and the attached |
|
|
|
|
widgets.""" |
|
|
|
|
main_window = gtk.Window(gtk.WINDOW_TOPLEVEL) |
|
|
|
|
|
|
|
|
|
#where is this method? |
|
|
|
|
self._systray_setup() |
|
|
|
|
|
|
|
|
|
initial_width = int(self._options[self.NAMESPACE]['width']) |
|
|
|
|
initial_height = int(self._options[self.NAMESPACE]['height']) |
|
|
|
|
_log.debug('Initial size: %d x %d', initial_width, initial_height) |
|
|
|
@ -508,7 +471,7 @@ class Interface(object):
|
|
|
|
|
text_buffer = self._update_text.get_buffer() |
|
|
|
|
text_buffer.connect('changed', self._count_chars) |
|
|
|
|
|
|
|
|
|
self._update_button = gtk.Button(label = "(140)") |
|
|
|
|
self._update_button = gtk.Button(label = '(140)') |
|
|
|
|
self._update_button.connect('clicked', self._update_status) |
|
|
|
|
self._update_button.set_property('sensitive', False) |
|
|
|
|
|
|
|
|
@ -518,14 +481,7 @@ class Interface(object):
|
|
|
|
|
update_box.pack_start(self._update_button, expand=False, fill=False, |
|
|
|
|
padding=0) |
|
|
|
|
|
|
|
|
|
#info_box = gtk.HBox(False, 0) |
|
|
|
|
#self._char_count = gtk.Label() |
|
|
|
|
#self._char_count.set_text('(140)') |
|
|
|
|
#info_box.pack_start(gtk.Label('What are you doing?')) |
|
|
|
|
#info_box.pack_start(self._char_count) |
|
|
|
|
|
|
|
|
|
update_area = gtk.VBox(True, 0) |
|
|
|
|
#update_area.pack_start(info_box) |
|
|
|
|
update_area.pack_start(update_box) |
|
|
|
|
|
|
|
|
|
return update_area |
|
|
|
@ -649,6 +605,7 @@ class Interface(object):
|
|
|
|
|
def _count_chars(self, text_buffer): |
|
|
|
|
"""Count the number of chars in the edit field and update the |
|
|
|
|
label that shows the available space.""" |
|
|
|
|
_log.debug('Counting chars') |
|
|
|
|
text = _buffer_text(text_buffer) |
|
|
|
|
count = len(text) |
|
|
|
|
|
|
|
|
|