File indexing completed on 2024-06-02 04:34:46
0001 /*************************************************************************** 0002 datastscalar.cpp - a scalar from a data source 0003 ------------------- 0004 begin : September, 2008 0005 copyright : (C) 2008 by cbn 0006 email : netterfield@astro.utoronto.ca 0007 ***************************************************************************/ 0008 0009 /*************************************************************************** 0010 * * 0011 * This program is free software; you can redistribute it and/or modify * 0012 * it under the terms of the GNU General Public License as published by * 0013 * the Free Software Foundation; either version 2 of the License, or * 0014 * (at your option) any later version. * 0015 * * 0016 ***************************************************************************/ 0017 #include "datascalar.h" 0018 0019 #include <QDebug> 0020 #include <QTextDocument> 0021 #include <QXmlStreamWriter> 0022 0023 0024 #include "debug.h" 0025 #include "objectstore.h" 0026 #include "scalarscriptinterface.h" 0027 0028 namespace Kst { 0029 0030 const QString DataScalar::staticTypeString = "Data Scalar"; 0031 const QString DataScalar::staticTypeTag = "datascalar"; 0032 0033 /** Create a DataVector: raw data from a file */ 0034 DataScalar::DataScalar(ObjectStore *store) 0035 : Scalar(store), DataPrimitive(this) { 0036 0037 setOrphan(true); 0038 } 0039 0040 0041 DataScalar::~DataScalar() { 0042 } 0043 0044 0045 QString DataScalar::_automaticDescriptiveName() const { 0046 QString name = _field; 0047 0048 // un-escape escaped special characters so they aren't escaped 2x. 0049 name.replace("\\_", "_").replace("\\^","^").replace("\\[", "[").replace("\\]", "]"); 0050 // now escape the special characters. 0051 name.replace('_', "\\_").replace('^', "\\^").replace('[', "\\[").replace(']', "\\]"); 0052 0053 return name; 0054 } 0055 0056 0057 const QString& DataScalar::typeString() const { 0058 return staticTypeString; 0059 } 0060 0061 ScriptInterface* DataScalar::createScriptInterface() { 0062 return new ScalarDataSI(this); 0063 } 0064 0065 0066 /** return true if it has a valid file and field, or false otherwise */ 0067 bool DataScalar::isValid() const { 0068 if (dataSource()) { 0069 dataSource()->readLock(); 0070 bool rc = dataSource()->scalar().isValid(_field); 0071 dataSource()->unlock(); 0072 return rc; 0073 } 0074 return false; 0075 } 0076 0077 bool DataScalar::checkValidity(const DataSourcePtr& ds) const { 0078 if (ds) { 0079 ds->readLock(); 0080 bool rc = ds->scalar().isValid(_field); 0081 ds->unlock(); 0082 return rc; 0083 } 0084 return false; 0085 } 0086 0087 void DataScalar::change(DataSourcePtr in_file, const QString &in_field) { 0088 Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED); 0089 0090 _field = in_field; 0091 setDataSource(in_file); 0092 } 0093 0094 void DataScalar::changeFile(DataSourcePtr in_file) { 0095 Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED); 0096 0097 if (!in_file) { 0098 Debug::self()->log(tr("Data file for scalar %1 was not opened.").arg(Name()), Debug::Warning); 0099 } 0100 setDataSource(in_file); 0101 } 0102 0103 0104 /** Save data scalar information */ 0105 void DataScalar::save(QXmlStreamWriter &s) { 0106 if (dataSource()) { 0107 s.writeStartElement("datascalar"); 0108 saveFilename(s); 0109 s.writeAttribute("field", _field); 0110 0111 saveNameInfo(s, SCALARNUM); 0112 s.writeEndElement(); 0113 } 0114 } 0115 0116 0117 /** Update a data Scalar */ 0118 void DataScalar::internalUpdate() { 0119 if (dataSource()) { 0120 dataSource()->writeLock(); 0121 ReadInfo readInfo(&_value); 0122 dataSource()->scalar().read(_field, readInfo); 0123 dataSource()->unlock(); 0124 } 0125 } 0126 0127 0128 PrimitivePtr DataScalar::makeDuplicate() const { 0129 Q_ASSERT(store()); 0130 DataScalarPtr scalar = store()->createObject<DataScalar>(); 0131 0132 scalar->writeLock(); 0133 scalar->change(dataSource(), _field); 0134 if (descriptiveNameIsManual()) { 0135 scalar->setDescriptiveName(descriptiveName()); 0136 } 0137 0138 scalar->registerChange(); 0139 scalar->unlock(); 0140 0141 return kst_cast<Primitive>(scalar); 0142 } 0143 0144 qint64 DataScalar::minInputSerial() const { 0145 if (dataSource()) { 0146 return (dataSource()->serial()); 0147 } 0148 return LLONG_MAX; 0149 } 0150 0151 qint64 DataScalar::maxInputSerialOfLastChange() const { 0152 if (dataSource()) { 0153 return (dataSource()->serialOfLastChange()); 0154 } 0155 return NoInputs; 0156 } 0157 0158 QString DataScalar::descriptionTip() const { 0159 QString IDstring; 0160 0161 IDstring = tr( 0162 "Data Scalar: %1 = %4\n" 0163 " %2\n" 0164 " Field: %3" 0165 ).arg(Name()).arg(dataSource()->fileName()).arg(_field).arg(value()); 0166 return IDstring; 0167 } 0168 0169 0170 QString DataScalar::propertyString() const { 0171 return tr("%2 of %1 = %3").arg(dataSource()->fileName()).arg(_field).arg(value()); 0172 } 0173 0174 void DataScalar::reload() { 0175 Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED); 0176 0177 if (dataSource()) { 0178 dataSource()->writeLock(); 0179 dataSource()->reset(); 0180 dataSource()->unlock(); 0181 reset(); 0182 registerChange(); 0183 } 0184 } 0185 0186 void DataScalar::reset() { 0187 ReadInfo readInfo(&_value); 0188 dataSource()->scalar().read(_field, readInfo); 0189 } 0190 0191 } 0192 // vim: ts=2 sw=2 et