Skip to content

Commit

Permalink
#6131: TextureBrowser active/inactive update handling
Browse files Browse the repository at this point in the history
  • Loading branch information
codereader committed Oct 23, 2022
1 parent bcf9392 commit a2cbe8d
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 40 deletions.
55 changes: 35 additions & 20 deletions radiant/ui/texturebrowser/TextureBrowser.cpp
Expand Up @@ -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();

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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<int>(RKEY_TEXTURE_SCALE);
Expand Down Expand Up @@ -455,7 +474,7 @@ void TextureBrowser::keyChanged()

void TextureBrowser::onFavouritesChanged()
{
_updateNeeded = true;
queueUpdate();
}

// Return the display width of a texture in the texture browser
Expand Down Expand Up @@ -670,6 +689,11 @@ void TextureBrowser::setOriginY(int newOriginY)
void TextureBrowser::queueUpdate()
{
_updateNeeded = true;

if (panelIsActive())
{
requestIdleCallback();
}
}

void TextureBrowser::performUpdate()
Expand Down Expand Up @@ -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)
{
Expand Down Expand Up @@ -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();
}
}

Expand All @@ -1030,19 +1050,14 @@ bool TextureBrowser::onRender()

debug::assertNoGlErrors();

if (_updateNeeded)
{
performUpdate();
}

draw();

debug::assertNoGlErrors();

return true;
}

} // namespace ui
} // namespace

/** greebo: The accessor method, use this to call non-static TextureBrowser methods
*/
Expand Down
48 changes: 28 additions & 20 deletions radiant/ui/texturebrowser/TextureBrowser.h
Expand Up @@ -2,13 +2,15 @@

#include "wxutil/FreezePointer.h"

#include <sigc++/connection.h>
#include "texturelib.h"
#include "wxutil/menu/PopupMenu.h"
#include "registry/CachedKey.h"

#include "TextureBrowserManager.h"

#include "wxutil/DockablePanel.h"
#include "wxutil/event/SingleIdleCallback.h"

namespace wxutil
{
Expand All @@ -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
Expand All @@ -48,7 +47,8 @@ namespace
*/
class TextureBrowser :
public wxutil::DockablePanel,
public sigc::trackable
public sigc::trackable,
public wxutil::SingleIdleCallback
{
class TextureTile;
typedef std::list<TextureTile> TextureTiles;
Expand Down Expand Up @@ -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();
Expand All @@ -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();

Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit a2cbe8d

Please sign in to comment.