From da5616bf4747cacbdc0c359313e66673933b9d6a Mon Sep 17 00:00:00 2001 From: shmyga Date: Fri, 19 Jul 2019 16:38:29 +0300 Subject: [PATCH] [view] fixes --- src/main/haxework/view/View.hx | 16 ++--- src/main/haxework/view/data/DataView.hx | 20 +++---- src/main/haxework/view/group/GroupView.hx | 59 +++++++++++++++---- .../haxework/view/layout/DefaultLayout.hx | 4 +- src/main/haxework/view/layout/TailLayout.hx | 4 +- src/main/haxework/view/list/ListView.hx | 4 +- src/main/haxework/view/skin/SpriteSkin.hx | 3 +- src/main/haxework/view/theme/Theme.hx | 2 + 8 files changed, 69 insertions(+), 43 deletions(-) diff --git a/src/main/haxework/view/View.hx b/src/main/haxework/view/View.hx index 6d376dc..f539bff 100755 --- a/src/main/haxework/view/View.hx +++ b/src/main/haxework/view/View.hx @@ -114,13 +114,6 @@ import haxework.view.theme.ITheme; return y; } - // ToDo: - /*private function set_skin(value:ISkin):ISkin { - this.skin = value; - toRedraw(); - return this.skin; - } -*/ private function set_visible(value:Bool):Bool { if (visible != value) { visible = value; @@ -150,11 +143,10 @@ import haxework.view.theme.ITheme; private function get_rect():Rectangle { var x = this.x; var y = this.y; - var parent = this.parent; - while (parent != null) { - x += parent.x; - y += parent.y; - parent = parent.parent; + if (parent != null) { + var rect = parent.rect; + x += rect.x; + y += rect.y; } return new Rectangle(x, y, width, height); } diff --git a/src/main/haxework/view/data/DataView.hx b/src/main/haxework/view/data/DataView.hx index 41961d0..6b21f35 100644 --- a/src/main/haxework/view/data/DataView.hx +++ b/src/main/haxework/view/data/DataView.hx @@ -15,12 +15,13 @@ class DataView> extends GroupView { public var factory(default, set):Factory; public var onItemSelect(default, null):Signal3 = new Signal3(); public var onDataSelect(default, null):Signal = new Signal(); - public var dataViews(get, null):Array; + public var dataViews(default, null):Array; private var objectIndexes:Map = new Map(); public function new(?layout:ILayout) { super(layout != null ? layout : new VerticalLayout()); + dataViews = []; } private function set_data(value:Array):Array { @@ -35,25 +36,22 @@ class DataView> extends GroupView { return factory; } - private function get_dataViews():Array { - return cast views; - } - private function rebuild():Void { - for (view in views) { + for (view in dataViews) { view.content.removeEventListener(MouseEvent.CLICK, onItemClick); } objectIndexes = new Map(); - views = cast Lambda.array(Lambda.mapi(data, factory)); - for (i in 0...views.length) { - objectIndexes[views[i].content] = i; - views[i].content.addEventListener(MouseEvent.CLICK, onItemClick); + dataViews = Lambda.array(Lambda.mapi(data, factory)); + views = cast dataViews; + for (i in 0...dataViews.length) { + objectIndexes[dataViews[i].content] = i; + dataViews[i].content.addEventListener(MouseEvent.CLICK, onItemClick); } } private function onItemClick(event:MouseEvent):Void { var index = objectIndexes[event.currentTarget]; onDataSelect.emit(data[index]); - onItemSelect.emit(index, data[index], cast views[index]); + onItemSelect.emit(index, data[index], dataViews[index]); } } diff --git a/src/main/haxework/view/group/GroupView.hx b/src/main/haxework/view/group/GroupView.hx index 83d473c..b536753 100755 --- a/src/main/haxework/view/group/GroupView.hx +++ b/src/main/haxework/view/group/GroupView.hx @@ -1,5 +1,8 @@ package haxework.view.group; +import flash.geom.Point; +import flash.events.TouchEvent; +import flash.geom.Rectangle; import flash.display.DisplayObjectContainer; import flash.display.Sprite; import flash.events.MouseEvent; @@ -94,7 +97,41 @@ class OverflowControl { overflowControlX.offsetSignal.connect(function(value) container.x = value); overflowControlY = new OverflowControl(function() return scrollY); overflowControlY.offsetSignal.connect(function(value) container.y = value); - content.addEventListener(MouseEvent.MOUSE_WHEEL, _onMouseWheelEvent); + content.addEventListener(MouseEvent.MOUSE_WHEEL, onMouseWheelEvent); + content.addEventListener(TouchEvent.TOUCH_BEGIN, onTouchBegin); + } + + private function onMouseWheelEvent(event:MouseEvent):Void { + if (overflowY > 1) { + #if flash event.preventDefault(); #end + overflowControlY.offset += event.delta * 15; + } + } + + private var touchPoint:Point; + + private function onTouchBegin(event:TouchEvent):Void { + if (overflowY > 1) { + touchPoint = new Point(event.stageX, event.stageY); + content.stage.addEventListener(TouchEvent.TOUCH_MOVE, onTouchMove); + content.stage.addEventListener(TouchEvent.TOUCH_END, onTouchEnd); + } + } + + private function onTouchMove(event:TouchEvent):Void { + if (overflowY > 1) { + overflowControlY.offset -= touchPoint.y - event.stageY; + } + if (overflowX > 1) { + overflowControlX.offset -= touchPoint.x - event.stageX; + } + touchPoint = new Point(event.stageX, event.stageY); + } + + private function onTouchEnd(event:TouchEvent):Void { + event.preventDefault(); + content.stage.removeEventListener(TouchEvent.TOUCH_MOVE, onTouchMove); + content.stage.removeEventListener(TouchEvent.TOUCH_END, onTouchEnd); } private function get_scrollX():HScrollBarView { @@ -119,13 +156,6 @@ class OverflowControl { return scrollY; } - private function _onMouseWheelEvent(event:MouseEvent):Void { - if (overflowY > 1) { - #if flash event.preventDefault(); #end - overflowControlY.offset += event.delta * 15; - } - } - public function set_overflowX(value:Float):Float { return overflowX = overflowControlX.overflow = value; } @@ -196,16 +226,19 @@ class OverflowControl { } public function removeAllViews():Void { - /*if (views != null) while (views.length > 0) { - removeView(views[0]); - }*/ if (views != null) { - for (i in 0...views.length) { - var view = views[i]; + for (view in views.slice(0)) { if (view != scrollX && view != scrollY) { removeView(view); } } } } + + override private function get_rect():Rectangle { + var result = super.get_rect(); + result.x += overflowControlX.offset; + result.y += overflowControlY.offset; + return result; + } } diff --git a/src/main/haxework/view/layout/DefaultLayout.hx b/src/main/haxework/view/layout/DefaultLayout.hx index e5fdf14..9efded3 100755 --- a/src/main/haxework/view/layout/DefaultLayout.hx +++ b/src/main/haxework/view/layout/DefaultLayout.hx @@ -37,12 +37,12 @@ class DefaultLayout extends Layout { ); switch group.overflow.x { case SCROLL: - group.overflowX = width / group.width; + group.overflowX = width / (group.width - group.geometry.padding.horizontal); case _: } switch group.overflow.y { case SCROLL: - group.overflowY = height / group.height; + group.overflowY = height / (group.height - group.geometry.padding.vertical); case _: } } diff --git a/src/main/haxework/view/layout/TailLayout.hx b/src/main/haxework/view/layout/TailLayout.hx index 3976658..6bef41b 100644 --- a/src/main/haxework/view/layout/TailLayout.hx +++ b/src/main/haxework/view/layout/TailLayout.hx @@ -35,7 +35,7 @@ class TailLayout extends DefaultLayout { } var w:Float = 0; var size = group.size.toSize("group"); - for (view in views) { + for (view in filterViews(group, views)) { setViewWidth(group, view); setViewHeight(group, view); if ( @@ -74,6 +74,6 @@ class TailLayout extends DefaultLayout { y += row.height + margin; } - group.setSize(w, h, "group"); + setGroupSize(group, w, h); } } diff --git a/src/main/haxework/view/list/ListView.hx b/src/main/haxework/view/list/ListView.hx index 2671195..901b872 100755 --- a/src/main/haxework/view/list/ListView.hx +++ b/src/main/haxework/view/list/ListView.hx @@ -67,7 +67,7 @@ class ListView extends GroupView { items = []; itemsListeners = new Map, MouseEvent -> Void>(); selected = []; - content.addEventListener(MouseEvent.MOUSE_WHEEL, onMouseWheelEvent); + content.addEventListener(MouseEvent.MOUSE_WHEEL, _onMouseWheelEvent); } private function set_scroll(value:ScrollBarView):ScrollBarView { @@ -121,7 +121,7 @@ class ListView extends GroupView { offset = o; } - private function onMouseWheelEvent(event:MouseEvent):Void { + private function _onMouseWheelEvent(event:MouseEvent):Void { #if flash event.preventDefault(); #end onMouseWheel(event.delta); } diff --git a/src/main/haxework/view/skin/SpriteSkin.hx b/src/main/haxework/view/skin/SpriteSkin.hx index 2722d17..dea99c1 100644 --- a/src/main/haxework/view/skin/SpriteSkin.hx +++ b/src/main/haxework/view/skin/SpriteSkin.hx @@ -23,7 +23,8 @@ import flash.display.Graphics; } else { graphics.beginFill(0, 0); } - graphics.drawRect(0, 0, view.width, view.height); + var o = border.color != null ? border.thickness / 2 : 0; + graphics.drawRect(o, o, view.width - o * 2, view.height - o * 2); graphics.lineStyle(); graphics.endFill(); } diff --git a/src/main/haxework/view/theme/Theme.hx b/src/main/haxework/view/theme/Theme.hx index 0ee6830..123e4af 100644 --- a/src/main/haxework/view/theme/Theme.hx +++ b/src/main/haxework/view/theme/Theme.hx @@ -127,12 +127,14 @@ class Theme implements ITheme { "geometry.width" => SizeValue.fromFloat(10), "geometry.height" => SizeValue.fromString("100%"), "geometry.hAlign" => HAlign.RIGHT, + "geometry.vAlign" => VAlign.TOP, ])); register(new Style("scroll.horizontal", [ "skin.foreColor" => colors.light, "skin.backColor" => colors.dark, "geometry.width" => SizeValue.fromString("100%"), "geometry.height" => SizeValue.fromFloat(10), + "geometry.hAlign" => HAlign.LEFT, "geometry.vAlign" => VAlign.BOTTOM, ])); }