/
MaterialsList.cpp
89 lines (68 loc) · 2.01 KB
/
MaterialsList.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include "MaterialsList.h"
#include "i18n.h"
#include "irender.h"
#include <iostream>
namespace ui
{
namespace
{
// Columns for the list
struct Columns :
public wxutil::TreeModel::ColumnRecord
{
wxutil::TreeModel::Column material;
wxutil::TreeModel::Column visible;
Columns() :
material(add(wxutil::TreeModel::Column::String)),
visible(add(wxutil::TreeModel::Column::Boolean))
{}
};
const Columns& COLUMNS()
{
static const Columns _instance;
return _instance;
}
}
MaterialsList::MaterialsList(wxWindow* parent, const RenderSystemPtr& renderSystem) :
wxutil::TreeView(parent, nullptr, wxDV_SINGLE),
_store(new wxutil::TreeModel(COLUMNS(), true)),
_renderSystem(renderSystem)
{
assert(_renderSystem);
AssociateModel(_store.get());
EnableAutoColumnWidthFix(false); // we don't need this
// View columns
AppendTextColumn(_("Material"), COLUMNS().material.getColumnIndex(),
wxDATAVIEW_CELL_INERT, wxCOL_WIDTH_AUTOSIZE);
AppendToggleColumn(_("Visible"), COLUMNS().visible.getColumnIndex(),
wxDATAVIEW_CELL_ACTIVATABLE, wxCOL_WIDTH_AUTOSIZE);
Connect(wxEVT_DATAVIEW_ITEM_VALUE_CHANGED,
wxDataViewEventHandler(MaterialsList::onShaderToggled), NULL, this);
}
void MaterialsList::onShaderToggled(wxDataViewEvent& ev)
{
wxDataViewItem item = ev.GetItem();
if (!item.IsOk()) return;
// Toggle the model data
wxutil::TreeModel::Row row(item, *_store);
// Hide or show the respective shader
assert(_renderSystem);
ShaderPtr shader = _renderSystem->capture(
row[COLUMNS().material]
);
shader->setVisible(row[COLUMNS().visible].getBool());
_visibilityChangedSignal.emit();
}
void MaterialsList::clear()
{
_store->Clear();
}
void MaterialsList::addMaterial(const std::string& name)
{
wxutil::TreeModel::Row row = _store->AddItem();
ShaderPtr shader = _renderSystem->capture(name);
row[COLUMNS().material] = name;
row[COLUMNS().visible] = shader && shader->isVisible();
row.SendItemAdded();
}
}