insert default value to some entry when entry is empty

This commit is contained in:
Huy Pham 2019-12-10 13:23:03 -08:00
parent 2292001e17
commit c4a117a236
8 changed files with 61 additions and 53 deletions

View file

@ -70,8 +70,6 @@ class CoreClient:
# helpers # helpers
self.interface_to_edge = {} self.interface_to_edge = {}
self.interfaces_manager = InterfaceManager(self.app) self.interfaces_manager = InterfaceManager(self.app)
self.created_nodes = set()
self.created_links = set()
# session data # session data
self.state = None self.state = None
@ -90,8 +88,6 @@ class CoreClient:
def reset(self): def reset(self):
# helpers # helpers
self.created_nodes.clear()
self.created_links.clear()
self.interfaces_manager.reset() self.interfaces_manager.reset()
self.interface_to_edge.clear() self.interface_to_edge.clear()
# session data # session data
@ -181,7 +177,6 @@ class CoreClient:
canvas_node.move(x, y, update=False) canvas_node.move(x, y, update=False)
def handle_throughputs(self, event): def handle_throughputs(self, event):
# print(event.interface_throughputs)
if self.throughput: if self.throughput:
self.app.canvas.throughput_draw.process_grpc_throughput_event( self.app.canvas.throughput_draw.process_grpc_throughput_event(
event.interface_throughputs event.interface_throughputs
@ -243,8 +238,6 @@ class CoreClient:
# save and retrieve data, needed for session nodes # save and retrieve data, needed for session nodes
for node in session.nodes: for node in session.nodes:
# get node service config and file config # get node service config and file config
self.created_nodes.add(node.id)
# get wlan configs for wlan nodes # get wlan configs for wlan nodes
if node.type == core_pb2.NodeType.WIRELESS_LAN: if node.type == core_pb2.NodeType.WIRELESS_LAN:
response = self.client.get_wlan_config(self.session_id, node.id) response = self.client.get_wlan_config(self.session_id, node.id)
@ -435,8 +428,6 @@ class CoreClient:
hooks = list(self.hooks.values()) hooks = list(self.hooks.values())
service_configs = self.get_service_config_proto() service_configs = self.get_service_config_proto()
file_configs = self.get_service_file_config_proto() file_configs = self.get_service_file_config_proto()
self.created_links.clear()
self.created_nodes.clear()
if self.emane_config: if self.emane_config:
emane_config = {x: self.emane_config[x].value for x in self.emane_config} emane_config = {x: self.emane_config[x].value for x in self.emane_config}
else: else:
@ -585,31 +576,20 @@ class CoreClient:
self.session_id, core_pb2.SessionState.DEFINITION self.session_id, core_pb2.SessionState.DEFINITION
) )
# temp
self.client.set_session_state(self.session_id, core_pb2.SessionState.DEFINITION) self.client.set_session_state(self.session_id, core_pb2.SessionState.DEFINITION)
for node_proto in node_protos: for node_proto in node_protos:
if node_proto.id not in self.created_nodes or True: response = self.client.add_node(self.session_id, node_proto)
response = self.client.add_node(self.session_id, node_proto) logging.debug("create node: %s", response)
logging.debug("create node: %s", response)
self.created_nodes.add(node_proto.id)
for link_proto in link_protos: for link_proto in link_protos:
if ( response = self.client.add_link(
tuple([link_proto.node_one_id, link_proto.node_two_id]) self.session_id,
not in self.created_links link_proto.node_one_id,
or True link_proto.node_two_id,
): link_proto.interface_one,
response = self.client.add_link( link_proto.interface_two,
self.session_id, link_proto.options,
link_proto.node_one_id, )
link_proto.node_two_id, logging.debug("create link: %s", response)
link_proto.interface_one,
link_proto.interface_two,
link_proto.options,
)
logging.debug("create link: %s", response)
self.created_links.add(
tuple([link_proto.node_one_id, link_proto.node_two_id])
)
def close(self): def close(self):
""" """

View file

@ -66,7 +66,7 @@ class SizeAndScaleDialog(Dialog):
validate="key", validate="key",
validatecommand=(self.validation.positive_int, "%P"), validatecommand=(self.validation.positive_int, "%P"),
) )
entry.bind("<FocusOut>", self.validation.focus_out) 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=PAD)
label = ttk.Label(frame, text="x Height") 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=PAD)
@ -76,7 +76,7 @@ class SizeAndScaleDialog(Dialog):
validate="key", validate="key",
validatecommand=(self.validation.positive_int, "%P"), validatecommand=(self.validation.positive_int, "%P"),
) )
entry.bind("<FocusOut>", self.validation.focus_out) 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=PAD)
label = ttk.Label(frame, text="Pixels") label = ttk.Label(frame, text="Pixels")
label.grid(row=0, column=4, sticky="w") label.grid(row=0, column=4, sticky="w")
@ -94,7 +94,7 @@ class SizeAndScaleDialog(Dialog):
validate="key", validate="key",
validatecommand=(self.validation.positive_float, "%P"), validatecommand=(self.validation.positive_float, "%P"),
) )
entry.bind("<FocusOut>", self.validation.focus_out) 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=PAD)
label = ttk.Label(frame, text="x Height") 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=PAD)
@ -104,7 +104,7 @@ class SizeAndScaleDialog(Dialog):
validate="key", validate="key",
validatecommand=(self.validation.positive_float, "%P"), validatecommand=(self.validation.positive_float, "%P"),
) )
entry.bind("<FocusOut>", self.validation.focus_out) 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=PAD)
label = ttk.Label(frame, text="Meters") label = ttk.Label(frame, text="Meters")
label.grid(row=0, column=4, sticky="w") label.grid(row=0, column=4, sticky="w")
@ -125,7 +125,7 @@ class SizeAndScaleDialog(Dialog):
validate="key", validate="key",
validatecommand=(self.validation.positive_float, "%P"), validatecommand=(self.validation.positive_float, "%P"),
) )
entry.bind("<FocusOut>", self.validation.focus_out) 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=PAD)
label = ttk.Label(frame, text="Meters") label = ttk.Label(frame, text="Meters")
label.grid(row=0, column=2, sticky="w") label.grid(row=0, column=2, sticky="w")
@ -153,7 +153,7 @@ class SizeAndScaleDialog(Dialog):
validate="key", validate="key",
validatecommand=(self.validation.positive_float, "%P"), validatecommand=(self.validation.positive_float, "%P"),
) )
entry.bind("<FocusOut>", self.validation.focus_out) 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=PAD)
label = ttk.Label(frame, text="Y") label = ttk.Label(frame, text="Y")
@ -164,7 +164,7 @@ class SizeAndScaleDialog(Dialog):
validate="key", validate="key",
validatecommand=(self.validation.positive_float, "%P"), validatecommand=(self.validation.positive_float, "%P"),
) )
entry.bind("<FocusOut>", self.validation.focus_out) 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=PAD)
label = ttk.Label(label_frame, text="Translates To") label = ttk.Label(label_frame, text="Translates To")
@ -184,7 +184,7 @@ class SizeAndScaleDialog(Dialog):
validate="key", validate="key",
validatecommand=(self.validation.positive_float, "%P"), validatecommand=(self.validation.positive_float, "%P"),
) )
entry.bind("<FocusOut>", self.validation.focus_out) 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=PAD)
label = ttk.Label(frame, text="Lon") label = ttk.Label(frame, text="Lon")
@ -195,7 +195,7 @@ class SizeAndScaleDialog(Dialog):
validate="key", validate="key",
validatecommand=(self.validation.positive_float, "%P"), validatecommand=(self.validation.positive_float, "%P"),
) )
entry.bind("<FocusOut>", self.validation.focus_out) 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=PAD)
label = ttk.Label(frame, text="Alt") label = ttk.Label(frame, text="Alt")
@ -206,7 +206,7 @@ class SizeAndScaleDialog(Dialog):
validate="key", validate="key",
validatecommand=(self.validation.positive_float, "%P"), validatecommand=(self.validation.positive_float, "%P"),
) )
entry.bind("<FocusOut>", self.validation.focus_out) entry.bind("<FocusOut>", lambda event: self.validation.focus_out(event, "0"))
entry.grid(row=0, column=5, sticky="ew") entry.grid(row=0, column=5, sticky="ew")
def draw_save_as_default(self): def draw_save_as_default(self):

View file

@ -75,7 +75,9 @@ class NodeConfigDialog(Dialog):
validate="key", validate="key",
validatecommand=(self.app.validation.name, "%P"), validatecommand=(self.app.validation.name, "%P"),
) )
entry.bind("<FocusOut>", self.app.validation.name_focus_out) entry.bind(
"<FocusOut>", lambda event: self.app.validation.focus_out(event, "noname")
)
entry.grid(row=row, column=1, sticky="ew") entry.grid(row=row, column=1, sticky="ew")
row += 1 row += 1
@ -165,12 +167,14 @@ class NodeConfigDialog(Dialog):
label.grid(row=1, column=0, padx=PAD, pady=PAD) label.grid(row=1, column=0, padx=PAD, pady=PAD)
ip4 = tk.StringVar(value=f"{interface.ip4}/{interface.ip4mask}") ip4 = tk.StringVar(value=f"{interface.ip4}/{interface.ip4mask}")
entry = ttk.Entry(frame, textvariable=ip4) 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") entry.grid(row=1, column=1, columnspan=2, sticky="ew")
label = ttk.Label(frame, text="IPv6") label = ttk.Label(frame, text="IPv6")
label.grid(row=2, column=0, padx=PAD, pady=PAD) label.grid(row=2, column=0, padx=PAD, pady=PAD)
ip6 = tk.StringVar(value=f"{interface.ip6}/{interface.ip6mask}") ip6 = tk.StringVar(value=f"{interface.ip6}/{interface.ip6mask}")
entry = ttk.Entry(frame, textvariable=ip6) entry = ttk.Entry(frame, textvariable=ip6)
entry.bind("<FocusOut>", self.app.validation.ip_focus_out)
entry.grid(row=2, column=1, columnspan=2, sticky="ew") entry.grid(row=2, column=1, columnspan=2, sticky="ew")
self.interfaces[interface.id] = InterfaceData(is_auto, mac, ip4, ip6) self.interfaces[interface.id] = InterfaceData(is_auto, mac, ip4, ip6)

View file

@ -72,7 +72,15 @@ class ServersDialog(Dialog):
label = ttk.Label(frame, text="Port") label = ttk.Label(frame, text="Port")
label.grid(row=0, column=4, sticky="w") label.grid(row=0, column=4, sticky="w")
entry = ttk.Entry(frame, textvariable=self.port) entry = ttk.Entry(
frame,
textvariable=self.port,
validate="key",
validatecommand=(self.app.validation.positive_int, "%P"),
)
entry.bind(
"<FocusOut>", lambda event: self.app.validation.focus_out(event, "50051")
)
entry.grid(row=0, column=5, sticky="ew") entry.grid(row=0, column=5, sticky="ew")
def draw_servers_buttons(self): def draw_servers_buttons(self):

View file

@ -51,7 +51,6 @@ class ServiceConfiguration(Dialog):
def load(self): def load(self):
try: try:
# create nodes and links in definition state for getting and setting service file
self.app.core.create_nodes_and_links() self.app.core.create_nodes_and_links()
service_configs = self.app.core.service_configs service_configs = self.app.core.service_configs
if ( if (

View file

@ -8,6 +8,7 @@ from core.api.grpc.core_pb2 import NodeType
from coretk.dialogs.emaneconfig import EmaneConfigDialog from coretk.dialogs.emaneconfig import EmaneConfigDialog
from coretk.dialogs.mobilityconfig import MobilityConfigDialog from coretk.dialogs.mobilityconfig import MobilityConfigDialog
from coretk.dialogs.nodeconfig import NodeConfigDialog from coretk.dialogs.nodeconfig import NodeConfigDialog
from coretk.dialogs.nodeservice import NodeService
from coretk.dialogs.wlanconfig import WlanConfigDialog from coretk.dialogs.wlanconfig import WlanConfigDialog
from coretk.errors import show_grpc_error from coretk.errors import show_grpc_error
from coretk.graph import tags from coretk.graph import tags
@ -217,7 +218,7 @@ class CanvasNode:
else: else:
context.add_command(label="Configure", command=self.show_config) context.add_command(label="Configure", command=self.show_config)
if NodeUtils.is_container_node(self.core_node.type): if NodeUtils.is_container_node(self.core_node.type):
context.add_command(label="Services", state=tk.DISABLED) context.add_command(label="Services", command=self.show_services)
if is_emane: if is_emane:
context.add_command( context.add_command(
label="EMANE Config", command=self.show_emane_config label="EMANE Config", command=self.show_emane_config
@ -268,3 +269,8 @@ class CanvasNode:
self.canvas.context = None self.canvas.context = None
dialog = EmaneConfigDialog(self.app, self.app, self) dialog = EmaneConfigDialog(self.app, self.app, self)
dialog.show() dialog.show()
def show_services(self):
self.canvas.context = None
dialog = NodeService(self.app.master, self.app, self)
dialog.show()

View file

@ -4,6 +4,9 @@ input validation
import logging import logging
import tkinter as tk import tkinter as tk
import netaddr
from netaddr import IPNetwork
class InputValidation: class InputValidation:
def __init__(self, app): def __init__(self, app):
@ -18,16 +21,18 @@ class InputValidation:
self.positive_float = self.master.register(self.check_positive_float) self.positive_float = self.master.register(self.check_positive_float)
self.name = self.master.register(self.check_node_name) self.name = self.master.register(self.check_node_name)
def focus_out(self, event): def ip_focus_out(self, event):
value = event.widget.get() value = event.widget.get()
if value == "": try:
event.widget.insert(tk.END, 0) IPNetwork(value)
except netaddr.core.AddrFormatError:
event.widget.delete(0, tk.END)
event.widget.insert(tk.END, "invalid")
def name_focus_out(self, event): def focus_out(self, event, default):
logging.debug("name focus out")
value = event.widget.get() value = event.widget.get()
if value == "": if value == "":
event.widget.insert(tk.END, "empty") event.widget.insert(tk.END, default)
def check_positive_int(self, s): def check_positive_int(self, s):
logging.debug("int validation...") logging.debug("int validation...")

View file

@ -127,7 +127,10 @@ class ConfigFrame(FrameScroll):
validate="key", validate="key",
validatecommand=(self.app.validation.positive_int, "%P"), validatecommand=(self.app.validation.positive_int, "%P"),
) )
entry.bind("<FocusOut>", self.app.validation.focus_out) entry.bind(
"<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", pady=pady)
elif option.type == core_pb2.ConfigOptionType.FLOAT: elif option.type == core_pb2.ConfigOptionType.FLOAT:
value.set(option.value) value.set(option.value)
@ -137,7 +140,10 @@ class ConfigFrame(FrameScroll):
validate="key", validate="key",
validatecommand=(self.app.validation.positive_float, "%P"), validatecommand=(self.app.validation.positive_float, "%P"),
) )
entry.bind("<FocusOut>", self.app.validation.focus_out) entry.bind(
"<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", pady=pady)
else: else:
logging.error("unhandled config option type: %s", option.type) logging.error("unhandled config option type: %s", option.type)