re-organize for setup support

This commit is contained in:
Kelvin Sherlock 2023-12-31 18:21:22 -05:00
parent 3887146361
commit a8523f5ebd
22 changed files with 180 additions and 59 deletions

86
examples/frotz.prez Normal file
View File

@ -0,0 +1,86 @@
rComment("""
FROTZ V2.55
An interpreter for all Infocom and other Z-Machine games.
Complies with the Z-Machine Standard version 1.1.
Originally written by Stefan Jokisch in 1995-1997.
Ported to Unix by Galen Hazelwood.
Reference code Unix and DOS ports are maintained by David Griffith.
IIgs .console port by Kelvin Sherlock.
Frotz is free software; you can redistribute it and/or modify it \
under the terms of the GNU General Public License as published by \
the Free Software Foundation; either version 2 of the License, or \
(at your option) any later version.
""")
rVersion( '0.0.0a2', verUS, "Frotz 2.55", "Kelvin Sherlock\nDavid Griffith, et alia")
rToolStartup(
mode640 | fFastPortAware | fUseShadowing,
3, (4, 0x0308), 5, 6, 11, 14, 15, 16, 18, 20, 21, 22, 23, 27, 28, 30,
export="kStartStop"
)
rMenuBar(
rMenu("@",
rMenuItem("About Frotz…", export="kAboutMenuItem"),
rMenuItem("Preferences…", ",", export="kPreferencesMenuItem"),
DividerMenuItem(),
export="kAppleMenu"
),
rMenu(" File ",
# rMenuItem("New ", "Nn", export="kNewMenuItem"),
rMenuItem("Open…", "Oo", export="kOpenMenuItem"),
rMenuItem("Restart", "Rr", export="kRestartMenuItem"),
# rMenuItem("Save", "Ss", disabled=True, export="kSaveMenuItem"),
# DividerMenuItem(),
# rMenuItem("Close", "Ww", id=0xff, export="kCloseMenuItem"),
DividerMenuItem(),
rMenuItem("Quit", "Qq", export="kQuitMenuItem"),
export = "kFileMenu"
),
rMenu(" Edit ",
UndoMenuItem(), # shortcut for doing it manually,
DividerMenuItem(),
CutMenuItem(),
CopyMenuItem(),
PasteMenuItem(),
ClearMenuItem(),
export = "kEditMenu"
),
export = "kMenuBar"
)
AboutRect = rect(x = 0, y = 0, height = 100, width = 400)
rWindParam1(
AboutRect.center(), None,
rStatTextControl(
AboutRect,
rTextForLETextBox2(
TBCenterJust,
TBFont, TBVenice, b"\x00", b"\x18", # Venice 24-point
"Frotz",
TBFont, TBMonaco, b"\x00", b"\x09", # monaco, 9-point
"\nv 2.55\n",
"Stefan Jokisch, Galen Hazel, David Griffith, et alia\n",
"IIgs version by Kelvin Sherlock (alpha 2)"
)
),
frameBits = fVis,
export = "kAboutWindow"
)

5
prez.py Normal file
View File

@ -0,0 +1,5 @@
# this exists so we can "python3 prez.py" while developing.
if __name__ == '__main__':
from prez.cli import main
main()

0
prez/__init__.py Normal file
View File

View File

@ -1,12 +1,11 @@
import struct import struct
from bisect import bisect_left
from rect import *
from utils import *
import sys import sys
from bisect import bisect_left
from resource_writer import ResourceWriter from . rect import *
from . utils import *
from constants import * from . resource_writer import ResourceWriter
from . constants import *
__all__ = ["rObject", "rText", "rTextBlock", "rTextForLETextBox2", __all__ = ["rObject", "rText", "rTextBlock", "rTextForLETextBox2",
"rAlertString", "rErrorString", "rComment", "rPString", "rAlertString", "rErrorString", "rComment", "rPString",

View File

@ -3,10 +3,12 @@ import sys
import io import io
import argparse import argparse
import time import time
from open_rfork import open_rfork
import traceback import traceback
import importlib
from . open_rfork import open_rfork
from . base import rObject
from base import rObject
# from base import * # from base import *
# from window import * # from window import *
@ -19,20 +21,21 @@ from base import rObject
def rez_scope(): def rez_scope():
# import all the resource types and constants into # import all the resource types and constants into
# a dictionary to be the exec() local scope # a dictionary to be the exec() local scope
import base # import prez.base
import window # import prez.window
import control # import prez.control
import menu # import prez.menu
import sound # import prez.sound
import rect # import prez.rect
import version # import prez.version
import tool_startup # import prez.tool_startup
import icon # import prez.icon
import constants # import prez.constants
# could do: mod = importlib.import_module("base"), etc. # could do: mod = importlib.import_module("base"), etc.
scope = {} scope = {}
for mod in (base, window, control, menu, sound, rect, version, tool_startup, icon, constants): for m in ('base', 'window', 'control', 'menu', 'sound', 'rect', 'version', 'tool_startup', 'icon', 'constants'):
mod = importlib.import_module('.' + m, 'prez')
if hasattr(mod, '__all__'): keys = mod.__all__ if hasattr(mod, '__all__'): keys = mod.__all__
else: keys = [x for x in dir(mod) if x[0] != '_'] else: keys = [x for x in dir(mod) if x[0] != '_']
@ -56,20 +59,20 @@ def execute(filename, scope):
print(traceback.format_exc()) print(traceback.format_exc())
return False return False
if __name__ == '__main__': def main():
p = argparse.ArgumentParser(prog='prez') p = argparse.ArgumentParser(prog='prez')
p.add_argument('files', metavar='file', type=str, nargs='+') p.add_argument('files', metavar='file', type=str, nargs='+')
p.add_argument('--rez', action='store_true', help="Generate REZ code") p.add_argument('--rez', action='store_true', help="Generate REZ code")
p.add_argument('-x', action="store_true", help="Generate REZ data") p.add_argument('--hex', action="store_true", help="Generate REZ data")
p.add_argument('-D', type=str, nargs='+', help='define a variable') p.add_argument('-D', type=str, nargs='+', help='define a variable')
p.add_argument('--df', action="store_true", help="Write to a regular file") p.add_argument('--data-fork', action="store_true", help="Write to a regular file")
p.add_argument('-o', metavar='file', type=str, help="Specify output file") p.add_argument('-o', metavar='file', type=str, help="Specify output file")
opts = p.parse_args() opts = p.parse_args()
opts.data_fork = opts.data_fork or not sys.platform in ("win32", "darwin")
df = opts.df or not sys.platform in ("win32", "darwin")
scope = rez_scope() scope = rez_scope()
@ -81,19 +84,20 @@ if __name__ == '__main__':
if errors > 0 : sys.exit(1) if errors > 0 : sys.exit(1)
if not opts.o: opts.rez = True if not opts.o: opts.rez = True
if opts.x: opts.rez = True
if df or opts.rez: if opts.rez or opts.hex:
open_rfork = io.open
if opts.rez:
print("/* Generated on {} */".format(time.ctime())) print("/* Generated on {} */".format(time.ctime()))
print('#include "types.rez"\n') print('#include "types.rez"\n')
if opts.x: rObject.dump_hex() if opts.hex: rObject.dump_hex()
else: rObject.dump_rez() else: rObject.dump_rez()
else: else:
with open_rfork(opts.o, "wb") as io: opener = open_rfork
rObject.save_resources(io) if opts.data_fork: opener = io.open
with opener(opts.o, "wb") as f:
rObject.save_resources(f)
rObject.dump_exports() rObject.dump_exports()
sys.exit(0) sys.exit(0)
if __name__ == '__main__':
main()

View File

@ -1,8 +1,9 @@
from base import rObject, rList, rPString, rTextForLETextBox2
import struct import struct
from rect import *
from colors import * from . base import rObject, rList, rPString, rTextForLETextBox2
from utils import * from . rect import *
from . colors import *
from . utils import *
__all__ = [ __all__ = [

View File

@ -1,6 +1,7 @@
from base import rObject
import struct import struct
from . base import rObject
__all__ = ["rIcon"] __all__ = ["rIcon"]

View File

@ -1,8 +1,9 @@
# key equivalants # key equivalants
import enum import enum
from utils import *
import struct import struct
from . utils import *
__all__ = ["KeyEquivalent"] __all__ = ["KeyEquivalent"]
def export_enum(cls): def export_enum(cls):

View File

@ -1,10 +1,11 @@
from base import *
from utils import *
from icon import rIcon
import struct import struct
import enum import enum
from . base import *
from . utils import *
from . icon import rIcon
__all__ = [ __all__ = [
'rMenuBar', 'rMenuBar',
'rMenu', 'rMenu',

View File

@ -104,7 +104,7 @@ class size_class:
self.width = 0 self.width = 0
if len(args) == 2: if len(args) == 2:
self.height, self.width = args self._assign(*args)
return return
if len(args) == 1: if len(args) == 1:
@ -115,7 +115,7 @@ class size_class:
return return
if is_listy(other) and len(other) == 2: if is_listy(other) and len(other) == 2:
self.height, self.width = other self._assign(*other)
return return
if not args: if not args:
@ -126,9 +126,22 @@ class size_class:
raise ValueError("bad size parameter") raise ValueError("bad size parameter")
def _assign(self, height, width):
self.height = height
self.width = width
def __eq__(self, other): def __eq__(self, other):
return type(other) == size_class and self.height == other.height and self.width == other.width return type(other) == size_class and self.height == other.height and self.width == other.width
def __str__(self):
return "{{ {:d}, {:d} }}".format(self.height, self.width)
def __bytes__(self):
return struct.pack("2H", self.height, self.width)
def __iter__(self):
return (self.height, self.width).__iter__()
def old_size(*args, height=None, width=None): def old_size(*args, height=None, width=None):

View File

@ -1,5 +1,3 @@
from base import rObject
import audioop import audioop
import struct import struct
import re import re
@ -7,6 +5,8 @@ import sys
import os import os
from math import log2 from math import log2
from . base import rObject
__all__ = ["rSoundSample"] __all__ = ["rSoundSample"]
# See: IIgs TechNote #76 Miscellaneous Resource Formats # See: IIgs TechNote #76 Miscellaneous Resource Formats

View File

@ -1,9 +1,10 @@
from base import rObject
from utils import *
import enum import enum
import struct import struct
from . base import rObject
from . utils import *
__all__ = ["rToolStartup"] __all__ = ["rToolStartup"]
# can't be in utils since that's a different __all__ # can't be in utils since that's a different __all__

View File

@ -1,10 +1,10 @@
from base import rObject
from utils import *
import enum import enum
import struct import struct
import re import re
from . base import rObject
from . utils import *
__all__ = ["rVersion"] __all__ = ["rVersion"]

View File

@ -1,13 +1,12 @@
from base import *
from control import rControlTemplate, rControlList
from utils import *
import struct import struct
from . base import *
from . control import rControlTemplate, rControlList
from . utils import *
__all__ = ['rWindParam1'] __all__ = ['rWindParam1']
fHilited = 0x0001 fHilited = 0x0001
fZoomed = 0x0002 fZoomed = 0x0002
fAllocated = 0x0004 fAllocated = 0x0004
@ -37,7 +36,6 @@ class rWindParam1(rObject):
rType = 0x800e rType = 0x800e
def __init__(self, position, title=None, *controls, def __init__(self, position, title=None, *controls,
frameBits = 0, frameBits = 0,
refCon = 0, refCon = 0,
zoomRect = (0, 0, 0, 0), zoomRect = (0, 0, 0, 0),

11
setup.py Normal file
View File

@ -0,0 +1,11 @@
from setuptools import setup
setup(
name = 'prez',
packages = ['prez'],
author = 'Kelvin Sherlock',
entry_points = {
'console_scripts': ['prez=prez.cli:main']
},
)