Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 10/09/2011, à 14:09

moths-art

Petit patch de duplication de calque pour Mypaint

Bonjour,

Utilisateur de Mypaint dans mes loisirs, j'ai trouvé un petit manque notable quand j'ai voulu dupliquer facilement un claque.
En effet, le moyen le plus rapide pour cela m'a semblé : ctr c + ajouter un calque + ctr v.
3 opérations qui sont réduite en une dans gimp.

Non content, j'ai parcouru les sources (python, j'aime, mangez-en) pour voir une éventuel alternative plus efficace : nada.
Puis j'ai cherché sur le forum ainsi que sur la (les) roadmap(s) du projet et toujours rien.(un semblant d'idée dans des croquis...)

J'ai donc pris ma bite et mon couteau mon courage à 2 main et j'ai pondu ce petit patch que je vous livre en prime time :

From 7c75366acbe9cb8c1a463155fd7b747f51f59bea Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ferry=20J=C3=A9r=C3=A9mie?= <ferryjeremie@mothsart.com>
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

Pour l'utiliser, rien de plus simple :

1/ installer Mypaint :

git clone git://gitorious.org/mypaint/mypaint.git

2/ copier le patch à la racine

3/ installer le patch

git apply nom_du_patch.patch

4/ petit compile avec Scons (les parties critiques sont en C++)

scons

5/ Utilisation en locale

./mypaint

6/ installation proprement dite (en superUtilisateur)

scons install

C'est perfectible, loin d'être ambitieux mais ça rempli son objectif.
Les seuls bémols reste l'internationalisation et un éventuel raccourci clavier.

J'ai bien entendu envoyé ce code sur le tronc principale de mypaint mais la mailing-list tarde à me répondre et ça permettra au plus impatient de l'essayer avant son intégration.

Bon, certain détracteur me diront que c'est beaucoup de bruit pour pas grand chose et ils ont bien raison!

Seulement, ça me permet également de me confronter à votre communauté pour voir si il y a quelques petites améliorations possible pour Mypaint de-ci de-là.

Mon temps et ma motivation pour ce projet reste modeste donc je ne pense pas intervenir sur de gros patchs...
Mais des idées germes néanmoins tel que :

1/ groupe de calques
2/ outil de modification des calques (rotations, redimensionnement, symétrie etc)
3/ ajout de filtre via la librairie pygegl
4/ Historique des brosses sur les calques

Merci de me donner vos appréciations, vos idées etc.

Hors ligne

#2 Le 11/09/2011, à 20:47

moths-art

Re : Petit patch de duplication de calque pour Mypaint

Bon j'ai créer un dépot gitorious pour mon patch.
Dans celui-ci j'ai rajouté l'i18n + un petit brin de toilette.
Pour utiliser mypaint avec ce patch, rien de plus simple :

git clone git://gitorious.org/~mothsart/mypaint/mypaint_duplicate_layer.git

puis :

git checkout _v1

pour choisir la branche que j'ai créé pour l'occasion.
enfin :

scons

pour compiler les sources et l'internationalisation.

./mypaint

pour tester, enjoy!!

Hors ligne

#3 Le 12/09/2011, à 19:32

moths-art

Re : Petit patch de duplication de calque pour Mypaint

Je viens de corriger un bug d'affichage qui m'avait échappé et ça vient d'être intégré au tronc! cool
Du coup, y'a plus qu'à utiliser le dépot git de mypaint!!!

Ma prochaine étape sera la possibilité de déplacer, redimensionner et tourner les calques séparément.
D'une part, c'est beaucoup plus démago (une fonctionnalité demandé depuis longtemps) et ça va bien dans la continuité de mon taf  :
dupliquer un calque en un tas d'exemplaires et modifier leur propriétés par la suite.

Parallèlement à ça, j'avais pensé à une option du genre : clic-droit sur un calque -> ouvrir le calque avec gimp.
Ensuite, chaque enregistrement sur gimp mais automatiquement le calque de mypaint à jour.
Ça permettra par exemple d'appliquer un filtre à un dessin, chose impossible directement sous mypaint.
Après, pour faire ça correctement, c'est plus délicat : utiliser le press-papier me parait assez crade...
il faudra sans doute que je me penche sur dbus.(je vais demander aux dev gimp)
Si vous avez des idées, je suis preneur!

Bo, ce démarrage à été un peu une mise en bouche afin de m'intégrer au dev de mypaint et ses contraintes.
La suite risque d'être un peu plus conséquent et j'aurais désiré savoir si ces changements motives des utilisateurs francophones?
Ça vous botes où ça ne changera en rien vos habitudes?

merci de vos critiques ou questions, aussi courte soit-elle.

Hors ligne