added preferences dialog, updates to try and simplify config saving a bit, adding default preferences configurations
This commit is contained in:
parent
f5480c8e35
commit
691013eeb8
12 changed files with 126 additions and 22 deletions
|
@ -1,7 +1,7 @@
|
|||
import logging
|
||||
import tkinter as tk
|
||||
|
||||
from coretk import appdirs
|
||||
from coretk import appconfig
|
||||
from coretk.coreclient import CoreClient
|
||||
from coretk.graph import CanvasGraph
|
||||
from coretk.images import ImageEnum, Images
|
||||
|
@ -26,7 +26,7 @@ class Application(tk.Frame):
|
|||
self.radiovar = tk.IntVar(value=1)
|
||||
self.show_grid_var = tk.IntVar(value=1)
|
||||
self.adjust_to_dim_var = tk.IntVar(value=0)
|
||||
self.config = appdirs.read_config()
|
||||
self.config = appconfig.read()
|
||||
self.core = CoreClient(self)
|
||||
self.setup_app()
|
||||
self.draw()
|
||||
|
@ -70,10 +70,13 @@ class Application(tk.Frame):
|
|||
menu_action = MenuAction(self, self.master)
|
||||
menu_action.on_quit()
|
||||
|
||||
def save_config(self):
|
||||
appconfig.save(self.config)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
log_format = "%(asctime)s - %(levelname)s - %(module)s:%(funcName)s - %(message)s"
|
||||
logging.basicConfig(level=logging.DEBUG, format=log_format)
|
||||
appdirs.check_directory()
|
||||
appconfig.check_directory()
|
||||
app = Application()
|
||||
app.mainloop()
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import logging
|
||||
import os
|
||||
import shutil
|
||||
from pathlib import Path
|
||||
|
||||
|
@ -18,6 +19,20 @@ CONFIG_PATH = HOME_PATH.joinpath("gui.yaml")
|
|||
LOCAL_ICONS_PATH = Path(__file__).parent.joinpath("icons").absolute()
|
||||
LOCAL_BACKGROUND_PATH = Path(__file__).parent.joinpath("backgrounds").absolute()
|
||||
|
||||
# configuration data
|
||||
TERMINALS = [
|
||||
"$TERM",
|
||||
"gnome-terminal --window --",
|
||||
"lxterminal -e",
|
||||
"konsole -e",
|
||||
"xterm -e",
|
||||
"aterm -e",
|
||||
"eterm -e",
|
||||
"rxvt -e",
|
||||
"xfce4-terminal -x",
|
||||
]
|
||||
EDITORS = ["$EDITOR", "vim", "emacs", "gedit", "nano", "vi"]
|
||||
|
||||
|
||||
class IndentDumper(yaml.Dumper):
|
||||
def increase_indent(self, flow=False, indentless=False):
|
||||
|
@ -42,19 +57,33 @@ def check_directory():
|
|||
for background in LOCAL_BACKGROUND_PATH.glob("*"):
|
||||
new_background = BACKGROUNDS_PATH.joinpath(background.name)
|
||||
shutil.copy(background, new_background)
|
||||
|
||||
if "TERM" in os.environ:
|
||||
terminal = TERMINALS[0]
|
||||
else:
|
||||
terminal = TERMINALS[1]
|
||||
if "EDITOR" in os.environ:
|
||||
editor = EDITORS[0]
|
||||
else:
|
||||
editor = EDITORS[1]
|
||||
config = {
|
||||
"preferences": {
|
||||
"editor": editor,
|
||||
"terminal": terminal,
|
||||
"gui3d": "/usr/local/bin/std3d.sh",
|
||||
},
|
||||
"servers": [{"name": "example", "address": "127.0.0.1", "port": 50051}],
|
||||
"nodes": [],
|
||||
"observers": [],
|
||||
"observers": [{"name": "hello", "cmd": "echo hello"}],
|
||||
}
|
||||
save_config(config)
|
||||
save(config)
|
||||
|
||||
|
||||
def read_config():
|
||||
def read():
|
||||
with CONFIG_PATH.open("r") as f:
|
||||
return yaml.load(f, Loader=yaml.SafeLoader)
|
||||
|
||||
|
||||
def save_config(config):
|
||||
def save(config):
|
||||
with CONFIG_PATH.open("w") as f:
|
||||
yaml.dump(config, f, Dumper=IndentDumper, default_flow_style=False)
|
|
@ -15,7 +15,7 @@ from coretk.wlannodeconfig import WlanNodeConfig
|
|||
|
||||
NETWORK_NODES = {"switch", "hub", "wlan", "rj45", "tunnel", "emane"}
|
||||
DEFAULT_NODES = {"router", "host", "PC", "mdr", "prouter"}
|
||||
OBSERVER_WIDGETS = {
|
||||
OBSERVERS = {
|
||||
"processes": "ps",
|
||||
"ifconfig": "ifconfig",
|
||||
"IPV4 Routes": "ip -4 ro",
|
||||
|
|
|
@ -8,7 +8,7 @@ from tkinter import filedialog
|
|||
|
||||
from PIL import Image, ImageTk
|
||||
|
||||
from coretk.appdirs import BACKGROUNDS_PATH
|
||||
from coretk.appconfig import BACKGROUNDS_PATH
|
||||
from coretk.dialogs.dialog import Dialog
|
||||
|
||||
|
||||
|
|
|
@ -2,7 +2,6 @@ import logging
|
|||
import tkinter as tk
|
||||
from pathlib import Path
|
||||
|
||||
from coretk import appdirs
|
||||
from coretk.coreclient import CustomNode
|
||||
from coretk.dialogs.dialog import Dialog
|
||||
from coretk.dialogs.icondialog import IconDialog
|
||||
|
@ -189,7 +188,8 @@ class CustomNodesDialog(Dialog):
|
|||
}
|
||||
)
|
||||
logging.info("saving custom nodes: %s", self.app.config["nodes"])
|
||||
appdirs.save_config(self.app.config)
|
||||
self.app.save_config()
|
||||
self.destroy()
|
||||
|
||||
def click_create(self):
|
||||
name = self.name.get()
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import tkinter as tk
|
||||
from tkinter import filedialog
|
||||
|
||||
from coretk.appdirs import ICONS_PATH
|
||||
from coretk.appconfig import ICONS_PATH
|
||||
from coretk.dialogs.dialog import Dialog
|
||||
from coretk.images import Images
|
||||
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
import tkinter as tk
|
||||
|
||||
from coretk import appdirs
|
||||
from coretk.coreclient import Observer
|
||||
from coretk.dialogs.dialog import Dialog
|
||||
|
||||
|
@ -96,7 +95,7 @@ class ObserverDialog(Dialog):
|
|||
observer = self.app.core.custom_observers[name]
|
||||
observers.append({"name": observer.name, "cmd": observer.cmd})
|
||||
self.app.config["observers"] = observers
|
||||
appdirs.save_config(self.app.config)
|
||||
self.app.save_config()
|
||||
self.destroy()
|
||||
|
||||
def click_create(self):
|
||||
|
|
67
coretk/coretk/dialogs/preferences.py
Normal file
67
coretk/coretk/dialogs/preferences.py
Normal file
|
@ -0,0 +1,67 @@
|
|||
import tkinter as tk
|
||||
from tkinter import ttk
|
||||
|
||||
from coretk import appconfig
|
||||
from coretk.dialogs.dialog import Dialog
|
||||
|
||||
|
||||
class PreferencesDialog(Dialog):
|
||||
def __init__(self, master, app):
|
||||
super().__init__(master, app, "Preferences", modal=True)
|
||||
preferences = self.app.config["preferences"]
|
||||
self.editor = tk.StringVar(value=preferences["editor"])
|
||||
self.terminal = tk.StringVar(value=preferences["terminal"])
|
||||
self.gui3d = tk.StringVar(value=preferences["gui3d"])
|
||||
self.draw()
|
||||
|
||||
def draw(self):
|
||||
self.columnconfigure(0, weight=1)
|
||||
self.draw_programs()
|
||||
self.draw_buttons()
|
||||
|
||||
def draw_programs(self):
|
||||
frame = ttk.LabelFrame(self, text="Programs")
|
||||
frame.grid(sticky="ew", pady=2)
|
||||
frame.columnconfigure(1, weight=1)
|
||||
|
||||
label = ttk.Label(frame, text="Editor")
|
||||
label.grid(row=0, column=0, pady=2, padx=2, sticky="w")
|
||||
combobox = ttk.Combobox(
|
||||
frame, textvariable=self.editor, values=appconfig.EDITORS, state="readonly"
|
||||
)
|
||||
combobox.grid(row=0, column=1, sticky="ew")
|
||||
|
||||
label = ttk.Label(frame, text="Terminal")
|
||||
label.grid(row=1, column=0, pady=2, padx=2, sticky="w")
|
||||
combobox = ttk.Combobox(
|
||||
frame,
|
||||
textvariable=self.terminal,
|
||||
values=appconfig.TERMINALS,
|
||||
state="readonly",
|
||||
)
|
||||
combobox.grid(row=1, column=1, sticky="ew")
|
||||
|
||||
label = ttk.Label(frame, text="3D GUI")
|
||||
label.grid(row=2, column=0, pady=2, padx=2, sticky="w")
|
||||
entry = ttk.Entry(frame, textvariable=self.gui3d)
|
||||
entry.grid(row=2, column=1, sticky="ew")
|
||||
|
||||
def draw_buttons(self):
|
||||
frame = ttk.Frame(self)
|
||||
frame.grid(sticky="ew")
|
||||
for i in range(2):
|
||||
frame.columnconfigure(i, weight=1)
|
||||
|
||||
button = ttk.Button(frame, text="Save", command=self.click_save)
|
||||
button.grid(row=0, column=0, sticky="ew")
|
||||
|
||||
button = ttk.Button(frame, text="Cancel", command=self.destroy)
|
||||
button.grid(row=0, column=1, sticky="ew")
|
||||
|
||||
def click_save(self):
|
||||
preferences = self.app.config["preferences"]
|
||||
preferences["terminal"] = self.terminal.get()
|
||||
preferences["editor"] = self.editor.get()
|
||||
preferences["gui3d"] = self.gui3d.get()
|
||||
self.app.save_config()
|
||||
self.destroy()
|
|
@ -1,6 +1,5 @@
|
|||
import tkinter as tk
|
||||
|
||||
from coretk import appdirs
|
||||
from coretk.coreclient import CoreServer
|
||||
from coretk.dialogs.dialog import Dialog
|
||||
|
||||
|
@ -116,7 +115,7 @@ class ServersDialog(Dialog):
|
|||
{"name": server.name, "address": server.address, "port": server.port}
|
||||
)
|
||||
self.app.config["servers"] = servers
|
||||
appdirs.save_config(self.app.config)
|
||||
self.app.save_config()
|
||||
self.destroy()
|
||||
|
||||
def click_create(self):
|
||||
|
|
|
@ -4,7 +4,7 @@ from enum import Enum
|
|||
from PIL import Image, ImageTk
|
||||
|
||||
from core.api.grpc import core_pb2
|
||||
from coretk.appdirs import LOCAL_ICONS_PATH
|
||||
from coretk.appconfig import LOCAL_ICONS_PATH
|
||||
|
||||
|
||||
class Images:
|
||||
|
|
|
@ -7,11 +7,12 @@ import webbrowser
|
|||
from tkinter import filedialog, messagebox
|
||||
|
||||
from core.api.grpc import core_pb2
|
||||
from coretk.appdirs import XML_PATH
|
||||
from coretk.appconfig import XML_PATH
|
||||
from coretk.dialogs.canvasbackground import CanvasBackgroundDialog
|
||||
from coretk.dialogs.canvassizeandscale import SizeAndScaleDialog
|
||||
from coretk.dialogs.hooks import HooksDialog
|
||||
from coretk.dialogs.observers import ObserverDialog
|
||||
from coretk.dialogs.preferences import PreferencesDialog
|
||||
from coretk.dialogs.servers import ServersDialog
|
||||
from coretk.dialogs.sessionoptions import SessionOptionsDialog
|
||||
from coretk.dialogs.sessions import SessionsDialog
|
||||
|
@ -83,6 +84,10 @@ class MenuAction:
|
|||
self.prompt_save_running_session()
|
||||
self.app.core.open_xml(file_path)
|
||||
|
||||
def gui_preferences(self):
|
||||
dialog = PreferencesDialog(self.app, self.app)
|
||||
dialog.show()
|
||||
|
||||
def canvas_size_and_scale(self):
|
||||
dialog = SizeAndScaleDialog(self.app, self.app)
|
||||
dialog.show()
|
||||
|
|
|
@ -2,7 +2,7 @@ import tkinter as tk
|
|||
from functools import partial
|
||||
|
||||
import coretk.menuaction as action
|
||||
from coretk.coreclient import OBSERVER_WIDGETS
|
||||
from coretk.coreclient import OBSERVERS
|
||||
|
||||
|
||||
class Menubar(tk.Menu):
|
||||
|
@ -94,7 +94,9 @@ 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...", 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):
|
||||
|
@ -379,8 +381,8 @@ class Menubar(tk.Menu):
|
|||
value="none",
|
||||
command=lambda: self.app.core.set_observer(None),
|
||||
)
|
||||
for name in sorted(OBSERVER_WIDGETS):
|
||||
cmd = OBSERVER_WIDGETS[name]
|
||||
for name in sorted(OBSERVERS):
|
||||
cmd = OBSERVERS[name]
|
||||
menu.add_radiobutton(
|
||||
label=name,
|
||||
variable=var,
|
||||
|
|
Loading…
Reference in a new issue