Skip to content

Commit

Permalink
#5565: Implement Revert changes button
Browse files Browse the repository at this point in the history
  • Loading branch information
codereader committed Mar 25, 2021
1 parent 9b9c1cb commit 4a491e4
Show file tree
Hide file tree
Showing 7 changed files with 148 additions and 15 deletions.
3 changes: 3 additions & 0 deletions include/ishaders.h
Expand Up @@ -407,6 +407,9 @@ class Material

// True if this mateiral has been altered from its original definition
virtual bool isModified() = 0;

// Roll back the changes made to this material
virtual void revertModifications() = 0;
};

typedef std::shared_ptr<Material> MaterialPtr;
Expand Down
72 changes: 72 additions & 0 deletions install/ui/materialeditor.fbp
Expand Up @@ -530,6 +530,78 @@
<property name="window_style"></property>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">6</property>
<property name="flag">wxTOP</property>
<property name="proportion">0</property>
<object class="wxButton" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="bitmap"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="current"></property>
<property name="default">0</property>
<property name="default_pane">0</property>
<property name="disabled"></property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="focus"></property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_COPY</property>
<property name="label">Revert</property>
<property name="margins"></property>
<property name="markup">0</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">MaterialEditorRevertButton</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="position"></property>
<property name="pressed"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
</object>
</object>
</object>
</object>
</object>
Expand Down
11 changes: 11 additions & 0 deletions install/ui/materialeditor.xrc
Expand Up @@ -86,6 +86,17 @@
<bitmap />
</object>
</object>
<object class="sizeritem">
<option>0</option>
<flag>wxTOP</flag>
<border>6</border>
<object class="wxButton" name="MaterialEditorRevertButton">
<label>Revert</label>
<default>0</default>
<markup>0</markup>
<bitmap />
</object>
</object>
</object>
</object>
</object>
Expand Down
64 changes: 49 additions & 15 deletions radiant/ui/materials/editor/MaterialEditor.cpp
Expand Up @@ -125,20 +125,7 @@ MaterialEditor::MaterialEditor() :
getControl<wxButton>("MaterialEditorCloseButton")->Bind(wxEVT_BUTTON, &MaterialEditor::_onClose, this);

// Add the treeview
auto* panel = getControl<wxPanel>("MaterialEditorTreeView");
_treeView = new MaterialTreeView(panel);
_treeView->Bind(wxEVT_DATAVIEW_SELECTION_CHANGED, &MaterialEditor::_onMaterialSelectionChanged, this);

auto* treeToolbar = new wxutil::ResourceTreeViewToolbar(panel, _treeView);
treeToolbar->EnableFavouriteManagement(false);

auto definitionLabel = getControl<wxStaticText>("MaterialEditorDefinitionLabel");
definitionLabel->GetContainingSizer()->Detach(definitionLabel);
definitionLabel->Reparent(treeToolbar);
treeToolbar->GetLeftSizer()->Add(definitionLabel, 0, wxALIGN_LEFT);

panel->GetSizer()->Add(treeToolbar, 0, wxEXPAND | wxBOTTOM, 6);
panel->GetSizer()->Add(_treeView, 1, wxEXPAND);
setupMaterialTreeView();

// Setup the splitter and preview
auto* splitter = getControl<wxSplitterWindow>("MaterialEditorSplitter");
Expand Down Expand Up @@ -241,6 +228,28 @@ void MaterialEditor::ShowDialog(const cmd::ArgumentList& args)
editor->Destroy();
}

void MaterialEditor::setupMaterialTreeView()
{
auto* panel = getControl<wxPanel>("MaterialEditorTreeView");
_treeView = new MaterialTreeView(panel);
_treeView->Bind(wxEVT_DATAVIEW_SELECTION_CHANGED, &MaterialEditor::_onMaterialSelectionChanged, this);

auto* treeToolbar = new wxutil::ResourceTreeViewToolbar(panel, _treeView);
treeToolbar->EnableFavouriteManagement(false);

auto definitionLabel = getControl<wxStaticText>("MaterialEditorDefinitionLabel");
definitionLabel->GetContainingSizer()->Detach(definitionLabel);
definitionLabel->Reparent(treeToolbar);
treeToolbar->GetLeftSizer()->Add(definitionLabel, 0, wxALIGN_LEFT);

panel->GetSizer()->Add(treeToolbar, 0, wxEXPAND | wxBOTTOM, 6);
panel->GetSizer()->Add(_treeView, 1, wxEXPAND);

auto revertButton = getControl<wxButton>("MaterialEditorRevertButton");
revertButton->Disable();
revertButton->Bind(wxEVT_BUTTON, &MaterialEditor::_onRevertMaterial, this);
}

void MaterialEditor::setupMaterialProperties()
{
// Convert int-valued spinctrls to double-valued ones
Expand Down Expand Up @@ -1023,7 +1032,8 @@ void MaterialEditor::revertCurrentMaterial()
{
if (!_material) return;

// TODO
_material->revertModifications();
onMaterialChanged();
}

bool MaterialEditor::askUserAboutModifiedMaterial()
Expand Down Expand Up @@ -1096,6 +1106,22 @@ void MaterialEditor::_onMaterialSelectionChanged(wxDataViewEvent& ev)
updateControlsFromMaterial();
}

void MaterialEditor::_onRevertMaterial(wxCommandEvent& ev)
{
if (!_material) return;

// The material we're editing has been changed from the saved one
wxutil::Messagebox box(_("Discard Changes"),
fmt::format(_("Do you want to discard all the changes to the material\n{0}?"), _material->getName()),
IDialog::MESSAGE_ASK);

if (box.run() == IDialog::RESULT_YES)
{
revertCurrentMaterial();
updateControlsFromMaterial();
}
}

void MaterialEditor::_onStageListSelectionChanged(wxDataViewEvent& ev)
{
auto item = _stageView->GetSelection();
Expand Down Expand Up @@ -1179,12 +1205,18 @@ void MaterialEditor::_onStageListItemActivated(wxDataViewEvent& ev)
toggleSelectedStage();
}

void MaterialEditor::updateMaterialButtonSensitivity()
{
getControl<wxButton>("MaterialEditorRevertButton")->Enable(_material && _material->isModified());
}

void MaterialEditor::updateControlsFromMaterial()
{
util::ScopedBoolLock lock(_materialUpdateInProgress);

_preview->setMaterial(_material);

updateMaterialButtonSensitivity();
updateMaterialPropertiesFromMaterial();
updateStageListFromMaterial();
}
Expand Down Expand Up @@ -2014,6 +2046,8 @@ void MaterialEditor::_onSortRequestChanged(wxCommandEvent& ev)
void MaterialEditor::onMaterialChanged()
{
_preview->onMaterialChanged();

updateMaterialButtonSensitivity();
}

void MaterialEditor::convertTextCtrlToMapExpressionEntry(const std::string& ctrlName)
Expand Down
3 changes: 3 additions & 0 deletions radiant/ui/materials/editor/MaterialEditor.h
Expand Up @@ -95,6 +95,7 @@ class MaterialEditor :
void _onClose(wxCommandEvent& ev);

private:
void setupMaterialTreeView();
void setupMaterialStageView();
void setupMaterialStageProperties();
void setupMaterialProperties();
Expand Down Expand Up @@ -139,13 +140,15 @@ class MaterialEditor :
void moveStagePosition(int direction);
void updateStageButtonSensitivity();
void updateSettingsNotebook();
void updateMaterialButtonSensitivity();

bool isAllowedToChangeMaterial();
bool askUserAboutModifiedMaterial();
bool saveCurrentMaterial();
void revertCurrentMaterial();

void _onMaterialSelectionChanged(wxDataViewEvent& ev);
void _onRevertMaterial(wxCommandEvent& ev);
void _onStageListSelectionChanged(wxDataViewEvent& ev);
void _onStageListItemActivated(wxDataViewEvent& ev);
void _onMaterialTypeChoice(wxCommandEvent& ev);
Expand Down
9 changes: 9 additions & 0 deletions radiantcore/shaders/CShader.cpp
Expand Up @@ -307,6 +307,15 @@ bool CShader::isModified()
return _template != _originalTemplate;
}

void CShader::revertModifications()
{
_template = _originalTemplate;

// We need to update that layer reference vector on change
unrealise();
realise();
}

std::string CShader::getRenderBumpArguments()
{
return _template->getRenderBumpArguments();
Expand Down
1 change: 1 addition & 0 deletions radiantcore/shaders/CShader.h
Expand Up @@ -138,6 +138,7 @@ class CShader final :
int getParseFlags() const override;

bool isModified() override;
void revertModifications() override;

private:
void ensureTemplateCopy();
Expand Down

0 comments on commit 4a491e4

Please sign in to comment.