package hide.comp;
enum LayoutDirection {
Horizontal;
Vertical;
}
class ResizablePanel extends hide.comp.Component {
var layoutDirection : LayoutDirection;
public function new(layoutDirection : LayoutDirection, element : Element) {
super(null, element);
this.layoutDirection = layoutDirection;
var splitter = new Element('
');
switch (layoutDirection) {
case Horizontal:
splitter.addClass("horizontal");
case Vertical:
splitter.addClass("vertical");
}
splitter.insertBefore(element);
var handle = splitter.find(".drag-handle").first();
var drag = false;
var startSize = 0;
var startPos = 0;
handle.mousedown((e) -> {
drag = true;
startSize = Std.int(layoutDirection == Horizontal? element.width() : element.height());
startPos = layoutDirection == Horizontal? e.clientX : e.clientY;
});
handle.mouseup((e) -> drag = false);
handle.dblclick((e) -> {
setSize(Std.parseInt(element.css("min-width")));
});
var scenePartition = element.parent();
scenePartition.mousemove((e) -> {
if (drag){
setSize(startSize - ((layoutDirection == Horizontal? e.clientX : e.clientY) - startPos));
}
});
scenePartition.mouseup((e) -> {
drag = false;
});
scenePartition.mouseleave((e) -> {
drag = false;
});
}
public function setSize(?newSize : Int) {
var minSize = (layoutDirection == Horizontal? Std.parseInt(element.css("min-width")) : Std.parseInt(element.css("min-height")));
var maxSize = (layoutDirection == Horizontal? Std.parseInt(element.css("max-width")) : Std.parseInt(element.css("max-height")));
var clampedSize = 0;
if (newSize != null) clampedSize = hxd.Math.iclamp(newSize, minSize, maxSize);
else clampedSize = hxd.Math.iclamp(getDisplayState("size"), minSize, maxSize);
switch (layoutDirection) {
case Horizontal :
element.width(clampedSize);
case Vertical :
element.height(clampedSize);
}
if (newSize != null) saveDisplayState("size", clampedSize);
onResize(); //@:privateAccess if( scene.window != null) scene.window.checkResize();
}
public dynamic function onResize() {}
}