diff --git a/radiant/ui/texturebrowser/TextureBrowser.cpp b/radiant/ui/texturebrowser/TextureBrowser.cpp index bce519fd88..66a6e803ad 100644 --- a/radiant/ui/texturebrowser/TextureBrowser.cpp +++ b/radiant/ui/texturebrowser/TextureBrowser.cpp @@ -243,6 +243,7 @@ TextureBrowser::TextureBrowser(wxWindow* parent) : observeKey(RKEY_TEXTURE_SHOW_FILTER); observeKey(RKEY_TEXTURE_MAX_NAME_LENGTH); observeKey(RKEY_TEXTURES_SHOW_FAVOURITES_ONLY); + observeKey(RKEY_TEXTURES_SHOW_NAMES); loadScaleFromRegistry(); @@ -270,8 +271,6 @@ TextureBrowser::TextureBrowser(wxWindow* parent) : GlobalMaterialManager().signal_activeShadersChanged().connect( sigc::mem_fun(this, &TextureBrowser::onActiveShadersChanged)); - Bind(wxEVT_IDLE, &TextureBrowser::onIdle, this); - SetSizer(new wxBoxSizer(wxHORIZONTAL)); wxPanel* texbox = new wxPanel(this, wxID_ANY); @@ -351,16 +350,36 @@ TextureBrowser::TextureBrowser(wxWindow* parent) : } updateScroll(); - - GlobalFavouritesManager().getSignalForType(decl::getTypeName(decl::Type::Material)).connect( - sigc::mem_fun(this, &TextureBrowser::onFavouritesChanged)); } TextureBrowser::~TextureBrowser() { + disconnectListeners(); GlobalTextureBrowser().unregisterTextureBrowser(this); } +void TextureBrowser::onPanelActivated() +{ + connectListeners(); + queueUpdate(); +} + +void TextureBrowser::onPanelDeactivated() +{ + disconnectListeners(); +} + +void TextureBrowser::connectListeners() +{ + _favouritesChangedHandler = GlobalFavouritesManager().getSignalForType(decl::getTypeName(decl::Type::Material)) + .connect(sigc::mem_fun(this, &TextureBrowser::onFavouritesChanged)); +} + +void TextureBrowser::disconnectListeners() +{ + _favouritesChangedHandler.disconnect(); +} + void TextureBrowser::loadScaleFromRegistry() { int index = registry::getValue(RKEY_TEXTURE_SCALE); @@ -455,7 +474,7 @@ void TextureBrowser::keyChanged() void TextureBrowser::onFavouritesChanged() { - _updateNeeded = true; + queueUpdate(); } // Return the display width of a texture in the texture browser @@ -670,6 +689,11 @@ void TextureBrowser::setOriginY(int newOriginY) void TextureBrowser::queueUpdate() { _updateNeeded = true; + + if (panelIsActive()) + { + requestIdleCallback(); + } } void TextureBrowser::performUpdate() @@ -768,12 +792,12 @@ MaterialPtr TextureBrowser::getShaderAtCoords(int x, int y) } } - return MaterialPtr(); + return {}; } void TextureBrowser::selectTextureAt(int mx, int my) { - MaterialPtr shader = getShaderAtCoords(mx, my); + auto shader = getShaderAtCoords(mx, my); if (shader) { @@ -1008,16 +1032,12 @@ void TextureBrowser::onGLMouseButtonRelease(wxMouseEvent& ev) } } -void TextureBrowser::onIdle(wxIdleEvent& ev) +void TextureBrowser::onIdle() { if (_updateNeeded) { performUpdate(); - - if (this->IsShownOnScreen()) - { - queueDraw(); - } + queueDraw(); } } @@ -1030,11 +1050,6 @@ bool TextureBrowser::onRender() debug::assertNoGlErrors(); - if (_updateNeeded) - { - performUpdate(); - } - draw(); debug::assertNoGlErrors(); @@ -1042,7 +1057,7 @@ bool TextureBrowser::onRender() return true; } -} // namespace ui +} // namespace /** greebo: The accessor method, use this to call non-static TextureBrowser methods */ diff --git a/radiant/ui/texturebrowser/TextureBrowser.h b/radiant/ui/texturebrowser/TextureBrowser.h index d7a69d51c2..d5fa720e68 100644 --- a/radiant/ui/texturebrowser/TextureBrowser.h +++ b/radiant/ui/texturebrowser/TextureBrowser.h @@ -2,6 +2,7 @@ #include "wxutil/FreezePointer.h" +#include #include "texturelib.h" #include "wxutil/menu/PopupMenu.h" #include "registry/CachedKey.h" @@ -9,6 +10,7 @@ #include "TextureBrowserManager.h" #include "wxutil/DockablePanel.h" +#include "wxutil/event/SingleIdleCallback.h" namespace wxutil { @@ -23,21 +25,18 @@ class wxToolBar; namespace ui { -namespace -{ - const char* const RKEY_TEXTURES_HIDE_UNUSED = "user/ui/textures/browser/hideUnused"; - const char* const RKEY_TEXTURES_SHOW_FAVOURITES_ONLY = "user/ui/textures/browser/showFavouritesOnly"; - const char* const RKEY_TEXTURES_SHOW_OTHER_MATERIALS = "user/ui/textures/browser/showOtherMaterials"; - const char* const RKEY_TEXTURES_SHOW_NAMES = "user/ui/textures/browser/showNames"; - const char* const RKEY_TEXTURE_UNIFORM_SIZE = "user/ui/textures/browser/uniformSize"; - const char* const RKEY_TEXTURE_USE_UNIFORM_SCALE = "user/ui/textures/browser/useUniformScale"; - const char* const RKEY_TEXTURE_SCALE = "user/ui/textures/browser/textureScale"; - const char* const RKEY_TEXTURE_SHOW_SCROLLBAR = "user/ui/textures/browser/showScrollBar"; - const char* const RKEY_TEXTURE_MOUSE_WHEEL_INCR = "user/ui/textures/browser/mouseWheelIncrement"; - const char* const RKEY_TEXTURE_SHOW_FILTER = "user/ui/textures/browser/showFilter"; - const char* const RKEY_TEXTURE_CONTEXTMENU_EPSILON = "user/ui/textures/browser/contextMenuMouseEpsilon"; - const char* const RKEY_TEXTURE_MAX_NAME_LENGTH = "user/ui/textures/browser/maxShadernameLength"; -} +constexpr const char* const RKEY_TEXTURES_HIDE_UNUSED = "user/ui/textures/browser/hideUnused"; +constexpr const char* const RKEY_TEXTURES_SHOW_FAVOURITES_ONLY = "user/ui/textures/browser/showFavouritesOnly"; +constexpr const char* const RKEY_TEXTURES_SHOW_OTHER_MATERIALS = "user/ui/textures/browser/showOtherMaterials"; +constexpr const char* const RKEY_TEXTURES_SHOW_NAMES = "user/ui/textures/browser/showNames"; +constexpr const char* const RKEY_TEXTURE_UNIFORM_SIZE = "user/ui/textures/browser/uniformSize"; +constexpr const char* const RKEY_TEXTURE_USE_UNIFORM_SCALE = "user/ui/textures/browser/useUniformScale"; +constexpr const char* const RKEY_TEXTURE_SCALE = "user/ui/textures/browser/textureScale"; +constexpr const char* const RKEY_TEXTURE_SHOW_SCROLLBAR = "user/ui/textures/browser/showScrollBar"; +constexpr const char* const RKEY_TEXTURE_MOUSE_WHEEL_INCR = "user/ui/textures/browser/mouseWheelIncrement"; +constexpr const char* const RKEY_TEXTURE_SHOW_FILTER = "user/ui/textures/browser/showFilter"; +constexpr const char* const RKEY_TEXTURE_CONTEXTMENU_EPSILON = "user/ui/textures/browser/contextMenuMouseEpsilon"; +constexpr const char* const RKEY_TEXTURE_MAX_NAME_LENGTH = "user/ui/textures/browser/maxShadernameLength"; /** * \brief Widget for rendering active textures as tiles in a scrollable @@ -48,7 +47,8 @@ namespace */ class TextureBrowser : public wxutil::DockablePanel, - public sigc::trackable + public sigc::trackable, + public wxutil::SingleIdleCallback { class TextureTile; typedef std::list TextureTiles; @@ -127,11 +127,11 @@ class TextureBrowser : // renderable items will be updated next round bool _updateNeeded; + sigc::connection _favouritesChangedHandler; + public: - // Constructor TextureBrowser(wxWindow* parent); - - virtual ~TextureBrowser(); + ~TextureBrowser() override; // Schedules an update of the renderable items void queueUpdate(); @@ -147,6 +147,15 @@ class TextureBrowser : */ void setSelectedShader(const std::string& newShader); +protected: + void onIdle() override; + void onPanelActivated() override; + void onPanelDeactivated() override; + +private: + void connectListeners(); + void disconnectListeners(); + private: void clearFilter(); @@ -237,7 +246,6 @@ class TextureBrowser : bool materialIsVisible(const MaterialPtr& material); // wx callbacks - void onIdle(wxIdleEvent& ev); bool onRender(); void onScrollChanged(wxScrollEvent& ev); void onGLResize(wxSizeEvent& ev);