Public Slots | Public Member Functions | Protected Member Functions | Protected Attributes
GraphicWindow Class Reference

#include <GraphicWindow.h>

Inheritance diagram for GraphicWindow:
GeopsyGui::AbstractGraphicWindow GeopsyGui::SubPoolWindow MagnifierSignal

List of all members.

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 PickLayerpickLayer () const
void setLimits ()
virtual void setWindowTitle (QString title)
virtual SignalLayersignalLayer () const
virtual void signalsUpdate ()
virtual void subPoolUpdate ()
virtual TimeWindowLayertimeWindowLayer () 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

Constructor & Destructor Documentation

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);
}

Member Function Documentation

void GraphicWindow::closeMagnify ( ) [slot]

References _magWin, geopsyGui, and TRACE.

Referenced by GraphicWindow().

{
  TRACE;
  if(_magWin) {
    geopsyGui->removeWindow(_magWin);
    delete _magWin;
    _magWin=0;
  }
}
void GraphicWindow::focusInEvent ( QFocusEvent *  e) [protected, virtual]
virtual PickLayer* GraphicWindow::pickLayer ( ) const [inline, virtual]

Implements GeopsyGui::AbstractGraphicWindow.

References _pickLayer.

Referenced by showMagnify().

{return _pickLayer;}
void GraphicWindow::setMagnifyPosition ( double  x) [slot]

References _magWin, MagnifierSignal::setTime(), and TRACE.

Referenced by GraphicWindow().

{
  TRACE;
  if(_magWin) _magWin->setTime(x);
}
void GraphicWindow::setMagnifySignal ( Signal sig) [slot]
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]
virtual SignalLayer* GraphicWindow::signalLayer ( ) const [inline, virtual]
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]
virtual TimeWindowLayer* GraphicWindow::timeWindowLayer ( ) const [inline, virtual]

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;
      }
    }
  }
}

Member Data Documentation

Referenced by GraphicWindow().

Referenced by GraphicWindow(), and pickLayer().

Referenced by GraphicWindow(), and timeWindowLayer().


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines