hi Jérémie The patch looks straight-forward to me, but could you please save it into a file and resend it as attachement? Your mailer seems to have screwed up the whitespace.
Regards Martin On Sat, Sep 10, 2011 at 12:16:29PM +0200, ferry jeremie wrote: > Hi everone, > > I'm new on this mailing-list and i propose a little patch for my entry... > First, i was a simple user of this incredible software and a python > webdevelopper. > > For my spare time, i participate to a free game who name's Plee the Bear : > http://plee-the-bear.sourceforge.net > > When i do animation, i must duplicate a lot of time the same layer. > For that, i found the trick : ctr c + add layer + ctr v > > A more productive solution would be to add a "duplicate layer > button" like Gimp > (i copy the picture rightly and use it in pixbuf). > > My patch do this. It's probably perfectible (no shortcut and lack i18n), > no pretension but it works. > > pleased reading your feedback. > > cordially, Jérémie Ferry > > > From 7c75366acbe9cb8c1a463155fd7b747f51f59bea Mon Sep 17 00:00:00 2001 > From: =?UTF-8?q?Ferry=20J=C3=A9r=C3=A9mie?= <[email protected]> > Date: Sat, 09 Sep 2011 14:53:14 +0200 > Subject: [PATCH] mypaint with duplicate layer button > > --- > gui/drawwindow.py | 1 + > gui/layerswindow.py | 23 +++++++++++++++++++++++ > lib/command.py | 16 ++++++++++++++++ > lib/document.py | 3 +++ > pixmaps/layer_duplicate.png | Bin 0 -> 482 bytes > 5 files changed, 43 insertions(+), 0 deletions(-) > create mode 100644 pixmaps/layer_duplicate.png > > diff --git a/gui/drawwindow.py b/gui/drawwindow.py > index 113d832..5b43484 100644 > --- a/gui/drawwindow.py > +++ b/gui/drawwindow.py > @@ -912,6 +912,7 @@ class Window (windowing.MainWindow, layout.MainWindow): > u'David Grundberg (%s)' % _('programming'), > u"Krzysztof Pasek (%s)" % _('programming'), > u"Ben O'Steen (%s)" % _('programming'), > + u"Ferry Jérémie (%s)" % _('programming'), > ]) > d.set_artists([ > u"Artis Rozentāls (%s)" % _('brushes'), > diff --git a/gui/layerswindow.py b/gui/layerswindow.py > index 6494666..2ac242a 100644 > --- a/gui/layerswindow.py > +++ b/gui/layerswindow.py > @@ -68,12 +68,23 @@ class ToolWidget (gtk.VBox): > add_button = self.add_button = stock_button(gtk.STOCK_ADD) > move_up_button = self.move_up_button = stock_button(gtk.STOCK_GO_UP) > move_down_button = self.move_down_button = stock_button(gtk.STOCK_GO_DOWN) > + > + b = gtk.Button() > + img = gtk.Image() > + img.set_from_pixbuf(self.app.pixmaps.layer_duplicate) > + b.add(img) > + tooltip = gtk.Tooltips() > + tooltip.set_tip(b, "Duplicate this layer") > + duplicate_button = self.duplicate_button = b > + > + > merge_down_button = self.merge_down_button = > stock_button(gtk.STOCK_DND_MULTIPLE) # XXX need a better one > del_button = self.del_button = stock_button(gtk.STOCK_DELETE) > > add_button.connect('clicked', self.on_layer_add) > move_up_button.connect('clicked', self.move_layer, 'up') > move_down_button.connect('clicked', self.move_layer, 'down') > + duplicate_button.connect('clicked', self.duplicate_layer) > merge_down_button.connect('clicked', self.merge_layer_down) > del_button.connect('clicked', self.on_layer_del) > > @@ -83,6 +94,7 @@ class ToolWidget (gtk.VBox): > buttons_hbox.pack_start(add_button) > buttons_hbox.pack_start(move_up_button) > buttons_hbox.pack_start(move_down_button) > + buttons_hbox.pack_start(duplicate_button) > buttons_hbox.pack_start(merge_down_button) > buttons_hbox.pack_start(del_button) > > @@ -229,6 +241,17 @@ class ToolWidget (gtk.VBox): > if new_layer_pos < len(doc.layers) and new_layer_pos >= 0: > doc.move_layer(current_layer_pos, new_layer_pos, select_new=True) > > + def duplicate_layer(self, widget): > + doc = self.app.doc.model > + layer = doc.layers[doc.layer_idx] > + name = layer.name > + if name: > + name = "copy of %s" % name > + else: > + layer_num = self.anon_layer_num.get(id(layer), None) > + name = 'copy of %s' % _("Untitled layer #%d" % layer_num) > + print name > + doc.duplicate_layer(doc.layer_idx, name) > > def merge_layer_down(self, widget): > self.app.doc.model.merge_layer_down() > diff --git a/lib/command.py b/lib/command.py > index 6cefde6..f22d700 100644 > --- a/lib/command.py > +++ b/lib/command.py > @@ -229,6 +229,22 @@ class MoveLayer(Action): > self._notify_canvas_observers([moved_layer]) > self._notify_document_observers() > > +class DuplicateLayer(Action): > + def __init__(self, doc, insert_idx=None, name=''): > + self.doc = doc > + self.insert_idx = insert_idx > + snapshot = self.doc.layers[self.insert_idx].save_snapshot() > + self.new_layer = layer.Layer(name) > + self.new_layer.load_snapshot(snapshot) > + self.new_layer.surface.observers.append(self.doc.layer_modified_cb) > + def redo(self): > + self.doc.layers.insert(self.insert_idx+1, self.new_layer) > + self._notify_document_observers() > + def undo(self): > + moved_layer = self.doc.layers[self.insert_idx+1] > + self.doc.layers.remove(moved_layer) > + self._notify_document_observers() > + > class ReorderLayers(Action): > def __init__(self, doc, new_order): > self.doc = doc > diff --git a/lib/document.py b/lib/document.py > index 353d605..412d013 100644 > --- a/lib/document.py > +++ b/lib/document.py > @@ -156,6 +156,9 @@ class Document(): > def move_layer(self, was_idx, new_idx, select_new=False): > self.do(command.MoveLayer(self, was_idx, new_idx, select_new)) > > + def duplicate_layer(self, insert_idx=None, name=''): > + self.do(command.DuplicateLayer(self, insert_idx, name)) > + > def reorder_layers(self, new_layers): > self.do(command.ReorderLayers(self, new_layers)) > > diff --git a/pixmaps/layer_duplicate.png b/pixmaps/layer_duplicate.png > new file mode 100644 > index > 0000000000000000000000000000000000000000..7245a7cd219bd78c3f0c2dac308dee755d6a9af5 > GIT binary patch > literal 482 > zcmV<80UiE{P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00006VoOIv0RI60 > z0RN!9r;`8x010qNS#tmY3labT3lag+-G2N4000McNliru)&m+24;lc|PzC@10dGk} > zK~y-)oszvu13?r<&uliXXuzLJiHKT?q!C1I5)cFhpTLmLJ|r<jjAd|LG!LL4DEI;v > z1_V)28wCqf_y(I45kV~!k{t`#WmXf3UKp5rhdFod_l+>E!VZw4{V3+L>uE1Dt%7tM > zr|o501*y_>04XIKTYH>c-nMKz7o8%XO#G<p073|E?j9MRUO>|{f`JClZ*>|C2Y`A* > za&~#%8X%=a4+#2ux)~byU@016=ir^X2XLq;my|Jznp@Oxm<R{y4TQM5)|edaq;`Ku > z?f#IFt|wpDY-WvYW(^>vyTzB+H};Q?L44(QrA8$DwJ()Q(9!1s^5(8Lj^>-E!yup= > zAao+(cdtI!>z`W{TUQTaGZE~n``lsQCHtY=)E!;5>E!g{R~uUbgb?JDiKaHGVHieJ > zz>&4Rx!mqQuGm#SAeUW_198{i)pU;8#T6FkV~QS11jm4Ka}oce#}B|?_4p3>lO90v > Y6Qru7Px`?3s{jB107*qoM6N<$f|a<(Q~&?~ > > literal 0 > HcmV?d00001 > > -- > 1.7.0.4 > > > > > _______________________________________________ > Mypaint-discuss mailing list > [email protected] > https://mail.gna.org/listinfo/mypaint-discuss -- Martin Renold _______________________________________________ Mypaint-discuss mailing list [email protected] https://mail.gna.org/listinfo/mypaint-discuss
