This is an old bug that makes the UI looks as "partially painted." We
have to process all logic messages first, and then generate paint
messages so we paint the latest UI state (instead of a intermediate
UI state).
After f8874f4f7b, we fixed the zoom text
entry but we broke the zoom slider. We weren't able to select zoom
factors with the slider correctly (as the scale from 0 to 6400 was too
big). Now we revert the change and make the maximum text length in entry
bigger so the user can enter zoom levels like 6400 in the text entry and
use the zoom slider.
There were some crash reports in these days on the focus movement
code. It looks like we could arrive into an invalid/strange UI state
double-clicking palette buttons and showing menus two consecutive
times. After that, pressing Tab key would crash the focus-movement
logic.
Now we can see markdown files inside Aseprite. This is an initial
support (text only, separators, links only on headers and to external
URLs).
- Added a new docs/LICENSES.md file
- Removed old .txt licenses
I was contacted several times by people that cannot close these pinned
popups window. The best solution is to do the same that a regular
window: show the close button.
Added a new flag in messages to know if they came from a filter or from
the original chain of recipients. To do this, we've added a new way to
process message filters: instead of pre-adding filters to the list of
message recipients, we process filters in the Manager::pumpQueue()
member function itself. (So the list of "recipients" is not modified.)
This change adds support to write text with dead keys, and assign
keyboard shortcuts to special key combinations with Unicode characters
on macOS and Windows.
Fix#1083, close#796
As now we can generate several mouse events in
one generateMessagesFromSheEvents(), thanks to
1588e834c3, we can process
all mouse events from Allegro 4.
This bug was introduced in b0650f6afe
To fix this issue we've to remove kPaintMessages from the message queue
for widgets that were moved. Those pending paint messages aren't valid
anymore because the widget was invalidated again.
With this change we are removing specific code to scroll the Editor widget.
Now if we use Editor::setEditorScroll() to scroll it should work as
View::setViewScroll(). In this way we remove the ugly "blitValidRegion"
parameter from setEditorScroll().
Changes:
* Removed Widget::scrollRegion() because each widget must control
valid/invalid regions after a ui::move_region() in a very specific way
(see View::setViewScroll() or Window::moveWindow)
* Invalidate the whole widget on Widget::setBoundsQuietly()
* Fixed problems blitting invalid regions/not yet updated/painted: using
the new ui::Manager::m_invalidRegion.
* Added View::onSetViewScroll() and View::onScrollRegion()
* Added FileListView to avoid moving the thumbnail region when we scroll
When a ButtonSet triggers an onClick() when a mouse up message is received
(ButtonSet::m_multipleSelection == true), in case the mouse capture is
offered to other ButtonSet, we've to restore the selected item when we
capture the mouse, because we've never generated the onClick() event
in the first place.
This is a work-in-progress to create a consistent API and finally
separate the whole Aseprite base/gfx/ui libs into a reusable C++ library.
Classes:
app::IFileItem, app::AppMenuItem, app::skin::SkinPart,
gfx::Rect, gfx::Border, she::FileDialog,
ui::IButtonIcon, ui::Graphics, ui::Overlay, ui::Widget,
ui::ScrollableViewDelegate, and UI events
Changes:
* Added "icon_search" part in the skin
* Added app::SearchEntry widget
* Fixed Separator widget to handle a custom background color, because
now we use Separators inside a ListBox too
* Added Entry::(on)getEntryTextBounds() to specify a customized area
to show text (as SearchEntry needs space for search and close icons)
In this way Tab key (and other focus movement keys) can be used
in PopupWindows. They aren’t propagated to the main window because
a correct filter was added in 883629b563
It’s better if we use the original key modifiers from she::Events (given
by Cocoa or Win32 APIs) instead of asking for the current state of
the modifier when the ui::Message is created (which can be different
from the original value).
This commit adds support to transport the modifiers, but it is not
using the original key modifiers yet.
Changes:
- Added ui::ScrollableViewDelegate so ui::ScrollBar can be child of
a non-ui::View widget.
- Added a generic ui::setup_scrollbars() utility to locate
horizontal/vertical scrollbars depending on the scrollable area and
the available viewport area.
- Replaced Timeline::m_scroll_x/y ints with m_hbar/m_vbar widgets.
- Added transparent scrollbar look & feel.
- Added a "hover" state to mini-scrollbars used in sprite editors.
- Moved ui::GuiSystem from ui/base.h to ui/system.h as ui::UISystem
- Moved some internals to ui::details namespace
- Fix crash of UI tests when ~Manager is called
- Removed ui::init/exit_system() functions
TooltipManager uses filters to intercept a kMouseEnterMessage, if we
remove this kind of message for the TooltipManager itself (in sendMessage),
we never get that message so we never show the tooltip.
This problem was introduced in d1799c037a
to fix a problem with comboboxes.
With this fix, when the list of possible completions for a filename
is regenerated, we deselect the previously selected item. So the new
list appears without any item selected by default.
Some changes needed to do this:
* Added support to show icon+text in ButtonSet items
* Added an extra parameter in Graphics::drawUIString() to avoid drawing
the underscore
* Fixed expansion of ButtonSet items when the grid is resized
* Added support for Alt+mnemonic shortcuts in ButtonSet items
Now we generate the list of SkinTheme parts from the skin.xml file using
the gen utility.
Several refactors included in SkinTheme class to simplify code.
Now when the user resizes the OS window (a she::Display), it generates
a kDisplayResize she::Event, and this is processed by the UI layer to
redraw the entire ui::Manager.
With this change we remove the obscure "bool" return value in
she::Display::flip() member function.
- Added doc::BlendMode enum and doc::BlendFunc type
- Renamed LayerImage::getBlendMode() -> blendMode()
- BLEND_MODE_COPY is BlendMode::SRC now
- BLEND_MODE_NORMAL is BlendMode::NORMAL now
- Added app::cmd::SetLayerBlendMode
Changes:
* Move FreehandAlgorithm/InkType/RotationAlgorithm/SelectionMode to
app::tools namespace
* Removed ISettings, IToolSettings, IBrushSettings, ISelectionSettings,
and IColorSwatchesStore (and implementations from UISettingsImpl)
* Added app::tools::PreferenceGlue to do some adjustments that
UIToolSettingsImpl was doing
* Remove signals from App related to brush size/angle changes, and current
tool change (there events can be observed directly from Preferences)
* Remove ColorBar::FgColor/BgColor, these options can be observed from
Preferences::colorBar.fg/bgColor
There was an ugly combination of events:
1. When ContextBar::BrushTypeField receives an onItemChange is because the
mouse button is pressed on it (a kMouseDownMessage)
2. It shows the BrushPopup window (which is a PopupWindow
with kCloseOnClickInOtherWindow click behavior)
3. When other click is made in BrushTypeField, the BrushPopup is closed
because it is filtering messages (since it's
kCloseOnClickInOtherWindow). This generates a kCloseMessage in the
queue.
4. BrushTypeField::onItemChange() is executed again (for the same
click in point 3), and it checks that the popup is closed (recently
closed, by this click), so it shows the BrushPopup again.
5. The enqueued kCloseMessage is receved by PopupWindow, and it calls
stopFilteringMessages().
So in this case we have a visible PopupWindow that is not filtering
messages. To fix this bug we have included a startFilteringMessages()
in kOpenMessage. So when the popup is shown again, it filters messages
and the popup cannot stay visible.
There are some widgets (e.g. fg/bg color buttons in the ColorBar, and
ContextBar's check-boxes) that use a "mini font". We could setup the mini
font in onInitTheme(), but the whole program is not ready to do something
like that (there are too much child_spacing/borders values that are set
outside onInitTheme).
A better way is to ask to the theme itself (Theme::getWidgetFont())
about what font to use for each specific widget. And the Widget::m_font
field can act as a cache of this requested font. So now the "mini font"
is specified in a SkinProperty's flag.
Now the file name field is an editable ComboBox, so we don't
autocomplete/modify the text inside the entry box.
With this commit we modified the editable ComboBox behavior too:
* When the ListBox is shown, the focus remain in the Entry field (now
the ListBox cannot have the focus when the ComboBox is editable).
* When Up/down keys are received by the Entry, they are given to the
ListBox to change the selected item. But the focus returns to the
Entry anyway.
When a combobox popup is open, it creates a new non-foreground top window
(which is sibling of the window where the combobox widget is). When the
popup receives a key press, and it doesn't use it, the key is passed to
its parent (a ui::Manager), and then the latter has to process it.
Before this commit, CustomizedGuiManager::onProcessMessage() was
filtering shortcuts for foreground window, but it was working only
when the key was pressed in the foreground window itself (not when a
combination of foreground and background windows were open). Now the
filter is done in Manager::onProcessMessage() (which returns true,
i.e. key was used, for every pressed key when a foreground window
is found in its children hierarchy).
Now the ContextBar contains a set of brushes. The ChangeBrushCommand
supports a new "slot" parameter and "change" = "custom" to select a
specific custom brush from the ContextBar. Alt+1, Alt+2, etc. are mapped
to this ChangeBrushCommand (see changes in gui.xml).
Also, as the ButtonSet that represent different brushes in the ContextBar
uses icons generated from the brush, we don't need the skin parts that
represent each brush type (we can generate those icons from some standard
brushes). Those skin parts were removed.
* UI scale is an experimental option (it needs app restart)
* We can change the Screen Scale without restarting the app now
* Hide reloading of skin data in SkinTheme::onRegenerate()
* Now setFontOfAllWidgets() is called from Theme::regenerate()
* Remove reload_default_font()
* Simplify gui_setup_screen()
* Add LinkLabel::onClick()
* Use Widget instead of ListItem in ListBox API
* Add TextRule::padding() and use it to calculate the preferred size
for a skin::Style's rules
* Add widgets/home_view.xml
* Add possibility to specify style="..." and border="..." in XML widgets
* Add SkinStyleProperty
* Remove Label::get/setTextColor() (replaced with styles)
* Add <image> widget in WidgetLoader
* Paint labels, link labels, and views with styles