All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines
Classes | Public Member Functions | Static Public Attributes | Protected Member Functions
GeopsyGui::ChronogramLayer Class Reference

Brief description of class still missing. More...

#include <ChronogramLayer.h>

Inheritance diagram for GeopsyGui::ChronogramLayer:
SciFigs::GraphContentLayer QGpGuiTools::PropertyItem QGpCoreTools::XMLClass

List of all members.

Classes

struct  StationRange

Public Member Functions

virtual void addProperties (PropertyProxy *pp)
virtual Rect boundingRect () const
 ChronogramLayer (AxisWindow *parent=0)
void exportGaps (const QString &fileName)
virtual bool hasProperties ()
int hitCount () const
QString name (int index) const
virtual void properties (PropertyWidget *w) const
void rangeUpdate ()
virtual void removeProperties (PropertyProxy *pp)
SubSignalPool selection () const
virtual void setProperty (uint wid, int pid, QVariant val)
const SubSignalPoolsubPool () const
void subPoolUpdate (SubSignalPool *subPool=0)
virtual bool trackRectangle (int id, double rx1, double ry1, double rx2, double ry2, Qt::KeyboardModifiers m)
virtual const QString & xml_tagName () const
 ~ChronogramLayer ()

Static Public Attributes

static const QString xmlChronogramLayerTag = "ChronogramLayer"

Protected Member Functions

virtual void paintData (const LayerPainterRequest &lp, QPainter &p, double dotpercm) const
XMLMember xml_member (XML_MEMBER_ARGS)
void xml_polishChild (XML_POLISHCHILD_ARGS)
void xml_writeChildren (XML_WRITECHILDREN_ARGS) const

Detailed Description

Brief description of class still missing.

Full description of class still missing


Constructor & Destructor Documentation

Description of constructor still missing

References GeopsyCore::geopsyCore, and TRACE.

    : GraphContentLayer(parent)
{
  TRACE;
  // Required for viewing the layer in figue (through geopsyfigs plugin)
  if(!geopsyCore) {
    CoreApplication::addGlobalObject(new GeopsyGuiEngine);
  }
  _subPoolOwner=false;
  _minimumGap=0.0;
  _subPool=0;
}

Description of destructor still missing

References TRACE.

{
  TRACE;
  if(_subPoolOwner) {
    delete _subPool;
  }
}

Member Function Documentation

Setup property editor

Reimplemented from SciFigs::GraphContentLayer.

References QGpGuiTools::PropertyProxy::addReference(), QGpGuiTools::PropertyProxy::addTab(), QGpGuiTools::PropertyProxy::currentTabWidget(), QGpGuiTools::PropertyProxy::setCurrentTab(), GeopsyGui::ChronogramProperties::setLayer(), QGpCoreTools::tr(), TRACE, and w.

{
  TRACE;
  if(pp->setCurrentTab(_tab)) {
    ChronogramProperties * w=static_cast<ChronogramProperties *>(pp->currentTabWidget());
    w->setLayer(this);
    pp->addReference(this);
  } else {
    ChronogramProperties * w=new ChronogramProperties;
    w->setLayer(this);
    pp->addTab(_tab, tr("Chronogram"), w, this);
  }
}

Implements SciFigs::GraphContentLayer.

References GeopsyCore::StationSignals::maxTime(), GeopsyCore::StationSignals::minTime(), GeopsyCore::StationList::nComponents(), and TRACE.

Referenced by ChronogramWindow::setLimits().

{
  TRACE;
  if(_subPool) {
    double minTime=1e99;
    double maxTime=-1e99;
    double t;
    for(StationList::const_iterator it=_stations.begin();it!=_stations.end();it++) {
      StationSignals * stat=*it;
      t=stat->minTime();
      if(t<minTime) minTime=t;
      t=stat->maxTime();
      if(t>maxTime) maxTime=t;
    }
    Rect r(minTime, 0.5, maxTime, _stations.nComponents()*_stations.count()+0.5);
    return r;
  } else {
    return Rect();
  }
}
void GeopsyGui::ChronogramLayer::exportGaps ( const QString &  fileName)

Export gaps from the visible window to fileName

References GeopsyCore::SparseTimeRange::add(), GeopsyCore::SubSignalPool::at(), GeopsyCore::Signal::componentUserName(), GeopsyCore::SubSignalPool::count(), GeopsyCore::TimeRange::end(), QGpCoreTools::endl(), GeopsyCore::SubSignalPool::first(), SciFigs::GraphContentLayer::graphContent(), GeopsyCore::SparseTimeRange::intersection(), GeopsyCore::SparseTimeRange::invert(), GeopsyCore::SubSignalPool::isEmpty(), GeopsyCore::TimeRange::lengthSeconds(), MSG_ID, GeopsyCore::StationSignals::name(), GeopsyCore::StationList::nComponents(), SciFigs::GraphContent::options(), GeopsyCore::StationSignals::originals(), GeopsyCore::SparseTimeRange::ranges(), GeopsyCore::SparseTimeRange::removeGaps(), GeopsyCore::TimeRange::start(), subPool(), GeopsyCore::Signal::timeRange(), QGpCoreTools::tr(), TRACE, SciFigs::GraphContentOptions::xVisMax(), and SciFigs::GraphContentOptions::xVisMin().

{
  TRACE;
  QFile f(fileName);
  if(!f.open(QIODevice::WriteOnly)) {
    Message::warning(MSG_ID, tr("Export gaps"), tr("Cannot write to file '%1'.").arg(fileName));
    return;
  }
  QTextStream s(&f);
  const GraphContentOptions& gc=graphContent()->options();
  TimeRange gcLimits(gc.xVisMin(), gc.xVisMax());
  s << tr("Gaps from %1 to %2").arg(Number::secondsToTime(gcLimits.start()))
                               .arg(Number::secondsToTime(gcLimits.end())) << endl;
  s << tr("All gaps smaller than %1 seconds are ignored").arg(_minimumGap) << endl;
  int nStations=_stations.count();
  int nComp=_stations.nComponents();
  for(int iStat=0;iStat<nStations;iStat++) {
    StationSignals * stat=_stations.at(iStat);
    s << tr("Station %1").arg(stat->name()) << endl;
    for(int iComp=0;iComp<nComp;iComp++) {
      const SubSignalPool& subPool=stat->originals(iComp);
      if(!subPool.isEmpty()) {
        s << tr("  Component %1").arg(subPool.first()->componentUserName()) << endl;
      }
      // Compute available range (green)
      SparseTimeRange compRange;
      int nSigs=subPool.count();
      for(int iSig=0;iSig<nSigs;iSig++) {
        compRange.add(subPool.at(iSig)->timeRange().intersection(gcLimits), false);
      }
      if(_minimumGap>0.0) {
        compRange.removeGaps(_minimumGap);
      }
      // Compute non available range (red)
      compRange=compRange.invert(gcLimits);
      const QVector<TimeRange> rs=compRange.ranges();
      int n=rs.count();
      for(int i=0;i<n;i++) {
        const TimeRange& r=rs.at(i);
        s << tr("    %1 from %2 to %3")
             .arg(Number::secondsToTime(r.lengthSeconds()))
             .arg(Number::secondsToTime(r.start()))
             .arg(Number::secondsToTime(r.end())) << endl;
      }
    }
  }

}
virtual bool GeopsyGui::ChronogramLayer::hasProperties ( ) [inline, virtual]

Reimplemented from SciFigs::GraphContentLayer.

{return true;}
int GeopsyGui::ChronogramLayer::hitCount ( ) const [inline]

Referenced by ChronogramWindow::updateLabels().

{return _stations.count()*_stations.nComponents();}
QString GeopsyGui::ChronogramLayer::name ( int  index) const

References GeopsyCore::StationList::component(), GeopsyCore::StationList::nComponents(), and TRACE.

Referenced by ChronogramWindow::updateLabels().

{
  TRACE;
  int nComp=_stations.nComponents();
  int iStat=index/nComp;
  int iComp=index-iStat*nComp;
  QString compString=Signal::componentLetter(_stations.component(iComp));
  return _stations.at(iStat)->name()+" "+compString;
}
void GeopsyGui::ChronogramLayer::paintData ( const LayerPainterRequest lp,
QPainter &  p,
double  dotpercm 
) const [protected, virtual]

Implements SciFigs::GraphContentLayer.

References GeopsyCore::SparseTimeRange::intersection(), GeopsyCore::SparseTimeRange::invert(), SciFigs::LayerPainterRequest::options(), GeopsyCore::SparseTimeRange::remove(), GeopsyCore::SparseTimeRange::removeBlocks(), GeopsyCore::SparseTimeRange::removeGaps(), TRACE, SciFigs::GraphContentOptions::xVisMax(), and SciFigs::GraphContentOptions::xVisMin().

{
  TRACE;
  const GraphContentOptions& gc = lp.options();
  TimeRange gcLimits(gc.xVisMin(), gc.xVisMax());
  int n=_ranges.count();
  for(int i=0; i<n; i++) {
    const StationRange& r=_ranges.at(i);
    // Draws unselected available range (light green)
    SparseTimeRange t=r._available.intersection(gcLimits);
    t.remove(r._selected);
    t.removeGaps(_minimumGap);
    drawRanges(gc, p, t, i+1, -0.45, -0.15, QColor(200, 255, 193, 128), QColor(152, 238, 77));
    // Draws selected available range (dark green)
    t=r._selected.intersection(gcLimits);
    t.removeGaps(_minimumGap);
    drawRanges(gc, p, t, i+1, -0.45, -0.15, QColor(103, 229, 87, 128), QColor(152, 238, 77));
    // Draws non available range (red)
    t=r._available.invert(gcLimits);
    t.removeBlocks(_minimumGap);
    drawRanges(gc, p, t, i+1, -0.15, 0.15, QColor(254, 156, 158, 128), QColor(255, 75, 78));
    // Draws overlapping range (blue)
    t=r._overlap.intersection(gcLimits);
    t.removeBlocks(_minimumGap);
    drawRanges(gc, p, t, i+1, 0.15, 0.45, QColor(158, 156, 254, 128), QColor(78, 75, 255));
  }
}

References GeopsyCore::Signal::add(), GeopsyCore::SubSignalPool::at(), GeopsyCore::SubSignalPool::count(), GeopsyCore::SparseTimeRange::intersection(), GeopsyCore::StationList::nComponents(), GeopsyCore::StationSignals::originals(), subPool(), GeopsyCore::Signal::timeRange(), and TRACE.

Referenced by ChronogramWindow::refreshSignal(), and subPoolUpdate().

{
  TRACE;
  _ranges.clear();
  int nStations=_stations.count();
  int nComp=_stations.nComponents();
  for(int iStat=0; iStat<nStations; iStat++) {
    StationSignals * stat=_stations.at(iStat);
    for(int iComp=0; iComp<nComp; iComp++) {
      const SubSignalPool& subPool=stat->originals(iComp);
      StationRange ranges;
      // Computes available range (green)
      int nSigs=subPool.count();
      for (int iSig=0; iSig<nSigs; iSig++) {
        ranges._available.add(subPool.at(iSig)->timeRange(), false);
      }
      // Computes overlapping range (blue)
      for (int iSig=1; iSig<nSigs; iSig++) {
        Signal * sig0=subPool.at(iSig-1);
        Signal * sig1=subPool.at(iSig);
        ranges._overlap.add(sig0->timeRange().intersection(sig1->timeRange()));
      }
      _ranges.append(ranges);
    }
  }
}

Clean property editor

Reimplemented from SciFigs::GraphContentLayer.

References QGpGuiTools::PropertyProxy::removeTab().

{
  pp->removeTab(_tab, this);
}

References GeopsyCore::SubSignalPool::addSignal(), GeopsyCore::SubSignalPool::at(), GeopsyCore::SubSignalPool::count(), GeopsyCore::StationList::nComponents(), GeopsyCore::StationSignals::originals(), subPool(), GeopsyCore::Signal::timeRange(), and TRACE.

Referenced by ChronogramWindow::getSelection().

{
  TRACE;
  SubSignalPool sel;
  int nStations=_stations.count();
  int nComp=_stations.nComponents();
  int i=0;
  for(int iStat=0; iStat<nStations; iStat++) {
    StationSignals * stat=_stations.at(iStat);
    for(int iComp=0; iComp<nComp; iComp++) {
      const StationRange& r=_ranges.at(i);
      const SubSignalPool& subPool=stat->originals(iComp);
      // Computes available range (green)
      int nSigs=subPool.count();
      for (int iSig=0; iSig<nSigs; iSig++) {
        Signal * sig=subPool.at(iSig);
        if(r._selected.intersects(sig->timeRange())) {
          sel.addSignal(sig);
        }
      }
      i++;
    }
  }
  return sel;
}
void GeopsyGui::ChronogramLayer::setProperty ( uint  wid,
int  pid,
QVariant  val 
) [virtual]

References GeopsyCore::StationList::addSignals(), rangeUpdate(), subPool(), and TRACE.

Referenced by ChronogramWindow::subPoolUpdate(), and xml_polishChild().

{
  TRACE;
  LayerLocker ll(this);
  if(subPool) {
    _subPool=subPool;
    _subPoolOwner=false;
  }
  qDeleteAll(_stations);
  _stations.clear();
  if(!_subPool) {
    return;
  }
  StationSignals::organizeSubPool(_subPool);
  if(_stations.addSignals(_subPool)) {
    rangeUpdate();
  } else {
    qDeleteAll(_stations);
    _stations.clear();
    _subPool=0;
  }
}
bool GeopsyGui::ChronogramLayer::trackRectangle ( int  id,
double  rx1,
double  ry1,
double  rx2,
double  ry2,
Qt::KeyboardModifiers  m 
) [virtual]

Reimplemented from SciFigs::GraphContentLayer.

References CHRONOGRAMLAYER_TRACKING_ID, SciFigs::GraphContentLayer::deepUpdate(), and TRACE.

{
  TRACE;
  if(id!=CHRONOGRAMLAYER_TRACKING_ID) {
    return false;
  }
  if(!(m & Qt::SHIFT)) {
    for(int i=_ranges.count()-1; i>=0; i--) {
      _ranges[i]._selected.clear();
    }
  }

  // Get min and max Y indexes
  if(ry1>ry2) {
    std::swap(ry1, ry2);
  }
  int min=(int)ceil(ry1+0.15)-1;
  if(min<0) {
    min=0;
  }
  int max=(int)floor(ry2+0.45)-1;
  if(max>=_ranges.count()) {
    max=_ranges.count()-1;
  }
  TimeRange rect(rx1, rx2);
  for(int i=min; i<=max; i++) {
    StationRange& r=_ranges[i];
    r._selected.add(r._available.hit(rect), true);
  }
  deepUpdate();
  return true;
}

Re-implement this function to offer XML restore (children and properties) support to your class.

From tag and map (with contains the attibute value) return a unique identifier under the format of a XMLMember. XMLMember is initialized with 3 types of contructors:

  • An integer: id number of a property
  • A XMLClass * : a child of this object identified by tag
  • Default constructor: error, unknow child or property

Map of attributes can be inspected in this way (can be achived also in xml_setProperty()):

    static const QString tmp("childrenName");
    XMLRestoreAttributeIterator it=map.find(tmp);
    if(it!=map.end()) {
      // found attribute "childrenName"
    }

If the map of attributes is not used:

    Q_UNUSED(attributes);
    if(tag=="x1") return XMLMember(0);
    else if(tag=="y1") return XMLMember(1);
    else if(tag=="x2") return XMLMember(2);
    else if(tag=="y2") return XMLMember(3);
    else return XMLMember(XMLMember::Unknown);

Arithmetic operations + and - apply to XMLMember to avoid confusion of property id numbers between inherited objects. Offset 3 corresponds to the number of properties defined in this object.

    if(tag=="anInteger") return XMLMember(0);
    else if(tag=="aString") return XMLMember(1);
    else if(tag=="aDouble") return XMLMember(2);
    return AbstractLine::xml_member(tag, attributes, context)+3;

For the arguments of this function use Macro XML_MEMBER_ARGS.

Reimplemented from SciFigs::GraphContentLayer.

References SciFigs::XMLSciFigs::data(), and TRACE.

{
  TRACE;
  Q_UNUSED(attributes);
  XMLSciFigs * scifigsContext=static_cast<XMLSciFigs *>(context);
  if(scifigsContext->data()) {
    if(tag==XMLSubSignalPool::xmlSubSignalPoolTag) {
      return XMLMember(new XMLSubSignalPool, true);
    }
  }
  return GraphContentLayer::xml_member(tag, attributes, context);
}

Reimplemented from QGpCoreTools::XMLClass.

References GeopsyCore::XMLSubSignalPool::subPool(), subPool(), subPoolUpdate(), and TRACE.

{
  TRACE;
  Q_UNUSED(context);
  if(child->xml_tagName()==XMLSubSignalPool::xmlSubSignalPoolTag) {
    XMLSubSignalPool * subPool=static_cast<XMLSubSignalPool *>(child);
    if(_subPoolOwner) delete _subPool;
    _subPool=subPool->subPool();
    _subPoolOwner=true;
    subPoolUpdate();
  }
}
virtual const QString& GeopsyGui::ChronogramLayer::xml_tagName ( ) const [inline, virtual]

Reimplemented from SciFigs::GraphContentLayer.

Reimplemented from QGpCoreTools::XMLClass.

References SciFigs::XMLSciFigs::data(), subPool(), TRACE, and QGpCoreTools::XMLClass::xml_save().

{
  TRACE;
  XMLSciFigs * scifigsContext=static_cast<XMLSciFigs *>(context);
  if(scifigsContext->data()) {
    XMLSubSignalPool subPool(*_subPool);
    subPool.xml_save(s, context);
  }
  GraphContentLayer::xml_writeChildren(s, context);
}

Member Data Documentation

const QString GeopsyGui::ChronogramLayer::xmlChronogramLayerTag = "ChronogramLayer" [static]

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