From 6f44eb584564fdc58aada34f83af90ce8981c7e2 Mon Sep 17 00:00:00 2001 From: Vadim Lopatin <coolreader.org@gmail.com> Date: Fri, 16 Jan 2015 15:08:55 +0300 Subject: [PATCH] toolbars; fix focus problems in dock host --- res/mdpi/toolbar_background.9.png | Bin 251 -> 247 bytes res/mdpi/toolbar_button_hover.9.png | Bin 0 -> 246 bytes res/mdpi/toolbar_button_pressed.9.png | Bin 0 -> 245 bytes res/theme_default.xml | 8 +- res/toolbar_button_background.xml | 23 ++++++ src/dlangui/widgets/docks.d | 2 + src/dlangui/widgets/toolbars.d | 104 ++++++++++++++++++++++++++ src/dlangui/widgets/widget.d | 4 +- 8 files changed, 137 insertions(+), 4 deletions(-) create mode 100644 res/mdpi/toolbar_button_hover.9.png create mode 100644 res/mdpi/toolbar_button_pressed.9.png create mode 100644 res/toolbar_button_background.xml create mode 100644 src/dlangui/widgets/toolbars.d diff --git a/res/mdpi/toolbar_background.9.png b/res/mdpi/toolbar_background.9.png index c9fe6f76818ed83f58e7e5e0e58d3f746a62891f..8b65deb3067ec07c7ba7cb281565f9511a70884a 100644 GIT binary patch delta 147 zcmV;E0BryJ0rvrrR0|6pE=C8Zga7~lgppqxeKMc%!-o$HAHV(o&p>5x>GE|3TXQW& z7MQ@h58oJQ0hkzQ449C^{K?~o4C11Kc-f=?0Re&kwD$p_R5AGDVAO(93q~y%CKfOb zX&=C=OlsF?PaZ#Hur=3Wq`41RU==h?gNT;R765!iG|wRX`Bne`002ovPDHLkV1noE BJkkIF delta 152 zcmV;J0B8UA0s8@vR0|3s82gMN)c^nhh>>3#f4Ts}e;R<zJCFVU@Zkdk3(TSm*Pk)a z0x&Vq7%(A+`IE;F8N@{e@v=z)0s;d6Y3~C<sbcWQ!KekJ7K~ajOe|m=(mr7P@Zkdk zKR^F}YS(B_9zSHTHP>RKxer(v7#J9~>^e@{Afjcn1pxZSgYB~INRj{m002ovPDHLk G0$_qE)jyj6 diff --git a/res/mdpi/toolbar_button_hover.9.png b/res/mdpi/toolbar_button_hover.9.png new file mode 100644 index 0000000000000000000000000000000000000000..97bdd49e58fbaf194475d621edc5e366dd2dfc9f GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g)!3HFq6y&A?DYhhUcNd2LAh=-f^2tCE&H|6f zVg?3oVGw3ym^DWND9B#o>FdgVpHYCD+wxQ5k#L|;v!{z=h{fsTKOY`4gFtgb0|T?j zpL7L&10w?ig9B&4GKa69Uiw6;?Xr*?8yj2O^7i2W-V$zsM~{d<pKj<O;bv%Lc!9$p zP+*w_qjCS^`dPawt~>~AcITA~V>1rAePMt6x6A8pq%>Yr;L$&)zj)oj4Xaqfnhic% g{8PXF`$P?ctgXs%*{iGO0iDC(>FVdQ&MBb@0GQEJ#sB~S literal 0 HcmV?d00001 diff --git a/res/mdpi/toolbar_button_pressed.9.png b/res/mdpi/toolbar_button_pressed.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6e4bd8b73bd8389d300bbdb181f8bf0cfafe83b8 GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g)!3HFq6y&A?DYhhUcNd2LAh=-f^2tCE&H|6f zVg?3oVGw3ym^DWND9B#o>FdgVpHYCDPjX9zz%8Iqlc$Sgh{fsTKOY`4gFtgb0|T?j zpL7L&10w?ig9B&4GKa69Uiw6;?Xr*?8yj2O^7i2W-Y+5ojvf&Y_cQR2a5FSAyue`) zD6q_e(YXI{{j6OTR~`g5yYtG0u^9*5zOX<3+vRmPQW~!*@aV6bvtZr94Xa!Z8F0l- foAkOi#g0LHx5_)u+u!_vu3_+W^>bP0l+XkK0xeSC literal 0 HcmV?d00001 diff --git a/res/theme_default.xml b/res/theme_default.xml index 5f31a2a6..1ace59f3 100644 --- a/res/theme_default.xml +++ b/res/theme_default.xml @@ -101,6 +101,7 @@ <state state_pressed="true" backgroundColor="#C0404080"/> <state state_hovered="true" backgroundColor="#F0404080"/> </style> + <style id="TAB_UP" backgroundImageId="tab_up_background" layoutWidth="FILL_PARENT" @@ -125,9 +126,9 @@ backgroundColor="#F0F0F0" /> <style id="TAB_WIDGET" - padding="3,3,3,3" backgroundColor="#EEEEEE" /> + <style id="MAIN_MENU" layoutWidth="FILL_PARENT" backgroundColor="#EFEFF2" @@ -275,9 +276,10 @@ margins="2,2,2,2" /> <style id="TOOLBAR_BUTTON" - backgroundImageId="btn_background_transparent" + backgroundImageId="toolbar_button_background" align="Center" - margins="2,2,2,2" + margins="1,1,1,1" + padding="4,4,4,4" /> <style id="TOOLBAR_SEPARATOR" align="Center" diff --git a/res/toolbar_button_background.xml b/res/toolbar_button_background.xml new file mode 100644 index 00000000..f48d7a4d --- /dev/null +++ b/res/toolbar_button_background.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android" > + <item + android:drawable="toolbar_button_hover" + android:state_enabled="false" + android:state_focused="true" /> + <item + android:drawable="toolbar_button_hover" + android:state_hovered="true" + android:state_focused="true" /> + <item + android:drawable="toolbar_button_hover" + android:state_focused="true" + /> + <item + android:drawable="toolbar_button_pressed" + android:state_pressed="true" /> + <item + android:drawable="toolbar_button_hover" + android:state_hovered="true" /> + <item + android:drawable="@null" /> +</selector> diff --git a/src/dlangui/widgets/docks.d b/src/dlangui/widgets/docks.d index cf1b8055..bbea8b20 100644 --- a/src/dlangui/widgets/docks.d +++ b/src/dlangui/widgets/docks.d @@ -37,6 +37,7 @@ class DockHost : WidgetGroupDefaultDrawing { _children.replace(widget, _bodyWidget); _bodyWidget = widget; _bodyWidget.layoutWidth(FILL_PARENT).layoutHeight(FILL_PARENT); + _bodyWidget.parent = this; } void addDockedWindow(DockWindow dockWin) { @@ -158,6 +159,7 @@ class DockWindow : VerticalLayout { _children.replace(widget, _bodyWidget); _bodyWidget = widget; _bodyWidget.layoutWidth(FILL_PARENT).layoutHeight(FILL_PARENT); + _bodyWidget.parent = this; requestLayout(); } diff --git a/src/dlangui/widgets/toolbars.d b/src/dlangui/widgets/toolbars.d new file mode 100644 index 00000000..bb943bdf --- /dev/null +++ b/src/dlangui/widgets/toolbars.d @@ -0,0 +1,104 @@ +// Written in the D programming language. + +/** + +This module implements support of tool bars. + +ToolBarHost is layout to hold one or more toolbars. + +ToolBar is bar with tool buttons and other controls arranged horizontally. + +Synopsis: + +---- +import dlangui.widgets.toolbars; +---- + + +Copyright: Vadim Lopatin, 2015 +License: Boost License 1.0 +Authors: Vadim Lopatin, coolreader.org@gmail.com +*/ +module dlangui.widgets.toolbars; + +import dlangui.widgets.widget; +import dlangui.widgets.layouts; +import dlangui.widgets.controls; + +/// Layout with several toolbars +class ToolBarHost : HorizontalLayout { + this(string ID) { + super(ID); + } + this() { + this("TOOLBAR_HOST"); + styleId = STYLE_TOOLBAR_HOST; + } + /// create and add new toolbar (returns existing one if already exists) + ToolBar getOrAddToolbar(string ID) { + ToolBar res = getToolbar(ID); + if (!res) { + res = new ToolBar(ID); + addChild(res); + } + return res; + } + /// get toolbar by id; null if not found + ToolBar getToolbar(string ID) { + Widget res = childById(ID); + if (res) { + ToolBar tb = cast(ToolBar)res; + return tb; + } + return null; + } +} + +/// image button for toolbar +class ToolBarImageButton : ImageButton { + this(Action a) { + super(a); + styleId = STYLE_TOOLBAR_BUTTON; + focusable = false; + } +} + +/// separator for toolbars +class ToolBarSeparator : ImageWidget { + this() { + super("separator", "toolbar_separator"); + styleId = STYLE_TOOLBAR_SEPARATOR; + } +} + +/// Layout with buttons +class ToolBar : HorizontalLayout { + this(string ID) { + super(ID); + styleId = STYLE_TOOLBAR; + } + this() { + this("TOOLBAR"); + } + void addCustomControl(Widget widget) { + addChild(widget); + } + /// adds image button to toolbar + void addButtons(Action[] actions...) { + foreach(a; actions) { + if (a.isSeparator) { + addChild(new ToolBarSeparator()); + } else { + Widget btn; + if (a.iconId) { + btn = new ToolBarImageButton(a); + } else { + btn = new Button(a); + btn.styleId = STYLE_TOOLBAR_BUTTON; + } + addChild(btn); + } + } + } + +} diff --git a/src/dlangui/widgets/widget.d b/src/dlangui/widgets/widget.d index 9b9db26d..e8d3f78b 100644 --- a/src/dlangui/widgets/widget.d +++ b/src/dlangui/widgets/widget.d @@ -1283,7 +1283,9 @@ class Widget { return null; } /// sets window (to be used for top level widget from Window implementation). TODO: hide it from API? - @property void window(Window window) { _window = window; } + @property void window(Window window) { + _window = window; + } void removeAllChildren() { // override