56 Commits
Author SHA1 Message Date
Andrew Kaster 08b69787e6 LibGUI+Applications: Rename Button::set_icon_from_{path,resource}
Rather than loading an absolute filepath in GML files, change the
setter for this property to use a resource path.

This results in a bunch of churn related to issue 22864, but does not
change any functionality.
2026-07-26 10:18:45 -04:00
Ali Mohammad Pur 5e1499d104 Everywhere: Rename {Deprecated => Byte}String
This commit un-deprecates DeprecatedString, and repurposes it as a byte
string.
As the null state has already been removed, there are no other
particularly hairy blockers in repurposing this type as a byte string
(what it _really_ is).

This commit is auto-generated:
  $ xs=$(ack -l \bDeprecatedString\b\|deprecated_string AK Userland \
    Meta Ports Ladybird Tests Kernel)
  $ perl -pie 's/\bDeprecatedString\b/ByteString/g;
    s/deprecated_string/byte_string/g' $xs
  $ clang-format --style=file -i \
    $(git diff --name-only | grep \.cpp\|\.h)
  $ gn format $(git ls-files '*.gn' '*.gni')
2023-12-17 18:25:10 +03:30
Jelle Raaijmakers f391ccfe53 LibGfx+Everywhere: Change Gfx::Rect to be endpoint exclusive
Previously, calling `.right()` on a `Gfx::Rect` would return the last
column's coordinate still inside the rectangle, or `left + width - 1`.
This is called 'endpoint inclusive' and does not make a lot of sense for
`Gfx::Rect<float>` where a rectangle of width 5 at position (0, 0) would
return 4 as its right side. This same problem exists for `.bottom()`.

This changes `Gfx::Rect` to be endpoint exclusive, which gives us the
nice property that `width = right - left` and `height = bottom - top`.
It enables us to treat `Gfx::Rect<int>` and `Gfx::Rect<float>` exactly
the same.

All users of `Gfx::Rect` have been updated accordingly.
2023-05-23 12:35:42 +02:00
thankyouverycool 479e67212a LibGUI: Implement calculated_min_size() for DialogButton
Dialog buttons now scale based on presentation size to accomodate
larger fonts while retaining uniform widths. Scaling by 8 is
arbitrary but preserves the historical 80 pixel width with Katica 10.
This needs improvement but works well for most fonts as a start.
2023-04-15 15:24:50 +02:00
thankyouverycool 5181fafce6 LibGUI: Improve calculated_min_size() for Button
Previously min_width() was fixed, rendering width calculations in
calculated_min_size() useless for layout. Minimum width now shrinks
to 22, the historical minimum for height as well, and takes into
account elided text and icons. Height no longer sums the icon, fixing
a layout regression for icon buttons.

Also removes an unnecessary FIXME: Calculated size should only
need to account for the height of a single line of elided text
plus padding. Font's pixel_size_rounded_up() is the right solution
even though it and the underlying pixel metrics of some ScaledFonts
don't always correspond yet.
2023-04-15 15:24:50 +02:00
thankyouverycool 55423b4ed0 LibGfx+Userland: Add width_rounded_up() helper 2023-04-15 15:24:50 +02:00
Andreas Kling bb4b747424 LibGUI: Make Button height adapt to the current font size 2023-03-04 00:29:38 +01:00
Andreas Kling 508fb7e1e9 Userland: Use Font::pixel_size_rounded_up() in more places 2023-03-04 00:29:38 +01:00
Andreas Kling b71c7a6e44 Userland: Use Font::pixel_size_rounded_up() instead of glyph_height()
The only remaining clients of this API are specific to bitmap fonts and
editing thereof.
2023-03-04 00:29:38 +01:00
Andreas Kling f1e0eb8a25 LibGUI: Round up font sizes in various widget size calculations 2023-03-03 15:23:47 +01:00
Andreas Kling faa1a09042 LibGUI: Fix const-correctness issues 2023-02-21 00:54:04 +01:00
Andreas Kling 4b3e229157 LibGfx: Replace Bitmap::invert() with Bitmap::inverted()
The new function return a new bitmap instead of mutating the current
one in place.
2023-02-21 00:54:04 +01:00
Sam Atkins 8f717927f2 LibGUI: Add Button double-click callback 2023-02-19 01:09:09 +01:00
Karol Kosek 14951b92ca LibGUI: Remove deprecated text and set_text functions in AbstractButton
This moves the functions to lambda when registering a property.
External code can now only communicate using the new String API.
2023-02-13 00:45:09 +00:00
Karol Kosek d32d4029d3 Userland: Replace usages of AbstractButton::text_deprecated with text() 2023-02-13 00:45:09 +00:00
Karol Kosek fca29eae09 LibGUI: Store text using the new String class in the AbstractButton
This change also adds non-deprecated text() and set_text() functions and
helper constructors for Button, CheckBox, and RadioButton to call the
strings directly.

The whole codebase at this point is still using the deprecated string
functions, which the class will quietly convert to a new String.
2023-02-13 00:45:09 +00:00
Karol Kosek d32b052f22 LibGUI+Userland: Add _deprecated suffix to AbstractButton::{set_,}text 2023-02-13 00:45:09 +00:00
Tim Schumacher 82a152b696 LibGfx: Remove try_ prefix from bitmap creation functions
Those don't have any non-try counterpart, so we might as well just omit
it.
2023-01-26 20:24:37 +00:00
Lucas CHOLLET d4ef2e226c LibGUI: Mimic a user click when calling Button::click()
The `mimic_pressed` function was primarily used in one place, the
Calculator. This patch removes quite a lot of logic duplication there.
It is also profitable to a lot of other places where `click()` was
called without mimicking a click.
2023-01-21 14:49:46 +01:00
Lucas CHOLLET 96b3063121 LibGUI: Rename Button method set_mimic_pressed => mimic_pressed
This function does more things than a simple getter, so it's probably
better to not use this notation.

I also drop the parameter as it was always used with the same value.
2023-01-21 14:49:46 +01:00
Lucas CHOLLET c15a7b79ef LibGUI: Remove public getter Button::is_mimic_pressed()
This method shouldn't be used outside the class and having a getter for
a bool seems a bit overkill.
2023-01-21 14:49:46 +01:00
Andreas Kling 3407ab0fd1 LibGfx: Make Font::width() return a float 2023-01-03 15:25:02 +01:00
Andreas Kling 49f5767789 LibGUI+WindowServer: Add "visible" state to GUI actions
This patch adds a visibility state to GUI::Action. All actions default
to being visible. When invisible, they do not show up in toolbars on
menus (and importantly, they don't occupy any space).

This can be used to hide/show context-sensitive actions dynamically
without rebuilding menus and toolbars.

Thanks to Tim Slater for assuming that action visibility was a thing,
which gave me a reason to implement it! :^)
2022-12-10 14:28:38 +01:00
Timothy Flynn 174062e0c5 LibGUI: Register GUI icon path setters as write-only
The getters passed to REGISTER_STRING_PROPERTY are never invoked. But if
they were, they would errantly incur an implicit pointer-to-boolean cast
when their return type (Gfx::Bitmap*) is used to construct a JsonValue.
2022-12-09 00:05:30 +01:00
Linus Groh 6e19ab2bbc AK+Everywhere: Rename String to DeprecatedString
We have a new, improved string type coming up in AK (OOM aware, no null
state), and while it's going to use UTF-8, the name UTF8String is a
mouthful - so let's free up the String name by renaming the existing
class.
Making the old one have an annoying name will hopefully also help with
quick adoption :^)
2022-12-06 08:54:33 +01:00
Timothy Flynn 62cbfc68b9 Revert "LibGUI: Update buttons' text/tooltips in Action::set_text"
This reverts commit e20756f9f7.

Some buttons, e.g. GUI::ToolbarButton, set text to be used only as a
tooltip instead of text on the button itself. This commit forced those
buttons to have text on them when their action became set. For most
toolbars, this was an invisible side effect; the button icons covered
the whole button rect. But the toolbar for EmojiInputDialog has slightly
smaller icons, causing an ellipsis to be displayed next to the icon.
2022-11-26 09:02:25 +01:00
Zaggy1024 e20756f9f7 LibGUI: Update buttons' text/tooltips in Action::set_text
This allows Actions that change based on some state to update their
associated buttons' text and tooltips to match their new text. The
play/pause button in SoundPlayer (and VideoPlayer if it's merged)
will now change tooltips when the playback changes state, rather than
always displaying "Play (Space)".
2022-10-30 23:54:12 +01:00
thankyouverycool 35e557c657 Browser+LibGUI+WindowServer: Open Button menus uniformly
Instead of letting buttons determine the relative position
of their menus, a workaround only used by Statusbar segments,
open them all uniformly for a nice, consistent UI.

Passing a rect to popup() now routes to open_button_menu(), an
analog to open_menubar_menu(), which adjusts the menu's popup
position in the same way. Fixes button menus obscuring the buttons
which spawn them and jutting out at odd corners depending on screen
position.
2022-09-08 10:17:27 +01:00
thankyouverycool 58955d37cc LibGUI: Let Buttons set their menu popup position
The previous ButtonStyle::Tray conditional was a hack for Statusbars.
2022-08-04 02:56:17 +02:00
Andreas Kling d18c25e973 LibGUI: Expose GUI::Button's "default" property to GML 2022-08-01 10:29:53 +02:00
networkException f9212ac02e LibGUI: Add button handler for middle mouse clicks 2022-07-14 13:17:33 +02:00
FrHun 19fac58e49 LibGUI: Use new layout system for basic widgets 2022-06-28 17:52:42 +01:00
Humberto Alves bbfafa19b4 LibGUI: Invert button icons only when the contrast ratio improves
Fix the algorithm that automatically inverts solid color button icons
when placed in similarly colored backgrounds. It was meant for fixing
black icons in dark themed buttons.

However, there may be situations where the resulting inverted version
is actually worse than the original. This change prevents those cases.
2022-06-27 20:22:40 +01:00
FrHun 4c84e64b2a LibGUI: Add DialogButton convenience class
DialogButton is a small convenience class, that just gives a button to
be used in dialogs for a more consistent look around the system.
2022-06-10 23:02:07 +01:00
Linus Groh 173dcfb7cb Everywhere: Fix a bunch of typos 2022-05-29 15:22:00 +02:00
MacDue 3b0785a636 LibGUI: Invert button icons with low contrast ratios
On some dark themes, it becomes impossible to dark button icons
against their dark button backgrounds. This change tries to
mitigate that by inverting the icon color if the contrast ratio
(against the button background) is less the 4.5 (the recommended
minimum for text).

This is only done for icons that are a solid color (e.g. all back),
where the desired icon would likely be the same inverted anyway.

Fixes a lot of cases of #13978
2022-05-26 00:07:24 +01:00
Simon Wanner 206d6ece55 LibGfx: Move other font-related files to LibGfx/Font/ 2022-04-09 23:48:18 +02:00
Rob Ryan 554709fec6 LibGUI: Extend mimic pressed across keyboard shortcuts for buttons
Primary motivation for this was to get a visual indication in the
browser for Ctrl-R refresh. This extends what ForLoveOfCats had done
for calculator button shortcuts across all buttons with shortcuts.

When an action is triggered without an activator each associated button
will be set as mimic pressed.
2022-04-03 12:21:50 +02:00
ForLoveOfCats e8f6a650ad LibGUI: Add mimic_pressed to Button to signify being virtually clicked
A button that is "mimic pressed" is drawn like it is being clicked when
it isn't necessarily actually being pressed. This lets programs which
keyboard based input that mirrors a button to show visual feedback when
a key is pressed.
2022-03-03 22:06:14 +01:00
ForLoveOfCats 1fd16232d3 LibGUI: Use logical and instead of bitwise in Button paint call
This appears to have been a typo. While it does work it's probably
better to be more clear here.
2022-03-03 22:06:14 +01:00
thankyouverycool 988c6fea19 LibGUI: Prefer to pop-up Tray Button menus from the top right
Fixes menus obscuring SegmentWidgets in status bars.
2022-02-24 19:09:41 +01:00
thankyouverycool f77ac3a73c LibGUI: Allow Buttons to set themselves as default
Several apps were implementing this behavior ad hoc. This provides
a standard API as well as a comfy visual cue for default return key
behavior.
2022-01-26 23:19:54 +01:00
Dylan Katz a2a93727db LibGUI: Allow Button::set_icon to accept a bitmap without a move
Previously, Button::set_icon required moving the bitmap into the
button, preventing the same bitmap from being used by multiple
buttons at once. While this works for buttons that are created once,
any button that is dynamically added would require the same bitmap to
be loaded every single time. In addition to being ineffecient, this
also makes error checking more difficult.

With this change, a bitmap can be loaded once, and passed to multiple
buttons.
2022-01-21 22:14:13 +01:00
Sam Atkins dd17df76e9 LibGUI: Make button icons settable in GML
`Widget::load_from_gml()` doesn't yet return `ErrorOr`, so we log a
warning message if loading the icon fails.
2022-01-16 11:17:03 +01:00
PerikiyoXD ff49285a02 LibGUI: Adjust focus rect for Buttons with icons
Reduced focus rect inflation value for buttons with icons
to match the expected focus rect for buttons without icons.

As mentioned in 'SerenityOS Office Hours / Q&A (2021-12-17)'
2021-12-19 13:39:02 +01:00
Brian Gianforcaro 8623cec0d7 LibGUI: Remove unused header includes 2021-08-01 08:10:16 +02:00
sin-ack 4c9c85ac01 Userland: Make TextWrapping::Wrap opt-in
This was breaking many places which didn't expect text to wrap. Now,
the only place where text currently wraps is in GUI::Label.
2021-07-27 22:05:20 +02:00
sin-ack e11940fd01 Userland: Move text wrapping/elision into the new TextLayout :^)
This class now contains all the fun bits about laying out text in a
rect. It will handle line wrapping at a certain width, cutting off lines
that don't fit the given rect, and handling text elision.
Painter::draw_text now internally uses this.

Future work here would be not laying out text twice (once actually
preparing the lines to be rendered and once to get the bounding box),
and possibly adding left elision if necessary.

Additionally, this commit makes the Utf32View versions of
Painter::draw_text convert to Utf8View internally. The intention is to
completely remove those versions, but they're kept at the moment to keep
the scope of this PR small.
2021-07-26 21:14:39 +04:30
Andreas Kling 6a012ad79f LibGfx: Remove Gfx::FontDatabase::default_bold_font()
Instead use default_font().bold_variant() in cases where we want a bold
variant of the default font. :^)
2021-05-20 20:55:29 +02:00
Matthew Olsson 88cfaf7bf0 LibGfx: Unify Rect, Point, and Size
This commit unifies methods and method/param names between the above
classes, as well as adds [[nodiscard]] and ALWAYS_INLINE where
appropriate. It also renamed the various move_by methods to
translate_by, as that more closely matches the transformation
terminology.
2021-05-02 22:48:06 +02:00