Ok, here is the non-plugin working patch. Now the toolbar button works, too. I also added a gtk.MessageDialog that appears to show if your save has gone well. Here it is:
--- emesene/Config.py 2010-01-07 20:33:59.000000000 +0100
+++ Coding/emesene-work/Config.py 2010-01-08 16:37:21.000000000 +0100
@@ -160,6 +160,7 @@
'toolInvite' : True,
'toolSendFile' : True,
'toolWebcam' : True,
+ 'toolSave' : True,
'toolClear' : True,
}
--- emesene/ConversationWindow.py 2010-01-07 21:24:44.000000000 +0100
+++ Coding/emesene-work/ConversationWindow.py 2010-01-08 17:04:29.000000000 +0100
@@ -1,4 +1,4 @@
-p# -*- coding: utf-8 -*-
+# -*- coding: utf-8 -*-
# This file is part of emesene.
#
@@ -565,7 +565,10 @@
if response == gtk.RESPONSE_OK:
self.conversation.sendFile(dialog.get_filename())
dialog.destroy()
-
+
+ def show_save_dialog(self):
+ '''Displays a dialog to save the conversation'''
+ SaveConversationDialog(self)
class ConversationWindowMenu(gtk.MenuBar):
'''This class represent the menu in the conversation window, i define
@@ -599,7 +602,14 @@
self.sendFileMenuItem.connect('activate', self.onSendFileActivate)
self.sendFileMenuItem.add_accelerator('activate', accelGroup, ord('S'),
gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE)
-
+
+ saveMenuItem = gtk.ImageMenuItem(_('Save Conve_rsation'))
+ saveMenuItem.set_image(gtk.image_new_from_stock(gtk.STOCK_SAVE,
+ gtk.ICON_SIZE_MENU))
+ saveMenuItem.connect('activate', self.onSaveActivate)
+ saveMenuItem.add_accelerator('activate', accelGroup, ord('R'),
+ gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE)
+
clearMenuItem = gtk.ImageMenuItem(_('C_lear Conversation'))
clearMenuItem.set_image(gtk.image_new_from_stock(gtk.STOCK_CLEAR,
gtk.ICON_SIZE_MENU))
@@ -617,6 +627,7 @@
conversationMenu.add(self.inviteMenuItem)
conversationMenu.add(self.sendFileMenuItem)
+ conversationMenu.add(saveMenuItem)
conversationMenu.add(clearMenuItem)
conversationMenu.add(gtk.SeparatorMenuItem())
conversationMenu.add(closeMenuItem)
@@ -649,6 +660,11 @@
'''This method is called when Invite is activated on the menu'''
self.parentConversationWindow.send_file_dialog()
+ def onSaveActivate(self, *args):
+ '''This method is called when Save Conversation
+ is activated on the menu'''
+ self.parentConversationWindow.show_save_dialog()
+
def onLogActivate(self, check):
'''This method is called when Log is activated on the menu'''
self.parentConversationWindow.conversation.setDoLog(
@@ -666,3 +682,51 @@
'''This method is called when a switchboard error is detected'''
self.inviteMenuItem.set_sensitive(False)
self.sendFileMenuItem.set_sensitive(False)
+
+class SaveConversationDialog (gtk.FileChooserDialog):
+ def __init__ (self, parentConversationWindow):
+ self.parentConversationWindow = parentConversationWindow
+ self.status = True
+
+ gtk.FileChooserDialog.__init__(self,
+ title="Save Conversation to a file",
+ parent=None,
+ action=gtk.FILE_CHOOSER_ACTION_SAVE,
+ buttons=(gtk.STOCK_SAVE, gtk.RESPONSE_OK,
+ gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT),
+ backend=None)
+
+ response = self.run()
+
+ if response == gtk.RESPONSE_OK:
+ self.filename = self.get_filename()
+ self.save()
+ self.destroy()
+ self.show_save_status()
+ else:
+ self.destroy()
+
+ def save (self):
+ conversation = self.parentConversationWindow.conversation
+ text = conversation.getConversationText()
+
+ try:
+ file = open(self.filename, 'w')
+ file.write(text)
+ file.close()
+ except:
+ self.status = False
+
+ def show_save_status (self):
+ if self.status:
+ status_type = gtk.MESSAGE_INFO
+ status_message = "The conversation has been saved."
+ else:
+ status_type = gtk.MESSAGE_ERROR
+ status_message = "An error occurred saving the conversation."
+
+ show = gtk.MessageDialog(parent=None, flags=0, type=status_type,
+ buttons=gtk.BUTTONS_OK,
+ message_format=status_message)
+ show.run()
+ show.destroy()
--- emesene/ConversationUI.py 2010-01-07 20:33:59.000000000 +0100
+++ Coding/emesene-work/ConversationUI.py 2010-01-08 16:57:16.000000000 +0100
@@ -1543,6 +1543,23 @@
self.insert(gtk.SeparatorToolItem(), -1)
separator = False
+ # save conversation toolbar button
+ if self.config.user['toolSave']:
+ self.saveButton = gtk.ToolButton()
+ self.saveButton.set_label(_('Save conversation'))
+ if self.controller.theme.getImage('save'):
+ saveicon = gtk.Image()
+ saveicon.set_from_pixbuf(self.controller.theme.getImage('save'))
+ self.saveButton.set_icon_widget(saveicon)
+ else:
+ self.saveButton.set_stock_id(gtk.STOCK_SAVE_AS)
+ self.saveButton.connect('clicked', self.showSaveDialog)
+ self.insert(self.saveButton, -1)
+ self.saveButton.set_tooltip_text(_('Save conversation'))
+ separator = True
+ else:
+ self.saveButton = None
+
#clear conversation toolbar button
if self.config.user['toolClear']:
imgclear = gtk.Image()
@@ -1667,6 +1684,11 @@
if win is not None:
win.send_file_dialog()
+ def showSaveDialog(self, *args):
+ '''this method is called when the user click
+ the save conversation button'''
+ self.parentUI.parentConversation.parentConversationWindow.show_save_dialog()
+
def sendWebcamClicked(self, *args):
ret = self.parentUI.parentConversation.sendWebcam()
if ret == 1:
--- emesene/PreferenceWindow.py 2010-01-07 20:33:59.000000000 +0100
+++ Coding/emesene-work/PreferenceWindow.py 2010-01-08 16:34:35.000000000 +0100
@@ -1135,7 +1135,6 @@
self.sendfileButton.connect('clicked', self.on_toggled, 'toolSendFile')
self.pack_start(self.sendfileButton, False, False)
-
# webcam send hax
camicon = gtk.image_new_from_pixbuf(self.controller.theme.getImage('cam'))
self.sendWebcamButton = gtk.ToggleButton()
@@ -1148,6 +1147,20 @@
self.pack_start(gtk.SeparatorToolItem(), False, False)
+ # save conversation
+ self.saveButton = gtk.ToggleButton()
+ saveIcon = self.controller.theme.getImage('save')
+ if saveIcon != None:
+ self.saveButton.set_image(gtk.image_new_from_pixbuf(saveIcon))
+ else:
+ self.saveButton.set_image(gtk.image_new_from_stock(gtk.STOCK_SAVE_AS,
+ gtk.ICON_SIZE_SMALL_TOOLBAR))
+ self.saveButton.set_active(not self.config.user['toolSave'])
+ self.saveButton.set_tooltip_text(_('Save conversation'))
+
+ self.saveButton.connect('clicked', self.on_toggled, 'toolSave')
+ self.pack_start(self.saveButton, False, False)
+
#clear conversation toolbar button
self.clearButton = gtk.ToggleButton()
clearIcon = self.controller.theme.getImage('clear')
Let me know how it's.