Skip to content

Commit 6cfda68

Browse files
committed
Add undo/redo support to RelActAutoGui.
Seems to work okay, but will probably need more fine-tuning or fixing.
1 parent 296ed56 commit 6cfda68

File tree

8 files changed

+356
-60
lines changed

8 files changed

+356
-60
lines changed

InterSpec/RelActAutoGui.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,10 @@ class RelActAutoGui : public Wt::WContainerWidget
309309

310310
void addDownloadAndUploadLinks( Wt::WContainerWidget *parent );
311311
void handleRequestToUploadXmlConfig();
312+
313+
/** Registers an undo/redo step if the current state differs from the previous state. */
314+
void addUndoRedoStep();
315+
312316
protected:
313317

314318
enum RenderActions
@@ -322,10 +326,14 @@ class RelActAutoGui : public Wt::WContainerWidget
322326
UpdateFitEnergyCal = 0x0040,
323327
UpdateRefGammaLines = 0x0080,
324328
UpdateShowHideBack = 0x0100,
325-
UpdateXRaysInRois = 0x0200
329+
UpdateXRaysInRois = 0x0200,
330+
AddUndoRedoStep = 0x0400
326331
};//enum D3RenderActions
327-
332+
328333
Wt::WFlags<RenderActions> m_render_flags;
334+
335+
/** The GUI state from the last render; used for undo/redo deduplication. */
336+
std::shared_ptr<const RelActCalcAuto::RelActAutoGuiState> m_currentGuiState;
329337

330338
std::string m_default_par_sets_dir;
331339
std::string m_user_par_sets_dir;

InterSpec/RelActCalc.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,9 @@ struct PhysicalModelShieldInput
337337

338338
static const double sm_upper_allowed_areal_density_in_g_per_cm2; //Set to 500
339339

340+
bool operator==( const PhysicalModelShieldInput &rhs ) const;
341+
bool operator!=( const PhysicalModelShieldInput &rhs ) const;
342+
340343
#if( PERFORM_DEVELOPER_CHECKS )
341344
static void equalEnough( const PhysicalModelShieldInput &lhs, const PhysicalModelShieldInput &rhs );
342345
#endif

InterSpec/RelActCalcAuto.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,9 @@ struct RoiRange
184184
void toXml( ::rapidxml::xml_node<char> *parent ) const;
185185
void fromXml( const ::rapidxml::xml_node<char> *parent );
186186

187+
bool operator==( const RoiRange &rhs ) const;
188+
bool operator!=( const RoiRange &rhs ) const;
189+
187190
#if( PERFORM_DEVELOPER_CHECKS )
188191
static void equalEnough( const RoiRange &lhs, const RoiRange &rhs );
189192
#endif
@@ -311,6 +314,9 @@ struct FloatingPeak
311314
void toXml( ::rapidxml::xml_node<char> *parent ) const;
312315
void fromXml( const ::rapidxml::xml_node<char> *parent );
313316

317+
bool operator==( const FloatingPeak &rhs ) const;
318+
bool operator!=( const FloatingPeak &rhs ) const;
319+
314320
#if( PERFORM_DEVELOPER_CHECKS )
315321
static void equalEnough( const FloatingPeak &lhs, const FloatingPeak &rhs );
316322
#endif
@@ -585,6 +591,9 @@ struct RelEffCurveInput
585591
void toXml( ::rapidxml::xml_node<char> *parent ) const;
586592
void fromXml( const ::rapidxml::xml_node<char> *constraint_node );
587593

594+
bool operator==( const ActRatioConstraint &rhs ) const;
595+
bool operator!=( const ActRatioConstraint &rhs ) const;
596+
588597
#if( PERFORM_DEVELOPER_CHECKS )
589598
static void equalEnough( const ActRatioConstraint &lhs, const ActRatioConstraint &rhs );
590599
#endif
@@ -619,6 +628,9 @@ struct RelEffCurveInput
619628
void toXml( ::rapidxml::xml_node<char> *parent ) const;
620629
void fromXml( const ::rapidxml::xml_node<char> *parent );
621630

631+
bool operator==( const MassFractionConstraint &rhs ) const;
632+
bool operator!=( const MassFractionConstraint &rhs ) const;
633+
622634
#if( PERFORM_DEVELOPER_CHECKS )
623635
static void equalEnough( const MassFractionConstraint &lhs, const MassFractionConstraint &rhs );
624636
#endif
@@ -663,6 +675,9 @@ struct RelEffCurveInput
663675
rapidxml::xml_node<char> *toXml( ::rapidxml::xml_node<char> *parent ) const;
664676
void fromXml( const ::rapidxml::xml_node<char> *parent );
665677

678+
bool operator==( const RelEffCurveInput &rhs ) const;
679+
bool operator!=( const RelEffCurveInput &rhs ) const;
680+
666681
#if( PERFORM_DEVELOPER_CHECKS )
667682
static void equalEnough( const RelEffCurveInput &lhs, const RelEffCurveInput &rhs );
668683
#endif
@@ -780,6 +795,9 @@ struct Options
780795
*/
781796
void fromXml( const ::rapidxml::xml_node<char> *parent );
782797

798+
bool operator==( const Options &rhs ) const;
799+
bool operator!=( const Options &rhs ) const;
800+
783801
#if( PERFORM_DEVELOPER_CHECKS )
784802
static void equalEnough( const Options &lhs, const Options &rhs );
785803
#endif
@@ -841,6 +859,9 @@ struct RelActAutoGuiState
841859
::rapidxml::xml_node<char> *serialize( ::rapidxml::xml_node<char> *parent ) const;
842860
void deSerialize( const rapidxml::xml_node<char> *base_node );
843861

862+
bool operator==( const RelActAutoGuiState &rhs ) const;
863+
bool operator!=( const RelActAutoGuiState &rhs ) const;
864+
844865
#if( PERFORM_DEVELOPER_CHECKS )
845866
static void equalEnough( const RelActAutoGuiState &lhs, const RelActAutoGuiState &rhs );
846867
#endif

src/InterSpec.cpp

Lines changed: 37 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -9716,61 +9716,51 @@ void InterSpec::programaticallyCloseAutoRemoteRidResultDialog()
97169716
#if( USE_REL_ACT_TOOL )
97179717
RelActAutoGui *InterSpec::relActAutoWindow( const bool createIfNotOpen )
97189718
{
9719+
assert( (!m_relActAutoGui) == (!m_relActAutoWindow) );
9720+
97199721
if( !createIfNotOpen )
97209722
return m_relActAutoGui;
97219723

9722-
if( !m_relActAutoGui )
9724+
if( m_relActAutoGui )
9725+
return m_relActAutoGui;
9726+
9727+
const std::pair<RelActAutoGui *,AuxWindow *> widgets = RelActAutoGui::createWindow( this );
9728+
if( !widgets.first || !widgets.second )
9729+
return m_relActAutoGui;
9730+
9731+
m_relActAutoGui = widgets.first;
9732+
m_relActAutoWindow = widgets.second;
9733+
9734+
m_relActAutoWindow->finished().connect( boost::bind( &InterSpec::handleRelActAutoClose, this ) );
9735+
9736+
try
97239737
{
9724-
const std::pair<RelActAutoGui *,AuxWindow *> widgets = RelActAutoGui::createWindow( this );
9725-
if( !widgets.first || !widgets.second )
9726-
return m_relActAutoGui;
9727-
9728-
m_relActAutoGui = widgets.first;
9729-
m_relActAutoWindow = widgets.second;
9730-
9731-
m_relActAutoWindow->finished().connect( boost::bind( &InterSpec::handleRelActAutoClose, this ) );
9732-
9733-
try
9738+
std::unique_ptr<RelActCalcAuto::RelActAutoGuiState> relActState = m_dataMeasurement
9739+
? m_dataMeasurement->getRelActAutoGuiState()
9740+
: nullptr;
9741+
if( relActState )
97349742
{
9735-
std::unique_ptr<RelActCalcAuto::RelActAutoGuiState> relActState = m_dataMeasurement
9736-
? m_dataMeasurement->getRelActAutoGuiState()
9737-
: nullptr;
9738-
if( relActState )
9739-
{
9740-
m_relActAutoGui->deSerialize( *relActState );
9741-
m_relActAutoGui->checkIfInUserConfigOrCreateOne( true );
9742-
}
9743-
}catch( std::exception &e )
9744-
{
9745-
passMessage( "Error setting &quot;Isotopics from nuclides&quot; state to previously used state: "
9746-
+ std::string(e.what()), WarningWidget::WarningMsgHigh );
9747-
9743+
m_relActAutoGui->deSerialize( *relActState );
9744+
m_relActAutoGui->checkIfInUserConfigOrCreateOne( true );
9745+
}
9746+
}catch( std::exception &e )
9747+
{
9748+
passMessage( "Error setting &quot;Isotopics from nuclides&quot; state to previously used state: "
9749+
+ std::string(e.what()), WarningWidget::WarningMsgHigh );
9750+
97489751
#if( PERFORM_DEVELOPER_CHECKS )
9749-
log_developer_error( __func__, ("Error deserializing Rel. Act. GUI state: " + string(e.what())).c_str() );
9752+
log_developer_error( __func__, ("Error deserializing Rel. Act. GUI state: " + string(e.what())).c_str() );
97509753
#endif
9751-
9752-
//assert( 0 );
9753-
}//try / catch
9754-
9755-
if( m_undo && m_undo->canAddUndoRedoNow() )
9756-
{
9757-
auto undo = [this](){ handleRelActAutoClose(); };
9758-
auto redo = [this](){ relActAutoWindow(true); };
9759-
m_undo->addUndoRedoStep( std::move(undo), std::move(redo), "Show 'Isotopics from nuclides' tool" );
9760-
}//if( m_undo && !m_undo->canAddUndoRedoNow() )
9761-
9762-
// Since we dont have undo/redo implemented for RelActAuto - we will block it entirely
9763-
new UndoRedoManager::BlockGuiUndoRedo( m_relActAutoGui );
9764-
}else
9765-
{
9766-
const double windowWidth = 0.95 * renderedWidth();
9767-
const double windowHeight = 0.95 * renderedHeight();
9768-
m_relActAutoWindow->resizeWindow( windowWidth, windowHeight );
97699754

9770-
m_relActAutoWindow->resizeToFitOnScreen();
9771-
m_relActAutoWindow->show();
9772-
m_relActAutoWindow->centerWindow();
9773-
}//if( !m_shieldingSourceFit )
9755+
//assert( 0 );
9756+
}//try / catch
9757+
9758+
if( m_undo && m_undo->canAddUndoRedoNow() )
9759+
{
9760+
auto undo = [this](){ handleRelActAutoClose(); };
9761+
auto redo = [this](){ relActAutoWindow(true); };
9762+
m_undo->addUndoRedoStep( std::move(undo), std::move(redo), "Show 'Isotopics from nuclides' tool" );
9763+
}//if( m_undo && !m_undo->canAddUndoRedoNow() )
97749764

97759765
assert( m_relActAutoMenuItem );
97769766
m_relActAutoMenuItem->disable();

src/InterSpecApp.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
#include "InterSpec/InterSpecUser.h"
6969
#include "InterSpec/DataBaseUtils.h"
7070
#include "InterSpec/WarningWidget.h"
71+
#include "InterSpec/UndoRedoManager.h"
7172
#include "InterSpec/UserPreferences.h"
7273

7374
#if( BUILD_AS_ELECTRON_APP )
@@ -612,6 +613,9 @@ void InterSpecApp::setupWidgets( const bool attemptStateLoad )
612613
return;
613614
}//try / catch to create a InterSpec object
614615

616+
// Keep from adding any undo/redo while we finish initial rendering
617+
UndoRedoManager::BlockUndoRedoInserts undo_blocker;
618+
615619
root()->addStyleClass( "specviewer" );
616620

617621
// TODO: we could add an explicit CSS class

0 commit comments

Comments
 (0)