working on shape

This commit is contained in:
Huy Pham 2019-11-27 16:39:48 -08:00
parent 1a05571e50
commit 5c04225cc4
3 changed files with 80 additions and 22 deletions

View file

@ -13,7 +13,7 @@ from coretk.dialogs.mobilityconfig import MobilityConfigDialog
from coretk.dialogs.nodeconfig import NodeConfigDialog from coretk.dialogs.nodeconfig import NodeConfigDialog
from coretk.dialogs.wlanconfig import WlanConfigDialog from coretk.dialogs.wlanconfig import WlanConfigDialog
from coretk.graph_helper import GraphHelper, WlanAntennaManager from coretk.graph_helper import GraphHelper, WlanAntennaManager
from coretk.images import Images from coretk.images import ImageEnum, Images
from coretk.linkinfo import LinkInfo, Throughput from coretk.linkinfo import LinkInfo, Throughput
from coretk.nodedelete import CanvasComponentManagement from coretk.nodedelete import CanvasComponentManagement
from coretk.nodeutils import NodeUtils from coretk.nodeutils import NodeUtils
@ -53,11 +53,13 @@ class CanvasGraph(tk.Canvas):
super().__init__(master, cnf, **kwargs) super().__init__(master, cnf, **kwargs)
self.app = master self.app = master
self.mode = GraphMode.SELECT self.mode = GraphMode.SELECT
self.annotation_type = None
self.selected = None self.selected = None
self.node_draw = None self.node_draw = None
self.context = None self.context = None
self.nodes = {} self.nodes = {}
self.edges = {} self.edges = {}
self.shapes = {}
self.drawing_edge = None self.drawing_edge = None
self.grid = None self.grid = None
self.canvas_management = CanvasComponentManagement(self, core) self.canvas_management = CanvasComponentManagement(self, core)
@ -272,16 +274,23 @@ class CanvasGraph(tk.Canvas):
self.context.unpost() self.context.unpost()
self.context = None self.context = None
else: else:
self.focus_set() if self.mode == GraphMode.ANNOTATION:
self.selected = self.get_selected(event) if self.annotation_type in [ImageEnum.OVAL, ImageEnum.RECTANGLE]:
logging.debug(f"click release selected({self.selected}) mode({self.mode})") x, y = self.canvas_xy(event)
if self.mode == GraphMode.EDGE: self.shapes[self.selected].shape_complete(x, y)
self.handle_edge_release(event) else:
elif self.mode == GraphMode.NODE: self.focus_set()
x, y = self.canvas_xy(event) self.selected = self.get_selected(event)
self.add_node(x, y) logging.debug(
elif self.mode == GraphMode.PICKNODE: f"click release selected({self.selected}) mode({self.mode})"
self.mode = GraphMode.NODE )
if self.mode == GraphMode.EDGE:
self.handle_edge_release(event)
elif self.mode == GraphMode.NODE:
x, y = self.canvas_xy(event)
self.add_node(x, y)
elif self.mode == GraphMode.PICKNODE:
self.mode = GraphMode.NODE
def handle_edge_release(self, event): def handle_edge_release(self, event):
edge = self.drawing_edge edge = self.drawing_edge
@ -333,8 +342,11 @@ class CanvasGraph(tk.Canvas):
x, y = self.coords(selected) x, y = self.coords(selected)
self.drawing_edge = CanvasEdge(x, y, x, y, selected, self) self.drawing_edge = CanvasEdge(x, y, x, y, selected, self)
if self.mode == GraphMode.ANNOTATION: if self.mode == GraphMode.ANNOTATION:
shape = Shape(self.app, self, event.x, event.y) if self.annotation_type in [ImageEnum.OVAL, ImageEnum.RECTANGLE]:
print(shape) x, y = self.canvas_xy(event)
shape = Shape(self.app, self, x, y)
self.selected = shape.id
self.shapes[shape.id] = shape
def click_motion(self, event): def click_motion(self, event):
""" """
@ -347,6 +359,10 @@ class CanvasGraph(tk.Canvas):
x2, y2 = self.canvas_xy(event) x2, y2 = self.canvas_xy(event)
x1, y1, _, _ = self.coords(self.drawing_edge.id) x1, y1, _, _ = self.coords(self.drawing_edge.id)
self.coords(self.drawing_edge.id, x1, y1, x2, y2) self.coords(self.drawing_edge.id, x1, y1, x2, y2)
if self.mode == GraphMode.ANNOTATION:
if self.annotation_type in [ImageEnum.OVAL, ImageEnum.RECTANGLE]:
x, y = self.canvas_xy(event)
self.shapes[self.selected].shape_motion(x, y)
def click_context(self, event): def click_context(self, event):
logging.info("context event: %s", self.context) logging.info("context event: %s", self.context)

View file

@ -1,16 +1,57 @@
""" """
class for shapes class for shapes
""" """
# from coretk.images import ImageEnum, Images import logging
from coretk.images import ImageEnum
ABOVE_COMPONENT = ["gridline", "edge", "linkinfo", "antenna", "node", "nodename"]
class Shape: class Shape:
def __init__(self, app, canvas, topleft_x, topleft_y): def __init__(self, app, canvas, top_x, top_y):
self.app = app self.app = app
self.canvas = canvas self.canvas = canvas
self.x0 = topleft_x self.x0 = top_x
self.y0 = topleft_y self.y0 = top_y
# imageenum = self.app.toolbar self.cursor_x = None
self.id = self.canvas.create_oval( self.cursor_y = None
topleft_x, topleft_y, topleft_x + 30, topleft_y + 30 annotation_type = self.canvas.annotation_type
if annotation_type == ImageEnum.OVAL:
self.id = canvas.create_oval(
top_x, top_y, top_x, top_y, tags="shape", dash="-"
)
elif annotation_type == ImageEnum.RECTANGLE:
self.id = canvas.create_rectangle(
top_x, top_y, top_x, top_y, tags="shape", dash="-"
)
self.canvas.tag_bind(self.id, "<ButtonPress-1>", self.click_press)
self.canvas.tag_bind(self.id, "<ButtonRelease-1>", self.click_release)
self.canvas.tag_bind(self.id, "<B1-Motion>", self.motion)
def shape_motion(self, x1, y1):
self.canvas.coords(self.id, self.x0, self.y0, x1, y1)
def shape_complete(self, x, y):
self.canvas.itemconfig(self.id, width=0, fill="#ccccff")
for component in ABOVE_COMPONENT:
self.canvas.tag_raise(component)
def click_press(self, event):
logging.debug("Click on shape %s", self.id)
self.cursor_x = event.x
self.cursor_y = event.y
def click_release(self, event):
logging.debug("Click release on shape %s", self.id)
def motion(self, event):
logging.debug("motion on shape %s", self.id)
delta_x = event.x - self.cursor_x
delta_y = event.y - self.cursor_y
x0, y0, x1, y1 = self.canvas.bbox(self.id)
self.canvas.coords(
self.id, x0 + delta_x, y0 + delta_y, x1 + delta_x, y1 + delta_y
) )
self.cursor_x = event.x
self.cursor_y = event.y

View file

@ -300,7 +300,7 @@ class Toolbar(ttk.Frame):
image = icon(image_enum) image = icon(image_enum)
self.create_picker_button( self.create_picker_button(
image, image,
partial(self.update_annotation, image), partial(self.update_annotation, image, image_enum),
self.annotation_picker, self.annotation_picker,
tooltip, tooltip,
) )
@ -362,12 +362,13 @@ class Toolbar(ttk.Frame):
self.design_frame.tkraise() self.design_frame.tkraise()
def update_annotation(self, image): def update_annotation(self, image, image_enum):
logging.info("clicked annotation: ") logging.info("clicked annotation: ")
self.hide_pickers() self.hide_pickers()
self.annotation_button.configure(image=image) self.annotation_button.configure(image=image)
self.annotation_button.image = image self.annotation_button.image = image
self.app.canvas.mode = GraphMode.ANNOTATION self.app.canvas.mode = GraphMode.ANNOTATION
self.app.canvas.annotation_type = image_enum
def click_run_button(self): def click_run_button(self):
logging.debug("Click on RUN button") logging.debug("Click on RUN button")