Compare commits

...

123 Commits

Author SHA1 Message Date
Christian Kaiser 2d6f989f36
Merge 7d99ade754 into fa0b25fe87 2025-09-24 03:44:31 -05:00
David Capello fa0b25fe87 Merge branch 'main' into beta
build-auto / build-auto (Debug, macos-latest) (push) Waiting to run Details
build-auto / build-auto (Debug, ubuntu-latest) (push) Waiting to run Details
build-auto / build-auto (Debug, windows-latest) (push) Waiting to run Details
build-auto / build-auto (RelWithDebInfo, macos-latest) (push) Waiting to run Details
build-auto / build-auto (RelWithDebInfo, ubuntu-latest) (push) Waiting to run Details
build-auto / build-auto (RelWithDebInfo, windows-latest) (push) Waiting to run Details
build / build (Debug, macos-latest, lua, cli) (push) Waiting to run Details
build / build (Debug, macos-latest, noscripts, cli) (push) Waiting to run Details
build / build (Debug, ubuntu-latest, lua, cli) (push) Waiting to run Details
build / build (Debug, ubuntu-latest, noscripts, cli) (push) Waiting to run Details
build / build (Debug, windows-latest, lua, cli) (push) Waiting to run Details
build / build (Debug, windows-latest, noscripts, cli) (push) Waiting to run Details
build / build (RelWithDebInfo, macos-latest, lua, gui) (push) Waiting to run Details
build / build (RelWithDebInfo, ubuntu-latest, lua, gui) (push) Waiting to run Details
build / build (RelWithDebInfo, windows-latest, lua, gui) (push) Waiting to run Details
2025-09-22 09:06:19 -03:00
David Capello f26ce64208 [lua] Update scripting API version to 36 2025-09-22 09:04:57 -03:00
David Capello e39dc90001 [lua] Enclose key names for plugin preferences with ["..."] when it's required (#5412) 2025-09-19 15:27:00 -03:00
Martín Capello 8f0dea0988 Avoid syntax errors reading extension preferences
Fix #5412 by using brackets and double quotes to enclose the name of
the preferences' properties and avoid issues when they contain unicode
chars
2025-09-19 14:58:35 -03:00
Christian Kaiser 6f1870cff3 Add Run Command 2025-09-18 21:25:13 -03:00
David Capello e8f18087e5 Update laf module 2025-09-18 20:47:56 -03:00
David Capello d8ac1a7a9e Update laf and add new libxrandr dependency 2025-09-17 09:15:35 -03:00
Aiden J Erickson 5cfa75ab3f [multimon] allow windows to open in non-default workareas (#4560, #5426)
Fix issue below:
In multi-monitor setups, native windows, e.g. the preview window, will,
when re-opened, be moved/clamped to the monitor of the main aseprite
window even if the re-opened window was previously and explicitly moved
to a different monitor.
2025-09-16 20:42:21 -03:00
David Capello 94174509a4 Merge branch 'main' into beta 2025-09-16 17:35:06 -03:00
David Capello c444b566e1 Fix painting UI theme colors as they are specified in sRGB color space
Fixes a regression found after merging #5414:
https://github.com/aseprite/aseprite/pull/5414#issuecomment-3286339563

We always expected a sRGB color in ui::Graphics API and we can specify
a color in another color space using the ui::Paint version of its
member functions.

Several functions related to color spaces are now using a ui::Display
to receive the specific display where we're going to paint, instead of
using os::System::instance()->defaultWindow()->colorSpace().
2025-09-16 09:42:35 -03:00
David Capello 5d5f3ec234 Convert AppShortcut in a ui::Shortcut subclass 2025-09-12 15:48:38 -03:00
David Capello 71e680e05a Refactor key context matching (fix #5390)
* Added AppShortcut::fitsBetterThan() to compare shortcuts and decide
  which one is better depending on the current key context and the ones
  where shortcuts are defined
* Added Key::fitsContext() to known if this key definition makes sense
  for a given current key context, e.g. Normal context can be used in
  SelectionTool context, and SelectionTool can be used in Transformation
* Added KeyboardShortcuts::findBestKeyFromMessage() to centralize the
  keyboard shortcuts matching moving some code from
  CustomizedGuiManager::processKey()
* Added more keyboard shortcuts tests (including some for #5390)
2025-09-12 15:41:08 -03:00
David Capello df5dcdc1d9 Add some KeyboardShortcuts basic tests 2025-09-12 15:07:26 -03:00
David Capello 85793a9e5f Add AppShortcut to include app::KeySource + ui::Shortcut
We need a list of shorcuts (AppShortcuts) similar to ui::Shortcuts but
including the key source to compare later where the shortcut was
defined and give more priority to the user-defined shortcuts. This
logic is not yet added, this patch is only a refactor.
2025-09-12 15:07:26 -03:00
David Capello d7b07a5173 Now Paint::color() can receive a color space w/any laf backend 2025-09-12 12:24:53 -03:00
Thorbjørn Lindeijer fae42dbe12 CMake: Use find_package(PkgConfig) instead of direct include
This gets rid of the following warning:

```
CMake Warning (dev) at /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:441 (message):
  The package name passed to `find_package_handle_standard_args` (PkgConfig)
  does not match the name of the calling package (HarfBuzz).  This can lead
  to problems in calling code that expects `find_package` result variables
  (e.g., `_FOUND`) to follow a certain pattern.
Call Stack (most recent call first):
  /usr/share/cmake/Modules/FindPkgConfig.cmake:114 (find_package_handle_standard_args)
  aseprite/cmake/FindHarfBuzz.cmake:33 (include)
  CMakeLists.txt:173 (find_package)
This warning is for project developers.  Use -Wno-dev to suppress it.
```

By applying the following change:
407fa892d9

The file could use further updates based on the upstream version.
2025-09-12 11:18:52 -03:00
David Capello 689e1ff524 Remove trailing whitespace from feature_request.md
This was the only file failing a pre-commit run --all-files
2025-09-11 17:59:13 -03:00
Christian Kaiser f549d476f1 See defaults when the saved font info is empty or invalid (fix #5339) 2025-09-10 16:50:57 -03:00
Christian Kaiser f494b8f343 Implement Label buddies 2025-09-06 06:14:43 -03:00
Gaspar Capello 907138d5dd Fix wrong color space in multiple UI elements
This fix solves color space missmatch in the following UI elements:
- Timeline thumbnails
- Palette entries
- Tileset entries
- Color Spectrum and Wheels
- Color Popup Gradients
- Color Button
2025-09-05 14:50:36 -03:00
David Capello 7e4f9ad078 Merge branch 'main' into beta 2025-09-04 20:41:48 -03:00
Christian Kaiser af349ce7ee [lua] Fix new layers not going to the top when selected (fix #5364) 2025-09-04 12:02:10 -03:00
David Capello 3bc4ac0838 Fix the "No Hinting" label for Font info description 2025-09-04 11:52:55 -03:00
Christian Kaiser 1774d86939 Reset weight button when weight is not available, show weight in popup 2025-09-04 11:49:57 -03:00
Christian Kaiser dce1dfd06b Add a font weight dropdown to the font selector 2025-09-04 11:49:57 -03:00
adityarana14 6283d69707 [Script] Added support for mousecursor and still supporting mouseCursor
Added the support for both "mousecursor" and "mouseCursor"
2025-09-04 10:51:49 -03:00
Christian Kaiser 27da1b03d0 Add placeholder property to Entry, default placeholder for SearchEntry 2025-09-04 10:37:48 -03:00
Christian Kaiser 834a94855f Allow typing numbers into Sliders 2025-09-04 10:34:11 -03:00
David Capello 21ad78cdbb Move app::Key to its own key.cpp file 2025-09-02 15:22:47 -03:00
David Capello 20b11a0fd3 Add image_benchmark 2025-09-01 17:09:03 -03:00
David Capello 8d4c4857ee Add new kind of Image iterators line by line: Image::read/writeArea() 2025-09-01 17:09:03 -03:00
David Capello 70c8924719 Add flag to switch IMAGE_BITMAP to 8bpp instead of 1bpp
We can set DOC_USE_BITMAP_AS_1BPP=0 to use 8bpp to simplify iteration
of bitmap pixel format using a 8bpp buffer just like indexed mode.
2025-09-01 17:09:03 -03:00
David Capello 286dd1c755 Update laf module 2025-08-28 11:56:26 -03:00
Martín Capello 3a14ac72a4 Fix DECORATIVE widget drawing outside of window 2025-08-27 15:33:10 -03:00
Gaspar Capello 2db193b8e3 Fix pivot position when Tiled Mode is enabled (fix #2316) 2025-08-27 15:32:50 -03:00
David Capello 002356ce19 [lua] Avoid accessing nullptr parent display at exit (#5384) 2025-08-27 15:26:31 -03:00
David Capello 9a1e92da35 Fix arrow keys to move selection (fix #5385)
Regression introduced in f61c2c3950
2025-08-27 15:22:42 -03:00
David Capello 07803ff361 Add missing [[fallthrough]] attribute 2025-08-27 12:25:19 -03:00
David Capello 8e07617a9d Fix non-void function path without return 2025-08-27 12:22:01 -03:00
Martín Capello 9c5ca6bcc6 Internationalize " Copy" string usage 2025-08-27 12:16:35 -03:00
Martín Capello e193891df3 Use "Copy" suffix to name duplicated slices 2025-08-27 12:16:35 -03:00
Martín Capello bb8547d004 Offset duplicated slices to avoid overlapping 2025-08-27 12:16:35 -03:00
Martín Capello 85997a08cf Add slices copy&paste and duplication (fix #4466) 2025-08-27 12:16:35 -03:00
Gaspar Capello 0995e72a6f Fix bug in Saturation layer blend mode (fix #2661) 2025-08-27 12:16:05 -03:00
David Capello f61c2c3950 Revert Esc key behavior to drop+deselect (fix #5102)
This adds a new button in the context bar so we have the three
available options to handle a transformation/drop pixels:

* Drop pixels and deselect (Esc key)
* Drop pixels but keep the selection (Enter key), new "Apply" command
* Discard changes/undo (Ctrl+Z)

This adds a new key context (Transformation) and also fixes tooltip
shortcuts on context bar buttons to show the current configured
shortcut for each action.

Reverts debab653fa and 194f8424a8
2025-08-27 11:56:57 -03:00
David Capello 0c49f2d7ad Update both .xml theme files through the tinyxml2 serializer 2025-08-27 09:31:46 -03:00
David Capello 5f7cc42333 Remove unnecessary call to regenerateCols() in Timeline::refresh()
Related to:
https://github.com/aseprite/aseprite/pull/5367#issuecomment-3225287017
2025-08-26 15:39:55 -03:00
Christian Kaiser 8e75cfc4c7 [lua] Refresh timeline when changing layer collapsed status (fix #5366) 2025-08-26 15:35:28 -03:00
David Capello 983b07383f [lua] Fix default autofit for a Dialog() when autofit is not specified (#5176 / #5321) 2025-08-26 11:23:48 -03:00
Christian Kaiser c57554646b Escape characters in the console that we can't show properly (fix #5324) 2025-08-26 11:21:08 -03:00
Christian Kaiser 74953174d6 [lua] Added `autofit` and `sizeHint` properties to Dialog (fix #5176) 2025-08-26 11:05:06 -03:00
Christian Kaiser 49fa35237a Activate the native window when asking the user to save sprite changes (fix #3542 / #5318) 2025-08-26 09:57:51 -03:00
Christian Kaiser 0ccf9dcc4f [lua] Add app.tip (#5316 / #5348) 2025-08-26 09:00:40 -03:00
David Capello 194f8424a8 Add right-click to configure the cancel selection button (#5102 / #5145) 2025-08-26 07:55:14 -03:00
Joshua Lopez debab653fa Fix marquee tool escape deselection (fix #5102) 2025-08-25 16:51:03 -03:00
hwabis 6e9024d54d Fix mouse wheel zooming not working with zoom tool (quick) 2025-08-25 16:35:14 -03:00
David Capello 1fa7fd0831 Minor UI fixes for dialogs with user data
This patch unifies the behavior of all dialogs with user data to
expand the window vertically onToggleUserData().
2025-08-25 16:20:37 -03:00
David Capello ab6b040e83 Rename Mask::m_freeze_count -> Mask::m_freezes 2025-08-25 15:30:23 -03:00
Gaspar Capello bc312a37b3 Fix Color Management regression (fix #5333)
Before this fix, the assigned color space was always sRGB (default),
so this color space was used for the rest of the rendering.
Now the color space for the back layer of the display
has been made explicit.
2025-08-25 13:10:25 -03:00
Christian Kaiser 3129fda977 [lua] Add missing "DIAGONAL" FlipType (fix #5359) 2025-08-17 14:58:26 -03:00
David Capello 6cb61fb41e Remove deprecated issue template 2025-08-14 14:17:56 -03:00
David Capello aa817a8d2a
Update issue templates 2025-08-14 14:11:47 -03:00
David Capello 40031f83d8 [lua] Fix typo in Sprite:newCel() error 2025-08-13 13:06:05 -03:00
David Capello ed3c8c510b Merge branch 'main' into beta 2025-08-13 09:27:20 -03:00
David Capello f23e3255bb Fix compilation w/ENABLE_DEVMODE 2025-08-12 16:12:35 -03:00
David Capello 90282dbc40 Fix cast error in HarfBuzz library between function types
This includes the following patch:
60c6b7786d
2025-08-11 15:29:58 -03:00
Martín Capello 1227f9c49c Refactor getLayerIndexFromSprite into LayerGroup 2025-08-11 14:47:56 -03:00
Martín Capello d61ae919ad Fix crash dropping file on timeline (fix #5289) 2025-08-11 14:47:56 -03:00
David Capello 58a5a64cd2 Simplify some code introduced in #5222 to draw different MaskBoundaries
* Added a new Editor::drawMaskBoundaries() and
  Editor::m_selectionToolMaskBoundaries to store the generated
  boundaries for the active SelectionToolLoopImpl.
* Removed app::Doc::setMaskBoundaries() used to restore the active
  mask boundaries.
* Removed Editor::MaskIndex
2025-08-08 18:15:08 -03:00
David Capello b2b2583176 [lua] Update scripting API version to 35 2025-08-07 20:18:10 -03:00
David Capello b535212642 Update laf module 2025-08-07 20:14:43 -03:00
Liebranca 2dbfaf746b Remove m_expandCelCanvas from SelectionToolLoopImpl 2025-08-07 19:54:33 -03:00
Liebranca 23d4543272 Implement tool loop for selection tools 2025-08-07 19:54:33 -03:00
Christian Kaiser 229a3cdf65 [lua] Add onchecked parameter to Commands 2025-08-07 18:57:28 -03:00
Christian Kaiser b3814ec912 Unify ContextBar updates when moving pixels, tooltips (fix #5329) 2025-08-06 20:20:42 -03:00
David Capello e88f3bb413 Show error if curl/unzip tools aren't available (fix #5309) 2025-08-06 14:44:21 -03:00
Christian Kaiser 366751d1f2 Command refresh and refactor, ui availability consistency (fix #3025) 2025-08-05 19:03:21 -03:00
David Capello 7434db6882 Merge branch 'dock' into beta (#518, #3485) 2025-08-05 16:23:53 -03:00
David Capello 5e12a5d3d8 Restore the "Position" section in Timeline configuration
We're going to keep this section for a couple of versions as old users
get used to the new Workspace Layout customization.

The "Position" section will contain the layout icon so we can switch
the Workspace Layout combobox from there too,
2025-08-04 19:41:59 -03:00
David Capello 60112cd929 Close layout combobox after clicking the reset/delete layout button
Without this, the combobox is still visible and clicking the button
again will crash the program.
2025-08-04 19:41:59 -03:00
David Capello a1fb751323 Remove base field from "New Layout" dialog 2025-08-04 19:41:59 -03:00
David Capello 24046600ec Fix loading modified default layouts at the very beginning 2025-08-04 19:41:59 -03:00
David Capello 34aae80eab Fix some strings
From https://github.com/aseprite/aseprite/pull/3485#pullrequestreview-2824195211
2025-08-04 19:41:59 -03:00
David Capello c8ae1017b3 Fix crashes resetting the default layout + remove some hacks
With this patch we've also simplified some hacks handling the
populateComboBox() call, deferring the deletion of widgets/items when
we are inside an event generated by those items.
2025-08-04 19:41:59 -03:00
David Capello 9c5d1feaf5 Fix several layout saving/loading issues
* Better support to load legacy timeline information: we have to
  estimate workspace bounds)
* Auto-save layouts after resizing a splitter/dock
* Fix resetting expansive widgets inside docks after switching tabs
* Load mirrored layout correctly if it was the last selected layout
2025-08-04 19:41:59 -03:00
David Capello aa66d260ad Fix switch/break style 2025-08-04 19:41:59 -03:00
David Capello 86c7fae42c Move LayoutSelector::setActiveLayoutId() impl to .cpp file 2025-08-04 19:41:59 -03:00
David Capello 778e62a411 Minor changes (format, remove unused/unnecessary vars/keywords) 2025-08-04 19:41:59 -03:00
David Capello b08662eeca Change notification flag location inside the layout selector widget
This improves the look of the flag as another icon above the tabs
bottom and at the right of the layout selector icon.
2025-08-04 19:41:59 -03:00
David Capello d6c5ac6786 [theme] New layout selector icon + bg color fixes 2025-08-04 19:41:59 -03:00
David Capello e0226d95d9 Improve layout selector widget location when menu bar is visible/hidden 2025-08-04 19:41:59 -03:00
David Capello 7eb2df6965 Remove unused member variable from ui::Dock 2025-08-04 19:41:59 -03:00
Christian Kaiser c445075a79 Polish layout handling
@dacap's notes: A description of the included changes:

* Improve UX auto-saving layouts when docks are modified, and new 'X'
  icon to delete layouts (or reset the 'Default' layout).
* Remove old timeline position controls (Left/Right/Bottom buttons)
  from the Timeline configuration and from the layout selector
* Add support to drag and drop docks to other sides with real-time
  feedback using a semi-transparent UILayer
* Add a context menu w/right-click to dock the widget at the supported
  sides without drag-and-drop

Some review comments in https://github.com/dacap/aseprite/pull/2
2025-08-04 19:41:59 -03:00
David Capello f556052fc6 Show handles in dockable areas to drag-and-drop them 2025-08-04 19:41:58 -03:00
David Capello c8e9b33ad3 Fix bug where the ToolBar popup wasn't being opened
This was a new issue with combination of
9b90159d1b, probably we should close the
popup when the window is resized (instead of onSizeHint()).
2025-08-04 19:41:58 -03:00
David Capello 37d2be7668 Update saving/loading dock layouts w/tinyxml2 library 2025-08-04 19:41:58 -03:00
David Capello 43140e71ec Save layout changes immediately when docks are resized
This patch includes:

* The layout is updated immediately when docks are resized (before
  this the layout was like a snapshot of the configuration when the
  layout was created or overwritten with the "New Layout" option)
* Saving the active layout used in
  preferences.general.workspace_layout so we can restore it after
  restarting Aseprite
* Change "UI Layout" to "Workspace Layout"
* Some strings moved to en.ini file for i18n
* Fixed a crash on MainWindow::onActiveViewChange() when the
  application was being closed
2025-08-04 19:41:58 -03:00
David Capello eecc14153d Improve borders of context & color bars for both sides (left/right) 2025-08-04 19:41:58 -03:00
David Capello 131aa8b3df Add View > Workspace Layout option to switch the layout w/keys 2025-08-04 19:41:58 -03:00
David Capello ab69421096 Add possibility to overwrite existent layouts 2025-08-04 19:41:58 -03:00
David Capello 0e4e776bc0 Include StatusBar in the set of customizable widgets in the layout 2025-08-04 19:41:58 -03:00
David Capello 78b9f340f7 Save/Load user defined layouts in new user.aseprite-layouts file
And now we store the TiXmlElement for each Layout, instead of
converting from/to text back and forth.
2025-08-04 19:41:58 -03:00
David Capello 92a039a619 Add option to save/restore user-defined layouts on memory
This happens only in memory at the moment (layouts are not saved in
disk yet), and the customization is quite simple (only size of
splitters, timeline position). But in the future we should be able to
dock elements in any place.
2025-08-04 19:41:58 -03:00
David Capello dc040e81e7 Set the initial timeline position in the LayoutSelector correctly 2025-08-04 19:41:58 -03:00
David Capello 465574e2db Show the timeline when we set its position from the LayoutSelector 2025-08-04 19:41:58 -03:00
David Capello 544f711adc Improve the layout selector UI
Changes:
* Now we use the "user data" icon as the button to expand the layouts
  combobox
* Added a tooltip to this icon
* Added buttons to configure the Timeline position in the same
  combobox
* Fixed some bugs in Dock using space for hidden widgets
2025-08-04 19:41:58 -03:00
David Capello ec95323856 Save/restore color bar splitter position correctly 2025-08-04 19:41:58 -03:00
David Capello 9b56d5ba3d Save/restore timeline splitter position correctly 2025-08-04 19:41:58 -03:00
David Capello 2c0920f514 Fix popups & tooltips direction when ToolBar is docked at the left side 2025-08-04 19:41:58 -03:00
David Capello ba39b56096 Fix std::clamp() max bound in TipWindow::pointAt() 2025-08-04 19:41:58 -03:00
David Capello ad4d00ced2 Use std::unique_ptr in ToolBar members 2025-08-04 19:41:58 -03:00
David Capello 6df6037fdc Fix memory leaks in MainWindow
Temporary/created subdocks must be deleted automatically, and children
that are not part of the window hierarchy must be deleted explicitly
now (using some std::unique_ptrs).
2025-08-04 19:41:58 -03:00
David Capello bb65296a1a Add Dock widget, initial & basic version of dockable elements (#518)
Some missing features so far:

1) Restore old layout configuration (color bar split pos, timeline
   pos, etc.) and migrate to new Dock layout
2) Load/saving Dock layout
3) Create & customize current layoout (drag-and-drop widgets, etc.)
2025-08-04 19:41:58 -03:00
Christian Kaiser eaa2bdf0af [lua] Process mnemonics consistently for plugins (fix #5250) 2025-08-04 15:58:29 -03:00
Christian Kaiser 57309e5aa5 Allow gif encoding to be stopped (fix #2619) 2025-08-01 20:46:32 -03:00
Christian Kaiser 4bb9239f50 [lua] Add `resizeable` property to Dialog constructor (fix #5177)
build / build (Debug, macos-latest, lua, cli) (push) Has been cancelled Details
build / build (Debug, macos-latest, noscripts, cli) (push) Has been cancelled Details
build / build (Debug, ubuntu-latest, lua, cli) (push) Has been cancelled Details
build / build (Debug, ubuntu-latest, noscripts, cli) (push) Has been cancelled Details
build / build (Debug, windows-latest, lua, cli) (push) Has been cancelled Details
build / build (Debug, windows-latest, noscripts, cli) (push) Has been cancelled Details
build / build (RelWithDebInfo, macos-latest, lua, gui) (push) Has been cancelled Details
build / build (RelWithDebInfo, ubuntu-latest, lua, gui) (push) Has been cancelled Details
build / build (RelWithDebInfo, windows-latest, lua, gui) (push) Has been cancelled Details
2025-08-01 18:57:50 -03:00
David Capello cef92c1a38 Add .plist files for macOS
build-auto / build-auto (Debug, macos-latest) (push) Has been cancelled Details
build-auto / build-auto (Debug, ubuntu-latest) (push) Has been cancelled Details
build-auto / build-auto (Debug, windows-latest) (push) Has been cancelled Details
build-auto / build-auto (RelWithDebInfo, macos-latest) (push) Has been cancelled Details
build-auto / build-auto (RelWithDebInfo, ubuntu-latest) (push) Has been cancelled Details
build-auto / build-auto (RelWithDebInfo, windows-latest) (push) Has been cancelled Details
build / build (Debug, macos-latest, lua, cli) (push) Has been cancelled Details
build / build (Debug, macos-latest, noscripts, cli) (push) Has been cancelled Details
build / build (Debug, ubuntu-latest, lua, cli) (push) Has been cancelled Details
build / build (Debug, ubuntu-latest, noscripts, cli) (push) Has been cancelled Details
build / build (Debug, windows-latest, lua, cli) (push) Has been cancelled Details
build / build (Debug, windows-latest, noscripts, cli) (push) Has been cancelled Details
build / build (RelWithDebInfo, macos-latest, lua, gui) (push) Has been cancelled Details
build / build (RelWithDebInfo, ubuntu-latest, lua, gui) (push) Has been cancelled Details
build / build (RelWithDebInfo, windows-latest, lua, gui) (push) Has been cancelled Details
We don't have an Aseprite.app target in cmake files yet, but we might
add it in a near future.
2025-07-28 16:18:19 -03:00
Christian Kaiser 22e72ab5cb [win] Fix includeDesktopDir returning the default path
build / build (Debug, macos-latest, lua, cli) (push) Waiting to run Details
build / build (Debug, macos-latest, noscripts, cli) (push) Waiting to run Details
build / build (Debug, ubuntu-latest, lua, cli) (push) Waiting to run Details
build / build (Debug, ubuntu-latest, noscripts, cli) (push) Waiting to run Details
build / build (Debug, windows-latest, lua, cli) (push) Waiting to run Details
build / build (Debug, windows-latest, noscripts, cli) (push) Waiting to run Details
build / build (RelWithDebInfo, macos-latest, lua, gui) (push) Waiting to run Details
build / build (RelWithDebInfo, ubuntu-latest, lua, gui) (push) Waiting to run Details
build / build (RelWithDebInfo, windows-latest, lua, gui) (push) Waiting to run Details
Uses SHGFP_TYPE_CURRENT which returns the Desktop that the user has configured instead of the default, fixes Windows 11's OneDrive Desktop folder.
2025-07-28 10:47:53 -03:00
Christian Kaiser 80fa065bd5 [lua] Add sprite.undoHistory
build / build (Debug, macos-latest, lua, cli) (push) Has been cancelled Details
build / build (Debug, macos-latest, noscripts, cli) (push) Has been cancelled Details
build / build (Debug, ubuntu-latest, lua, cli) (push) Has been cancelled Details
build / build (Debug, ubuntu-latest, noscripts, cli) (push) Has been cancelled Details
build / build (Debug, windows-latest, lua, cli) (push) Has been cancelled Details
build / build (Debug, windows-latest, noscripts, cli) (push) Has been cancelled Details
build / build (RelWithDebInfo, macos-latest, lua, gui) (push) Has been cancelled Details
build / build (RelWithDebInfo, ubuntu-latest, lua, gui) (push) Has been cancelled Details
build / build (RelWithDebInfo, windows-latest, lua, gui) (push) Has been cancelled Details
2025-07-25 13:58:52 -03:00
David Capello de1ccb24dd [win] Don't drop text when IME dialog composition is accepted w/Enter
build / build (Debug, macos-latest, lua, cli) (push) Waiting to run Details
build / build (Debug, macos-latest, noscripts, cli) (push) Waiting to run Details
build / build (Debug, ubuntu-latest, lua, cli) (push) Waiting to run Details
build / build (Debug, ubuntu-latest, noscripts, cli) (push) Waiting to run Details
build / build (Debug, windows-latest, lua, cli) (push) Waiting to run Details
build / build (Debug, windows-latest, noscripts, cli) (push) Waiting to run Details
build / build (RelWithDebInfo, macos-latest, lua, gui) (push) Waiting to run Details
build / build (RelWithDebInfo, ubuntu-latest, lua, gui) (push) Waiting to run Details
build / build (RelWithDebInfo, windows-latest, lua, gui) (push) Waiting to run Details
build-auto / build-auto (Debug, macos-latest) (push) Has been cancelled Details
build-auto / build-auto (Debug, ubuntu-latest) (push) Has been cancelled Details
build-auto / build-auto (Debug, windows-latest) (push) Has been cancelled Details
build-auto / build-auto (RelWithDebInfo, macos-latest) (push) Has been cancelled Details
build-auto / build-auto (RelWithDebInfo, ubuntu-latest) (push) Has been cancelled Details
build-auto / build-auto (RelWithDebInfo, windows-latest) (push) Has been cancelled Details
With #5230, now that we can show the IME dialog on Windows, when we
are selecting a specific word/composition in the IME dialog, if we
press Enter we'll receive that Enter onKeyUp(). It's better if we
process the Enter key onKeyDown() (as the IME enter key is not
received in that case).
2025-07-25 09:19:50 -03:00
David Capello 7d91c4b9d9 [win] Fix dead keys on Windows 2025-07-24 17:45:46 -03:00
Christian Kaiser 7d99ade754 [WIP] Implement custom format support for extensions, saving and loading 2025-07-22 03:11:33 -03:00
374 changed files with 10060 additions and 3999 deletions

View File

@ -1,9 +0,0 @@
Describe your bug report or feature request here
...
...
...
### Aseprite and System version
* Aseprite version: version number, installer/portable/Steam/beta/dev/commit-hash
* System: Windows/macOS/Linux, version, distribution

32
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@ -0,0 +1,32 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: bug, triage
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots or a screen recording to help explain your problem.
**Aseprite & System (please complete the following information):**
- Aseprite: [version number, installer/portable/Steam/beta/dev/commit-hash]
- System: [Windows/macOS/Linux, version, distribution]
- Extensions: [List the extensions you have installed]
**Additional context**
Add any other context about the problem here.

View File

@ -0,0 +1,29 @@
---
name: Feature request
about: Suggest an idea for Aseprite
title: ''
labels: feature, triage
assignees: ''
---
**Did other user suggested a similar idea?**
- [ ] No
- [ ] Yes/Links to similar ideas
> You can try to find a similar feature requests before in:
> - GitHub issues: https://github.com/aseprite/aseprite/issues?q=label%3Afeature
> - Community site: https://community.aseprite.org/c/features/7
> - Steam community: https://steamcommunity.com/app/431730/discussions/1/
> In case you find a similar feature request, making a comment there will be useful to give some traction and show interest in the feature.
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

View File

@ -24,7 +24,8 @@ jobs:
sudo apt-get update -qq
sudo apt-get install -y \
libpixman-1-dev libfreetype6-dev libharfbuzz-dev zlib1g-dev \
libx11-dev libxcursor-dev libxi-dev libgl1-mesa-dev libfontconfig1-dev
libx11-dev libxcursor-dev libxi-dev libxrandr-dev libgl1-mesa-dev \
libfontconfig1-dev
- uses: aseprite/get-ninja@main
- uses: ilammy/msvc-dev-cmd@v1
if: runner.os == 'Windows'

View File

@ -28,7 +28,8 @@ jobs:
sudo apt-get update -qq
sudo apt-get install -y \
libpixman-1-dev libfreetype6-dev libharfbuzz-dev zlib1g-dev \
libx11-dev libxcursor-dev libxi-dev libgl1-mesa-dev libfontconfig1-dev
libx11-dev libxcursor-dev libxi-dev libxrandr-dev libgl1-mesa-dev \
libfontconfig1-dev
- name: Install Skia
if: ${{ matrix.ui == 'gui' }}
shell: bash

View File

@ -25,7 +25,7 @@ jobs:
apt_packages: |
libc++-dev, libc++abi-dev, libpixman-1-dev,
libfreetype6-dev, libharfbuzz-dev, zlib1g-dev, libx11-dev,
libxcursor-dev, libxi-dev, libgl1-mesa-dev
libxcursor-dev, libxi-dev, libxrandr-dev, libgl1-mesa-dev
cmake_command: |
cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug -DLAF_BACKEND=none -DCMAKE_EXPORT_COMPILE_COMMANDS=on
- uses: ZedThree/clang-tidy-review/upload@v0.20.1

View File

@ -74,7 +74,7 @@ On macOS you will need macOS 15.4 SDK and Xcode 16.3 (older versions might work)
You will need the following dependencies on Ubuntu/Debian:
sudo apt-get install -y g++ clang cmake ninja-build libx11-dev libxcursor-dev libxi-dev libgl1-mesa-dev libfontconfig1-dev
sudo apt-get install -y g++ clang cmake ninja-build libx11-dev libxcursor-dev libxi-dev libxrandr-dev libgl1-mesa-dev libfontconfig1-dev
Or use clang-12 packages (or newer) in case that clang in your distribution is older than clang 12.0:
@ -82,15 +82,15 @@ Or use clang-12 packages (or newer) in case that clang in your distribution is o
On Fedora:
sudo dnf install -y gcc-c++ clang libcxx-devel cmake ninja-build libX11-devel libXcursor-devel libXi-devel mesa-libGL-devel fontconfig-devel
sudo dnf install -y gcc-c++ clang libcxx-devel cmake ninja-build libX11-devel libXcursor-devel libXi-devel libXrandr-devel mesa-libGL-devel fontconfig-devel
On Arch:
sudo pacman -S gcc clang cmake ninja libx11 libxcursor mesa-libgl fontconfig libwebp
sudo pacman -S gcc clang cmake ninja libx11 libxcursor libxi libxrandr mesa-libgl fontconfig libwebp
On SUSE:
sudo zypper install gcc-c++ clang cmake ninja libX11-devel libXcursor-devel libXi-devel Mesa-libGL-devel fontconfig-devel
sudo zypper install gcc-c++ clang cmake ninja libX11-devel libXcursor-devel libXi-devel libXrandr-devel Mesa-libGL-devel fontconfig-devel
# Automatic Building

View File

@ -428,9 +428,17 @@ if [ ! -d "$skia_library_dir" ] ; then
skia_url=$(bash laf/misc/skia-url.sh $skia_build)
skia_file=$(basename $skia_url)
if [ ! -f "$skia_dir/$skia_file" ] ; then
if ! command -v curl >/dev/null 2>&1 ; then
echo "Error: 'curl' command line tool is not available in PATH"
exit 1
fi
curl --ssl-revoke-best-effort -L -o "$skia_dir/$skia_file" "$skia_url"
fi
if [ ! -d "$skia_library_dir" ] ; then
if ! command -v unzip >/dev/null 2>&1 ; then
echo "Error: 'unzip' command line tool is not available in PATH"
exit 1
fi
unzip -n -d "$skia_dir" "$skia_dir/$skia_file"
fi
else

View File

@ -30,7 +30,7 @@
# HARFBUZZ_INCLUDE_DIRS - containg the HarfBuzz headers
# HARFBUZZ_LIBRARIES - containg the HarfBuzz library
include(FindPkgConfig)
find_package(PkgConfig QUIET)
pkg_check_modules(PC_HARFBUZZ harfbuzz>=0.9.7)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Aseprite -->
<!-- Copyright (C) 2018-2024 Igara Studio S.A. -->
<!-- Copyright (C) 2018-2025 Igara Studio S.A. -->
<!-- Copyright (C) 2001-2018 David Capello -->
<gui>
<!-- Keyboard shortcuts -->
@ -119,6 +119,7 @@
<param name="frame" value="current" />
</key>
<key command="ReverseFrames" shortcut="Alt+I" />
<key command="RunCommand" shortcut="Ctrl+Space" />
<key command="GotoFirstFrame" shortcut="Home" />
<key command="GotoPreviousFrame" shortcut="Left" context="Normal" />
<key command="GotoNextFrame" shortcut="Right" context="Normal" />
@ -175,6 +176,7 @@
<param name="popup" value="background" />
</key>
<key command="ShowExtras" shortcut="Ctrl+H" />
<key command="ToggleWorkspaceLayout" shortcut="Shift+W" />
<!-- Tabs -->
<key command="GotoNextTab" shortcut="Ctrl+Tab" />
<key command="GotoPreviousTab" shortcut="Ctrl+Shift+Tab" />
@ -371,6 +373,12 @@
<param name="quantity" value="1" />
</key>
<!-- Main selection actions (apply transformation / undo) -->
<key command="DeselectMask" shortcut="Esc" context="Transformation" />
<key command="Apply" shortcut="Enter" context="Transformation" />
<key command="Apply" shortcut="Enter Pad" context="Transformation" />
<key command="Undo" shortcut="Ctrl+Z" mac="Cmd+Z" context="Transformation" />
<!-- Move selection with arrows -->
<key command="MoveMask" shortcut="Left" context="Selection">
<param name="target" value="content" />
@ -1002,6 +1010,8 @@
</menu>
<menu text="@.view" id="view_menu">
<item command="DuplicateView" text="@.view_duplicate_view" group="view_new" />
<item command="ToggleWorkspaceLayout" text="@.view_workspace_layout" />
<item command="RunCommand" text="@.view_run_command" />
<separator />
<item command="ShowExtras" text="@.view_show_extras" />
<menu text="@.view_show" group="view_extras">
@ -1203,6 +1213,7 @@
<menu id="slice_popup_menu">
<item command="SliceProperties" text="@.properties" group="slice_popup_properties" />
<item command="DuplicateSlice" text="@.duplicate" group="slice_popup_duplicate" />
<item command="RemoveSlice" text="@.delete" group="slice_popup_delete" />
</menu>

View File

@ -167,6 +167,7 @@
<option id="keep_closed_sprite_on_memory_for" type="double" default="15.0" />
<option id="show_full_path" type="bool" default="true" />
<option id="edit_full_path" type="bool" default="false" />
<option id="workspace_layout" type="std::string" />
<option id="timeline_position" type="TimelinePosition" default="TimelinePosition::BOTTOM" />
<option id="timeline_layer_panel_width" type="int" default="100" />
<option id="show_menu_bar" type="bool" default="true" />
@ -255,6 +256,7 @@
<option id="one_finger_as_mouse_movement" type="bool" default="true" />
<option id="load_wintab_driver" type="bool" default="false" />
<option id="flash_layer" type="bool" default="false" />
<option id="use_selection_tool_loop" type="bool" default="false" />
<option id="nonactive_layers_opacity" type="int" default="255" />
<option id="nonactive_layers_opacity_preview" type="int" default="255" />
</section>

View File

@ -206,6 +206,7 @@ AddColor_Background = Background
AddColor_Foreground = Foreground
AddColor_Specific = Specific
AdvancedMode = Advanced Mode
Apply = Apply
AutocropSprite = Trim Sprite
AutocropSprite_ByGrid = Trim Sprite by Grid
BackgroundFromLayer = Background from Layer
@ -265,6 +266,7 @@ Despeckle = Despeckle
DeveloperConsole = Developer Console
DiscardBrush = Discard Brush
DuplicateLayer = Duplicate Layer
DuplicateSlice = Duplicate Slice
DuplicateSprite = Duplicate Sprite
DuplicateView = Duplicate View
Exit = Exit
@ -401,6 +403,7 @@ ReverseFrames = Reverse Frames
Rotate = Rotate {0} {1}
Rotate_Selection = Selection
Rotate_Sprite = Sprite
RunCommand = Run Command
RunScript = Run Script
SaveFile = Save File
SaveFileAs = Save File As
@ -488,6 +491,7 @@ TilesetDuplicate = Duplicate Tileset
Undo = Undo
UndoHistory = Undo History
UnlinkCel = Unlink Cel
ToggleWorkspaceLayout = Toggle Workspace Layout
Zoom = Zoom
Zoom_In = Zoom In
Zoom_Out = Zoom Out
@ -581,8 +585,9 @@ rotsprite = RotSprite
pixel_perfect = Pixel-perfect
linear_gradient = Linear Gradient
radial_gradient = Radial Gradient
drop_pixel = Drop pixels here (Enter)
cancel_drag = Cancel drag and drop (Esc)
drop_pixel_and_deselect = Apply transformation and deselect
drop_pixel = Apply transformation and keep selection
cancel_drag = Cancel transformation and undo/discard changes
auto_select_layer = Auto Select Layer
all = All
none = None
@ -621,6 +626,14 @@ current_layer = Current Layer
first_ref_layer = First Reference Layer
pick = Pick:
sample = Sample:
position_label = P:
rotation_label = R:
position_x = X Position
position_y = Y Position
size_width = Width
size_height = Height
rotation_angle = Angle
rotation_skew = Skew
[convolution_matrix]
reload_stock = &Reload Stock
@ -789,7 +802,22 @@ empty_fonts = No system fonts were found
[font_style]
antialias = Antialias
hinting = Hinting
hinting_none = No Hinting
hinting_slight = Slight Hinting
hinting_full = Full Hinting
ligatures = Ligatures
font_weight = Font Weight
italic = Italic
font_weight_100 = Thin
font_weight_200 = Extra Light
font_weight_300 = Light
font_weight_400 = Normal
font_weight_500 = Medium
font_weight_600 = Semi Bold
font_weight_700 = Bold
font_weight_800 = Extra Bold
font_weight_900 = Black
font_weight_1000 = Extra Black
[frame_combo]
all_frames = All frames
@ -817,6 +845,8 @@ same_in_all_tools = Same in all Tools
opacity = Opacity:
tolerance = Tolerance:
show_more = Show more...
search = Search
copy_of = {} Copy
[general_text]
copy = &Copy
@ -957,6 +987,7 @@ key_context_move_tool = Move Tool
key_context_freehand_tool = Freehand Tool
key_context_shape_tool = Shape Tool
key_context_frames_selection = Frames Selection
key_context_transformation = Transformation
copy_selection = Copy Selection
snap_to_grid = Snap To Grid
lock_axis = Lock Axis
@ -1164,6 +1195,8 @@ select_load_from_file = &Load from MSK file
select_save_to_file = &Save to MSK file
view = &View
view_duplicate_view = Duplicate &View
view_workspace_layout = Workspace &Layout
view_run_command = Run Command
view_show_extras = &Extras
view_show = &Show
view_show_layer_edges = &Layer Edges
@ -1205,6 +1238,14 @@ help_twitter = Twitter
help_enter_license = Enter &License
help_about = &About
[main_window]
layout = Workspace Layout
default_layout = Default
mirrored_default_layout = Mirrored Default
timeline = Timeline
user_layouts = User Layouts
new_layout = New Layout...
[mask_by_color]
title = Select Color
label_color = Color:
@ -1233,6 +1274,20 @@ name = Name:
tileset = Tileset:
default_new_layer_name = New Layer
[new_layout]
title = New Workspace Layout
name = Name:
deleting_layout = Deleting Layout
deleting_layout_confirmation = Are you sure you want to delete the '{}' layout?
restoring_layout = Restoring Layout
restoring_layout_confirmation = Are you sure you want to restore the '{}' layout?
[dock]
left = Dock Left
right = Dock Right
top = Dock Top
bottom = Dock Bottom
[news_listbox]
more = More...
problem_loading = Problems loading news. Please retry.
@ -1562,6 +1617,7 @@ set_cursor_fix = Set cursor position from stylus location
set_cursor_fix_tooltip = Sets the mouse position to the pen location when\nyou have two pointers available (e.g. mouse and pen)\n\nUseful to zoom in/out from the pen position and to get the\ncorrect cursor location when screencasting/live streaming.
wintab_more_info = (More Information)
flash_selected_layer = Flash layer when it is selected
use_selection_tool_loop = New selection tools implementation
non_active_layer_opacity = Opacity for non-active layers:
cel_content_format = Cel content format:
cel_format_compressed = Compressed
@ -1664,6 +1720,10 @@ from = From:
to = To:
tolerance = Tolerance:
[duplicate_slice]
x_duplicated = Slice "{}" duplicated
n_slices_duplicated = {} slice(s) duplicated
[remove_slice]
x_removed = Slice "{}" removed
n_slices_removed = {} slice(s) removed
@ -1748,6 +1808,7 @@ delete_file = Delete file, I've already sent it
[slice_popup_menu]
properties = Slice &Properties...
duplicate = D&uplicate Slice
delete = &Delete Slice
[slice_properties]
@ -1849,9 +1910,6 @@ more_options = More Options
[timeline_conf]
position = Position:
left = &Left
right = &Right
bottom = &Bottom
frame_header = Frame Header:
first_frame = First Frame:
thumbnails = Thumbnails
@ -1947,3 +2005,17 @@ toggle_left_diagonal = Toggle -45° Symmetry
show_options = Symmetry Options
reset_position = Reset Symmetry to Center
reset_position_to_view_center = Reset Symmetry to View Center
[run_command]
title = Run Command
title_help = Run Command: Help
title_expression = Run Command: Math Expressions
title_script = Run Command: Lua Script Runner
command_placeholder = Search for commands, ? for help.
more_result_count = ... ({} more results)
tip_executed_command = Executed: '{0}'
tip_code_executed = Code executed successfully.
help_search = Type to search through Aseprite's functionality.
help_expressions = You can also start with "=" to do math expressions
help_lua = or "@" to execute Lua script code.
extension_tag = Extension

View File

@ -4,27 +4,27 @@
<vbox id="brush_slot_params">
<grid columns="2">
<label text="@.brush" />
<label text="@.brush" for="brush_params" />
<buttonset id="brush_params" columns="3" multiple="true">
<item id="brush_type" text="@.brush_type" />
<item id="brush_size" text="@.brush_size" />
<item id="brush_angle" text="@.brush_angle" />
</buttonset>
<label text="@.color" />
<label text="@.color" for="color_params" />
<buttonset id="color_params" columns="2" multiple="true">
<item id="fg_color" text="@.foreground" />
<item id="bg_color" text="@.background" />
<item id="image_color" text="@.image_color" hspan="2" />
</buttonset>
<label text="@.ink" />
<label text="@.ink" for="ink_params" />
<buttonset id="ink_params" columns="2" multiple="true">
<item id="ink_type" text="@.ink_type" />
<item id="ink_opacity" text="@.ink_opacity" />
</buttonset>
<label text="@.extras" />
<label text="@.extras" for="extra_params" />
<buttonset id="extra_params" columns="2" multiple="true">
<item id="shade" text="@.shade" />
<item id="pixel_perfect" text="@.pixel_perfect" />

View File

@ -7,9 +7,9 @@
<separator text="@.size" left="true" horizontal="true" />
<hbox>
<grid columns="2">
<label text="@.width" />
<label text="@.width" for="width" />
<expr text="0" id="width" suffix="px" magnet="true" />
<label text="@.height" />
<label text="@.height" for="height" />
<expr text="0" id="height" suffix="px" />
<hbox filler="true" cell_hspan="2" />
</grid>
@ -28,16 +28,16 @@
<separator text="@.borders" left="true" horizontal="true" />
<grid columns="4">
<label text="@.left" />
<label text="@.left" for="left" />
<expr text="0" id="left" suffix="px" tooltip="@.left_tooltip" />
<label text="@.top" />
<label text="@.top" for="top" />
<expr text="0" id="top" suffix="px" tooltip="@.top_tooltip" />
<label text="@.right" />
<label text="@.right" for="right" />
<expr text="0" id="right" suffix="px" tooltip="@.right_tooltip" />
<label text="@.bottom" />
<label text="@.bottom" for="bottom" />
<expr text="0" id="bottom" suffix="px" tooltip="@.bottom_tooltip" />
</grid>

View File

@ -4,11 +4,11 @@
<gui>
<window id="cel_properties" text="@.title">
<grid id="properties_grid" columns="4">
<label text="@.opacity" />
<label text="@.opacity" for="opacity" />
<opacityslider id="opacity" cell_align="horizontal" width="128" cell_hspan="2" />
<button id="user_data" icon="icon_user_data" tooltip="@.user_data_tooltip" />
<label text="@.zindex" />
<label text="@.zindex" for="zindex" />
<expr id="zindex" cell_align="horizontal" width="128" />
<buttonset id="zindex_spin" columns="1">
<item icon="spin_up" />

View File

@ -5,10 +5,10 @@
<vbox>
<hbox expansive="true">
<grid columns="2">
<label text="@.x" />
<label text="@.x" for="x" />
<expr id="x" magnet="true" />
<label text="@.y" />
<label text="@.y" for="y" />
<expr id="y" />
</grid>
</hbox>

View File

@ -9,9 +9,9 @@
</view>
<hbox id="dithering_placeholder" />
<hbox id="amount">
<label text="@.amount" />
<label text="@.amount" for="factor" />
<slider min="0" max="100" id="factor" minwidth="100" />
<label text="%" />
<label text="%" for="factor" />
</hbox>
<combobox id="to_gray_combobox">
@ -24,10 +24,10 @@
<check id="advanced_check" text="@general.advanced_options" />
<grid id="advanced" columns="2">
<label text="@rgbmap_algorithm_selector.label" />
<label text="@rgbmap_algorithm_selector.label" for="rgbmap_algorithm_selector" />
<hbox id="rgbmap_algorithm_placeholder" cell_align="horizontal" />
<label text="@best_fit_criteria_selector.label" />
<label text="@best_fit_criteria_selector.label" for="best_fit_criteria_selector" />
<hbox id="best_fit_criteria_placeholder" cell_align="horizontal" />
</grid>

View File

@ -3,7 +3,7 @@
<gui>
<window id="css_options" text="@.title">
<grid columns="2">
<label text="@.pixel_scale" />
<label text="@.pixel_scale" for="pixel_scale" />
<expr id="pixel_scale" magnet="true" cell_align="horizontal"/>
<check text="@.with_vars" id="with_vars" cell_hspan="2" />

View File

@ -3,9 +3,9 @@
<gui>
<hbox id="despeckle">
<grid columns="2">
<label text="@.width" />
<label text="@.width" for="width" />
<expr id="width" cell_align="horizontal" />
<label text="@.height" />
<label text="@.height" for="height" />
<expr id="height" cell_align="horizontal" />
</grid>
</hbox>

View File

@ -3,16 +3,13 @@
<gui>
<window id="duplicate_sprite" text="@.title">
<box vertical="true">
<box horizontal="true" expansive="true">
<box vertical="true" homogeneous="true">
<label text="@.duplicate" />
<label text="@.as" />
</box>
<box vertical="true" homogeneous="true" expansive="true">
<label text="" id="src_name" />
<entry maxsize="256" id="dst_name" magnet="true" />
</box>
</box>
<grid columns="2">
<label text="@.duplicate" />
<label text="" id="src_name" cell_align="horizontal" />
<label text="@.as" for="dst_name" />
<entry maxsize="256" id="dst_name" magnet="true" cell_align="horizontal" />
</grid>
<check text="@.merged_layers" id="flatten" />
<box horizontal="true" homogeneous="true">
<button text="@general.ok" closewindow="true" id="ok" magnet="true" />

View File

@ -32,29 +32,29 @@
<grid id="options" columns="2" childspacing="0" expansive="true">
<separator id="separator" text="@.max_point_value" horizontal="true" cell_hspan="2" />
<label id="size_label" text="@.size" style="mini_label" />
<label id="size_label" text="@.size" style="mini_label" for="min_size" />
<slider id="min_size" value="1" min="1" max="64" cell_align="horizontal" style="mini_slider"
tooltip="@.min_size_tooltip" tooltip_dir="left" />
<boxfiller />
<slider id="max_size" value="64" min="1" max="64" cell_align="horizontal" style="mini_slider"
tooltip="@.max_size_tooltip" tooltip_dir="left" />
<label id="angle_label" text="@.angle" style="mini_label" />
<label id="angle_label" text="@.angle" style="mini_label" for="min_angle" />
<slider id="min_angle" value="0" min="-180" max="+180" cell_align="horizontal" style="mini_slider"
tooltip="@.min_angle_tooltip" tooltip_dir="left" />
<boxfiller />
<slider id="max_angle" value="0" min="-180" max="+180" cell_align="horizontal" style="mini_slider"
tooltip="@.max_angle_tooltip" tooltip_dir="left" />
<label id="gradient_label" text="@.gradient" style="mini_label" />
<label id="gradient_label" text="@.gradient" style="mini_label" for="dithering_selector" />
<hbox id="gradient_placeholder" cell_vspan="2" />
<link id="gradient_from_to" style="mini_label" />
<separator id="separator2" text="@.sensors_tweaks" horizontal="true" cell_hspan="2" />
<label id="pressure_label" text="@.pressure" style="mini_label" />
<label id="pressure_label" text="@.pressure" style="mini_label" for="pressure_slider" />
<hbox id="pressure_placeholder" cell_align="horizontal" />
<label id="velocity_label" text="@.velocity" style="mini_label" />
<label id="velocity_label" text="@.velocity" style="mini_label" for="velocity_slider" />
<hbox id="velocity_placeholder" cell_align="horizontal" />
</grid>
<separator horizontal="true" cell_hspan="2" />

View File

@ -4,9 +4,9 @@
<gui>
<window id="export_file" text="@.title" help="exporting">
<grid columns="3">
<label text="@.output_file" />
<label text="@.output_file" for="output_field" />
<filename id="output_field" cell_align="horizontal" cell_hspan="2" />
<label id="resize_label" text="@.resize" />
<label id="resize_label" text="@.resize" for="resize" />
<hbox cell_hspan="2" cell_align="horizontal">
<combobox id="resize" editable="true" suffix="%" expansive="true">
<listitem text="25" />
@ -22,17 +22,17 @@
<listitem text="900" />
<listitem text="1000" />
</combobox>
<label id="area_label" text="@.area" />
<label id="area_label" text="@.area" for="area" />
<combobox id="area" text="" cell_align="horizontal" cell_hspan="2" expansive="true" />
</hbox>
<label id="layers_label" text="@.layers" />
<label id="layers_label" text="@.layers" for="layers" />
<combobox id="layers" text="" cell_align="horizontal" cell_hspan="2" />
<label id="frames_label" text="@.frames" />
<label id="frames_label" text="@.frames" for="frames" />
<combobox id="frames" text="" cell_align="horizontal" cell_hspan="2" />
<label id="anidir_label" text="@.anidir" />
<label id="anidir_label" text="@.anidir" for="anidir" />
<combobox id="anidir" text="" cell_align="horizontal" cell_hspan="2" />
<check id="play_subtags" text="@.play_subtags" cell_hspan="3" />

View File

@ -25,11 +25,11 @@
<!-- Layout -->
<grid id="section_layout" columns="4" expansive="true">
<label text="@.sheet_type" />
<label text="@.sheet_type" for="sheet_type" />
<combobox id="sheet_type" expansive="true" cell_hspan="3" cell_align="horizontal"
tooltip="@.sheet_type_tooltip" tooltip_dir="bottom" />
<label text="@.constraints" />
<label text="@.constraints" for="constraint_type" />
<hbox cell_hspan="3">
<combobox id="constraint_type" tooltip="@.constraints_tooltip" />
<expr id="width_constraint" />
@ -50,15 +50,15 @@
<button id="close_sprite_section" icon="window_close_icon" />
</hbox>
<grid id="section_sprite" columns="4" expansive="true">
<label text="@.source" />
<label text="@.source" for="source" />
<combobox id="source" text="" cell_hspan="2" cell_align="horizontal" />
<boxfiller />
<label text="@.layers" />
<label text="@.layers" for="layers" />
<combobox id="layers" text="" cell_hspan="2" cell_align="horizontal" />
<check id="split_layers" text="@.split_layers" tooltip="@.split_layers_tooltip" tooltip_dir="bottom" />
<label text="@.frames" />
<label text="@.frames" for="frames" />
<combobox id="frames" text="" cell_hspan="2" cell_align="horizontal" />
<check id="split_tags" text="@.split_tags" tooltip="@.split_tags_tooltip" tooltip_dir="top" />
</grid>
@ -75,11 +75,11 @@
<hbox cell_hspan="3">
<vbox>
<grid columns="2">
<label text="@.border" />
<label text="@.border" for="border_padding" />
<expr id="border_padding" text="0" tooltip="@.border_tooltip" />
<label text="@.shape" />
<label text="@.shape" for="shape_padding" />
<expr id="shape_padding" text="0" tooltip="@.shape_tooltip" />
<label text="@.inner" />
<label text="@.inner" for="inner_padding" />
<expr id="inner_padding" text="0" tooltip="@.inner_tooltip" />
</grid>
</vbox>
@ -130,12 +130,12 @@
<hbox />
<grid id="data_formats_placeholder" columns="3" cell_hspan="3" cell_align="horizontal">
<label text="@.data_filename_format" />
<label text="@.data_filename_format" for="data_filename_format" />
<entry id="data_filename_format" maxsize="1024" maxwidth="256" cell_align="horizontal"
tooltip="@.data_filename_format_tooltip" />
<link text="(?)" url="https://www.aseprite.org/docs/cli/#filename-format" />
<label text="@.data_tagname_format" />
<label text="@.data_tagname_format" for="data_tagname_format" />
<entry id="data_tagname_format" maxsize="1024" maxwidth="256" cell_align="horizontal"
tooltip="@.data_tagname_format_tooltip" />
<link text="(?)" url="https://www.aseprite.org/docs/cli/#tagname-format" />

View File

@ -27,10 +27,10 @@
</box>
<vbox id="file_view_placeholder" expansive="true" />
<grid columns="2">
<label text="@.file_name" />
<label text="@.file_name" for="file_name" />
<box id="file_name_placeholder" cell_align="horizontal" />
<label text="@.file_type" />
<label text="@.file_type" for="file_type" />
<hbox cell_align="horizontal">
<combobox id="file_type" minwidth="70" />
<boxfiller />

View File

@ -8,7 +8,7 @@
<label text="" id="frame" />
<box cell_align="horizontal" />
<label text="@.duration" />
<label text="@.duration" for="frlen" />
<expr id="frlen" magnet="true" />
<box cell_align="horizontal" />

View File

@ -3,7 +3,7 @@
<gui>
<window id="goto_frame" text="@.title">
<vbox>
<label text="@.frame_or_tags" />
<label text="@.frame_or_tags" for="frame" />
<vbox id="frame_placeholder" />
<separator horizontal="true" />

View File

@ -4,16 +4,16 @@
<window id="grid_settings" text="@.title">
<grid columns="4">
<label text="@.x" />
<label text="@.x" for="grid_x" />
<expr id="grid_x" text="" magnet="true" />
<label text="@.y" />
<label text="@.y" for="grid_y" />
<expr id="grid_y" text="" />
<label text="@.width" />
<label text="@.width" for="grid_w" />
<expr id="grid_w" text="" />
<label text="@.height" />
<label text="@.height" for="grid_h" />
<expr id="grid_h" text="" />
<separator horizontal="true" cell_hspan="4" />

View File

@ -7,36 +7,36 @@
<grid columns="4">
<button id="select_file" text="@select_file.text" cell_hspan="4" />
<label text="@.type" />
<label text="@.type" for="sheet_type" />
<combobox id="sheet_type" cell_hspan="3" />
<separator text="@.tiles" horizontal="true" cell_hspan="4" />
<label text="@.x" />
<label text="@.x" for="x" />
<expr id="x" text="0" />
<label text="@.y" />
<label text="@.y" for="y" />
<expr id="y" text="0" />
<label text="@.width" />
<label text="@.width" for="width" />
<expr id="width" text="16" />
<label text="@.height" />
<label text="@.height" for="height" />
<expr id="height" text="16" />
<separator horizontal="true" cell_hspan="4" />
<label text="@.columns" />
<label text="@.columns" for="columns" />
<expr id="columns" />
<label text="@.rows" />
<label text="@.rows" for="rows" />
<expr id="rows" />
<check id="padding_enabled" text="@.padding" cell_hspan="4" />
<label text="@.horizontal_padding" id="horizontal_padding_label" />
<label text="@.horizontal_padding" id="horizontal_padding_label" for="horizontal_padding" />
<expr id="horizontal_padding" text="0" />
<label text="@.vertical_padding" id="vertical_padding_label" />
<label text="@.vertical_padding" id="vertical_padding_label" for="vertical_padding" />
<expr id="vertical_padding" text="0" />
<check id="partial_tiles" text="@.partial_tiles" cell_hspan="4" />

View File

@ -3,7 +3,7 @@
<gui>
<window id="jpeg_options" text="@.title">
<grid columns="2">
<label text="@.quality" />
<label text="@.quality" for="quality" />
<slider min="0" max="10" id="quality" cell_align="horizontal" width="128" />
<separator horizontal="true" cell_hspan="2" />

View File

@ -61,10 +61,8 @@
<listbox id="drag_actions" />
</view>
<separator horizontal="true" />
<hbox>
<vbox>
<label text="@.drag_angle" />
</vbox>
<grid columns="4">
<label text="@.drag_angle" for="drag_angle" cell_align="top" />
<buttonset columns="3" id="drag_angle">
<item icon="canvas_nw"
style="dir_item"
@ -100,15 +98,11 @@
tooltip="@.drag_angle_tooltip"
tooltip_dir="top" />
</buttonset>
<vbox>
<label text="@.drag_distance" />
</vbox>
<vbox>
<slider min="1" max="100" id="drag_distance" cell_align="horizontal" width="128"
tooltip="@.drag_distance_tooltip"
tooltip_dir="bottom" />
</vbox>
</hbox>
<label text="@.drag_distance" for="drag_distance" cell_align="top" />
<box>
<slider min="1" max="100" id="drag_distance" width="128" tooltip="@.drag_distance_tooltip" tooltip_dir="bottom" />
</box>
</grid>
</vbox>
</vbox>
</splitter>

View File

@ -5,18 +5,18 @@
<window id="layer_properties" text="@.title">
<vbox>
<grid id="properties_grid" columns="3">
<label text="@.name" />
<label text="@.name" for="name" />
<entry text="" id="name" magnet="true" maxsize="256" minwidth="64" cell_align="horizontal" />
<button id="user_data" icon="icon_user_data" tooltip="@general.user_data" />
<label text="@.mode" />
<label text="@.mode" for="mode" />
<combobox id="mode" />
<button id="tileset" icon="tiles" tooltip="@.tileset_tooltip" />
<label text="@.opacity" />
<label text="@.opacity" for="opacity" />
<opacityslider id="opacity" width="128" cell_align="horizontal" cell_hspan="2" />
<label id="uuid_label" text="@.uuid" visible="false" />
<label id="uuid_label" text="@.uuid" visible="false" for="uuid" />
<entry id="uuid" readonly="true" maxsize="36" cell_hspan="2" visible="false"/>
</grid>
</vbox>

View File

@ -1,30 +0,0 @@
<!-- Aseprite -->
<!-- Copyright (C) 2001-2017 by David Capello -->
<gui>
<window id="main_window" noborders="true" desktop="true">
<vbox noborders="true" expansive="true">
<hbox noborders="true" id="menu_bar_placeholder" />
<hbox noborders="true" id="tabs_placeholder" />
<splitter id="color_bar_splitter"
horizontal="true" expansive="true"
by="pixel"
style="workspace_splitter">
<vbox noborders="true" id="color_bar_placeholder" />
<vbox noborders="true" expansive="true">
<vbox noborders="true" id="context_bar_placeholder" />
<hbox noborders="true" expansive="true">
<splitter id="timeline_splitter"
vertical="true" expansive="true"
by="percetage" position="100"
style="workspace_splitter">
<hbox noborders="true" id="workspace_placeholder" expansive="true" />
<vbox noborders="true" id="timeline_placeholder" expansive="true" />
</splitter>
<vbox noborders="true" id="tool_bar_placeholder" />
</hbox>
</vbox>
</splitter>
<hbox noborders="true" id="status_bar_placeholder" />
</vbox>
</window>
</gui>

View File

@ -5,7 +5,7 @@
<vbox>
<grid columns="2">
<label id="by_label" text="" />
<label id="by_label" text="" for="quantity" />
<expr id="quantity" expansive="true" magnet="true" suffix="px" />
<hbox />

View File

@ -4,7 +4,7 @@
<window id="new_folder_window" text="@new_folder.title">
<vbox>
<hbox>
<label text="@new_folder.folder_name" />
<label text="@new_folder.folder_name" for="name" />
<entry text="@new_folder.default_new_folder_name" id="name" maxsize="256" magnet="true" expansive="true" minwidth="128" />
</hbox>
<hbox>

View File

@ -5,7 +5,7 @@
<window id="new_layer" text="@.title" help="new-layer">
<vbox>
<grid columns="2">
<label text="@.name" />
<label text="@.name" for="name" />
<entry maxsize="256" text="@.default_new_layer_name" id="name" magnet="true" />
<vbox>

View File

@ -0,0 +1,19 @@
<!-- Aseprite -->
<!-- Copyright (C) 2025 by Igara Studio S.A. -->
<gui>
<window id="new_layout" text="@.title">
<vbox>
<hbox>
<label text="@.name" for="name" />
<entry maxsize="128" id="name" magnet="true" expansive="true" />
</hbox>
<separator horizontal="true" />
<hbox homogeneous="true" cell_align="right">
<button text="@general.ok" closewindow="true" id="ok" disabled="true" minwidth="60" magnet="true" />
<button text="@general.cancel" closewindow="true" />
</hbox>
</vbox>
</window>
</gui>

View File

@ -7,9 +7,9 @@
<separator text="@.size" left="true" horizontal="true" />
<grid columns="2">
<label text="@.width" />
<label text="@.width" for="width" />
<expr id="width" magnet="true" cell_align="horizontal" suffix="px" />
<label text="@.height" />
<label text="@.height" for="height" />
<expr id="height" cell_align="horizontal" suffix="px" />
</grid>
@ -29,7 +29,7 @@
<check id="advanced_check" text="@general.advanced_options" />
<vbox id="advanced">
<label text="@.pixel_ratio" />
<label text="@.pixel_ratio" for="pixel_ratio" />
<combobox id="pixel_ratio" cell_align="horizontal">
<listitem text="@.square_pixels" value="1:1" />
<listitem text="@.double_wide" value="2:1" />

View File

@ -4,12 +4,12 @@
<gui>
<window id="open_sequence" text="@.title">
<vbox>
<label text="@.description" />
<label text="@.description" for="files" />
<view expansive="true" id="view" minwidth="128" minheight="64">
<listbox id="files" multiselect="true" />
</view>
<hbox>
<label text="@.duration" />
<label text="@.duration" for="duration" />
<expr text="0" id="duration" suffix="ms" />
</hbox>
<separator horizontal="true" />

View File

@ -36,18 +36,18 @@
<vbox id="section_general">
<separator text="@.section_general" horizontal="true" />
<grid columns="2">
<label text="@.ui_windows" />
<label text="@.ui_windows" for="ui_windows" />
<hbox>
<buttonset columns="2" id="ui_windows">
<item icon="one_win_icon" tooltip="@.one_win" tooltip_dir="bottom" style="multi_window_item" />
<item icon="multi_win_icon" tooltip="@.multi_win" tooltip_dir="bottom" style="multi_window_item" />
</buttonset>
<hbox id="theme_variants">
<label text="@.theme_mode" />
<label id="theme_mode_label" text="@.theme_mode" /> <!-- TODO: Get future dynamic ID, if any -->
</hbox>
</hbox>
<label text="@.screen_scaling" />
<label text="@.screen_scaling" for="screen_scale" />
<combobox id="screen_scale">
<listitem text="100%" value="1" />
<listitem text="200%" value="2" />
@ -55,7 +55,7 @@
<listitem text="400%" value="4" />
</combobox>
<label text="@.ui_scaling" />
<label text="@.ui_scaling" for="ui_scale" />
<combobox id="ui_scale">
<listitem text="100%" value="1" />
<listitem text="200%" value="2" />
@ -125,21 +125,21 @@
<separator text="@.section_files" horizontal="true" />
<label text="@.default_extension_for" />
<grid columns="2">
<label text="@.save_default_extension" />
<label text="@.save_default_extension" for="default_extension" />
<combobox id="default_extension" />
<label text="@.export_image_default_extension" />
<label text="@.export_image_default_extension" for="export_image_default_extension" />
<combobox id="export_image_default_extension" />
<label text="@.export_animation_default_extension" />
<label text="@.export_animation_default_extension" for="export_animation_default_extension" />
<combobox id="export_animation_default_extension" />
<label text="@.export_sprite_sheet_default_extension" />
<label text="@.export_sprite_sheet_default_extension" for="export_sprite_sheet_default_extension" />
<combobox id="export_sprite_sheet_default_extension" />
</grid>
<grid columns="2">
<label text="@.recent_files" />
<label text="@.recent_files" for="recent_files" />
<hbox>
<slider min="0" max="100" id="recent_files" width="128" tooltip="@.recent_files_tooltip" />
<button id="clear_recent_files" text="@.clear_recent_files" tooltip="@.clear_recent_files_tooltip" minwidth="60" />
@ -203,7 +203,7 @@
<check text="@.color_management" id="color_management" pref="color.manage" />
<grid columns="2">
<label text="@.window_cs" id="window_cs_label" />
<label text="@.window_cs" id="window_cs_label" for="window_cs" />
<combobox id="window_cs">
<listitem text="@.use_monitor_cs" />
<listitem text="@.use_srgb_cs" />
@ -213,10 +213,10 @@
<boxfiller />
<separator horizontal="true" />
<label text="@.working_rgb_cs" id="working_rgb_cs_label" />
<label text="@.working_rgb_cs" id="working_rgb_cs_label" for="working_rgb_cs" />
<combobox id="working_rgb_cs" />
<label text="@.files_with_cs" id="files_with_cs_label" />
<label text="@.files_with_cs" id="files_with_cs_label" for="files_with_cs" />
<combobox id="files_with_cs">
<listitem text="@.disable_cs" />
<listitem text="@.use_embedded_cs" />
@ -225,7 +225,7 @@
<listitem text="@.ask_cs" />
</combobox>
<label text="@.missing_cs" id="missing_cs_label" />
<label text="@.missing_cs" id="missing_cs_label" for="missing_cs" />
<combobox id="missing_cs">
<listitem text="@.disable_cs" />
<listitem text="@.assign_cs" />
@ -240,12 +240,12 @@
<separator text="@.alpha_and_opacity" horizontal="true" />
<grid columns="2">
<label text="@.alpha_range" id="alpha_range_label" />
<label text="@.alpha_range" id="alpha_range_label" for="alpha" />
<combobox id="alpha">
<listitem text="@.8bit_value" />
<listitem text="@.percentage" />
</combobox>
<label text="@.opacity_range" id="opacity_range_label" />
<label text="@.opacity_range" id="opacity_range_label" for="opacity" />
<combobox id="opacity">
<listitem text="@.8bit_value" />
<listitem text="@.percentage" />
@ -270,7 +270,7 @@
<check text="@.discard_brush" id="discard_brush" />
<hbox id="sampling_placeholder" />
<hbox>
<label text="@.right_click" />
<label text="@.right_click" for="right_click_behavior" />
<combobox id="right_click_behavior" expansive="true" />
</hbox>
</vbox>
@ -303,7 +303,7 @@
<check text="@.rewind_on_stop" id="rewind_on_stop" tooltip="@.rewind_on_stop_tooltip"
pref="general.rewind_on_stop" />
<hbox>
<label text="@.default_first_frame" />
<label text="@.default_first_frame" for="first_frame" />
<expr id="first_frame" />
</hbox>
<separator text="@.timeline_selection" horizontal="true" />
@ -337,7 +337,7 @@
<separator text="@.ui_mouse_cursor" horizontal="true" />
<check id="native_cursor" text="@.native_cursor" />
<hbox>
<label id="cursor_scale_label" text="@.cursor_scale_label" />
<label id="cursor_scale_label" text="@.cursor_scale_label" for="cursor_scale" />
<combobox id="cursor_scale">
<listitem text="100%" value="1" />
<listitem text="200%" value="2" />
@ -349,13 +349,13 @@
<separator text="@.painting_cursors" horizontal="true" />
<grid columns="2">
<label text="@.crosshair_type" />
<label text="@.crosshair_type" for="painting_cursor_type" />
<combobox id="painting_cursor_type">
<listitem text="@.simple_crosshair" value="0" />
<listitem text="@.crosshair_on_sprite" value="1" />
</combobox>
<label text="@.brush_preview" />
<label text="@.brush_preview" for="brush_preview" />
<combobox id="brush_preview">
<listitem text="@.brush_preview_none" value="0" />
<listitem text="@.brush_preview_edges" value="1" />
@ -364,7 +364,7 @@
<listitem text="@.brush_preview_fullnedges" value="4" />
</combobox>
<label text="@.cursor_color_type" />
<label text="@.cursor_color_type" for="cursor_color_type" />
<combobox id="cursor_color_type">
<listitem text="@.cursor_neg_bw" value="0" />
<listitem text="@.cursor_specific_color" value="1" />
@ -384,7 +384,7 @@
<separator text="@.bg_checkered" horizontal="true" />
<grid columns="2">
<label text="@.bg_size" />
<label text="@.bg_size" for="checkered_bg_size" />
<hbox>
<combobox id="checkered_bg_size" />
<expr id="checkered_bg_custom_w" />
@ -414,23 +414,23 @@
</hbox>
<grid columns="5">
<label text="@.grid_x" />
<label text="@.grid_x" for="grid_x" />
<expr id="grid_x" text="" />
<label text="@.grid_y" />
<label text="@.grid_y" for="grid_y" />
<expr id="grid_y" text="" />
<hbox />
<label text="@.grid_width" />
<label text="@.grid_width" for="grid_w" />
<expr id="grid_w" text="" />
<label text="@.grid_height" />
<label text="@.grid_height" for="grid_h" />
<expr id="grid_h" text="" />
<hbox />
<label text="@.grid_color" />
<label text="@.grid_color" for="grid_color" />
<colorpicker id="grid_color" rgba="true" cell_hspan="3" />
<hbox />
<label text="@.grid_opacity" />
<label text="@.grid_opacity" for="grid_opacity" />
<slider id="grid_opacity" cell_hspan="3" min="1" max="255" width="128" />
<check id="grid_auto_opacity" text="@.grid_auto" />
</grid>
@ -440,11 +440,11 @@
<separator horizontal="true" expansive="true" />
</hbox>
<grid columns="3">
<label text="@.grid_color" />
<label text="@.grid_color" for="pixel_grid_color" />
<colorpicker id="pixel_grid_color" rgba="true" />
<hbox />
<label text="@.grid_opacity" />
<label text="@.grid_opacity" for="pixel_grid_opacity" />
<slider id="pixel_grid_opacity" min="1" max="255" width="128" />
<check id="pixel_grid_auto_opacity" text="@.grid_auto" />
</grid>
@ -459,15 +459,15 @@
<vbox id="section_guides_and_slices">
<separator text="@.guides" horizontal="true" />
<grid columns="2">
<label text="@.layer_edges_color" />
<label text="@.layer_edges_color" for="layer_edges_color" />
<colorpicker id="layer_edges_color" rgba="true" />
<label text="@.auto_guides_color" />
<label text="@.auto_guides_color" for="auto_guides_color" />
<colorpicker id="auto_guides_color" rgba="true" />
</grid>
<separator text="@.slices" horizontal="true" />
<hbox>
<label text="@.default_slice_color" />
<label text="@.default_slice_color" for="default_slice_color" />
<colorpicker id="default_slice_color" rgba="true" />
</hbox>
</vbox>
@ -478,7 +478,7 @@
<hbox>
<check id="limit_undo" text="@.undo_size_limit" />
<expr id="undo_size_limit" tooltip="@.undo_size_limit_tooltip" />
<label text="@.undo_mb" />
<label text="@.undo_mb" for="undo_size_limit" />
</hbox>
<vbox>
@ -496,7 +496,7 @@
<vbox id="section_alerts">
<separator text="@.section_alerts" horizontal="true" />
<hbox>
<label text="@.open_sequence_alert" />
<label text="@.open_sequence_alert" for="open_sequence" />
<combobox id="open_sequence">
<listitem text="@.open_sequence_alert_ask" value="0" />
<listitem text="@.open_sequence_alert_yes" value="1" />
@ -582,7 +582,7 @@
<vbox id="section_aseprite_format">
<separator text="@.section_aseprite_format" horizontal="true" />
<grid columns="2">
<label text="@.cel_content_format" />
<label text="@.cel_content_format" for="cel_format" />
<combobox id="cel_format">
<listitem text="@.cel_format_compressed" />
<listitem text="@.cel_format_keep" />
@ -624,15 +624,16 @@
text="@.hue_with_sat_value"
pref="experimental.hue_with_sat_value_for_color_selector" />
<check id="flash_layer" text="@.flash_selected_layer" />
<check id="use_selection_tool_loop" text="@.use_selection_tool_loop" />
<hbox>
<label text="@.non_active_layer_opacity" />
<label text="@.non_active_layer_opacity" for="nonactive_layers_opacity" />
<slider id="nonactive_layers_opacity" min="0" max="255" width="128" />
</hbox>
<separator text="@.color_quantization" horizontal="true" />
<grid columns="2">
<label text="@rgbmap_algorithm_selector.label" />
<label text="@rgbmap_algorithm_selector.label" for="rgbmap_algorithm_selector" />
<hbox id="rgbmap_algorithm_placeholder" />
<label text="@best_fit_criteria_selector.label" />
<label text="@best_fit_criteria_selector.label" for="best_fit_criteria_selector" />
<hbox id="best_fit_criteria_placeholder" />
</grid>
<separator text="@.performance" horizontal="true" />

View File

@ -3,9 +3,9 @@
<gui>
<vbox id="outline" expansive="true">
<grid columns="2">
<label text="@.color" />
<label text="@.color" for="color" />
<colorpicker id="color" cell_align="horizontal" />
<label text="@.bg_color" />
<label text="@.bg_color" for="bg_color" />
<colorpicker id="bg_color" cell_align="horizontal" />
</grid>
<hbox>

View File

@ -14,7 +14,7 @@
<check id="alpha_channel" text="@.alpha_channel" cell_hspan="2" />
<check id="advanced_check" text="@general.advanced_options" cell_hspan="2" />
<hbox id="advanced" cell_hspan="2">
<label text="@rgbmap_algorithm_selector.label" />
<label text="@rgbmap_algorithm_selector.label" for="rgbmap_algorithm_selector" />
<hbox id="rgbmap_algorithm_placeholder" />
</hbox>

View File

@ -3,7 +3,7 @@
<gui>
<window id="palette_size" text="@.title">
<grid columns="3">
<label text="@.number_of_colors" />
<label text="@.number_of_colors" for="colors" />
<expr expansive="true" id="colors" magnet="true" />
<box cell_align="horizontal" />

View File

@ -4,13 +4,13 @@
<gui>
<window id="paste_text" text="@.title">
<grid columns="2">
<label text="@.text" />
<label text="@.text" for="user_text" />
<entry expansive="true" maxsize="256" minwidth="256" id="user_text" magnet="true" cell_align="horizontal" />
<label text="@.font" />
<label text="@.font" for="font_face" />
<font id="font_face" cell_align="horizontal" />
<label text="@.color" />
<label text="@.color" for="font_color" />
<hbox>
<colorpicker id="font_color" />
</hbox>

View File

@ -5,13 +5,13 @@
<vbox expansive="true" id="controls">
<hbox expansive="true">
<grid columns="2" id="controls">
<label text="@replace_color.from" />
<label text="@replace_color.from" for="from" />
<colorpicker id="from" cell_align="horizontal" />
<label text="@replace_color.to" />
<label text="@replace_color.to" for="to" />
<colorpicker id="to" cell_align="horizontal" />
</grid>
</hbox>
<label text="@replace_color.tolerance" />
<label text="@replace_color.tolerance" for="tolerance" />
<slider min="0" max="255" id="tolerance" />
</vbox>
</gui>

View File

@ -0,0 +1,23 @@
<!-- Aseprite -->
<!-- Copyright (C) 2025 Igara Studio S.A. -->
<gui>
<window id="run_command" minwidth="256" maxwidth="256" text="@.title" help="run-command">
<vbox>
<search id="search" placeholder="@.command_placeholder" />
<label id="expression_result" visible="false" />
<vbox id="help" visible="false">
<label text="@.help_search" />
<label text="@.help_expressions" />
<label id="help_lua" text="@.help_lua" />
</vbox>
<vbox id="command_list" visible="false" />
<vbox id="more_results" visible="false">
<separator horizontal="true" />
<label id="more_count" />
</vbox>
</vbox>
</window>
</gui>

View File

@ -5,7 +5,7 @@
<window id="select_shortcut" text="@.title">
<vbox expansive="true">
<grid columns="3">
<label text="@.key" />
<label text="@.key" for="key_field" />
<hbox id="key_placeholder" cell_align="horizontal" />
<button text="@.clear" id="clear_button" minwidth="60" />

View File

@ -1,17 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Aseprite -->
<!-- Copyright (C) 2019-2024 Igara Studio S.A. -->
<!-- Copyright (C) 2019-2025 Igara Studio S.A. -->
<!-- Copyright (C) 2017-2018 David Capello -->
<gui>
<window id="slice_properties" text="@.title" help="slices#slice-properties">
<vbox>
<vbox expansive="true">
<grid id="properties_grid" columns="3">
<label id="label1" text="@.name" />
<label text="@.name" for="name" />
<entry id="name" maxsize="256" magnet="true" cell_align="horizontal" expansive="true" />
<button id="user_data" icon="icon_user_data" maxsize="32" tooltip="@.user_data_tooltip" />
</grid>
<grid columns="2">
<separator horizontal="true" cell_hspan="2" />
<grid columns="3" expansive="true">
<separator horizontal="true" cell_hspan="3" />
<box />
<hbox homogeneous="true">
@ -20,6 +20,7 @@
<label text="@.width" />
<label text="@.height" />
</hbox>
<boxfiller cell_align="horizontal" />
<label text="@.bounds" />
<hbox homogeneous="true">
@ -28,6 +29,7 @@
<expr id="bounds_w" />
<expr id="bounds_h" />
</hbox>
<boxfiller />
<check text="@.center" id="center" />
<hbox homogeneous="true">
@ -36,16 +38,18 @@
<expr id="center_w" />
<expr id="center_h" />
</hbox>
<boxfiller />
<check text="@.pivot" id="pivot" />
<hbox>
<expr id="pivot_x" />
<expr id="pivot_y" />
</hbox>
<boxfiller />
<separator horizontal="true" cell_hspan="2" />
<hbox cell_hspan="2">
<boxfiller cell_align="vertical" cell_hspan="3" />
<separator horizontal="true" cell_hspan="3" cell_align="horizontal" />
<hbox cell_hspan="3">
<boxfiller />
<hbox homogeneous="true">
<button text="@general.ok" closewindow="true" id="ok" magnet="true" minwidth="60" />

View File

@ -22,19 +22,19 @@
<grid columns="2">
<separator text="@.advanced" horizontal="true" cell_hspan="2" />
<label text="@.transparent_color" />
<label text="@.transparent_color" for="transparent_color" />
<hbox>
<hbox id="transparent_color_placeholder" />
</hbox>
<label text="@.pixel_ratio" />
<label text="@.pixel_ratio" for="pixel_ratio" />
<combobox id="pixel_ratio" cell_align="horizontal">
<listitem text="@.square_pixels" value="1:1" />
<listitem text="@.double_wide" value="2:1" />
<listitem text="@.double_high" value="1:2" />
</combobox>
<label text="@.color_profile" />
<label text="@.color_profile" for="color_profile" />
<hbox>
<combobox id="color_profile" cell_align="horizontal" expansive="true" />
<hbox homogeneous="true">

View File

@ -1,45 +1,36 @@
<!-- Aseprite -->
<!-- Copyright (C) 2024 by Igara Studio S.A. -->
<!-- Copyright (C) 2025 by Igara Studio S.A. -->
<!-- Copyright (C) 2001-2018 by David Capello -->
<gui>
<window id="sprite_size" text="@.title" help="resize">
<box vertical="true">
<box vertical="true">
<separator text="@.pixels" left="true" horizontal="true" />
<box vertical="true" expansive="true">
<box horizontal="true">
<box vertical="true" homogeneous="true">
<label text="@.width" />
<label text="@.height" />
</box>
<box vertical="true" homogeneous="true" expansive="true">
<expr expansive="true" id="width_px" suffix="px" magnet="true" tooltip="@.width_px_tooltip" />
<expr expansive="true" id="height_px" suffix="px" tooltip="@.height_px_tooltip" />
</box>
<check text="@.lock_ratio" id="lock_ratio" selected="true" />
</box>
</box>
<grid columns="3">
<label text="@.width" for="width_px" />
<expr expansive="true" id="width_px" suffix="px" magnet="true" tooltip="@.width_px_tooltip" />
<check text="@.lock_ratio" id="lock_ratio" selected="true" expansive="false" cell_vspan="2" />
<label text="@.height" for="height_px" />
<expr expansive="true" id="height_px" suffix="px" tooltip="@.height_px_tooltip" />
</grid>
<separator text="@.percentage" left="true" horizontal="true" />
<box vertical="true" expansive="true">
<box horizontal="true">
<box vertical="true" homogeneous="true">
<label text="@.width" />
<label text="@.height" />
</box>
<box vertical="true" homogeneous="true" expansive="true">
<expr expansive="true" text="100" suffix="%" id="width_perc" magnet="true" tooltip="@.width_perc_tooltip"
decimals="4" />
<expr expansive="true" text="100" suffix="%" id="height_perc" tooltip="@.height_perc_tooltip"
decimals="4" />
</box>
<box horizontal="true" width="64" />
</box>
</box>
<grid columns="3">
<label text="@.width" for="width_perc" />
<expr expansive="true" text="100" suffix="%" id="width_perc" magnet="true" tooltip="@.width_perc_tooltip" decimals="4" />
<boxfiller cell_vspan="2" />
<label text="@.height" for="height_perc" />
<expr expansive="true" text="100" suffix="%" id="height_perc" tooltip="@.height_perc_tooltip" decimals="4" />
</grid>
</box>
<separator text="@.interpolation" left="true" horizontal="true" />
<box vertical="true" expansive="true">
<box horizontal="true">
<label text="@.method" />
<label text="@.method" for="method" />
<combobox id="method" expansive="true" />
</box>
</box>

View File

@ -3,7 +3,7 @@
<gui>
<window id="svg_options" text="@.title">
<grid columns="2">
<label text="@.pixel_scale" />
<label text="@.pixel_scale" for="pxsc" />
<expr id="pxsc" magnet="true" cell_align="horizontal"/>
<separator horizontal="true" cell_hspan="2" />

View File

@ -1,35 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Aseprite -->
<!-- Copyright (C) 2019-2021 Igara Studio S.A. -->
<!-- Copyright (C) 2019-2025 Igara Studio S.A. -->
<!-- Copyright (C) 2015-2018 David Capello -->
<gui>
<window id="tag_properties" text="@.title">
<vbox>
<grid id="properties_grid" columns="3">
<label text="@.name" />
<label text="@.name" for="name" />
<entry maxsize="256" id="name" magnet="true" cell_align="horizontal" expansive="true" />
<button id="user_data" icon="icon_user_data" maxsize="32" tooltip="@general.user_data" />
<label text="@.from" />
<label text="@.from" for="from" />
<expr id="from" cell_hspan="2" />
<label text="@.to" />
<label text="@.to" for="to" />
<expr id="to" cell_hspan="2" />
<label text="@.ani_dir" />
<label text="@.ani_dir" for="anidir" />
<combobox id="anidir" cell_hspan="2" />
<check text="@.repeat" id="limit_repeat" />
<vbox id="repeat_placeholder" cell_hspan="2" />
</grid>
<boxfiller />
<grid columns="2">
<separator horizontal="true" cell_hspan="2" minwidth="180" />
<separator horizontal="true" cell_align="horizontal" cell_hspan="2" minwidth="180" />
<box horizontal="true" homogeneous="true" cell_hspan="2" cell_align="right">
<hbox homogeneous="true" cell_hspan="2" cell_align="right">
<button text="@general.ok" closewindow="true" id="ok" magnet="true" minwidth="60" />
<button text="@general.cancel" closewindow="true" />
</box>
</hbox>
</grid>
</vbox>
</window>

View File

@ -3,7 +3,7 @@
<gui>
<window id="tga_options" text="@.title">
<grid columns="2">
<label text="@.bits_per_pixel" id="bits_per_pixel_label" />
<label text="@.bits_per_pixel" id="bits_per_pixel_label" for="bits_per_pixel" />
<combobox id="bits_per_pixel" cell_align="horizontal" />
<check text="@.compress" id="compress" cell_hspan="2" />

View File

@ -7,19 +7,19 @@
</combobox>
<grid columns="4" expansive="true">
<label text="@.name" />
<label text="@.name" for="name" />
<entry maxsize="256" id="name" text="" cell_hspan="3" />
<label text="@.grid_width" />
<label text="@.grid_width" for="grid_width" />
<expr id="grid_width" text="" />
<label text="@.grid_height" />
<label text="@.grid_height" for="grid_height" />
<expr id="grid_height" text="" />
<label id="base_index_label" text="@.base_index" />
<label id="base_index_label" text="@.base_index" for="base_index" />
<expr id="base_index" text="1" tooltip="@.base_tooltip" />
<boxfiller id="base_index_filler" cell_hspan="2" />
<label id="flips_label" text="@.allowed_flips" />
<label id="flips_label" text="@.allowed_flips" for="flips" />
<buttonset id="flips" columns="3" multiple="true">
<item id="xflip" text="X" minwidth="20" tooltip="@.allowed_flips_tooltip" tooltip_dir="bottom" />
<item id="yflip" text="Y" minwidth="20" tooltip="@.allowed_flips_tooltip" tooltip_dir="bottom" />

View File

@ -6,18 +6,12 @@
<hbox>
<vbox>
<separator cell_hspan="2" text="@.position" left="true" horizontal="true" />
<hbox>
<buttonset columns="2" id="position">
<item text="@.left" />
<item text="@.right" />
<item text="@.bottom" hspan="2" />
</buttonset>
</hbox>
<button id="layout" icon="icon_layout" />
</vbox>
<vbox>
<separator text="@.frame_header" left="true" horizontal="true" />
<hbox>
<label text="@.first_frame" />
<label text="@.first_frame" for="first_frame" />
<expr id="first_frame" />
</hbox>
@ -26,7 +20,7 @@
<separator id="thumb_h_separator" horizontal="true" expansive="true" />
</hbox>
<grid columns="2" id="thumb_box">
<label text="@.thumbnail_size" />
<label text="@.thumbnail_size" for="zoom" />
<slider min="1" max="10" id="zoom" cell_align="horizontal" width="128" />
<check id="thumb_overlay_enabled" text="@.overlay_size"/>
@ -44,10 +38,10 @@
<button id="reset_onionskin" text="@.reset" minwidth="60" />
</hbox>
<label text="@.opacity" />
<label text="@.opacity" for="opacity" />
<opacityslider id="opacity" cell_align="horizontal" width="128" />
<label text="@.opacity_step" />
<label text="@.opacity_step" for="opacity_step" />
<opacityslider id="opacity_step" cell_align="horizontal" width="128" />
<check id="loop_tag" text="@.loop_tags" cell_hspan="2" />

View File

@ -3,8 +3,8 @@
<!-- Copyright (C) 2001-2017 by David Capello -->
<gui>
<hbox id="user_data">
<label id="color_label" text="@.color" />
<label id="entry_label" text="@.user_data" />
<label id="color_label" text="@.color" for="color" />
<label id="entry_label" text="@.user_data" for="entry" />
<colorpicker id="color" simple="true" expansive="true" />
<entry id="entry" maxsize="65535" minwidth="128" expansive="true" />
</hbox>

View File

@ -7,7 +7,7 @@
<label text="@.save_as" />
<check text="@.animation_loop" id="loop" />
<hbox>
<label text="@.type" />
<label text="@.type" for="type" />
<combobox id="type" cell_align="horizontal" cell_hspan="2">
<listitem text="@.simple_webp" value="0" />
<listitem text="@.lossless_webp" value="1" />
@ -16,11 +16,11 @@
</hbox>
<vbox id="lossless_options">
<hbox>
<label width="55" text="@.compression" />
<label width="55" text="@.compression" for="compression" />
<slider min="0" max="9" id="compression" cell_align="horizontal" width="128" />
</hbox>
<hbox>
<label width="55" text="@.image_hint" />
<label width="55" text="@.image_hint" for="image_hint" />
<combobox width="128" id="image_hint">
<listitem text="@.image_hint_default" value="0" />
<listitem text="@.image_hint_picture" value="1" />
@ -31,11 +31,11 @@
</vbox>
<vbox id="lossy_options">
<hbox>
<label width="55" text="@.quality" />
<label width="55" text="@.quality" for="quality" />
<slider min="0" max="100" id="quality" cell_align="horizontal" width="128" />
</hbox>
<hbox>
<label width="55" text="@.image_preset" />
<label width="55" text="@.image_preset" for="image_preset" />
<combobox width="128" id="image_preset">
<listitem text="@.image_preset_default" value="0" />
<listitem text="@.image_preset_picture" value="1" />

2
laf

@ -1 +1 @@
Subproject commit a2bb9ec7fb98354279a2c49870a4a47a67a8e86e
Subproject commit de781a5066732d700ac4520ee5fc9034e92875ad

View File

@ -180,8 +180,8 @@ if(ENABLE_ASEPRITE_EXE)
if(WIN32)
set(main_resources
main/resources_win32.rc
main/settings.manifest)
main/win/resources_win32.rc
main/win/settings.manifest)
endif()
add_executable(${main_target}
@ -220,6 +220,7 @@ if(ENABLE_TESTS)
find_tests(ui ui-lib)
find_tests(app/cli app-lib)
find_tests(app/file app-lib)
find_tests(app/ui app-lib)
find_tests(app app-lib)
find_tests(. app-lib)
endif()

View File

@ -74,7 +74,7 @@ add_custom_command(
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${output_fn}.tmp ${output_fn}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
MAIN_DEPENDENCY ${strings_en_ini}
DEPENDS ${GEN_DEP})
DEPENDS ${GEN_DEP} commands/commands_list.h)
list(APPEND generated_files ${output_fn})
# Check translations
@ -368,6 +368,7 @@ target_sources(app-lib PRIVATE
color_picker.cpp
color_spaces.cpp
color_utils.cpp
commands/apply.cpp
commands/cmd_about.cpp
commands/cmd_add_color.cpp
commands/cmd_advanced_mode.cpp
@ -393,6 +394,7 @@ target_sources(app-lib PRIVATE
commands/cmd_deselect_mask.cpp
commands/cmd_discard_brush.cpp
commands/cmd_duplicate_layer.cpp
commands/cmd_duplicate_slice.cpp
commands/cmd_duplicate_sprite.cpp
commands/cmd_duplicate_view.cpp
commands/cmd_enter_license.cpp
@ -460,6 +462,7 @@ target_sources(app-lib PRIVATE
commands/cmd_reselect_mask.cpp
commands/cmd_reverse_frames.cpp
commands/cmd_rotate.cpp
commands/cmd_run_command.cpp
commands/cmd_save_file.cpp
commands/cmd_save_mask.cpp
commands/cmd_save_palette.cpp
@ -520,6 +523,7 @@ target_sources(app-lib PRIVATE
commands/tileset_mode.cpp
commands/toggle_other_layers_opacity.cpp
commands/toggle_play_option.cpp
commands/toggle_workspace_layout.cpp
console.cpp
context.cpp
context_flags.cpp
@ -609,6 +613,7 @@ target_sources(app-lib PRIVATE
ui/context_bar.cpp
ui/dithering_selector.cpp
ui/doc_view.cpp
ui/dock.cpp
ui/drop_down_button.cpp
ui/dynamics_popup.cpp
ui/editor/brush_preview.cpp
@ -651,8 +656,12 @@ target_sources(app-lib PRIVATE
ui/icon_button.cpp
ui/incompat_file_window.cpp
ui/input_chain.cpp
ui/key.cpp
ui/keyboard_shortcuts.cpp
ui/layer_frame_comboboxes.cpp
ui/layout.cpp
ui/layouts.cpp
ui/layout_selector.cpp
ui/main_menu_bar.cpp
ui/main_window.cpp
ui/mini_help_button.cpp
@ -715,6 +724,7 @@ target_sources(app-lib PRIVATE
util/render_text.cpp
util/resize_image.cpp
util/shader_helpers.cpp
util/slice_utils.cpp
util/tile_flags_utils.cpp
util/tileset_utils.cpp
util/wrap_point.cpp

View File

@ -26,7 +26,6 @@
#include "app/ui/keyboard_shortcuts.h"
#include "app/ui/main_window.h"
#include "app/ui_context.h"
#include "app/util/filetoks.h"
#include "base/fs.h"
#include "base/string.h"
#include "fmt/format.h"
@ -463,6 +462,8 @@ void AppMenus::reload()
// Create native menus after the default + user defined keyboard
// shortcuts are loaded correctly.
createNativeMenus();
MenusLoaded();
}
#ifdef ENABLE_SCRIPTING

View File

@ -74,6 +74,8 @@ public:
void removeMenuItemFromGroup(Command* cmd);
void removeMenuItemFromGroup(Widget* menuItem);
obs::signal<void()> MenusLoaded;
private:
template<typename Pred>
void removeMenuItemFromGroup(Pred pred);

View File

@ -1,5 +1,5 @@
// Aseprite
// Copyright (C) 2018-2024 Igara Studio S.A.
// Copyright (C) 2018-2025 Igara Studio S.A.
//
// This program is distributed under the terms of
// the End-User License Agreement for Aseprite.
@ -15,6 +15,7 @@
#include "app/ui/editor/editor.h"
#include "os/system.h"
#include "os/window.h"
#include "ui/display.h"
namespace app {
@ -29,17 +30,15 @@ void initialize_color_spaces(Preferences& pref)
pref.color.manage.AfterChange.connect([](bool manage) { g_manage = manage; });
}
os::ColorSpaceRef get_screen_color_space()
os::ColorSpaceRef get_current_color_space(ui::Display* display, Doc* doc)
{
return os::System::instance()->defaultWindow()->colorSpace();
}
os::ColorSpaceRef get_current_color_space()
{
if (auto* editor = Editor::activeEditor())
return editor->document()->osColorSpace();
else
return get_screen_color_space();
if (!doc) {
if (auto* editor = Editor::activeEditor())
doc = editor->document();
}
if (doc)
return doc->osColorSpace();
return display->colorSpace();
}
gfx::ColorSpaceRef get_working_rgb_space_from_preferences()
@ -62,11 +61,11 @@ gfx::ColorSpaceRef get_working_rgb_space_from_preferences()
//////////////////////////////////////////////////////////////////////
// Color conversion
ConvertCS::ConvertCS()
ConvertCS::ConvertCS(ui::Display* display, Doc* doc)
{
if (g_manage) {
auto srcCS = get_current_color_space();
auto dstCS = get_screen_color_space();
auto srcCS = get_current_color_space(display, doc);
auto dstCS = display->colorSpace();
if (srcCS && dstCS)
m_conversion = os::System::instance()->convertBetweenColorSpace(srcCS, dstCS);
}
@ -95,9 +94,9 @@ gfx::Color ConvertCS::operator()(const gfx::Color c)
}
}
ConvertCS convert_from_current_to_screen_color_space()
ConvertCS convert_from_current_to_display_color_space(ui::Display* display)
{
return ConvertCS();
return ConvertCS(display);
}
ConvertCS convert_from_custom_to_srgb(const os::ColorSpaceRef& from)

View File

@ -1,5 +1,5 @@
// Aseprite
// Copyright (c) 2018-2020 Igara Studio S.A.
// Copyright (c) 2018-2025 Igara Studio S.A.
//
// This program is distributed under the terms of
// the End-User License Agreement for Aseprite.
@ -16,21 +16,25 @@ namespace doc {
class Sprite;
}
namespace ui {
class Display;
}
namespace app {
class Doc;
class Preferences;
void initialize_color_spaces(Preferences& pref);
os::ColorSpaceRef get_screen_color_space();
// Returns the color space of the current document.
os::ColorSpaceRef get_current_color_space();
os::ColorSpaceRef get_current_color_space(ui::Display* display, Doc* doc = nullptr);
gfx::ColorSpaceRef get_working_rgb_space_from_preferences();
class ConvertCS {
public:
ConvertCS();
ConvertCS() = delete;
ConvertCS(ui::Display* display, Doc* doc = nullptr);
ConvertCS(const os::ColorSpaceRef& srcCS, const os::ColorSpaceRef& dstCS);
ConvertCS(ConvertCS&&);
ConvertCS& operator=(const ConvertCS&) = delete;
@ -40,7 +44,7 @@ private:
os::Ref<os::ColorSpaceConversion> m_conversion;
};
ConvertCS convert_from_current_to_screen_color_space();
ConvertCS convert_from_current_to_display_color_space(ui::Display* display);
ConvertCS convert_from_custom_to_srgb(const os::ColorSpaceRef& from);
} // namespace app

View File

@ -0,0 +1,46 @@
// Aseprite
// Copyright (C) 2025 Igara Studio S.A.
//
// This program is distributed under the terms of
// the End-User License Agreement for Aseprite.
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "app/commands/command.h"
#include "app/context.h"
#include "app/ui/editor/editor.h"
namespace app {
// Depends on the current context/state, used to apply the current
// transformation (drop pixels).
class ApplyCommand : public Command {
public:
ApplyCommand();
protected:
void onExecute(Context* ctx) override;
};
ApplyCommand::ApplyCommand() : Command(CommandId::Apply())
{
}
void ApplyCommand::onExecute(Context* ctx)
{
if (!ctx->isUIAvailable())
return;
auto* editor = Editor::activeEditor();
if (editor && editor->isMovingPixels())
editor->dropMovingPixels();
}
Command* CommandFactory::createApplyCommand()
{
return new ApplyCommand;
}
} // namespace app

View File

@ -11,12 +11,12 @@
#include "app/app.h"
#include "app/commands/command.h"
#include "app/modules/gui.h"
#include "app/ui/main_window.h"
#include "fmt/format.h"
#include "ver/info.h"
#include "about.xml.h"
#include "app/context.h"
namespace app {
@ -27,13 +27,19 @@ public:
AboutCommand();
protected:
bool onEnabled(Context* context) override;
void onExecute(Context* context) override;
};
AboutCommand::AboutCommand() : Command(CommandId::About(), CmdUIOnlyFlag)
AboutCommand::AboutCommand() : Command(CommandId::About())
{
}
bool AboutCommand::onEnabled(Context* context)
{
return context->isUIAvailable();
}
void AboutCommand::onExecute(Context* context)
{
gen::About window;

View File

@ -63,8 +63,7 @@ protected:
std::string onGetFriendlyName() const override;
};
AddColorCommand::AddColorCommand()
: CommandWithNewParams<AddColorParams>(CommandId::AddColor(), CmdUIOnlyFlag)
AddColorCommand::AddColorCommand() : CommandWithNewParams<AddColorParams>(CommandId::AddColor())
{
}

View File

@ -17,8 +17,7 @@
#include "ui/ui.h"
#include "advanced_mode.xml.h"
#include <cstdio>
#include "app/context.h"
namespace app {
@ -29,13 +28,19 @@ public:
AdvancedModeCommand();
protected:
bool onEnabled(Context* context) override;
void onExecute(Context* context) override;
};
AdvancedModeCommand::AdvancedModeCommand() : Command(CommandId::AdvancedMode(), CmdUIOnlyFlag)
AdvancedModeCommand::AdvancedModeCommand() : Command(CommandId::AdvancedMode())
{
}
bool AdvancedModeCommand::onEnabled(Context* context)
{
return context->isUIAvailable();
}
void AdvancedModeCommand::onExecute(Context* context)
{
// Switch advanced mode.

View File

@ -15,7 +15,6 @@
#include "app/modules/gui.h"
#include "app/tx.h"
#include "doc/layer.h"
#include "doc/sprite.h"
namespace app {
@ -28,8 +27,7 @@ protected:
void onExecute(Context* context) override;
};
BackgroundFromLayerCommand::BackgroundFromLayerCommand()
: Command(CommandId::BackgroundFromLayer(), CmdRecordableFlag)
BackgroundFromLayerCommand::BackgroundFromLayerCommand() : Command(CommandId::BackgroundFromLayer())
{
}

View File

@ -37,7 +37,7 @@ private:
Type m_type;
};
CancelCommand::CancelCommand() : Command(CommandId::Cancel(), CmdUIOnlyFlag), m_type(NoOp)
CancelCommand::CancelCommand() : Command(CommandId::Cancel()), m_type(NoOp)
{
}

View File

@ -22,7 +22,6 @@
#include "app/ui/skin/skin_theme.h"
#include "app/ui_context.h"
#include "doc/image.h"
#include "doc/mask.h"
#include "doc/sprite.h"
#include "ui/ui.h"
@ -282,8 +281,7 @@ protected:
void onExecute(Context* context) override;
};
CanvasSizeCommand::CanvasSizeCommand()
: CommandWithNewParams(CommandId::CanvasSize(), CmdRecordableFlag)
CanvasSizeCommand::CanvasSizeCommand() : CommandWithNewParams(CommandId::CanvasSize())
{
}

View File

@ -20,8 +20,6 @@
#include "app/tx.h"
#include "app/ui/timeline/timeline.h"
#include "doc/cel.h"
#include "doc/cels_range.h"
#include "doc/sprite.h"
#include <string>
@ -42,7 +40,7 @@ private:
int m_opacity;
};
CelOpacityCommand::CelOpacityCommand() : Command(CommandId::CelOpacity(), CmdUIOnlyFlag)
CelOpacityCommand::CelOpacityCommand() : Command(CommandId::CelOpacity())
{
m_opacity = 255;
}

View File

@ -1,5 +1,5 @@
// Aseprite
// Copyright (C) 2020-2023 Igara Studio S.A.
// Copyright (C) 2020-2025 Igara Studio S.A.
// Copyright (C) 2001-2018 David Capello
//
// This program is distributed under the terms of
@ -23,7 +23,6 @@
#include "app/ui/timeline/timeline.h"
#include "app/ui/user_data_view.h"
#include "app/ui_context.h"
#include "base/mem_utils.h"
#include "base/scoped_value.h"
#include "doc/cel.h"
#include "doc/cels_range.h"
@ -101,12 +100,12 @@ public:
if (countCels() > 0) {
m_userDataView.configureAndSet((m_cel ? m_cel->data()->userData() : UserData()),
g_window->propertiesGrid());
propertiesGrid());
}
else if (!m_cel)
m_userDataView.setVisible(false, false);
g_window->expandWindow(gfx::Size(g_window->bounds().w, g_window->sizeHint().h));
expandWindow(gfx::Size(bounds().w, sizeHint().h));
updateFromCel();
}
@ -281,7 +280,7 @@ private:
{
if (countCels() > 0) {
m_userDataView.toggleVisibility();
g_window->expandWindow(gfx::Size(g_window->bounds().w, g_window->sizeHint().h));
expandWindow(gfx::Size(bounds().w, sizeHint().h));
}
}
@ -385,14 +384,14 @@ protected:
void onExecute(Context* context) override;
};
CelPropertiesCommand::CelPropertiesCommand() : Command(CommandId::CelProperties(), CmdUIOnlyFlag)
CelPropertiesCommand::CelPropertiesCommand() : Command(CommandId::CelProperties())
{
}
bool CelPropertiesCommand::onEnabled(Context* context)
{
return context->checkFlags(ContextFlags::ActiveDocumentIsWritable |
ContextFlags::ActiveLayerIsImage);
return context->isUIAvailable() && context->checkFlags(ContextFlags::ActiveDocumentIsWritable |
ContextFlags::ActiveLayerIsImage);
}
void CelPropertiesCommand::onExecute(Context* context)

View File

@ -21,7 +21,6 @@
#include "app/tools/tool.h"
#include "app/ui/context_bar.h"
#include "app/ui/main_window.h"
#include "base/convert_to.h"
#include "doc/algorithm/flip_image.h"
#include "doc/brush.h"
#include "doc/image_ref.h"
@ -64,7 +63,7 @@ private:
int m_slot;
};
ChangeBrushCommand::ChangeBrushCommand() : Command(CommandId::ChangeBrush(), CmdUIOnlyFlag)
ChangeBrushCommand::ChangeBrushCommand() : Command(CommandId::ChangeBrush())
{
m_change = None;
m_slot = 0;

View File

@ -14,6 +14,7 @@
#include "app/app.h"
#include "app/commands/command.h"
#include "app/commands/params.h"
#include "app/context.h"
#include "app/i18n/strings.h"
#include "app/modules/palettes.h"
#include "app/ui/color_bar.h"
@ -39,18 +40,24 @@ public:
ChangeColorCommand();
protected:
bool onEnabled(Context* context) override;
bool onNeedsParams() const override { return true; }
void onLoadParams(const Params& params) override;
void onExecute(Context* context) override;
std::string onGetFriendlyName() const override;
};
ChangeColorCommand::ChangeColorCommand() : Command(CommandId::ChangeColor(), CmdUIOnlyFlag)
ChangeColorCommand::ChangeColorCommand() : Command(CommandId::ChangeColor())
{
m_background = false;
m_change = None;
}
bool ChangeColorCommand::onEnabled(Context* context)
{
return context->isUIAvailable();
}
void ChangeColorCommand::onLoadParams(const Params& params)
{
std::string target = params.get("target");

View File

@ -21,9 +21,7 @@
#include "app/i18n/strings.h"
#include "app/load_matrix.h"
#include "app/modules/gui.h"
#include "app/modules/palettes.h"
#include "app/sprite_job.h"
#include "app/transaction.h"
#include "app/ui/best_fit_criteria_selector.h"
#include "app/ui/dithering_selector.h"
#include "app/ui/editor/editor.h"
@ -37,12 +35,10 @@
#include "fmt/format.h"
#include "render/dithering.h"
#include "render/dithering_algorithm.h"
#include "render/ordered_dither.h"
#include "render/quantization.h"
#include "render/render.h"
#include "render/task_delegate.h"
#include "ui/listitem.h"
#include "ui/paint_event.h"
#include "ui/size_hint_event.h"
#include "color_mode.xml.h"
@ -507,7 +503,7 @@ private:
};
ChangePixelFormatCommand::ChangePixelFormatCommand()
: CommandWithNewParams(CommandId::ChangePixelFormat(), CmdUIOnlyFlag)
: CommandWithNewParams(CommandId::ChangePixelFormat())
{
}

View File

@ -23,7 +23,7 @@ protected:
void onExecute(Context* ctx) override;
};
ClearCommand::ClearCommand() : Command(CommandId::Clear(), CmdUIOnlyFlag)
ClearCommand::ClearCommand() : Command(CommandId::Clear())
{
}

View File

@ -19,7 +19,6 @@
#include "app/ui/status_bar.h"
#include "doc/cel.h"
#include "doc/layer.h"
#include "doc/sprite.h"
namespace app {
@ -32,7 +31,7 @@ protected:
void onExecute(Context* context) override;
};
ClearCelCommand::ClearCelCommand() : Command(CommandId::ClearCel(), CmdRecordableFlag)
ClearCelCommand::ClearCelCommand() : Command(CommandId::ClearCel())
{
}
@ -76,7 +75,7 @@ void ClearCelCommand::onExecute(Context* context)
tx.commit();
}
if (nonEditableLayers)
if (context->isUIAvailable() && nonEditableLayers)
StatusBar::instance()->showTip(1000, Strings::statusbar_tips_locked_layers());
update_screen_for_document(document);

View File

@ -23,8 +23,7 @@ protected:
void onExecute(Context* ctx) override;
};
ClearRecentFilesCommand::ClearRecentFilesCommand()
: Command(CommandId::ClearRecentFiles(), CmdUIOnlyFlag)
ClearRecentFilesCommand::ClearRecentFilesCommand() : Command(CommandId::ClearRecentFiles())
{
}

View File

@ -12,15 +12,9 @@
#include "app/app.h"
#include "app/commands/command.h"
#include "app/commands/commands.h"
#include "app/context_access.h"
#include "app/ui/doc_view.h"
#include "app/ui/status_bar.h"
#include "app/ui/workspace.h"
#include "app/ui_context.h"
#include "doc/sprite.h"
#include "ui/ui.h"
#include <memory>
namespace app {
@ -28,7 +22,7 @@ using namespace ui;
class CloseFileCommand : public Command {
public:
CloseFileCommand() : Command(CommandId::CloseFile(), CmdUIOnlyFlag) {}
CloseFileCommand() : Command(CommandId::CloseFile()) {}
protected:
bool onEnabled(Context* context) override
@ -51,12 +45,15 @@ protected:
class CloseAllFilesCommand : public Command {
public:
CloseAllFilesCommand() : Command(CommandId::CloseAllFiles(), CmdRecordableFlag)
{
m_quitting = false;
}
CloseAllFilesCommand() : Command(CommandId::CloseAllFiles()) { m_quitting = false; }
protected:
bool onEnabled(Context* context) override
{
// Null if we are in --batch mode
return App::instance()->workspace() != nullptr;
}
void onLoadParams(const Params& params) override { m_quitting = params.get_as<bool>("quitting"); }
void onExecute(Context* context) override

View File

@ -21,7 +21,6 @@
#include "app/transaction.h"
#include "app/ui/color_bar.h"
#include "app/ui/rgbmap_algorithm_selector.h"
#include "app/ui_context.h"
#include "doc/palette.h"
#include "doc/sprite.h"
#include "render/quantization.h"
@ -71,7 +70,7 @@ protected:
};
ColorQuantizationCommand::ColorQuantizationCommand()
: CommandWithNewParams<ColorQuantizationParams>(CommandId::ColorQuantization(), CmdRecordableFlag)
: CommandWithNewParams<ColorQuantizationParams>(CommandId::ColorQuantization())
{
}

View File

@ -24,7 +24,7 @@ protected:
void onExecute(Context* context) override;
};
ContiguousFillCommand::ContiguousFillCommand() : Command(CommandId::ContiguousFill(), CmdUIOnlyFlag)
ContiguousFillCommand::ContiguousFillCommand() : Command(CommandId::ContiguousFill())
{
}

View File

@ -23,7 +23,7 @@ protected:
void onExecute(Context* ctx) override;
};
CopyCommand::CopyCommand() : Command(CommandId::Copy(), CmdUIOnlyFlag)
CopyCommand::CopyCommand() : Command(CommandId::Copy())
{
}

View File

@ -10,9 +10,7 @@
#include "app/app.h"
#include "app/commands/command.h"
#include "app/context_access.h"
#include "app/ui/timeline/timeline.h"
#include "ui/base.h"
namespace app {
@ -25,13 +23,13 @@ protected:
void onExecute(Context* context) override;
};
CopyCelCommand::CopyCelCommand() : Command(CommandId::CopyCel(), CmdUIOnlyFlag)
CopyCelCommand::CopyCelCommand() : Command(CommandId::CopyCel())
{
}
bool CopyCelCommand::onEnabled(Context* context)
{
return App::instance()->timeline()->isMovingCel();
return App::instance()->timeline() && App::instance()->timeline()->isMovingCel();
}
void CopyCelCommand::onExecute(Context* context)

View File

@ -24,7 +24,7 @@ protected:
void onExecute(Context* ctx) override;
};
CopyMergedCommand::CopyMergedCommand() : Command(CommandId::CopyMerged(), CmdUIOnlyFlag)
CopyMergedCommand::CopyMergedCommand() : Command(CommandId::CopyMerged())
{
}

View File

@ -16,11 +16,7 @@
#include "app/modules/gui.h"
#include "app/tx.h"
#include "app/ui/color_bar.h"
#include "app/util/autocrop.h"
#include "doc/image.h"
#include "doc/layer.h"
#include "doc/mask.h"
#include "doc/sprite.h"
namespace app {
@ -37,7 +33,7 @@ private:
gfx::Rect m_bounds;
};
CropSpriteCommand::CropSpriteCommand() : Command(CommandId::CropSprite(), CmdRecordableFlag)
CropSpriteCommand::CropSpriteCommand() : Command(CommandId::CropSprite())
{
}
@ -95,8 +91,7 @@ private:
bool m_byGrid = false;
};
AutocropSpriteCommand::AutocropSpriteCommand()
: Command(CommandId::AutocropSprite(), CmdRecordableFlag)
AutocropSpriteCommand::AutocropSpriteCommand() : Command(CommandId::AutocropSprite())
{
}

View File

@ -23,7 +23,7 @@ protected:
void onExecute(Context* ctx) override;
};
CutCommand::CutCommand() : Command(CommandId::Cut(), CmdUIOnlyFlag)
CutCommand::CutCommand() : Command(CommandId::Cut())
{
}

View File

@ -14,8 +14,6 @@
#include "app/context_access.h"
#include "app/modules/gui.h"
#include "app/tx.h"
#include "doc/mask.h"
#include "doc/sprite.h"
namespace app {
@ -28,7 +26,7 @@ protected:
void onExecute(Context* context) override;
};
DeselectMaskCommand::DeselectMaskCommand() : Command(CommandId::DeselectMask(), CmdRecordableFlag)
DeselectMaskCommand::DeselectMaskCommand() : Command(CommandId::DeselectMask())
{
}

View File

@ -29,8 +29,7 @@ protected:
void onExecute(Context* context);
};
DeveloperConsoleCommand::DeveloperConsoleCommand()
: Command(CommandId::DeveloperConsole(), CmdUIOnlyFlag)
DeveloperConsoleCommand::DeveloperConsoleCommand() : Command(CommandId::DeveloperConsole())
{
}

View File

@ -12,8 +12,6 @@
#include "app/app.h"
#include "app/commands/command.h"
#include "app/commands/commands.h"
#include "app/context_access.h"
#include "app/tools/tool_box.h"
#include "app/ui/context_bar.h"
#include "app/ui_context.h"
@ -28,12 +26,15 @@ protected:
void onExecute(Context* context) override;
};
DiscardBrushCommand::DiscardBrushCommand() : Command(CommandId::DiscardBrush(), CmdUIOnlyFlag)
DiscardBrushCommand::DiscardBrushCommand() : Command(CommandId::DiscardBrush())
{
}
bool DiscardBrushCommand::onEnabled(Context* context)
{
if (!context->isUIAvailable())
return false;
ContextBar* ctxBar = App::instance()->contextBar();
return (ctxBar->activeBrush()->type() == kImageBrushType);
}

View File

@ -10,16 +10,11 @@
#include "app/app.h"
#include "app/commands/command.h"
#include "app/console.h"
#include "app/context_access.h"
#include "app/doc_api.h"
#include "app/doc_undo.h"
#include "app/modules/gui.h"
#include "app/tx.h"
#include "app/ui/editor/editor.h"
#include "doc/layer.h"
#include "doc/sprite.h"
#include "ui/ui.h"
namespace app {
@ -32,8 +27,7 @@ protected:
void onExecute(Context* context) override;
};
DuplicateLayerCommand::DuplicateLayerCommand()
: Command(CommandId::DuplicateLayer(), CmdRecordableFlag)
DuplicateLayerCommand::DuplicateLayerCommand() : Command(CommandId::DuplicateLayer())
{
}

View File

@ -0,0 +1,121 @@
// Aseprite
// Copyright (C) 2025 Igara Studio S.A.
//
// This program is distributed under the terms of
// the End-User License Agreement for Aseprite.
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "app/cmd/add_slice.h"
#include "app/commands/command.h"
#include "app/context.h"
#include "app/context_access.h"
#include "app/context_flags.h"
#include "app/i18n/strings.h"
#include "app/site.h"
#include "app/tx.h"
#include "app/ui/status_bar.h"
#include "app/util/slice_utils.h"
#include "base/convert_to.h"
#include "doc/object_id.h"
#include "doc/slice.h"
namespace app {
// Moves the given slice by the dx and dy values
void offset(Slice* slice, int dx, int dy)
{
for (auto it = slice->begin(); it != slice->end(); ++it) {
auto* sk = (*it).value();
gfx::Rect bounds = sk->bounds();
bounds.offset(gfx::Point{ dx, dy });
sk->setBounds(bounds);
}
}
class DuplicateSliceCommand : public Command {
public:
DuplicateSliceCommand();
protected:
void onLoadParams(const Params& params) override;
bool onEnabled(Context* context) override;
void onExecute(Context* context) override;
private:
ObjectId m_sliceId;
};
DuplicateSliceCommand::DuplicateSliceCommand() : Command(CommandId::DuplicateSlice())
{
}
void DuplicateSliceCommand::onLoadParams(const Params& params)
{
std::string id = params.get("id");
if (!id.empty())
m_sliceId = ObjectId(base::convert_to<doc::ObjectId>(id));
else
m_sliceId = NullId;
}
bool DuplicateSliceCommand::onEnabled(Context* context)
{
return context->checkFlags(ContextFlags::ActiveDocumentIsWritable |
ContextFlags::HasActiveSprite | ContextFlags::HasActiveLayer);
}
void DuplicateSliceCommand::onExecute(Context* context)
{
std::vector<Slice*> selectedSlices;
{
const ContextReader reader(context);
if (m_sliceId == NullId) {
selectedSlices = get_selected_slices(reader.site());
if (selectedSlices.empty())
return;
}
else
selectedSlices.push_back(reader.sprite()->slices().getById(m_sliceId));
}
ContextWriter writer(context);
Tx tx(writer, "Duplicate Slice");
Sprite* sprite = writer.site().sprite();
Doc* doc = static_cast<Doc*>(sprite->document());
doc->notifyBeforeSlicesDuplication();
for (auto* s : selectedSlices) {
Slice* slice = new Slice(*s);
slice->setName(Strings::general_copy_of(slice->name()));
// Offset a bit the duplicated slice to avoid overlapping
offset(slice, 2, 2);
tx(new cmd::AddSlice(sprite, slice));
doc->notifySliceDuplicated(slice);
}
tx.commit();
std::string sliceName;
if (selectedSlices.size() == 1)
sliceName = selectedSlices[0]->name();
StatusBar::instance()->invalidate();
if (!sliceName.empty()) {
StatusBar::instance()->showTip(1000, Strings::duplicate_slice_x_duplicated(sliceName));
}
else {
StatusBar::instance()->showTip(
1000,
Strings::duplicate_slice_n_slices_duplicated(selectedSlices.size()));
}
}
Command* CommandFactory::createDuplicateSliceCommand()
{
return new DuplicateSliceCommand;
}
} // namespace app

View File

@ -16,13 +16,10 @@
#include "app/ini_file.h"
#include "app/ui_context.h"
#include "base/fs.h"
#include "doc/sprite.h"
#include "ui/ui.h"
#include "duplicate_sprite.xml.h"
#include <cstdio>
namespace app {
using namespace ui;
@ -43,7 +40,7 @@ protected:
};
DuplicateSpriteCommand::DuplicateSpriteCommand()
: CommandWithNewParams<DuplicateSpriteParams>(CommandId::DuplicateSprite(), CmdRecordableFlag)
: CommandWithNewParams<DuplicateSpriteParams>(CommandId::DuplicateSprite())
{
}

View File

@ -13,8 +13,6 @@
#include "app/commands/command.h"
#include "app/ui/workspace.h"
#include <cstdio>
namespace app {
// using namespace ui;
@ -28,7 +26,7 @@ protected:
void onExecute(Context* context) override;
};
DuplicateViewCommand::DuplicateViewCommand() : Command(CommandId::DuplicateView(), CmdUIOnlyFlag)
DuplicateViewCommand::DuplicateViewCommand() : Command(CommandId::DuplicateView())
{
}

View File

@ -5,7 +5,6 @@
// the End-User License Agreement for Aseprite.
#include "app/commands/command.h"
#include "app/context.h"
#ifdef ENABLE_DRM
#include "app/ui/enter_license.h"
@ -24,7 +23,7 @@ protected:
void onExecute(Context* context) override;
};
EnterLicenseCommand::EnterLicenseCommand() : Command(CommandId::EnterLicense(), CmdUIOnlyFlag)
EnterLicenseCommand::EnterLicenseCommand() : Command(CommandId::EnterLicense())
{
}

View File

@ -16,7 +16,6 @@
#include "app/doc.h"
#include "app/job.h"
#include "app/ui/main_window.h"
#include "ui/alert.h"
#ifdef ENABLE_SCRIPTING
#include "app/commands/debugger.h"
@ -32,7 +31,7 @@ protected:
void onExecute(Context* context) override;
};
ExitCommand::ExitCommand() : Command(CommandId::Exit(), CmdUIOnlyFlag)
ExitCommand::ExitCommand() : Command(CommandId::Exit())
{
}

View File

@ -33,15 +33,12 @@
#include "app/ui/status_bar.h"
#include "app/ui/timeline/timeline.h"
#include "app/util/layer_utils.h"
#include "base/convert_to.h"
#include "base/fs.h"
#include "base/string.h"
#include "base/thread.h"
#include "doc/layer.h"
#include "doc/layer_tilemap.h"
#include "doc/tag.h"
#include "doc/tileset.h"
#include "doc/tilesets.h"
#include "fmt/format.h"
#include "ui/message.h"
#include "ui/system.h"
@ -1187,8 +1184,7 @@ private:
} // anonymous namespace
ExportSpriteSheetCommand::ExportSpriteSheetCommand(const char* id)
: CommandWithNewParams(id, CmdRecordableFlag)
ExportSpriteSheetCommand::ExportSpriteSheetCommand(const char* id) : CommandWithNewParams(id)
{
}

Some files were not shown because too many files have changed in this diff Show More