mirror of
https://gitlab.com/pholy/OSCAR-code.git
synced 2025-04-07 03:30:44 +00:00
Implemented first two yAxis zoom modes (double click on yAxis labels)
This commit is contained in:
parent
5596944dd6
commit
b3538bfaa2
@ -887,6 +887,7 @@ Layer::Layer(ChannelID code)
|
|||||||
m_day=NULL;
|
m_day=NULL;
|
||||||
m_miny=m_maxy=0;
|
m_miny=m_maxy=0;
|
||||||
m_minx=m_maxx=0;
|
m_minx=m_maxx=0;
|
||||||
|
m_physminy=m_physmaxy=0;
|
||||||
m_order=0;
|
m_order=0;
|
||||||
m_width=m_height=0;
|
m_width=m_height=0;
|
||||||
m_X=m_Y=0;
|
m_X=m_Y=0;
|
||||||
@ -1178,6 +1179,8 @@ gGraph::gGraph(gGraphView *graphview,QString title,QString units, int height,sho
|
|||||||
max_x=max_y=0;
|
max_x=max_y=0;
|
||||||
min_x=min_y=0;
|
min_x=min_y=0;
|
||||||
rec_miny=rec_maxy=0;
|
rec_miny=rec_maxy=0;
|
||||||
|
rphysmax_y=rphysmin_y=0;
|
||||||
|
m_zoomY=0;
|
||||||
|
|
||||||
if (graphview) {
|
if (graphview) {
|
||||||
graphview->addGraph(this,group);
|
graphview->addGraph(this,group);
|
||||||
@ -1279,6 +1282,13 @@ void gGraph::setDay(Day * day)
|
|||||||
ResetBounds();
|
ResetBounds();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void gGraph::setZoomY(short zoom)
|
||||||
|
{
|
||||||
|
m_zoomY=zoom;
|
||||||
|
redraw();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void gGraph::qglColor(QColor col)
|
void gGraph::qglColor(QColor col)
|
||||||
{
|
{
|
||||||
m_graphview->qglColor(col);
|
m_graphview->qglColor(col);
|
||||||
@ -1896,10 +1906,13 @@ qint64 gGraph::MinX()
|
|||||||
{
|
{
|
||||||
qint64 val=0,tmp;
|
qint64 val=0,tmp;
|
||||||
for (QVector<Layer *>::iterator l=m_layers.begin();l!=m_layers.end();l++) {
|
for (QVector<Layer *>::iterator l=m_layers.begin();l!=m_layers.end();l++) {
|
||||||
if ((*l)->isEmpty()) continue;
|
if ((*l)->isEmpty())
|
||||||
|
continue;
|
||||||
tmp=(*l)->Minx();
|
tmp=(*l)->Minx();
|
||||||
if (!tmp) continue;
|
if (!tmp)
|
||||||
if (!val || tmp < val) val = tmp;
|
continue;
|
||||||
|
if (!val || tmp < val)
|
||||||
|
val = tmp;
|
||||||
}
|
}
|
||||||
if (val) rmin_x=val;
|
if (val) rmin_x=val;
|
||||||
return val;
|
return val;
|
||||||
@ -1909,21 +1922,26 @@ qint64 gGraph::MaxX()
|
|||||||
//bool first=true;
|
//bool first=true;
|
||||||
qint64 val=0,tmp;
|
qint64 val=0,tmp;
|
||||||
for (QVector<Layer *>::iterator l=m_layers.begin();l!=m_layers.end();l++) {
|
for (QVector<Layer *>::iterator l=m_layers.begin();l!=m_layers.end();l++) {
|
||||||
if ((*l)->isEmpty()) continue;
|
if ((*l)->isEmpty())
|
||||||
|
continue;
|
||||||
tmp=(*l)->Maxx();
|
tmp=(*l)->Maxx();
|
||||||
//if (!tmp) continue;
|
//if (!tmp) continue;
|
||||||
if (!val || tmp > val) val = tmp;
|
if (!val || tmp > val)
|
||||||
|
val = tmp;
|
||||||
}
|
}
|
||||||
if (val) rmax_x=val;
|
if (val) rmax_x=val;
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
EventDataType gGraph::MinY()
|
EventDataType gGraph::MinY()
|
||||||
{
|
{
|
||||||
bool first=true;
|
bool first=true;
|
||||||
EventDataType val=0,tmp;
|
EventDataType val=0,tmp;
|
||||||
if (m_enforceMinY) return rmin_y=f_miny;
|
if (m_enforceMinY)
|
||||||
|
return rmin_y=f_miny;
|
||||||
for (QVector<Layer *>::iterator l=m_layers.begin();l!=m_layers.end();l++) {
|
for (QVector<Layer *>::iterator l=m_layers.begin();l!=m_layers.end();l++) {
|
||||||
if ((*l)->isEmpty()) continue;
|
if ((*l)->isEmpty())
|
||||||
|
continue;
|
||||||
tmp=(*l)->Miny();
|
tmp=(*l)->Miny();
|
||||||
if (tmp==0 && tmp==(*l)->Maxy())
|
if (tmp==0 && tmp==(*l)->Maxy())
|
||||||
continue;
|
continue;
|
||||||
@ -1931,7 +1949,8 @@ EventDataType gGraph::MinY()
|
|||||||
val=tmp;
|
val=tmp;
|
||||||
first=false;
|
first=false;
|
||||||
} else {
|
} else {
|
||||||
if (tmp < val) val = tmp;
|
if (tmp < val)
|
||||||
|
val = tmp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return rmin_y=val;
|
return rmin_y=val;
|
||||||
@ -1940,21 +1959,67 @@ EventDataType gGraph::MaxY()
|
|||||||
{
|
{
|
||||||
bool first=true;
|
bool first=true;
|
||||||
EventDataType val=0,tmp;
|
EventDataType val=0,tmp;
|
||||||
if (m_enforceMaxY) return rmax_y=f_maxy;
|
if (m_enforceMaxY)
|
||||||
|
return rmax_y=f_maxy;
|
||||||
for (QVector<Layer *>::iterator l=m_layers.begin();l!=m_layers.end();l++) {
|
for (QVector<Layer *>::iterator l=m_layers.begin();l!=m_layers.end();l++) {
|
||||||
if ((*l)->isEmpty()) continue;
|
if ((*l)->isEmpty())
|
||||||
|
continue;
|
||||||
tmp=(*l)->Maxy();
|
tmp=(*l)->Maxy();
|
||||||
if (tmp==0 && tmp==(*l)->Miny()) continue;
|
if (tmp==0 && tmp==(*l)->Miny())
|
||||||
|
continue;
|
||||||
if (first) {
|
if (first) {
|
||||||
val=tmp;
|
val=tmp;
|
||||||
first=false;
|
first=false;
|
||||||
} else {
|
} else {
|
||||||
if (tmp > val) val = tmp;
|
if (tmp > val)
|
||||||
|
val = tmp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return rmax_y=val;
|
return rmax_y=val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EventDataType gGraph::physMinY()
|
||||||
|
{
|
||||||
|
bool first=true;
|
||||||
|
EventDataType val=0,tmp;
|
||||||
|
//if (m_enforceMinY) return rmin_y=f_miny;
|
||||||
|
for (QVector<Layer *>::iterator l=m_layers.begin();l!=m_layers.end();l++) {
|
||||||
|
if ((*l)->isEmpty())
|
||||||
|
continue;
|
||||||
|
tmp=(*l)->physMiny();
|
||||||
|
if (tmp==0 && tmp==(*l)->physMaxy())
|
||||||
|
continue;
|
||||||
|
if (first) {
|
||||||
|
val=tmp;
|
||||||
|
first=false;
|
||||||
|
} else {
|
||||||
|
if (tmp < val)
|
||||||
|
val = tmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return rphysmin_y=val;
|
||||||
|
}
|
||||||
|
EventDataType gGraph::physMaxY()
|
||||||
|
{
|
||||||
|
bool first=true;
|
||||||
|
EventDataType val=0,tmp;
|
||||||
|
// if (m_enforceMaxY) return rmax_y=f_maxy;
|
||||||
|
for (QVector<Layer *>::iterator l=m_layers.begin();l!=m_layers.end();l++) {
|
||||||
|
if ((*l)->isEmpty())
|
||||||
|
continue;
|
||||||
|
tmp=(*l)->physMaxy();
|
||||||
|
if (tmp==0 && tmp==(*l)->physMiny())
|
||||||
|
continue;
|
||||||
|
if (first) {
|
||||||
|
val=tmp;
|
||||||
|
first=false;
|
||||||
|
} else {
|
||||||
|
if (tmp > val)
|
||||||
|
val = tmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return rphysmax_y=val;
|
||||||
|
}
|
||||||
void gGraph::SetMinX(qint64 v)
|
void gGraph::SetMinX(qint64 v)
|
||||||
{
|
{
|
||||||
rmin_x=min_x=v;
|
rmin_x=min_x=v;
|
||||||
@ -2216,6 +2281,7 @@ void gGraph::ToolTip(QString text, int x, int y, int timeout)
|
|||||||
m_graphview->m_tooltip->display(text,x,y,timeout);
|
m_graphview->m_tooltip->display(text,x,y,timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// YAxis Autoscaling code
|
||||||
void gGraph::roundY(EventDataType &miny, EventDataType &maxy)
|
void gGraph::roundY(EventDataType &miny, EventDataType &maxy)
|
||||||
{
|
{
|
||||||
int m,t;
|
int m,t;
|
||||||
@ -3936,7 +4002,7 @@ void MyScrollBar::SendWheelEvent(QWheelEvent * e)
|
|||||||
}
|
}
|
||||||
|
|
||||||
const quint32 gvmagic=0x41756728;
|
const quint32 gvmagic=0x41756728;
|
||||||
const quint16 gvversion=0;
|
const quint16 gvversion=1;
|
||||||
|
|
||||||
void gGraphView::SaveSettings(QString title)
|
void gGraphView::SaveSettings(QString title)
|
||||||
{
|
{
|
||||||
@ -3957,6 +4023,7 @@ void gGraphView::SaveSettings(QString title)
|
|||||||
out << m_graphs[i]->visible();
|
out << m_graphs[i]->visible();
|
||||||
out << m_graphs[i]->RecMinY();
|
out << m_graphs[i]->RecMinY();
|
||||||
out << m_graphs[i]->RecMaxY();
|
out << m_graphs[i]->RecMaxY();
|
||||||
|
out << m_graphs[i]->zoomY();
|
||||||
}
|
}
|
||||||
|
|
||||||
f.close();
|
f.close();
|
||||||
@ -3994,6 +4061,8 @@ bool gGraphView::LoadSettings(QString title)
|
|||||||
bool vis;
|
bool vis;
|
||||||
EventDataType recminy,recmaxy;
|
EventDataType recminy,recmaxy;
|
||||||
|
|
||||||
|
short zoomy=0;
|
||||||
|
|
||||||
QVector<gGraph *> neworder;
|
QVector<gGraph *> neworder;
|
||||||
QHash<QString,gGraph *>::iterator gi;
|
QHash<QString,gGraph *>::iterator gi;
|
||||||
|
|
||||||
@ -4003,6 +4072,9 @@ bool gGraphView::LoadSettings(QString title)
|
|||||||
in >> vis;
|
in >> vis;
|
||||||
in >> recminy;
|
in >> recminy;
|
||||||
in >> recmaxy;
|
in >> recmaxy;
|
||||||
|
if (gvversion>=1) {
|
||||||
|
in >> zoomy;
|
||||||
|
}
|
||||||
gi=m_graphsbytitle.find(name);
|
gi=m_graphsbytitle.find(name);
|
||||||
if (gi==m_graphsbytitle.end()) {
|
if (gi==m_graphsbytitle.end()) {
|
||||||
qDebug() << "Graph" << name << "has been renamed or removed";
|
qDebug() << "Graph" << name << "has been renamed or removed";
|
||||||
@ -4013,6 +4085,7 @@ bool gGraphView::LoadSettings(QString title)
|
|||||||
g->setVisible(vis);
|
g->setVisible(vis);
|
||||||
g->setRecMinY(recminy);
|
g->setRecMinY(recminy);
|
||||||
g->setRecMaxY(recmaxy);
|
g->setRecMaxY(recmaxy);
|
||||||
|
g->setZoomY(zoomy);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -306,6 +306,12 @@ public:
|
|||||||
//! \brief Return this layers physical maximum Yaxis value
|
//! \brief Return this layers physical maximum Yaxis value
|
||||||
virtual EventDataType Maxy() { return m_maxy; }
|
virtual EventDataType Maxy() { return m_maxy; }
|
||||||
|
|
||||||
|
//! \brief Return this layers physical minimum Yaxis value
|
||||||
|
virtual EventDataType physMiny() { return m_physminy; }
|
||||||
|
|
||||||
|
//! \brief Return this layers physical maximum Yaxis value
|
||||||
|
virtual EventDataType physMaxy() { return m_physmaxy; }
|
||||||
|
|
||||||
//! \brief Set this layers physical minimum date boundary
|
//! \brief Set this layers physical minimum date boundary
|
||||||
virtual void setMinX(qint64 val) { m_minx=val; }
|
virtual void setMinX(qint64 val) { m_minx=val; }
|
||||||
|
|
||||||
@ -373,6 +379,7 @@ protected:
|
|||||||
bool m_movable;
|
bool m_movable;
|
||||||
qint64 m_minx,m_maxx;
|
qint64 m_minx,m_maxx;
|
||||||
EventDataType m_miny,m_maxy;
|
EventDataType m_miny,m_maxy;
|
||||||
|
EventDataType m_physminy, m_physmaxy;
|
||||||
ChannelID m_code;
|
ChannelID m_code;
|
||||||
short m_width; // reserved x pixels needed for this layer. 0==Depends on position..
|
short m_width; // reserved x pixels needed for this layer. 0==Depends on position..
|
||||||
short m_height; // reserved y pixels needed for this layer. both 0 == expand to all free area.
|
short m_height; // reserved y pixels needed for this layer. both 0 == expand to all free area.
|
||||||
@ -643,6 +650,13 @@ public:
|
|||||||
//! \brief Returns the physical Maximum Y scale value for all layers contained
|
//! \brief Returns the physical Maximum Y scale value for all layers contained
|
||||||
virtual EventDataType MaxY();
|
virtual EventDataType MaxY();
|
||||||
|
|
||||||
|
//! \brief Returns the physical Minimum Y scale value for all layers contained
|
||||||
|
virtual EventDataType physMinY();
|
||||||
|
|
||||||
|
//! \brief Returns the physical Maximum Y scale value for all layers contained
|
||||||
|
virtual EventDataType physMaxY();
|
||||||
|
|
||||||
|
|
||||||
//! \brief Sets the physical start of this graphs time range (in milliseconds since epoch)
|
//! \brief Sets the physical start of this graphs time range (in milliseconds since epoch)
|
||||||
virtual void SetMinX(qint64 v);
|
virtual void SetMinX(qint64 v);
|
||||||
|
|
||||||
@ -679,6 +693,7 @@ public:
|
|||||||
|
|
||||||
qint64 max_x,min_x,rmax_x,rmin_x;
|
qint64 max_x,min_x,rmax_x,rmin_x;
|
||||||
EventDataType max_y,min_y,rmax_y,rmin_y, f_miny, f_maxy, rec_miny, rec_maxy;
|
EventDataType max_y,min_y,rmax_y,rmin_y, f_miny, f_maxy, rec_miny, rec_maxy;
|
||||||
|
EventDataType rphysmin_y, rphysmax_y;
|
||||||
|
|
||||||
// not sure why there's two.. I can't remember
|
// not sure why there's two.. I can't remember
|
||||||
void setEnforceMinY(bool b) { m_enforceMinY=b; }
|
void setEnforceMinY(bool b) { m_enforceMinY=b; }
|
||||||
@ -764,6 +779,11 @@ public:
|
|||||||
|
|
||||||
gGraphView * graphView() { return m_graphview; }
|
gGraphView * graphView() { return m_graphview; }
|
||||||
short m_marginleft, m_marginright, m_margintop, m_marginbottom;
|
short m_marginleft, m_marginright, m_margintop, m_marginbottom;
|
||||||
|
|
||||||
|
short zoomY() { return m_zoomY; }
|
||||||
|
void setZoomY(short zoom);
|
||||||
|
|
||||||
|
static const short maxZoomY=2;
|
||||||
protected:
|
protected:
|
||||||
//void invalidate();
|
//void invalidate();
|
||||||
|
|
||||||
@ -812,6 +832,8 @@ protected:
|
|||||||
bool m_showTitle;
|
bool m_showTitle;
|
||||||
bool m_printing;
|
bool m_printing;
|
||||||
|
|
||||||
|
short m_zoomY;
|
||||||
|
|
||||||
QRect m_rect;
|
QRect m_rect;
|
||||||
signals:
|
signals:
|
||||||
|
|
||||||
|
@ -48,6 +48,7 @@ void gLineChart::SetDay(Day *d)
|
|||||||
|
|
||||||
m_minx=0,m_maxx=0;
|
m_minx=0,m_maxx=0;
|
||||||
m_miny=0,m_maxy=0;
|
m_miny=0,m_maxy=0;
|
||||||
|
m_physminy=0, m_physmaxy=0;
|
||||||
|
|
||||||
if (!d)
|
if (!d)
|
||||||
return;
|
return;
|
||||||
@ -66,17 +67,27 @@ void gLineChart::SetDay(Day *d)
|
|||||||
int i=5;
|
int i=5;
|
||||||
}
|
}
|
||||||
if (first) {
|
if (first) {
|
||||||
m_miny=sess->physMin(code);
|
m_miny=sess->Min(code);
|
||||||
m_maxy=sess->physMax(code);
|
m_maxy=sess->Max(code);
|
||||||
|
m_physminy=sess->physMin(code);
|
||||||
|
m_physmaxy=sess->physMax(code);
|
||||||
m_minx=sess->first(code);
|
m_minx=sess->first(code);
|
||||||
m_maxx=sess->last(code);
|
m_maxx=sess->last(code);
|
||||||
first=false;
|
first=false;
|
||||||
} else {
|
} else {
|
||||||
tmp=sess->physMin(code);
|
tmp=sess->physMin(code);
|
||||||
|
if (m_physminy > tmp)
|
||||||
|
m_physminy=tmp;
|
||||||
|
|
||||||
|
tmp=sess->physMax(code);
|
||||||
|
if (m_physmaxy < tmp)
|
||||||
|
m_physmaxy=tmp;
|
||||||
|
|
||||||
|
tmp=sess->Min(code);
|
||||||
if (m_miny > tmp)
|
if (m_miny > tmp)
|
||||||
m_miny=tmp;
|
m_miny=tmp;
|
||||||
|
|
||||||
tmp=sess->physMax(code);
|
tmp=sess->Max(code);
|
||||||
if (m_maxy < tmp)
|
if (m_maxy < tmp)
|
||||||
m_maxy=tmp;
|
m_maxy=tmp;
|
||||||
|
|
||||||
@ -134,7 +145,7 @@ void gLineChart::paint(gGraph & w,int left, int top, int width, int height)
|
|||||||
// lines=w.lines();
|
// lines=w.lines();
|
||||||
EventDataType miny,maxy;
|
EventDataType miny,maxy;
|
||||||
double minx,maxx;
|
double minx,maxx;
|
||||||
miny=w.min_y, maxy=w.max_y;
|
|
||||||
|
|
||||||
if (w.blockZoom()) {
|
if (w.blockZoom()) {
|
||||||
minx=w.rmin_x, maxx=w.rmax_x;
|
minx=w.rmin_x, maxx=w.rmax_x;
|
||||||
@ -148,9 +159,13 @@ void gLineChart::paint(gGraph & w,int left, int top, int width, int height)
|
|||||||
miny=-MAX(fabs(miny),fabs(maxy));
|
miny=-MAX(fabs(miny),fabs(maxy));
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
|
if (w.zoomY()==0) {
|
||||||
|
miny=m_physminy;
|
||||||
|
maxy=m_physmaxy;
|
||||||
|
} else {
|
||||||
|
miny=w.min_y, maxy=w.max_y;
|
||||||
w.roundY(miny,maxy);
|
w.roundY(miny,maxy);
|
||||||
|
}
|
||||||
|
|
||||||
double xx=maxx-minx;
|
double xx=maxx-minx;
|
||||||
double xmult=double(width)/xx;
|
double xmult=double(width)/xx;
|
||||||
|
@ -263,14 +263,23 @@ void gYAxis::paint(gGraph & w,int left,int top, int width, int height)
|
|||||||
if (height>2000) return;
|
if (height>2000) return;
|
||||||
int labelW=0;
|
int labelW=0;
|
||||||
|
|
||||||
EventDataType miny=w.min_y;
|
EventDataType miny;
|
||||||
EventDataType maxy=w.max_y;
|
EventDataType maxy;
|
||||||
|
|
||||||
|
if (w.zoomY()==0) {
|
||||||
|
miny=w.physMinY();
|
||||||
|
maxy=w.physMaxY();
|
||||||
|
} else {
|
||||||
|
|
||||||
|
miny=w.min_y;
|
||||||
|
maxy=w.max_y;
|
||||||
|
|
||||||
if (miny<0) { // even it up if it's starts negative
|
if (miny<0) { // even it up if it's starts negative
|
||||||
miny=-MAX(fabs(miny),fabs(maxy));
|
miny=-MAX(fabs(miny),fabs(maxy));
|
||||||
}
|
}
|
||||||
|
|
||||||
w.roundY(miny,maxy);
|
w.roundY(miny,maxy);
|
||||||
|
}
|
||||||
|
|
||||||
EventDataType dy=maxy-miny;
|
EventDataType dy=maxy-miny;
|
||||||
|
|
||||||
@ -378,7 +387,9 @@ bool gYAxis::mouseDoubleClickEvent(QMouseEvent * event, gGraph * graph)
|
|||||||
|
|
||||||
int x=event->x();
|
int x=event->x();
|
||||||
int y=event->y();
|
int y=event->y();
|
||||||
qDebug() << "Mouse double clicked for" << graph->title() << x << y << m_rect;
|
short z=(graph->zoomY()+1) % gGraph::maxZoomY;
|
||||||
|
graph->setZoomY(z);
|
||||||
|
qDebug() << "Mouse double clicked for" << graph->title() << z;
|
||||||
}
|
}
|
||||||
Q_UNUSED(event);
|
Q_UNUSED(event);
|
||||||
return false;
|
return false;
|
||||||
|
@ -43,7 +43,7 @@ Machine::Machine(Profile *p,MachineID id)
|
|||||||
}
|
}
|
||||||
Machine::~Machine()
|
Machine::~Machine()
|
||||||
{
|
{
|
||||||
qDebug() << "Destroy Machine";
|
qDebug() << "Destroy Machine" << m_class;
|
||||||
for (QMap<QDate,Day *>::iterator d=day.begin();d!=day.end();d++) {
|
for (QMap<QDate,Day *>::iterator d=day.begin();d!=day.end();d++) {
|
||||||
delete d.value();
|
delete d.value();
|
||||||
}
|
}
|
||||||
|
@ -140,9 +140,9 @@ QToolButton:pressed {
|
|||||||
</property>
|
</property>
|
||||||
<property name="styleSheet">
|
<property name="styleSheet">
|
||||||
<string notr="true">QToolButton {
|
<string notr="true">QToolButton {
|
||||||
border: 2px solid #dddddd;
|
border: 2px solid #aaaaaa;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
background: transparent;
|
background: white;
|
||||||
}
|
}
|
||||||
|
|
||||||
QToolButton:hover {
|
QToolButton:hover {
|
||||||
@ -845,9 +845,6 @@ QSlider::handle:horizontal {
|
|||||||
<string>Bookmarks</string>
|
<string>Bookmarks</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||||
<property name="spacing">
|
|
||||||
<number>6</number>
|
|
||||||
</property>
|
|
||||||
<property name="margin">
|
<property name="margin">
|
||||||
<number>4</number>
|
<number>4</number>
|
||||||
</property>
|
</property>
|
||||||
|
Loading…
Reference in New Issue
Block a user