Skip to content
This repository has been archived by the owner on Nov 12, 2019. It is now read-only.

Commit

Permalink
Add slider behavior.
Browse files Browse the repository at this point in the history
Implement scrollbar dragging and postion property.
Extra check when emitting changed signal for property.
Fix mixin for opOpAssing in flexibleobject.d.
Implement vertical and horizontal scrollbars.
Add scrollbars to testapplication.d.
  • Loading branch information
MrSmith33 committed Mar 3, 2014
1 parent 6f38c80 commit ff495b3
Show file tree
Hide file tree
Showing 6 changed files with 147 additions and 11 deletions.
13 changes: 13 additions & 0 deletions examples/testapplication.d
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,19 @@ class TestApplication : Application!GlfwWindow
firstName.property("text").valueChanged.connect(calc);
lastName.property("text").valueChanged.connect(calc);

auto horiText = context.getWidgetById("hori-pos");
auto vertText = context.getWidgetById("vert-pos");
auto updateHori = (FlexibleObject a, Variant b){horiText["text"] = to!string(b);};
auto updateVert = (FlexibleObject a, Variant b){vertText["text"] = to!string(b);};

auto horiScroll = context.getWidgetById("hori-scroll");
horiScroll.property("sliderPos").valueChanged.connect(updateHori);
auto vertScroll = context.getWidgetById("vert-scroll");
vertScroll.property("sliderPos").valueChanged.connect(updateVert);

horiScroll["sliderPos"] = 0.2;
vertScroll["sliderPos"] = 0.3;

writeln("\n----------------------------- Load end -----------------------------\n");
}

Expand Down
5 changes: 4 additions & 1 deletion import/anchovy/gui/behaviors/defaultbehaviors.d
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ import anchovy.gui.behaviors.labelbehavior;
import anchovy.gui.behaviors.checkbehavior;
import anchovy.gui.behaviors.editbehavior;
import anchovy.gui.behaviors.scrollbarbehavior;
import anchovy.gui.behaviors.sliderbehavior;

import anchovy.gui.guicontext;

Expand All @@ -57,5 +58,7 @@ void attachDefaultBehaviors(GuiContext context)
context.behaviorFactories["label"] ~= delegate IWidgetBehavior (){return new LabelBehavior;};
context.behaviorFactories["check"] ~= delegate IWidgetBehavior (){return new CheckBehavior;};
context.behaviorFactories["edit"] ~= delegate IWidgetBehavior (){return new EditBehavior;};
context.behaviorFactories["scrollbar-vert"] ~= delegate IWidgetBehavior (){return new ScrollbarBehavior;};
context.behaviorFactories["slider"] ~= delegate IWidgetBehavior (){return new SliderBehavior;};
context.behaviorFactories["scrollbar-vert"] ~= delegate IWidgetBehavior (){return new ScrollbarBehaviorVert;};
context.behaviorFactories["scrollbar-hori"] ~= delegate IWidgetBehavior (){return new ScrollbarBehaviorHori;};
}
71 changes: 68 additions & 3 deletions import/anchovy/gui/behaviors/scrollbarbehavior.d
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,15 @@ import anchovy.gui.interfaces.iwidgetbehavior;

// version = Button_debug;

class ScrollbarBehavior : IWidgetBehavior
alias ScrollbarBehaviorVert = ScrollbarBehavior!true;
alias ScrollbarBehaviorHori = ScrollbarBehavior!false;

class ScrollbarBehavior(bool vertical) : IWidgetBehavior
{
protected:
Widget _slider;
Widget _body;
Widget _widget;
double _sliderSize = 0.5;
double _sliderPos = 0.0;

Expand All @@ -25,18 +29,79 @@ public:
{
_body = widget["subwidgets"].get!(Widget[string]).get("body", null);
_slider = widget["subwidgets"].get!(Widget[string]).get("slider", null);
_widget = widget;

if (_slider && _body)
{
_body.size.valueChanged.connect((FlexibleObject obj, Variant value){updateSize();});
_slider.position.valueChanging.connect(&handleSliderMoved);

_widget["sliderSize"] = new ValueProperty(_widget, cast(double)_sliderSize);
_widget["sliderPos"] = new ValueProperty(_widget, cast(double)_sliderPos);

_widget.property("sliderPos").valueChanging.connect(&handleSliderPositionChanging);

updateSize();
}
}

void updateSize()
{
_slider.setProperty!"size"(ivec2(_body.size.value.get!ivec2.x, cast(int)(_body.size.value.get!ivec2.y * _sliderSize)));
_slider.setProperty!"position"(ivec2(0, cast(int)((_body.size.value.get!ivec2.y - _slider["size"].get!ivec2.y) * _sliderPos)));
static if (vertical)
{
_slider.setProperty!"size"(ivec2(_body.size.value.get!ivec2.x, cast(int)(_body.size.value.get!ivec2.y * _sliderSize)));
_slider.setProperty!"position"(ivec2(0,
cast(int)((_body.size.value.get!ivec2.y - _slider["size"].get!ivec2.y) * _widget["sliderPos"].get!double)));
}
else
{
_slider.setProperty!"size"(ivec2(cast(int)(_body.size.value.get!ivec2.x * _sliderSize), _body.size.value.get!ivec2.y));
_slider.setProperty!"position"(
ivec2(cast(int)((_body.size.value.get!ivec2.x - _slider["size"].get!ivec2.x) * _widget["sliderPos"].get!double), 0));
}
}

void handleSliderPositionChanging(FlexibleObject widget, Variant* position)
{
double* pos = (*position).peek!double;
if (!pos) *pos = (*position).coerce!double;

if (pos)
{
if (*pos < 0) *pos = 0;
else if (*pos > 1.0) *pos = 1.0;
}

*position = *pos;
}

void handleSliderMoved(FlexibleObject slider, Variant* position)
{
int newPosition;
int bodySize;
int sliderSize;

static if (vertical)
{
int pos = position.get!ivec2.y;
bodySize = _body.size.value.get!ivec2.y;
sliderSize = _slider.size.value.get!ivec2.y;
newPosition = pos < 0 ? 0 : (pos + sliderSize > bodySize ? bodySize - sliderSize : pos);
(*position) = ivec2(0, newPosition);
}
else
{
int pos = position.get!ivec2.x;
bodySize = _body.size.value.get!ivec2.x;
sliderSize = _slider.size.value.get!ivec2.x;
newPosition = pos < 0 ? 0 : (pos + sliderSize > bodySize ? bodySize - sliderSize : pos);
(*position) = ivec2(newPosition, 0);
}

double sliderPos = cast(double)newPosition / cast(double)(bodySize - sliderSize);
_widget["sliderPos"] = sliderPos is double.nan ? 0 : sliderPos;

writeln("slider moved ", sliderPos);
}

}
53 changes: 53 additions & 0 deletions import/anchovy/gui/behaviors/sliderbehavior.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
/**
Copyright: Copyright (c) 2014 Andrey Penechko.
License: a$(WEB boost.org/LICENSE_1_0.txt, Boost License 1.0).
Authors: Andrey Penechko.
*/


module anchovy.gui.behaviors.sliderbehavior;

import std.algorithm;
import std.stdio;

import anchovy.gui;
import anchovy.gui.interfaces.iwidgetbehavior;

class SliderBehavior : IWidgetBehavior
{
override void attachTo(Widget widget)
{
widget.addEventHandler(&pointerMoved);
widget.addEventHandler(&pointerPressed);
widget.addEventHandler(&pointerReleased);

widget.setProperty!"isFocusable"(true);
}

bool pointerMoved(Widget widget, PointerMoveEvent event)
{
if (event.context.pressedWidget is widget )
{
widget["position"] = event.delta + widget["position"].get!ivec2;
}


return true;
}

bool pointerPressed(Widget widget, PointerPressEvent event)
{
if (event.button == PointerButton.PB_LEFT)
{
return true;
}

return false;
}

bool pointerReleased(Widget widget, PointerReleaseEvent event)
{
return true;
}

}
2 changes: 1 addition & 1 deletion import/anchovy/utils/flexibleobject/flexibleobject.d
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ class FlexibleObject
{
IProperty property = properties.get(propName, new ValueProperty(this, Variant(null)));

property.value = mixin("property.value " ~ op ~ " value;");
mixin("property.value " ~ op ~ "= value;");

return property.value;
}
Expand Down
14 changes: 8 additions & 6 deletions import/anchovy/utils/flexibleobject/flexibleproperty.d
Original file line number Diff line number Diff line change
Expand Up @@ -70,12 +70,14 @@ class ValueProperty : IProperty

override Variant value(Variant newValue) @property
{
if (newValue != _value)
{
_valueChanging.emit(_owner, &newValue);
_value = newValue;
_valueChanged.emit(_owner, _value);
}
if (newValue == _value) return _value;

_valueChanging.emit(_owner, &newValue);

if (newValue == _value) return _value;
_value = newValue;
_valueChanged.emit(_owner, _value);

return _value;
}

Expand Down

0 comments on commit ff495b3

Please sign in to comment.