diff --git a/plugins/gtkgui/config.py b/plugins/gtkgui/config.py index e1a382842..a9016283f 100644 --- a/plugins/gtkgui/config.py +++ b/plugins/gtkgui/config.py @@ -264,6 +264,15 @@ class preference_Window: del self.plugin.config['msg%i_name' % i] del self.plugin.config['msg%i' % i] i += 1 + #Emoticons + model = self.emot_tree.get_model() + iter = model.get_iter_first() + emots = [] + while iter: + emots.append(model.get_value(iter, 0)) + emots.append(model.get_value(iter, 1)) + iter = model.iter_next(iter) + self.plugin.config['emoticons'] = string.join(emots, '\t') #trayicon if self.chk_trayicon.get_active(): self.plugin.config['trayicon'] = 1 @@ -319,11 +328,49 @@ class preference_Window: model.set(iter, 0, self.plugin.config['msg%s_name' % i], 1, self.plugin.config['msg%s' % i]) i += 1 + def image_is_ok(self, image): + if not os.path.exists(image): + return 0 + img = gtk.Image() + try: + img.set_from_file(image) + except: + return 0 + if img.get_storage_type() == gtk.IMAGE_PIXBUF: + pix = img.get_pixbuf() + else: + return 0 + if pix.get_width() > 24 or pix.get_height() > 24: + return 0 + return 1 + + def load_emots(self): + emots = {} + split_line = string.split(self.plugin.config['emoticons'], '\t') + for i in range(0, len(split_line)/2): + if not self.image_is_ok(split_line[2*i+1]): + continue + emots[split_line[2*i]] = split_line[2*i+1] + return emots + + def fill_emot_treeview(self): + model = self.emot_tree.get_model() + model.clear() + emots = self.load_emots() + for i in emots: + iter = model.append() + model.set(iter, 0, i, 1,emots[i]) + def on_msg_cell_edited(self, cell, row, new_text): model = self.msg_tree.get_model() iter = model.get_iter_from_string(row) model.set_value(iter, 0, new_text) + def on_emot_cell_edited(self, cell, row, new_text): + model = self.emot_tree.get_model() + iter = model.get_iter_from_string(row) + model.set_value(iter, 0, new_text) + def on_msg_treeview_cursor_changed(self, widget, data=None): self.xml.get_widget('delete_msg_button').set_sensitive(True) buf = self.xml.get_widget('msg_textview').get_buffer() @@ -337,12 +384,70 @@ class preference_Window: iter = model.append() model.set(iter, 0, 'msg', 1, 'message') + def on_button_emoticons_clicked(self, widget, data=None): + (model, iter) = self.emot_tree.get_selection().get_selected() + if not iter: + return + file = model.get_value(iter, 1) + dialog = gtk.FileChooserDialog("Choose image", + None, + gtk.FILE_CHOOSER_ACTION_OPEN, + (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, + gtk.STOCK_OPEN, gtk.RESPONSE_OK)) + dialog.set_default_response(gtk.RESPONSE_OK) + filter = gtk.FileFilter() + filter.set_name("All files") + filter.add_pattern("*") + dialog.add_filter(filter) + + filter = gtk.FileFilter() + filter.set_name("Images") + filter.add_mime_type("image/png") + filter.add_mime_type("image/jpeg") + filter.add_mime_type("image/gif") + filter.add_pattern("*.png") + filter.add_pattern("*.jpg") + filter.add_pattern("*.gif") + filter.add_pattern("*.tif") + filter.add_pattern("*.xpm") + dialog.add_filter(filter) + dialog.set_filter(filter) + + file = os.path.join(os.getcwd(), file) + dialog.set_filename(file) + file = '' + ok = 0 + while(ok == 0): + response = dialog.run() + if response == gtk.RESPONSE_OK: + file = dialog.get_filename() + if self.image_is_ok(file): + ok = 1 + else: + ok = 1 + dialog.destroy() + if file: + self.xml.get_widget('entry_emoticons').set_text(file) + self.xml.get_widget('image_emoticon').set_from_file(file) + model.set_value(iter, 1, file) + def on_delete_msg_button_clicked(self, widget, data=None): (model, iter) = self.msg_tree.get_selection().get_selected() buf = self.xml.get_widget('msg_textview').get_buffer() model.remove(iter) buf.set_text('') self.xml.get_widget('delete_msg_button').set_sensitive(False) + + def on_button_new_emoticon_clicked(self, widget, data=None): + model = self.emot_tree.get_model() + iter = model.append() + model.set(iter, 0, 'smeiley', 1, '') + + def on_button_remove_emoticon_clicked(self, widget, data=None): + (model, iter) = self.emot_tree.get_selection().get_selected() + if not iter: + return + model.remove(iter) def on_msg_textview_changed(self, widget, data=None): (model, iter) = self.msg_tree.get_selection().get_selected() @@ -353,6 +458,14 @@ class preference_Window: name = model.get_value(iter, 0) model.set_value(iter, 1, buf.get_text(first_iter, end_iter)) + def on_treeview_emoticons_cursor_changed(self, widget, data=None): + (model, iter) = self.emot_tree.get_selection().get_selected() + if not iter: + return + img_str = model.get_value(iter, 1) + self.xml.get_widget('entry_emoticons').set_text(img_str) + self.xml.get_widget('image_emoticon').set_from_file(img_str) + def on_chk_toggled(self, widget, widgets): """set or unset sensitivity of widgets when widget is toggled""" for w in widgets: @@ -413,6 +526,25 @@ class preference_Window: #Use emoticons st = self.plugin.config['useemoticons'] self.xml.get_widget('use_emoticons_checkbutton').set_active(st) + self.xml.get_widget('button_new_emoticon').set_sensitive(st) + self.xml.get_widget('button_remove_emoticon').set_sensitive(st) + self.xml.get_widget('treeview_emoticons').set_sensitive(st) + self.xml.get_widget('entry_emoticons').set_sensitive(st) + self.xml.get_widget('button_emoticons').set_sensitive(st) + self.xml.get_widget('image_emoticon').set_sensitive(st) + + #emoticons + self.emot_tree = self.xml.get_widget('treeview_emoticons') + model = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING) + self.emot_tree.set_model(model) + col = gtk.TreeViewColumn('name') + self.emot_tree.append_column(col) + renderer = gtk.CellRendererText() + renderer.connect('edited', self.on_emot_cell_edited) + renderer.set_property('editable', True) + col.pack_start(renderer, True) + col.set_attributes(renderer, text=0) + self.fill_emot_treeview() #Autopopup st = self.plugin.config['autopopup'] @@ -510,16 +642,31 @@ class preference_Window: self.xml.signal_connect('on_cancel_clicked', self.on_cancel) self.xml.signal_connect('on_msg_treeview_cursor_changed', \ self.on_msg_treeview_cursor_changed) + self.xml.signal_connect('on_treeview_emoticons_cursor_changed', \ + self.on_treeview_emoticons_cursor_changed) + self.xml.signal_connect('on_button_emoticons_clicked', \ + self.on_button_emoticons_clicked) self.xml.signal_connect('on_new_msg_button_clicked', \ self.on_new_msg_button_clicked) self.xml.signal_connect('on_delete_msg_button_clicked', \ self.on_delete_msg_button_clicked) + self.xml.signal_connect('on_button_new_emoticon_clicked', \ + self.on_button_new_emoticon_clicked) + self.xml.signal_connect('on_button_remove_emoticon_clicked', \ + self.on_button_remove_emoticon_clicked) self.xml.signal_connect('on_chk_autopopup_toggled', \ self.on_chk_toggled, [self.chk_autoppaway]) self.xml.signal_connect('on_chk_autoaway_toggled', \ self.on_chk_toggled, [self.spin_autoawaytime]) self.xml.signal_connect('on_chk_autoxa_toggled', \ self.on_chk_toggled, [self.spin_autoxatime]) + self.xml.signal_connect('on_use_emoticons_checkbutton_toggled', \ + self.on_chk_toggled, [self.xml.get_widget('button_new_emoticon'), + self.xml.get_widget('button_remove_emoticon'), + self.xml.get_widget('treeview_emoticons'), + self.xml.get_widget('entry_emoticons'), + self.xml.get_widget('button_emoticons'), + self.xml.get_widget('image_emoticon')]) self.xml.signal_connect('on_lookfeel_button_clicked', \ self.on_lookfeel_button_clicked) self.xml.signal_connect('on_events_button_clicked', \ diff --git a/plugins/gtkgui/gtkgui.glade b/plugins/gtkgui/gtkgui.glade index cffa3da9e..44c9ea8a8 100644 --- a/plugins/gtkgui/gtkgui.glade +++ b/plugins/gtkgui/gtkgui.glade @@ -4181,6 +4181,7 @@ on the server. + 5 True False 0 @@ -4196,6 +4197,7 @@ on the server. False False True + 0 @@ -4210,7 +4212,7 @@ on the server. 0 - True + False True @@ -4227,7 +4229,171 @@ on the server. - + + 5 + True + False + 0 + + + + True + False + 5 + + + + True + True + gtk-add + True + GTK_RELIEF_NORMAL + True + + + + 0 + False + False + + + + + + True + True + gtk-remove + True + GTK_RELIEF_NORMAL + True + + + + 0 + False + False + + + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + False + False + False + True + + + + + + 0 + True + True + + + + + 0 + True + True + + + + + + 5 + True + False + 5 + + + + True + False + 5 + + + + True + True + False + True + 0 + + True + * + False + + + 0 + True + True + + + + + + True + True + ... + True + GTK_RELIEF_NORMAL + True + + + + 0 + False + False + GTK_PACK_END + + + + + 0 + False + True + + + + + + True + 0.5 + 0.5 + 0 + 0 + + + 0 + True + True + + + + + 0 + True + True + + + + + 0 + True + True + diff --git a/plugins/gtkgui/gtkgui.py b/plugins/gtkgui/gtkgui.py index 2be04e978..eac916311 100644 --- a/plugins/gtkgui/gtkgui.py +++ b/plugins/gtkgui/gtkgui.py @@ -1734,101 +1734,35 @@ class roster_Window: self.plugin.windows[account]['browser'] = \ browseAgent_Window(self.plugin, account) + def image_is_ok(self, image): + if not os.path.exists(image): + return 0 + img = gtk.Image() + try: + img.set_from_file(image) + except: + return 0 + if img.get_storage_type() == gtk.IMAGE_PIXBUF: + pix = img.get_pixbuf() + else: + return 0 + if pix.get_width() > 24 or pix.get_height() > 24: + return 0 + return 1 + def mkemoticons(self): """initialize emoticons array""" - emots = {':-)' : 'smile.png', - ':)' : 'smile.png', - ';-)' : 'wink.png', - ';)' : 'wink.png', - ':-p' : 'tongue.png', - ':-P' : 'tongue.png', - ':p' : 'tongue.png', - ':P' : 'tongue.png', - ':d' : 'biggrin.png', - ':D' : 'biggrin.png', - ':-d' : 'biggrin.png', - ':-D' : 'biggrin.png', - ':>' : 'biggrin.png', - ':->' : 'biggrin.png', - ':(' : 'unhappy.png', - ':-(' : 'unhappy.png', - ';(' : 'cry.png', - ';-(' : 'cry.png', - ':\'(' : 'cry.png', - ';\'-(' : 'cry.png', - ':-O' : 'oh.png', - ':-o' : 'oh.png', - ':O' : 'oh.png', - ':o' : 'oh.png', - ':-@' : 'angry.png', - ':@' : 'angry.png', - ':-$' : 'blush.png', - ':$' : 'blush.png', - ':-|' : 'stare.png', - ':|' : 'stare.png', - ':-S' : 'frowing.png', - ':-s' : 'frowing.png', - ':S' : 'frowing.png', - ':s' : 'frowing.png', - 'B-)' : 'coolglasses.png', - 'B)' : 'coolglasses.png', - '8-)' : 'coolglasses.png', - '8)' : 'coolglasses.png', - '(H)' : 'coolglasses.png', - '(h)' : 'coolglasses.png', - ':-[' : 'bat.png', - ':[' : 'bat.png', - '(l)' : 'heart.png', - '(L)' : 'heart.png', - '(u)' : 'brheart.png', - '(U)' : 'brheart.png', - '(y)' : 'yes.png', - '(Y)' : 'yes.png', - '(n)' : 'no.png', - '(N)' : 'no.png', - '(z)' : 'boy.png', - '(Z)' : 'boy.png', - '(@)' : 'pussy.png', - '(})' : 'hugleft.png', - '({)' : 'hugright.png', - '(6)' : 'devil.png', - '(r)' : 'rainbow.png', - '(R)' : 'rainbow.png', - '(w)' : 'brflower.png', - '(W)' : 'brflower.png', - '(f)' : 'flower.png', - '(F)' : 'flower.png', - '(p)' : 'photo.png', - '(P)' : 'photo.png', - '(t)' : 'phone.png', - '(T)' : 'phone.png', - '(*)' : 'star.png', - '(8)' : 'music.png', - '(i)' : 'lamp.png', - '(I)' : 'lamp.png', - '(b)' : 'beer.png', - '(B)' : 'beer.png', - '(d)' : 'drink.png', - '(D)' : 'drink.png', - '(c)' : 'coffee.png', - '(C)' : 'coffee.png', - '(%)' : 'cuffs.png', - '(e)' : 'mail.png', - '(E)' : 'mail.png', - '(k)' : 'kiss.png', - '(K)' : 'kiss.png' - } - path = 'plugins/gtkgui/emoticons/' self.emoticons = {} self.begin_emot = "" - for e in emots: - file = path + emots[e] - if not os.path.exists(file): + split_line = string.split(self.plugin.config['emoticons'], '\t') + for i in range(0, len(split_line)/2): + file = split_line[2*i+1] + if not self.image_is_ok(file): continue pix = gtk.gdk.pixbuf_new_from_file(file) - self.emoticons[e] = pix - if not e[0] in self.begin_emot: - self.begin_emot += e[0] + self.emoticons[split_line[2*i]] = pix + if not split_line[2*i][0] in self.begin_emot: + self.begin_emot += split_line[2*i][0] def mkpixbufs(self): """initialise pixbufs array""" @@ -2692,6 +2626,7 @@ class plugin: 'saveposition': 1,\ 'mergeaccounts': 0,\ 'useemoticons': 1,\ + 'emoticons':':-)\tplugins/gtkgui/emoticons/smile.png\t(@)\tplugins/gtkgui/emoticons/pussy.png\t8)\tplugins/gtkgui/emoticons/coolglasses.png\t:(\tplugins/gtkgui/emoticons/unhappy.png\t:)\tplugins/gtkgui/emoticons/smile.png\t(})\tplugins/gtkgui/emoticons/hugleft.png\t:$\tplugins/gtkgui/emoticons/blush.png\t(Y)\tplugins/gtkgui/emoticons/yes.png\t:-@\tplugins/gtkgui/emoticons/angry.png\t:-D\tplugins/gtkgui/emoticons/biggrin.png\t(U)\tplugins/gtkgui/emoticons/brheart.png\t(F)\tplugins/gtkgui/emoticons/flower.png\t:-[\tplugins/gtkgui/emoticons/bat.png\t:>\tplugins/gtkgui/emoticons/biggrin.png\t(T)\tplugins/gtkgui/emoticons/phone.png\t(l)\tplugins/gtkgui/emoticons/heart.png\t:-S\tplugins/gtkgui/emoticons/frowing.png\t:-P\tplugins/gtkgui/emoticons/tongue.png\t(h)\tplugins/gtkgui/emoticons/coolglasses.png\t(D)\tplugins/gtkgui/emoticons/drink.png\t:-O\tplugins/gtkgui/emoticons/oh.png\t(f)\tplugins/gtkgui/emoticons/flower.png\t(C)\tplugins/gtkgui/emoticons/coffee.png\t:-o\tplugins/gtkgui/emoticons/oh.png\t({)\tplugins/gtkgui/emoticons/hugright.png\t(*)\tplugins/gtkgui/emoticons/star.png\tB-)\tplugins/gtkgui/emoticons/coolglasses.png\t(z)\tplugins/gtkgui/emoticons/boy.png\t:-d\tplugins/gtkgui/emoticons/biggrin.png\t(E)\tplugins/gtkgui/emoticons/mail.png\t(N)\tplugins/gtkgui/emoticons/no.png\t(p)\tplugins/gtkgui/emoticons/photo.png\t(K)\tplugins/gtkgui/emoticons/kiss.png\t(r)\tplugins/gtkgui/emoticons/rainbow.png\t:-|\tplugins/gtkgui/emoticons/stare.png\t:-s\tplugins/gtkgui/emoticons/frowing.png\t:-p\tplugins/gtkgui/emoticons/tongue.png\t(c)\tplugins/gtkgui/emoticons/coffee.png\t(e)\tplugins/gtkgui/emoticons/mail.png\t;-)\tplugins/gtkgui/emoticons/wink.png\t;-(\tplugins/gtkgui/emoticons/cry.png\t(6)\tplugins/gtkgui/emoticons/devil.png\t:o\tplugins/gtkgui/emoticons/oh.png\t(L)\tplugins/gtkgui/emoticons/heart.png\t(w)\tplugins/gtkgui/emoticons/brflower.png\t:d\tplugins/gtkgui/emoticons/biggrin.png\t(Z)\tplugins/gtkgui/emoticons/boy.png\t(u)\tplugins/gtkgui/emoticons/brheart.png\t:|\tplugins/gtkgui/emoticons/stare.png\t(P)\tplugins/gtkgui/emoticons/photo.png\t:O\tplugins/gtkgui/emoticons/oh.png\t(R)\tplugins/gtkgui/emoticons/rainbow.png\t(t)\tplugins/gtkgui/emoticons/phone.png\t(i)\tplugins/gtkgui/emoticons/lamp.png\t;)\tplugins/gtkgui/emoticons/wink.png\t;(\tplugins/gtkgui/emoticons/cry.png\t:p\tplugins/gtkgui/emoticons/tongue.png\t(H)\tplugins/gtkgui/emoticons/coolglasses.png\t:s\tplugins/gtkgui/emoticons/frowing.png\t;\'-(\tplugins/gtkgui/emoticons/cry.png\t:-(\tplugins/gtkgui/emoticons/unhappy.png\t:-)\tplugins/gtkgui/emoticons/smile.png\t(b)\tplugins/gtkgui/emoticons/beer.png\t8-)\tplugins/gtkgui/emoticons/coolglasses.png\t(B)\tplugins/gtkgui/emoticons/beer.png\t(W)\tplugins/gtkgui/emoticons/brflower.png\t:D\tplugins/gtkgui/emoticons/biggrin.png\t(y)\tplugins/gtkgui/emoticons/yes.png\t(8)\tplugins/gtkgui/emoticons/music.png\t:@\tplugins/gtkgui/emoticons/angry.png\tB)\tplugins/gtkgui/emoticons/coolglasses.png\t:-$\tplugins/gtkgui/emoticons/blush.png\t:\'(\tplugins/gtkgui/emoticons/cry.png\t(n)\tplugins/gtkgui/emoticons/no.png\t(k)\tplugins/gtkgui/emoticons/kiss.png\t:->\tplugins/gtkgui/emoticons/biggrin.png\t:[\tplugins/gtkgui/emoticons/bat.png\t(I)\tplugins/gtkgui/emoticons/lamp.png\t:P\tplugins/gtkgui/emoticons/tongue.png\t(%)\tplugins/gtkgui/emoticons/cuffs.png\t(d)\tplugins/gtkgui/emoticons/drink.png\t:S\tplugins/gtkgui/emoticons/frowing.png',\ 'x-position': 0,\ 'y-position': 0,\ 'width': 150,\