mirror of
https://github.com/alfishe/amiga-bootcamp.git
synced 2026-06-13 08:36:28 +00:00
236 lines
6.4 KiB
Markdown
236 lines
6.4 KiB
Markdown
|
|
[← Home](../../../README.md) · [Intuition](../../README.md) · [Frameworks](../README.md)
|
||
|
|
|
||
|
|
# Core Concepts
|
||
|
|
|
||
|
|
## Naming Conventions
|
||
|
|
|
||
|
|
MUI uses a strict prefix system defined in `libraries/mui.h`. Every identifier type has its own prefix:
|
||
|
|
|
||
|
|
| Prefix | Meaning | Example |
|
||
|
|
|--------|---------|---------|
|
||
|
|
| `MUIC_` | Class name | `MUIC_Area`, `MUIC_Window` |
|
||
|
|
| `MUIM_` | Method | `MUIM_Draw`, `MUIM_AskMinMax` |
|
||
|
|
| `MUIP_` | Method parameter structure | `MUIP_Draw`, `MUIP_AskMinMax` |
|
||
|
|
| `MUIV_` | Special method/attribute value | `MUIV_Application_ReturnID_Quit` |
|
||
|
|
| `MUIA_` | Attribute | `MUIA_Window_Title` |
|
||
|
|
| `MUIE_` | Error return code | `MUIE_OutOfMemory` |
|
||
|
|
| `MUII_` | Standard MUI image | `MUII_BACKGROUND`, `MUII_SHADOW` |
|
||
|
|
| `MUIX_` | Control code for text strings | `MUIX_C` (center), `MUIX_B` (bold) |
|
||
|
|
| `MUIO_` | Object type for `MUI_MakeObject()` | `MUIO_Button`, `MUIO_HBar` |
|
||
|
|
|
||
|
|
Learning these prefixes makes reading MUI code significantly easier.
|
||
|
|
|
||
|
|
## Attributes
|
||
|
|
|
||
|
|
Attributes are the properties of MUI objects. Each attribute definition in `libraries/mui.h` is followed by a comment with the letters **I**, **S**, and/or **G**:
|
||
|
|
|
||
|
|
- **I** - Can be specified at object creation time
|
||
|
|
- **S** - Can be changed later with `SetAttrs()` or the `set()` macro
|
||
|
|
- **G** - Can be read with `GetAttr()` or the `get()` macro
|
||
|
|
|
||
|
|
Example:
|
||
|
|
|
||
|
|
```c
|
||
|
|
#define MUIA_Window_Title 0x8042c21d /* ISG */
|
||
|
|
```
|
||
|
|
|
||
|
|
This means `MUIA_Window_Title` can be set at creation, changed later, and queried at any time.
|
||
|
|
|
||
|
|
### Setting Attributes
|
||
|
|
|
||
|
|
At creation time, attributes are passed as tag-value pairs:
|
||
|
|
|
||
|
|
```c
|
||
|
|
app = ApplicationObject,
|
||
|
|
MUIA_Application_Title, "MyApp",
|
||
|
|
MUIA_Application_Base , "MYAPP",
|
||
|
|
TAG_DONE;
|
||
|
|
```
|
||
|
|
|
||
|
|
After creation, use `set()`:
|
||
|
|
|
||
|
|
```c
|
||
|
|
set(window, MUIA_Window_Open, TRUE);
|
||
|
|
```
|
||
|
|
|
||
|
|
Or use `SetAttrs()` directly:
|
||
|
|
|
||
|
|
```c
|
||
|
|
SetAttrs(window, MUIA_Window_Open, TRUE, TAG_DONE);
|
||
|
|
```
|
||
|
|
|
||
|
|
### Getting Attributes
|
||
|
|
|
||
|
|
```c
|
||
|
|
ULONG is_open;
|
||
|
|
get(window, MUIA_Window_Open, &is_open);
|
||
|
|
```
|
||
|
|
|
||
|
|
## Object Creation Macros
|
||
|
|
|
||
|
|
MUI provides convenience macros that look like function calls but expand into `NewObject()` calls with the appropriate class and tags. These macros make code readable and maintainable.
|
||
|
|
|
||
|
|
### Common Creation Macros
|
||
|
|
|
||
|
|
```c
|
||
|
|
/* Application and Window */
|
||
|
|
ApplicationObject, ... , TAG_DONE;
|
||
|
|
WindowObject, ... , TAG_DONE;
|
||
|
|
|
||
|
|
/* Groups */
|
||
|
|
VGroup, ... , End;
|
||
|
|
HGroup, ... , End;
|
||
|
|
GroupObject, ... , End;
|
||
|
|
|
||
|
|
/* Widgets */
|
||
|
|
TextObject, ... , End;
|
||
|
|
StringObject, ... , End;
|
||
|
|
ListviewObject, ... , End;
|
||
|
|
ListObject, ... , End;
|
||
|
|
SliderObject, ... , End;
|
||
|
|
CycleObject, ... , End;
|
||
|
|
RadioObject, ... , End;
|
||
|
|
GaugeObject, ... , End;
|
||
|
|
ScaleObject, ... , End;
|
||
|
|
ImageObject, ... , End;
|
||
|
|
BitmapObject, ... , End;
|
||
|
|
ColorfieldObject, ... , End;
|
||
|
|
PaletteObject, ... , End;
|
||
|
|
|
||
|
|
/* Popups */
|
||
|
|
PopstringObject, ... , End;
|
||
|
|
PopaslObject, ... , End;
|
||
|
|
PopobjectObject, ... , End;
|
||
|
|
PoplistObject, ... , End;
|
||
|
|
|
||
|
|
/* Special helpers */
|
||
|
|
SimpleButton("Label")
|
||
|
|
HSpace(x)
|
||
|
|
VSpace(x)
|
||
|
|
```
|
||
|
|
|
||
|
|
The pattern is consistent: the macro name corresponds to the class, attributes follow as tag-value pairs, and the object is terminated with `End` or `TAG_DONE`.
|
||
|
|
|
||
|
|
## Tag-Based Construction
|
||
|
|
|
||
|
|
MUI objects are created using the Amiga tag system. Tags are 32-bit values where the upper bits identify the attribute and the lower bits hold the value (or a pointer).
|
||
|
|
|
||
|
|
```c
|
||
|
|
app = ApplicationObject,
|
||
|
|
MUIA_Application_Title , "Demo",
|
||
|
|
MUIA_Application_Version , "$VER: Demo 1.0",
|
||
|
|
MUIA_Application_Copyright , "1997 Author",
|
||
|
|
MUIA_Application_Author , "Author",
|
||
|
|
MUIA_Application_Description, "A demo program",
|
||
|
|
MUIA_Application_Base , "DEMO",
|
||
|
|
SubWindow, window = WindowObject,
|
||
|
|
MUIA_Window_Title, "Demo Window",
|
||
|
|
MUIA_Window_ID , MAKE_ID('D','E','M','O'),
|
||
|
|
WindowContents, VGroup,
|
||
|
|
Child, TextObject,
|
||
|
|
TextFrame,
|
||
|
|
MUIA_Background, MUII_TextBack,
|
||
|
|
MUIA_Text_Contents, "Hello",
|
||
|
|
End,
|
||
|
|
End,
|
||
|
|
End,
|
||
|
|
End;
|
||
|
|
```
|
||
|
|
|
||
|
|
Notice how nesting works: `ApplicationObject` contains `SubWindow`, which contains `WindowObject`, which contains `WindowContents`, which contains a `VGroup`, which contains `Child` widgets.
|
||
|
|
|
||
|
|
## Methods
|
||
|
|
|
||
|
|
Methods are operations you perform on objects. The universal way to invoke a method is `DoMethod()`:
|
||
|
|
|
||
|
|
```c
|
||
|
|
DoMethod(obj, MUIM_MethodName, arg1, arg2, ...);
|
||
|
|
```
|
||
|
|
|
||
|
|
### Common Methods
|
||
|
|
|
||
|
|
| Method | Purpose |
|
||
|
|
|--------|---------|
|
||
|
|
| `MUIM_Application_NewInput` | Process input events (preferred loop) |
|
||
|
|
| `MUIM_Application_Input` | Process input events (legacy loop) |
|
||
|
|
| `MUIM_Application_ReturnID` | Trigger a return ID |
|
||
|
|
| `MUIM_Notify` | Set up attribute notifications |
|
||
|
|
| `MUIM_CallHook` | Invoke a callback hook |
|
||
|
|
| `MUIM_Set` | Set an attribute (method form) |
|
||
|
|
| `MUIM_Get` | Get an attribute (method form) |
|
||
|
|
| `MUIM_Draw` | Render an object |
|
||
|
|
| `MUIM_AskMinMax` | Query minimum/maximum sizes |
|
||
|
|
|
||
|
|
## Object Lifecycle
|
||
|
|
|
||
|
|
### Creation
|
||
|
|
|
||
|
|
Objects are created with the macro constructors. The constructor returns a pointer or `NULL` on failure.
|
||
|
|
|
||
|
|
```c
|
||
|
|
APTR obj = TextObject,
|
||
|
|
MUIA_Text_Contents, "Hello",
|
||
|
|
End;
|
||
|
|
|
||
|
|
if (!obj)
|
||
|
|
/* handle error */;
|
||
|
|
```
|
||
|
|
|
||
|
|
### Usage
|
||
|
|
|
||
|
|
Objects are manipulated through attributes and methods. They exist within a parent container (usually a Group) which manages their layout and visibility.
|
||
|
|
|
||
|
|
### Disposal
|
||
|
|
|
||
|
|
When an object is no longer needed, dispose it:
|
||
|
|
|
||
|
|
```c
|
||
|
|
MUI_DisposeObject(obj);
|
||
|
|
```
|
||
|
|
|
||
|
|
For the top-level Application object, disposing it automatically disposes all child Windows and their contents. This is the normal shutdown pattern:
|
||
|
|
|
||
|
|
```c
|
||
|
|
MUI_DisposeObject(app); /* disposes entire tree */
|
||
|
|
```
|
||
|
|
|
||
|
|
For custom classes, you must also delete the class itself:
|
||
|
|
|
||
|
|
```c
|
||
|
|
MUI_DeleteCustomClass(mcc);
|
||
|
|
```
|
||
|
|
|
||
|
|
## The `Child` Keyword
|
||
|
|
|
||
|
|
When adding widgets to a Group, the `Child` tag is used to introduce each child object:
|
||
|
|
|
||
|
|
```c
|
||
|
|
VGroup,
|
||
|
|
Child, widget1,
|
||
|
|
Child, widget2,
|
||
|
|
Child, HGroup,
|
||
|
|
Child, subwidget1,
|
||
|
|
Child, subwidget2,
|
||
|
|
End,
|
||
|
|
End,
|
||
|
|
```
|
||
|
|
|
||
|
|
`Child` is not a macro for a class; it is a tag that tells the Group class to add the following object to its internal list of children.
|
||
|
|
|
||
|
|
## Special Attribute Values
|
||
|
|
|
||
|
|
MUI defines several special values used across multiple attributes:
|
||
|
|
|
||
|
|
| Value | Meaning |
|
||
|
|
|-------|---------|
|
||
|
|
| `MUIV_EveryTime` | Trigger notification on any attribute change |
|
||
|
|
| `MUIV_TriggerValue` | Pass the triggering value as an argument |
|
||
|
|
| `MUIV_Notification_Value` | Use the value from the notification setup |
|
||
|
|
|
||
|
|
These are used primarily with `MUIM_Notify` to create flexible event bindings.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
Previous: [Getting Started](03-getting-started.md)
|
||
|
|
Next: [Layout System](05-layout-system.md)
|