// widgetInternal.h — Shared internal header for widget implementation files #ifndef WIDGET_INTERNAL_H #define WIDGET_INTERNAL_H #include "../dvxWidget.h" #include "../dvxApp.h" #include "../dvxDraw.h" #include "../dvxWm.h" #include "../dvxVideo.h" #include #include #include // ============================================================ // Widget class vtable // ============================================================ #define WCLASS_FOCUSABLE 0x0001 #define WCLASS_BOX_CONTAINER 0x0002 #define WCLASS_HORIZ_CONTAINER 0x0004 #define WCLASS_PAINTS_CHILDREN 0x0008 #define WCLASS_NO_HIT_RECURSE 0x0010 typedef struct WidgetClassT { uint32_t flags; void (*paint)(WidgetT *w, DisplayT *d, const BlitOpsT *ops, const BitmapFontT *font, const ColorSchemeT *colors); void (*paintOverlay)(WidgetT *w, DisplayT *d, const BlitOpsT *ops, const BitmapFontT *font, const ColorSchemeT *colors); void (*calcMinSize)(WidgetT *w, const BitmapFontT *font); void (*layout)(WidgetT *w, const BitmapFontT *font); void (*onMouse)(WidgetT *w, WidgetT *root, int32_t vx, int32_t vy); void (*onKey)(WidgetT *w, int32_t key); void (*destroy)(WidgetT *w); const char *(*getText)(const WidgetT *w); void (*setText)(WidgetT *w, const char *text); } WidgetClassT; extern const WidgetClassT *widgetClassTable[]; // ============================================================ // Constants // ============================================================ #define DEFAULT_SPACING 4 #define DEFAULT_PADDING 4 #define SEPARATOR_THICKNESS 2 #define BUTTON_PAD_H 8 #define BUTTON_PAD_V 4 #define CHECKBOX_BOX_SIZE 12 #define CHECKBOX_GAP 4 #define FRAME_BEVEL_BORDER 2 #define FRAME_FLAT_BORDER 1 #define TEXT_INPUT_PAD 3 #define DROPDOWN_BTN_WIDTH 16 #define DROPDOWN_MAX_VISIBLE 8 #define SLIDER_TRACK_H 4 #define SLIDER_THUMB_W 11 #define TAB_PAD_H 8 #define TAB_PAD_V 4 #define TAB_BORDER 2 #define TREE_INDENT 16 #define TREE_EXPAND_SIZE 9 #define TREE_ICON_GAP 4 #define TREE_BORDER 2 #define TREE_SB_W 14 #define TREE_MIN_ROWS 4 #define SB_MIN_THUMB 14 // ============================================================ // Inline helpers // ============================================================ static inline int32_t clampInt(int32_t val, int32_t lo, int32_t hi) { if (val < lo) { return lo; } if (val > hi) { return hi; } return val; } // ============================================================ // Shared state (defined in widgetCore.c) // ============================================================ extern bool sDebugLayout; extern WidgetT *sClosedPopup; extern WidgetT *sKeyPressedBtn; extern WidgetT *sOpenPopup; extern WidgetT *sPressedButton; extern WidgetT *sDragSlider; extern WidgetT *sDrawingCanvas; extern int32_t sDragOffset; // ============================================================ // Core functions (widgetCore.c) // ============================================================ void widgetAddChild(WidgetT *parent, WidgetT *child); WidgetT *widgetAlloc(WidgetT *parent, WidgetTypeE type); void widgetClearFocus(WidgetT *root); int32_t widgetCountVisibleChildren(const WidgetT *w); void widgetDestroyChildren(WidgetT *w); void widgetDropdownPopupRect(WidgetT *w, const BitmapFontT *font, int32_t contentH, int32_t *popX, int32_t *popY, int32_t *popW, int32_t *popH); WidgetT *widgetFindByAccel(WidgetT *root, char key); WidgetT *widgetFindNextFocusable(WidgetT *root, WidgetT *after); WidgetT *widgetFindPrevFocusable(WidgetT *root, WidgetT *before); int32_t widgetFrameBorderWidth(const WidgetT *w); WidgetT *widgetHitTest(WidgetT *w, int32_t x, int32_t y); bool widgetIsFocusable(WidgetTypeE type); bool widgetIsBoxContainer(WidgetTypeE type); bool widgetIsHorizContainer(WidgetTypeE type); void widgetRemoveChild(WidgetT *parent, WidgetT *child); void widgetScrollbarThumb(int32_t trackLen, int32_t totalSize, int32_t visibleSize, int32_t scrollPos, int32_t *thumbPos, int32_t *thumbSize); // ============================================================ // Layout functions (widgetLayout.c) // ============================================================ void widgetCalcMinSizeBox(WidgetT *w, const BitmapFontT *font); void widgetCalcMinSizeTree(WidgetT *w, const BitmapFontT *font); void widgetLayoutBox(WidgetT *w, const BitmapFontT *font); void widgetLayoutChildren(WidgetT *w, const BitmapFontT *font); // ============================================================ // Event functions (widgetEvent.c) // ============================================================ void widgetManageScrollbars(WindowT *win, AppContextT *ctx); void widgetOnKey(WindowT *win, int32_t key, int32_t mod); void widgetOnMouse(WindowT *win, int32_t x, int32_t y, int32_t buttons); void widgetOnPaint(WindowT *win, RectT *dirtyArea); void widgetOnResize(WindowT *win, int32_t newW, int32_t newH); void widgetOnScroll(WindowT *win, ScrollbarOrientE orient, int32_t value); // ============================================================ // Paint/ops functions (widgetOps.c) // ============================================================ void widgetPaintOne(WidgetT *w, DisplayT *d, const BlitOpsT *ops, const BitmapFontT *font, const ColorSchemeT *colors); void widgetPaintOverlays(WidgetT *root, DisplayT *d, const BlitOpsT *ops, const BitmapFontT *font, const ColorSchemeT *colors); // ============================================================ // Per-widget paint functions // ============================================================ void widgetAnsiTermPaint(WidgetT *w, DisplayT *d, const BlitOpsT *ops, const BitmapFontT *font, const ColorSchemeT *colors); void widgetButtonPaint(WidgetT *w, DisplayT *d, const BlitOpsT *ops, const BitmapFontT *font, const ColorSchemeT *colors); void widgetImageButtonPaint(WidgetT *w, DisplayT *d, const BlitOpsT *ops, const BitmapFontT *font, const ColorSchemeT *colors); void widgetCanvasPaint(WidgetT *w, DisplayT *d, const BlitOpsT *ops, const BitmapFontT *font, const ColorSchemeT *colors); void widgetCheckboxPaint(WidgetT *w, DisplayT *d, const BlitOpsT *ops, const BitmapFontT *font, const ColorSchemeT *colors); void widgetComboBoxPaint(WidgetT *w, DisplayT *d, const BlitOpsT *ops, const BitmapFontT *font, const ColorSchemeT *colors); void widgetComboBoxPaintPopup(WidgetT *w, DisplayT *d, const BlitOpsT *ops, const BitmapFontT *font, const ColorSchemeT *colors); void widgetDropdownPaint(WidgetT *w, DisplayT *d, const BlitOpsT *ops, const BitmapFontT *font, const ColorSchemeT *colors); void widgetDropdownPaintPopup(WidgetT *w, DisplayT *d, const BlitOpsT *ops, const BitmapFontT *font, const ColorSchemeT *colors); void widgetFramePaint(WidgetT *w, DisplayT *d, const BlitOpsT *ops, const BitmapFontT *font, const ColorSchemeT *colors); void widgetImagePaint(WidgetT *w, DisplayT *d, const BlitOpsT *ops, const BitmapFontT *font, const ColorSchemeT *colors); void widgetLabelPaint(WidgetT *w, DisplayT *d, const BlitOpsT *ops, const BitmapFontT *font, const ColorSchemeT *colors); void widgetListBoxPaint(WidgetT *w, DisplayT *d, const BlitOpsT *ops, const BitmapFontT *font, const ColorSchemeT *colors); void widgetProgressBarPaint(WidgetT *w, DisplayT *d, const BlitOpsT *ops, const BitmapFontT *font, const ColorSchemeT *colors); void widgetRadioPaint(WidgetT *w, DisplayT *d, const BlitOpsT *ops, const BitmapFontT *font, const ColorSchemeT *colors); void widgetSeparatorPaint(WidgetT *w, DisplayT *d, const BlitOpsT *ops, const BitmapFontT *font, const ColorSchemeT *colors); void widgetSliderPaint(WidgetT *w, DisplayT *d, const BlitOpsT *ops, const BitmapFontT *font, const ColorSchemeT *colors); void widgetStatusBarPaint(WidgetT *w, DisplayT *d, const BlitOpsT *ops, const BitmapFontT *font, const ColorSchemeT *colors); void widgetTabControlPaint(WidgetT *w, DisplayT *d, const BlitOpsT *ops, const BitmapFontT *font, const ColorSchemeT *colors); void widgetTextInputPaint(WidgetT *w, DisplayT *d, const BlitOpsT *ops, const BitmapFontT *font, const ColorSchemeT *colors); void widgetToolbarPaint(WidgetT *w, DisplayT *d, const BlitOpsT *ops, const BitmapFontT *font, const ColorSchemeT *colors); void widgetTreeViewPaint(WidgetT *w, DisplayT *d, const BlitOpsT *ops, const BitmapFontT *font, const ColorSchemeT *colors); // ============================================================ // Per-widget calcMinSize functions // ============================================================ void widgetAnsiTermCalcMinSize(WidgetT *w, const BitmapFontT *font); void widgetButtonCalcMinSize(WidgetT *w, const BitmapFontT *font); void widgetImageButtonCalcMinSize(WidgetT *w, const BitmapFontT *font); void widgetCanvasCalcMinSize(WidgetT *w, const BitmapFontT *font); void widgetCheckboxCalcMinSize(WidgetT *w, const BitmapFontT *font); void widgetComboBoxCalcMinSize(WidgetT *w, const BitmapFontT *font); void widgetDropdownCalcMinSize(WidgetT *w, const BitmapFontT *font); void widgetImageCalcMinSize(WidgetT *w, const BitmapFontT *font); void widgetLabelCalcMinSize(WidgetT *w, const BitmapFontT *font); void widgetListBoxCalcMinSize(WidgetT *w, const BitmapFontT *font); void widgetProgressBarCalcMinSize(WidgetT *w, const BitmapFontT *font); void widgetRadioCalcMinSize(WidgetT *w, const BitmapFontT *font); void widgetSeparatorCalcMinSize(WidgetT *w, const BitmapFontT *font); void widgetSliderCalcMinSize(WidgetT *w, const BitmapFontT *font); void widgetSpacerCalcMinSize(WidgetT *w, const BitmapFontT *font); void widgetTabControlCalcMinSize(WidgetT *w, const BitmapFontT *font); void widgetTextInputCalcMinSize(WidgetT *w, const BitmapFontT *font); void widgetTreeViewCalcMinSize(WidgetT *w, const BitmapFontT *font); // ============================================================ // Per-widget layout functions (for special containers) // ============================================================ void widgetTabControlLayout(WidgetT *w, const BitmapFontT *font); void widgetTreeViewLayout(WidgetT *w, const BitmapFontT *font); // ============================================================ // Per-widget getText/setText functions // ============================================================ const char *widgetButtonGetText(const WidgetT *w); void widgetButtonSetText(WidgetT *w, const char *text); const char *widgetCheckboxGetText(const WidgetT *w); void widgetCheckboxSetText(WidgetT *w, const char *text); const char *widgetComboBoxGetText(const WidgetT *w); void widgetComboBoxSetText(WidgetT *w, const char *text); const char *widgetDropdownGetText(const WidgetT *w); const char *widgetLabelGetText(const WidgetT *w); void widgetLabelSetText(WidgetT *w, const char *text); const char *widgetRadioGetText(const WidgetT *w); void widgetRadioSetText(WidgetT *w, const char *text); const char *widgetTextInputGetText(const WidgetT *w); void widgetTextInputSetText(WidgetT *w, const char *text); const char *widgetTreeItemGetText(const WidgetT *w); void widgetTreeItemSetText(WidgetT *w, const char *text); // ============================================================ // Per-widget destroy functions // ============================================================ void widgetAnsiTermDestroy(WidgetT *w); void widgetCanvasDestroy(WidgetT *w); void widgetComboBoxDestroy(WidgetT *w); void widgetImageButtonDestroy(WidgetT *w); void widgetImageDestroy(WidgetT *w); void widgetTextAreaDestroy(WidgetT *w); void widgetTextInputDestroy(WidgetT *w); // ============================================================ // Per-widget mouse/key functions // ============================================================ void widgetAnsiTermOnKey(WidgetT *w, int32_t key); void widgetAnsiTermOnMouse(WidgetT *w, WidgetT *root, int32_t vx, int32_t vy); void widgetButtonOnKey(WidgetT *w, int32_t key); void widgetButtonOnMouse(WidgetT *w, WidgetT *root, int32_t vx, int32_t vy); void widgetCanvasOnMouse(WidgetT *w, WidgetT *root, int32_t vx, int32_t vy); void widgetCheckboxOnKey(WidgetT *w, int32_t key); void widgetCheckboxOnMouse(WidgetT *w, WidgetT *root, int32_t vx, int32_t vy); void widgetComboBoxOnKey(WidgetT *w, int32_t key); void widgetComboBoxOnMouse(WidgetT *w, WidgetT *root, int32_t vx, int32_t vy); void widgetDropdownOnKey(WidgetT *w, int32_t key); void widgetDropdownOnMouse(WidgetT *w, WidgetT *root, int32_t vx, int32_t vy); void widgetImageButtonOnKey(WidgetT *w, int32_t key); void widgetImageButtonOnMouse(WidgetT *w, WidgetT *root, int32_t vx, int32_t vy); void widgetImageOnMouse(WidgetT *w, WidgetT *root, int32_t vx, int32_t vy); void widgetListBoxOnKey(WidgetT *w, int32_t key); void widgetListBoxOnMouse(WidgetT *w, WidgetT *root, int32_t vx, int32_t vy); void widgetRadioOnKey(WidgetT *w, int32_t key); void widgetRadioOnMouse(WidgetT *w, WidgetT *root, int32_t vx, int32_t vy); void widgetSliderOnKey(WidgetT *w, int32_t key); void widgetSliderOnMouse(WidgetT *w, WidgetT *root, int32_t vx, int32_t vy); void widgetTabControlOnKey(WidgetT *w, int32_t key); void widgetTabControlOnMouse(WidgetT *w, WidgetT *root, int32_t vx, int32_t vy); void widgetTextEditOnKey(WidgetT *w, int32_t key, char *buf, int32_t bufSize, int32_t *pLen, int32_t *pCursor, int32_t *pScrollOff); void widgetTextInputOnKey(WidgetT *w, int32_t key); void widgetTextInputOnMouse(WidgetT *w, WidgetT *root, int32_t vx, int32_t vy); void widgetTreeViewOnKey(WidgetT *w, int32_t key); void widgetTreeViewOnMouse(WidgetT *w, WidgetT *root, int32_t vx, int32_t vy); #endif // WIDGET_INTERNAL_H