rendered paste body# fix shift+d duplication codeimport Blenderdef get_space_size(): size=Blender.BGL.Buffer(Blender.BGL.GL_FLOAT, 4) Blender.BGL.glGetFloatv(Blender.BGL.GL_SCISSOR_BOX, size) size= size.list return int(size[0]), int(size[1])def area_mouse_coords(): a = get_space_size() b = Blender.Window.GetMouseCoords() return b[0]-a[0], b[1]-a[1]class interface_handler: current_sel = None move = 0 def __init__(self): self.bevent_num = 65536 self.objects = [] self.events = [] self.bevents = [] self.mevents = [] Blender.Draw.Register(self.draw,self.event) def add_obj(self, obj): self.objects.append(obj) def rem_obj(self, obj): self.objects.remove(obj) def idx_obj(self, obj): return self.objects.index(obj) def draw(self): for obj in self.objects: obj.draw() def add_event(self, event, callback): self.events.append([event, callback]) def event(self, evt, val): if val == 0: for event in self.events: if event[0] == evt: event[1]() if interface_handler.move: #update block position if we are moving. coords = area_mouse_coords() interface_handler.current_sel.move(coords[0], coords[1]) Blender.Draw.Redraw() if evt == Blender.Draw.LEFTMOUSE: if interface_handler.move: #if we are moving, then stop moving interface_handler.move = 0 Blender.Draw.Redraw() return None if evt == Blender.Draw.RIGHTMOUSE: if interface_handler.move: #test if we are moving a block, if so, stop interface_handler.move = 0 return None interface_handler.current_sel = None #if we click off a block, set no selection coords = area_mouse_coords() for obj in self.objects: if obj.x < coords[0] < obj.x + obj.w and obj.y < coords[1] < obj.y + obj.h: #check for selection interface_handler.current_sel = obj obj.sel = 1 else: obj.sel = 0 Blender.Draw.Redraw() if evt == Blender.Draw.MIDDLEMOUSE or (evt == Blender.Draw.GKEY and val == 0): if interface_handler.current_sel: #if there's a selected block start moving it interface_handler.move = 1 if evt == Blender.Draw.ESCKEY and val==0: if interface_handler.move: #if we are moving a block stop interface_handler.move = 0 Blender.Draw.Redraw() return None else: #otherwise quit on user prompt self.optional_quit() if evt == Blender.Draw.AKEY and val==0: if interface_handler.current_sel: #if there is a block selected, deselect interface_handler.current_sel.sel = 0 interface_handler.current_sel = None Blender.Draw.Redraw() if evt == Blender.Draw.XKEY and val==0: #delete a block on user prompt if self.pupmenu("OK?%t | Delete"): self.rem_obj(interface_handler.current_sel) interface_handler.current_sel = None Blender.Draw.Redraw() #does not work as of yet - duplication code if evt == Blender.Draw.DKEY and val==0 and (Blender.Window.GetKeyQualifiers() & Blender.Window.Qual.SHIFT): if interface_handler.current_sel: self.add_obj(interface_handler.current_sel) interface_handler.current_sel = tex_panel.instances[tex_panel.inst_count] interface_handler.move = 1 Blender.Draw.Redraw() def optional_quit(self): menustr = "OK?%t| Quit" if Blender.Draw.PupMenu(menustr) == 1: Blender.Draw.Exit() def pupmenu(self, menustr): return Blender.Draw.PupMenu(menustr)class tex_panel: inst_count = -1 instances = [] def __init__(self, x=25, y=25, w=100, h=100): tex_panel.inst_count += 1 tex_panel.instances.append(self) self.ref = tex_panel.inst_count self.x = x self.y = y self.h = h self.w = w self.sel = 0 self.input = raised_panel(x+1, y + 1, 16, 16,) self.output = raised_panel(x + w - 17, y + 1, 16, 16) self.props = raised_panel(x + 17, y + 1, w - 34, 16) def move(self, x, y): self.x = x self.y = y self.input.move(x + 1, y + 1) self.output.move(x + self.w - 17, y + 1) self.props.move(x + 17, y + 1) def draw(self): if self.sel: Blender.BGL.glColor3f(0.9,0.0,0.0) Blender.BGL.glRecti(self.x - 3, self.y - 3, self.x + self.w + 3, self.y + self.h + 3) Blender.BGL.glColor3f(0.6,0.6,0.6) Blender.BGL.glRecti(self.x - 1, self.y - 1, self.x + self.w + 1, self.y + self.h + 1) Blender.BGL.glColor3f(0.3,0.3,0.3) Blender.BGL.glRecti(self.x, self.y, self.x + self.w, self.y + self.h) #light rect Blender.BGL.glColor3f(0.7,0.7,0.7) Blender.BGL.glRecti(self.x + 1, self.y, self.x + self.w, self.y + self.h - 1) #main rect Blender.BGL.glColor3f(0.5,0.5,0.5) Blender.BGL.glRecti(self.x + 1, self.y + 1, self.x + self.w - 1, self.y + self.h - 1) self.input.draw() self.output.draw() self.props.draw() class raised_panel: def __init__(self, x, y, width, height): self.x = x self.y = y self.h = height self.w = width self.sel = 0 def move(self, x, y): self.x = x self.y = y def draw(self): if self.sel: Blender.BGL.glColor3f(0.9,0.0,0.0) Blender.BGL.glRecti(self.x - 3, self.y - 3, self.x + self.w + 3, self.y + self.h + 3) Blender.BGL.glColor3f(0.6,0.6,0.6) Blender.BGL.glRecti(self.x - 1, self.y - 1, self.x + self.w + 1, self.y + self.h + 1) Blender.BGL.glColor3f(0.7,0.7,0.7) Blender.BGL.glRecti(self.x, self.y, self.x + self.w, self.y + self.h) #light rect Blender.BGL.glColor3f(0.4,0.4,0.4) Blender.BGL.glRecti(self.x + 1, self.y, self.x + self.w, self.y + self.h - 1) #main rect Blender.BGL.glColor3f(0.6,0.6,0.6) Blender.BGL.glRecti(self.x + 1, self.y + 1, self.x + self.w - 1, self.y + self.h - 1) class connector: def __init__(self, input, output): self.inp = input self.out = out self.points = [] def draw(self): if len(self.points): passpanel = tex_panel()panel2 = tex_panel(150,150)panel3 = tex_panel(200,0)ui = interface_handler()ui.add_obj(panel)ui.add_obj(panel2)ui.add_obj(panel3)ui.add_event(Blender.Draw.QKEY, Blender.Draw.Exit)