/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #if !defined( INCLUDED_TEXTUREENTRY_H ) #define INCLUDED_TEXTUREENTRY_H #include #include #include "gtkutil/idledraw.h" #include "generic/static.h" #include "signal/isignal.h" #include "shaderlib.h" #include "texwindow.h" template class EntryCompletion { GtkListStore* m_store; IdleDraw m_idleUpdate; public: EntryCompletion() : m_store( 0 ), m_idleUpdate( UpdateCaller( *this ) ){ } void connect( GtkEntry* entry ){ if ( m_store == 0 ) { m_store = gtk_list_store_new( 1, G_TYPE_STRING ); fill(); StringList().connect( IdleDraw::QueueDrawCaller( m_idleUpdate ) ); } GtkEntryCompletion* completion = gtk_entry_completion_new(); gtk_entry_set_completion( entry, completion ); gtk_entry_completion_set_model( completion, GTK_TREE_MODEL( m_store ) ); gtk_entry_completion_set_text_column( completion, 0 ); } void append( const char* string ){ GtkTreeIter iter; gtk_list_store_append( m_store, &iter ); gtk_list_store_set( m_store, &iter, 0, string, -1 ); } typedef MemberCaller1 AppendCaller; void fill(){ StringList().forEach( AppendCaller( *this ) ); } void clear(){ gtk_list_store_clear( m_store ); } void update(){ clear(); fill(); } typedef MemberCaller UpdateCaller; }; class TextureNameList { public: void forEach( const ShaderNameCallback& callback ) const { for ( QERApp_ActiveShaders_IteratorBegin(); !QERApp_ActiveShaders_IteratorAtEnd(); QERApp_ActiveShaders_IteratorIncrement() ) { IShader *shader = QERApp_ActiveShaders_IteratorCurrent(); if ( shader_equal_prefix( shader->getName(), "textures/" ) ) { callback( shader->getName() + 9 ); } } } void connect( const SignalHandler& update ) const { TextureBrowser_addActiveShadersChangedCallback( update ); } }; typedef Static< EntryCompletion > GlobalTextureEntryCompletion; class ShaderList { public: void forEach( const ShaderNameCallback& callback ) const { GlobalShaderSystem().foreachShaderName( callback ); } void connect( const SignalHandler& update ) const { TextureBrowser_addShadersRealiseCallback( update ); } }; typedef Static< EntryCompletion > GlobalShaderEntryCompletion; #endif