Merge branch 'coretk' into coretk-selectbox
This commit is contained in:
commit
489d28d2fd
27 changed files with 366 additions and 325 deletions
|
@ -14,6 +14,9 @@ from coretk.statusbar import StatusBar
|
|||
from coretk.toolbar import Toolbar
|
||||
from coretk.validation import InputValidation
|
||||
|
||||
WIDTH = 1000
|
||||
HEIGHT = 800
|
||||
|
||||
|
||||
class Application(tk.Frame):
|
||||
def __init__(self, master=None):
|
||||
|
@ -40,8 +43,10 @@ class Application(tk.Frame):
|
|||
def setup_theme(self):
|
||||
themes.load(self.style)
|
||||
self.style.theme_use(self.guiconfig["preferences"]["theme"])
|
||||
func = partial(themes.update_menu, self.style)
|
||||
func = partial(themes.theme_change_menu, self.style)
|
||||
self.master.bind_class("Menu", "<<ThemeChanged>>", func)
|
||||
func = partial(themes.theme_change, self.style)
|
||||
self.master.bind("<<ThemeChanged>>", func)
|
||||
|
||||
def setup_app(self):
|
||||
self.master.title("CORE")
|
||||
|
@ -53,13 +58,11 @@ class Application(tk.Frame):
|
|||
self.validation = InputValidation(self)
|
||||
|
||||
def center(self):
|
||||
width = 1000
|
||||
height = 800
|
||||
screen_width = self.master.winfo_screenwidth()
|
||||
screen_height = self.master.winfo_screenheight()
|
||||
x = int((screen_width / 2) - (width / 2))
|
||||
y = int((screen_height / 2) - (height / 2))
|
||||
self.master.geometry(f"{width}x{height}+{x}+{y}")
|
||||
x = int((screen_width / 2) - (WIDTH / 2))
|
||||
y = int((screen_height / 2) - (HEIGHT / 2))
|
||||
self.master.geometry(f"{WIDTH}x{HEIGHT}+{x}+{y}")
|
||||
|
||||
def draw(self):
|
||||
self.master.option_add("*tearOff", tk.FALSE)
|
||||
|
|
|
@ -75,7 +75,7 @@ def check_directory():
|
|||
editor = EDITORS[1]
|
||||
config = {
|
||||
"preferences": {
|
||||
"theme": themes.DARK,
|
||||
"theme": themes.THEME_DARK,
|
||||
"editor": editor,
|
||||
"terminal": terminal,
|
||||
"gui3d": "/usr/local/bin/std3d.sh",
|
||||
|
|
|
@ -5,8 +5,8 @@ import tkinter as tk
|
|||
from tkinter import font, ttk
|
||||
|
||||
from coretk.dialogs.dialog import Dialog
|
||||
from coretk.themes import FRAME_PAD, PADX, PADY
|
||||
|
||||
PAD = 5
|
||||
PIXEL_SCALE = 100
|
||||
|
||||
|
||||
|
@ -46,20 +46,21 @@ class SizeAndScaleDialog(Dialog):
|
|||
self.draw_scale()
|
||||
self.draw_reference_point()
|
||||
self.draw_save_as_default()
|
||||
self.draw_spacer()
|
||||
self.draw_buttons()
|
||||
|
||||
def draw_size(self):
|
||||
label_frame = ttk.Labelframe(self.top, text="Size", padding=PAD)
|
||||
label_frame = ttk.Labelframe(self.top, text="Size", padding=FRAME_PAD)
|
||||
label_frame.grid(sticky="ew")
|
||||
label_frame.columnconfigure(0, weight=1)
|
||||
|
||||
# draw size row 1
|
||||
frame = ttk.Frame(label_frame)
|
||||
frame.grid(sticky="ew", pady=3)
|
||||
frame.grid(sticky="ew", pady=PADY)
|
||||
frame.columnconfigure(1, weight=1)
|
||||
frame.columnconfigure(3, weight=1)
|
||||
label = ttk.Label(frame, text="Width")
|
||||
label.grid(row=0, column=0, sticky="w", padx=PAD)
|
||||
label.grid(row=0, column=0, sticky="w", padx=PADX)
|
||||
entry = ttk.Entry(
|
||||
frame,
|
||||
textvariable=self.pixel_width,
|
||||
|
@ -67,9 +68,9 @@ class SizeAndScaleDialog(Dialog):
|
|||
validatecommand=(self.validation.positive_int, "%P"),
|
||||
)
|
||||
entry.bind("<FocusOut>", lambda event: self.validation.focus_out(event, "0"))
|
||||
entry.grid(row=0, column=1, sticky="ew", padx=PAD)
|
||||
entry.grid(row=0, column=1, sticky="ew", padx=PADX)
|
||||
label = ttk.Label(frame, text="x Height")
|
||||
label.grid(row=0, column=2, sticky="w", padx=PAD)
|
||||
label.grid(row=0, column=2, sticky="w", padx=PADX)
|
||||
entry = ttk.Entry(
|
||||
frame,
|
||||
textvariable=self.pixel_height,
|
||||
|
@ -77,17 +78,17 @@ class SizeAndScaleDialog(Dialog):
|
|||
validatecommand=(self.validation.positive_int, "%P"),
|
||||
)
|
||||
entry.bind("<FocusOut>", lambda event: self.validation.focus_out(event, "0"))
|
||||
entry.grid(row=0, column=3, sticky="ew", padx=PAD)
|
||||
entry.grid(row=0, column=3, sticky="ew", padx=PADX)
|
||||
label = ttk.Label(frame, text="Pixels")
|
||||
label.grid(row=0, column=4, sticky="w")
|
||||
|
||||
# draw size row 2
|
||||
frame = ttk.Frame(label_frame)
|
||||
frame.grid(sticky="ew", pady=3)
|
||||
frame.grid(sticky="ew", pady=PADY)
|
||||
frame.columnconfigure(1, weight=1)
|
||||
frame.columnconfigure(3, weight=1)
|
||||
label = ttk.Label(frame, text="Width")
|
||||
label.grid(row=0, column=0, sticky="w", padx=PAD)
|
||||
label.grid(row=0, column=0, sticky="w", padx=PADX)
|
||||
entry = ttk.Entry(
|
||||
frame,
|
||||
textvariable=self.meters_width,
|
||||
|
@ -95,9 +96,9 @@ class SizeAndScaleDialog(Dialog):
|
|||
validatecommand=(self.validation.positive_float, "%P"),
|
||||
)
|
||||
entry.bind("<FocusOut>", lambda event: self.validation.focus_out(event, "0"))
|
||||
entry.grid(row=0, column=1, sticky="ew", padx=PAD)
|
||||
entry.grid(row=0, column=1, sticky="ew", padx=PADX)
|
||||
label = ttk.Label(frame, text="x Height")
|
||||
label.grid(row=0, column=2, sticky="w", padx=PAD)
|
||||
label.grid(row=0, column=2, sticky="w", padx=PADX)
|
||||
entry = ttk.Entry(
|
||||
frame,
|
||||
textvariable=self.meters_height,
|
||||
|
@ -105,12 +106,12 @@ class SizeAndScaleDialog(Dialog):
|
|||
validatecommand=(self.validation.positive_float, "%P"),
|
||||
)
|
||||
entry.bind("<FocusOut>", lambda event: self.validation.focus_out(event, "0"))
|
||||
entry.grid(row=0, column=3, sticky="ew", padx=PAD)
|
||||
entry.grid(row=0, column=3, sticky="ew", padx=PADX)
|
||||
label = ttk.Label(frame, text="Meters")
|
||||
label.grid(row=0, column=4, sticky="w")
|
||||
|
||||
def draw_scale(self):
|
||||
label_frame = ttk.Labelframe(self.top, text="Scale", padding=PAD)
|
||||
label_frame = ttk.Labelframe(self.top, text="Scale", padding=FRAME_PAD)
|
||||
label_frame.grid(sticky="ew")
|
||||
label_frame.columnconfigure(0, weight=1)
|
||||
|
||||
|
@ -118,7 +119,7 @@ class SizeAndScaleDialog(Dialog):
|
|||
frame.grid(sticky="ew")
|
||||
frame.columnconfigure(1, weight=1)
|
||||
label = ttk.Label(frame, text=f"{PIXEL_SCALE} Pixels =")
|
||||
label.grid(row=0, column=0, sticky="w", padx=PAD)
|
||||
label.grid(row=0, column=0, sticky="w", padx=PADX)
|
||||
entry = ttk.Entry(
|
||||
frame,
|
||||
textvariable=self.scale,
|
||||
|
@ -126,12 +127,14 @@ class SizeAndScaleDialog(Dialog):
|
|||
validatecommand=(self.validation.positive_float, "%P"),
|
||||
)
|
||||
entry.bind("<FocusOut>", lambda event: self.validation.focus_out(event, "0"))
|
||||
entry.grid(row=0, column=1, sticky="ew", padx=PAD)
|
||||
entry.grid(row=0, column=1, sticky="ew", padx=PADX)
|
||||
label = ttk.Label(frame, text="Meters")
|
||||
label.grid(row=0, column=2, sticky="w")
|
||||
|
||||
def draw_reference_point(self):
|
||||
label_frame = ttk.Labelframe(self.top, text="Reference Point", padding=PAD)
|
||||
label_frame = ttk.Labelframe(
|
||||
self.top, text="Reference Point", padding=FRAME_PAD
|
||||
)
|
||||
label_frame.grid(sticky="ew")
|
||||
label_frame.columnconfigure(0, weight=1)
|
||||
|
||||
|
@ -141,12 +144,12 @@ class SizeAndScaleDialog(Dialog):
|
|||
label.grid()
|
||||
|
||||
frame = ttk.Frame(label_frame)
|
||||
frame.grid(sticky="ew", pady=3)
|
||||
frame.grid(sticky="ew", pady=PADY)
|
||||
frame.columnconfigure(1, weight=1)
|
||||
frame.columnconfigure(3, weight=1)
|
||||
|
||||
label = ttk.Label(frame, text="X")
|
||||
label.grid(row=0, column=0, sticky="w", padx=PAD)
|
||||
label.grid(row=0, column=0, sticky="w", padx=PADX)
|
||||
entry = ttk.Entry(
|
||||
frame,
|
||||
textvariable=self.x,
|
||||
|
@ -154,10 +157,10 @@ class SizeAndScaleDialog(Dialog):
|
|||
validatecommand=(self.validation.positive_float, "%P"),
|
||||
)
|
||||
entry.bind("<FocusOut>", lambda event: self.validation.focus_out(event, "0"))
|
||||
entry.grid(row=0, column=1, sticky="ew", padx=PAD)
|
||||
entry.grid(row=0, column=1, sticky="ew", padx=PADX)
|
||||
|
||||
label = ttk.Label(frame, text="Y")
|
||||
label.grid(row=0, column=2, sticky="w", padx=PAD)
|
||||
label.grid(row=0, column=2, sticky="w", padx=PADX)
|
||||
entry = ttk.Entry(
|
||||
frame,
|
||||
textvariable=self.y,
|
||||
|
@ -165,19 +168,19 @@ class SizeAndScaleDialog(Dialog):
|
|||
validatecommand=(self.validation.positive_float, "%P"),
|
||||
)
|
||||
entry.bind("<FocusOut>", lambda event: self.validation.focus_out(event, "0"))
|
||||
entry.grid(row=0, column=3, sticky="ew", padx=PAD)
|
||||
entry.grid(row=0, column=3, sticky="ew", padx=PADX)
|
||||
|
||||
label = ttk.Label(label_frame, text="Translates To")
|
||||
label.grid()
|
||||
|
||||
frame = ttk.Frame(label_frame)
|
||||
frame.grid(sticky="ew", pady=3)
|
||||
frame.grid(sticky="ew", pady=PADY)
|
||||
frame.columnconfigure(1, weight=1)
|
||||
frame.columnconfigure(3, weight=1)
|
||||
frame.columnconfigure(5, weight=1)
|
||||
|
||||
label = ttk.Label(frame, text="Lat")
|
||||
label.grid(row=0, column=0, sticky="w", padx=PAD)
|
||||
label.grid(row=0, column=0, sticky="w", padx=PADX)
|
||||
entry = ttk.Entry(
|
||||
frame,
|
||||
textvariable=self.lat,
|
||||
|
@ -185,10 +188,10 @@ class SizeAndScaleDialog(Dialog):
|
|||
validatecommand=(self.validation.positive_float, "%P"),
|
||||
)
|
||||
entry.bind("<FocusOut>", lambda event: self.validation.focus_out(event, "0"))
|
||||
entry.grid(row=0, column=1, sticky="ew", padx=PAD)
|
||||
entry.grid(row=0, column=1, sticky="ew", padx=PADX)
|
||||
|
||||
label = ttk.Label(frame, text="Lon")
|
||||
label.grid(row=0, column=2, sticky="w", padx=PAD)
|
||||
label.grid(row=0, column=2, sticky="w", padx=PADX)
|
||||
entry = ttk.Entry(
|
||||
frame,
|
||||
textvariable=self.lon,
|
||||
|
@ -196,10 +199,10 @@ class SizeAndScaleDialog(Dialog):
|
|||
validatecommand=(self.validation.positive_float, "%P"),
|
||||
)
|
||||
entry.bind("<FocusOut>", lambda event: self.validation.focus_out(event, "0"))
|
||||
entry.grid(row=0, column=3, sticky="ew", padx=PAD)
|
||||
entry.grid(row=0, column=3, sticky="ew", padx=PADX)
|
||||
|
||||
label = ttk.Label(frame, text="Alt")
|
||||
label.grid(row=0, column=4, sticky="w", padx=PAD)
|
||||
label.grid(row=0, column=4, sticky="w", padx=PADX)
|
||||
entry = ttk.Entry(
|
||||
frame,
|
||||
textvariable=self.alt,
|
||||
|
@ -213,7 +216,7 @@ class SizeAndScaleDialog(Dialog):
|
|||
button = ttk.Checkbutton(
|
||||
self.top, text="Save as default?", variable=self.save_default
|
||||
)
|
||||
button.grid(sticky="w", pady=3)
|
||||
button.grid(sticky="w", pady=PADY)
|
||||
|
||||
def draw_buttons(self):
|
||||
frame = ttk.Frame(self.top)
|
||||
|
@ -222,7 +225,7 @@ class SizeAndScaleDialog(Dialog):
|
|||
frame.grid(sticky="ew")
|
||||
|
||||
button = ttk.Button(frame, text="Apply", command=self.click_apply)
|
||||
button.grid(row=0, column=0, sticky="ew", padx=PAD)
|
||||
button.grid(row=0, column=0, sticky="ew", padx=PADX)
|
||||
|
||||
button = ttk.Button(frame, text="Cancel", command=self.destroy)
|
||||
button.grid(row=0, column=1, sticky="ew")
|
||||
|
|
|
@ -8,8 +8,7 @@ from tkinter import filedialog, ttk
|
|||
from coretk.appconfig import BACKGROUNDS_PATH
|
||||
from coretk.dialogs.dialog import Dialog
|
||||
from coretk.images import Images
|
||||
|
||||
PADX = 5
|
||||
from coretk.themes import PADX, PADY
|
||||
|
||||
|
||||
class CanvasBackgroundDialog(Dialog):
|
||||
|
@ -36,17 +35,18 @@ class CanvasBackgroundDialog(Dialog):
|
|||
self.draw_image_selection()
|
||||
self.draw_options()
|
||||
self.draw_additional_options()
|
||||
self.draw_spacer()
|
||||
self.draw_buttons()
|
||||
|
||||
def draw_image(self):
|
||||
self.image_label = ttk.Label(
|
||||
self.top, text="(image preview)", width=32, anchor=tk.CENTER
|
||||
)
|
||||
self.image_label.grid(row=0, column=0, pady=5)
|
||||
self.image_label.grid(pady=PADY)
|
||||
|
||||
def draw_image_label(self):
|
||||
label = ttk.Label(self.top, text="Image filename: ")
|
||||
label.grid(row=1, column=0, sticky="ew")
|
||||
label.grid(sticky="ew")
|
||||
if self.filename.get():
|
||||
self.draw_preview()
|
||||
|
||||
|
@ -55,7 +55,7 @@ class CanvasBackgroundDialog(Dialog):
|
|||
frame.columnconfigure(0, weight=2)
|
||||
frame.columnconfigure(1, weight=1)
|
||||
frame.columnconfigure(2, weight=1)
|
||||
frame.grid(row=2, column=0, sticky="ew")
|
||||
frame.grid(sticky="ew")
|
||||
|
||||
entry = ttk.Entry(frame, textvariable=self.filename)
|
||||
entry.focus()
|
||||
|
@ -73,7 +73,7 @@ class CanvasBackgroundDialog(Dialog):
|
|||
frame.columnconfigure(1, weight=1)
|
||||
frame.columnconfigure(2, weight=1)
|
||||
frame.columnconfigure(3, weight=1)
|
||||
frame.grid(row=3, column=0, sticky="ew")
|
||||
frame.grid(sticky="ew")
|
||||
|
||||
button = ttk.Radiobutton(
|
||||
frame, text="upper-left", value=1, variable=self.scale_option
|
||||
|
@ -103,7 +103,7 @@ class CanvasBackgroundDialog(Dialog):
|
|||
checkbutton = ttk.Checkbutton(
|
||||
self.top, text="Show grid", variable=self.show_grid
|
||||
)
|
||||
checkbutton.grid(row=4, column=0, sticky="ew", padx=PADX)
|
||||
checkbutton.grid(sticky="ew", padx=PADX)
|
||||
|
||||
checkbutton = ttk.Checkbutton(
|
||||
self.top,
|
||||
|
@ -111,11 +111,11 @@ class CanvasBackgroundDialog(Dialog):
|
|||
variable=self.adjust_to_dim,
|
||||
command=self.click_adjust_canvas,
|
||||
)
|
||||
checkbutton.grid(row=5, column=0, sticky="ew", padx=PADX)
|
||||
checkbutton.grid(sticky="ew", padx=PADX)
|
||||
|
||||
def draw_buttons(self):
|
||||
frame = ttk.Frame(self.top)
|
||||
frame.grid(row=6, column=0, pady=5, sticky="ew")
|
||||
frame.grid(pady=PADY, sticky="ew")
|
||||
frame.columnconfigure(0, weight=1)
|
||||
frame.columnconfigure(1, weight=1)
|
||||
|
|
@ -6,6 +6,7 @@ from tkinter import ttk
|
|||
from coretk.dialogs.dialog import Dialog
|
||||
from coretk.dialogs.icondialog import IconDialog
|
||||
from coretk.nodeutils import NodeDraw
|
||||
from coretk.themes import FRAME_PAD, PADX, PADY
|
||||
from coretk.widgets import CheckboxList, ListboxScroll
|
||||
|
||||
|
||||
|
@ -23,11 +24,11 @@ class ServicesSelectDialog(Dialog):
|
|||
self.top.rowconfigure(0, weight=1)
|
||||
|
||||
frame = ttk.Frame(self.top)
|
||||
frame.grid(stick="nsew")
|
||||
frame.grid(stick="nsew", pady=PADY)
|
||||
frame.rowconfigure(0, weight=1)
|
||||
for i in range(3):
|
||||
frame.columnconfigure(i, weight=1)
|
||||
self.groups = ListboxScroll(frame, text="Groups")
|
||||
self.groups = ListboxScroll(frame, text="Groups", padding=FRAME_PAD)
|
||||
self.groups.grid(row=0, column=0, sticky="nsew")
|
||||
for group in sorted(self.app.core.services):
|
||||
self.groups.listbox.insert(tk.END, group)
|
||||
|
@ -35,11 +36,15 @@ class ServicesSelectDialog(Dialog):
|
|||
self.groups.listbox.selection_set(0)
|
||||
|
||||
self.services = CheckboxList(
|
||||
frame, self.app, text="Services", clicked=self.service_clicked
|
||||
frame,
|
||||
self.app,
|
||||
text="Services",
|
||||
clicked=self.service_clicked,
|
||||
padding=FRAME_PAD,
|
||||
)
|
||||
self.services.grid(row=0, column=1, sticky="nsew")
|
||||
|
||||
self.current = ListboxScroll(frame, text="Selected")
|
||||
self.current = ListboxScroll(frame, text="Selected", padding=FRAME_PAD)
|
||||
self.current.grid(row=0, column=2, sticky="nsew")
|
||||
for service in sorted(self.current_services):
|
||||
self.current.listbox.insert(tk.END, service)
|
||||
|
@ -49,7 +54,7 @@ class ServicesSelectDialog(Dialog):
|
|||
for i in range(2):
|
||||
frame.columnconfigure(i, weight=1)
|
||||
button = ttk.Button(frame, text="Save", command=self.destroy)
|
||||
button.grid(row=0, column=0, sticky="ew")
|
||||
button.grid(row=0, column=0, sticky="ew", padx=PADX)
|
||||
button = ttk.Button(frame, text="Cancel", command=self.click_cancel)
|
||||
button.grid(row=0, column=1, sticky="ew")
|
||||
|
||||
|
@ -104,12 +109,12 @@ class CustomNodesDialog(Dialog):
|
|||
|
||||
def draw_node_config(self):
|
||||
frame = ttk.Frame(self.top)
|
||||
frame.grid(sticky="nsew")
|
||||
frame.grid(sticky="nsew", pady=PADY)
|
||||
frame.columnconfigure(0, weight=1)
|
||||
frame.rowconfigure(0, weight=1)
|
||||
|
||||
self.nodes_list = ListboxScroll(frame, text="Nodes")
|
||||
self.nodes_list.grid(row=0, column=0, sticky="nsew")
|
||||
self.nodes_list = ListboxScroll(frame, text="Nodes", padding=FRAME_PAD)
|
||||
self.nodes_list.grid(row=0, column=0, sticky="nsew", padx=PADX)
|
||||
self.nodes_list.listbox.bind("<<ListboxSelect>>", self.handle_node_select)
|
||||
for name in sorted(self.app.core.custom_nodes):
|
||||
self.nodes_list.listbox.insert(tk.END, name)
|
||||
|
@ -128,17 +133,17 @@ class CustomNodesDialog(Dialog):
|
|||
|
||||
def draw_node_buttons(self):
|
||||
frame = ttk.Frame(self.top)
|
||||
frame.grid(pady=2, sticky="ew")
|
||||
frame.grid(sticky="ew", pady=PADY)
|
||||
for i in range(3):
|
||||
frame.columnconfigure(i, weight=1)
|
||||
|
||||
button = ttk.Button(frame, text="Create", command=self.click_create)
|
||||
button.grid(row=0, column=0, sticky="ew")
|
||||
button.grid(row=0, column=0, sticky="ew", padx=PADX)
|
||||
|
||||
self.edit_button = ttk.Button(
|
||||
frame, text="Edit", state=tk.DISABLED, command=self.click_edit
|
||||
)
|
||||
self.edit_button.grid(row=0, column=1, sticky="ew")
|
||||
self.edit_button.grid(row=0, column=1, sticky="ew", padx=PADX)
|
||||
|
||||
self.delete_button = ttk.Button(
|
||||
frame, text="Delete", state=tk.DISABLED, command=self.click_delete
|
||||
|
@ -152,7 +157,7 @@ class CustomNodesDialog(Dialog):
|
|||
frame.columnconfigure(i, weight=1)
|
||||
|
||||
button = ttk.Button(frame, text="Save", command=self.click_save)
|
||||
button.grid(row=0, column=0, sticky="ew")
|
||||
button.grid(row=0, column=0, sticky="ew", padx=PADX)
|
||||
|
||||
button = ttk.Button(frame, text="Cancel", command=self.destroy)
|
||||
button.grid(row=0, column=1, sticky="ew")
|
||||
|
|
|
@ -2,14 +2,12 @@ import tkinter as tk
|
|||
from tkinter import ttk
|
||||
|
||||
from coretk.images import ImageEnum, Images
|
||||
|
||||
DIALOG_PAD = 5
|
||||
from coretk.themes import DIALOG_PAD
|
||||
|
||||
|
||||
class Dialog(tk.Toplevel):
|
||||
def __init__(self, master, app, title, modal=False):
|
||||
super().__init__(master)
|
||||
self.geometry("800x600")
|
||||
self.withdraw()
|
||||
self.app = app
|
||||
self.modal = modal
|
||||
|
@ -31,3 +29,9 @@ class Dialog(tk.Toplevel):
|
|||
self.wait_visibility()
|
||||
self.grab_set()
|
||||
self.wait_window()
|
||||
|
||||
def draw_spacer(self, row=None):
|
||||
frame = ttk.Frame(self.top)
|
||||
frame.grid(row=row, sticky="nsew")
|
||||
frame.rowconfigure(0, weight=1)
|
||||
self.top.rowconfigure(frame.grid_info()["row"], weight=1)
|
||||
|
|
|
@ -11,10 +11,9 @@ import grpc
|
|||
from coretk.dialogs.dialog import Dialog
|
||||
from coretk.errors import show_grpc_error
|
||||
from coretk.images import ImageEnum, Images
|
||||
from coretk.themes import PADX, PADY
|
||||
from coretk.widgets import ConfigFrame
|
||||
|
||||
PAD = 5
|
||||
|
||||
|
||||
class GlobalEmaneDialog(Dialog):
|
||||
def __init__(self, master, app):
|
||||
|
@ -25,11 +24,10 @@ class GlobalEmaneDialog(Dialog):
|
|||
def draw(self):
|
||||
self.top.columnconfigure(0, weight=1)
|
||||
self.top.rowconfigure(0, weight=1)
|
||||
self.config_frame = ConfigFrame(
|
||||
self.top, self.app, self.app.core.emane_config, borderwidth=0
|
||||
)
|
||||
self.config_frame = ConfigFrame(self.top, self.app, self.app.core.emane_config)
|
||||
self.config_frame.draw_config()
|
||||
self.config_frame.grid(sticky="nsew", pady=PAD)
|
||||
self.config_frame.grid(sticky="nsew", pady=PADY)
|
||||
self.draw_spacer()
|
||||
self.draw_buttons()
|
||||
|
||||
def draw_buttons(self):
|
||||
|
@ -38,7 +36,7 @@ class GlobalEmaneDialog(Dialog):
|
|||
for i in range(2):
|
||||
frame.columnconfigure(i, weight=1)
|
||||
button = ttk.Button(frame, text="Apply", command=self.click_apply)
|
||||
button.grid(row=0, column=0, sticky="ew", padx=PAD)
|
||||
button.grid(row=0, column=0, sticky="ew", padx=PADX)
|
||||
|
||||
button = ttk.Button(frame, text="Cancel", command=self.destroy)
|
||||
button.grid(row=0, column=1, sticky="ew")
|
||||
|
@ -67,9 +65,10 @@ class EmaneModelDialog(Dialog):
|
|||
def draw(self):
|
||||
self.top.columnconfigure(0, weight=1)
|
||||
self.top.rowconfigure(0, weight=1)
|
||||
self.config_frame = ConfigFrame(self.top, self.app, self.config, borderwidth=0)
|
||||
self.config_frame = ConfigFrame(self.top, self.app, self.config)
|
||||
self.config_frame.draw_config()
|
||||
self.config_frame.grid(sticky="nsew", pady=PAD)
|
||||
self.config_frame.grid(sticky="nsew", pady=PADY)
|
||||
self.draw_spacer()
|
||||
self.draw_buttons()
|
||||
|
||||
def draw_buttons(self):
|
||||
|
@ -78,7 +77,7 @@ class EmaneModelDialog(Dialog):
|
|||
for i in range(2):
|
||||
frame.columnconfigure(i, weight=1)
|
||||
button = ttk.Button(frame, text="Apply", command=self.click_apply)
|
||||
button.grid(row=0, column=0, sticky="ew", padx=PAD)
|
||||
button.grid(row=0, column=0, sticky="ew", padx=PADX)
|
||||
|
||||
button = ttk.Button(frame, text="Cancel", command=self.destroy)
|
||||
button.grid(row=0, column=1, sticky="ew")
|
||||
|
@ -111,6 +110,7 @@ class EmaneConfigDialog(Dialog):
|
|||
self.draw_emane_configuration()
|
||||
self.draw_emane_models()
|
||||
self.draw_emane_buttons()
|
||||
self.draw_spacer()
|
||||
self.draw_apply_and_cancel()
|
||||
|
||||
def draw_emane_configuration(self):
|
||||
|
@ -123,8 +123,9 @@ class EmaneConfigDialog(Dialog):
|
|||
self.top,
|
||||
text="The EMANE emulation system provides more complex wireless radio emulation "
|
||||
"\nusing pluggable MAC and PHY modules. Refer to the wiki for configuration option details",
|
||||
justify=tk.CENTER,
|
||||
)
|
||||
label.grid(sticky="ew", pady=PAD)
|
||||
label.grid(pady=PADY)
|
||||
|
||||
image = Images.get(ImageEnum.EDITNODE, 16)
|
||||
button = ttk.Button(
|
||||
|
@ -137,7 +138,7 @@ class EmaneConfigDialog(Dialog):
|
|||
),
|
||||
)
|
||||
button.image = image
|
||||
button.grid(sticky="ew", pady=PAD)
|
||||
button.grid(sticky="ew", pady=PADY)
|
||||
|
||||
def draw_emane_models(self):
|
||||
"""
|
||||
|
@ -146,7 +147,7 @@ class EmaneConfigDialog(Dialog):
|
|||
:return: nothing
|
||||
"""
|
||||
frame = ttk.Frame(self.top)
|
||||
frame.grid(sticky="ew", pady=PAD)
|
||||
frame.grid(sticky="ew", pady=PADY)
|
||||
frame.columnconfigure(1, weight=1)
|
||||
|
||||
label = ttk.Label(frame, text="Model")
|
||||
|
@ -164,7 +165,7 @@ class EmaneConfigDialog(Dialog):
|
|||
|
||||
def draw_emane_buttons(self):
|
||||
frame = ttk.Frame(self.top)
|
||||
frame.grid(sticky="ew", pady=PAD)
|
||||
frame.grid(sticky="ew", pady=PADY)
|
||||
for i in range(2):
|
||||
frame.columnconfigure(i, weight=1)
|
||||
|
||||
|
@ -177,7 +178,7 @@ class EmaneConfigDialog(Dialog):
|
|||
command=self.click_model_config,
|
||||
)
|
||||
self.emane_model_button.image = image
|
||||
self.emane_model_button.grid(row=0, column=0, padx=PAD, sticky="ew")
|
||||
self.emane_model_button.grid(row=0, column=0, padx=PADX, sticky="ew")
|
||||
|
||||
image = Images.get(ImageEnum.EDITNODE, 16)
|
||||
button = ttk.Button(
|
||||
|
@ -197,7 +198,7 @@ class EmaneConfigDialog(Dialog):
|
|||
frame.columnconfigure(i, weight=1)
|
||||
|
||||
button = ttk.Button(frame, text="Apply", command=self.click_apply)
|
||||
button.grid(row=0, column=0, padx=PAD, sticky="ew")
|
||||
button.grid(row=0, column=0, padx=PADX, sticky="ew")
|
||||
|
||||
button = ttk.Button(frame, text="Cancel", command=self.destroy)
|
||||
button.grid(row=0, column=1, sticky="ew")
|
||||
|
|
|
@ -3,6 +3,7 @@ from tkinter import ttk
|
|||
|
||||
from core.api.grpc import core_pb2
|
||||
from coretk.dialogs.dialog import Dialog
|
||||
from coretk.themes import PADX, PADY
|
||||
from coretk.widgets import CodeText
|
||||
|
||||
|
||||
|
@ -21,14 +22,14 @@ class HookDialog(Dialog):
|
|||
|
||||
# name and states
|
||||
frame = ttk.Frame(self.top)
|
||||
frame.grid(row=0, sticky="ew", pady=2)
|
||||
frame.grid(sticky="ew", pady=PADY)
|
||||
frame.columnconfigure(0, weight=2)
|
||||
frame.columnconfigure(1, weight=7)
|
||||
frame.columnconfigure(2, weight=1)
|
||||
label = ttk.Label(frame, text="Name")
|
||||
label.grid(row=0, column=0, sticky="ew")
|
||||
label.grid(row=0, column=0, sticky="ew", padx=PADX)
|
||||
entry = ttk.Entry(frame, textvariable=self.name)
|
||||
entry.grid(row=0, column=1, sticky="ew")
|
||||
entry.grid(row=0, column=1, sticky="ew", padx=PADX)
|
||||
values = tuple(x for x in core_pb2.SessionState.Enum.keys() if x != "NONE")
|
||||
initial_state = core_pb2.SessionState.Enum.Name(core_pb2.SessionState.RUNTIME)
|
||||
self.state.set(initial_state)
|
||||
|
@ -40,11 +41,7 @@ class HookDialog(Dialog):
|
|||
combobox.bind("<<ComboboxSelected>>", self.state_change)
|
||||
|
||||
# data
|
||||
frame = ttk.Frame(self.top)
|
||||
frame.columnconfigure(0, weight=1)
|
||||
frame.rowconfigure(0, weight=1)
|
||||
frame.grid(row=1, sticky="nsew", pady=2)
|
||||
self.data = CodeText(frame)
|
||||
self.data = CodeText(self.top)
|
||||
self.data.insert(
|
||||
1.0,
|
||||
(
|
||||
|
@ -53,19 +50,15 @@ class HookDialog(Dialog):
|
|||
"# specified state\n"
|
||||
),
|
||||
)
|
||||
self.data.grid(row=0, column=0, sticky="nsew")
|
||||
scrollbar = ttk.Scrollbar(frame)
|
||||
scrollbar.grid(row=0, column=1, sticky="ns")
|
||||
self.data.config(yscrollcommand=scrollbar.set)
|
||||
scrollbar.config(command=self.data.yview)
|
||||
self.data.grid(sticky="nsew")
|
||||
|
||||
# button row
|
||||
frame = ttk.Frame(self.top)
|
||||
frame.grid(row=2, sticky="ew", pady=2)
|
||||
frame.grid(sticky="ew")
|
||||
for i in range(2):
|
||||
frame.columnconfigure(i, weight=1)
|
||||
button = ttk.Button(frame, text="Save", command=lambda: self.save())
|
||||
button.grid(row=0, column=0, sticky="ew")
|
||||
button.grid(row=0, column=0, sticky="ew", padx=PADX)
|
||||
button = ttk.Button(frame, text="Cancel", command=lambda: self.destroy())
|
||||
button.grid(row=0, column=1, sticky="ew")
|
||||
|
||||
|
@ -104,25 +97,25 @@ class HooksDialog(Dialog):
|
|||
self.top.rowconfigure(0, weight=1)
|
||||
|
||||
self.listbox = tk.Listbox(self.top)
|
||||
self.listbox.grid(row=0, sticky="nsew")
|
||||
self.listbox.grid(sticky="nsew", pady=PADY)
|
||||
self.listbox.bind("<<ListboxSelect>>", self.select)
|
||||
for hook_file in self.app.core.hooks:
|
||||
self.listbox.insert(tk.END, hook_file)
|
||||
|
||||
frame = ttk.Frame(self.top)
|
||||
frame.grid(row=1, sticky="ew")
|
||||
frame.grid(sticky="ew")
|
||||
for i in range(4):
|
||||
frame.columnconfigure(i, weight=1)
|
||||
button = ttk.Button(frame, text="Create", command=self.click_create)
|
||||
button.grid(row=0, column=0, sticky="ew")
|
||||
button.grid(row=0, column=0, sticky="ew", padx=PADX)
|
||||
self.edit_button = ttk.Button(
|
||||
frame, text="Edit", state=tk.DISABLED, command=self.click_edit
|
||||
)
|
||||
self.edit_button.grid(row=0, column=1, sticky="ew")
|
||||
self.edit_button.grid(row=0, column=1, sticky="ew", padx=PADX)
|
||||
self.delete_button = ttk.Button(
|
||||
frame, text="Delete", state=tk.DISABLED, command=self.click_delete
|
||||
)
|
||||
self.delete_button.grid(row=0, column=2, sticky="ew")
|
||||
self.delete_button.grid(row=0, column=2, sticky="ew", padx=PADX)
|
||||
button = ttk.Button(frame, text="Cancel", command=lambda: self.destroy())
|
||||
button.grid(row=0, column=3, sticky="ew")
|
||||
|
||||
|
|
|
@ -5,6 +5,7 @@ from coretk import nodeutils
|
|||
from coretk.appconfig import ICONS_PATH
|
||||
from coretk.dialogs.dialog import Dialog
|
||||
from coretk.images import Images
|
||||
from coretk.themes import PADX, PADY
|
||||
|
||||
|
||||
class IconDialog(Dialog):
|
||||
|
@ -20,27 +21,30 @@ class IconDialog(Dialog):
|
|||
|
||||
# row one
|
||||
frame = ttk.Frame(self.top)
|
||||
frame.grid(row=0, column=0, pady=2, sticky="ew")
|
||||
frame.grid(pady=PADY, sticky="ew")
|
||||
frame.columnconfigure(0, weight=1)
|
||||
frame.columnconfigure(1, weight=3)
|
||||
label = ttk.Label(frame, text="Image")
|
||||
label.grid(row=0, column=0, sticky="ew")
|
||||
label.grid(row=0, column=0, sticky="ew", padx=PADX)
|
||||
entry = ttk.Entry(frame, textvariable=self.file_path)
|
||||
entry.grid(row=0, column=1, sticky="ew")
|
||||
entry.grid(row=0, column=1, sticky="ew", padx=PADX)
|
||||
button = ttk.Button(frame, text="...", command=self.click_file)
|
||||
button.grid(row=0, column=2)
|
||||
|
||||
# row two
|
||||
self.image_label = ttk.Label(self.top, image=self.image, anchor=tk.CENTER)
|
||||
self.image_label.grid(row=1, column=0, pady=2, sticky="ew")
|
||||
self.image_label.grid(pady=PADY, sticky="ew")
|
||||
|
||||
# spacer
|
||||
self.draw_spacer()
|
||||
|
||||
# row three
|
||||
frame = ttk.Frame(self.top)
|
||||
frame.grid(row=2, column=0, sticky="ew")
|
||||
frame.grid(sticky="ew")
|
||||
frame.columnconfigure(0, weight=1)
|
||||
frame.columnconfigure(1, weight=1)
|
||||
button = ttk.Button(frame, text="Apply", command=self.destroy)
|
||||
button.grid(row=0, column=0, sticky="ew")
|
||||
button.grid(row=0, column=0, sticky="ew", padx=PADX)
|
||||
|
||||
button = ttk.Button(frame, text="Cancel", command=self.click_cancel)
|
||||
button.grid(row=0, column=1, sticky="ew")
|
||||
|
|
|
@ -7,10 +7,9 @@ import grpc
|
|||
|
||||
from coretk.dialogs.dialog import Dialog
|
||||
from coretk.errors import show_grpc_error
|
||||
from coretk.themes import PADX, PADY
|
||||
from coretk.widgets import ConfigFrame
|
||||
|
||||
PAD = 5
|
||||
|
||||
|
||||
class MobilityConfigDialog(Dialog):
|
||||
def __init__(self, master, app, canvas_node):
|
||||
|
@ -32,9 +31,10 @@ class MobilityConfigDialog(Dialog):
|
|||
|
||||
def draw(self):
|
||||
self.top.columnconfigure(0, weight=1)
|
||||
self.config_frame = ConfigFrame(self.top, self.app, self.config, borderwidth=0)
|
||||
self.top.rowconfigure(0, weight=1)
|
||||
self.config_frame = ConfigFrame(self.top, self.app, self.config)
|
||||
self.config_frame.draw_config()
|
||||
self.config_frame.grid(sticky="nsew", pady=PAD)
|
||||
self.config_frame.grid(sticky="nsew", pady=PADY)
|
||||
self.draw_apply_buttons()
|
||||
|
||||
def draw_apply_buttons(self):
|
||||
|
@ -44,7 +44,7 @@ class MobilityConfigDialog(Dialog):
|
|||
frame.columnconfigure(i, weight=1)
|
||||
|
||||
button = ttk.Button(frame, text="Apply", command=self.click_apply)
|
||||
button.grid(row=0, column=0, padx=PAD, sticky="ew")
|
||||
button.grid(row=0, column=0, padx=PADX, sticky="ew")
|
||||
|
||||
button = ttk.Button(frame, text="Cancel", command=self.destroy)
|
||||
button.grid(row=0, column=1, sticky="ew")
|
||||
|
|
|
@ -7,8 +7,8 @@ from core.api.grpc.core_pb2 import MobilityAction
|
|||
from coretk.dialogs.dialog import Dialog
|
||||
from coretk.errors import show_grpc_error
|
||||
from coretk.images import ImageEnum, Images
|
||||
from coretk.themes import PADX, PADY
|
||||
|
||||
PAD = 5
|
||||
ICON_SIZE = 16
|
||||
|
||||
|
||||
|
@ -61,6 +61,7 @@ class MobilityPlayerDialog(Dialog):
|
|||
super().__init__(
|
||||
master, app, f"{canvas_node.core_node.name} Mobility Player", modal=False
|
||||
)
|
||||
self.resizable(False, False)
|
||||
self.geometry("")
|
||||
self.canvas_node = canvas_node
|
||||
self.node = canvas_node.core_node
|
||||
|
@ -76,36 +77,36 @@ class MobilityPlayerDialog(Dialog):
|
|||
|
||||
file_name = self.config["file"].value
|
||||
label = ttk.Label(self.top, text=file_name)
|
||||
label.grid(sticky="ew", pady=PAD)
|
||||
label.grid(sticky="ew", pady=PADY)
|
||||
|
||||
self.progressbar = ttk.Progressbar(self.top, mode="indeterminate")
|
||||
self.progressbar.grid(sticky="ew", pady=PAD)
|
||||
self.progressbar.grid(sticky="ew", pady=PADY)
|
||||
|
||||
frame = ttk.Frame(self.top)
|
||||
frame.grid(sticky="ew", pady=PAD)
|
||||
frame.grid(sticky="ew", pady=PADY)
|
||||
for i in range(3):
|
||||
frame.columnconfigure(i, weight=1)
|
||||
|
||||
image = Images.get(ImageEnum.START, width=ICON_SIZE)
|
||||
self.play_button = ttk.Button(frame, image=image, command=self.click_play)
|
||||
self.play_button.image = image
|
||||
self.play_button.grid(row=0, column=0, sticky="ew", padx=PAD)
|
||||
self.play_button.grid(row=0, column=0, sticky="ew", padx=PADX)
|
||||
|
||||
image = Images.get(ImageEnum.PAUSE, width=ICON_SIZE)
|
||||
self.pause_button = ttk.Button(frame, image=image, command=self.click_pause)
|
||||
self.pause_button.image = image
|
||||
self.pause_button.grid(row=0, column=1, sticky="ew", padx=PAD)
|
||||
self.pause_button.grid(row=0, column=1, sticky="ew", padx=PADX)
|
||||
|
||||
image = Images.get(ImageEnum.STOP, width=ICON_SIZE)
|
||||
self.stop_button = ttk.Button(frame, image=image, command=self.click_stop)
|
||||
self.stop_button.image = image
|
||||
self.stop_button.grid(row=0, column=2, sticky="ew", padx=PAD)
|
||||
self.stop_button.grid(row=0, column=2, sticky="ew", padx=PADX)
|
||||
|
||||
loop = tk.IntVar(value=int(self.config["loop"].value == "1"))
|
||||
checkbutton = ttk.Checkbutton(
|
||||
frame, text="Loop?", variable=loop, state=tk.DISABLED
|
||||
)
|
||||
checkbutton.grid(row=0, column=3, padx=PAD)
|
||||
checkbutton.grid(row=0, column=3, padx=PADX)
|
||||
|
||||
rate = self.config["refresh_ms"].value
|
||||
label = ttk.Label(frame, text=f"rate {rate} ms")
|
||||
|
|
|
@ -7,10 +7,9 @@ from coretk.dialogs.dialog import Dialog
|
|||
from coretk.dialogs.icondialog import IconDialog
|
||||
from coretk.dialogs.nodeservice import NodeService
|
||||
from coretk.nodeutils import NodeUtils
|
||||
from coretk.themes import FRAME_PAD, PADX, PADY
|
||||
from coretk.widgets import FrameScroll
|
||||
|
||||
PAD = 5
|
||||
|
||||
|
||||
def mac_auto(is_auto, entry):
|
||||
logging.info("mac auto clicked")
|
||||
|
@ -66,9 +65,22 @@ class NodeConfigDialog(Dialog):
|
|||
frame.grid(sticky="ew")
|
||||
frame.columnconfigure(1, weight=1)
|
||||
|
||||
# icon field
|
||||
label = ttk.Label(frame, text="Icon")
|
||||
label.grid(row=row, column=0, sticky="ew", padx=PADX, pady=PADY)
|
||||
self.image_button = ttk.Button(
|
||||
frame,
|
||||
text="Icon",
|
||||
image=self.image,
|
||||
compound=tk.NONE,
|
||||
command=self.click_icon,
|
||||
)
|
||||
self.image_button.grid(row=row, column=1, sticky="ew")
|
||||
row += 1
|
||||
|
||||
# name field
|
||||
label = ttk.Label(frame, text="Name")
|
||||
label.grid(row=row, column=0, sticky="ew", padx=PAD, pady=PAD)
|
||||
label.grid(row=row, column=0, sticky="ew", padx=PADX, pady=PADY)
|
||||
entry = ttk.Entry(
|
||||
frame,
|
||||
textvariable=self.name,
|
||||
|
@ -81,23 +93,10 @@ class NodeConfigDialog(Dialog):
|
|||
entry.grid(row=row, column=1, sticky="ew")
|
||||
row += 1
|
||||
|
||||
# icon field
|
||||
label = ttk.Label(frame, text="Icon")
|
||||
label.grid(row=row, column=0, sticky="ew", padx=PAD, pady=PAD)
|
||||
self.image_button = ttk.Button(
|
||||
frame,
|
||||
text="Icon",
|
||||
image=self.image,
|
||||
compound=tk.NONE,
|
||||
command=self.click_icon,
|
||||
)
|
||||
self.image_button.grid(row=row, column=1, sticky="ew")
|
||||
row += 1
|
||||
|
||||
# node type field
|
||||
if NodeUtils.is_model_node(self.node.type):
|
||||
label = ttk.Label(frame, text="Type")
|
||||
label.grid(row=row, column=0, sticky="ew", padx=PAD, pady=PAD)
|
||||
label.grid(row=row, column=0, sticky="ew", padx=PADX, pady=PADY)
|
||||
combobox = ttk.Combobox(
|
||||
frame,
|
||||
textvariable=self.type,
|
||||
|
@ -110,7 +109,7 @@ class NodeConfigDialog(Dialog):
|
|||
# container image field
|
||||
if NodeUtils.is_image_node(self.node.type):
|
||||
label = ttk.Label(frame, text="Image")
|
||||
label.grid(row=row, column=0, sticky="ew", padx=PAD, pady=PAD)
|
||||
label.grid(row=row, column=0, sticky="ew", padx=PADX, pady=PADY)
|
||||
entry = ttk.Entry(frame, textvariable=self.container_image)
|
||||
entry.grid(row=row, column=1, sticky="ew")
|
||||
row += 1
|
||||
|
@ -120,7 +119,7 @@ class NodeConfigDialog(Dialog):
|
|||
frame.grid(sticky="ew")
|
||||
frame.columnconfigure(1, weight=1)
|
||||
label = ttk.Label(frame, text="Server")
|
||||
label.grid(row=row, column=0, sticky="ew", padx=PAD, pady=PAD)
|
||||
label.grid(row=row, column=0, sticky="ew", padx=PADX, pady=PADY)
|
||||
servers = ["localhost"]
|
||||
servers.extend(list(sorted(self.app.core.servers.keys())))
|
||||
combobox = ttk.Combobox(
|
||||
|
@ -131,12 +130,13 @@ class NodeConfigDialog(Dialog):
|
|||
|
||||
# services
|
||||
button = ttk.Button(self.top, text="Services", command=self.click_services)
|
||||
button.grid(sticky="ew", pady=PAD)
|
||||
button.grid(sticky="ew", pady=PADY)
|
||||
|
||||
# interfaces
|
||||
if self.canvas_node.interfaces:
|
||||
self.draw_interfaces()
|
||||
|
||||
self.draw_spacer()
|
||||
self.draw_buttons()
|
||||
|
||||
def draw_interfaces(self):
|
||||
|
@ -146,17 +146,17 @@ class NodeConfigDialog(Dialog):
|
|||
scroll.frame.rowconfigure(0, weight=1)
|
||||
for interface in self.canvas_node.interfaces:
|
||||
logging.info("interface: %s", interface)
|
||||
frame = ttk.LabelFrame(scroll.frame, text=interface.name, padding=PAD)
|
||||
frame.grid(sticky="ew", pady=PAD)
|
||||
frame = ttk.LabelFrame(scroll.frame, text=interface.name, padding=FRAME_PAD)
|
||||
frame.grid(sticky="ew", pady=PADY)
|
||||
frame.columnconfigure(1, weight=1)
|
||||
frame.columnconfigure(2, weight=1)
|
||||
|
||||
label = ttk.Label(frame, text="MAC")
|
||||
label.grid(row=0, column=0, padx=PAD, pady=PAD)
|
||||
label.grid(row=0, column=0, padx=PADX, pady=PADY)
|
||||
is_auto = tk.BooleanVar(value=True)
|
||||
checkbutton = ttk.Checkbutton(frame, text="Auto?", variable=is_auto)
|
||||
checkbutton.var = is_auto
|
||||
checkbutton.grid(row=0, column=1, padx=PAD)
|
||||
checkbutton.grid(row=0, column=1, padx=PADX)
|
||||
mac = tk.StringVar(value=interface.mac)
|
||||
entry = ttk.Entry(frame, textvariable=mac, state=tk.DISABLED)
|
||||
entry.grid(row=0, column=2, sticky="ew")
|
||||
|
@ -164,14 +164,14 @@ class NodeConfigDialog(Dialog):
|
|||
checkbutton.config(command=func)
|
||||
|
||||
label = ttk.Label(frame, text="IPv4")
|
||||
label.grid(row=1, column=0, padx=PAD, pady=PAD)
|
||||
label.grid(row=1, column=0, padx=PADX, pady=PADY)
|
||||
ip4 = tk.StringVar(value=f"{interface.ip4}/{interface.ip4mask}")
|
||||
entry = ttk.Entry(frame, textvariable=ip4)
|
||||
entry.bind("<FocusOut>", self.app.validation.ip_focus_out)
|
||||
entry.grid(row=1, column=1, columnspan=2, sticky="ew")
|
||||
|
||||
label = ttk.Label(frame, text="IPv6")
|
||||
label.grid(row=2, column=0, padx=PAD, pady=PAD)
|
||||
label.grid(row=2, column=0, padx=PADX, pady=PADY)
|
||||
ip6 = tk.StringVar(value=f"{interface.ip6}/{interface.ip6mask}")
|
||||
entry = ttk.Entry(frame, textvariable=ip6)
|
||||
entry.bind("<FocusOut>", self.app.validation.ip_focus_out)
|
||||
|
@ -186,7 +186,7 @@ class NodeConfigDialog(Dialog):
|
|||
frame.columnconfigure(1, weight=1)
|
||||
|
||||
button = ttk.Button(frame, text="Apply", command=self.config_apply)
|
||||
button.grid(row=0, column=0, padx=2, sticky="ew")
|
||||
button.grid(row=0, column=0, padx=PADX, sticky="ew")
|
||||
|
||||
button = ttk.Button(frame, text="Cancel", command=self.destroy)
|
||||
button.grid(row=0, column=1, sticky="ew")
|
||||
|
|
|
@ -6,6 +6,7 @@ from tkinter import messagebox, ttk
|
|||
|
||||
from coretk.dialogs.dialog import Dialog
|
||||
from coretk.dialogs.serviceconfiguration import ServiceConfiguration
|
||||
from coretk.themes import FRAME_PAD, PADX, PADY
|
||||
from coretk.widgets import CheckboxList, ListboxScroll
|
||||
|
||||
|
||||
|
@ -34,11 +35,11 @@ class NodeService(Dialog):
|
|||
self.top.rowconfigure(0, weight=1)
|
||||
|
||||
frame = ttk.Frame(self.top)
|
||||
frame.grid(stick="nsew")
|
||||
frame.grid(stick="nsew", pady=PADY)
|
||||
frame.rowconfigure(0, weight=1)
|
||||
for i in range(3):
|
||||
frame.columnconfigure(i, weight=1)
|
||||
self.groups = ListboxScroll(frame, text="Groups")
|
||||
self.groups = ListboxScroll(frame, text="Groups", padding=FRAME_PAD)
|
||||
self.groups.grid(row=0, column=0, sticky="nsew")
|
||||
for group in sorted(self.app.core.services):
|
||||
self.groups.listbox.insert(tk.END, group)
|
||||
|
@ -46,11 +47,15 @@ class NodeService(Dialog):
|
|||
self.groups.listbox.selection_set(0)
|
||||
|
||||
self.services = CheckboxList(
|
||||
frame, self.app, text="Services", clicked=self.service_clicked
|
||||
frame,
|
||||
self.app,
|
||||
text="Services",
|
||||
clicked=self.service_clicked,
|
||||
padding=FRAME_PAD,
|
||||
)
|
||||
self.services.grid(row=0, column=1, sticky="nsew")
|
||||
|
||||
self.current = ListboxScroll(frame, text="Selected")
|
||||
self.current = ListboxScroll(frame, text="Selected", padding=FRAME_PAD)
|
||||
self.current.grid(row=0, column=2, sticky="nsew")
|
||||
for service in sorted(self.current_services):
|
||||
self.current.listbox.insert(tk.END, service)
|
||||
|
@ -60,9 +65,9 @@ class NodeService(Dialog):
|
|||
for i in range(3):
|
||||
frame.columnconfigure(i, weight=1)
|
||||
button = ttk.Button(frame, text="Configure", command=self.click_configure)
|
||||
button.grid(row=0, column=0, sticky="ew")
|
||||
button.grid(row=0, column=0, sticky="ew", padx=PADX)
|
||||
button = ttk.Button(frame, text="Save", command=self.click_save)
|
||||
button.grid(row=0, column=1, sticky="ew")
|
||||
button.grid(row=0, column=1, sticky="ew", padx=PADX)
|
||||
button = ttk.Button(frame, text="Cancel", command=self.click_cancel)
|
||||
button.grid(row=0, column=2, sticky="ew")
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@ from tkinter import ttk
|
|||
|
||||
from coretk.coreclient import Observer
|
||||
from coretk.dialogs.dialog import Dialog
|
||||
from coretk.themes import PADX, PADY
|
||||
|
||||
|
||||
class ObserverDialog(Dialog):
|
||||
|
@ -27,7 +28,7 @@ class ObserverDialog(Dialog):
|
|||
|
||||
def draw_listbox(self):
|
||||
frame = ttk.Frame(self.top)
|
||||
frame.grid(sticky="nsew")
|
||||
frame.grid(sticky="nsew", pady=PADY)
|
||||
frame.columnconfigure(0, weight=1)
|
||||
frame.rowconfigure(0, weight=1)
|
||||
|
||||
|
@ -46,32 +47,32 @@ class ObserverDialog(Dialog):
|
|||
|
||||
def draw_form_fields(self):
|
||||
frame = ttk.Frame(self.top)
|
||||
frame.grid(sticky="ew")
|
||||
frame.grid(sticky="ew", pady=PADY)
|
||||
frame.columnconfigure(1, weight=1)
|
||||
|
||||
label = ttk.Label(frame, text="Name")
|
||||
label.grid(row=0, column=0, sticky="w")
|
||||
label.grid(row=0, column=0, sticky="w", padx=PADX)
|
||||
entry = ttk.Entry(frame, textvariable=self.name)
|
||||
entry.grid(row=0, column=1, sticky="ew")
|
||||
|
||||
label = ttk.Label(frame, text="Command")
|
||||
label.grid(row=1, column=0, sticky="w")
|
||||
label.grid(row=1, column=0, sticky="w", padx=PADX)
|
||||
entry = ttk.Entry(frame, textvariable=self.cmd)
|
||||
entry.grid(row=1, column=1, sticky="ew")
|
||||
|
||||
def draw_config_buttons(self):
|
||||
frame = ttk.Frame(self.top)
|
||||
frame.grid(pady=2, sticky="ew")
|
||||
frame.grid(sticky="ew", pady=PADY)
|
||||
for i in range(3):
|
||||
frame.columnconfigure(i, weight=1)
|
||||
|
||||
button = ttk.Button(frame, text="Create", command=self.click_create)
|
||||
button.grid(row=0, column=0, sticky="ew")
|
||||
button.grid(row=0, column=0, sticky="ew", padx=PADX)
|
||||
|
||||
self.save_button = ttk.Button(
|
||||
frame, text="Save", state=tk.DISABLED, command=self.click_save
|
||||
)
|
||||
self.save_button.grid(row=0, column=1, sticky="ew")
|
||||
self.save_button.grid(row=0, column=1, sticky="ew", padx=PADX)
|
||||
|
||||
self.delete_button = ttk.Button(
|
||||
frame, text="Delete", state=tk.DISABLED, command=self.click_delete
|
||||
|
@ -85,7 +86,7 @@ class ObserverDialog(Dialog):
|
|||
frame.columnconfigure(i, weight=1)
|
||||
|
||||
button = ttk.Button(frame, text="Save", command=self.click_save_config)
|
||||
button.grid(row=0, column=0, sticky="ew")
|
||||
button.grid(row=0, column=0, sticky="ew", padx=PADX)
|
||||
|
||||
button = ttk.Button(frame, text="Cancel", command=self.destroy)
|
||||
button.grid(row=0, column=1, sticky="ew")
|
||||
|
|
|
@ -4,6 +4,7 @@ from tkinter import ttk
|
|||
|
||||
from coretk import appconfig
|
||||
from coretk.dialogs.dialog import Dialog
|
||||
from coretk.themes import FRAME_PAD, PADX, PADY
|
||||
|
||||
|
||||
class PreferencesDialog(Dialog):
|
||||
|
@ -18,16 +19,17 @@ class PreferencesDialog(Dialog):
|
|||
|
||||
def draw(self):
|
||||
self.top.columnconfigure(0, weight=1)
|
||||
self.top.rowconfigure(0, weight=1)
|
||||
self.draw_preferences()
|
||||
self.draw_buttons()
|
||||
|
||||
def draw_preferences(self):
|
||||
frame = ttk.LabelFrame(self.top, text="Preferences")
|
||||
frame.grid(sticky="ew", pady=2)
|
||||
frame = ttk.LabelFrame(self.top, text="Preferences", padding=FRAME_PAD)
|
||||
frame.grid(sticky="nsew", pady=PADY)
|
||||
frame.columnconfigure(1, weight=1)
|
||||
|
||||
label = ttk.Label(frame, text="Theme")
|
||||
label.grid(row=0, column=0, pady=2, padx=2, sticky="w")
|
||||
label.grid(row=0, column=0, pady=PADY, padx=PADX, sticky="w")
|
||||
themes = self.app.style.theme_names()
|
||||
combobox = ttk.Combobox(
|
||||
frame, textvariable=self.theme, values=themes, state="readonly"
|
||||
|
@ -37,14 +39,14 @@ class PreferencesDialog(Dialog):
|
|||
combobox.bind("<<ComboboxSelected>>", self.theme_change)
|
||||
|
||||
label = ttk.Label(frame, text="Editor")
|
||||
label.grid(row=1, column=0, pady=2, padx=2, sticky="w")
|
||||
label.grid(row=1, column=0, pady=PADY, padx=PADX, sticky="w")
|
||||
combobox = ttk.Combobox(
|
||||
frame, textvariable=self.editor, values=appconfig.EDITORS, state="readonly"
|
||||
)
|
||||
combobox.grid(row=1, column=1, sticky="ew")
|
||||
|
||||
label = ttk.Label(frame, text="Terminal")
|
||||
label.grid(row=2, column=0, pady=2, padx=2, sticky="w")
|
||||
label.grid(row=2, column=0, pady=PADY, padx=PADX, sticky="w")
|
||||
combobox = ttk.Combobox(
|
||||
frame,
|
||||
textvariable=self.terminal,
|
||||
|
@ -54,7 +56,7 @@ class PreferencesDialog(Dialog):
|
|||
combobox.grid(row=2, column=1, sticky="ew")
|
||||
|
||||
label = ttk.Label(frame, text="3D GUI")
|
||||
label.grid(row=3, column=0, pady=2, padx=2, sticky="w")
|
||||
label.grid(row=3, column=0, pady=PADY, padx=PADX, sticky="w")
|
||||
entry = ttk.Entry(frame, textvariable=self.gui3d)
|
||||
entry.grid(row=3, column=1, sticky="ew")
|
||||
|
||||
|
@ -65,7 +67,7 @@ class PreferencesDialog(Dialog):
|
|||
frame.columnconfigure(i, weight=1)
|
||||
|
||||
button = ttk.Button(frame, text="Save", command=self.click_save)
|
||||
button.grid(row=0, column=0, sticky="ew")
|
||||
button.grid(row=0, column=0, sticky="ew", padx=PADX)
|
||||
|
||||
button = ttk.Button(frame, text="Cancel", command=self.destroy)
|
||||
button.grid(row=0, column=1, sticky="ew")
|
||||
|
|
|
@ -3,6 +3,7 @@ from tkinter import ttk
|
|||
|
||||
from coretk.coreclient import CoreServer
|
||||
from coretk.dialogs.dialog import Dialog
|
||||
from coretk.themes import FRAME_PAD, PADX, PADY
|
||||
|
||||
DEFAULT_NAME = "example"
|
||||
DEFAULT_ADDRESS = "127.0.0.1"
|
||||
|
@ -26,13 +27,13 @@ class ServersDialog(Dialog):
|
|||
self.top.columnconfigure(0, weight=1)
|
||||
self.top.rowconfigure(0, weight=1)
|
||||
self.draw_servers()
|
||||
self.draw_server_configuration()
|
||||
self.draw_servers_buttons()
|
||||
self.draw_server_configuration()
|
||||
self.draw_apply_buttons()
|
||||
|
||||
def draw_servers(self):
|
||||
frame = ttk.Frame(self.top)
|
||||
frame.grid(pady=2, sticky="nsew")
|
||||
frame.grid(pady=PADY, sticky="nsew")
|
||||
frame.columnconfigure(0, weight=1)
|
||||
frame.rowconfigure(0, weight=1)
|
||||
|
||||
|
@ -51,27 +52,24 @@ class ServersDialog(Dialog):
|
|||
scrollbar.config(command=self.servers.yview)
|
||||
|
||||
def draw_server_configuration(self):
|
||||
label = ttk.Label(self.top, text="Server Configuration")
|
||||
label.grid(pady=2, sticky="ew")
|
||||
|
||||
frame = ttk.Frame(self.top)
|
||||
frame.grid(pady=2, sticky="ew")
|
||||
frame = ttk.LabelFrame(self.top, text="Server Configuration", padding=FRAME_PAD)
|
||||
frame.grid(pady=PADY, sticky="ew")
|
||||
frame.columnconfigure(1, weight=1)
|
||||
frame.columnconfigure(3, weight=1)
|
||||
frame.columnconfigure(5, weight=1)
|
||||
|
||||
label = ttk.Label(frame, text="Name")
|
||||
label.grid(row=0, column=0, sticky="w")
|
||||
label.grid(row=0, column=0, sticky="w", padx=PADX, pady=PADY)
|
||||
entry = ttk.Entry(frame, textvariable=self.name)
|
||||
entry.grid(row=0, column=1, sticky="ew")
|
||||
|
||||
label = ttk.Label(frame, text="Address")
|
||||
label.grid(row=0, column=2, sticky="w")
|
||||
label.grid(row=0, column=2, sticky="w", padx=PADX, pady=PADY)
|
||||
entry = ttk.Entry(frame, textvariable=self.address)
|
||||
entry.grid(row=0, column=3, sticky="ew")
|
||||
|
||||
label = ttk.Label(frame, text="Port")
|
||||
label.grid(row=0, column=4, sticky="w")
|
||||
label.grid(row=0, column=4, sticky="w", padx=PADX, pady=PADY)
|
||||
entry = ttk.Entry(
|
||||
frame,
|
||||
textvariable=self.port,
|
||||
|
@ -85,17 +83,17 @@ class ServersDialog(Dialog):
|
|||
|
||||
def draw_servers_buttons(self):
|
||||
frame = ttk.Frame(self.top)
|
||||
frame.grid(pady=2, sticky="ew")
|
||||
frame.grid(pady=PADY, sticky="ew")
|
||||
for i in range(3):
|
||||
frame.columnconfigure(i, weight=1)
|
||||
|
||||
button = ttk.Button(frame, text="Create", command=self.click_create)
|
||||
button.grid(row=0, column=0, sticky="ew")
|
||||
button.grid(row=0, column=0, sticky="ew", padx=PADX)
|
||||
|
||||
self.save_button = ttk.Button(
|
||||
frame, text="Save", state=tk.DISABLED, command=self.click_save
|
||||
)
|
||||
self.save_button.grid(row=0, column=1, sticky="ew")
|
||||
self.save_button.grid(row=0, column=1, sticky="ew", padx=PADX)
|
||||
|
||||
self.delete_button = ttk.Button(
|
||||
frame, text="Delete", state=tk.DISABLED, command=self.click_delete
|
||||
|
@ -111,7 +109,7 @@ class ServersDialog(Dialog):
|
|||
button = ttk.Button(
|
||||
frame, text="Save Configuration", command=self.click_save_configuration
|
||||
)
|
||||
button.grid(row=0, column=0, sticky="ew")
|
||||
button.grid(row=0, column=0, sticky="ew", padx=PADX)
|
||||
|
||||
button = ttk.Button(frame, text="Cancel", command=self.destroy)
|
||||
button.grid(row=0, column=1, sticky="ew")
|
||||
|
|
|
@ -5,11 +5,9 @@ import grpc
|
|||
|
||||
from coretk.dialogs.dialog import Dialog
|
||||
from coretk.errors import show_grpc_error
|
||||
from coretk.themes import PADX, PADY
|
||||
from coretk.widgets import ConfigFrame
|
||||
|
||||
PAD_X = 2
|
||||
PAD_Y = 2
|
||||
|
||||
|
||||
class SessionOptionsDialog(Dialog):
|
||||
def __init__(self, master, app):
|
||||
|
@ -33,16 +31,16 @@ class SessionOptionsDialog(Dialog):
|
|||
|
||||
self.config_frame = ConfigFrame(self.top, self.app, config=self.config)
|
||||
self.config_frame.draw_config()
|
||||
self.config_frame.grid(sticky="nsew")
|
||||
self.config_frame.grid(sticky="nsew", pady=PADY)
|
||||
|
||||
frame = ttk.Frame(self.top)
|
||||
frame.grid(sticky="ew")
|
||||
for i in range(2):
|
||||
frame.columnconfigure(i, weight=1)
|
||||
button = ttk.Button(frame, text="Save", command=self.save)
|
||||
button.grid(row=0, column=0, pady=PAD_Y, padx=PAD_X, sticky="ew")
|
||||
button.grid(row=0, column=0, padx=PADX, sticky="ew")
|
||||
button = ttk.Button(frame, text="Cancel", command=self.destroy)
|
||||
button.grid(row=0, column=1, pady=PAD_Y, padx=PAD_X, sticky="ew")
|
||||
button.grid(row=0, column=1, padx=PADX, sticky="ew")
|
||||
|
||||
def save(self):
|
||||
config = self.config_frame.parse_config()
|
||||
|
|
|
@ -9,6 +9,7 @@ from core.api.grpc import core_pb2
|
|||
from coretk.dialogs.dialog import Dialog
|
||||
from coretk.errors import show_grpc_error
|
||||
from coretk.images import ImageEnum, Images
|
||||
from coretk.themes import PADX, PADY
|
||||
|
||||
|
||||
class SessionsDialog(Dialog):
|
||||
|
@ -31,6 +32,7 @@ class SessionsDialog(Dialog):
|
|||
|
||||
def draw(self):
|
||||
self.top.columnconfigure(0, weight=1)
|
||||
self.top.rowconfigure(1, weight=1)
|
||||
self.draw_description()
|
||||
self.draw_tree()
|
||||
self.draw_buttons()
|
||||
|
@ -46,14 +48,19 @@ class SessionsDialog(Dialog):
|
|||
"connect to an existing session. Usually, only sessions in \n"
|
||||
"the RUNTIME state persist in the daemon, except for the \n"
|
||||
"one you might be concurrently editting.",
|
||||
justify=tk.CENTER,
|
||||
)
|
||||
label.grid(row=0, sticky="ew", pady=5)
|
||||
label.grid(pady=PADY)
|
||||
|
||||
def draw_tree(self):
|
||||
frame = ttk.Frame(self.top)
|
||||
frame.columnconfigure(0, weight=1)
|
||||
frame.rowconfigure(0, weight=1)
|
||||
frame.grid(sticky="nsew", pady=PADY)
|
||||
self.tree = ttk.Treeview(
|
||||
self.top, columns=("id", "state", "nodes"), show="headings"
|
||||
frame, columns=("id", "state", "nodes"), show="headings"
|
||||
)
|
||||
self.tree.grid(row=1, sticky="nsew")
|
||||
self.tree.grid(sticky="nsew")
|
||||
self.tree.column("id", stretch=tk.YES)
|
||||
self.tree.heading("id", text="ID")
|
||||
self.tree.column("state", stretch=tk.YES)
|
||||
|
@ -72,28 +79,26 @@ class SessionsDialog(Dialog):
|
|||
self.tree.bind("<Double-1>", self.on_selected)
|
||||
self.tree.bind("<<TreeviewSelect>>", self.click_select)
|
||||
|
||||
yscrollbar = ttk.Scrollbar(self.top, orient="vertical", command=self.tree.yview)
|
||||
yscrollbar.grid(row=1, column=1, sticky="ns")
|
||||
yscrollbar = ttk.Scrollbar(frame, orient="vertical", command=self.tree.yview)
|
||||
yscrollbar.grid(row=0, column=1, sticky="ns")
|
||||
self.tree.configure(yscrollcommand=yscrollbar.set)
|
||||
|
||||
xscrollbar = ttk.Scrollbar(
|
||||
self.top, orient="horizontal", command=self.tree.xview
|
||||
)
|
||||
xscrollbar.grid(row=2, sticky="ew", pady=5)
|
||||
xscrollbar = ttk.Scrollbar(frame, orient="horizontal", command=self.tree.xview)
|
||||
xscrollbar.grid(row=1, sticky="ew")
|
||||
self.tree.configure(xscrollcommand=xscrollbar.set)
|
||||
|
||||
def draw_buttons(self):
|
||||
frame = ttk.Frame(self.top)
|
||||
for i in range(4):
|
||||
frame.columnconfigure(i, weight=1)
|
||||
frame.grid(row=3, sticky="ew")
|
||||
frame.grid(sticky="ew")
|
||||
|
||||
image = Images.get(ImageEnum.DOCUMENTNEW, 16)
|
||||
b = ttk.Button(
|
||||
frame, image=image, text="New", compound=tk.LEFT, command=self.click_new
|
||||
)
|
||||
b.image = image
|
||||
b.grid(row=0, padx=2, sticky="ew")
|
||||
b.grid(row=0, padx=PADX, sticky="ew")
|
||||
|
||||
image = Images.get(ImageEnum.FILEOPEN, 16)
|
||||
b = ttk.Button(
|
||||
|
@ -104,7 +109,7 @@ class SessionsDialog(Dialog):
|
|||
command=self.click_connect,
|
||||
)
|
||||
b.image = image
|
||||
b.grid(row=0, column=1, padx=2, sticky="ew")
|
||||
b.grid(row=0, column=1, padx=PADX, sticky="ew")
|
||||
|
||||
image = Images.get(ImageEnum.EDITDELETE, 16)
|
||||
b = ttk.Button(
|
||||
|
@ -115,10 +120,10 @@ class SessionsDialog(Dialog):
|
|||
command=self.click_shutdown,
|
||||
)
|
||||
b.image = image
|
||||
b.grid(row=0, column=2, padx=2, sticky="ew")
|
||||
b.grid(row=0, column=2, padx=PADX, sticky="ew")
|
||||
|
||||
b = ttk.Button(frame, text="Cancel", command=self.click_new)
|
||||
b.grid(row=0, column=3, padx=2, sticky="ew")
|
||||
b.grid(row=0, column=3, sticky="ew")
|
||||
|
||||
def click_new(self):
|
||||
self.app.core.create_new_session()
|
||||
|
|
|
@ -7,6 +7,7 @@ from tkinter import colorchooser, font, ttk
|
|||
from coretk.dialogs.dialog import Dialog
|
||||
from coretk.graph import tags
|
||||
from coretk.graph.shapeutils import is_draw_shape, is_shape_text
|
||||
from coretk.themes import FRAME_PAD, PADX, PADY
|
||||
|
||||
FONT_SIZES = [8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72]
|
||||
BORDER_WIDTH = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
||||
|
@ -37,20 +38,27 @@ class ShapeDialog(Dialog):
|
|||
self.bold = tk.BooleanVar(value=data.bold)
|
||||
self.italic = tk.BooleanVar(value=data.italic)
|
||||
self.underline = tk.BooleanVar(value=data.underline)
|
||||
self.top.columnconfigure(0, weight=1)
|
||||
self.draw()
|
||||
|
||||
def draw(self):
|
||||
frame = ttk.Frame(self.top)
|
||||
frame.columnconfigure(0, weight=1)
|
||||
frame.columnconfigure(1, weight=2)
|
||||
label = ttk.Label(frame, text="Text for top of shape: ")
|
||||
label.grid(row=0, column=0, sticky="nsew")
|
||||
entry = ttk.Entry(frame, textvariable=self.shape_text)
|
||||
entry.grid(row=0, column=1, sticky="nsew")
|
||||
frame.grid(row=0, column=0, sticky="nsew", padx=3, pady=3)
|
||||
self.top.columnconfigure(0, weight=1)
|
||||
self.draw_label_options()
|
||||
if is_draw_shape(self.shape.shape_type):
|
||||
self.draw_shape_options()
|
||||
self.draw_spacer()
|
||||
self.draw_buttons()
|
||||
|
||||
frame = ttk.Frame(self.top)
|
||||
def draw_label_options(self):
|
||||
label_frame = ttk.LabelFrame(self.top, text="Label", padding=FRAME_PAD)
|
||||
label_frame.grid(sticky="ew")
|
||||
label_frame.columnconfigure(0, weight=1)
|
||||
|
||||
entry = ttk.Entry(label_frame, textvariable=self.shape_text)
|
||||
entry.grid(sticky="ew", pady=PADY)
|
||||
|
||||
# font options
|
||||
frame = ttk.Frame(label_frame)
|
||||
frame.grid(sticky="nsew", pady=PADY)
|
||||
frame.columnconfigure(0, weight=1)
|
||||
frame.columnconfigure(1, weight=1)
|
||||
frame.columnconfigure(2, weight=1)
|
||||
|
@ -64,71 +72,66 @@ class ShapeDialog(Dialog):
|
|||
combobox = ttk.Combobox(
|
||||
frame, textvariable=self.font_size, values=FONT_SIZES, state="readonly"
|
||||
)
|
||||
combobox.grid(row=0, column=1, padx=3, sticky="nsew")
|
||||
button = ttk.Button(frame, text="Text color", command=self.choose_text_color)
|
||||
combobox.grid(row=0, column=1, padx=PADX, sticky="nsew")
|
||||
button = ttk.Button(frame, text="Color", command=self.choose_text_color)
|
||||
button.grid(row=0, column=2, sticky="nsew")
|
||||
frame.grid(row=1, column=0, sticky="nsew", padx=3, pady=3)
|
||||
|
||||
frame = ttk.Frame(self.top)
|
||||
# style options
|
||||
frame = ttk.Frame(label_frame)
|
||||
frame.grid(sticky="ew")
|
||||
for i in range(3):
|
||||
frame.columnconfigure(i, weight=1)
|
||||
button = ttk.Checkbutton(frame, variable=self.bold, text="Bold")
|
||||
button.grid(row=0, column=0)
|
||||
button.grid(row=0, column=0, sticky="ew")
|
||||
button = ttk.Checkbutton(frame, variable=self.italic, text="Italic")
|
||||
button.grid(row=0, column=1, padx=3)
|
||||
button.grid(row=0, column=1, padx=PADX, sticky="ew")
|
||||
button = ttk.Checkbutton(frame, variable=self.underline, text="Underline")
|
||||
button.grid(row=0, column=2)
|
||||
frame.grid(row=2, column=0, sticky="nsew", padx=3, pady=3)
|
||||
button.grid(row=0, column=2, sticky="ew")
|
||||
|
||||
if is_draw_shape(self.shape.shape_type):
|
||||
frame = ttk.Frame(self.top)
|
||||
frame.columnconfigure(0, weight=1)
|
||||
frame.columnconfigure(1, weight=1)
|
||||
frame.columnconfigure(2, weight=1)
|
||||
label = ttk.Label(frame, text="Fill color")
|
||||
label.grid(row=0, column=0, sticky="nsew")
|
||||
self.fill = ttk.Label(
|
||||
frame, text=self.fill_color, background=self.fill_color
|
||||
)
|
||||
self.fill.grid(row=0, column=1, sticky="nsew", padx=3)
|
||||
button = ttk.Button(frame, text="Color", command=self.choose_fill_color)
|
||||
button.grid(row=0, column=2, sticky="nsew")
|
||||
frame.grid(row=3, column=0, sticky="nsew", padx=3, pady=3)
|
||||
def draw_shape_options(self):
|
||||
label_frame = ttk.LabelFrame(self.top, text="Shape", padding=FRAME_PAD)
|
||||
label_frame.grid(sticky="ew", pady=PADY)
|
||||
label_frame.columnconfigure(0, weight=1)
|
||||
|
||||
frame = ttk.Frame(self.top)
|
||||
frame.columnconfigure(0, weight=1)
|
||||
frame.columnconfigure(1, weight=1)
|
||||
frame.columnconfigure(2, weight=1)
|
||||
label = ttk.Label(frame, text="Border color:")
|
||||
label.grid(row=0, column=0, sticky="nsew")
|
||||
self.border = ttk.Label(
|
||||
frame, text=self.border_color, background=self.fill_color
|
||||
)
|
||||
self.border.grid(row=0, column=1, sticky="nsew", padx=3)
|
||||
button = ttk.Button(frame, text="Color", command=self.choose_border_color)
|
||||
button.grid(row=0, column=2, sticky="nsew")
|
||||
frame.grid(row=4, column=0, sticky="nsew", padx=3, pady=3)
|
||||
frame = ttk.Frame(label_frame)
|
||||
frame.grid(sticky="ew")
|
||||
for i in range(1, 3):
|
||||
frame.columnconfigure(i, weight=1)
|
||||
label = ttk.Label(frame, text="Fill Color")
|
||||
label.grid(row=0, column=0, padx=PADX, sticky="w")
|
||||
self.fill = ttk.Label(frame, text=self.fill_color, background=self.fill_color)
|
||||
self.fill.grid(row=0, column=1, sticky="ew", padx=PADX)
|
||||
button = ttk.Button(frame, text="Color", command=self.choose_fill_color)
|
||||
button.grid(row=0, column=2, sticky="ew")
|
||||
|
||||
frame = ttk.Frame(self.top)
|
||||
frame.columnconfigure(0, weight=1)
|
||||
frame.columnconfigure(1, weight=2)
|
||||
label = ttk.Label(frame, text="Border width:")
|
||||
label.grid(row=0, column=0, sticky="nsew")
|
||||
combobox = ttk.Combobox(
|
||||
frame,
|
||||
textvariable=self.border_width,
|
||||
values=BORDER_WIDTH,
|
||||
state="readonly",
|
||||
)
|
||||
combobox.grid(row=0, column=1, sticky="nsew")
|
||||
frame.grid(row=5, column=0, sticky="nsew", padx=3, pady=3)
|
||||
label = ttk.Label(frame, text="Border Color")
|
||||
label.grid(row=1, column=0, sticky="w", padx=PADX)
|
||||
self.border = ttk.Label(
|
||||
frame, text=self.border_color, background=self.border_color
|
||||
)
|
||||
self.border.grid(row=1, column=1, sticky="ew", padx=PADX)
|
||||
button = ttk.Button(frame, text="Color", command=self.choose_border_color)
|
||||
button.grid(row=1, column=2, sticky="ew")
|
||||
|
||||
frame = ttk.Frame(label_frame)
|
||||
frame.grid(sticky="ew", pady=PADY)
|
||||
frame.columnconfigure(1, weight=1)
|
||||
label = ttk.Label(frame, text="Border Width")
|
||||
label.grid(row=0, column=0, sticky="w", padx=PADX)
|
||||
combobox = ttk.Combobox(
|
||||
frame, textvariable=self.border_width, values=BORDER_WIDTH, state="readonly"
|
||||
)
|
||||
combobox.grid(row=0, column=1, sticky="nsew")
|
||||
|
||||
def draw_buttons(self):
|
||||
frame = ttk.Frame(self.top)
|
||||
frame.grid(sticky="nsew")
|
||||
frame.columnconfigure(0, weight=1)
|
||||
frame.columnconfigure(1, weight=1)
|
||||
button = ttk.Button(frame, text="Add shape", command=self.click_add)
|
||||
button.grid(row=0, column=0, sticky="e", padx=3)
|
||||
button.grid(row=0, column=0, sticky="ew", padx=PADX)
|
||||
button = ttk.Button(frame, text="Cancel", command=self.cancel)
|
||||
button.grid(row=0, column=1, sticky="w", pady=3)
|
||||
frame.grid(row=6, column=0, sticky="nsew", padx=3, pady=3)
|
||||
button.grid(row=0, column=1, sticky="ew")
|
||||
|
||||
def choose_text_color(self):
|
||||
color = colorchooser.askcolor(color="black")
|
||||
|
@ -140,7 +143,7 @@ class ShapeDialog(Dialog):
|
|||
self.fill.config(background=color[1], text=color[1])
|
||||
|
||||
def choose_border_color(self):
|
||||
color = colorchooser.askcolor(color="black")
|
||||
color = colorchooser.askcolor(color=self.border_color)
|
||||
self.border_color = color[1]
|
||||
self.border.config(background=color[1], text=color[1])
|
||||
|
||||
|
|
|
@ -8,10 +8,9 @@ import grpc
|
|||
|
||||
from coretk.dialogs.dialog import Dialog
|
||||
from coretk.errors import show_grpc_error
|
||||
from coretk.themes import PADX, PADY
|
||||
from coretk.widgets import ConfigFrame
|
||||
|
||||
PAD = 5
|
||||
|
||||
|
||||
class WlanConfigDialog(Dialog):
|
||||
def __init__(self, master, app, canvas_node):
|
||||
|
@ -30,9 +29,10 @@ class WlanConfigDialog(Dialog):
|
|||
|
||||
def draw(self):
|
||||
self.top.columnconfigure(0, weight=1)
|
||||
self.config_frame = ConfigFrame(self.top, self.app, self.config, borderwidth=0)
|
||||
self.top.rowconfigure(0, weight=1)
|
||||
self.config_frame = ConfigFrame(self.top, self.app, self.config)
|
||||
self.config_frame.draw_config()
|
||||
self.config_frame.grid(sticky="nsew", pady=PAD)
|
||||
self.config_frame.grid(sticky="nsew", pady=PADY)
|
||||
self.draw_apply_buttons()
|
||||
|
||||
def draw_apply_buttons(self):
|
||||
|
@ -47,7 +47,7 @@ class WlanConfigDialog(Dialog):
|
|||
frame.columnconfigure(i, weight=1)
|
||||
|
||||
button = ttk.Button(frame, text="Apply", command=self.click_apply)
|
||||
button.grid(row=0, column=0, padx=PAD, sticky="ew")
|
||||
button.grid(row=0, column=0, padx=PADX, sticky="ew")
|
||||
|
||||
button = ttk.Button(frame, text="Cancel", command=self.destroy)
|
||||
button.grid(row=0, column=1, sticky="ew")
|
||||
|
|
|
@ -5,6 +5,7 @@ import grpc
|
|||
|
||||
from core.api.grpc import core_pb2
|
||||
from core.api.grpc.core_pb2 import NodeType
|
||||
from coretk import themes
|
||||
from coretk.dialogs.emaneconfig import EmaneConfigDialog
|
||||
from coretk.dialogs.mobilityconfig import MobilityConfigDialog
|
||||
from coretk.dialogs.nodeconfig import NodeConfigDialog
|
||||
|
@ -162,6 +163,7 @@ class CanvasNode:
|
|||
is_wlan = self.core_node.type == NodeType.WIRELESS_LAN
|
||||
is_emane = self.core_node.type == NodeType.EMANE
|
||||
context = tk.Menu(self.canvas)
|
||||
themes.update_menu(self.app.style, context)
|
||||
if self.app.core.is_runtime():
|
||||
context.add_command(label="Configure", command=self.show_config)
|
||||
if NodeUtils.is_container_node(self.core_node.type):
|
||||
|
|
|
@ -12,8 +12,8 @@ import grpc
|
|||
|
||||
from coretk.appconfig import XML_PATH
|
||||
from coretk.dialogs.about import AboutDialog
|
||||
from coretk.dialogs.canvasbackground import CanvasBackgroundDialog
|
||||
from coretk.dialogs.canvassizeandscale import SizeAndScaleDialog
|
||||
from coretk.dialogs.canvaswallpaper import CanvasBackgroundDialog
|
||||
from coretk.dialogs.hooks import HooksDialog
|
||||
from coretk.dialogs.observers import ObserverDialog
|
||||
from coretk.dialogs.preferences import PreferencesDialog
|
||||
|
|
|
@ -80,6 +80,7 @@ class Menubar(tk.Menu):
|
|||
:return: nothing
|
||||
"""
|
||||
menu = tk.Menu(self)
|
||||
menu.add_command(label="Preferences", command=self.menuaction.gui_preferences)
|
||||
menu.add_command(label="Undo", accelerator="Ctrl+Z", state=tk.DISABLED)
|
||||
menu.add_command(label="Redo", accelerator="Ctrl+Y", state=tk.DISABLED)
|
||||
menu.add_separator()
|
||||
|
@ -94,9 +95,6 @@ class Menubar(tk.Menu):
|
|||
menu.add_separator()
|
||||
menu.add_command(label="Find...", accelerator="Ctrl+F", state=tk.DISABLED)
|
||||
menu.add_command(label="Clear marker", state=tk.DISABLED)
|
||||
menu.add_command(
|
||||
label="Preferences...", command=self.menuaction.gui_preferences
|
||||
)
|
||||
self.add_cascade(label="Edit", menu=menu)
|
||||
|
||||
def draw_canvas_menu(self):
|
||||
|
@ -436,16 +434,14 @@ class Menubar(tk.Menu):
|
|||
"""
|
||||
menu = tk.Menu(self)
|
||||
menu.add_command(
|
||||
label="Change sessions...",
|
||||
command=self.menuaction.session_change_sessions,
|
||||
underline=0,
|
||||
label="Sessions...", command=self.menuaction.session_change_sessions
|
||||
)
|
||||
menu.add_separator()
|
||||
menu.add_command(label="Comments...", state=tk.DISABLED)
|
||||
menu.add_command(label="Hooks...", command=self.menuaction.session_hooks)
|
||||
menu.add_command(label="Reset node positions", state=tk.DISABLED)
|
||||
menu.add_command(label="Servers...", command=self.menuaction.session_servers)
|
||||
menu.add_command(label="Options...", command=self.menuaction.session_options)
|
||||
menu.add_command(label="Servers...", command=self.menuaction.session_servers)
|
||||
menu.add_command(label="Hooks...", command=self.menuaction.session_hooks)
|
||||
menu.add_command(label="Reset Nodes", state=tk.DISABLED)
|
||||
menu.add_command(label="Comments...", state=tk.DISABLED)
|
||||
self.add_cascade(label="Session", menu=menu)
|
||||
|
||||
def draw_help_menu(self):
|
||||
|
|
|
@ -13,18 +13,16 @@ class NodeDraw:
|
|||
self.image_file = None
|
||||
self.node_type = None
|
||||
self.model = None
|
||||
self.tooltip = None
|
||||
self.services = set()
|
||||
|
||||
@classmethod
|
||||
def from_setup(cls, image_enum, node_type, model=None, tooltip=None):
|
||||
def from_setup(cls, image_enum, node_type, label, model=None, tooltip=None):
|
||||
node_draw = NodeDraw()
|
||||
node_draw.image_enum = image_enum
|
||||
node_draw.image = Images.get(image_enum, ICON_SIZE)
|
||||
node_draw.node_type = node_type
|
||||
node_draw.label = label
|
||||
node_draw.model = model
|
||||
if tooltip is None:
|
||||
tooltip = model
|
||||
node_draw.tooltip = tooltip
|
||||
return node_draw
|
||||
|
||||
|
@ -36,6 +34,7 @@ class NodeDraw:
|
|||
node_draw.image = Images.get_custom(image_file, ICON_SIZE)
|
||||
node_draw.node_type = NodeType.DEFAULT
|
||||
node_draw.services = services
|
||||
node_draw.label = name
|
||||
node_draw.model = name
|
||||
node_draw.tooltip = name
|
||||
return node_draw
|
||||
|
@ -81,29 +80,29 @@ class NodeUtils:
|
|||
@classmethod
|
||||
def setup(cls):
|
||||
nodes = [
|
||||
(ImageEnum.ROUTER, NodeType.DEFAULT, "router"),
|
||||
(ImageEnum.HOST, NodeType.DEFAULT, "host"),
|
||||
(ImageEnum.PC, NodeType.DEFAULT, "PC"),
|
||||
(ImageEnum.MDR, NodeType.DEFAULT, "mdr"),
|
||||
(ImageEnum.PROUTER, NodeType.DEFAULT, "prouter"),
|
||||
(ImageEnum.DOCKER, NodeType.DOCKER, "Docker"),
|
||||
(ImageEnum.LXC, NodeType.LXC, "LXC"),
|
||||
(ImageEnum.ROUTER, NodeType.DEFAULT, "Router", "router"),
|
||||
(ImageEnum.HOST, NodeType.DEFAULT, "Host", "host"),
|
||||
(ImageEnum.PC, NodeType.DEFAULT, "PC", "PC"),
|
||||
(ImageEnum.MDR, NodeType.DEFAULT, "MDR", "mdr"),
|
||||
(ImageEnum.PROUTER, NodeType.DEFAULT, "PRouter", "prouter"),
|
||||
(ImageEnum.DOCKER, NodeType.DOCKER, "Docker", None),
|
||||
(ImageEnum.LXC, NodeType.LXC, "LXC", None),
|
||||
]
|
||||
for image_enum, node_type, model in nodes:
|
||||
node_draw = NodeDraw.from_setup(image_enum, node_type, model)
|
||||
for image_enum, node_type, label, model in nodes:
|
||||
node_draw = NodeDraw.from_setup(image_enum, node_type, label, model)
|
||||
cls.NODES.append(node_draw)
|
||||
cls.NODE_ICONS[(node_type, model)] = node_draw.image
|
||||
|
||||
network_nodes = [
|
||||
(ImageEnum.HUB, NodeType.HUB, "ethernet hub"),
|
||||
(ImageEnum.SWITCH, NodeType.SWITCH, "ethernet switch"),
|
||||
(ImageEnum.WLAN, NodeType.WIRELESS_LAN, "wireless LAN"),
|
||||
(ImageEnum.HUB, NodeType.HUB, "Hub"),
|
||||
(ImageEnum.SWITCH, NodeType.SWITCH, "Switch"),
|
||||
(ImageEnum.WLAN, NodeType.WIRELESS_LAN, "WLAN"),
|
||||
(ImageEnum.EMANE, NodeType.EMANE, "EMANE"),
|
||||
(ImageEnum.RJ45, NodeType.RJ45, "rj45 physical interface tool"),
|
||||
(ImageEnum.TUNNEL, NodeType.TUNNEL, "tunnel tool"),
|
||||
(ImageEnum.RJ45, NodeType.RJ45, "RJ45"),
|
||||
(ImageEnum.TUNNEL, NodeType.TUNNEL, "Tunnel"),
|
||||
]
|
||||
for image_enum, node_type, tooltip in network_nodes:
|
||||
node_draw = NodeDraw.from_setup(image_enum, node_type, tooltip=tooltip)
|
||||
for image_enum, node_type, label in network_nodes:
|
||||
node_draw = NodeDraw.from_setup(image_enum, node_type, label)
|
||||
cls.NETWORK_NODES.append(node_draw)
|
||||
cls.NODE_ICONS[(node_type, None)] = node_draw.image
|
||||
cls.ANTENNA_ICON = Images.get(ImageEnum.ANTENNA, ANTENNA_SIZE)
|
||||
|
|
|
@ -1,13 +1,18 @@
|
|||
import logging
|
||||
import tkinter as tk
|
||||
|
||||
DARK = "black"
|
||||
THEME_DARK = "black"
|
||||
PADX = (0, 5)
|
||||
PADY = (0, 5)
|
||||
FRAME_PAD = 5
|
||||
DIALOG_PAD = 5
|
||||
|
||||
|
||||
class Styles:
|
||||
tooltip = "Tooltip.TLabel"
|
||||
tooltip_frame = "Tooltip.TFrame"
|
||||
service_checkbutton = "Service.TCheckbutton"
|
||||
picker_button = "Picker.TButton"
|
||||
|
||||
|
||||
class Colors:
|
||||
|
@ -27,7 +32,7 @@ class Colors:
|
|||
|
||||
def load(style):
|
||||
style.theme_create(
|
||||
DARK,
|
||||
THEME_DARK,
|
||||
"clam",
|
||||
{
|
||||
".": {
|
||||
|
@ -139,14 +144,22 @@ def update_bg(style, event):
|
|||
event.widget.config(background=bg)
|
||||
|
||||
|
||||
def update_menu(style, event):
|
||||
def theme_change_menu(style, event):
|
||||
if not isinstance(event.widget, tk.Menu):
|
||||
return
|
||||
update_menu(style, event.widget)
|
||||
|
||||
|
||||
def update_menu(style, widget):
|
||||
bg = style.lookup(".", "background")
|
||||
fg = style.lookup(".", "foreground")
|
||||
abg = style.lookup(".", "lightcolor")
|
||||
if not abg:
|
||||
abg = bg
|
||||
event.widget.config(
|
||||
widget.config(
|
||||
background=bg, foreground=fg, activebackground=abg, activeforeground=fg
|
||||
)
|
||||
|
||||
|
||||
def theme_change(style, event):
|
||||
style.configure(Styles.picker_button, font=("TkDefaultFont", 8, "normal"))
|
||||
|
|
|
@ -3,6 +3,7 @@ import threading
|
|||
import tkinter as tk
|
||||
from functools import partial
|
||||
from tkinter import ttk
|
||||
from tkinter.font import Font
|
||||
|
||||
from coretk.dialogs.customnodes import CustomNodesDialog
|
||||
from coretk.graph import tags
|
||||
|
@ -10,13 +11,15 @@ from coretk.graph.enums import GraphMode
|
|||
from coretk.graph.shapeutils import ShapeType
|
||||
from coretk.images import ImageEnum, Images
|
||||
from coretk.nodeutils import NodeUtils
|
||||
from coretk.themes import Styles
|
||||
from coretk.tooltip import Tooltip
|
||||
|
||||
WIDTH = 32
|
||||
PICKER_SIZE = 24
|
||||
|
||||
|
||||
def icon(image_enum):
|
||||
return Images.get(image_enum, WIDTH)
|
||||
def icon(image_enum, width=WIDTH):
|
||||
return Images.get(image_enum, width)
|
||||
|
||||
|
||||
class Toolbar(ttk.Frame):
|
||||
|
@ -34,6 +37,9 @@ class Toolbar(ttk.Frame):
|
|||
self.app = app
|
||||
self.master = app.master
|
||||
|
||||
# picker data
|
||||
self.picker_font = Font(size=8)
|
||||
|
||||
# design buttons
|
||||
self.select_button = None
|
||||
self.link_button = None
|
||||
|
@ -140,9 +146,9 @@ class Toolbar(ttk.Frame):
|
|||
self.node_picker = ttk.Frame(self.master)
|
||||
# draw default nodes
|
||||
for node_draw in NodeUtils.NODES:
|
||||
image = icon(node_draw.image_enum)
|
||||
image = icon(node_draw.image_enum, PICKER_SIZE)
|
||||
func = partial(self.update_button, self.node_button, image, node_draw)
|
||||
self.create_picker_button(image, func, self.node_picker, node_draw.tooltip)
|
||||
self.create_picker_button(image, func, self.node_picker, node_draw.label)
|
||||
# draw custom nodes
|
||||
for name in sorted(self.app.core.custom_nodes):
|
||||
node_draw = self.app.core.custom_nodes[name]
|
||||
|
@ -152,7 +158,7 @@ class Toolbar(ttk.Frame):
|
|||
# draw edit node
|
||||
image = icon(ImageEnum.EDITNODE)
|
||||
self.create_picker_button(
|
||||
image, self.click_edit_node, self.node_picker, "custom nodes"
|
||||
image, self.click_edit_node, self.node_picker, "Custom"
|
||||
)
|
||||
self.design_select(self.node_button)
|
||||
self.node_button.after(
|
||||
|
@ -169,21 +175,22 @@ class Toolbar(ttk.Frame):
|
|||
self.wait_window(picker)
|
||||
self.app.unbind_all("<ButtonRelease-1>")
|
||||
|
||||
def create_picker_button(self, image, func, frame, tooltip):
|
||||
def create_picker_button(self, image, func, frame, label):
|
||||
"""
|
||||
Create button and put it on the frame
|
||||
|
||||
:param PIL.Image image: button image
|
||||
:param func: the command that is executed when button is clicked
|
||||
:param tkinter.Frame frame: frame that contains the button
|
||||
:param str tooltip: tooltip text
|
||||
:param str label: button label
|
||||
:return: nothing
|
||||
"""
|
||||
button = ttk.Button(frame, image=image)
|
||||
button = ttk.Button(
|
||||
frame, image=image, text=label, compound=tk.TOP, style=Styles.picker_button
|
||||
)
|
||||
button.image = image
|
||||
button.bind("<ButtonRelease-1>", lambda e: func())
|
||||
button.grid(pady=1)
|
||||
Tooltip(button, tooltip)
|
||||
|
||||
def create_button(self, frame, image, func, tooltip):
|
||||
button = ttk.Button(frame, image=image, command=func)
|
||||
|
@ -269,12 +276,12 @@ class Toolbar(ttk.Frame):
|
|||
self.hide_pickers()
|
||||
self.network_picker = ttk.Frame(self.master)
|
||||
for node_draw in NodeUtils.NETWORK_NODES:
|
||||
image = icon(node_draw.image_enum)
|
||||
image = icon(node_draw.image_enum, PICKER_SIZE)
|
||||
self.create_picker_button(
|
||||
image,
|
||||
partial(self.update_button, self.network_button, image, node_draw),
|
||||
self.network_picker,
|
||||
node_draw.tooltip,
|
||||
node_draw.label,
|
||||
)
|
||||
self.design_select(self.network_button)
|
||||
self.network_button.after(
|
||||
|
@ -311,7 +318,7 @@ class Toolbar(ttk.Frame):
|
|||
(ImageEnum.TEXT, ShapeType.TEXT),
|
||||
]
|
||||
for image_enum, shape_type in nodes:
|
||||
image = icon(image_enum)
|
||||
image = icon(image_enum, PICKER_SIZE)
|
||||
self.create_picker_button(
|
||||
image,
|
||||
partial(self.update_annotation, image, shape_type),
|
||||
|
|
|
@ -5,6 +5,7 @@ from tkinter import filedialog, font, ttk
|
|||
from tkinter.scrolledtext import ScrolledText
|
||||
|
||||
from core.api.grpc import core_pb2
|
||||
from coretk.themes import FRAME_PAD, PADX, PADY
|
||||
|
||||
INT_TYPES = {
|
||||
core_pb2.ConfigOptionType.UINT8,
|
||||
|
@ -16,7 +17,6 @@ INT_TYPES = {
|
|||
core_pb2.ConfigOptionType.INT32,
|
||||
core_pb2.ConfigOptionType.INT64,
|
||||
}
|
||||
PAD = 5
|
||||
|
||||
|
||||
def file_button_click(value):
|
||||
|
@ -65,14 +65,12 @@ class FrameScroll(ttk.LabelFrame):
|
|||
|
||||
class ConfigFrame(FrameScroll):
|
||||
def __init__(self, master, app, config, **kw):
|
||||
super().__init__(master, app, ttk.Notebook, **kw)
|
||||
super().__init__(master, app, ttk.Notebook, borderwidth=0, **kw)
|
||||
self.app = app
|
||||
self.config = config
|
||||
self.values = {}
|
||||
|
||||
def draw_config(self):
|
||||
padx = 2
|
||||
pady = 2
|
||||
group_mapping = {}
|
||||
for key in self.config:
|
||||
option = self.config[key]
|
||||
|
@ -81,19 +79,19 @@ class ConfigFrame(FrameScroll):
|
|||
|
||||
for group_name in sorted(group_mapping):
|
||||
group = group_mapping[group_name]
|
||||
frame = ttk.Frame(self.frame, padding=PAD)
|
||||
frame = ttk.Frame(self.frame, padding=FRAME_PAD)
|
||||
frame.columnconfigure(1, weight=1)
|
||||
self.frame.add(frame, text=group_name)
|
||||
for index, option in enumerate(sorted(group, key=lambda x: x.name)):
|
||||
label = ttk.Label(frame, text=option.label)
|
||||
label.grid(row=index, pady=pady, padx=padx, sticky="w")
|
||||
label.grid(row=index, pady=PADY, padx=PADX, sticky="w")
|
||||
value = tk.StringVar()
|
||||
if option.type == core_pb2.ConfigOptionType.BOOL:
|
||||
select = tuple(option.select)
|
||||
combobox = ttk.Combobox(
|
||||
frame, textvariable=value, values=select, state="readonly"
|
||||
)
|
||||
combobox.grid(row=index, column=1, sticky="ew", pady=pady)
|
||||
combobox.grid(row=index, column=1, sticky="ew")
|
||||
if option.value == "1":
|
||||
value.set("On")
|
||||
else:
|
||||
|
@ -104,15 +102,15 @@ class ConfigFrame(FrameScroll):
|
|||
combobox = ttk.Combobox(
|
||||
frame, textvariable=value, values=select, state="readonly"
|
||||
)
|
||||
combobox.grid(row=index, column=1, sticky="ew", pady=pady)
|
||||
combobox.grid(row=index, column=1, sticky="ew")
|
||||
elif option.type == core_pb2.ConfigOptionType.STRING:
|
||||
value.set(option.value)
|
||||
if "file" in option.label:
|
||||
file_frame = ttk.Frame(frame)
|
||||
file_frame.grid(row=index, column=1, sticky="ew", pady=pady)
|
||||
file_frame.grid(row=index, column=1, sticky="ew")
|
||||
file_frame.columnconfigure(0, weight=1)
|
||||
entry = ttk.Entry(file_frame, textvariable=value)
|
||||
entry.grid(row=0, column=0, sticky="ew", padx=padx)
|
||||
entry.grid(row=0, column=0, sticky="ew", padx=PADX)
|
||||
func = partial(file_button_click, value)
|
||||
button = ttk.Button(file_frame, text="...", command=func)
|
||||
button.grid(row=0, column=1)
|
||||
|
@ -124,10 +122,10 @@ class ConfigFrame(FrameScroll):
|
|||
validate="key",
|
||||
validatecommand=(self.app.validation.ip4, "%P"),
|
||||
)
|
||||
entry.grid(row=index, column=1, sticky="ew", pady=pady)
|
||||
entry.grid(row=index, column=1, sticky="ew")
|
||||
else:
|
||||
entry = ttk.Entry(frame, textvariable=value)
|
||||
entry.grid(row=index, column=1, sticky="ew", pady=pady)
|
||||
entry.grid(row=index, column=1, sticky="ew")
|
||||
|
||||
elif option.type in INT_TYPES:
|
||||
value.set(option.value)
|
||||
|
@ -141,7 +139,7 @@ class ConfigFrame(FrameScroll):
|
|||
"<FocusOut>",
|
||||
lambda event: self.app.validation.focus_out(event, "0"),
|
||||
)
|
||||
entry.grid(row=index, column=1, sticky="ew", pady=pady)
|
||||
entry.grid(row=index, column=1, sticky="ew")
|
||||
elif option.type == core_pb2.ConfigOptionType.FLOAT:
|
||||
value.set(option.value)
|
||||
entry = ttk.Entry(
|
||||
|
@ -154,7 +152,7 @@ class ConfigFrame(FrameScroll):
|
|||
"<FocusOut>",
|
||||
lambda event: self.app.validation.focus_out(event, "0"),
|
||||
)
|
||||
entry.grid(row=index, column=1, sticky="ew", pady=pady)
|
||||
entry.grid(row=index, column=1, sticky="ew")
|
||||
else:
|
||||
logging.error("unhandled config option type: %s", option.type)
|
||||
self.values[option.name] = value
|
||||
|
|
Loading…
Reference in a new issue