def on_PHOTO_button_press_event(self, widget, event): """ If right-clicked, show popup """ if event.button == 3 and self.avatar_encoded: # right click menu = Gtk.Menu() # Try to get pixbuf pixbuf = gtkgui_helpers.get_avatar_pixbuf_from_cache(self.jid, use_local=False) if pixbuf not in (None, 'ask'): nick = gajim.config.get_per('accounts', self.account, 'name') menuitem = Gtk.MenuItem.new_with_mnemonic(_('Save _As')) menuitem.connect('activate', gtkgui_helpers.on_avatar_save_as_menuitem_activate, self.jid, nick) menu.append(menuitem) # show clear menuitem = Gtk.MenuItem.new_with_mnemonic(_('_Clear')) menuitem.connect('activate', self.on_clear_button_clicked) menu.append(menuitem) menu.connect('selection-done', lambda w:w.destroy()) # show the menu menu.show_all() menu.attach_to_widget(widget, None) menu.popup(None, None, None, None, event.button, event.time) elif event.button == 1: # left click self.on_set_avatar_button_clicked(widget)
def show_avatar(self, jid, resource): # Get the XML instance jid_with_resource = jid if resource: jid_with_resource += '/' + resource xml = None if self.xmls.has_key(jid): xml = self.xmls[jid] else: # it can be xmls[jid/resource] if it's a vcard from pm if self.xmls.has_key(jid_with_resource): xml = self.xmls[jid_with_resource] if not xml: return # we assume contact has no avatar scaled_pixbuf = None real_jid = gajim.get_real_jid_from_fjid(self.account, jid) pixbuf = None if real_jid: pixbuf = gtkgui_helpers.get_avatar_pixbuf_from_cache(real_jid) if not real_jid or pixbuf == 'ask': # we don't have the vcard or it's pm and we don't have the real jid gajim.connections[self.account].request_vcard(jid_with_resource) return if pixbuf is not None: scaled_pixbuf = gtkgui_helpers.get_scaled_pixbuf(pixbuf, 'chat') image = xml.get_widget('avatar_image') image.set_from_pixbuf(scaled_pixbuf) image.show_all()
def on_PHOTO_button_press_event(self, widget, event): '''If right-clicked, show popup''' if event.button == 3 and self.avatar_encoded: # right click menu = gtk.Menu() # Try to get pixbuf pixbuf = gtkgui_helpers.get_avatar_pixbuf_from_cache( self.jid, use_local=False) if pixbuf: nick = gajim.config.get_per('accounts', self.account, 'name') menuitem = gtk.ImageMenuItem(gtk.STOCK_SAVE_AS) menuitem.connect( 'activate', gtkgui_helpers.on_avatar_save_as_menuitem_activate, self.jid, None, nick + '.jpeg') menu.append(menuitem) # show clear menuitem = gtk.ImageMenuItem(gtk.STOCK_CLEAR) menuitem.connect('activate', self.on_clear_button_clicked) menu.append(menuitem) menu.connect('selection-done', lambda w: w.destroy()) # show the menu menu.show_all() menu.popup(None, None, None, event.button, event.time) elif event.button == 1: # left click self.on_set_avatar_button_clicked(widget)
def on_PHOTO_button_press_event(self, widget, event): """ If right-clicked, show popup """ if event.button == 3 and self.avatar_encoded: # right click menu = Gtk.Menu() # Try to get pixbuf pixbuf = gtkgui_helpers.get_avatar_pixbuf_from_cache( self.jid, use_local=False) if pixbuf not in (None, 'ask'): nick = gajim.config.get_per('accounts', self.account, 'name') menuitem = Gtk.MenuItem.new_with_mnemonic(_('Save _As')) menuitem.connect( 'activate', gtkgui_helpers.on_avatar_save_as_menuitem_activate, self.jid, nick) menu.append(menuitem) # show clear menuitem = Gtk.MenuItem.new_with_mnemonic(_('_Clear')) menuitem.connect('activate', self.on_clear_button_clicked) menu.append(menuitem) menu.connect('selection-done', lambda w: w.destroy()) # show the menu menu.show_all() menu.attach_to_widget(widget, None) menu.popup(None, None, None, None, event.button, event.time) elif event.button == 1: # left click self.on_set_avatar_button_clicked(widget)
def on_PHOTO_button_press_event(self, widget, event): """If right-clicked, show popup""" if event.button == 3 and self.avatar_encoded: # right click menu = gtk.Menu() # Try to get pixbuf pixbuf = gtkgui_helpers.get_avatar_pixbuf_from_cache(self.jid, use_local=False) if pixbuf: nick = gajim.config.get_per("accounts", self.account, "name") menuitem = gtk.ImageMenuItem(gtk.STOCK_SAVE_AS) menuitem.connect( "activate", gtkgui_helpers.on_avatar_save_as_menuitem_activate, self.jid, None, nick + ".jpeg" ) menu.append(menuitem) # show clear menuitem = gtk.ImageMenuItem(gtk.STOCK_CLEAR) menuitem.connect("activate", self.on_clear_button_clicked) menu.append(menuitem) menu.connect("selection-done", lambda w: w.destroy()) # show the menu menu.show_all() menu.popup(None, None, None, event.button, event.time) elif event.button == 1: # left click self.on_set_avatar_button_clicked(widget)
def on_event_added(self, event): account = event.account jid = event.jid when = time.localtime() contact = "" key = (account, jid) if event.type_ == "chat" or \ event.type_ == "printed_chat" or \ event.type_ == "normal" or \ event.type_ == "printed_normal" or \ event.type_ == "file-request" or \ event.type_ == "jingle-incoming": contact = gajim.contacts.get_contact_from_full_jid(account, jid) if contact: contact = contact.get_shown_name() else: contact = jid elif event.type_ == "pm" or event.type_ == "printed_pm": contact = gajim.get_nick_from_jid(gajim.get_room_from_fjid(jid)) + \ "/" + gajim.get_room_and_nick_from_fjid(jid)[1] elif event.type_ == "printed_marked_gc_msg": contact = gajim.get_nick_from_jid(gajim.get_room_from_fjid(jid)) else: return #print account, jid, when, contact event.time = when if key not in self.events: icon = None if gajim.config.get("show_avatars_in_roster"): pixbuf = gtkgui_helpers.get_avatar_pixbuf_from_cache(jid) if pixbuf not in (None, "ask"): icon = gtk.Image() icon.set_from_pixbuf(pixbuf) else: file_path = gtkgui_helpers.get_path_to_generic_or_avatar(jid) if os.path.isfile(file_path): fd = fopen(file_path, 'rb') data = fd.read() icon = gtk.Image() icon.set_from_pixbuf(gtkgui_helpers.get_pixbuf_from_data(data)) item = gtk.ImageMenuItem(contact + " (1)") if icon: item.set_image(icon) item.set_always_show_image(True) item.connect("activate", self.event_raise, event) item.show() self.menu.insert(item, self.menuEventInsertIndex) self.event_separator.show() self.events[key] = {} self.events[key]['item'] = item self.events[key]['contact'] = contact self.events[key]['events'] = [event] else: self.events[key]['events'].append(event) item = self.events[key]['item'] item.set_label(self.events[key]['contact'] + " (" + str(len(self.events[key]['events'])) + ")") self.indicator.set_status(appindicator.STATUS_ATTENTION)
def on_event_added(self, event): account = event.account jid = event.jid when = time.time() contact = "" key = (account, jid) if event.type_ == "chat" or \ event.type_ == "printed_chat" or \ event.type_ == "normal" or \ event.type_ == "printed_normal" or \ event.type_ == "file-request" or \ event.type_ == "jingle-incoming": contact = gajim.contacts.get_contact_from_full_jid(account, jid) if contact: contact = contact.get_shown_name() else: contact = jid elif event.type_ == "pm" or event.type_ == "printed_pm": contact = gajim.get_nick_from_jid(gajim.get_room_from_fjid(jid)) + \ "/" + gajim.get_room_and_nick_from_fjid(jid)[1] elif event.type_ == "printed_marked_gc_msg": contact = gajim.get_nick_from_jid(gajim.get_room_from_fjid(jid)) else: return #print account, jid, when, contact event.time = when if key not in self.events: icon = None if gajim.config.get("show_avatars_in_roster"): pixbuf = gtkgui_helpers.get_avatar_pixbuf_from_cache(jid) if pixbuf not in (None, "ask"): icon = gtk.Image() icon.set_from_pixbuf(pixbuf) else: file_path = gtkgui_helpers.get_path_to_generic_or_avatar(jid) if os.path.isfile(file_path): fd = fopen(file_path, 'rb') data = fd.read() icon = gtk.Image() icon.set_from_pixbuf(gtkgui_helpers.get_pixbuf_from_data(data)) item = gtk.ImageMenuItem(contact + " (1)") if icon: item.set_image(icon) item.set_always_show_image(True) item.connect("activate", self.event_raise, event) item.show() self.menu.insert(item, self.menuEventInsertIndex) self.event_separator.show() self.events[key] = {} self.events[key]['item'] = item self.events[key]['contact'] = contact self.events[key]['events'] = [event] else: self.events[key]['events'].append(event) item = self.events[key]['item'] item.set_label(self.events[key]['contact'] + " (" + str(len(self.events[key]['events'])) + ")") self.indicator.set_status(appindicator.STATUS_ATTENTION)
def show_bigger_avatar(self, small_avatar): '''resizes the avatar, if needed, so it has at max half the screen size and shows it''' jid = self.get_active_jid() real_jid = gajim.get_real_jid_from_fjid(self.account, jid) if not real_jid: # this can happend if we're in a moderate room return avatar_pixbuf = gtkgui_helpers.get_avatar_pixbuf_from_cache(real_jid) screen_w = gtk.gdk.screen_width() screen_h = gtk.gdk.screen_height() avatar_w = avatar_pixbuf.get_width() avatar_h = avatar_pixbuf.get_height() half_scr_w = screen_w / 2 half_scr_h = screen_h / 2 if avatar_w > half_scr_w: avatar_w = half_scr_w if avatar_h > half_scr_h: avatar_h = half_scr_h window = gtk.Window(gtk.WINDOW_POPUP) self.bigger_avatar_window = window pixmap, mask = avatar_pixbuf.render_pixmap_and_mask() window.set_size_request(avatar_w, avatar_h) # we should make the cursor visible # gtk+ doesn't make use of the motion notify on gtkwindow by default # so this line adds that window.set_events(gtk.gdk.POINTER_MOTION_MASK) window.set_app_paintable(True) window.realize() window.window.set_back_pixmap(pixmap, False) # make it transparent window.window.shape_combine_mask(mask, 0, 0) # make the bigger avatar window show up centered x0, y0 = small_avatar.window.get_origin() x0 += small_avatar.allocation.x y0 += small_avatar.allocation.y center_x= x0 + (small_avatar.allocation.width / 2) center_y = y0 + (small_avatar.allocation.height / 2) pos_x, pos_y = center_x - (avatar_w / 2), center_y - (avatar_h / 2) window.move(pos_x, pos_y) # make the cursor invisible so we can see the image invisible_cursor = gtkgui_helpers.get_invisible_cursor() window.window.set_cursor(invisible_cursor) # we should hide the window window.connect('leave_notify_event', self.on_window_avatar_leave_notify_event) window.connect('motion-notify-event', self.on_window_motion_notify_event) window.show_all()
def on_avatar_eventbox_enter_notify_event(self, widget, event): '''we enter the eventbox area so we under conditions add a timeout to show a bigger avatar after 0.5 sec''' jid = self.get_active_jid() real_jid = gajim.get_real_jid_from_fjid(self.account, jid) if not real_jid: # this can happend if we're in a moderate room return avatar_pixbuf = gtkgui_helpers.get_avatar_pixbuf_from_cache(real_jid) if avatar_pixbuf in ('ask', None): return avatar_w = avatar_pixbuf.get_width() avatar_h = avatar_pixbuf.get_height() scaled_buf = self.xmls[jid].get_widget('avatar_image').get_pixbuf() scaled_buf_w = scaled_buf.get_width() scaled_buf_h = scaled_buf.get_height() # do we have something bigger to show? if avatar_w > scaled_buf_w or avatar_h > scaled_buf_h: # wait for 0.5 sec in case we leave earlier self.show_bigger_avatar_timeout_id = gobject.timeout_add(500, self.show_bigger_avatar, widget)