Batch updates to layer selector (5433ba34) · Commits · René de Hesselle / inkscape · GitLab
PBS
·
2025-12-04
·
via inkscape:windows_ci_14x commits
Batch updates to layer selector
The layer selector can receive a lot of unbatched updates from ObjectSet
during an ungroup. Coupled with Gtk::CssProvider::load_from_data()
usage, this is very slow. Limit updates to one per frame.
Robustify the lifecycle management of LayerSelector, by stopping _layer
dangling and detaching _observer properly.
Fixes inkscape/inkscape#5988
| Original line number |
Diff line number |
Diff line |
|
@@ -115,19 +115,25 @@ LayerSelector::LayerSelector(SPDesktop *desktop) |
|
|
Gtk::StyleContext::add_provider_for_screen(_layer_label.get_screen(), _label_style,
|
|
|
GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
|
|
|
|
|
|
_observer->signal_changed().connect(sigc::mem_fun(*this, &LayerSelector::_layerModified));
|
|
|
_observer->signal_changed().connect([this] { _queueUpdate(); });
|
|
|
setDesktop(desktop);
|
|
|
}
|
|
|
|
|
|
LayerSelector::~LayerSelector() {
|
|
|
setDesktop(nullptr);
|
|
|
}
|
|
|
LayerSelector::~LayerSelector() = default;
|
|
|
|
|
|
void LayerSelector::setDesktop(SPDesktop *desktop) {
|
|
|
if ( desktop == _desktop )
|
|
|
void LayerSelector::setDesktop(SPDesktop *desktop)
|
|
|
{
|
|
|
if (desktop == _desktop) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (_desktop) {
|
|
|
_cancelUpdate();
|
|
|
_layer_changed.disconnect();
|
|
|
_layer = nullptr;
|
|
|
_observer->set(nullptr);
|
|
|
}
|
|
|
|
|
|
_desktop = desktop;
|
|
|
|
|
|
if (_desktop) {
|
|
@@ -143,7 +149,30 @@ void LayerSelector::_layerChanged(SPGroup *layer) |
|
|
{
|
|
|
_layer = layer;
|
|
|
_observer->set(layer);
|
|
|
_queueUpdate();
|
|
|
}
|
|
|
|
|
|
void LayerSelector::_queueUpdate()
|
|
|
{
|
|
|
if (_tick_callback) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
_tick_callback = add_tick_callback([this] (Glib::RefPtr<Gdk::FrameClock> const &) {
|
|
|
_layerModified();
|
|
|
_tick_callback = 0;
|
|
|
return false;
|
|
|
});
|
|
|
}
|
|
|
|
|
|
void LayerSelector::_cancelUpdate()
|
|
|
{
|
|
|
if (!_tick_callback) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
remove_tick_callback(_tick_callback);
|
|
|
_tick_callback = 0;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
| Original line number |
Diff line number |
Diff line |
|
@@ -65,12 +65,16 @@ private: |
|
|
std::unique_ptr<Inkscape::XML::SignalObserver> _observer;
|
|
|
|
|
|
void _layerChanged(SPGroup *layer);
|
|
|
void _queueUpdate();
|
|
|
void _cancelUpdate();
|
|
|
void _layerModified();
|
|
|
void _selectLayer();
|
|
|
void _hideLayer();
|
|
|
void _lockLayer();
|
|
|
void _layerChoose();
|
|
|
Glib::ustring getThisCssClass() const;
|
|
|
|
|
|
unsigned _tick_callback = 0;
|
|
|
};
|
|
|
|
|
|
} // namespace Inkscape::UI::Widget
|
|
|
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。