Skip to content

Commit

Permalink
#5638: Expose option to merge selection group information in the dialog
Browse files Browse the repository at this point in the history
  • Loading branch information
codereader committed Jun 4, 2021
1 parent a098155 commit 6e8dfc2
Show file tree
Hide file tree
Showing 6 changed files with 130 additions and 8 deletions.
3 changes: 3 additions & 0 deletions include/imapmerge.h
Expand Up @@ -85,6 +85,9 @@ class IMergeOperation

// Invokes the given functor for each action in this operation
virtual void foreachAction(const std::function<void(const IMergeAction::Ptr&)>& visitor) = 0;

// Enables or disable the merge of selection groups
virtual void setMergeSelectionGroups(bool enabled) = 0;
};

}
Expand Down
77 changes: 76 additions & 1 deletion install/ui/mergecontroldialog.fbp
Expand Up @@ -43,7 +43,7 @@
<property name="minimum_size">300,-1</property>
<property name="name">MergeControlDialogMainPanel</property>
<property name="pos"></property>
<property name="size">391,265</property>
<property name="size">391,295</property>
<property name="subclass"></property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
Expand Down Expand Up @@ -1739,6 +1739,81 @@
</object>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">12</property>
<property name="flag">wxLEFT|wxTOP</property>
<property name="proportion">1</property>
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">bSizer26</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="1">
<property name="border">0</property>
<property name="flag">wxLEFT|wxTOP</property>
<property name="proportion">0</property>
<object class="wxCheckBox" 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="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="checked">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</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="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Merge Selection Group Information</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">KeepSelectionGroupsIntact</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="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; ; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip">With this option checked, DarkRadiant will attempt to keep all links between selection groups intact. There&apos;s no guarantee that this will work 100%, since it&apos;s usually problematic when both maps have seen changes to the same elements and their grouping.</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>
</object>
</object>
Expand Down
20 changes: 19 additions & 1 deletion install/ui/mergecontroldialog.xrc
Expand Up @@ -2,7 +2,7 @@
<resource xmlns="http://www.wxwindows.org/wxxrc" version="2.3.0.1">
<object class="wxPanel" name="MergeControlDialogMainPanel">
<style>wxTAB_TRAVERSAL</style>
<size>391,265</size>
<size>391,295</size>
<object class="wxBoxSizer">
<orient>wxVERTICAL</orient>
<object class="sizeritem">
Expand Down Expand Up @@ -358,6 +358,24 @@
</object>
</object>
</object>
<object class="sizeritem">
<option>1</option>
<flag>wxLEFT|wxTOP</flag>
<border>12</border>
<object class="wxBoxSizer">
<orient>wxVERTICAL</orient>
<object class="sizeritem">
<option>0</option>
<flag>wxLEFT|wxTOP</flag>
<border>0</border>
<object class="wxCheckBox" name="KeepSelectionGroupsIntact">
<tooltip>With this option checked, DarkRadiant will attempt to keep all links between selection groups intact. There&apos;s no guarantee that this will work 100%, since it&apos;s usually problematic when both maps have seen changes to the same elements and their grouping.</tooltip>
<label>Merge Selection Group Information</label>
<checked>0</checked>
</object>
</object>
</object>
</object>
</object>
</object>
</object>
Expand Down
10 changes: 10 additions & 0 deletions libs/scene/merge/MergeOperation.cpp
Expand Up @@ -99,6 +99,11 @@ void MergeOperation::applyActions()
rError() << "Failed to apply action: " << ex.what() << std::endl;
}
}

if (_mergeSelectionGroups)
{
// TODO
}
}

void MergeOperation::foreachAction(const std::function<void(const IMergeAction::Ptr&)>& visitor)
Expand All @@ -109,6 +114,11 @@ void MergeOperation::foreachAction(const std::function<void(const IMergeAction::
}
}

void MergeOperation::setMergeSelectionGroups(bool enabled)
{
_mergeSelectionGroups = enabled;
}

}

}
7 changes: 6 additions & 1 deletion libs/scene/merge/MergeOperation.h
Expand Up @@ -22,12 +22,15 @@ class MergeOperation :

std::list<MergeAction::Ptr> _actions;

bool _mergeSelectionGroups;

public:
using Ptr = std::shared_ptr<MergeOperation>;

MergeOperation(scene::IMapRootNodePtr sourceRoot, scene::IMapRootNodePtr baseRoot) :
_sourceRoot(sourceRoot),
_baseRoot(baseRoot)
_baseRoot(baseRoot),
_mergeSelectionGroups(true)
{}

// Creates the merge operation from the given comparison result.
Expand All @@ -41,6 +44,8 @@ class MergeOperation :

void foreachAction(const std::function<void(const IMergeAction::Ptr&)>& visitor) override;

void setMergeSelectionGroups(bool enabled) override;

private:
void createActionsForEntity(const ComparisonResult::EntityDifference& difference);
void createActionsForKeyValueDiff(const ComparisonResult::KeyValueDifference& difference,
Expand Down
21 changes: 16 additions & 5 deletions radiant/ui/merge/MergeControlDialog.cpp
Expand Up @@ -13,6 +13,7 @@

#include <wx/textctrl.h>
#include <wx/button.h>
#include <wx/checkbox.h>
#include <wx/sizer.h>
#include <wx/stattext.h>

Expand Down Expand Up @@ -56,6 +57,8 @@ MergeControlDialog::MergeControlDialog() :
auto* finishButton = findNamedObject<wxButton>(this, "FinishMergeButton");
finishButton->Bind(wxEVT_BUTTON, &MergeControlDialog::onFinishMerge, this);

findNamedObject<wxCheckBox>(this, "KeepSelectionGroupsIntact")->SetValue(true);

updateControlSensitivity();
Bind(wxEVT_IDLE, &MergeControlDialog::onIdle, this);

Expand Down Expand Up @@ -167,13 +170,21 @@ void MergeControlDialog::onRejectSelection(wxCommandEvent& ev)

void MergeControlDialog::onFinishMerge(wxCommandEvent& ev)
{
GlobalMapModule().finishMergeOperation();
auto operation = GlobalMapModule().getActiveMergeOperation();

if (GlobalMapModule().getEditMode() != IMap::EditMode::Merge)
if (operation)
{
// We're done here
Hide();
return;
auto mergeSelectionGroups = findNamedObject<wxCheckBox>(this, "KeepSelectionGroupsIntact")->GetValue();
operation->setMergeSelectionGroups(mergeSelectionGroups);

GlobalMapModule().finishMergeOperation();

if (GlobalMapModule().getEditMode() != IMap::EditMode::Merge)
{
// We're done here
Hide();
return;
}
}

updateControlSensitivity();
Expand Down

0 comments on commit 6e8dfc2

Please sign in to comment.