some refactoring for menubar code

This commit is contained in:
bharnden 2019-11-07 21:46:40 -08:00
parent be36940bd1
commit 99678499ce
4 changed files with 115 additions and 286 deletions

View file

@ -3,10 +3,10 @@ import tkinter as tk
from coretk import appdirs from coretk import appdirs
from coretk.coreclient import CoreClient from coretk.coreclient import CoreClient
from coretk.coremenubar import CoreMenubar
from coretk.graph import CanvasGraph from coretk.graph import CanvasGraph
from coretk.images import ImageEnum, Images from coretk.images import ImageEnum, Images
from coretk.menuaction import MenuAction from coretk.menuaction import MenuAction
from coretk.menubar import Menubar
from coretk.toolbar import Toolbar from coretk.toolbar import Toolbar
@ -15,9 +15,9 @@ class Application(tk.Frame):
super().__init__(master) super().__init__(master)
Images.load_all() Images.load_all()
self.menubar = None self.menubar = None
self.core_menu = None
self.canvas = None
self.toolbar = None self.toolbar = None
self.canvas = None
self.statusbar = None
self.is_open_xml = False self.is_open_xml = False
self.size_and_scale = None self.size_and_scale = None
self.set_wallpaper = None self.set_wallpaper = None
@ -41,29 +41,18 @@ class Application(tk.Frame):
self.pack(fill=tk.BOTH, expand=True) self.pack(fill=tk.BOTH, expand=True)
def draw(self): def draw(self):
self.draw_menu()
self.draw_toolbar()
self.draw_canvas()
def draw_menu(self):
self.master.option_add("*tearOff", tk.FALSE) self.master.option_add("*tearOff", tk.FALSE)
self.menubar = tk.Menu(self.master) self.menubar = Menubar(self.master, self)
self.core_menu = CoreMenubar(self, self.master, self.menubar)
self.core_menu.create_core_menubar()
self.master.config(menu=self.menubar)
def draw_toolbar(self):
self.toolbar = Toolbar(self, self) self.toolbar = Toolbar(self, self)
self.toolbar.pack(side=tk.LEFT, fill=tk.Y, ipadx=2, ipady=2) self.toolbar.pack(side=tk.LEFT, fill=tk.Y, ipadx=2, ipady=2)
self.draw_canvas()
self.draw_status()
def draw_canvas(self): def draw_canvas(self):
self.canvas = CanvasGraph( self.canvas = CanvasGraph(
self, self.core, background="#cccccc", scrollregion=(0, 0, 1200, 1000) self, self.core, background="#cccccc", scrollregion=(0, 0, 1200, 1000)
) )
self.canvas.pack(fill=tk.BOTH, expand=True) self.canvas.pack(fill=tk.BOTH, expand=True)
self.toolbar.canvas = self.canvas
scroll_x = tk.Scrollbar( scroll_x = tk.Scrollbar(
self.canvas, orient=tk.HORIZONTAL, command=self.canvas.xview self.canvas, orient=tk.HORIZONTAL, command=self.canvas.xview
) )
@ -73,14 +62,15 @@ class Application(tk.Frame):
self.canvas.configure(xscrollcommand=scroll_x.set) self.canvas.configure(xscrollcommand=scroll_x.set)
self.canvas.configure(yscrollcommand=scroll_y.set) self.canvas.configure(yscrollcommand=scroll_y.set)
status_bar = tk.Frame(self) def draw_status(self):
status_bar.pack(side=tk.BOTTOM, fill=tk.X) self.statusbar = tk.Frame(self)
b = tk.Button(status_bar, text="Button 1") self.statusbar.pack(side=tk.BOTTOM, fill=tk.X)
b.pack(side=tk.LEFT, padx=1) button = tk.Button(self.statusbar, text="Button 1")
b = tk.Button(status_bar, text="Button 2") button.pack(side=tk.LEFT, padx=1)
b.pack(side=tk.LEFT, padx=1) button = tk.Button(self.statusbar, text="Button 2")
b = tk.Button(status_bar, text="Button 3") button.pack(side=tk.LEFT, padx=1)
b.pack(side=tk.LEFT, padx=1) button = tk.Button(self.statusbar, text="Button 3")
button.pack(side=tk.LEFT, padx=1)
def on_closing(self): def on_closing(self):
menu_action = MenuAction(self, self.master) menu_action = MenuAction(self, self.master)

View file

@ -21,34 +21,14 @@ def sub_menu_items():
logging.debug("Click on sub menu items") logging.debug("Click on sub menu items")
def file_new(): def file_new(event=None):
logging.debug("Click file New") logging.debug("Click file New")
def file_new_shortcut(event):
logging.debug("Shortcut for file new shortcut")
def file_open():
logging.debug("Click file Open")
def file_open_shortcut(event):
logging.debug("Shortcut for file open")
def file_reload(): def file_reload():
logging.debug("Click file Reload") logging.debug("Click file Reload")
# def file_save():
# logging.debug("Click file save")
def file_save_shortcut(event):
logging.debug("Shortcut for file save")
def file_export_python_script(): def file_export_python_script():
logging.debug("Click file export python script") logging.debug("Click file export python script")
@ -73,70 +53,38 @@ def file_save_screenshot():
logging.debug("Click file save screenshot") logging.debug("Click file save screenshot")
def edit_undo(): def edit_undo(event=None):
logging.debug("Click edit undo") logging.debug("Click edit undo")
def edit_undo_shortcut(event): def edit_redo(event=None):
logging.debug("Shortcut for edit undo")
def edit_redo():
logging.debug("Click edit redo") logging.debug("Click edit redo")
def edit_redo_shortcut(event): def edit_cut(event=None):
logging.debug("Shortcut for edit redo")
def edit_cut():
logging.debug("Click edit cut") logging.debug("Click edit cut")
def edit_cut_shortcut(event): def edit_copy(event=None):
logging.debug("Shortcut for edit cut")
def edit_copy():
logging.debug("Click edit copy") logging.debug("Click edit copy")
def edit_copy_shortcut(event): def edit_paste(event=None):
logging.debug("Shortcut for edit copy")
def edit_paste():
logging.debug("Click edit paste") logging.debug("Click edit paste")
def edit_paste_shortcut(event): def edit_select_all(event=None):
logging.debug("Shortcut for edit paste")
def edit_select_all():
logging.debug("Click edit select all") logging.debug("Click edit select all")
def edit_select_all_shortcut(event): def edit_select_adjacent(event=None):
logging.debug("Shortcut for edit select all")
def edit_select_adjacent():
logging.debug("Click edit select adjacent") logging.debug("Click edit select adjacent")
def edit_select_adjacent_shortcut(event): def edit_find(event=None):
logging.debug("Shortcut for edit select adjacent")
def edit_find():
logging.debug("CLick edit find") logging.debug("CLick edit find")
def edit_find_shortcut(event):
logging.debug("Shortcut for edit find")
def edit_clear_marker(): def edit_clear_marker():
logging.debug("Click edit clear marker") logging.debug("Click edit clear marker")
@ -157,38 +105,22 @@ def canvas_delete():
logging.debug("Click canvas delete") logging.debug("Click canvas delete")
def canvas_previous(): def canvas_previous(event=None):
logging.debug("Click canvas previous") logging.debug("Click canvas previous")
def canvas_previous_shortcut(event): def canvas_next(event=None):
logging.debug("Shortcut for canvas previous")
def canvas_next():
logging.debug("Click canvas next") logging.debug("Click canvas next")
def canvas_next_shortcut(event): def canvas_first(event=None):
logging.debug("Shortcut for canvas next")
def canvas_first():
logging.debug("CLick canvas first") logging.debug("CLick canvas first")
def canvas_first_shortcut(event): def canvas_last(event=None):
logging.debug("Shortcut for canvas first")
def canvas_last():
logging.debug("CLick canvas last") logging.debug("CLick canvas last")
def canvas_last_shortcut(event):
logging.debug("Shortcut canvas last")
def view_show(): def view_show():
logging.debug("Click view show") logging.debug("Click view show")
@ -205,22 +137,14 @@ def view_3d_gui():
logging.debug("CLick view 3D GUI") logging.debug("CLick view 3D GUI")
def view_zoom_in(): def view_zoom_in(event=None):
logging.debug("Click view zoom in") logging.debug("Click view zoom in")
def view_zoom_in_shortcut(event): def view_zoom_out(event=None):
logging.debug("Shortcut view zoom in")
def view_zoom_out():
logging.debug("Click view zoom out") logging.debug("Click view zoom out")
def view_zoom_out_shortcut(event):
logging.debug("Shortcut view zoom out")
def tools_auto_rearrange_all(): def tools_auto_rearrange_all():
logging.debug("Click tools, auto rearrange all") logging.debug("Click tools, auto rearrange all")
@ -343,7 +267,7 @@ class MenuAction:
self.prompt_save_running_session() self.prompt_save_running_session()
self.app.quit() self.app.quit()
def file_save_as_xml(self): def file_save_as_xml(self, event=None):
logging.info("menuaction.py file_save_as_xml()") logging.info("menuaction.py file_save_as_xml()")
file_path = filedialog.asksaveasfilename( file_path = filedialog.asksaveasfilename(
initialdir=str(XML_PATH), initialdir=str(XML_PATH),
@ -354,7 +278,7 @@ class MenuAction:
if file_path: if file_path:
self.app.core.save_xml(file_path) self.app.core.save_xml(file_path)
def file_open_xml(self): def file_open_xml(self, event=None):
logging.info("menuaction.py file_open_xml()") logging.info("menuaction.py file_open_xml()")
self.app.is_open_xml = True self.app.is_open_xml = True
file_path = filedialog.askopenfilename( file_path = filedialog.askopenfilename(

View file

@ -1,15 +1,14 @@
import tkinter as tk import tkinter as tk
import coretk.menuaction as action import coretk.menuaction as action
from coretk.menuaction import MenuAction
class CoreMenubar(object): class Menubar(tk.Menu):
""" """
Core menubar Core menubar
""" """
def __init__(self, app, master, menubar): def __init__(self, master, app, cnf={}, **kwargs):
""" """
Create a CoreMenubar instance Create a CoreMenubar instance
@ -17,63 +16,54 @@ class CoreMenubar(object):
:param tkinter.Menu menubar: menubar object :param tkinter.Menu menubar: menubar object
:param coretk.app.Application app: application object :param coretk.app.Application app: application object
""" """
self.menubar = menubar super().__init__(master, cnf, **kwargs)
self.master = master self.master.config(menu=self)
self.app = app self.app = app
self.menuaction = action.MenuAction(app, master) self.menuaction = action.MenuAction(app, master)
self.menu_action = MenuAction(self.app, self.master) self.draw()
# def on_quit(self): def draw(self):
# """ """
# Prompt use to stop running session before application is closed Create core menubar and bind the hot keys to their matching command
#
# :return: nothing
# """
# state = self.application.core_grpc.get_session_state()
#
# if state == core_pb2.SessionState.SHUTDOWN or state == core_pb2.SessionState.DEFINITION:
# self.application.core_grpc.delete_session()
# self.application.core_grpc.core.close()
# # self.application.quit()
# else:
# msgbox = tk.messagebox.askyesnocancel("stop", "Stop the running session?")
#
# if msgbox or msgbox == False:
# if msgbox:
# self.application.core_grpc.set_session_state("datacollect")
# self.application.core_grpc.delete_links()
# self.application.core_grpc.delete_nodes()
# self.application.core_grpc.delete_session()
#
# self.application.core_grpc.core.close()
# # self.application.quit()
def create_file_menu(self): :return: nothing
"""
self.draw_file_menu()
self.draw_edit_menu()
self.draw_canvas_menu()
self.draw_view_menu()
self.draw_tools_menu()
self.draw_widgets_menu()
self.draw_session_menu()
self.draw_help_menu()
def draw_file_menu(self):
""" """
Create file menu Create file menu
:return: nothing :return: nothing
""" """
file_menu = tk.Menu(self.menubar) file_menu = tk.Menu(self)
# menu_action = MenuAction(self.application, self.master)
file_menu.add_command( file_menu.add_command(
label="New", command=action.file_new, accelerator="Ctrl+N", underline=0 label="New Session",
command=action.file_new,
accelerator="Ctrl+N",
underline=0,
) )
self.app.bind_all("<Control-n>", action.file_new)
file_menu.add_command( file_menu.add_command(
label="Open...", label="Open...",
command=self.menu_action.file_open_xml, command=self.menuaction.file_open_xml,
accelerator="Ctrl+O", accelerator="Ctrl+O",
underline=0, underline=0,
) )
self.app.bind_all("<Control-o>", self.menuaction.file_open_xml)
file_menu.add_command(label="Reload", command=action.file_reload, underline=0) file_menu.add_command(label="Reload", command=action.file_reload, underline=0)
# file_menu.add_command( file_menu.add_command(
# label="Save", command=action.file_save, accelerator="Ctrl+S", underline=0 label="Save", accelerator="Ctrl+S", command=self.menuaction.file_save_as_xml
# ) )
# file_menu.add_command(label="Save As XML...", command=action.file_save_as_xml) self.app.bind_all("<Control-s>", self.menuaction.file_save_as_xml)
file_menu.add_command(label="Save", command=self.menu_action.file_save_as_xml)
file_menu.add_separator() file_menu.add_separator()
file_menu.add_command( file_menu.add_command(
label="Export Python script...", command=action.file_export_python_script label="Export Python script...", command=action.file_export_python_script
) )
@ -85,9 +75,7 @@ class CoreMenubar(object):
label="Execute Python script with options...", label="Execute Python script with options...",
command=action.file_execute_python_script_with_options, command=action.file_execute_python_script_with_options,
) )
file_menu.add_separator() file_menu.add_separator()
file_menu.add_command( file_menu.add_command(
label="Open current file in editor...", label="Open current file in editor...",
command=action.file_open_current_file_in_editor, command=action.file_open_current_file_in_editor,
@ -96,97 +84,95 @@ class CoreMenubar(object):
file_menu.add_command( file_menu.add_command(
label="Save screenshot...", command=action.file_save_screenshot label="Save screenshot...", command=action.file_save_screenshot
) )
file_menu.add_separator() file_menu.add_separator()
file_menu.add_command( file_menu.add_command(
label="Quit", command=self.menuaction.on_quit, underline=0 label="Quit", command=self.menuaction.on_quit, underline=0
) )
self.menubar.add_cascade(label="File", menu=file_menu, underline=0) self.add_cascade(label="File", menu=file_menu, underline=0)
def create_edit_menu(self): def draw_edit_menu(self):
""" """
Create edit menu Create edit menu
:return: nothing :return: nothing
""" """
edit_menu = tk.Menu(self.menubar) edit_menu = tk.Menu(self)
edit_menu.add_command( edit_menu.add_command(
label="Undo", command=action.edit_undo, accelerator="Ctrl+Z", underline=0 label="Undo", command=action.edit_undo, accelerator="Ctrl+Z", underline=0
) )
self.app.bind_all("<Control-z>", action.edit_undo)
edit_menu.add_command( edit_menu.add_command(
label="Redo", command=action.edit_redo, accelerator="Ctrl+Y", underline=0 label="Redo", command=action.edit_redo, accelerator="Ctrl+Y", underline=0
) )
self.app.bind_all("<Control-y>", action.edit_redo)
edit_menu.add_separator() edit_menu.add_separator()
edit_menu.add_command( edit_menu.add_command(
label="Cut", command=action.edit_cut, accelerator="Ctrl+X", underline=0 label="Cut", command=action.edit_cut, accelerator="Ctrl+X", underline=0
) )
self.app.bind_all("<Control-x>", action.edit_cut)
edit_menu.add_command( edit_menu.add_command(
label="Copy", command=action.edit_copy, accelerator="Ctrl+C", underline=0 label="Copy", command=action.edit_copy, accelerator="Ctrl+C", underline=0
) )
self.app.bind_all("<Control-c>", action.edit_copy)
edit_menu.add_command( edit_menu.add_command(
label="Paste", command=action.edit_paste, accelerator="Ctrl+V", underline=0 label="Paste", command=action.edit_paste, accelerator="Ctrl+V", underline=0
) )
self.app.bind_all("<Control-v>", action.edit_paste)
edit_menu.add_separator() edit_menu.add_separator()
edit_menu.add_command( edit_menu.add_command(
label="Select all", command=action.edit_select_all, accelerator="Ctrl+A" label="Select all", command=action.edit_select_all, accelerator="Ctrl+A"
) )
self.app.bind_all("<Control-a>", action.edit_select_all)
edit_menu.add_command( edit_menu.add_command(
label="Select Adjacent", label="Select Adjacent",
command=action.edit_select_adjacent, command=action.edit_select_adjacent,
accelerator="Ctrl+J", accelerator="Ctrl+J",
) )
self.app.bind_all("<Control-j>", action.edit_select_adjacent)
edit_menu.add_separator() edit_menu.add_separator()
edit_menu.add_command( edit_menu.add_command(
label="Find...", command=action.edit_find, accelerator="Ctrl+F", underline=0 label="Find...", command=action.edit_find, accelerator="Ctrl+F", underline=0
) )
self.app.bind_all("<Control-f>", action.edit_find)
edit_menu.add_command(label="Clear marker", command=action.edit_clear_marker) edit_menu.add_command(label="Clear marker", command=action.edit_clear_marker)
edit_menu.add_command(label="Preferences...", command=action.edit_preferences) edit_menu.add_command(label="Preferences...", command=action.edit_preferences)
self.add_cascade(label="Edit", menu=edit_menu, underline=0)
self.menubar.add_cascade(label="Edit", menu=edit_menu, underline=0) def draw_canvas_menu(self):
def create_canvas_menu(self):
""" """
Create canvas menu Create canvas menu
:return: nothing :return: nothing
""" """
canvas_menu = tk.Menu(self.menubar) canvas_menu = tk.Menu(self)
canvas_menu.add_command(label="New", command=action.canvas_new) canvas_menu.add_command(label="New", command=action.canvas_new)
canvas_menu.add_command(label="Manage...", command=action.canvas_manage) canvas_menu.add_command(label="Manage...", command=action.canvas_manage)
canvas_menu.add_command(label="Delete", command=action.canvas_delete) canvas_menu.add_command(label="Delete", command=action.canvas_delete)
canvas_menu.add_separator() canvas_menu.add_separator()
canvas_menu.add_command( canvas_menu.add_command(
label="Size/scale...", command=self.menu_action.canvas_size_and_scale label="Size/scale...", command=self.menuaction.canvas_size_and_scale
) )
canvas_menu.add_command( canvas_menu.add_command(
label="Wallpaper...", command=self.menu_action.canvas_set_wallpaper label="Wallpaper...", command=self.menuaction.canvas_set_wallpaper
) )
canvas_menu.add_separator() canvas_menu.add_separator()
canvas_menu.add_command( canvas_menu.add_command(
label="Previous", command=action.canvas_previous, accelerator="PgUp" label="Previous", command=action.canvas_previous, accelerator="PgUp"
) )
self.app.bind_all("<Prior>", action.canvas_previous)
canvas_menu.add_command( canvas_menu.add_command(
label="Next", command=action.canvas_next, accelerator="PgDown" label="Next", command=action.canvas_next, accelerator="PgDown"
) )
self.app.bind_all("<Next>", action.canvas_next)
canvas_menu.add_command( canvas_menu.add_command(
label="First", command=action.canvas_first, accelerator="Home" label="First", command=action.canvas_first, accelerator="Home"
) )
self.app.bind_all("<Home>", action.canvas_first)
canvas_menu.add_command( canvas_menu.add_command(
label="Last", command=action.canvas_last, accelerator="End" label="Last", command=action.canvas_last, accelerator="End"
) )
self.app.bind_all("<End>", action.canvas_last)
self.menubar.add_cascade(label="Canvas", menu=canvas_menu, underline=0) self.add_cascade(label="Canvas", menu=canvas_menu, underline=0)
def create_show_menu(self, view_menu): def create_show_menu(self, view_menu):
""" """
@ -206,33 +192,31 @@ class CoreMenubar(object):
show_menu.add_command(label="Annotations", command=action.sub_menu_items) show_menu.add_command(label="Annotations", command=action.sub_menu_items)
show_menu.add_command(label="Grid", command=action.sub_menu_items) show_menu.add_command(label="Grid", command=action.sub_menu_items)
show_menu.add_command(label="API Messages", command=action.sub_menu_items) show_menu.add_command(label="API Messages", command=action.sub_menu_items)
view_menu.add_cascade(label="Show", menu=show_menu) view_menu.add_cascade(label="Show", menu=show_menu)
def create_view_menu(self): def draw_view_menu(self):
""" """
Create view menu Create view menu
:return: nothing :return: nothing
""" """
view_menu = tk.Menu(self.menubar) view_menu = tk.Menu(self)
self.create_show_menu(view_menu) self.create_show_menu(view_menu)
view_menu.add_command( view_menu.add_command(
label="Show hidden nodes", command=action.view_show_hidden_nodes label="Show hidden nodes", command=action.view_show_hidden_nodes
) )
view_menu.add_command(label="Locked", command=action.view_locked) view_menu.add_command(label="Locked", command=action.view_locked)
view_menu.add_command(label="3D GUI...", command=action.view_3d_gui) view_menu.add_command(label="3D GUI...", command=action.view_3d_gui)
view_menu.add_separator() view_menu.add_separator()
view_menu.add_command( view_menu.add_command(
label="Zoom in", command=action.view_zoom_in, accelerator="+" label="Zoom in", command=action.view_zoom_in, accelerator="+"
) )
self.app.bind_all("<Control-Shift-plus>", action.view_zoom_in)
view_menu.add_command( view_menu.add_command(
label="Zoom out", command=action.view_zoom_out, accelerator="-" label="Zoom out", command=action.view_zoom_out, accelerator="-"
) )
self.app.bind_all("<Control-minus>", action.view_zoom_out)
self.menubar.add_cascade(label="View", menu=view_menu, underline=0) self.add_cascade(label="View", menu=view_menu, underline=0)
def create_experimental_menu(self, tools_menu): def create_experimental_menu(self, tools_menu):
""" """
@ -251,7 +235,6 @@ class CoreMenubar(object):
experimental_menu.add_command( experimental_menu.add_command(
label="Topology partitioning...", command=action.sub_menu_items label="Topology partitioning...", command=action.sub_menu_items
) )
tools_menu.add_cascade( tools_menu.add_cascade(
label="Experimental", menu=experimental_menu, underline=0 label="Experimental", menu=experimental_menu, underline=0
) )
@ -269,7 +252,6 @@ class CoreMenubar(object):
for i in nums: for i in nums:
the_label = "R(" + str(i) + ")" the_label = "R(" + str(i) + ")"
random_menu.add_command(label=the_label, command=action.sub_menu_items) random_menu.add_command(label=the_label, command=action.sub_menu_items)
topology_generator_menu.add_cascade( topology_generator_menu.add_cascade(
label="Random", menu=random_menu, underline=0 label="Random", menu=random_menu, underline=0
) )
@ -282,14 +264,11 @@ class CoreMenubar(object):
:return: nothing :return: nothing
""" """
grid_menu = tk.Menu(topology_generator_menu) grid_menu = tk.Menu(topology_generator_menu)
# list of number of nodes to create # list of number of nodes to create
nums = [1, 5, 10, 15, 20, 25, 30, 35, 40, 50, 60, 70, 80, 90, 100] nums = [1, 5, 10, 15, 20, 25, 30, 35, 40, 50, 60, 70, 80, 90, 100]
for i in nums: for i in nums:
the_label = "G(" + str(i) + ")" the_label = "G(" + str(i) + ")"
grid_menu.add_command(label=the_label, command=action.sub_menu_items) grid_menu.add_command(label=the_label, command=action.sub_menu_items)
topology_generator_menu.add_cascade(label="Grid", menu=grid_menu, underline=0) topology_generator_menu.add_cascade(label="Grid", menu=grid_menu, underline=0)
def create_connected_grid_menu(self, topology_generator_menu): def create_connected_grid_menu(self, topology_generator_menu):
@ -324,7 +303,6 @@ class CoreMenubar(object):
for i in nums: for i in nums:
the_label = "P(" + str(i) + ")" the_label = "P(" + str(i) + ")"
chain_menu.add_command(label=the_label, command=action.sub_menu_items) chain_menu.add_command(label=the_label, command=action.sub_menu_items)
topology_generator_menu.add_cascade(label="Chain", menu=chain_menu, underline=0) topology_generator_menu.add_cascade(label="Chain", menu=chain_menu, underline=0)
def create_star_menu(self, topology_generator_menu): def create_star_menu(self, topology_generator_menu):
@ -338,7 +316,6 @@ class CoreMenubar(object):
for i in range(3, 26, 1): for i in range(3, 26, 1):
the_label = "C(" + str(i) + ")" the_label = "C(" + str(i) + ")"
star_menu.add_command(label=the_label, command=action.sub_menu_items) star_menu.add_command(label=the_label, command=action.sub_menu_items)
topology_generator_menu.add_cascade(label="Star", menu=star_menu, underline=0) topology_generator_menu.add_cascade(label="Star", menu=star_menu, underline=0)
def create_cycle_menu(self, topology_generator_menu): def create_cycle_menu(self, topology_generator_menu):
@ -352,7 +329,6 @@ class CoreMenubar(object):
for i in range(3, 25, 1): for i in range(3, 25, 1):
the_label = "C(" + str(i) + ")" the_label = "C(" + str(i) + ")"
cycle_menu.add_command(label=the_label, command=action.sub_menu_items) cycle_menu.add_command(label=the_label, command=action.sub_menu_items)
topology_generator_menu.add_cascade(label="Cycle", menu=cycle_menu, underline=0) topology_generator_menu.add_cascade(label="Cycle", menu=cycle_menu, underline=0)
def create_wheel_menu(self, topology_generator_menu): def create_wheel_menu(self, topology_generator_menu):
@ -366,7 +342,6 @@ class CoreMenubar(object):
for i in range(4, 26, 1): for i in range(4, 26, 1):
the_label = "W(" + str(i) + ")" the_label = "W(" + str(i) + ")"
wheel_menu.add_command(label=the_label, command=action.sub_menu_items) wheel_menu.add_command(label=the_label, command=action.sub_menu_items)
topology_generator_menu.add_cascade(label="Wheel", menu=wheel_menu, underline=0) topology_generator_menu.add_cascade(label="Wheel", menu=wheel_menu, underline=0)
def create_cube_menu(self, topology_generator_menu): def create_cube_menu(self, topology_generator_menu):
@ -380,7 +355,6 @@ class CoreMenubar(object):
for i in range(2, 7, 1): for i in range(2, 7, 1):
the_label = "Q(" + str(i) + ")" the_label = "Q(" + str(i) + ")"
cube_menu.add_command(label=the_label, command=action.sub_menu_items) cube_menu.add_command(label=the_label, command=action.sub_menu_items)
topology_generator_menu.add_cascade(label="Cube", menu=cube_menu, underline=0) topology_generator_menu.add_cascade(label="Cube", menu=cube_menu, underline=0)
def create_clique_menu(self, topology_generator_menu): def create_clique_menu(self, topology_generator_menu):
@ -394,7 +368,6 @@ class CoreMenubar(object):
for i in range(3, 25, 1): for i in range(3, 25, 1):
the_label = "K(" + str(i) + ")" the_label = "K(" + str(i) + ")"
clique_menu.add_command(label=the_label, command=action.sub_menu_items) clique_menu.add_command(label=the_label, command=action.sub_menu_items)
topology_generator_menu.add_cascade( topology_generator_menu.add_cascade(
label="Clique", menu=clique_menu, underline=0 label="Clique", menu=clique_menu, underline=0
) )
@ -429,7 +402,6 @@ class CoreMenubar(object):
:return: nothing :return: nothing
""" """
topology_generator_menu = tk.Menu(tools_menu) topology_generator_menu = tk.Menu(tools_menu)
self.create_random_menu(topology_generator_menu) self.create_random_menu(topology_generator_menu)
self.create_grid_menu(topology_generator_menu) self.create_grid_menu(topology_generator_menu)
self.create_connected_grid_menu(topology_generator_menu) self.create_connected_grid_menu(topology_generator_menu)
@ -440,19 +412,17 @@ class CoreMenubar(object):
self.create_cube_menu(topology_generator_menu) self.create_cube_menu(topology_generator_menu)
self.create_clique_menu(topology_generator_menu) self.create_clique_menu(topology_generator_menu)
self.create_bipartite_menu(topology_generator_menu) self.create_bipartite_menu(topology_generator_menu)
tools_menu.add_cascade( tools_menu.add_cascade(
label="Topology generator", menu=topology_generator_menu, underline=0 label="Topology generator", menu=topology_generator_menu, underline=0
) )
def create_tools_menu(self): def draw_tools_menu(self):
""" """
Create tools menu Create tools menu
:return: nothing :return: nothing
""" """
tools_menu = tk.Menu(self)
tools_menu = tk.Menu(self.menubar)
tools_menu.add_command( tools_menu.add_command(
label="Auto rearrange all", label="Auto rearrange all",
command=action.tools_auto_rearrange_all, command=action.tools_auto_rearrange_all,
@ -464,13 +434,10 @@ class CoreMenubar(object):
underline=0, underline=0,
) )
tools_menu.add_separator() tools_menu.add_separator()
tools_menu.add_command( tools_menu.add_command(
label="Align to grid", command=action.tools_align_to_grid, underline=0 label="Align to grid", command=action.tools_align_to_grid, underline=0
) )
tools_menu.add_separator() tools_menu.add_separator()
tools_menu.add_command(label="Traffic...", command=action.tools_traffic) tools_menu.add_command(label="Traffic...", command=action.tools_traffic)
tools_menu.add_command( tools_menu.add_command(
label="IP addresses...", command=action.tools_ip_addresses, underline=0 label="IP addresses...", command=action.tools_ip_addresses, underline=0
@ -489,8 +456,7 @@ class CoreMenubar(object):
self.create_experimental_menu(tools_menu) self.create_experimental_menu(tools_menu)
self.create_topology_generator_menu(tools_menu) self.create_topology_generator_menu(tools_menu)
tools_menu.add_command(label="Debugger...", command=action.tools_debugger) tools_menu.add_command(label="Debugger...", command=action.tools_debugger)
self.add_cascade(label="Tools", menu=tools_menu, underline=0)
self.menubar.add_cascade(label="Tools", menu=tools_menu, underline=0)
def create_observer_widgets_menu(self, widget_menu): def create_observer_widgets_menu(self, widget_menu):
""" """
@ -544,9 +510,8 @@ class CoreMenubar(object):
label="PIM neighbors", command=action.sub_menu_items label="PIM neighbors", command=action.sub_menu_items
) )
observer_widget_menu.add_command( observer_widget_menu.add_command(
label="Edit...", command=self.menu_action.edit_observer_widgets label="Edit...", command=self.menuaction.edit_observer_widgets
) )
widget_menu.add_cascade(label="Observer Widgets", menu=observer_widget_menu) widget_menu.add_cascade(label="Observer Widgets", menu=observer_widget_menu)
def create_adjacency_menu(self, widget_menu): def create_adjacency_menu(self, widget_menu):
@ -561,47 +526,40 @@ class CoreMenubar(object):
adjacency_menu.add_command(label="OSPFv3", command=action.sub_menu_items) adjacency_menu.add_command(label="OSPFv3", command=action.sub_menu_items)
adjacency_menu.add_command(label="OSLR", command=action.sub_menu_items) adjacency_menu.add_command(label="OSLR", command=action.sub_menu_items)
adjacency_menu.add_command(label="OSLRv2", command=action.sub_menu_items) adjacency_menu.add_command(label="OSLRv2", command=action.sub_menu_items)
widget_menu.add_cascade(label="Adjacency", menu=adjacency_menu) widget_menu.add_cascade(label="Adjacency", menu=adjacency_menu)
def create_widgets_menu(self): def draw_widgets_menu(self):
""" """
Create widget menu Create widget menu
:return: nothing :return: nothing
""" """
widget_menu = tk.Menu(self.menubar) widget_menu = tk.Menu(self)
self.create_observer_widgets_menu(widget_menu) self.create_observer_widgets_menu(widget_menu)
self.create_adjacency_menu(widget_menu) self.create_adjacency_menu(widget_menu)
widget_menu.add_command(label="Throughput", command=action.widgets_throughput) widget_menu.add_command(label="Throughput", command=action.widgets_throughput)
widget_menu.add_separator() widget_menu.add_separator()
widget_menu.add_command( widget_menu.add_command(
label="Configure Adjacency...", command=action.widgets_configure_adjacency label="Configure Adjacency...", command=action.widgets_configure_adjacency
) )
widget_menu.add_command( widget_menu.add_command(
label="Configure Throughput...", command=action.widgets_configure_throughput label="Configure Throughput...", command=action.widgets_configure_throughput
) )
self.add_cascade(label="Widgets", menu=widget_menu, underline=0)
self.menubar.add_cascade(label="Widgets", menu=widget_menu, underline=0) def draw_session_menu(self):
def create_session_menu(self):
""" """
Create session menu Create session menu
:return: nothing :return: nothing
""" """
session_menu = tk.Menu(self.menubar) session_menu = tk.Menu(self)
session_menu.add_command( session_menu.add_command(
label="Change sessions...", label="Change sessions...",
command=self.menu_action.session_change_sessions, command=self.menuaction.session_change_sessions,
underline=0, underline=0,
) )
session_menu.add_separator() session_menu.add_separator()
session_menu.add_command( session_menu.add_command(
label="Node types...", command=action.session_node_types, underline=0 label="Node types...", command=action.session_node_types, underline=0
) )
@ -609,7 +567,7 @@ class CoreMenubar(object):
label="Comments...", command=action.session_comments, underline=0 label="Comments...", command=action.session_comments, underline=0
) )
session_menu.add_command( session_menu.add_command(
label="Hooks...", command=self.menu_action.session_hooks, underline=0 label="Hooks...", command=self.menuaction.session_hooks, underline=0
) )
session_menu.add_command( session_menu.add_command(
label="Reset node positions", label="Reset node positions",
@ -618,69 +576,27 @@ class CoreMenubar(object):
) )
session_menu.add_command( session_menu.add_command(
label="Emulation servers...", label="Emulation servers...",
command=self.menu_action.session_servers, command=self.menuaction.session_servers,
underline=0, underline=0,
) )
session_menu.add_command( session_menu.add_command(
label="Options...", command=self.menu_action.session_options, underline=0 label="Options...", command=self.menuaction.session_options, underline=0
) )
self.add_cascade(label="Session", menu=session_menu, underline=0)
self.menubar.add_cascade(label="Session", menu=session_menu, underline=0) def draw_help_menu(self):
def create_help_menu(self):
""" """
Create help menu Create help menu
:return: nothing :return: nothing
""" """
help_menu = tk.Menu(self.menubar) help_menu = tk.Menu(self)
help_menu.add_command( help_menu.add_command(
label="Core Github (www)", command=self.menu_action.help_core_github label="Core Github (www)", command=self.menuaction.help_core_github
) )
help_menu.add_command( help_menu.add_command(
label="Core Documentation (www)", label="Core Documentation (www)",
command=self.menu_action.help_core_documentation, command=self.menuaction.help_core_documentation,
) )
help_menu.add_command(label="About", command=action.help_about) help_menu.add_command(label="About", command=action.help_about)
self.add_cascade(label="Help", menu=help_menu)
self.menubar.add_cascade(label="Help", menu=help_menu)
def bind_menubar_shortcut(self):
"""
Bind hot keys to matching command
:return: nothing
"""
self.app.bind_all("<Control-n>", action.file_new_shortcut)
self.app.bind_all("<Control-o>", action.file_open_shortcut)
self.app.bind_all("<Control-s>", action.file_save_shortcut)
self.app.bind_all("<Control-z>", action.edit_undo_shortcut)
self.app.bind_all("<Control-y>", action.edit_redo_shortcut)
self.app.bind_all("<Control-x>", action.edit_cut_shortcut)
self.app.bind_all("<Control-c>", action.edit_copy_shortcut)
self.app.bind_all("<Control-v>", action.edit_paste_shortcut)
self.app.bind_all("<Control-a>", action.edit_select_all_shortcut)
self.app.bind_all("<Control-j>", action.edit_select_adjacent_shortcut)
self.app.bind_all("<Control-f>", action.edit_find_shortcut)
self.app.bind_all("<Prior>", action.canvas_previous_shortcut)
self.app.bind_all("<Next>", action.canvas_next_shortcut)
self.app.bind_all("<Home>", action.canvas_first_shortcut)
self.app.bind_all("<End>", action.canvas_last_shortcut)
self.app.bind_all("<Control-Shift-plus>", action.view_zoom_in_shortcut)
self.app.bind_all("<Control-minus>", action.view_zoom_out_shortcut)
def create_core_menubar(self):
"""
Create core menubar and bind the hot keys to their matching command
:return: nothing
"""
self.create_file_menu()
self.create_edit_menu()
self.create_canvas_menu()
self.create_view_menu()
self.create_tools_menu()
self.create_widgets_menu()
self.create_session_menu()
self.create_help_menu()
self.bind_menubar_shortcut()

View file

@ -34,7 +34,6 @@ class Toolbar(tk.Frame):
self.link_layer_option_menu = None self.link_layer_option_menu = None
self.marker_option_menu = None self.marker_option_menu = None
self.network_layer_option_menu = None self.network_layer_option_menu = None
self.canvas = None
self.node_button = None self.node_button = None
self.network_button = None self.network_button = None
self.annotation_button = None self.annotation_button = None
@ -204,7 +203,7 @@ class Toolbar(tk.Frame):
def click_selection_tool(self): def click_selection_tool(self):
logging.debug("clicked selection tool") logging.debug("clicked selection tool")
self.canvas.mode = GraphMode.SELECT self.app.canvas.mode = GraphMode.SELECT
def click_start_session_tool(self): def click_start_session_tool(self):
""" """
@ -214,13 +213,13 @@ class Toolbar(tk.Frame):
:return: nothing :return: nothing
""" """
logging.debug("clicked start button") logging.debug("clicked start button")
self.canvas.mode = GraphMode.SELECT self.app.canvas.mode = GraphMode.SELECT
self.app.core.start_session() self.app.core.start_session()
self.runtime_frame.tkraise() self.runtime_frame.tkraise()
def click_link_tool(self): def click_link_tool(self):
logging.debug("Click LINK button") logging.debug("Click LINK button")
self.canvas.mode = GraphMode.EDGE self.app.canvas.mode = GraphMode.EDGE
def update_button(self, button, image_enum, name): def update_button(self, button, image_enum, name):
logging.info("update button(%s): %s, %s", button, image_enum, name) logging.info("update button(%s): %s, %s", button, image_enum, name)
@ -232,9 +231,9 @@ class Toolbar(tk.Frame):
image = Images.get(image_enum) image = Images.get(image_enum)
logging.info("updating button(%s): %s", button, name) logging.info("updating button(%s): %s", button, name)
button.configure(image=image) button.configure(image=image)
self.canvas.mode = GraphMode.NODE self.app.canvas.mode = GraphMode.NODE
self.canvas.draw_node_image = image self.app.canvas.draw_node_image = image
self.canvas.draw_node_name = name self.app.canvas.draw_node_name = name
def hide_pickers(self): def hide_pickers(self):
logging.info("hiding pickers") logging.info("hiding pickers")