converted canvas size and scale dialog to use common dialog class

This commit is contained in:
Blake Harnden 2019-11-04 14:09:59 -08:00
parent 2334f0f688
commit 8c4ed15629
3 changed files with 214 additions and 288 deletions

View file

@ -0,0 +1,211 @@
"""
size and scale
"""
import tkinter as tk
from tkinter import font
from coretk.dialogs.canvasbackground import ScaleOption
from coretk.dialogs.dialog import Dialog
DRAW_OBJECT_TAGS = ["edge", "node", "nodename", "linkinfo", "antenna"]
class SizeAndScaleDialog(Dialog):
def __init__(self, master, app):
"""
create an instance for size and scale object
:param app: main application
"""
super().__init__(master, app, "Canvas Size and Scale", modal=True)
self.meter_per_pixel = self.app.canvas.meters_per_pixel
self.section_font = font.Font(weight="bold")
# get current canvas dimensions
canvas = self.app.canvas
plot = canvas.find_withtag("rectangle")
x0, y0, x1, y1 = canvas.bbox(plot[0])
width = abs(x0 - x1) - 2
height = abs(y0 - y1) - 2
self.pixel_width = tk.IntVar(value=width)
self.pixel_height = tk.IntVar(value=height)
self.meters_width = tk.IntVar(value=width * self.meter_per_pixel)
self.meters_height = tk.IntVar(value=height * self.meter_per_pixel)
self.scale = tk.IntVar(value=self.meter_per_pixel * 100)
self.x = tk.IntVar(value=0)
self.y = tk.IntVar(value=0)
self.lat = tk.DoubleVar(value=47.5791667)
self.lon = tk.DoubleVar(value=-122.132322)
self.alt = tk.DoubleVar(value=2.0)
self.save_default = tk.BooleanVar(value=False)
self.draw()
def draw(self):
self.columnconfigure(0, weight=1)
self.draw_size()
self.draw_scale()
self.draw_reference_point()
self.draw_save_as_default()
self.draw_buttons()
def draw_size(self):
label = tk.Label(self, text="Size", font=self.section_font)
label.grid(sticky="w")
# draw size row 1
frame = tk.Frame(self)
frame.grid(sticky="ew", pady=3)
frame.columnconfigure(1, weight=1)
frame.columnconfigure(3, weight=1)
label = tk.Label(frame, text="Width")
label.grid(row=0, column=0, sticky="w")
entry = tk.Entry(frame, textvariable=self.pixel_width)
entry.grid(row=0, column=1, sticky="ew")
label = tk.Label(frame, text="x Height")
label.grid(row=0, column=2, sticky="w")
entry = tk.Entry(frame, textvariable=self.pixel_height)
entry.grid(row=0, column=3, sticky="ew")
label = tk.Label(frame, text="Pixels")
label.grid(row=0, column=4, sticky="w")
# draw size row 2
frame = tk.Frame(self)
frame.grid(sticky="ew", pady=3)
frame.columnconfigure(1, weight=1)
frame.columnconfigure(3, weight=1)
label = tk.Label(frame, text="Width")
label.grid(row=0, column=0, sticky="w")
entry = tk.Entry(frame, textvariable=self.meters_width)
entry.grid(row=0, column=1, sticky="ew")
label = tk.Label(frame, text="x Height")
label.grid(row=0, column=2, sticky="w")
entry = tk.Entry(frame, textvariable=self.meters_height)
entry.grid(row=0, column=3, sticky="ew")
label = tk.Label(frame, text="Meters")
label.grid(row=0, column=4, sticky="w")
def draw_scale(self):
label = tk.Label(self, text="Scale", font=self.section_font)
label.grid(sticky="w")
frame = tk.Frame(self)
frame.grid(sticky="ew")
frame.columnconfigure(1, weight=1)
label = tk.Label(frame, text="100 Pixels =")
label.grid(row=0, column=0, sticky="w")
entry = tk.Entry(frame, textvariable=self.scale)
entry.grid(row=0, column=1, sticky="ew")
label = tk.Label(frame, text="Meters")
label.grid(row=0, column=2, sticky="w")
def draw_reference_point(self):
label = tk.Label(self, text="Reference point", font=self.section_font)
label.grid(sticky="w")
label = tk.Label(
self, text="Default is (0, 0), the upper left corner of the canvas"
)
label.grid(sticky="w")
frame = tk.Frame(self)
frame.grid(sticky="ew", pady=3)
frame.columnconfigure(1, weight=1)
frame.columnconfigure(3, weight=1)
label = tk.Label(frame, text="X")
label.grid(row=0, column=0, sticky="w")
x_var = tk.StringVar(value=0)
entry = tk.Entry(frame, textvariable=x_var)
entry.grid(row=0, column=1, sticky="ew")
label = tk.Label(frame, text="Y")
label.grid(row=0, column=2, sticky="w")
y_var = tk.StringVar(value=0)
entry = tk.Entry(frame, textvariable=y_var)
entry.grid(row=0, column=3, sticky="ew")
label = tk.Label(self, text="Translates To")
label.grid(sticky="w")
frame = tk.Frame(self)
frame.grid(sticky="ew", pady=3)
frame.columnconfigure(1, weight=1)
frame.columnconfigure(3, weight=1)
frame.columnconfigure(5, weight=1)
label = tk.Label(frame, text="Lat")
label.grid(row=0, column=0, sticky="w")
entry = tk.Entry(frame, textvariable=self.lat)
entry.grid(row=0, column=1, sticky="ew")
label = tk.Label(frame, text="Lon")
label.grid(row=0, column=2, sticky="w")
entry = tk.Entry(frame, textvariable=self.lon)
entry.grid(row=0, column=3, sticky="ew")
label = tk.Label(frame, text="Alt")
label.grid(row=0, column=4, sticky="w")
entry = tk.Entry(frame, textvariable=self.alt)
entry.grid(row=0, column=5, sticky="ew")
def draw_save_as_default(self):
button = tk.Checkbutton(
self, text="Save as default?", variable=self.save_default
)
button.grid(sticky="w", pady=3)
def draw_buttons(self):
frame = tk.Frame(self)
frame.columnconfigure(0, weight=1)
frame.columnconfigure(1, weight=1)
frame.grid(sticky="ew")
button = tk.Button(frame, text="Apply", command=self.click_apply)
button.grid(row=0, column=0, pady=5, sticky="ew")
button = tk.Button(frame, text="Cancel", command=self.destroy)
button.grid(row=0, column=1, pady=5, sticky="ew")
def redraw_grid(self):
"""
redraw grid with new dimension
:return: nothing
"""
width, height = self.pixel_width.get(), self.pixel_height.get()
canvas = self.app.canvas
canvas.config(scrollregion=(0, 0, width + 200, height + 200))
# delete old plot and redraw
for i in canvas.find_withtag("gridline"):
canvas.delete(i)
for i in canvas.find_withtag("rectangle"):
canvas.delete(i)
canvas.draw_grid(width=width, height=height)
# lift anything that is drawn on the plot before
for tag in DRAW_OBJECT_TAGS:
for i in canvas.find_withtag(tag):
canvas.lift(i)
def click_apply(self):
meter_per_pixel = float(self.scale.get()) / 100
self.app.canvas.meters_per_pixel = meter_per_pixel
self.redraw_grid()
# if there is a current wallpaper showing, redraw it based on current wallpaper options
wallpaper_tool = self.app.set_wallpaper
current_wallpaper = self.app.current_wallpaper
if current_wallpaper:
if self.app.adjust_to_dim_var.get() == 0:
if self.app.radiovar.get() == ScaleOption.UPPER_LEFT.value:
wallpaper_tool.upper_left(current_wallpaper)
elif self.app.radiovar.get() == ScaleOption.CENTERED.value:
wallpaper_tool.center(current_wallpaper)
elif self.app.radiovar.get() == ScaleOption.SCALED.value:
wallpaper_tool.scaled(current_wallpaper)
elif self.app.radiovar.get() == ScaleOption.TILED.value:
print("not implemented")
elif self.app.adjust_to_dim_var.get() == 1:
wallpaper_tool.canvas_to_image_dimension(current_wallpaper)
wallpaper_tool.show_grid()
self.destroy()

View file

@ -1,277 +0,0 @@
"""
size and scale
"""
import tkinter as tk
from functools import partial
from coretk.dialogs.canvasbackground import ScaleOption
DRAW_OBJECT_TAGS = ["edge", "node", "nodename", "linkinfo", "antenna"]
class SizeAndScale:
def __init__(self, app):
"""
create an instance for size and scale object
:param app: main application
"""
self.app = app
self.top = tk.Toplevel()
self.top.title("Canvas Size and Scale")
self.meter_per_pixel = self.app.canvas.meters_per_pixel
self.size_chart()
self.scale_chart()
self.reference_point_chart()
self.save_as_default()
self.apply_cancel()
def pixel_scrollbar_command(self, size_frame, entry_row, entry_column, event):
"""
change the value shown based on scrollbar action
:param tkinter.Frame frame: pixel dimension frame
:param int entry_row: row number of entry of the frame
:param int entry_column: column number of entry of the frame
:param event: scrollbar event
:return: nothing
"""
pixel_frame = size_frame.grid_slaves(0, 0)[0]
pixel_entry = pixel_frame.grid_slaves(entry_row, entry_column)[0]
val = int(pixel_entry.get())
if event == "-1":
new_val = val + 2
elif event == "1":
new_val = val - 2
pixel_entry.delete(0, tk.END)
pixel_entry.insert(tk.END, str(new_val))
# change meter dimension
meter_frame = size_frame.grid_slaves(1, 0)[0]
meter_entry = meter_frame.grid_slaves(entry_row, entry_column)[0]
meter_entry.delete(0, tk.END)
meter_entry.insert(tk.END, str(new_val * self.meter_per_pixel))
def meter_scrollbar_command(self, size_frame, entry_row, entry_column, event):
"""
change the value shown based on scrollbar action
:param tkinter.Frame size_frame: size frame
:param int entry_row: row number of entry in the frame it is contained in
:param int entry_column: column number of entry in the frame in is contained in
:param event: scroolbar event
:return: nothing
"""
meter_frame = size_frame.grid_slaves(1, 0)[0]
meter_entry = meter_frame.grid_slaves(entry_row, entry_column)[0]
val = float(meter_entry.get())
if event == "-1":
val += 100.0
elif event == "1":
val -= 100.0
meter_entry.delete(0, tk.END)
meter_entry.insert(tk.END, str(val))
# change pixel dimension
pixel_frame = size_frame.grid_slaves(0, 0)[0]
pixel_entry = pixel_frame.grid_slaves(entry_row, entry_column)[0]
pixel_entry.delete(0, tk.END)
pixel_entry.insert(tk.END, str(int(val / self.meter_per_pixel)))
def create_text_label(self, frame, text, row, column, sticky=None):
"""
create text label
:param tkinter.Frame frame: parent frame
:param str text: label text
:param int row: row number
:param int column: column number
:param sticky: sticky value
:return: nothing
"""
text_label = tk.Label(frame, text=text)
text_label.grid(row=row, column=column, sticky=sticky, padx=3, pady=3)
def create_entry(self, frame, default_value, row, column, width):
text_var = tk.StringVar(frame, value=str(default_value))
entry = tk.Entry(
frame, textvariable=text_var, width=width, bg="white", state=tk.NORMAL
)
entry.focus()
entry.grid(row=row, column=column, padx=3, pady=3)
def size_chart(self):
label = tk.Label(self.top, text="Size")
label.grid(sticky=tk.W, padx=5)
canvas = self.app.canvas
plot = canvas.find_withtag("rectangle")
x0, y0, x1, y1 = canvas.bbox(plot[0])
w = abs(x0 - x1) - 2
h = abs(y0 - y1) - 2
f = tk.Frame(
self.top,
highlightbackground="#b3b3b3",
highlightcolor="#b3b3b3",
highlightthickness=0.5,
bd=0,
)
f1 = tk.Frame(f)
pw_scrollbar = tk.Scrollbar(f1, orient=tk.VERTICAL)
pw_scrollbar.grid(row=0, column=1)
self.create_entry(f1, w, 0, 0, 6)
pw_scrollbar.config(command=partial(self.pixel_scrollbar_command, f, 0, 0))
self.create_text_label(f1, " W x ", 0, 2)
scrollbar = tk.Scrollbar(f1, orient=tk.VERTICAL)
scrollbar.grid(row=0, column=4)
self.create_entry(f1, h, 0, 3, 6)
scrollbar.config(command=partial(self.pixel_scrollbar_command, f, 0, 3))
self.create_text_label(f1, " H pixels ", 0, 7)
f1.grid(sticky=tk.W, pady=3)
f2 = tk.Frame(f)
scrollbar = tk.Scrollbar(f2, orient=tk.VERTICAL)
scrollbar.grid(row=0, column=1)
self.create_entry(f2, w * self.meter_per_pixel, 0, 0, 8)
scrollbar.config(command=partial(self.meter_scrollbar_command, f, 0, 0))
self.create_text_label(f2, " x ", 0, 2)
scrollbar = tk.Scrollbar(f2, orient=tk.VERTICAL)
scrollbar.grid(row=0, column=4)
self.create_entry(f2, h * self.meter_per_pixel, 0, 3, 8)
scrollbar.config(command=partial(self.meter_scrollbar_command, f, 0, 3))
self.create_text_label(f2, " meters ", 0, 5)
f2.grid(sticky=tk.W, pady=3)
f.grid(sticky=tk.W + tk.E, padx=5, pady=5, columnspan=2)
def scale_chart(self):
label = tk.Label(self.top, text="Scale")
label.grid(padx=5, sticky=tk.W)
f = tk.Frame(
self.top,
highlightbackground="#b3b3b3",
highlightcolor="#b3b3b3",
highlightthickness=0.5,
bd=0,
)
# self.create_text_label(f, "Scale", 0, 0, tk.W)
# f1 = tk.Frame(f)
self.create_text_label(f, "100 pixels = ", 0, 0)
self.create_entry(f, self.meter_per_pixel * 100, 0, 1, 10)
self.create_text_label(f, "meters", 0, 2)
# f1.grid(sticky=tk.W, pady=3)
f.grid(sticky=tk.W + tk.E, padx=5, pady=5, columnspan=2)
def reference_point_chart(self):
label = tk.Label(self.top, text="Reference point")
label.grid(padx=5, sticky=tk.W)
f = tk.Frame(
self.top,
highlightbackground="#b3b3b3",
highlightcolor="#b3b3b3",
highlightthickness=0.5,
bd=0,
)
self.create_text_label(
f,
"The default reference point is (0, 0), the upper left corner of the canvas.",
1,
0,
tk.W,
)
f1 = tk.Frame(f)
self.create_entry(f1, 0, 0, 0, 4)
self.create_text_label(f1, " X, ", 0, 1)
self.create_entry(f1, 0, 0, 2, 4)
self.create_text_label(f1, "Y = ", 0, 3)
self.create_entry(f1, 47.5791667, 0, 4, 13)
self.create_text_label(f1, " lat, ", 0, 5)
self.create_entry(f1, -122.132322, 0, 6, 13)
self.create_text_label(f1, "long", 0, 7)
f1.grid(row=2, column=0, sticky=tk.W, pady=3)
f2 = tk.Frame(f)
self.create_text_label(f2, "Altitude: ", 0, 0)
self.create_entry(f2, 2.0, 0, 1, 11)
self.create_text_label(f2, " meters ", 0, 2)
f2.grid(row=3, column=0, sticky=tk.W, pady=3)
f.grid(sticky=tk.W, padx=5, pady=5, columnspan=2)
def save_as_default(self):
var = tk.IntVar()
button = tk.Checkbutton(self.top, text="Save as default", variable=var)
button.grid(sticky=tk.W, padx=5, pady=5, columnspan=2)
def redraw_grid(self, pixel_width, pixel_height):
"""
redraw grid with new dimension
:param int pixel_width: width in pixel
:param int pixel_height: height in pixel
:return: nothing
"""
canvas = self.app.canvas
canvas.config(scrollregion=(0, 0, pixel_width + 200, pixel_height + 200))
# delete old plot and redraw
for i in canvas.find_withtag("gridline"):
canvas.delete(i)
for i in canvas.find_withtag("rectangle"):
canvas.delete(i)
canvas.draw_grid(width=pixel_width, height=pixel_height)
# lift anything that is drawn on the plot before
for tag in DRAW_OBJECT_TAGS:
for i in canvas.find_withtag(tag):
canvas.lift(i)
def click_apply(self):
size_frame = self.top.grid_slaves(1, 0)[0]
pixel_size_frame = size_frame.grid_slaves(0, 0)[0]
pixel_width = int(pixel_size_frame.grid_slaves(0, 0)[0].get())
pixel_height = int(pixel_size_frame.grid_slaves(0, 3)[0].get())
scale_frame = self.top.grid_slaves(3, 0)[0]
meter_per_pixel = float(scale_frame.grid_slaves(0, 1)[0].get()) / 100
self.app.canvas.meters_per_pixel = meter_per_pixel
self.redraw_grid(pixel_width, pixel_height)
print(self.app.current_wallpaper)
print(self.app.radiovar)
# if there is a current wallpaper showing, redraw it based on current wallpaper options
wallpaper_tool = self.app.set_wallpaper
current_wallpaper = self.app.current_wallpaper
if current_wallpaper:
if self.app.adjust_to_dim_var.get() == 0:
if self.app.radiovar.get() == ScaleOption.UPPER_LEFT.value:
wallpaper_tool.upper_left(current_wallpaper)
elif self.app.radiovar.get() == ScaleOption.CENTERED.value:
wallpaper_tool.center(current_wallpaper)
elif self.app.radiovar.get() == ScaleOption.SCALED.value:
wallpaper_tool.scaled(current_wallpaper)
elif self.app.radiovar.get() == ScaleOption.TILED.value:
print("not implemented")
elif self.app.adjust_to_dim_var.get() == 1:
wallpaper_tool.canvas_to_image_dimension(current_wallpaper)
wallpaper_tool.show_grid()
self.top.destroy()
def apply_cancel(self):
apply_button = tk.Button(self.top, text="Apply", command=self.click_apply)
apply_button.grid(row=7, column=0, pady=5)
cancel_button = tk.Button(self.top, text="Cancel", command=self.top.destroy)
cancel_button.grid(row=7, column=1, pady=5)

View file

@ -9,10 +9,10 @@ from tkinter import filedialog, messagebox
from core.api.grpc import core_pb2 from core.api.grpc import core_pb2
from coretk.appdirs import XML_PATH from coretk.appdirs import XML_PATH
from coretk.dialogs.canvasbackground import CanvasBackgroundDialog from coretk.dialogs.canvasbackground import CanvasBackgroundDialog
from coretk.dialogs.canvassizeandscale import SizeAndScaleDialog
from coretk.dialogs.hooks import HooksDialog from coretk.dialogs.hooks import HooksDialog
from coretk.dialogs.sessionoptions import SessionOptionsDialog from coretk.dialogs.sessionoptions import SessionOptionsDialog
from coretk.dialogs.sessions import SessionsDialog from coretk.dialogs.sessions import SessionsDialog
from coretk.dialogs.sizeandscale import SizeAndScale
def sub_menu_items(): def sub_menu_items():
@ -155,15 +155,6 @@ def canvas_delete():
logging.debug("Click canvas delete") logging.debug("Click canvas delete")
def canvas_size_scale():
logging.debug("Click canvas size/scale")
SizeAndScale()
def canvas_wallpaper():
logging.debug("CLick canvas wallpaper")
def canvas_previous(): def canvas_previous():
logging.debug("Click canvas previous") logging.debug("Click canvas previous")
@ -383,7 +374,8 @@ class MenuAction:
# self.application.core_editbar.create_toolbar() # self.application.core_editbar.create_toolbar()
def canvas_size_and_scale(self): def canvas_size_and_scale(self):
self.app.size_and_scale = SizeAndScale(self.app) dialog = SizeAndScaleDialog(self.app, self.app)
dialog.show()
def canvas_set_wallpaper(self): def canvas_set_wallpaper(self):
dialog = CanvasBackgroundDialog(self.app, self.app) dialog = CanvasBackgroundDialog(self.app, self.app)