diff --git a/examples/spreadsheet/src/dlangui/widgets/spreadsheet.d b/examples/spreadsheet/src/dlangui/widgets/spreadsheet.d index fa6323c6..e9de0d83 100644 --- a/examples/spreadsheet/src/dlangui/widgets/spreadsheet.d +++ b/examples/spreadsheet/src/dlangui/widgets/spreadsheet.d @@ -218,6 +218,19 @@ class SpreadSheetWidget : WidgetGroupDefaultDrawing, OnScrollHandler, CellSelect /// Callback for handling of view scroll (top left visible cell change) void onViewScrolled(GridWidgetBase source, int col, int row) { + if (source == _viewTopLeft) { + _viewTopRight.scrollTo(-1, row, source, false); + _viewBottomLeft.scrollTo(col, -1, source, false); + } else if (source == _viewTopRight) { + _viewTopLeft.scrollTo(-1, row, source, false); + _viewBottomRight.scrollTo(col, -1, source, false); + } else if (source == _viewBottomLeft) { + _viewTopLeft.scrollTo(col, -1, source, false); + _viewBottomRight.scrollTo(-1, row, source, false); + } else if (source == _viewBottomRight) { + _viewTopRight.scrollTo(col, -1, source, false); + _viewBottomLeft.scrollTo(-1, row, source, false); + } } } diff --git a/src/dlangui/widgets/controls.d b/src/dlangui/widgets/controls.d index 6200e178..4f7b66b3 100644 --- a/src/dlangui/widgets/controls.d +++ b/src/dlangui/widgets/controls.d @@ -623,7 +623,7 @@ class ScrollBar : AbstractSlider, OnClickHandler { this(string resourceId) { super("SLIDER", resourceId); - styleId = STYLE_BUTTON_NOMARGINS; + styleId = STYLE_SCROLLBAR_BUTTON; trackHover = true; } @@ -801,8 +801,8 @@ class ScrollBar : AbstractSlider, OnClickHandler { _btnForward = new ImageButton("FORWARD", style.customDrawableId(_orientation == Orientation.Vertical ? ATTR_SCROLLBAR_BUTTON_DOWN : ATTR_SCROLLBAR_BUTTON_RIGHT)); _pageUp = new PageScrollButton("PAGE_UP"); _pageDown = new PageScrollButton("PAGE_DOWN"); - _btnBack.styleId = STYLE_SCROLLBAR_BUTTON; - _btnForward.styleId = STYLE_SCROLLBAR_BUTTON; + _btnBack.styleId = STYLE_SCROLLBAR_BUTTON_TRANSPARENT; + _btnForward.styleId = STYLE_SCROLLBAR_BUTTON_TRANSPARENT; _indicator = new SliderButton(style.customDrawableId(_orientation == Orientation.Vertical ? ATTR_SCROLLBAR_INDICATOR_VERTICAL : ATTR_SCROLLBAR_INDICATOR_HORIZONTAL)); addChild(_btnBack); addChild(_btnForward); diff --git a/src/dlangui/widgets/grid.d b/src/dlangui/widgets/grid.d index 84779a55..74a59663 100644 --- a/src/dlangui/widgets/grid.d +++ b/src/dlangui/widgets/grid.d @@ -535,12 +535,12 @@ class GridWidgetBase : ScrollWidgetBase { return scrollTo(_headerCols + _fixedCols + _scrollCol + dx, _headerRows + _fixedRows + _scrollRow + dy); } - /// set scroll position to show specified cell as top left in scrollable area - bool scrollTo(int col, int row) { + /// set scroll position to show specified cell as top left in scrollable area; col or row -1 value means no change + bool scrollTo(int col, int row, GridWidgetBase source = null, bool doNotify = true) { int oldx = _scrollCol; int oldy = _scrollRow; - int newScrollCol = col - _headerCols - _fixedCols; - int newScrollRow = row - _headerRows - _fixedRows; + int newScrollCol = col == -1 ? _scrollCol : col - _headerCols - _fixedCols; + int newScrollRow = row == -1 ? _scrollRow : row - _headerRows - _fixedRows; if (newScrollCol > _maxScrollCol) newScrollCol = _maxScrollCol; if (newScrollCol < 0) @@ -565,7 +565,13 @@ class GridWidgetBase : ScrollWidgetBase { //if (changed) updateScrollBars(); invalidate(); - return oldx != _scrollCol || oldy != _scrollRow; + bool changed = oldx != _scrollCol || oldy != _scrollRow; + if (doNotify && changed && viewScrolled.assigned) { + if (source is null) + source = this; + viewScrolled(source, col, row); + } + return changed; } /// process horizontal scrollbar event @@ -635,6 +641,9 @@ class GridWidgetBase : ScrollWidgetBase { if (scrolled) { updateScrollBars(); invalidate(); + if (viewScrolled.assigned) { + viewScrolled(this, _scrollCol + _headerCols + _fixedCols, _scrollRow + _headerRows + _fixedRows); + } } } diff --git a/src/dlangui/widgets/styles.d b/src/dlangui/widgets/styles.d index 96821a98..fdef49c2 100644 --- a/src/dlangui/widgets/styles.d +++ b/src/dlangui/widgets/styles.d @@ -69,6 +69,8 @@ immutable string STYLE_VSPACER = "VSPACER"; immutable string STYLE_SCROLLBAR = "SCROLLBAR"; /// standard style id for ScrollBar button immutable string STYLE_SCROLLBAR_BUTTON = "SCROLLBAR_BUTTON"; +/// standard style id for ScrollBar button +immutable string STYLE_SCROLLBAR_BUTTON_TRANSPARENT = "SCROLLBAR_BUTTON_TRANSPARENT"; /// standard style id for ScrollBar page control immutable string STYLE_PAGE_SCROLL = "PAGE_SCROLL"; /// standard style id for Slider diff --git a/views/res/scrollbar_btn_background.xml b/views/res/scrollbar_btn_background.xml new file mode 100644 index 00000000..8d354638 --- /dev/null +++ b/views/res/scrollbar_btn_background.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_pressed="true" + android:drawable="@drawable/scrollbar_btn_background_pressed" /> + <item android:state_focused="true" android:state_enabled="true" + android:drawable="@drawable/scrollbar_btn_background_normal" /> + <item android:state_enabled="true" android:state_hovered="true" + android:drawable="@drawable/scrollbar_btn_background_hover" /> + <item android:state_enabled="true" + android:drawable="@drawable/scrollbar_btn_background_normal" /> + <item + android:drawable="@drawable/scrollbar_btn_background_disabled" /> +</selector> + diff --git a/views/res/scrollbar_btn_background_dark.xml b/views/res/scrollbar_btn_background_dark.xml new file mode 100644 index 00000000..7c86b3e0 --- /dev/null +++ b/views/res/scrollbar_btn_background_dark.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_pressed="true" + android:drawable="@drawable/btn_pressed_dark" /> + <item android:state_focused="true" android:state_default="true" android:state_enabled="true" + android:drawable="@drawable/btn_default_dark" /> + <item android:state_focused="true" android:state_enabled="true" + android:drawable="@drawable/btn_normal_dark" /> + <item android:state_enabled="true" android:state_default="true" + android:drawable="@drawable/btn_default_dark" /> + <item android:state_enabled="true" android:state_hovered="true" + android:drawable="@drawable/btn_hover_dark" /> + <item android:state_enabled="true" + android:drawable="@drawable/btn_normal_dark" /> + <item + android:drawable="@drawable/btn_disabled_dark" /> +</selector> + diff --git a/views/res/scrollbar_btn_background_disabled.9.png b/views/res/scrollbar_btn_background_disabled.9.png new file mode 100644 index 00000000..7dccd4ce Binary files /dev/null and b/views/res/scrollbar_btn_background_disabled.9.png differ diff --git a/views/res/scrollbar_btn_background_hover.9.png b/views/res/scrollbar_btn_background_hover.9.png new file mode 100644 index 00000000..c018279f Binary files /dev/null and b/views/res/scrollbar_btn_background_hover.9.png differ diff --git a/views/res/scrollbar_btn_background_normal.9.png b/views/res/scrollbar_btn_background_normal.9.png new file mode 100644 index 00000000..b3131244 Binary files /dev/null and b/views/res/scrollbar_btn_background_normal.9.png differ diff --git a/views/res/scrollbar_btn_background_pressed.9.png b/views/res/scrollbar_btn_background_pressed.9.png new file mode 100644 index 00000000..c6f7e46c Binary files /dev/null and b/views/res/scrollbar_btn_background_pressed.9.png differ diff --git a/views/res/scrollbar_btn_down.png b/views/res/scrollbar_btn_down.png index 19ab977b..d37d8cc4 100644 Binary files a/views/res/scrollbar_btn_down.png and b/views/res/scrollbar_btn_down.png differ diff --git a/views/res/scrollbar_btn_left.png b/views/res/scrollbar_btn_left.png index 24ff0845..06ad0323 100644 Binary files a/views/res/scrollbar_btn_left.png and b/views/res/scrollbar_btn_left.png differ diff --git a/views/res/scrollbar_btn_right.png b/views/res/scrollbar_btn_right.png index 081a183b..fc03a576 100644 Binary files a/views/res/scrollbar_btn_right.png and b/views/res/scrollbar_btn_right.png differ diff --git a/views/res/scrollbar_btn_transparent_background.xml b/views/res/scrollbar_btn_transparent_background.xml new file mode 100644 index 00000000..43fe44f1 --- /dev/null +++ b/views/res/scrollbar_btn_transparent_background.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_pressed="true" + android:drawable="@drawable/scrollbar_btn_background_pressed" /> + <item android:state_focused="true" android:state_enabled="true" + android:drawable="@drawable/scrollbar_btn_background_normal" /> + <item android:state_enabled="true" android:state_hovered="true" + android:drawable="@drawable/scrollbar_btn_background_hover" /> + <item android:state_enabled="true" + android:drawable="@null" /> + <item + android:drawable="@null" /> +</selector> + diff --git a/views/res/scrollbar_btn_up.png b/views/res/scrollbar_btn_up.png index 1a229062..0fff3cff 100644 Binary files a/views/res/scrollbar_btn_up.png and b/views/res/scrollbar_btn_up.png differ diff --git a/views/res/scrollbar_indicator_horizontal.png b/views/res/scrollbar_indicator_horizontal.png index 1151c1e8..ea431b15 100644 Binary files a/views/res/scrollbar_indicator_horizontal.png and b/views/res/scrollbar_indicator_horizontal.png differ diff --git a/views/res/scrollbar_indicator_vertical.png b/views/res/scrollbar_indicator_vertical.png index ac0e1ae2..7b4f578c 100644 Binary files a/views/res/scrollbar_indicator_vertical.png and b/views/res/scrollbar_indicator_vertical.png differ diff --git a/views/res/theme_default.xml b/views/res/theme_default.xml index 86b9560c..bf7ba7a1 100644 --- a/views/res/theme_default.xml +++ b/views/res/theme_default.xml @@ -131,10 +131,16 @@ <drawable id="scrollbar_indicator_vertical" value="scrollbar_indicator_vertical"/> <drawable id="scrollbar_indicator_horizontal" value="scrollbar_indicator_horizontal"/> <style id="SCROLLBAR" - backgroundColor="#C0808080" + backgroundColor="#dce2e8" align="Center" /> - <style id="SCROLLBAR_BUTTON" parent="BUTTON" + <style id="SCROLLBAR_BUTTON" + backgroundImageId="scrollbar_btn_background" + align="Center" + /> + <style id="SCROLLBAR_BUTTON_TRANSPARENT" + backgroundImageId="scrollbar_btn_transparent_background" + align="Center" /> <style id="SLIDER" /> diff --git a/views/standard_resources.list b/views/standard_resources.list index 0efcb2f3..1be15d16 100644 --- a/views/standard_resources.list +++ b/views/standard_resources.list @@ -213,12 +213,19 @@ res/menu_item_background.xml res/menu_item_background_dark.xml res/popup_menu_background_normal.9.png res/popup_menu_background_normal_dark.9.png +res/scrollbar_btn_background.xml +res/scrollbar_btn_background_dark.xml +res/scrollbar_btn_background_disabled.9.png +res/scrollbar_btn_background_hover.9.png +res/scrollbar_btn_background_normal.9.png +res/scrollbar_btn_background_pressed.9.png res/scrollbar_btn_down.png res/scrollbar_btn_down_dark.png res/scrollbar_btn_left.png res/scrollbar_btn_left_dark.png res/scrollbar_btn_right.png res/scrollbar_btn_right_dark.png +res/scrollbar_btn_transparent_background.xml res/scrollbar_btn_up.png res/scrollbar_btn_up_dark.png res/scrollbar_indicator_horizontal.png