Changeset 6361

Show
Ignore:
Timestamp:
05/26/06 15:19:52 (3 years ago)
Author:
asterix
Message:

we can now save avatars on HD where we want (right click on image). Fixes #1817

Location:
trunk
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • trunk/data/glade/vcard_information_window.glade

    r6305 r6361  
    1818  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> 
    1919  <property name="focus_on_map">True</property> 
     20  <property name="urgency_hint">False</property> 
    2021  <signal name="destroy" handler="on_vcard_information_window_destroy" last_modification_time="Sun, 24 Jul 2005 19:35:15 GMT"/> 
    2122  <signal name="key_press_event" handler="on_vcard_information_window_key_press_event" last_modification_time="Thu, 07 Apr 2005 10:06:13 GMT"/> 
     
    23222323 
    23232324                  <child> 
    2324                     <widget class="GtkImage" id="PHOTO_image"> 
     2325                    <widget class="GtkEventBox" id="PHOTO_eventbox"> 
    23252326                      <property name="visible">True</property> 
    2326                       <property name="xalign">0.5</property> 
    2327                       <property name="yalign">0.5</property> 
    2328                       <property name="xpad">0</property> 
    2329                       <property name="ypad">0</property> 
     2327                      <property name="visible_window">True</property> 
     2328                      <property name="above_child">False</property> 
     2329 
     2330                      <child> 
     2331                        <widget class="GtkImage" id="PHOTO_image"> 
     2332                          <property name="visible">True</property> 
     2333                          <property name="xalign">0.5</property> 
     2334                          <property name="yalign">0.5</property> 
     2335                          <property name="xpad">0</property> 
     2336                          <property name="ypad">0</property> 
     2337                        </widget> 
     2338                      </child> 
    23302339                    </widget> 
    23312340                    <packing> 
  • trunk/src/chat_control.py

    r6293 r6361  
    755755                self.handlers[id] = widget 
    756756 
    757                 widget = self.xml.get_widget('avatar_eventbox') 
    758757                id = widget.connect('leave-notify-event', self.on_avatar_eventbox_leave_notify_event) 
     758                self.handlers[id] = widget 
     759 
     760                id = widget.connect('button-press-event', self.on_avatar_eventbox_button_press_event) 
    759761                self.handlers[id] = widget 
    760762 
     
    803805                if self.show_bigger_avatar_timeout_id is not None: 
    804806                        gobject.source_remove(self.show_bigger_avatar_timeout_id) 
     807 
     808        def on_avatar_eventbox_button_press_event(self, widget, event): 
     809                '''If right-clicked, show popup''' 
     810                if event.button == 3: # right click 
     811                        menu = gtk.Menu() 
     812                        menuitem = gtk.ImageMenuItem(gtk.STOCK_SAVE_AS) 
     813                        id = menuitem.connect('activate',  
     814                                gtkgui_helpers.on_avatar_save_as_menuitem_activate, 
     815                                self.contact.jid, self.account, self.contact.name + '.jpeg') 
     816                        self.handlers[id] = menuitem 
     817                        menu.append(menuitem) 
     818                        menu.show_all() 
     819                        menu.connect('selection-done', lambda w:w.destroy())     
     820                        # show the menu 
     821                        menu.show_all() 
     822                        menu.popup(None, None, None, event.button, event.time) 
     823                return True 
    805824 
    806825        def _on_window_motion_notify(self, widget, event): 
  • trunk/src/gtkgui_helpers.py

    r6300 r6361  
    2626 
    2727import vcard 
     28import dialogs 
    2829 
    2930 
     
    667668def destroy_widget(widget): 
    668669        widget.destroy() 
     670 
     671def on_avatar_save_as_menuitem_activate(widget, jid, account, 
     672default_name = ''): 
     673        def on_ok(widget): 
     674                def on_ok2(widget, file_path, pixbuf): 
     675                        pixbuf.save(file_path, 'jpeg') 
     676                        dialog2.destroy() 
     677                        dialog.destroy() 
     678 
     679                file_path = dialog.get_filename() 
     680                file_path = decode_filechooser_file_paths((file_path,))[0] 
     681                if os.path.exists(file_path): 
     682                        dialog2 = dialogs.FTOverwriteConfirmationDialog( 
     683                                _('This file already exists'), _('What do you want to do?'), 
     684                                False) 
     685                        dialog2.set_transient_for(dialog) 
     686                        dialog2.set_destroy_with_parent(True) 
     687                        response = dialog2.get_response() 
     688                        if response < 0: 
     689                                return 
     690 
     691                # Get pixbuf 
     692                pixbuf = None 
     693                is_fake = False 
     694                if gajim.contacts.is_pm_from_jid(account, jid): 
     695                        is_fake = True 
     696                pixbuf = get_avatar_pixbuf_from_cache(jid, is_fake) 
     697 
     698                ext = file_path.split('.')[-1] 
     699                type_ = '' 
     700                if not ext: 
     701                        # Silently save as Jpeg image 
     702                        file_path += '.jpeg' 
     703                        type_ = 'jpeg' 
     704                elif ext == 'jpg': 
     705                        type_ = 'jpeg' 
     706                else: 
     707                        type_ = ext 
     708 
     709                # Save image 
     710                try: 
     711                        pixbuf.save(file_path, type_) 
     712                except: 
     713                        os.remove(file_path) 
     714                        new_file_path = '.'.join(file_path.split('.')[:-1]) + '.jpeg' 
     715                        dialog2 = dialogs.ConfirmationDialog(_('Extension not supported'), 
     716                                _('Image cannot be saved in %(type)s format. Save as %(new_filename)s?') % {'type': type_, 'new_filename': new_file_path}, 
     717                                on_response_ok = (on_ok2, new_file_path, pixbuf)) 
     718                else: 
     719                        dialog.destroy() 
     720 
     721        def on_cancel(widget): 
     722                dialog.destroy() 
     723 
     724        dialog = dialogs.FileChooserDialog( 
     725                title_text = _('Save Image as...'),  
     726                action = gtk.FILE_CHOOSER_ACTION_SAVE,  
     727                buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,  
     728                gtk.STOCK_SAVE, gtk.RESPONSE_OK), 
     729                default_response = gtk.RESPONSE_OK, 
     730                current_folder = gajim.config.get('last_save_dir'), 
     731                on_response_ok = on_ok, 
     732                on_response_cancel = on_cancel) 
     733 
     734        dialog.set_current_name(default_name) 
     735        dialog.connect('delete-event', lambda widget, event: 
     736                on_cancel(widget)) 
  • trunk/src/vcard.py

    r6290 r6361  
    8181                self.avatar_mime_type = None 
    8282                self.avatar_encoded = None 
     83                self.avatar_save_as_id = None 
    8384 
    8485                if vcard: # we view/edit our own vcard 
     
    156157                self.xml.get_widget('PHOTO_image').set_from_pixbuf(None) 
    157158                self.avatar_encoded = None 
     159                self.xml.get_widget('PHOTO_eventbox').disconnect(self.avatar_save_as_id) 
     160                self.avatar_save_as_id = None 
    158161 
    159162        def on_set_avatar_button_clicked(self, widget): 
     
    205208                self.dialog = dialogs.ImageChooserDialog(on_response_ok = on_ok) 
    206209 
     210        def on_PHOTO_eventbox_button_press_event(self, widget, event): 
     211                '''If right-clicked, show popup''' 
     212                if event.button == 3: # right click 
     213                        menu = gtk.Menu() 
     214                        menuitem = gtk.ImageMenuItem(gtk.STOCK_SAVE_AS) 
     215                        menuitem.connect('activate', 
     216                                gtkgui_helpers.on_avatar_save_as_menuitem_activate, 
     217                                self.contact.jid, self.account, self.contact.name + '.jpeg') 
     218                        menu.append(menuitem) 
     219                        menu.show_all() 
     220                        menu.connect('selection-done', lambda w:w.destroy())     
     221                        # show the menu 
     222                        menu.show_all() 
     223                        menu.popup(None, None, None, event.button, event.time) 
     224 
    207225        def set_value(self, entry_name, value): 
    208226                try: 
     
    221239                                pixbuf = gtkgui_helpers.get_scaled_pixbuf(pixbuf, 'vcard') 
    222240                                image.set_from_pixbuf(pixbuf) 
     241                                eventbox = self.xml.get_widget('PHOTO_eventbox') 
     242                                self.avatar_save_as_id = eventbox.connect('button-press-event', 
     243                                        self.on_PHOTO_eventbox_button_press_event) 
    223244                                continue 
    224245                        if i == 'ADR' or i == 'TEL' or i == 'EMAIL': 
     
    454475                        self.xml.get_widget('DESC_textview').get_buffer().set_text('') 
    455476                        self.xml.get_widget('PHOTO_image').set_from_pixbuf(None) 
     477                        self.xml.get_widget('PHOTO_eventbox').disconnect( 
     478                                self.avatar_save_as_id) 
     479                        self.avatar_save_as_id = None 
    456480                        gajim.connections[self.account].request_vcard(self.jid) 
    457481                else: