Skip to content
Snippets Groups Projects
Commit d68e5dd1 authored by Mikhail Svechnikov's avatar Mikhail Svechnikov
Browse files

MaskItems: add r/w

parent 02b13630
No related branches found
No related tags found
No related merge requests found
Pipeline #84116 failed
This commit is part of merge request !1208. Comments created here will be created in the context of that merge request.
......@@ -40,7 +40,28 @@ MaskItem* MaskItemCatalog::create(Type type)
QVector<MaskItemCatalog::Type> MaskItemCatalog::types()
{
return {Type::RegionOfInterest, Type::Rectangle, Type::Polygon, Type::VerticalLine,
Type::HorizontalLine, Type::MaskAll, Type::Ellipse};
Type::HorizontalLine, Type::MaskAll, Type::Ellipse};
}
MaskItemCatalog::UiInfo MaskItemCatalog::uiInfo(Type type)
{
switch (type) {
case Type::RegionOfInterest:
return {"Region of interest", ""};
case Type::Rectangle:
return {"Rectangle", ""};
case Type::Polygon:
return {"Polygon", ""};
case Type::VerticalLine:
return {"Vertical line", ""};
case Type::HorizontalLine:
return {"Horizontal line", ""};
case Type::MaskAll:
return {"Mask all", ""};
case Type::Ellipse:
return {"Ellipse", ""};
}
ASSERT(false);
}
MaskItemCatalog::Type MaskItemCatalog::type(const MaskItem* item)
......
......@@ -35,12 +35,20 @@ public:
Ellipse = 6
};
struct UiInfo {
QString menuEntry;
QString description;
};
//! Creates the item of the given type.
static MaskItem* create(Type type);
//! Available types of items.
static QVector<Type> types();
//! UiInfo on the given type.
static UiInfo uiInfo(Type type);
//! Returns the enum type of the given item.
static Type type(const MaskItem* item);
};
......
......@@ -17,7 +17,6 @@
#include "Device/Mask/Line.h"
#include "Device/Mask/Polygon.h"
#include "Device/Mask/Rectangle.h"
#include "GUI/Model/CatDevice/MaskItemCatalog.h"
#include "GUI/Model/Device/MaskItems.h"
#include "GUI/Model/Model/SessionModel.h"
#include "GUI/Support/XML/Serialize.h"
......@@ -36,6 +35,14 @@ const QString XUp("XUp");
const QString YUp("YUp");
const QString IsClosed("IsClosed");
const QString PolygonPoint("PolygonPoint");
const QString XPosition("XPosition");
const QString YPosition("YPosition");
const QString XCenter("XCenter");
const QString YCenter("YCenter");
const QString XRadius("XRadius");
const QString YRadius("YRadius");
const QString Angle("Angle");
const QString Mask("Mask");
} // namespace Tag
} // namespace
......@@ -62,6 +69,17 @@ QVector<MaskItem*> MaskContainerItem::maskItems() const
return result;
}
std::vector<SelectionProperty<MaskItemCatalog>> MaskContainerItem::maskItemSelections()
{
std::vector<SelectionProperty<MaskItemCatalog>> maskSelections;
SelectionProperty<MaskItemCatalog> newMaskSelection;
for (auto* maskItem : maskItems()) {
newMaskSelection.setCurrentItem(maskItem);
maskSelections.push_back(std::move(newMaskSelection));
}
return maskSelections;
}
void MaskContainerItem::insertMask(int row, MaskItem* maskItem)
{
insertChild(row, maskItem);
......@@ -577,20 +595,56 @@ void VerticalLineItem::setPosX(double val)
void VerticalLineItem::serialize(Streamer& s)
{
s.assertVersion(0);
Serialize::rwSessionItem<bool>(s, "maskValue", getItem(P_MASK_VALUE));
Serialize::rwSessionItem<bool>(s, "visible", getItem(P_IS_VISIBLE));
Serialize::rwSessionItem<double>(s, "x", getItem(P_POSX));
// s.assertVersion(0);
// Serialize::rwSessionItem<bool>(s, "maskValue", getItem(P_MASK_VALUE));
// Serialize::rwSessionItem<bool>(s, "visible", getItem(P_IS_VISIBLE));
// Serialize::rwSessionItem<double>(s, "x", getItem(P_POSX));
if (s.xmlReader())
readFrom(s.xmlReader());
else if (s.xmlWriter())
writeTo(s.xmlWriter());
}
void VerticalLineItem::writeTo(QXmlStreamWriter *w) const
{
XML::writeAttribute(w, XML::Attrib::version, uint(1));
// parameters from base class
w->writeStartElement(Tag::BaseData);
MaskItem::writeTo(w);
w->writeEndElement();
// x position
w->writeStartElement(Tag::XPosition);
XML::writeAttribute(w, XML::Attrib::value, posX());
w->writeEndElement();
}
void VerticalLineItem::readFrom(QXmlStreamReader *r)
{
const uint version = XML::readUIntAttribute(r, XML::Attrib::version);
Q_UNUSED(version)
while (r->readNextStartElement()) {
QString tag = r->name().toString();
// parameters from base class
if (tag == Tag::BaseData) {
MaskItem::readFrom(r);
XML::gotoEndElementOfTag(r, tag);
// x position
} else if (tag == Tag::XPosition) {
double xPos = 0;
XML::readAttribute(r, XML::Attrib::value, &xPos);
setPosX(xPos);
XML::gotoEndElementOfTag(r, tag);
} else
r->skipCurrentElement();
}
}
/* ------------------------------------------------------------------------- */
......@@ -620,20 +674,56 @@ void HorizontalLineItem::setPosY(double pos_y)
void HorizontalLineItem::serialize(Streamer& s)
{
s.assertVersion(0);
Serialize::rwSessionItem<bool>(s, "maskValue", getItem(P_MASK_VALUE));
Serialize::rwSessionItem<bool>(s, "visible", getItem(P_IS_VISIBLE));
Serialize::rwSessionItem<double>(s, "y", getItem(P_POSY));
// s.assertVersion(0);
// Serialize::rwSessionItem<bool>(s, "maskValue", getItem(P_MASK_VALUE));
// Serialize::rwSessionItem<bool>(s, "visible", getItem(P_IS_VISIBLE));
// Serialize::rwSessionItem<double>(s, "y", getItem(P_POSY));
if (s.xmlReader())
readFrom(s.xmlReader());
else if (s.xmlWriter())
writeTo(s.xmlWriter());
}
void HorizontalLineItem::writeTo(QXmlStreamWriter *w) const
{
XML::writeAttribute(w, XML::Attrib::version, uint(1));
// parameters from base class
w->writeStartElement(Tag::BaseData);
MaskItem::writeTo(w);
w->writeEndElement();
// y position
w->writeStartElement(Tag::YPosition);
XML::writeAttribute(w, XML::Attrib::value, posY());
w->writeEndElement();
}
void HorizontalLineItem::readFrom(QXmlStreamReader *r)
{
const uint version = XML::readUIntAttribute(r, XML::Attrib::version);
Q_UNUSED(version)
while (r->readNextStartElement()) {
QString tag = r->name().toString();
// parameters from base class
if (tag == Tag::BaseData) {
MaskItem::readFrom(r);
XML::gotoEndElementOfTag(r, tag);
// y position
} else if (tag == Tag::YPosition) {
double yPos = 0;
XML::readAttribute(r, XML::Attrib::value, &yPos);
setPosY(yPos);
XML::gotoEndElementOfTag(r, tag);
} else
r->skipCurrentElement();
}
}
/* ------------------------------------------------------------------------- */
......@@ -717,24 +807,108 @@ void EllipseItem::setAngle(const double val)
void EllipseItem::serialize(Streamer& s)
{
s.assertVersion(0);
Serialize::rwSessionItem<bool>(s, "maskValue", getItem(P_MASK_VALUE));
Serialize::rwSessionItem<bool>(s, "visible", getItem(P_IS_VISIBLE));
Serialize::rwSessionItem<double>(s, "x", getItem(P_XCENTER));
Serialize::rwSessionItem<double>(s, "y", getItem(P_YCENTER));
Serialize::rwSessionItem<double>(s, "xr", getItem(P_XRADIUS));
Serialize::rwSessionItem<double>(s, "yr", getItem(P_YRADIUS));
Serialize::rwSessionItem<double>(s, "angle", getItem(P_ANGLE));
// s.assertVersion(0);
// Serialize::rwSessionItem<bool>(s, "maskValue", getItem(P_MASK_VALUE));
// Serialize::rwSessionItem<bool>(s, "visible", getItem(P_IS_VISIBLE));
// Serialize::rwSessionItem<double>(s, "x", getItem(P_XCENTER));
// Serialize::rwSessionItem<double>(s, "y", getItem(P_YCENTER));
// Serialize::rwSessionItem<double>(s, "xr", getItem(P_XRADIUS));
// Serialize::rwSessionItem<double>(s, "yr", getItem(P_YRADIUS));
// Serialize::rwSessionItem<double>(s, "angle", getItem(P_ANGLE));
if (s.xmlReader())
readFrom(s.xmlReader());
else if (s.xmlWriter())
writeTo(s.xmlWriter());
}
void EllipseItem::writeTo(QXmlStreamWriter *w) const
{
XML::writeAttribute(w, XML::Attrib::version, uint(1));
// parameters from base class
w->writeStartElement(Tag::BaseData);
MaskItem::writeTo(w);
w->writeEndElement();
// x center
w->writeStartElement(Tag::XCenter);
XML::writeAttribute(w, XML::Attrib::value, xCenter());
w->writeEndElement();
// y center
w->writeStartElement(Tag::YCenter);
XML::writeAttribute(w, XML::Attrib::value, yCenter());
w->writeEndElement();
// x radius
w->writeStartElement(Tag::XRadius);
XML::writeAttribute(w, XML::Attrib::value, xRadius());
w->writeEndElement();
// y radius
w->writeStartElement(Tag::YRadius);
XML::writeAttribute(w, XML::Attrib::value, yRadius());
w->writeEndElement();
// rotation angle
w->writeStartElement(Tag::Angle);
XML::writeAttribute(w, XML::Attrib::value, angle());
w->writeEndElement();
}
void EllipseItem::readFrom(QXmlStreamReader *r)
{
const uint version = XML::readUIntAttribute(r, XML::Attrib::version);
Q_UNUSED(version)
while (r->readNextStartElement()) {
QString tag = r->name().toString();
// parameters from base class
if (tag == Tag::BaseData) {
MaskItem::readFrom(r);
XML::gotoEndElementOfTag(r, tag);
// x center
} else if (tag == Tag::XCenter) {
double xCenter = 0;
XML::readAttribute(r, XML::Attrib::value, &xCenter);
setXCenter(xCenter);
XML::gotoEndElementOfTag(r, tag);
// y center
} else if (tag == Tag::YCenter) {
double yCenter = 0;
XML::readAttribute(r, XML::Attrib::value, &yCenter);
setYCenter(yCenter);
XML::gotoEndElementOfTag(r, tag);
// x radius
} else if (tag == Tag::XRadius) {
double xRadius = 0;
XML::readAttribute(r, XML::Attrib::value, &xRadius);
setXRadius(xRadius);
XML::gotoEndElementOfTag(r, tag);
// y radius
} else if (tag == Tag::YRadius) {
double yRadius = 0;
XML::readAttribute(r, XML::Attrib::value, &yRadius);
setYRadius(yRadius);
XML::gotoEndElementOfTag(r, tag);
// rotation angle
} else if (tag == Tag::Angle) {
double angle = 0;
XML::readAttribute(r, XML::Attrib::value, &angle);
setAngle(angle);
XML::gotoEndElementOfTag(r, tag);
} else
r->skipCurrentElement();
}
}
/* ------------------------------------------------------------------------- */
......@@ -753,19 +927,14 @@ std::unique_ptr<IShape2D> MaskAllItem::createShape(double) const
void MaskAllItem::serialize(Streamer& s)
{
s.assertVersion(0);
Serialize::rwSessionItem<bool>(s, "maskValue", getItem(P_MASK_VALUE));
Serialize::rwSessionItem<bool>(s, "visible", getItem(P_IS_VISIBLE));
}
void MaskAllItem::writeTo(QXmlStreamWriter *w) const
{
}
void MaskAllItem::readFrom(QXmlStreamReader *r)
{
// s.assertVersion(0);
// Serialize::rwSessionItem<bool>(s, "maskValue", getItem(P_MASK_VALUE));
// Serialize::rwSessionItem<bool>(s, "visible", getItem(P_IS_VISIBLE));
if (s.xmlReader())
readFrom(s.xmlReader());
else if (s.xmlWriter())
writeTo(s.xmlWriter());
}
/* ------------------------------------------------------------------------- */
......@@ -802,26 +971,55 @@ void MaskItems::clear()
void MaskItems::serialize(Streamer& s)
{
QVector<MaskItem*> items;
if (!s.xmlReader())
items = maskItems();
// QVector<MaskItem*> items;
// if (!s.xmlReader())
// items = maskItems();
// s.assertVersion(0);
// Serialize::rwCatalogized<MaskItemCatalog>(s, "maskItems", items);
s.assertVersion(0);
Serialize::rwCatalogized<MaskItemCatalog>(s, "maskItems", items);
// if (s.xmlReader())
// for (auto m : items)
// m_maskContainer->addMask(m);
if (s.xmlReader())
for (auto m : items)
m_maskContainer->addMask(m);
readFrom(s.xmlReader());
else if (s.xmlWriter())
writeTo(s.xmlWriter());
}
void MaskItems::writeTo(QXmlStreamWriter *w) const
{
XML::writeAttribute(w, XML::Attrib::version, uint(1));
// masks
for (const auto& m : m_maskContainer->maskItemSelections()) {
w->writeStartElement(Tag::Mask);
m.writeTo(w);
w->writeEndElement();
}
}
void MaskItems::readFrom(QXmlStreamReader *r, MessageService *messageService)
void MaskItems::readFrom(QXmlStreamReader *r, MessageService *)
{
m_maskContainer->clear();
const uint version = XML::readUIntAttribute(r, XML::Attrib::version);
Q_UNUSED(version)
while (r->readNextStartElement()) {
QString tag = r->name().toString();
// mask
if (tag == Tag::Mask) {
SelectionProperty<MaskItemCatalog> sel;
sel.readFrom(r);
m_maskContainer->addMask(sel.currentItem());
XML::gotoEndElementOfTag(r, tag);
} else
r->skipCurrentElement();
}
}
MaskItemObject::MaskItemObject(const QString& modelType)
......
......@@ -16,6 +16,8 @@
#define BORNAGAIN_GUI_MODEL_DEVICE_MASKITEMS_H
#include "GUI/Model/BaseItem/SessionItem.h"
#include "GUI/Model/CatDevice/MaskItemCatalog.h"
#include "GUI/Model/Descriptor/SelectionProperty.h"
#include "GUI/Model/Model/SessionModel.h"
class IShape2D;
......@@ -221,8 +223,6 @@ public:
std::unique_ptr<IShape2D> createShape(double scale) const override;
void serialize(Streamer& s) override;
void writeTo(QXmlStreamWriter* w) const override;
void readFrom(QXmlStreamReader* r) override;
};
//! Container holding various masks as children
......@@ -235,6 +235,7 @@ public:
MaskContainerItem();
QVector<MaskItem*> maskItems() const;
std::vector<SelectionProperty<MaskItemCatalog>> maskItemSelections();
//! Insert mask at given row.
void insertMask(int row, MaskItem* maskItem);
......@@ -273,7 +274,7 @@ public:
void copy(const MaskContainerItem* maskContainer);
//! Removes all maskItems
void clear();
void clear() override;
void serialize(Streamer& s);
void writeTo(QXmlStreamWriter* w) const override;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment