88#include " texturelib.h"
99#include " gamelib.h"
1010#include " string/predicate.h"
11+ #include " registry/registry.h"
1112
1213#include " ../common/TexturePreviewCombo.h"
14+ #include " MaterialThumbnailBrowser.h"
1315#include " wxutil/dataview/VFSTreePopulator.h"
1416#include " wxutil/dataview/ThreadedDeclarationTreePopulator.h"
17+ #include " wxutil/dataview/ResourceTreeViewToolbar.h"
18+ #include " wxutil/Bitmap.h"
19+
20+ #include < wx/tglbtn.h>
21+ #include < wx/sizer.h>
1522
1623namespace ui
1724{
@@ -21,6 +28,7 @@ namespace ui
2128namespace
2229{
2330 constexpr const char * const TEXTURE_ICON = " icon_texture.png" ;
31+ constexpr const char * const RKEY_MATERIAL_SELECTOR_VIEW_MODE = " user/ui/materialSelector/viewMode" ;
2432}
2533
2634/* *
@@ -93,26 +101,189 @@ class ThreadedMaterialLoader final :
93101
94102MaterialSelector::MaterialSelector (wxWindow* parent, TextureFilter textureFilter)
95103: DeclarationSelector(parent, decl::Type::Material),
96- _textureFilter (textureFilter)
104+ _textureFilter (textureFilter),
105+ _thumbnailBrowser(nullptr ),
106+ _viewToggleBtn(nullptr ),
107+ _showingThumbnails(false )
97108{
109+ createThumbnailBrowser ();
110+ createViewToggleButton ();
111+ connectFilterSignal ();
112+
98113 AddPreviewToBottom (new TexturePreviewCombo (this ));
99114
115+ std::string savedMode = GlobalRegistry ().get (RKEY_MATERIAL_SELECTOR_VIEW_MODE);
116+ if (savedMode == " thumbnails" )
117+ {
118+ _showingThumbnails = true ;
119+ _viewToggleBtn->SetValue (true );
120+ switchView (true );
121+ }
122+
100123 Populate ();
101124}
102125
126+ MaterialSelector::~MaterialSelector ()
127+ {
128+ GlobalRegistry ().set (RKEY_MATERIAL_SELECTOR_VIEW_MODE,
129+ _showingThumbnails ? " thumbnails" : " tree" );
130+
131+ _thumbnailSelectionConn.disconnect ();
132+ _thumbnailActivatedConn.disconnect ();
133+ _filterTextChangedConn.disconnect ();
134+ }
135+
136+ void MaterialSelector::createThumbnailBrowser ()
137+ {
138+ MaterialThumbnailBrowser::TextureFilter thumbnailFilter;
139+ switch (_textureFilter)
140+ {
141+ case TextureFilter::Lights:
142+ thumbnailFilter = MaterialThumbnailBrowser::TextureFilter::Lights;
143+ break ;
144+ case TextureFilter::Regular:
145+ thumbnailFilter = MaterialThumbnailBrowser::TextureFilter::Regular;
146+ break ;
147+ case TextureFilter::All:
148+ default :
149+ thumbnailFilter = MaterialThumbnailBrowser::TextureFilter::All;
150+ break ;
151+ }
152+
153+ _thumbnailBrowser = new MaterialThumbnailBrowser (GetLeftPanel (), thumbnailFilter);
154+ _thumbnailBrowser->Hide ();
155+
156+ GetTreeViewSizer ()->Insert (2 , _thumbnailBrowser, 1 , wxEXPAND);
157+
158+ _thumbnailSelectionConn = _thumbnailBrowser->signal_selectionChanged ().connect (
159+ sigc::mem_fun (this , &MaterialSelector::onThumbnailSelectionChanged));
160+ _thumbnailActivatedConn = _thumbnailBrowser->signal_itemActivated ().connect (
161+ sigc::mem_fun (this , &MaterialSelector::onThumbnailItemActivated));
162+ }
163+
164+ void MaterialSelector::createViewToggleButton ()
165+ {
166+ auto * sizer = GetTreeViewSizer ();
167+ if (sizer->GetItemCount () > 0 )
168+ {
169+ auto * toolbarItem = sizer->GetItem (static_cast <size_t >(0 ));
170+ if (toolbarItem && toolbarItem->GetWindow ())
171+ {
172+ auto * toolbar = dynamic_cast <wxutil::ResourceTreeViewToolbar*>(toolbarItem->GetWindow ());
173+ if (toolbar)
174+ {
175+ _viewToggleBtn = new wxBitmapToggleButton (toolbar, wxID_ANY,
176+ wxutil::GetLocalBitmap (" bgimage16.png" ));
177+ _viewToggleBtn->SetToolTip (_ (" Toggle between tree view and thumbnail grid view" ));
178+ toolbar->GetRightSizer ()->Add (_viewToggleBtn, wxSizerFlags ().Border (wxLEFT, 6 ));
179+ _viewToggleBtn->Bind (wxEVT_TOGGLEBUTTON, &MaterialSelector::onViewToggle, this );
180+ }
181+ }
182+ }
183+ }
184+
185+ void MaterialSelector::connectFilterSignal ()
186+ {
187+ auto * sizer = GetTreeViewSizer ();
188+ if (sizer->GetItemCount () > 0 )
189+ {
190+ auto * toolbarItem = sizer->GetItem (static_cast <size_t >(0 ));
191+ if (toolbarItem && toolbarItem->GetWindow ())
192+ {
193+ auto * toolbar = dynamic_cast <wxutil::ResourceTreeViewToolbar*>(toolbarItem->GetWindow ());
194+ if (toolbar)
195+ {
196+ _filterTextChangedConn = toolbar->signal_filterTextChanged ().connect (
197+ sigc::mem_fun (this , &MaterialSelector::onFilterTextChanged));
198+ }
199+ }
200+ }
201+ }
202+
203+ void MaterialSelector::onFilterTextChanged (const std::string& filterText)
204+ {
205+ if (_thumbnailBrowser)
206+ {
207+ _thumbnailBrowser->setExternalFilterText (filterText);
208+ }
209+ }
210+
211+ void MaterialSelector::switchView (bool showThumbnails)
212+ {
213+ if (showThumbnails)
214+ {
215+ _thumbnailBrowser->setSelectedShader (DeclarationSelector::GetSelectedDeclName ());
216+ GetTreeView ()->Hide ();
217+ _thumbnailBrowser->Show ();
218+ _thumbnailBrowser->queueUpdate ();
219+ }
220+ else
221+ {
222+ std::string selectedShader = _thumbnailBrowser->getSelectedShader ();
223+ if (!selectedShader.empty ())
224+ {
225+ SetSelectedDeclName (selectedShader);
226+ }
227+ _thumbnailBrowser->Hide ();
228+ GetTreeView ()->Show ();
229+ }
230+
231+ _showingThumbnails = showThumbnails;
232+ GetLeftPanel ()->Layout ();
233+ }
234+
235+ void MaterialSelector::onViewToggle (wxCommandEvent& ev)
236+ {
237+ switchView (ev.IsChecked ());
238+ }
239+
240+ void MaterialSelector::onThumbnailSelectionChanged ()
241+ {
242+ UpdatePreviewsWithDeclaration (_thumbnailBrowser->getSelectedShader ());
243+ _selectionChanged ();
244+ }
245+
246+ void MaterialSelector::onThumbnailItemActivated ()
247+ {
248+ onTreeViewItemActivated ();
249+ }
250+
103251void MaterialSelector::Populate ()
104252{
105253 PopulateTreeView (std::make_shared<ThreadedMaterialLoader>(GetColumns (), _textureFilter));
254+
255+ if (_thumbnailBrowser)
256+ {
257+ _thumbnailBrowser->queueUpdate ();
258+ }
259+ }
260+
261+ std::string MaterialSelector::GetSelectedDeclName () const
262+ {
263+ if (_showingThumbnails && _thumbnailBrowser)
264+ {
265+ return _thumbnailBrowser->getSelectedShader ();
266+ }
267+ return DeclarationSelector::GetSelectedDeclName ();
106268}
107269
108270MaterialPtr MaterialSelector::getSelectedShader ()
109271{
110- return GlobalMaterialManager ().getMaterial (GetSelectedDeclName ());
272+ return GlobalMaterialManager ().getMaterial (GetSelectedDeclName ());
111273}
112274
113275void MaterialSelector::onTreeViewSelectionChanged ()
114276{
277+ if (!_showingThumbnails && _thumbnailBrowser)
278+ {
279+ _thumbnailBrowser->setSelectedShader (DeclarationSelector::GetSelectedDeclName ());
280+ }
115281 _selectionChanged ();
116282}
117283
284+ bool MaterialSelector::onTreeViewItemActivated ()
285+ {
286+ return false ;
287+ }
288+
118289} // namespace
0 commit comments