469 lines
14 KiB
C
469 lines
14 KiB
C
// dvxWidget.h — Widget system for DV/X GUI
|
|
#ifndef DVX_WIDGET_H
|
|
#define DVX_WIDGET_H
|
|
|
|
#include "dvxTypes.h"
|
|
|
|
// Forward declaration
|
|
struct AppContextT;
|
|
|
|
// ============================================================
|
|
// Size specifications
|
|
// ============================================================
|
|
//
|
|
// Tagged size values encode both a unit type and a numeric value.
|
|
// Use wgtPixels(), wgtChars(), or wgtPercent() to create them.
|
|
// A raw 0 means "auto" (use the widget's natural size).
|
|
|
|
#define WGT_SIZE_TYPE_MASK 0xC0000000
|
|
#define WGT_SIZE_VAL_MASK 0x3FFFFFFF
|
|
#define WGT_SIZE_PIXELS 0x00000000
|
|
#define WGT_SIZE_CHARS 0x40000000
|
|
#define WGT_SIZE_PERCENT 0x80000000
|
|
|
|
static inline int32_t wgtPixels(int32_t v) {
|
|
return (int32_t)(WGT_SIZE_PIXELS | ((uint32_t)v & WGT_SIZE_VAL_MASK));
|
|
}
|
|
|
|
static inline int32_t wgtChars(int32_t v) {
|
|
return (int32_t)(WGT_SIZE_CHARS | ((uint32_t)v & WGT_SIZE_VAL_MASK));
|
|
}
|
|
|
|
static inline int32_t wgtPercent(int32_t v) {
|
|
return (int32_t)(WGT_SIZE_PERCENT | ((uint32_t)v & WGT_SIZE_VAL_MASK));
|
|
}
|
|
|
|
// ============================================================
|
|
// Widget type enum
|
|
// ============================================================
|
|
|
|
typedef enum {
|
|
WidgetVBoxE,
|
|
WidgetHBoxE,
|
|
WidgetLabelE,
|
|
WidgetButtonE,
|
|
WidgetCheckboxE,
|
|
WidgetRadioGroupE,
|
|
WidgetRadioE,
|
|
WidgetTextInputE,
|
|
WidgetTextAreaE,
|
|
WidgetListBoxE,
|
|
WidgetSpacerE,
|
|
WidgetSeparatorE,
|
|
WidgetFrameE,
|
|
WidgetDropdownE,
|
|
WidgetComboBoxE,
|
|
WidgetProgressBarE,
|
|
WidgetSliderE,
|
|
WidgetTabControlE,
|
|
WidgetTabPageE,
|
|
WidgetStatusBarE,
|
|
WidgetToolbarE,
|
|
WidgetTreeViewE,
|
|
WidgetTreeItemE,
|
|
WidgetImageE,
|
|
WidgetCanvasE
|
|
} WidgetTypeE;
|
|
|
|
// ============================================================
|
|
// Alignment enum
|
|
// ============================================================
|
|
//
|
|
// Controls main-axis alignment of children within a container.
|
|
// HBox: AlignStartE=left, AlignCenterE=center, AlignEndE=right
|
|
// VBox: AlignStartE=top, AlignCenterE=center, AlignEndE=bottom
|
|
|
|
typedef enum {
|
|
AlignStartE,
|
|
AlignCenterE,
|
|
AlignEndE
|
|
} WidgetAlignE;
|
|
|
|
// ============================================================
|
|
// Frame style enum
|
|
// ============================================================
|
|
|
|
typedef enum {
|
|
FrameInE, // beveled inward (sunken) — default
|
|
FrameOutE, // beveled outward (raised)
|
|
FrameFlatE // solid color line
|
|
} FrameStyleE;
|
|
|
|
// ============================================================
|
|
// Widget structure
|
|
// ============================================================
|
|
|
|
#define MAX_WIDGET_NAME 32
|
|
|
|
typedef struct WidgetT {
|
|
WidgetTypeE type;
|
|
char name[MAX_WIDGET_NAME];
|
|
|
|
// Tree linkage
|
|
struct WidgetT *parent;
|
|
struct WidgetT *firstChild;
|
|
struct WidgetT *lastChild;
|
|
struct WidgetT *nextSibling;
|
|
WindowT *window;
|
|
|
|
// Computed geometry (relative to window content area)
|
|
int32_t x;
|
|
int32_t y;
|
|
int32_t w;
|
|
int32_t h;
|
|
|
|
// Computed minimum size (set by layout engine)
|
|
int32_t calcMinW;
|
|
int32_t calcMinH;
|
|
|
|
// Size hints (tagged: wgtPixels/wgtChars/wgtPercent, 0 = auto)
|
|
int32_t minW;
|
|
int32_t minH;
|
|
int32_t maxW; // 0 = no limit
|
|
int32_t maxH;
|
|
int32_t prefW; // preferred size, 0 = auto
|
|
int32_t prefH;
|
|
int32_t weight; // extra-space distribution (0 = fixed, 100 = normal)
|
|
|
|
// Container properties
|
|
WidgetAlignE align; // main-axis alignment for children
|
|
int32_t spacing; // tagged size for spacing between children (0 = default)
|
|
int32_t padding; // tagged size for internal padding (0 = default)
|
|
|
|
// Colors (0 = use color scheme defaults)
|
|
uint32_t fgColor;
|
|
uint32_t bgColor;
|
|
|
|
// State
|
|
bool visible;
|
|
bool enabled;
|
|
bool focused;
|
|
|
|
// User data and callbacks
|
|
void *userData;
|
|
void (*onClick)(struct WidgetT *w);
|
|
void (*onChange)(struct WidgetT *w);
|
|
|
|
// Type-specific data
|
|
union {
|
|
struct {
|
|
const char *text;
|
|
} label;
|
|
|
|
struct {
|
|
const char *text;
|
|
bool pressed;
|
|
} button;
|
|
|
|
struct {
|
|
const char *text;
|
|
bool checked;
|
|
} checkbox;
|
|
|
|
struct {
|
|
int32_t selectedIdx;
|
|
} radioGroup;
|
|
|
|
struct {
|
|
const char *text;
|
|
int32_t index;
|
|
} radio;
|
|
|
|
struct {
|
|
char *buf;
|
|
int32_t bufSize;
|
|
int32_t len;
|
|
int32_t cursorPos;
|
|
int32_t scrollOff;
|
|
} textInput;
|
|
|
|
struct {
|
|
char *buf;
|
|
int32_t bufSize;
|
|
int32_t len;
|
|
int32_t cursorRow;
|
|
int32_t cursorCol;
|
|
int32_t scrollRow;
|
|
} textArea;
|
|
|
|
struct {
|
|
const char **items;
|
|
int32_t itemCount;
|
|
int32_t selectedIdx;
|
|
int32_t scrollPos;
|
|
} listBox;
|
|
|
|
struct {
|
|
bool vertical;
|
|
} separator;
|
|
|
|
struct {
|
|
const char *title;
|
|
FrameStyleE style; // FrameInE (default), FrameOutE, FrameFlatE
|
|
uint32_t color; // border color for FrameFlatE (0 = use windowShadow)
|
|
} frame;
|
|
|
|
struct {
|
|
const char **items;
|
|
int32_t itemCount;
|
|
int32_t selectedIdx;
|
|
bool open;
|
|
int32_t hoverIdx;
|
|
int32_t scrollPos;
|
|
} dropdown;
|
|
|
|
struct {
|
|
char *buf;
|
|
int32_t bufSize;
|
|
int32_t len;
|
|
int32_t cursorPos;
|
|
int32_t scrollOff;
|
|
const char **items;
|
|
int32_t itemCount;
|
|
int32_t selectedIdx;
|
|
bool open;
|
|
int32_t hoverIdx;
|
|
int32_t listScrollPos;
|
|
} comboBox;
|
|
|
|
struct {
|
|
int32_t value;
|
|
int32_t maxValue;
|
|
} progressBar;
|
|
|
|
struct {
|
|
int32_t value;
|
|
int32_t minValue;
|
|
int32_t maxValue;
|
|
bool vertical;
|
|
} slider;
|
|
|
|
struct {
|
|
int32_t activeTab;
|
|
} tabControl;
|
|
|
|
struct {
|
|
const char *title;
|
|
} tabPage;
|
|
|
|
struct {
|
|
int32_t scrollPos;
|
|
} treeView;
|
|
|
|
struct {
|
|
const char *text;
|
|
bool expanded;
|
|
} treeItem;
|
|
|
|
struct {
|
|
uint8_t *data; // pixel buffer in display format
|
|
int32_t imgW;
|
|
int32_t imgH;
|
|
int32_t imgPitch;
|
|
bool pressed;
|
|
} image;
|
|
|
|
struct {
|
|
uint8_t *data; // pixel buffer in display format
|
|
int32_t canvasW;
|
|
int32_t canvasH;
|
|
int32_t canvasPitch;
|
|
uint32_t penColor;
|
|
int32_t penSize;
|
|
int32_t lastX;
|
|
int32_t lastY;
|
|
} canvas;
|
|
} as;
|
|
} WidgetT;
|
|
|
|
// ============================================================
|
|
// Window integration
|
|
// ============================================================
|
|
|
|
// Set up a window for widgets. Returns the root container (VBox).
|
|
// Automatically installs onPaint, onMouse, onKey, and onResize handlers.
|
|
WidgetT *wgtInitWindow(struct AppContextT *ctx, WindowT *win);
|
|
|
|
// ============================================================
|
|
// Container creation
|
|
// ============================================================
|
|
|
|
WidgetT *wgtVBox(WidgetT *parent);
|
|
WidgetT *wgtHBox(WidgetT *parent);
|
|
WidgetT *wgtFrame(WidgetT *parent, const char *title);
|
|
|
|
// ============================================================
|
|
// Basic widgets
|
|
// ============================================================
|
|
|
|
WidgetT *wgtLabel(WidgetT *parent, const char *text);
|
|
WidgetT *wgtButton(WidgetT *parent, const char *text);
|
|
WidgetT *wgtCheckbox(WidgetT *parent, const char *text);
|
|
WidgetT *wgtTextInput(WidgetT *parent, int32_t maxLen);
|
|
|
|
// ============================================================
|
|
// Radio buttons
|
|
// ============================================================
|
|
|
|
WidgetT *wgtRadioGroup(WidgetT *parent);
|
|
WidgetT *wgtRadio(WidgetT *parent, const char *text);
|
|
|
|
// ============================================================
|
|
// Spacing and visual dividers
|
|
// ============================================================
|
|
|
|
WidgetT *wgtSpacer(WidgetT *parent);
|
|
WidgetT *wgtHSeparator(WidgetT *parent);
|
|
WidgetT *wgtVSeparator(WidgetT *parent);
|
|
|
|
// ============================================================
|
|
// Complex widgets
|
|
// ============================================================
|
|
|
|
WidgetT *wgtListBox(WidgetT *parent);
|
|
WidgetT *wgtTextArea(WidgetT *parent, int32_t maxLen);
|
|
|
|
// ============================================================
|
|
// Dropdown and ComboBox
|
|
// ============================================================
|
|
|
|
WidgetT *wgtDropdown(WidgetT *parent);
|
|
void wgtDropdownSetItems(WidgetT *w, const char **items, int32_t count);
|
|
int32_t wgtDropdownGetSelected(const WidgetT *w);
|
|
void wgtDropdownSetSelected(WidgetT *w, int32_t idx);
|
|
|
|
WidgetT *wgtComboBox(WidgetT *parent, int32_t maxLen);
|
|
void wgtComboBoxSetItems(WidgetT *w, const char **items, int32_t count);
|
|
int32_t wgtComboBoxGetSelected(const WidgetT *w);
|
|
void wgtComboBoxSetSelected(WidgetT *w, int32_t idx);
|
|
|
|
// ============================================================
|
|
// ProgressBar
|
|
// ============================================================
|
|
|
|
WidgetT *wgtProgressBar(WidgetT *parent);
|
|
void wgtProgressBarSetValue(WidgetT *w, int32_t value);
|
|
int32_t wgtProgressBarGetValue(const WidgetT *w);
|
|
|
|
// ============================================================
|
|
// Slider (TrackBar)
|
|
// ============================================================
|
|
|
|
WidgetT *wgtSlider(WidgetT *parent, int32_t minVal, int32_t maxVal);
|
|
void wgtSliderSetValue(WidgetT *w, int32_t value);
|
|
int32_t wgtSliderGetValue(const WidgetT *w);
|
|
|
|
// ============================================================
|
|
// TabControl
|
|
// ============================================================
|
|
|
|
WidgetT *wgtTabControl(WidgetT *parent);
|
|
WidgetT *wgtTabPage(WidgetT *parent, const char *title);
|
|
void wgtTabControlSetActive(WidgetT *w, int32_t idx);
|
|
int32_t wgtTabControlGetActive(const WidgetT *w);
|
|
|
|
// ============================================================
|
|
// StatusBar and Toolbar
|
|
// ============================================================
|
|
|
|
WidgetT *wgtStatusBar(WidgetT *parent);
|
|
WidgetT *wgtToolbar(WidgetT *parent);
|
|
|
|
// ============================================================
|
|
// TreeView
|
|
// ============================================================
|
|
|
|
WidgetT *wgtTreeView(WidgetT *parent);
|
|
WidgetT *wgtTreeItem(WidgetT *parent, const char *text);
|
|
void wgtTreeItemSetExpanded(WidgetT *w, bool expanded);
|
|
bool wgtTreeItemIsExpanded(const WidgetT *w);
|
|
|
|
// ============================================================
|
|
// Image
|
|
// ============================================================
|
|
|
|
// Create an image widget from raw pixel data (display format).
|
|
// Takes ownership of the data buffer (freed on destroy).
|
|
WidgetT *wgtImage(WidgetT *parent, uint8_t *data, int32_t w, int32_t h, int32_t pitch);
|
|
|
|
// Load an image widget from a file (BMP, PNG, JPEG, GIF).
|
|
// Returns NULL on load failure.
|
|
WidgetT *wgtImageFromFile(WidgetT *parent, const char *path);
|
|
|
|
// Replace the image data. Takes ownership of the new buffer.
|
|
void wgtImageSetData(WidgetT *w, uint8_t *data, int32_t imgW, int32_t imgH, int32_t pitch);
|
|
|
|
// ============================================================
|
|
// Canvas
|
|
// ============================================================
|
|
|
|
// Create a drawable canvas widget with the given dimensions.
|
|
WidgetT *wgtCanvas(WidgetT *parent, int32_t w, int32_t h);
|
|
|
|
// Clear the canvas to the specified color.
|
|
void wgtCanvasClear(WidgetT *w, uint32_t color);
|
|
|
|
// Set the pen color (in display pixel format).
|
|
void wgtCanvasSetPenColor(WidgetT *w, uint32_t color);
|
|
|
|
// Set the pen size in pixels (diameter).
|
|
void wgtCanvasSetPenSize(WidgetT *w, int32_t size);
|
|
|
|
// Save the canvas to a PNG file. Returns 0 on success, -1 on failure.
|
|
int32_t wgtCanvasSave(WidgetT *w, const char *path);
|
|
|
|
// Load a PNG file onto the canvas. Returns 0 on success, -1 on failure.
|
|
int32_t wgtCanvasLoad(WidgetT *w, const char *path);
|
|
|
|
// ============================================================
|
|
// Operations
|
|
// ============================================================
|
|
|
|
// Mark a widget (and ancestors) for relayout and repaint
|
|
void wgtInvalidate(WidgetT *w);
|
|
|
|
// Set/get widget text (label, button, textInput, etc.)
|
|
void wgtSetText(WidgetT *w, const char *text);
|
|
const char *wgtGetText(const WidgetT *w);
|
|
|
|
// Enable/disable a widget
|
|
void wgtSetEnabled(WidgetT *w, bool enabled);
|
|
|
|
// Show/hide a widget
|
|
void wgtSetVisible(WidgetT *w, bool visible);
|
|
|
|
// Find a widget by name (searches the subtree rooted at root)
|
|
WidgetT *wgtFind(WidgetT *root, const char *name);
|
|
|
|
// Destroy a widget and all its children (removes from parent)
|
|
void wgtDestroy(WidgetT *w);
|
|
|
|
// ============================================================
|
|
// List box operations
|
|
// ============================================================
|
|
|
|
void wgtListBoxSetItems(WidgetT *w, const char **items, int32_t count);
|
|
int32_t wgtListBoxGetSelected(const WidgetT *w);
|
|
void wgtListBoxSetSelected(WidgetT *w, int32_t idx);
|
|
|
|
// ============================================================
|
|
// Debug
|
|
// ============================================================
|
|
|
|
// Draw borders around layout containers in ugly colors
|
|
void wgtSetDebugLayout(bool enabled);
|
|
|
|
// ============================================================
|
|
// Layout (called internally; available for manual trigger)
|
|
// ============================================================
|
|
|
|
// Resolve a tagged size to pixels
|
|
int32_t wgtResolveSize(int32_t taggedSize, int32_t parentSize, int32_t charWidth);
|
|
|
|
// Run layout on the entire widget tree
|
|
void wgtLayout(WidgetT *root, int32_t availW, int32_t availH, const BitmapFontT *font);
|
|
|
|
// Paint the entire widget tree
|
|
void wgtPaint(WidgetT *root, DisplayT *d, const BlitOpsT *ops, const BitmapFontT *font, const ColorSchemeT *colors);
|
|
|
|
#endif // DVX_WIDGET_H
|