Skip to content

Commit

Permalink
Support drag to move elements
Browse files Browse the repository at this point in the history
  • Loading branch information
manuvarkey committed Oct 16, 2023
1 parent 3b7f426 commit e85f0ab
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 12 deletions.
46 changes: 34 additions & 12 deletions gelectrical/model/drawing.py
Original file line number Diff line number Diff line change
Expand Up @@ -272,20 +272,32 @@ def get_element_codes(self, codes=None):
selected.append(slno)
return selected

def get_element_copy(self, element):
element_model = element.get_model()
code = element.code
if code == 'element_assembly':
element_copy = ElementAssembly()
elif code == 'element_wire':
element_copy = Wire()
else:
element_copy = self.element_models[code](project_settings=self.program_state['project_settings'])
element_copy.set_model(element_model, self.get_gid())
return element_copy

def get_grid_point(self, x, y):
x = round(x/self.grid_width, 0)*self.grid_width
y = round(y/self.grid_width, 0)*self.grid_width
return x,y

def get_port_around_coordinate(self, x, y, w=misc.SELECT_PORT_RECT, h=misc.SELECT_PORT_RECT, ignore_display_elements=False):
"""Draw the selected schematic model"""
"""Get port around given coordinate"""
w = int(w)
h = int(h)
x = int(x-w/2)
y = int(y-h/2)
# Form selection rectangle
rect = cairo.RectangleInt(x, y, w, h)
for element in self.elements:
# Form selection rectangle
rect = cairo.RectangleInt(x, y, w, h)
# Check for overlap
port = element.check_overlap_ports(rect)
if port:
Expand All @@ -294,6 +306,24 @@ def get_port_around_coordinate(self, x, y, w=misc.SELECT_PORT_RECT, h=misc.SELEC
return port
else:
return port

def get_element_around_coordinate(self, x, y, w=misc.SELECT_PORT_RECT, h=misc.SELECT_PORT_RECT, ignore_display_elements=False):
"""Get element around given coordinate"""
w = int(w)
h = int(h)
x = int(x-w/2)
y = int(y-h/2)
# Form selection rectangle
rect = cairo.RectangleInt(x, y, w, h)
for slno, element in enumerate(self.elements):
# Check for overlap
if element.check_overlap(rect):
if ignore_display_elements:
if element.code not in misc.DISPLAY_ELEMENT_CODES:
return slno, element
else:
return slno, element
return None, None

## Modify Functions

Expand Down Expand Up @@ -525,15 +555,7 @@ def make_floating_model_permenant(self, port=None):
elements_copy = []
# Insert elements inside elementgroup
for el_no, element in enumerate(self.floating_model.elements):
element_model = element.get_model()
code = element.code
if code == 'element_assembly':
element_copy = ElementAssembly()
elif code == 'element_wire':
element_copy = Wire()
else:
element_copy = self.element_models[code](project_settings=self.program_state['project_settings'])
element_copy.set_model(element_model, self.get_gid())
element_copy = self.get_element_copy(element)
if element_copy.code in misc.LOADPROFILE_CODES:
element_copy.fields['load_profile']['selection_list'] = self.parent.loadprofiles
self.insert_element_at_index(element_copy)
Expand Down
28 changes: 28 additions & 0 deletions gelectrical/view/drawing.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ def __init__(self, window, box, drawing_model, program_state, program_settings,
self.on_end_callback = None
self.hadjustment = 0
self.vadjustment = 0
self.drag_el = None

self.dirty_draw = True # Flag to keep track of whether a drawing is to be fully redrawn
self.highlighted_port = None # Flag to keep track of the currently highlighted port
Expand All @@ -80,6 +81,12 @@ def __init__(self, window, box, drawing_model, program_state, program_settings,
self.drawing_area.connect("button-press-event", self.on_button_press)
self.drawing_area.connect("motion-notify-event", self.on_pointer_move)
self.drawing_area.connect("scroll-event", self.on_mouse_scroll)
self.drawing_area.drag_source_set(Gdk.ModifierType.BUTTON1_MASK, None, Gdk.DragAction.PRIVATE)
self.drawing_area.drag_dest_set(Gtk.DestDefaults.MOTION, None, Gdk.DragAction.PRIVATE)
self.drawing_area.drag_dest_set_track_motion(True)
self.drawing_area.connect("drag-begin", self.on_drag_begin)
self.drawing_area.connect("drag-end", self.on_drag_end)
self.drawing_area.connect("drag-motion", self.on_drag_motion)
self.drawing_area.connect("key-press-event", self.on_key_press)
self.drawing_area.add_events(Gdk.EventMask.BUTTON_PRESS_MASK |
Gdk.EventMask.POINTER_MOTION_MASK |
Expand Down Expand Up @@ -459,6 +466,27 @@ def on_mouse_scroll(self, w, e):
if self.scale >= 0.6:
self.scale -= 0.2
self.refresh(redraw=True)

def on_drag_begin(self, w, c):
elno, element = self.drawing_model.get_element_around_coordinate(self.x, self.y)
self.drag_el = elno
if element and element.code not in ('element_assembly'):
element_copy = self.drawing_model.get_element_copy(element)
self.drawing_model.add_floating_model([element_copy])
self.drawing_model.delete_rows([self.drag_el])
self.set_mode(misc.MODE_INSERT)

def on_drag_motion(self, widget, context, x, y, time):
self.x = x/self.scale
self.y = y/self.scale
self.refresh()

def on_drag_end(self, widget, context):
if self.drag_el is not None:
self.drawing_model.make_floating_model_permenant()
self.drawing_model.reset_floating_model()
self.set_mode(misc.MODE_DEFAULT)
self.drag_el = None

def on_key_press(self, w, e):
"""Handle key press events"""
Expand Down

0 comments on commit e85f0ab

Please sign in to comment.