From 2b32e09bd78cf82723937f42a565adaeedf3501d Mon Sep 17 00:00:00 2001 From: Quinn Dunki Date: Sat, 23 May 2015 12:15:02 -0700 Subject: [PATCH] Documentation polish --- Documentation.html | 1493 ----------------- Documentation.md | 5 + .../xcshareddata/WeeGUI.xccheckout | 4 +- docart/viewdiagram.jpg | Bin 0 -> 38798 bytes weegui.dsk | Bin 143360 -> 143360 bytes 5 files changed, 7 insertions(+), 1495 deletions(-) delete mode 100644 Documentation.html create mode 100644 docart/viewdiagram.jpg diff --git a/Documentation.html b/Documentation.html deleted file mode 100644 index 8b40f4c..0000000 --- a/Documentation.html +++ /dev/null @@ -1,1493 +0,0 @@ -

WeeGUI

- -

WeeGUI is a lightweight library for creating graphical user interfaces in 80 column text mode on the Apple IIe Enhanced and Apple IIc family of computers. It supports both keyboard and mouse controls for your interface. It is designed to take minimal RAM (less than 6k), and can be used from assembly language or Applesoft BASIC programs under ProDOS. WeeGUI installs itself at the top of memory, using an area normally vacant in most BASIC and assembly programs.

- -

You can use WeeGUI as a full-blown user interface system, or as a simple drawing library for ASCII art. Use as much or as little of its features as you wish. WeeGUI tries not to enforce any particular structure or use-case on your program. It is intended to be so easy to use that you'll choose it over rolling your own menuing system for whatever application you're building.

- -


- -

Demo

- -

For a quick demo of what WeeGUI can do, install the disk image weegui.dsk in your emulator, or make a floppy disk from it and boot your real Apple II. On the disk, you'll find the WeeGUI library itself, an Applesoft demo program, and an assembly language demo program. Boot the disk, then try the following commands:

- -
]-basicdemo
-
- -

...for BASIC, or...

- -
]-asmdemo
-
- -

... for assembly language.

- -

You can navigate these demos using Tab and Return, or using your mouse. Mouse support works in the Virtual II emulator just fine (assuming you have a mouse card assigned to one of the slots). If you have a physical Apple II, you can use either a standard Apple IIc mouse, or an Apple IIe mouse with a mouse card in any slot. The Apple IIgs mouse is not officially supported at the moment.

- -

If you prefer to learn by example, the source code of these two example programs can be found in Appendix B of this document.

- -


- -

Installation

- -

Applesoft

- -

Place the WeeGUI library in the same ProDOS folder as your program. Then, at the top of your program, simply load it into memory as follows:

- -
10  PRINT  CHR$ (4)"BRUN WEEGUI"
-
- -

That's it! WeeGUI will load itself at address $7E00 of main memory, just below ProDOS.

- -

Assembly Language

- -

When using assembly language, you can install WeeGUI by loading the WEEGUI library into memory from your program. The simplest way to do this is to invoke BRUN using the Applesoft input buffer, like this:

- -
    ldx #0
-    ldy #0
-@0: lda bloadCmdLine,x
-    beq @1
-    sta $0200,y
-    inx
-    iny
-    bra @0
-@1: jsr $be03
-
-bloadCmdLine:
-    .byte "BRUN WEEGUI",$8d,0
-
- -

If you load the library some other way, make sure you load it at $7E00, and perform a JSR to that address in order to prepare the library for use.

- -

You also need to include the file WeeGUI_MLI.s in your program. This is the WeeGUI Machine Language Interface, and it provides all the constants, entry points, etc that you'll need for WeeGUI.

- -

With either language, WeeGUI protects itself using ProDOS's memory page reservation scheme. This prevents it from being overwritten by ProDOS file operations, or Applesoft BASIC.

- -


- -

Calling WeeGUI

- -

Applesoft

- -

WeeGUI is accessed from Applesoft through ampersand extensions. For example, the DESK command clears the screen and draws a desktop background:

- -
10 &DESK
-
- -

If the call requires parameters, you can make a C-style function call. For example, to select view #6, you would call:

- -
10 &SEL(6)
-
- -

The exact name of each API call is specified in the Applesoft portion of the API documentation below.

- -

Also note that you can call WeeGUI interactively from the Applesoft prompt. No line numbers required! This is a great way to experiment with the API calls. Some calls may leave the cursor in an odd location, but you can still get the gist of things.

- -

Assembly Language

- -

Note: All assembly language samples are written in the style of the ca65 assembler (which is also what WeeGUI is written in). However, the code is easily adaptable to your assembler of choice.

- -

From assembly, a Machine Language Interface is provided, similar to ProDOS. WeeGUI is called by setting a function name in the X register, and calling the WeeGUI entry point. For example:

- -
main:
-    ldx #WGDesktop
-    jsr WeeGUI
-
- -

The constant WGDesktop is provided to your program by the WeeGUI_MLI.s file (part of the WeeGUI package). Be sure to include this file in your assembly language project. If a call requires parameters, these will be passed in a couple of ways, as shown below.

- -
Register Passing:
- -

Simple calls may use a register or two for parameters. For example, the call to select a view uses the accumulator (as specified in the API documentation):

- -
lda #6              ; This is our parameter
-ldx #WGSelectView   ; Followed by a typical WeeGUI call
-jsr WeeGUI
-
- -
Zero Page Passing:
- -

For more complex calls, there are 4 reserved parameter-passing locations in the zeropage. These are named PARAM0-PARAM3, and are specified in WeeGUI_MLI.s. These locations are unused by Applesoft or ProDOS. You can use them in your own programs, so long as they aren't disrupted while inside a WeeGUI call.

- -

For example, the call to create a view uses the zero page to pass a pointer (as specified in the API documentation):

- -
lda #<addr          ; 'addr' is a 16-bit pointer we'd like to pass in
-sta PARAM0          ; PARAMn are reserved zeropage locations
-lda #>addr
-sta PARAM1
-ldx #WGCreateView   ; Now we can make our typical WeeGUI call
-jsr WeeGUI
-
- -

See the section Callbacks, below, for more information on how 16-bit values are passed in to WeeGUI.

- -


- -

Program Structure for WeeGUI

- -

Graphical user interfaces generally have a concept of a run loop. This is important because the program flow is driven asynchronously by the user's actions. Compare this to command-line programs, which enforce flow with specific moments of being blocked waiting for input. Most GUI libraries impose this run loop structure on your program. WeeGUI does not. Rather, it provides tools for you to set up a run loop if you wish, or you may simply call into WeeGUI in whatever way is most useful for your program. However, for a properly structured GUI program, you should build a run loop using the techniques described below.

- -

Assembly Language

- -

A typical assembly language run loop simply waits for keypresses and responds to them.

- -
runLoop:
-    lda $C000
-    bpl runLoop
-    sta $C010
-
-    ; Respond to keys as needed
-
-    jmp runLoop
-
- -

If you want to support the mouse, WeeGUI has you covered. You just need to add one piece to your run loop:

- -
runLoop:
-    ldx #WGPendingViewAction
-    jsr WeeGUI
-
-    lda $C000
-    bpl runLoop
-    sta $C010
-
-    ; Respond to keys as needed
-
-    jmp runLoop
-
- -

Note the call to WGPendingViewAction on each pass through the loop. For the mouse, WeeGUI will make note of actions taken by the user, but won't act until you say so. It is up to your program to call WGPendingViewAction periodically to allow WeeGUI to handle these events.

- -

WeeGUI calls are relatively free of side effects. Most calls will clobber the BASL and BASH values in the zeropage (typically used by text rendering in Applesoft and other programs). Unless otherwise noted, all registers except parameters passed in can be assumed to be preserved by all API calls, and the system can be assumed to be in the same state you left it when you made the WeeGUI call.

- -

The API documentation below indicates which registers and/or PARAM locations are used for parameter passing in each call, and what the value of the X register should be (in terms of constants supplied by WeeGUI_MLI.s)

- -

Applesoft

- -

Normally, Applesoft is not intended to be used in a run-loop style of programming. To use a run-loop, there needs to be a non-blocking form of user-input. WeeGUI provides this for you with the &GET function. Calling &GET will retrieve keyboard input if any is pending, and store it in the variable you provide. If no keypresses are pending, execution proceeds to the next line.

- -

Similar to the Assembly Language run loop, your Applesoft program also needs to allow WeeGUI to process mouse events that the user is creating outside your program's control. This is done with the &PDACT (pending action) function.

- -

Here's a sample Applesoft run loop using these techniques:

- -
1  PRINT  CHR$ (4)"brun weegui"
-70 REM Run Loop
-80  &PDACT
-85  &GET(A$)
-90  IF A$ = "q" THEN END
-100  GOTO 80
-
- -

You can omit &PDACT if you have no desire to support the mouse.

- -

Callbacks

- -

User interface elements (such as buttons and checkboxes) can have an action callback attached to them. This is a piece of your code that is called by WeeGUI any time that interface element needs to take action. This may occur when the user clicks with the mouse, or when they hit a hotkey on the keyboard, for example.

- -

In Applesoft, callbacks are simply a line-number. WeeGUI will perform a GOSUB to the line number you provide, and expects it to end with a RETURN.

- -

In assembly language, callbacks are a 16-bit address (a function pointer, of sorts) that you provide. WeeGUI will perform a JSR to the address you provide, and it is expected that your callback will end with an RTS. 16-bit pointers are always provided with the least significant byte first, just like any other 16-bit value on the Apple II.

- -

Mouse Control

- -

Adding mouse support to your WeeGUI program is very easy. The mouse is enabled and disabled using API calls. Once enabled, the mouse is processed automatically for you (including rendering the pointer as needed). When the user clicks on an interactive GUI element, WeeGUI will invoke a callback in your program, using the methods detailed above, under Callbacks.

- -

As explained earlier, these callbacks are performed (if needed) when you invoke WGPendingViewAction from assembly language, or &PDACT from Applesoft. Make sure to perform this call frequently inside your run loop.

- -

Here's sample code for setting up a button that can be clicked, and providing the callback for that button, in both languages.

- -

Assembly Language

- -
    ; Create the button. This is done by passing a pointer to a parameter block
-    lda #<MyButton
-    sta PARAM0
-    lda #>MyButton
-    sta PARAM1
-    ldx #WGCreateButton
-    jsr WeeGUI
-
-    ...
-
-myCallback:
-    ; Do stuff when button is clicked
-    rts
-
-
-    ...
-
-MyButton:
-    .byte 2,35,10,15        ; Position and size of button
-    .addr myCallback        ; Pointer to callback when clicked
-    .addr MyTitle           ; Pointer to null-terminated title
-
-MyTitle:
-    .byte "Okay",0
-
- -

Applesoft

- -
10 REM Create Button with given position and size.
-20 REM Note line-number (1000) provided for callback
-30  &BUTTN(2,35,10,15,1000,"Okay")  
-
-...
-
-1000 PRINT "Button Clicked"
-1010 RETURN
-
- -


- -

Character Types

- -

A quick note on use of characters and strings in WeeGUI. The Apple II ROM tends to want the high bit set when otherwise-normal ASCII character values are provided. Similarly, characters given to programs by the ROM often have the high bit set. WeeGUI refers to this as the "Apple" format for characters. Normal "ASCII" format refers to characters whereby the high bit is not used in this artificial fashion. Unless otherwise specified, you can assume WeeGUI expects normal ASCII characters.

- -


- -

Coordinate Systems

- -

Since WeeGUI operates on the 80 column text screen, the global coordinate system ranges from 0-79 horizontally, and 0-23 vertically. When specifying the location of a window, for example, you will use this global coordinate system.

- -

Each View (see below) also has its own coordinate space, starting with (0,0) in the upper left. This coordinate space is the size of the content region of the view, so it may be larger than the view itself. When a view scrolls, the local coordinate system moves, such that (0,0) in view space may map to a different point in global space. Of course, view content is also clipped, so if the view is scrolled, the (0,0) will not actually be visible.

- -


- -

Views

- -

The basic "unit" of WeeGUI operations is the View. Your program can have up to 16 views at one time, and views are identified with a 4-bit ID number. Buttons and checkboxes are also views, and require their own view ID. So, for example, if you have four buttons, you have room for twelve other views of any type.

- -

A View is a rectangle inside which content is displayed. Content exists in a special coordinate system local to the view it is displayed in. This content can be larger than the view is onscreen. When drawn, content is clipped to the edges of the view. Content can also be scrolled in any direction, thus creating a larger virtual space that the view shows a small piece of at any one time.

- -

Many API calls rely on the concept of a "selected" view. One view at a time can be "selected", and subsequent view-related operations will apply to that view. There is no visual effect to "selecting" a view. It's simply a way to tell WeeGUI which view you are currently interested in.

- -

IMPORTANT: The visual border around a view (a one-character-thick outline) is drawn outside the bounds of the view. This means you need to allow room around your views. Don't attempt to place a view in columns 0 or 79, or in rows 0 or 23. In order to maximize rendering speed, WeeGUI takes only minimal precautions to prevent rendering outside the visible screen area.

- -


- -

Cursors

- -

WeeGUI has multiple cursors. There is always a global cursor, which maps to the Apple II's normal cursor. You will very rarely need to know about or use this cursor. Each View also has its own local cursor, which moves in that View's coordinate space. These local view cursors are independent of each other, and are the ones you will use for most operations.

- -


- -

Focus

- -

In order to support keyboard control of GUIs, WeeGUI includes the concept of "view focus". The currently "focused" view will be visibly highlighted in some way to the user, and taking "action" will affect the currently selected view. It's up to your program to provide a way to shift focus (such as with the Tab key). Your program also specifies when the currently focused view should take action (usually via Return, Space, or similar keypress). WeeGUI handles rendering the highlighted element in a distinct way. Your program only needs to specify when to shift focus.

- -

There is also a construct called the focus chain. This is an implied list of views, and of which can become the focused one. Any time you request the "next" or "previous" focus view, WeeGUI finds the next (or previous) view in the chain which is eligible for focus. This focus chain is created in the order you create your views. Views that cannot receive focus are automatically left out of the chain. As you add and remove views, WeeGUI updates the focus chain for you.

- -

Focusing is not relevant to mouse control, since the user can take action on any view at any time.

- -


- -

WeeGUI API Reference

- -

The following is a complete list of the Application Program Interface calls you can make. Both languages are shown when available, but not all API calls have both an Applesoft and assembly version.

- -

For assembly, each call indicates which registers and/or PARAM locations are used for parameter passing, and what the value of the X register should be (in terms of constants supplied by WeeGUI_MLI.s)

- -

Applesoft calls are sometimes shown over multiple lines for visual clarity, but of course they need to be all on one line in practice.

- -


- -

View Routines

- -

These routines are used for creating, modifying, and working with views.

- -

WGCreateView

- -

Creates a new WeeGUI view. Up to 16 are allowed in one program. If a view is created with the same ID as a previous view, the previous view is destroyed. Views are not shown when created. Call WGPaintView to display it.

- - - -
AssemblyApplesoft
-X:      WGCreateView
-PARAM0: Pointer to configuration block (LSB)
-PARAM1: Pointer to configuration block (MSB)
-
-Configuration block consists of eight bytes:
-    0:  View ID (0-15)
-    1:  Style (0 for plain, 1 for fancy)
-    2:  Left edge of view
-    3:  Top edge of view
-    4:  Visible width of view
-    5:  Visible height of view
-    6:  Width of view's content
-    7:  Height of view's content
-
-&WINDW( View ID,
-        Style (0 for plain, 1 for fancy),
-        Left edge,
-        Top edge,
-        View width,
-        View height,
-        Content width,
-        Content height)
-
- -

WGCreateCheckbox

- -

Creates a new WeeGUI checkbox view. This is a specialized version of WGCreateView, and its parameters are similar.

- - - -
AssemblyApplesoft
-X:      WGCreateCheckbox
-PARAM0: Pointer to configuration block (LSB)
-PARAM1: Pointer to configuration block (MSB)
-
-Configuration block consists of five bytes:
-    0:  View ID (0-15)
-    1:  X position of checkbox
-    2:  Y position of checkbox
-    3:  Pointer to null-terminated string label (LSB)
-    4:  Pointer to null-terminated string label (MSB)
-
-&CHKBX( View ID,
-        X position,
-        Y position,
-        "Label")
-
- -

WGCreateButton

- -

Creates a new WeeGUI button view. This is a specialized version of WGCreateView, and its parameters are similar.

- - - -
AssemblyApplesoft
-X:      WGCreateButton
-PARAM0: Pointer to configuration block (LSB)
-PARAM1: Pointer to configuration block (MSB)
-
-Configuration block consists of eight bytes:
-    0:  View ID (0-15)
-    1:  Left edge of button
-    2:  Top edge of button
-    3:  Width of button
-    4:  Pointer to click callback (LSB)
-    5:  Pointer to click callback (MSB)
-    6:  Pointer to null-terminated string label (LSB)
-    7:  Pointer to null-terminated string label (MSB)
-
-&BUTTN( View ID,
-        Left edge,
-        Top edge,
-        Width,
-        Line number for click callback,
-        "Label")
-
- -

WGSelectView

- -

Selects a view. Subsequent view-related operations will apply to this view. Does not affect visual appearance of view.

- - - -
AssemblyApplesoft
-X:      WGSelectView
-A:      View ID
-
-&SEL(View ID)
-
- -

WGPendingViewAction

- -

Processes any pending view actions that the user has initiated with the mouse. This should be called once each time through your run loop. If no mouse actions are pending, this call will do nothing, and quietly return to your program. If you do not wish to support the mouse, you do not need to call this.

- - - -
AssemblyApplesoft
-X:      WGPendingViewAction
-
-&PDACT
-
- -

WGPendingView

- -

Returns the currently pending view, if any. This is a way to peek into the state of the mouse event system, to see if the user is trying to do something with the mouse. Most programs shouldn't need this.

- -

- -
AssemblyApplesoft
-X:      WGPendingView

- -

Returns in A: View ID -

-Not available -

- -

WGViewFocus

- -

Focus is shifted to the currently selected view. This will highlight the view visually, as needed, and any affected views are redrawn as needed.

- - - -
AssemblyApplesoft
-X:      WGViewFocus
-
-&FOC
-
- -

WGViewUnfocus

- -

The currently focused view becomes unfocused. Views are redrawn as needed.

- -

- -
AssemblyApplesoft
-X:      WGViewUnfocus
-
-Not available -

- -

WGViewFocusNext

- -

Focus is shifted to the next view in the focus chain, wrapping around to the first one if needed.

- - - -
AssemblyApplesoft
-X:      WGViewFocusNext
-
-&FOCN
-
- -

WGViewFocusPrev

- -

Focus is shifted to the previous view in the focus chain, wrapping around to the last one if needed.

- - - -
AssemblyApplesoft
-X:      WGViewFocusPrev
-
-&FOCP
-
- -

WGViewFocusAction

- -

Action is taken on the currently focused view. If the view is a checkbox, that checkbox will be toggled. If the view is a button, the button will be clicked. Any callback attached to the view will be invoked.

- - - -
AssemblyApplesoft
-X:      WGViewFocusAction
-
-&ACT
-
- -

WGPaintView

- -

Draws (or redraws) the currently selected view.

- - - -
AssemblyApplesoft
-X:      WGPaintView
-
-&PNT
-
- -

WGViewPaintAll

- -

Redraws all views. This is useful if the screen becomes corrupted, or you need to erase it for any reason.

- - - -
AssemblyApplesoft
-X:      WGViewPaintAll
-
-&PNTA
-
- -

WGViewSetTitle

- -

Changes the title of the selected view. Titles are only visible in the "fancy" style of view border. In Applesoft, the view is automatically redrawn to reflect the change. In assembly, you must call WGPaintView manually to see the change.

- - - -
AssemblyApplesoft
-X:      WGViewSetTitle
-PARAM0: Pointer to null-terminated string (LSB)
-PARAM1: Pointer to null-terminated string (MSB)
-
-&TITLE("title")
-
- -

WGViewSetAction

- -

Changes the action callback of the selected view.

- - - -
AssemblyApplesoft
-X:      WGViewSetAction
-PARAM0: Function pointer (LSB)
-PARAM1: Function pointer (MSB)
-
-&STACT(line number)
-
- -

WGViewFromPoint

- -

Returns the innermost view that contains the given point (in the lower nybble). For fancy views, the upper nybble of the result indicates which window feature was found:

- - - - - - - - - -
Upper nybbleWindow feature
0000Content region
0001Scroll arrow up
0010Scroll arrow down
0011Scroll arrow left
0100Scroll arrow right
- -

- -
AssemblyApplesoft
-X:      WGViewFromPoint
-PARAM0: X position to test
-PARAM1: Y position to test
-Returns in A:   View ID (or <0 if no match)
-
-Not available -

- -


- -

Cursor Routines

- -

These routines are used for manipulating the various cursors in WeeGUI. As explained above, each view has its own local cursor, which is what you will normally interact with. The system global cursor is generally reserved for use by WeeGUI.

- -

WGSetCursor

- -

Changes the position of the local cursor in the currently selected view.

- - - -
AssemblyApplesoft
-X:      WGSetCursor
-PARAM0: New X position
-PARAM1: New Y position
-
-&CURSR(x,y)
-
- -

WGSetGlobalCursor

- -

Changes the position of the global system cursor. Most programs should not normally need to do this, and it may have unpredictable effects on WeeGUI or Applesoft's visual appearance.

- -

- -
AssemblyApplesoft
-X:      WGSetGlobalCursor
-PARAM0: New X position
-PARAM1: New Y position
-
-Not available -

- -

WGSyncGlobalCursor

- -

Synchronizes the global system cursor to the currently selected view's local cursor. If you modify the global cursor, you can call this to reset it to where WeeGUI expects it to be. Most programs should not need to use this, and results may be unpredictable.

- -

- -
AssemblyApplesoft
-X:      WGSyncGlobalCursor
-
-Not available -

- -


- -

Scrolling Routines

- -

These routines are used for scrolling view contents and working with scrollable views.

- -

WGScrollX

- -

Scrolls the currently selected view's contents to the specified horizontal position.

- -

- -
AssemblyApplesoft
-X:      WGScrollX
-A:      New X scroll position
-
-Not available (see WGScroll) -

- -

WGScrollY

- -

Scrolls the currently selected view's contents to the specified vertical position.

- - - -
AssemblyApplesoft
-X:      WGScrollY
-A:      New Y scroll position
-
-Not available (see WGScroll) -
- - -####WGScroll -Scrolls the currently selected view's contents to the specified vertical and horizontal position. - - - -
AssemblyApplesoft
-Not available -
-&SCR(X position, Y position)
-
- -

WGScrollByX

- -

Scrolls the currently selected view's contents by a specified delta horizontally (positive or negative).

- -

- -
AssemblyApplesoft
-X:      WGScrollByX
-A:      Offset to apply to X scroll position
-
-Not available (see WGScrollBy) -

- -

WGScrollByY

- -

Scrolls the currently selected view's contents by a specified delta vertically (positive or negative).

- - - -
AssemblyApplesoft
-X:      WGScrollY
-A:      Offset to apply to Y scroll position
-
-Not available -
- - -####WGScrollBy -Scrolls the currently selected view's contents by a specified delta (positive or negative). - - - -
AssemblyApplesoft
-Not available -
-&SCRBY(X offset, Y offset)
-
- -


- -

Drawing Routines

- -

All drawing routines (except WGPrint) operate in the global coordinate space (not in local view space). You can use these drawing routines by themselves for pseudo-graphical rendering effects in your programs, or in conjunction with higher level calls for creating and using GUI elements.

- -

WGClearScreen

- -

Clears the screen to black. Unlike Applesoft HOME, this version always clears to black, regardless of the INVERSE setting, and the global cursor is left at the bottom instead of the top.

- - - -
AssemblyApplesoft
-X:      WGClearScreen
-
-&HOME
-
- -

WGDesktop

- -

Paints a desktop background on the screen.

- - - -
AssemblyApplesoft
-X:      WGDesktop
-
-&DESK
-
- -

WGPlot

- -

Plots a single character. For Applesoft, you supply the Apple ROM value of the character, and all character sets are supported with no mode changing required. This means you can directly plot inverse lowercase, or MouseText characters, for example. For a complete list of the values of every character in the Apple IIe Enchanced set, see Appendix B.

- - - -
AssemblyApplesoft
-X:      WGPlot
-A:      Character to plot (Apple format)
-
-Note: Character is plotted at the current global cursor position.
-
-&PLOT(X position
-      Y position,
-      character)
-
- -

WGPrint

- -

Prints a string into the current view, at the local cursor position. The text is wrapped to the view's content width, and clipped to the visible view boundaries.

- - - -
AssemblyApplesoft
-X:      WGPrint
-PARAM0: Pointer to null-terminated string (LSB)
-PARAM1: Pointer to null-terminated string (MSB)
-
-&PRINT("string")
-
- -

WGStrokeRect

- -

Draws the outline of a rectangle. The rectangle is drawn one pixel outside the region you specify. So, do not attempt to stroke a rectangle in row 0, row 23, column 0, or column 79. You may overwrite screen holes and cause system malfunctions.

- - - -
AssemblyApplesoft
-X:      WGStrokeRect
-PARAM0: Left edge
-PARAM1: Top edge
-PARAM2: Width
-PARAM3: Height
-
-&DRAW(left,top,width,height)
-
- -

WGFillRect

- -

Fills a rectangle with a given character

- - - -
AssemblyApplesoft
-X:      WGFillRect
-PARAM0: Left edge
-PARAM1: Top edge
-PARAM2: Width
-PARAM3: Height
-Y:      Character to fill with (Apple format)
-
-&FILL(left,top,width,height,character)
-
- -

WGFancyRect

- -

Draws the outline of decorated GUI-style window, with scrollbars and title bar. Similar to WGStrokeRect, the drawing occurs outside the rectangle you specify, so do not attempt to draw a fancy rect in row 0, row 23, column 0, or column 79.

- -

- -
AssemblyApplesoft
-X:      WGFancyRect
-PARAM0: Left edge
-PARAM1: Top edge
-PARAM2: Width
-PARAM3: Height
-
-Not available -

- -


- -

Mouse & Keyboard Routines

- -

Various useful routines for working with the mouse and keyboard.

- -

WGEnableMouse

- -

Enables the mouse. Call this once at the start of your program to begin using the mouse. Calling this sets up the interrupt mechanisms needed to manage the mouse. If you start the mouse with this call, it's very important to call WGDisableMouse (below) when your program quits.

- - - -
AssemblyApplesoft
-X:      WGEnableMouse
-
-Not available (see WGMouse) -
- - -####WGDisableMouse -Disables the mouse. Call this when quitting your program, if you called WGEnableMouse. This is very important, as the interrupt mechanisms created for the mouse must be dismantled, otherwise the Apple II will be left in an unsafe state. - - - -
AssemblyApplesoft
-X:      WGDisableMouse
-
-Not available (see WGMouse) -
- - -####WGMouse -Enables or disables the mouse. Passing a '1' is equivalent to calling WGEnableMouse (above). Passing a '0' is equivalent to calling WGDisableMouse (above). The same caveats and warnings apply. - - - -
AssemblyApplesoft
-Not available -
-&MOUSE(1 to enable or 0 to disable)
-
- - -####WGGet -A non-blocking version of Applesoft's GET. This allows you to easily create run-loops for GUI programming in Applesoft. The key read is returned in the Applesoft string variable you specify. If no keypress is pending, the value will be an empty string. - - - -
AssemblyApplesoft
-Not available -
-&GET(A$) 
-
- -


- -

Miscellaneous Routines

- -

Other stuff you might need.

- -

WGExit

- -

Cleans up and shuts down WeeGUI. If you want your application to return cleanly to Applesoft when it's done, you must call this. Otherwise you may get ProDOS complaining it is out of buffers, or other strange behaviour.

- - - -
AssemblyApplesoft
-X:      WGExit
-
-&EXIT
-
- -



- -
- -


- -

Appendix A: AUXMEM Branch

- -

For those really advanced users who want to get the most out of WeeGUI, there's an experimental branch with some more sophisticated options. Most significantly, almost all of the code in this version lives at the top of AUX memory (the other 64k your IIe/c came with). That means virtually all of main memory (and most of AUX memory) is free for your programs to use. The only thing in main memory is a small dispatcher, which lives in everyone's favorite memory hole at $300. Also, this version separates out the mouse code as a separate driver program which can be loaded or not, as needed, saving further memory. If loaded, the mouse driver lives at the top of main memory, just under ProDOS. Interrupt code can not run from AUX memory, so this compromise is necessary.

- -

This branch sacrifices the Applesoft API however, because it is not possible for code running from AUX memory to access Applesoft programs and variables, as is required for the API to work.

- -

The AUXMEM branch is experimental, and not currently supported. If you're interested in using it or playing with it, feel free to clone it and play around. I'm happy to answer questions about it, as well, although I can't necessarily provide full technical support.

- -



- -
- -


- -

Appendix B: Apple Character Set

- -

Below are complete listings of the Apple //e Enchanced (and Apple //c) ROM character set. The characters are shown as they appear on a black video screen. In other words, "normal" is white text on a black background. These values can be passed directly into WGPlot (&PLOT in Applesoft) to draw any character directly to the screen. No need to mess with inverse mode and escape characters!

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ValueCharacterValueCharacterValueCharacterValueCharacter
0 -@16 -P32 - 48 -0
1 -A17 -Q33 -!49 -1
2 -B18 -R34 -"50 -2
3 -C19 -S35 -#51 -3
4 -D20 -T36 -$52 -4
5 -E21 -U37 -%53 -5
6 -F22 -V38 -&54 -6
7 -G23 -W39 -'55 -7
8 -H24 -X40 -(56 -8
9 -I25 -Y41 -)57 -9
10 -J26 -Z42 -*58 -:
11 -K27 -[43 -+59 -;
12 -L28 -\44 -,60 -<
13 -M29 -]45 --61 -=
14 -N30 -^46 -.62 ->
15 -O31 -_47 -/63 -?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ValueCharacterValueCharacterValueCharacterValueCharacter
64 -80 -96 -`112 -p
65 -81 -97 -a113 -q
66 -82 -98 -b114 -r
67 -83 -99 -c115 -s
68 -84 -100 -d116 -t
69 -85 -101 -e117 -u
70 -86 -102 -f118 -v
71 -87 -103 -g119 -w
72 -88 -104 -h120 -x
73 -89 -105 -i121 -y
74 -90 -106 -j122 -z
75 -91 -107 -k123 -{
76 -92 -108 -l124 -|
77 -93 -109 -m125 -}
78 -94 -110 -n126 -~
79 -95 -111 -o127 -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ValueCharacterValueCharacterValueCharacterValueCharacter
128 -@144 -P160 - 176 -0
129 -A145 -Q161 -!177 -1
130 -B146 -R162 -"178 -2
131 -C147 -S163 -#179 -3
132 -D148 -T164 -$180 -4
133 -E149 -U165 -%181 -5
134 -F150 -V166 -&182 -6
135 -G151 -W167 -'183 -7
136 -H152 -X168 -(184 -8
137 -I153 -Y169 -)185 -9
138 -J154 -Z170 -*186 -:
139 -K155 -[171 -+187 -;
140 -L156 -\172 -,188 -<
141 -M157 -]173 --189 -=
142 -N158 -^174 -.190 ->
143 -O159 -_175 -/191 -?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ValueCharacterValueCharacterValueCharacterValueCharacter
192 -@208 -P224 -`240 -p
193 -A209 -Q225 -a241 -q
194 -B210 -R226 -b242 -r
195 -C211 -S227 -c243 -s
196 -D212 -T228 -d244 -t
197 -E213 -U229 -e245 -u
198 -F214 -V230 -f246 -v
199 -G215 -W231 -g247 -w
200 -H216 -X232 -h248 -x
201 -I217 -Y233 -i249 -y
202 -J218 -Z234 -j250 -z
203 -K219 -[235 -k251 -{
204 -L220 -\236 -l252 -|
205 -M221 -]237 -m253 -|
206 -N222 -^238 -n254 -~
207 -O223 -_239 -o255 -
- - diff --git a/Documentation.md b/Documentation.md index 60f3a56..c1ccb05 100644 --- a/Documentation.md +++ b/Documentation.md @@ -302,6 +302,11 @@ Many API calls rely on the concept of a "selected" view. One view at a time can
+

+The above diagram shows how the two coordinate systems (global and local) relate to each other. Note that the content area of a view (shown in light blue) is larger than what is shown. The content is clipped to the red box, and can be scrolled as needed. + +
+ View Styles ----------- diff --git a/WeeGUI.xcodeproj/project.xcworkspace/xcshareddata/WeeGUI.xccheckout b/WeeGUI.xcodeproj/project.xcworkspace/xcshareddata/WeeGUI.xccheckout index bf2a6a2..8b995da 100644 --- a/WeeGUI.xcodeproj/project.xcworkspace/xcshareddata/WeeGUI.xccheckout +++ b/WeeGUI.xcodeproj/project.xcworkspace/xcshareddata/WeeGUI.xccheckout @@ -7,14 +7,14 @@ IDESourceControlProjectIdentifier CF799A61-C8B1-43FD-B9D1-A4282374D325 IDESourceControlProjectName - WeeGUI + project IDESourceControlProjectOriginsDictionary F041408A2ABBA5E27FC164AE936A5C1AA13AD5FD https://github.com/blondie7575/WeeGUI IDESourceControlProjectPath - WeeGUI.xcodeproj + WeeGUI.xcodeproj/project.xcworkspace IDESourceControlProjectRelativeInstallPathDictionary F041408A2ABBA5E27FC164AE936A5C1AA13AD5FD diff --git a/docart/viewdiagram.jpg b/docart/viewdiagram.jpg new file mode 100644 index 0000000000000000000000000000000000000000..486c559f59217c08a6754f9d9edbba196308d875 GIT binary patch literal 38798 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 delta 146 zcmZp8z|ru4V*?j6Bj;vr=6ZHD2B#3$;1C8l_*2Zl$dJUqU@53AsLb$~kwZy{nU85Q zBU8|1CT?X$&dF-rE+)QmA{-11j~Nm`3?>G(a93CNP)~oDA#6Gfd<^~)3@~N2Ajal- c+)1-13ouDc-tg9Nv%tRXj7=+-tz>Km00z(>djJ3c