Some comments in gui.main.
This commit is contained in:
parent
a66fd8d173
commit
5da4663f98
|
|
@ -1,5 +1,13 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
#
|
||||||
|
# This is a script, the module namespace is used as a kind of singleton
|
||||||
|
# for organizing the moving parts of the system. I forget why I didn't
|
||||||
|
# use a more typical class.
|
||||||
|
#
|
||||||
|
# This docstring doubles as the log header that the system prints when
|
||||||
|
# the log is reset.
|
||||||
|
|
||||||
('''\
|
('''\
|
||||||
Joypy - Copyright © 2018 Simon Forman
|
Joypy - Copyright © 2018 Simon Forman
|
||||||
'''
|
'''
|
||||||
|
|
@ -7,6 +15,7 @@ Joypy - Copyright © 2018 Simon Forman
|
||||||
' This is free software, and you are welcome to redistribute it under certain conditions;'
|
' This is free software, and you are welcome to redistribute it under certain conditions;'
|
||||||
' right-click "sharing" for details.'
|
' right-click "sharing" for details.'
|
||||||
' Right-click on these commands to see docs on UI commands: key_bindings mouse_bindings')
|
' Right-click on these commands to see docs on UI commands: key_bindings mouse_bindings')
|
||||||
|
|
||||||
from __future__ import print_function
|
from __future__ import print_function
|
||||||
from future import standard_library
|
from future import standard_library
|
||||||
standard_library.install_aliases()
|
standard_library.install_aliases()
|
||||||
|
|
@ -16,10 +25,16 @@ from configparser import RawConfigParser
|
||||||
|
|
||||||
from joy.gui.utils import init_home, argparser, FileFaker
|
from joy.gui.utils import init_home, argparser, FileFaker
|
||||||
|
|
||||||
|
|
||||||
|
VIEWER_DEFAULTS = dict(width=80, height=25)
|
||||||
|
|
||||||
|
|
||||||
args = argparser.parse_args()
|
args = argparser.parse_args()
|
||||||
JOY_HOME = args.joy_home
|
JOY_HOME = args.joy_home
|
||||||
repo = init_home(JOY_HOME)
|
repo = init_home(JOY_HOME)
|
||||||
|
homed = lambda fn: os.path.join(JOY_HOME, fn)
|
||||||
|
|
||||||
|
# Set up logging before doing anything else.
|
||||||
|
|
||||||
_log = logging.getLogger(__name__)
|
_log = logging.getLogger(__name__)
|
||||||
logging.basicConfig(
|
logging.basicConfig(
|
||||||
|
|
@ -29,6 +44,7 @@ logging.basicConfig(
|
||||||
)
|
)
|
||||||
_log.info('Starting with JOY_HOME=%s', JOY_HOME)
|
_log.info('Starting with JOY_HOME=%s', JOY_HOME)
|
||||||
|
|
||||||
|
# Now that logging is set up, continue loading the system.
|
||||||
|
|
||||||
from joy.gui.textwidget import TextViewerWidget, tk, get_font
|
from joy.gui.textwidget import TextViewerWidget, tk, get_font
|
||||||
from joy.gui.world import StackDisplayWorld
|
from joy.gui.world import StackDisplayWorld
|
||||||
|
|
@ -37,7 +53,8 @@ from joy.utils.stack import stack_to_string
|
||||||
|
|
||||||
|
|
||||||
cp = RawConfigParser()
|
cp = RawConfigParser()
|
||||||
cp.optionxform = str # Don't mess with uppercase.
|
# Don't mess with uppercase. We need it for Tk event binding.
|
||||||
|
cp.optionxform = str
|
||||||
with open(os.path.join(args.joy_home, 'thun.config')) as f:
|
with open(os.path.join(args.joy_home, 'thun.config')) as f:
|
||||||
cp.readfp(f)
|
cp.readfp(f)
|
||||||
|
|
||||||
|
|
@ -52,6 +69,11 @@ def repo_relative_path(path):
|
||||||
)
|
)
|
||||||
|
|
||||||
def commands():
|
def commands():
|
||||||
|
'''
|
||||||
|
We define a bunch of meta-interpreter command functions here and
|
||||||
|
return them in a dictionary. They have all the contents of this
|
||||||
|
module in their scope so they can e.g. modify the log viewer window.
|
||||||
|
'''
|
||||||
# pylint: disable=unused-variable
|
# pylint: disable=unused-variable
|
||||||
|
|
||||||
def key_bindings(*args):
|
def key_bindings(*args):
|
||||||
|
|
@ -108,26 +130,37 @@ def commands():
|
||||||
return locals()
|
return locals()
|
||||||
|
|
||||||
|
|
||||||
STACK_FN = os.path.join(JOY_HOME, 'stack.pickle')
|
# Identify the system core files.
|
||||||
|
DEFS_FN = homed('definitions.txt')
|
||||||
|
JOY_FN = homed('scratch.txt')
|
||||||
|
LOG_FN = homed('log.txt')
|
||||||
|
STACK_FN = homed('stack.pickle')
|
||||||
REL_STACK_FN = repo_relative_path(STACK_FN)
|
REL_STACK_FN = repo_relative_path(STACK_FN)
|
||||||
JOY_FN = os.path.join(JOY_HOME, 'scratch.txt')
|
|
||||||
LOG_FN = os.path.join(JOY_HOME, 'log.txt')
|
# Initialize the Joy dictionary.
|
||||||
D = initialize()
|
D = initialize()
|
||||||
D.update(commands())
|
D.update(commands())
|
||||||
DefinitionWrapper.load_definitions(os.path.join(JOY_HOME, 'definitions.txt'), D)
|
DefinitionWrapper.load_definitions(DEFS_FN, D)
|
||||||
|
|
||||||
world = StackDisplayWorld(repo, STACK_FN, REL_STACK_FN, dictionary=D)
|
world = StackDisplayWorld(repo, STACK_FN, REL_STACK_FN, dictionary=D)
|
||||||
defaults = dict(width=80, height=25)
|
|
||||||
t = TextViewerWidget(world, **defaults)
|
t = TextViewerWidget(world, **VIEWER_DEFAULTS)
|
||||||
|
|
||||||
log_window = tk.Toplevel()
|
log_window = tk.Toplevel()
|
||||||
|
# Make it so that you can't actually close the log window, if you try it
|
||||||
|
# will just "withdraw" (which is like minifying but without a entry in
|
||||||
|
# the taskbar or icon or whatever.)
|
||||||
log_window.protocol("WM_DELETE_WINDOW", log_window.withdraw)
|
log_window.protocol("WM_DELETE_WINDOW", log_window.withdraw)
|
||||||
log = TextViewerWidget(world, log_window, **defaults)
|
log = TextViewerWidget(world, log_window, **VIEWER_DEFAULTS)
|
||||||
|
|
||||||
FONT = get_font('Iosevka', size=14) # Requires Tk root already set up.
|
FONT = get_font('Iosevka', size=14) # Requires Tk root already set up.
|
||||||
|
|
||||||
log.init('Log', LOG_FN, repo_relative_path(LOG_FN), repo, FONT)
|
log.init('Log', LOG_FN, repo_relative_path(LOG_FN), repo, FONT)
|
||||||
t.init('Joy - ' + JOY_HOME, JOY_FN, repo_relative_path(JOY_FN), repo, FONT)
|
t.init('Joy - ' + JOY_HOME, JOY_FN, repo_relative_path(JOY_FN), repo, FONT)
|
||||||
|
|
||||||
for event, command in GLOBAL_COMMANDS.items():
|
for event, command in GLOBAL_COMMANDS.items():
|
||||||
callback = lambda _, _command=command: world.interpret(_command)
|
callback = lambda _, _command=command: world.interpret(_command)
|
||||||
t.bind(event, callback)
|
t.bind_all(event, callback)
|
||||||
log.bind(event, callback)
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
|
|
||||||
|
|
@ -426,7 +426,7 @@ class TextViewerWidget(tk.Text, MouseBindingsMixin, SavingMixin):
|
||||||
return 'break'
|
return 'break'
|
||||||
|
|
||||||
def init(self, title, filename, repo_relative_filename, repo, font):
|
def init(self, title, filename, repo_relative_filename, repo, font):
|
||||||
self.winfo_toplevel().title(title)
|
self.set_window_title(title)
|
||||||
if os.path.exists(filename):
|
if os.path.exists(filename):
|
||||||
with open(filename) as f:
|
with open(filename) as f:
|
||||||
data = f.read()
|
data = f.read()
|
||||||
|
|
@ -440,6 +440,9 @@ class TextViewerWidget(tk.Text, MouseBindingsMixin, SavingMixin):
|
||||||
self.repo = repo
|
self.repo = repo
|
||||||
self['font'] = font # See below.
|
self['font'] = font # See below.
|
||||||
|
|
||||||
|
def set_window_title(self, title):
|
||||||
|
self.winfo_toplevel().title(title)
|
||||||
|
|
||||||
def reset(self):
|
def reset(self):
|
||||||
if os.path.exists(self.filename):
|
if os.path.exists(self.filename):
|
||||||
with open(self.filename) as f:
|
with open(self.filename) as f:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue