#include <GraphicWindow.h>
Public Slots | |
void | closeMagnify () |
void | getSelection (SubSignalPool &sel) |
void | setMagnifyPosition (double x) |
void | setMagnifySignal (Signal *sig) |
void | showMagnify (bool magnify, int context, double time, Signal *sig) |
Public Member Functions | |
virtual void | fastFourierTransform (DoubleSignal::SignalType st) |
GraphicWindow (QWidget *parent=0) | |
virtual PickLayer * | pickLayer () const |
void | setLimits () |
virtual void | setWindowTitle (QString title) |
virtual SignalLayer * | signalLayer () const |
virtual void | signalsUpdate () |
virtual void | subPoolUpdate () |
virtual TimeWindowLayer * | timeWindowLayer () const |
void | updateLabels () |
~GraphicWindow () | |
Protected Member Functions | |
virtual void | focusInEvent (QFocusEvent *e) |
Protected Attributes | |
GraphicWindowControls * | _controls |
MagnifierSignal * | _magWin |
PickLayer * | _pickLayer |
SignalLayer * | _signalLayer |
SlopeEstimator * | _slopeLayer |
TimeWindowLayer * | _timeWindowLayer |
GraphicWindow::GraphicWindow | ( | QWidget * | parent = 0 | ) |
References _controls, _magWin, _pickLayer, _signalLayer, _timeWindowLayer, GeopsyGui::SubPoolWindow::addSignals(), SciFigs::GraphContentLayer::addTrackingAction(), closeMagnify(), GeopsyCore::geopsyCore, getSelection(), SciFigs::GraphContentLayer::graph(), SciFigs::AxisWindow::graphContent(), SciFigs::GraphContentLayer::graphContent(), GeopsyCore::GeopsyPreferences::graphicMakeUpFile(), GeopsyCore::GeopsyCoreEngine::preferences(), GeopsyCore::GeopsyPreferences::restoreGraphicMakeUp(), SciFigs::GraphicObject::restoreMakeUp(), SciFigs::XMLSciFigs::restoreString(), SciFigs::SlopeEstimator::setFormat(), setMagnifyPosition(), setMagnifySignal(), SciFigs::Axis::setNumberType(), SciFigs::GraphicObject::setObjectName(), SciFigs::Axis::setReversedScale(), SciFigs::Axis::setSizeInfo(), SciFigs::Axis::setZoomEnabled(), showMagnify(), QGpCoreTools::tr(), TRACE, w, SciFigs::AxisWindow::xAxis(), and SciFigs::AxisWindow::yAxis().
: AbstractGraphicWindow(parent) { TRACE; QVBoxLayout * l=new QVBoxLayout(this); l->setSpacing(2); l->setMargin(1); setObjectName("graphic"); AxisWindow * w=new AxisWindow(this); l->addWidget(w); w->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); w->setObjectName("signals"); setWindowIcon(QIcon( ":/images/graph-22x22.png" )); Settings::getSize(this, "GraphicWindow" ); _signalLayer=new SignalDisplay(w); _signalLayer->setObjectName("signals"); w->xAxis()->setNumberType(Number::Weeks); w->yAxis()->setReversedScale(true); w->yAxis()->setZoomEnabled(false); w->xAxis()->setSizeInfo(15.0); w->yAxis()->setSizeInfo(10.0); // Drag and drop to transfert signal selection SigSelectionDnD * sigDnD=new SigSelectionDnD(w->graphContent()); connect(sigDnD, SIGNAL(selectionDropped( const SubSignalPool& )), this, SLOT(addSignals( const SubSignalPool& )) ); connect(sigDnD, SIGNAL(getSelection( SubSignalPool& )), this, SLOT(getSelection( SubSignalPool& )) ); connect(w->graphContent(), SIGNAL(mouseTrackingBegin()), sigDnD, SLOT(disableFilter()) ); connect(w->graphContent(), SIGNAL(mouseTrackingEnd()), sigDnD, SLOT(enableFilter()) ); // Time window layer _timeWindowLayer=new TimeWindowLayer(_signalLayer); _timeWindowLayer->setObjectName("timeWindows"); // Pick layer _pickLayer=new PickLayer(_signalLayer); _pickLayer->setObjectName("picks"); connect(_pickLayer, SIGNAL(pickBegin(bool, int, double, Signal *, int)), this, SLOT(showMagnify(bool, int, double, Signal *)) ); connect(_pickLayer, SIGNAL(pickEnd()), this, SLOT(closeMagnify()) ); connect(_pickLayer, SIGNAL(mouseMoved(double)), this, SLOT(setMagnifyPosition(double)) ); connect(_pickLayer, SIGNAL(currentSignalChanged(Signal *, int)), this, SLOT(setMagnifySignal(Signal *)) ); // Slope estimator layer SlopeEstimator * sloper=new SlopeEstimator(w); sloper->setObjectName("slopes"); sloper->setFormat(SlopeEstimator::RatioYOverX); sloper->addTrackingAction(tr("&New hodochrone"), SlopeEstimator::Pick, tr("Pick a new hodochrone.")); sloper->addTrackingAction(tr("&Edit hodochrone"), SlopeEstimator::Edit, tr("Edit an existing hodochrone.")); // Magnify _magWin=0; // Restore default properties QSettings reg; QString signalPlotProperties=reg.value("SignalPlot").toString(); if(!signalPlotProperties.isEmpty()) { XMLSciFigs s; s.restoreString(signalPlotProperties, _signalLayer->graphContent(), XMLSciFigs::MakeUp); } // Custom make up if(geopsyCore->preferences()->restoreGraphicMakeUp() && !geopsyCore->preferences()->graphicMakeUpFile().isEmpty()) { _signalLayer->graph()->restoreMakeUp(geopsyCore->preferences()->graphicMakeUpFile()); } _controls=new GraphicWindowControls(_signalLayer, this); l->addWidget(_controls); }
References _magWin, _signalLayer, geopsyGui, SciFigs::GraphContentLayer::graphContent(), SciFigs::XMLSciFigs::saveString(), and TRACE.
{ TRACE; /* Must block painting right now, because subPool (in SubPoolWindow destructor)will be destroyed before graphic itself (deleted by QObject tree).*/ LayerLocker ll(_signalLayer); if(_magWin) { geopsyGui->removeWindow(_magWin); delete _magWin; } Settings::setSize(this, "GraphicWindow" ); // Save as default properties QSettings reg; XMLSciFigs s; QString signalPlotProperties=s.saveString(_signalLayer->graphContent(), XMLSciFigs::MakeUp); reg.setValue("SignalPlot",signalPlotProperties); }
void GraphicWindow::closeMagnify | ( | ) | [slot] |
void GraphicWindow::fastFourierTransform | ( | DoubleSignal::SignalType | st | ) | [virtual] |
Implements GeopsyGui::SubPoolWindow.
References _signalLayer, SciFigs::AxisWindow::deepUpdate(), GeopsyCore::SubSignalPool::fastFourierTransform(), SciFigs::GraphContentLayer::graph(), setLimits(), signalsUpdate(), GeopsyGui::SubPoolWindow::subPool(), TRACE, SciFigs::AxisWindow::updateInternalGeometry(), updateLabels(), and w.
{ TRACE; subPool().fastFourierTransform(st); updateLabels(); setLimits(); signalsUpdate(); AxisWindow * w=_signalLayer->graph(); w->updateInternalGeometry(); w->deepUpdate(); }
void GraphicWindow::focusInEvent | ( | QFocusEvent * | e | ) | [protected, virtual] |
References _signalLayer, SciFigs::GraphContentLayer::graphContent(), and TRACE.
{ TRACE; _signalLayer->graphContent()->setFocus(e->reason()); }
void GraphicWindow::getSelection | ( | SubSignalPool & | sel | ) | [slot] |
References GeopsyCore::SubSignalPool::addSubPool(), GeopsyGui::SubPoolWindow::subPool(), and TRACE.
Referenced by GraphicWindow().
{ TRACE; sel.addSubPool(subPool()); }
virtual PickLayer* GraphicWindow::pickLayer | ( | ) | const [inline, virtual] |
Implements GeopsyGui::AbstractGraphicWindow.
References _pickLayer.
Referenced by showMagnify().
{return _pickLayer;}
void GraphicWindow::setLimits | ( | ) |
References _signalLayer, GeopsyCore::TimeRange::end(), SciFigs::GraphContentLayer::graph(), GeopsyGui::SignalLayer::minMaxY(), GeopsyCore::TimeRange::setEnd(), SciFigs::Axis::setRange(), GeopsyCore::TimeRange::setStart(), signalLayer(), GeopsyCore::TimeRange::start(), GeopsyGui::SubPoolWindow::subPool(), GeopsyCore::SubSignalPool::timeRange(), TRACE, w, SciFigs::AxisWindow::xAxis(), and SciFigs::AxisWindow::yAxis().
Referenced by fastFourierTransform(), SignalDisplay::setProperty(), and subPoolUpdate().
{ TRACE; TimeRange r=subPool().timeRange( ); if(r.start()==1e99) r.setStart(0.0); if(r.end()==-1e99) r.setEnd(1.0); AxisWindow * w=_signalLayer->graph(); w->xAxis()->setRange(r.start(), r.end()); double ymin=0, ymax=1; SignalLayer * layer=signalLayer(); ASSERT(layer); if( !subPool().isEmpty()) { layer->minMaxY(ymin, ymax); w->yAxis()->setRange(ymin, ymax); } }
void GraphicWindow::setMagnifyPosition | ( | double | x | ) | [slot] |
References _magWin, MagnifierSignal::setTime(), and TRACE.
Referenced by GraphicWindow().
void GraphicWindow::setMagnifySignal | ( | Signal * | sig | ) | [slot] |
References _magWin, _signalLayer, SciFigs::GraphContentLayer::graph(), SciFigs::AxisWindow::graphContent(), SciFigs::Axis::lastMousePosition(), SciFigs::GraphContent::options(), MagnifierSignal::setSignal(), MagnifierSignal::setTime(), GeopsyGui::SubPoolWindow::subPool(), TRACE, w, SciFigs::AxisWindow::xAxis(), and SciFigs::GraphContentOptions::xs2r().
Referenced by GraphicWindow().
{ TRACE; if(_magWin) { _magWin->setSignal(&subPool(), sig); AxisWindow * w=_signalLayer->graph(); _magWin->setTime(w->graphContent()->options().xs2r(w->xAxis()->lastMousePosition()) ); } }
void GraphicWindow::setWindowTitle | ( | QString | title | ) | [virtual] |
Reimplemented from GeopsyGui::SubPoolWindow.
Reimplemented in MagnifierSignal.
References TRACE.
Referenced by subPoolUpdate().
{ TRACE; SubPoolWindow::setWindowTitle( "Graphic - " + title); }
void GraphicWindow::showMagnify | ( | bool | magnify, |
int | context, | ||
double | time, | ||
Signal * | sig | ||
) | [slot] |
References _magWin, _signalLayer, geopsyGui, SciFigs::GraphContentLayer::graph(), SciFigs::AxisWindow::graphContent(), pickLayer(), MagnifierSignal::setContext(), SciFigs::Axis::setRange(), MagnifierSignal::setSignal(), GeopsyGui::SubPoolWindow::subPool(), TRACE, w, and SciFigs::AxisWindow::xAxis().
Referenced by GraphicWindow().
{ TRACE; if(show) { if( !_magWin) { _magWin=new MagnifierSignal(this); _magWin->setContext(context); AxisWindow * w=_magWin->_signalLayer->graph(); w->graphContent()->setFocus(Qt::OtherFocusReason); geopsyGui->addWindow(_magWin); geopsyGui->showWindow(_magWin); PickLayer * pl=pickLayer(); w->graphContent()->installEventFilter(pl); w->xAxis()->setRange(0, time); } _magWin->setSignal(&subPool(), sig); } }
virtual SignalLayer* GraphicWindow::signalLayer | ( | ) | const [inline, virtual] |
Implements GeopsyGui::AbstractGraphicWindow.
References _signalLayer.
Referenced by setLimits(), MagnifierSignal::setSignal(), signalsUpdate(), WaveformConsole::stalta(), subPoolUpdate(), and updateLabels().
{return _signalLayer;}
void GraphicWindow::signalsUpdate | ( | ) | [virtual] |
Function to redefine in child class to update view after changes to waveforms. Do not forget to call this function on exit.
The default implementation send signal signalTypeChanged() with argument set to UndefinedSignalType (as if the signals of the SubPool have not the same type).
Reimplemented from GeopsyGui::SubPoolWindow.
References _signalLayer, GeopsyCore::SubSignalPool::count(), SciFigs::AxisWindow::deepUpdate(), GeopsyCore::TimeRange::end(), SciFigs::GraphContentLayer::graph(), GeopsyGui::SignalLayer::minMaxY(), GeopsyCore::TimeRange::setEnd(), SciFigs::Axis::setRange(), GeopsyCore::TimeRange::setStart(), signalLayer(), GeopsyGui::SignalLayer::signalsUpdate(), GeopsyCore::TimeRange::start(), GeopsyGui::SubPoolWindow::subPool(), GeopsyCore::SubSignalPool::timeRange(), TRACE, updateLabels(), w, SciFigs::AxisWindow::xAxis(), and SciFigs::AxisWindow::yAxis().
Referenced by fastFourierTransform(), and subPoolUpdate().
{ TRACE; SignalLayer * layer=signalLayer(); ASSERT(layer); TimeRange r=subPool().timeRange(); if(r.start()==1e99) r.setStart(0.0); if(r.end()==-1e99) r.setEnd(1.0); AxisWindow * w=_signalLayer->graph(); w->xAxis()->setRange(r.start(), r.end()); if(subPool().count()==1) { double ymin, ymax; layer->minMaxY(ymin, ymax); w->yAxis()->setRange(ymin, ymax); updateLabels(); w->deepUpdate(); } else { w->xAxis()->update(); layer->signalsUpdate(); } SubPoolWindow::signalsUpdate(); }
void GraphicWindow::subPoolUpdate | ( | ) | [virtual] |
Implements GeopsyGui::SubPoolWindow.
References _signalLayer, GeopsyCore::SubSignalPool::at(), SciFigs::AxisWindow::deepUpdate(), GeopsyCore::geopsyCore, SciFigs::GraphContentLayer::graph(), GeopsyCore::GeopsyPreferences::graphicMakeUpFile(), GeopsyCore::Signal::nameComponent(), GeopsyCore::GeopsyCoreEngine::preferences(), GeopsyCore::GeopsyPreferences::restoreGraphicMakeUp(), SciFigs::GraphicObject::restoreMakeUp(), setLimits(), setWindowTitle(), signalLayer(), signalsUpdate(), GeopsyGui::SubPoolWindow::subPool(), GeopsyGui::SignalLayer::subPoolUpdate(), TRACE, SciFigs::AxisWindow::updateInternalGeometry(), updateLabels(), and w.
Referenced by MagnifierSignal::setSignal().
{ TRACE; AxisWindow * w=_signalLayer->graph(); if(subPool().isEmpty()) { setWindowTitle(QString::null); return ; } signalLayer()->subPoolUpdate(&subPool()); if(subPool().count()==1) { Signal & sig=*subPool().at(0); QString traceName=sig.nameComponent(); setWindowTitle(traceName); } else { setWindowTitle(subPool().name()); } setLimits(); updateLabels(); signalsUpdate(); // Make up if(geopsyCore->preferences()->restoreGraphicMakeUp()) { _signalLayer->graph()->restoreMakeUp(geopsyCore->preferences()->graphicMakeUpFile()); } w->updateInternalGeometry(); w->deepUpdate(); }
virtual TimeWindowLayer* GraphicWindow::timeWindowLayer | ( | ) | const [inline, virtual] |
Implements GeopsyGui::AbstractGraphicWindow.
References _timeWindowLayer.
{return _timeWindowLayer;}
void GraphicWindow::updateLabels | ( | ) |
References _signalLayer, SciFigs::Axis::addStringLabel(), GeopsyCore::SubSignalPool::at(), GeopsyCore::SubSignalPool::count(), GeopsyCore::Signal::effectiveAmplitudeUnit(), GeopsyCore::SubSignalPool::end(), SciFigs::GraphContentLayer::graph(), SciFigs::Axis::removeStringLabels(), SciFigs::Axis::setAutoTicks(), SciFigs::Axis::setMajorTicks(), SciFigs::Axis::setMinorTicks(), SciFigs::Axis::setNumberType(), SciFigs::Axis::setReversedScale(), SciFigs::Axis::setScaleType(), SciFigs::Axis::setTitle(), signalLayer(), GeopsyGui::SubPoolWindow::subPool(), QGpCoreTools::tr(), TRACE, GeopsyCore::DoubleSignal::type(), QGpCoreTools::unique(), w, SciFigs::AxisWindow::xAxis(), GeopsyGui::SignalLayer::yAxis, and SciFigs::AxisWindow::yAxis().
Referenced by fastFourierTransform(), SignalDisplay::setProperty(), signalsUpdate(), and subPoolUpdate().
{ TRACE; int numSpectrum=0; SubSignalPool::iterator it; for(it=subPool().begin();it!=subPool().end();++it) { if(( *it) ->isSpectrum()) numSpectrum++; } AxisWindow * w=_signalLayer->graph(); if(numSpectrum==(int) subPool().count()) { w->xAxis()->setTitle(tr( "Frequency (Hz)" )); w->xAxis()->setNumberType(Number::Fixed); w->xAxis()->setScaleType(Scale::Log); w->xAxis()->update(); } else if(numSpectrum==0) { w->xAxis()->setTitle(tr( "Time" )); w->xAxis()->setNumberType(Number::Weeks); w->xAxis()->setScaleType(Scale::Linear); w->xAxis()->update(); } else { w->xAxis()->setTitle(tr( "Time (s) or Frequency (Hz)" )); w->xAxis()->setNumberType(Number::Fixed); w->xAxis()->setScaleType(Scale::Linear); w->xAxis()->update(); } w->xAxis()->setAutoTicks(true); if(!subPool().isEmpty()) { SignalLayer * layer=signalLayer(); if(subPool().count()==1 || layer->yAxis()==SignalLayer::Overlayed) { // Everything is based on the first signal Signal & sig=*subPool().at(0); switch (sig.type()) { case Signal::Waveform: case Signal::CAmpWaveform: w->yAxis()->setTitle(sig.effectiveAmplitudeUnit()); w->yAxis()->setNumberType(Number::Scientific); break; case Signal::RealSpectrum: case Signal::Spectrum: w->yAxis()->setTitle(sig.effectiveAmplitudeUnit()+"*s" ); w->yAxis()->setNumberType(Number::Scientific); break; case Signal::Phase: case Signal::CPhaseWaveform: w->yAxis()->setTitle(tr( "Rad" )); w->yAxis()->setNumberType(Number::Fixed); break; case Signal::ArrivalTime: case Signal::UndefinedSignalType: break; } w->yAxis()->setAutoTicks(true); w->yAxis()->setScaleType(Scale::Linear); w->yAxis()->removeStringLabels(); w->yAxis()->setReversedScale(false); } else { Axis& a=*w->yAxis(); ASSERT(layer); switch(layer->yAxis()) { case SignalLayer::Receiver: a.setTitle(tr( "Projections on receiver line (m)" )); a.setAutoTicks(true); a.setScaleType(Scale::Linear); a.removeStringLabels(); a.setReversedScale(false); break; case SignalLayer::ViewerIndex: { a.setReversedScale(true); a.setTitle( "" ); a.setAutoTicks(false); a.setMajorTicks(1.0); a.setMinorTicks(1.0); a.setScaleType(Scale::Linear); a.removeStringLabels(); int n=subPool().count() - 1; for(int i=0; i<n; i++ ) { a.addStringLabel(subPool().at(i)->nameComponent(), false); } // Update axis... while adding the last label a.addStringLabel(subPool().at(n)->nameComponent(), true); } break; case SignalLayer::SignalName: { a.setReversedScale(true); a.setTitle( "" ); a.setAutoTicks(false); a.setMajorTicks(1.0); a.setMinorTicks(1.0); a.setScaleType(Scale::Linear); a.removeStringLabels(); QStringList names; int n=subPool().count(); for(int i=0;i < n;i++ ) { names.append(subPool().at(i)->nameComponent()); } qSort(names); unique(names); n=names.count() - 1; for(int i=0; i<n; i++ ) { a.addStringLabel(names.at(i), false); } // Update axis... while adding the last label a.addStringLabel(names.at(n), true); } break; case SignalLayer::Overlayed: // Handled above, just to avoid warning. break; } } } }
GraphicWindowControls* GraphicWindow::_controls [protected] |
Referenced by GraphicWindow().
MagnifierSignal* GraphicWindow::_magWin [protected] |
Referenced by closeMagnify(), GraphicWindow(), setMagnifyPosition(), setMagnifySignal(), showMagnify(), and ~GraphicWindow().
PickLayer* GraphicWindow::_pickLayer [protected] |
Referenced by GraphicWindow(), and pickLayer().
SignalLayer* GraphicWindow::_signalLayer [protected] |
SlopeEstimator* GraphicWindow::_slopeLayer [protected] |
TimeWindowLayer* GraphicWindow::_timeWindowLayer [protected] |
Referenced by GraphicWindow(), and timeWindowLayer().