162 lines
3.6 KiB
C++
162 lines
3.6 KiB
C++
/*
|
|
* Experimental code to use operators for constraint specification.
|
|
* In the end, the syntax didn't look much clearer than
|
|
* the original, so abandoned.
|
|
|
|
Example:
|
|
|
|
wxConstrain(frame->panel,
|
|
|
|
( leftOf (frame->panel) = leftOf (frame),
|
|
topOf (frame->panel) = topOf (frame),
|
|
rightOf (frame->panel) = rightOf (frame),
|
|
heightOf (frame->panel) = 50 % heightOf (frame)
|
|
)
|
|
);
|
|
*/
|
|
|
|
// Operator experiments
|
|
#define wxCONSTRAINT_OP_REL 1
|
|
#define wxCONSTRAINT_OP_PERCENT 2
|
|
#define wxCONSTRAINT_OP_EDGE 3
|
|
#define wxCONSTRAINT_OP_ABS 4
|
|
#define wxCONSTRAINT_OP_AND 5
|
|
|
|
class wxConstraintOp: public wxObject
|
|
{
|
|
public:
|
|
int opType;
|
|
wxEdge edge;
|
|
wxRelationship relationship;
|
|
wxWindow *win;
|
|
int value;
|
|
int margin;
|
|
wxConstraintOp *lhs;
|
|
wxConstraintOp *rhs;
|
|
wxConstraintOp(int typ)
|
|
{
|
|
opType = typ;
|
|
edge = wxLeft;
|
|
win = NULL;
|
|
value = 0;
|
|
margin = 0;
|
|
relationship = wxSameAs;
|
|
lhs = 0; rhs = 0;
|
|
}
|
|
wxConstraintOp(const wxConstraintOp& op)
|
|
{
|
|
opType = op.opType;
|
|
edge = op.edge;
|
|
relationship = op.relationship;
|
|
win = op.win;
|
|
value = op.value;
|
|
margin = op.margin;
|
|
if (op.lhs)
|
|
lhs = new wxConstraintOp(*op.lhs);
|
|
else
|
|
lhs = NULL;
|
|
if (op.rhs)
|
|
rhs = new wxConstraintOp(*op.rhs);
|
|
else
|
|
rhs = NULL;
|
|
}
|
|
~wxConstraintOp(void)
|
|
{
|
|
if (lhs)
|
|
delete lhs;
|
|
if (rhs)
|
|
delete rhs;
|
|
}
|
|
|
|
wxConstraintOp operator = (const wxConstraintOp& arg2);
|
|
wxConstraintOp operator = (const int value);
|
|
|
|
friend wxConstraintOp operator % (const int perCent, const wxConstraintOp& arg2);
|
|
friend wxConstraintOp operator + (wxConstraintOp& arg1, int margin);
|
|
friend wxConstraintOp operator - (wxConstraintOp& arg1, int margin);
|
|
friend wxConstraintOp operator , (const wxConstraintOp& arg1, const wxConstraintOp& arg2);
|
|
};
|
|
|
|
wxConstraintOp leftOf(wxWindow *win)
|
|
{
|
|
wxConstraintOp thing(wxCONSTRAINT_OP_EDGE);
|
|
thing.win = win;
|
|
thing.edge = wxLeft;
|
|
return thing;
|
|
}
|
|
|
|
wxConstraintOp topOf(wxWindow *win)
|
|
{
|
|
wxConstraintOp thing(wxCONSTRAINT_OP_EDGE);
|
|
thing.win = win;
|
|
thing.edge = wxTop;
|
|
return thing;
|
|
}
|
|
|
|
wxConstraintOp widthOf(wxWindow *win)
|
|
{
|
|
wxConstraintOp thing(wxCONSTRAINT_OP_EDGE);
|
|
thing.win = win;
|
|
thing.edge = wxWidth;
|
|
return thing;
|
|
}
|
|
|
|
wxConstraintOp wxConstraintOp::operator = (const wxConstraintOp& arg2)
|
|
{
|
|
wxConstraintOp op3(wxCONSTRAINT_OP_REL);
|
|
op3.relationship = wxPercentOf;
|
|
op3.value = 100;
|
|
if ((op3.relationship == wxPercentOf) && (op3.value > 0))
|
|
op3.value = this->value;
|
|
op3.lhs = new wxConstraintOp(*this);
|
|
op3.rhs = new wxConstraintOp(arg2);
|
|
|
|
return op3;
|
|
}
|
|
|
|
wxConstraintOp wxConstraintOp::operator = (const int value)
|
|
{
|
|
wxConstraintOp op3(wxCONSTRAINT_OP_REL);
|
|
op3.relationship = wxAbsolute;
|
|
|
|
op3.lhs = new wxConstraintOp(*this);
|
|
op3.rhs = new wxConstraintOp(wxCONSTRAINT_OP_ABS);
|
|
op3.value = value;
|
|
|
|
return op3;
|
|
}
|
|
|
|
wxConstraintOp operator % (const int perCent, const wxConstraintOp& arg2)
|
|
{
|
|
wxConstraintOp op3(arg2);
|
|
op3.opType = wxCONSTRAINT_OP_EDGE;
|
|
op3.value = perCent;
|
|
if (op3.value > 0)
|
|
op3.value = arg2.value;
|
|
|
|
return op3;
|
|
}
|
|
|
|
wxConstraintOp operator + (wxConstraintOp& arg1, int margin)
|
|
{
|
|
wxConstraintOp op3(arg1);
|
|
op3.margin = margin;
|
|
return op3;
|
|
}
|
|
|
|
wxConstraintOp operator - (wxConstraintOp& arg1, int margin)
|
|
{
|
|
wxConstraintOp op3(arg1);
|
|
op3.margin = - margin;
|
|
return op3;
|
|
}
|
|
|
|
wxConstraintOp operator , (const wxConstraintOp& arg1, const wxConstraintOp& arg2)
|
|
{
|
|
wxConstraintOp op3(wxCONSTRAINT_OP_AND);
|
|
op3.lhs = new wxConstraintOp(arg1);
|
|
op3.rhs = new wxConstraintOp(arg2);
|
|
|
|
return op3;
|
|
}
|