Canvas: continued work on constraint packer
This commit is contained in:
parent
01137cbbf3
commit
1c3e743d2a
@ -20,11 +20,13 @@
|
|||||||
#define __CANVAS_CONSTRAINT_PACKER_H__
|
#define __CANVAS_CONSTRAINT_PACKER_H__
|
||||||
|
|
||||||
#include "canvas/item.h"
|
#include "canvas/item.h"
|
||||||
|
#include "kiwi/kiwi.h"
|
||||||
|
|
||||||
namespace ArdourCanvas
|
namespace ArdourCanvas
|
||||||
{
|
{
|
||||||
|
|
||||||
class Rectangle;
|
class Rectangle;
|
||||||
|
class ConstrainedItem;
|
||||||
|
|
||||||
class LIBCANVAS_API ConstraintPacker : public Item
|
class LIBCANVAS_API ConstraintPacker : public Item
|
||||||
{
|
{
|
||||||
@ -32,13 +34,29 @@ public:
|
|||||||
ConstraintPacker (Canvas *);
|
ConstraintPacker (Canvas *);
|
||||||
ConstraintPacker (Item *);
|
ConstraintPacker (Item *);
|
||||||
|
|
||||||
|
void add (Item *);
|
||||||
|
void remove (Item *);
|
||||||
|
void constrain (kiwi::Constraint const &);
|
||||||
|
|
||||||
|
void solve ();
|
||||||
|
void apply ();
|
||||||
|
|
||||||
void compute_bounding_box () const;
|
void compute_bounding_box () const;
|
||||||
void render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) const;
|
void render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) const;
|
||||||
|
|
||||||
|
void size_allocate (Rect const &);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void child_changed ();
|
void child_changed ();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
typedef std::map<Item*,ConstrainedItem*> ConstraintMap;
|
||||||
|
ConstraintMap constraint_map;
|
||||||
|
|
||||||
|
kiwi::Solver _solver;
|
||||||
|
kiwi::Variable width;
|
||||||
|
kiwi::Variable height;
|
||||||
|
|
||||||
Rectangle *self;
|
Rectangle *self;
|
||||||
bool collapse_on_hide;
|
bool collapse_on_hide;
|
||||||
|
|
||||||
|
@ -16,16 +16,25 @@
|
|||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "pbd/i18n.h"
|
||||||
|
|
||||||
|
|
||||||
#include "kiwi/kiwi.h"
|
#include "kiwi/kiwi.h"
|
||||||
|
|
||||||
#include "canvas/constraint_packer.h"
|
#include "canvas/constraint_packer.h"
|
||||||
|
#include "canvas/constrained_item.h"
|
||||||
|
#include "canvas/item.h"
|
||||||
#include "canvas/rectangle.h"
|
#include "canvas/rectangle.h"
|
||||||
|
|
||||||
using namespace ArdourCanvas;
|
using namespace ArdourCanvas;
|
||||||
|
|
||||||
ConstraintPacker::ConstraintPacker (Canvas* canvas)
|
ConstraintPacker::ConstraintPacker (Canvas* canvas)
|
||||||
: Item (canvas)
|
: Item (canvas)
|
||||||
|
, width (X_("width"))
|
||||||
|
, height (X_("height"))
|
||||||
{
|
{
|
||||||
|
_solver.addEditVariable (width, kiwi::strength::strong);
|
||||||
|
_solver.addEditVariable (height, kiwi::strength::strong);
|
||||||
}
|
}
|
||||||
|
|
||||||
ConstraintPacker::ConstraintPacker (Item* parent)
|
ConstraintPacker::ConstraintPacker (Item* parent)
|
||||||
@ -88,3 +97,45 @@ ConstraintPacker::child_changed ()
|
|||||||
reposition_children ();
|
reposition_children ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ConstraintPacker::constrain (kiwi::Constraint const &c)
|
||||||
|
{
|
||||||
|
_solver.addConstraint (c);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ConstraintPacker::size_allocate (Rect const & r)
|
||||||
|
{
|
||||||
|
Item::size_allocate (r);
|
||||||
|
|
||||||
|
_solver.suggestValue (width, r.width());
|
||||||
|
_solver.suggestValue (height, r.height());
|
||||||
|
|
||||||
|
solve ();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ConstraintPacker::add (Item* item)
|
||||||
|
{
|
||||||
|
Item::add (item);
|
||||||
|
ConstrainedItem* ci = new ConstrainedItem (*item);
|
||||||
|
constraint_map.insert (std::make_pair (item, ci));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ConstraintPacker::remove (Item* item)
|
||||||
|
{
|
||||||
|
Item::remove (item);
|
||||||
|
constraint_map.erase (item);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ConstraintPacker::solve ()
|
||||||
|
{
|
||||||
|
_solver.updateVariables ();
|
||||||
|
|
||||||
|
for (ConstraintMap::iterator x = constraint_map.begin(); x != constraint_map.end(); ++x) {
|
||||||
|
x->first->constrained (*(x->second));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user