1
+ import itertools
1
2
import os
2
3
import time
3
4
from typing import Union
27
28
)
28
29
from .utils import (
29
30
b64_to_img ,
30
- create_layer ,
31
31
find_optimal_selection_region ,
32
+ get_desc_from_resp ,
32
33
img_to_ba ,
33
34
save_img ,
34
35
)
@@ -160,10 +161,22 @@ def get_mask_image(self) -> Union[QImage, None]:
160
161
QImage .Format_RGBA8888 ,
161
162
).rgbSwapped ()
162
163
163
- def img_inserter (self , x , y , width , height ):
164
+ def img_inserter (self , x , y , width , height , group : str = None ):
164
165
"""Return frozen image inserter to insert images as new layer."""
165
166
# Selection may change before callback, so freeze selection region
166
167
has_selection = self .selection is not None
168
+ glayer = self .doc .createGroupLayer (group ) if group else None
169
+
170
+ def create_layer (name : str ):
171
+ """Create new layer in document or group"""
172
+ layer = self .doc .createNode (name , "paintLayer" )
173
+ parent = self .doc .rootNode ()
174
+ if glayer :
175
+ glayer .addChildNode (layer , None )
176
+ parent .addChildNode (glayer , None )
177
+ else :
178
+ parent .addChildNode (layer , None )
179
+ return layer
167
180
168
181
# TODO: Insert images inside a group layer for better organization
169
182
# Group layer name can contain model name, prompt, etc
@@ -206,7 +219,7 @@ def insert(layer_name, enc):
206
219
self .doc .resizeImage (0 , 0 , new_width , new_height )
207
220
208
221
ba = img_to_ba (image )
209
- layer = create_layer (self . doc , layer_name )
222
+ layer = create_layer (layer_name )
210
223
# layer.setColorSpace() doesn't pernamently convert layer depth etc...
211
224
212
225
# Don't fail silently for setPixelData(); fails if bit depth or number of channels mismatch
@@ -218,23 +231,30 @@ def insert(layer_name, enc):
218
231
layer .setPixelData (ba , x , y , width , height )
219
232
return layer
220
233
234
+ if glayer :
235
+ return insert , glayer
221
236
return insert
222
237
223
238
def apply_txt2img (self ):
224
239
# freeze selection region
225
- insert = self .img_inserter (self .x , self .y , self .width , self .height )
240
+ insert , glayer = self .img_inserter (
241
+ self .x , self .y , self .width , self .height , group = "a"
242
+ )
226
243
mask_trigger = self .transparency_mask_inserter ()
227
244
228
245
def cb (response ):
229
246
if len (self .client .long_reqs ) == 1 : # last request
230
247
self .eta_timer .stop ()
231
248
assert response is not None , "Backend Error, check terminal"
232
249
outputs = response ["outputs" ]
250
+ glayer_name , layer_names = get_desc_from_resp (response , "txt2img" )
233
251
layers = [
234
- insert (f"txt2img { i + 1 } " , output ) for i , output in enumerate (outputs )
252
+ insert (name if name else f"txt2img { i + 1 } " , output )
253
+ for output , name , i in zip (outputs , layer_names , itertools .count ())
235
254
]
236
255
for layer in layers [:- 1 ]:
237
256
layer .setVisible (False )
257
+ glayer .setName (glayer_name )
238
258
self .doc .refreshProjection ()
239
259
mask_trigger (layers )
240
260
@@ -244,7 +264,9 @@ def cb(response):
244
264
)
245
265
246
266
def apply_img2img (self , mode ):
247
- insert = self .img_inserter (self .x , self .y , self .width , self .height )
267
+ insert , glayer = self .img_inserter (
268
+ self .x , self .y , self .width , self .height , group = "a"
269
+ )
248
270
mask_trigger = self .transparency_mask_inserter ()
249
271
mask_image = self .get_mask_image ()
250
272
@@ -272,12 +294,14 @@ def cb(response):
272
294
layer_name_prefix = (
273
295
"inpaint" if mode == 1 else "sd upscale" if mode == 2 else "img2img"
274
296
)
297
+ glayer_name , layer_names = get_desc_from_resp (response , layer_name_prefix )
275
298
layers = [
276
- insert (f"{ layer_name_prefix } { i + 1 } " , output )
277
- for i , output in enumerate (outputs )
299
+ insert (name if name else f"{ layer_name_prefix } { i + 1 } " , output )
300
+ for output , name , i in zip (outputs , layer_names , itertools . count () )
278
301
]
279
302
for layer in layers [:- 1 ]:
280
303
layer .setVisible (False )
304
+ glayer .setName (glayer_name )
281
305
self .doc .refreshProjection ()
282
306
# dont need transparency mask for inpaint mode
283
307
if mode == 0 :
0 commit comments