Files
Upsilon/apps/shared/function_go_to_parameter_controller.cpp
Émilie Feral a2739e08cc [apps/shared] FunctionGoToParameterController update the range version
of the graph controller to avoid reinitializing the cursor position when
graph controller view appears. Otherwise, goto controller would set the
cursor position, update the range consequently and then the graph
controller would reinitialize the cursor position.
2019-08-09 10:27:31 +02:00

45 lines
1.8 KiB
C++

#include "function_go_to_parameter_controller.h"
#include "function_app.h"
#include <assert.h>
#include <cmath>
namespace Shared {
FunctionGoToParameterController::FunctionGoToParameterController(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandlerDelegate, InteractiveCurveViewRange * graphRange, CurveViewCursor * cursor, I18n::Message symbol) :
GoToParameterController(parentResponder, inputEventHandlerDelegate, graphRange, cursor, symbol),
m_record()
{
}
const char * FunctionGoToParameterController::title() {
return I18n::translate(I18n::Message::Goto);
}
double FunctionGoToParameterController::parameterAtIndex(int index) {
assert(index == 0);
return m_cursor->x();
}
bool FunctionGoToParameterController::setParameterAtIndex(int parameterIndex, double f) {
assert(parameterIndex == 0);
FunctionApp * myApp = FunctionApp::app();
ExpiringPointer<Function> function = myApp->functionStore()->modelForRecord(m_record);
double y = function->evaluateAtAbscissa(f, myApp->localContext());
m_cursor->moveTo(f, y);
m_graphRange->centerAxisAround(CurveViewRange::Axis::X, m_cursor->x());
m_graphRange->centerAxisAround(CurveViewRange::Axis::Y, m_cursor->y());
/* The range might have evolved to center around the cursor but we don't want
* to reinit the cursor position when displaying the graph controller. To
* prevent this, we update the snapshot range version in order to make the
* graph controller as if the range has not evolved since last appearance. */
uint32_t * snapshotRangeVersion = static_cast<FunctionApp::Snapshot *>(myApp->snapshot())->rangeVersion();
*snapshotRangeVersion = m_graphRange->rangeChecksum();
return true;
}
void FunctionGoToParameterController::setRecord(Ion::Storage::Record record) {
m_record = record;
}
}