PBToolboxAI v4 ← Site

button — u_pbt_button #

← Component reference · Guide contents

Themed button: text and icon, styles, counter badge, keyboard shortcut, default and cancel buttons.

⚠️ Several buttons? Prefer buttonbar: a row of buttons in one component, where N separate button cost N times the memory (each component is an engine view). button stays supported for existing code.

▶ See it live — Demo application, Button tile: the preview, the code behind it and this page, side by side.


At a glance #

Userobjectu_pbt_button
Item class— (component without items)
Used forReplacing a commandbutton with a modern, themed button that supports an icon and a badge
Opt-in optionsib_track_mouse

Quick start #

// window open event
uo_button.is_text  = "&Save"          // & = underlined letter : Alt+S fires it
uo_button.is_style = uo_button.STYLE_PRIMARY // primary action button
uo_button.is_image = "mono:img\save.svg"     // icon recolored by the theme
uo_button.is_shortcut = "Ctrl+S"             // shortcut displayed and active
uo_button.is_tooltip = "Saves the current file"
// ue_clicked event of uo_button
of_save()

Constants #

ConstantValueFor
STYLE_STANDARD · STYLE_PRIMARY · STYLE_FLAT"standard" "primary" "flat"is_style

Properties #

PropertyTypeDefaultPurpose
is_textstring""Caption. Accepts rich text markup and the & mnemonic (&Save underlines the S, and Alt+S fires it wherever the focus is in the window, after the explicit shortcuts and never while grayed out; a PB menu bar using the same letter loses it); && displays a literal ampersand. An image-only caption ([picture=…]) is allowed
is_imagestring""Icon displayed before the caption (accepted forms: path, mono:, tint:, DLL resource)
ii_image_sizeinteger0Icon size in pixels (0 = the theme size, 18 pixels)
is_stylestring"standard"Appearance: STYLE_STANDARD, STYLE_PRIMARY (accent background, primary action), STYLE_FLAT (borderless)
ib_enabledbooleantrueButton enabled or grayed out. Grayed out, it ignores the mouse and the keyboard, leaves the Tab order and gives Enter, Esc, its shortcut and its mnemonic back to the window
ib_defaultbooleanfalseDefault button: Enter triggers it wherever the focus is in the window, as long as it is enabled; an accent outline marks it. With two default buttons, the one closest to the focus wins, and on a tie none does
ib_cancelbooleanfalseCancel button: Esc triggers it wherever the focus is in the window, as long as it is enabled
is_shortcutstring""Keyboard shortcut ("Ctrl+S", "F5", "Ctrl+Shift+N"), active wherever the focus is in the window and added to the tooltip ("Save (Ctrl+S)"). Key names are written in English (Enter, Esc, Del, PageUp…); a shortcut the window cannot fire (unknown modifier or key) is refused and reads back ""
ii_badgeinteger0Counter badge in the top end corner (right, left in right-to-left); above 99 it shows 99+ (0 = none)
il_badge_colorlong-1Badge background, as a PowerBuilder RGB value (-1 = not set: the color that comes from the theme; 0 is black, like any other color). The text color is picked automatically so that the counter stays legible
ii_badge_sizeinteger0Badge height in pixels (0 = the size that comes from the theme). The font size follows on its own: the counter stays centered whatever the size
ib_track_mousebooleanfalseOpt-in: enables ue_mouse_enter / ue_mouse_leave
is_theme_stylestring""Visual style of the component (THEME_STYLE_* constants); empty = the application's, followed at every change
is_theme_modestring""Light or dark variant (THEME_MODE_* constants); empty = the application's, followed at every change
il_theme_accentlong-1Accent colour of this component (-1 = the application accent, or the theme's)
is_tooltipstring""Simple tooltip shown when hovering the component
is_super_tooltip_titlestring""Title of the rich tooltip (takes precedence over is_tooltip)
is_super_tooltip_textstring""Text of the rich tooltip (rich markup accepted)
is_super_tooltip_imagestring""Image of the rich tooltip

Methods #

MethodPurpose
of_reset ( )Resets every property to its default. Returns 0 once applied, -2 when the component is not created
of_set_redraw (boolean)Groups a burst of changes into a single render. Returns 0 once applied, -2 when the component is not created
of_save_as_png (string) · of_save_as_jpg (string)Exports the rendering as an image. Returns 0 once the image is written, -4 when writing fails, -2 when the component is not created

Events #

EventRaised when
ue_clicked ( )The button is clicked, or triggered by Enter / Esc / its shortcut
ue_rclicked ( )Right-click on the button
ue_mouse_enter ( )The mouse enters — requires ib_track_mouse = true
ue_mouse_leave ( )The mouse leaves — requires ib_track_mouse = true
ue_ready ( )The component has finished loading; everything sent beforehand has been replayed
ue_runtime_missing ( )The WebView2 runtime is missing: the component stays empty
ue_bg_color (long al_color)The component has computed its theme background color; the userobject has already adopted it (backcolor)

Examples #

The three styles #

// The main button : it answers the Enter key
uo_ok.is_text     = "OK"
uo_ok.is_style    = uo_ok.STYLE_PRIMARY
uo_ok.ib_default  = true          // Enter key

// The cancel button : it answers the Esc key
uo_cancel.is_text   = "Cancel"
uo_cancel.is_style  = uo_cancel.STYLE_STANDARD
uo_cancel.ib_cancel = true       // Esc key

// A discreet help button
uo_help.is_text  = "Help"
uo_help.is_style = uo_help.STYLE_FLAT   // discreet, borderless

Icon and notification badge #

// A bigger icon and a counter badge
uo_messages.is_text  = "Messages"
uo_messages.is_image = "mono:img\mail.svg"
uo_messages.ii_image_size = 20
uo_messages.ii_badge = 12             // "12" badge
// Update the counter : the badge disappears at 0
uo_messages.ii_badge = ll_unread
// A red badge for an alert, rather than the theme color.
// The text color is picked on its own so it stays legible.
uo_messages.il_badge_color = RGB(/*red*/ 200, /*green*/ 30, /*blue*/ 30)

// Go back to the color that comes from the theme
uo_messages.il_badge_color = -1

Rich caption #

// Rich text : bold and a smaller size, or a picture inside the text
uo_button.is_text = "[b]Export[/b] [size-=20]· CSV[/size-=20]"
uo_button.is_text = "Status [picture=mono:img\ok.svg,14,14]"

Primary action button with a shortcut and help #

// Freeze the drawing while you set it up
uo_submit.of_set_redraw(/*on*/ false)

// Text, style, shortcut, default button and rich tooltip
uo_submit.is_text     = "&Submit order"
uo_submit.is_style    = uo_submit.STYLE_PRIMARY
uo_submit.is_shortcut = "Ctrl+Enter"
uo_submit.ib_default  = true
uo_submit.is_super_tooltip_title = "Submit"
uo_submit.is_super_tooltip_text  = "Sends the order to the supplier." &
                                    + "[br][br][size-=15]This action cannot be undone.[/size-=15]"

// One single redraw, with everything
uo_submit.of_set_redraw(/*on*/ true)

Reacting to hover #

// Raise ue_mouse_enter and ue_mouse_leave when the pointer comes and goes
uo_button.ib_track_mouse = true
// ue_mouse_enter event of uo_button
uo_status.of_panel(/*key*/ "main").is_text = "Saves the current file"

Best practices #

Inherited from the common base #

These members exist on every visual component — they are not specific to this one. They are detailed once, in the transverse chapters; this table only says where to read them.

MembersRoleDetailed in
of_resetPut the component back to zero3.6 Resetting a component: of_reset()
of_register_shortcut · of_clear_shortcutsThe component's keyboard chords3.5 Keyboard shortcuts
of_is_created · of_is_ready · of_get_last_errorWhether it was born, whether it is ready, what failed3.7 Diagnostics
of_save_as_png · of_save_as_jpgExport the rendering as an image3.8 Exporting the rendering as an image
of_set_redrawGroup changes into a single repaint3.10 Best practices
of_preload_iconsIcons shown with no delayInstant display: of_icon
of_set_translationTranslate one of the component's labels5.2 Adapting a label: of_set_translation
of_focus_webviewGive the component the focus6.4 Keyboard and focus
of_print · of_print_to_pdfPrint, or write a PDF6.9 Printing
of_set_property · of_get_property · of_component_nameDriving a property by its name3.1 The property engine

Two helpers are not inherited: of_icon and of_escape_markup live on n_pbt_utils. Declare one — n_pbt_utils lnv_utils, nothing to create — and call them on it.


← Component reference · Guide contents