1 // Written in the D programming language. 2 3 /** 4 5 This module implements support of tool bars. 6 7 ToolBarHost is layout to hold one or more toolbars. 8 9 ToolBar is bar with tool buttons and other controls arranged horizontally. 10 11 Synopsis: 12 13 ---- 14 import dlangui.widgets.toolbars; 15 ---- 16 17 18 Copyright: Vadim Lopatin, 2015 19 License: Boost License 1.0 20 Authors: Vadim Lopatin, coolreader.org@gmail.com 21 */ 22 module dlangui.widgets.toolbars; 23 24 import dlangui.widgets.widget; 25 import dlangui.widgets.layouts; 26 import dlangui.widgets.controls; 27 import dlangui.widgets.combobox; 28 29 /// Layout with several toolbars 30 class ToolBarHost : HorizontalLayout { 31 this(string ID) { 32 super(ID); 33 } 34 this() { 35 this("TOOLBAR_HOST"); 36 styleId = STYLE_TOOLBAR_HOST; 37 } 38 /// create and add new toolbar (returns existing one if already exists) 39 ToolBar getOrAddToolbar(string ID) { 40 ToolBar res = getToolbar(ID); 41 if (!res) { 42 res = new ToolBar(ID); 43 addChild(res); 44 } 45 return res; 46 } 47 /// get toolbar by id; null if not found 48 ToolBar getToolbar(string ID) { 49 Widget res = childById(ID); 50 if (res) { 51 ToolBar tb = cast(ToolBar)res; 52 return tb; 53 } 54 return null; 55 } 56 /// override to handle specific actions 57 override bool handleAction(const Action a) { 58 // route to focused control first, then to main widget 59 return window.dispatchAction(a); 60 } 61 62 /// map key to action 63 override Action findKeyAction(uint keyCode, uint flags) { 64 for (int i = 0; i < childCount; i++) { 65 auto a = child(i).findKeyAction(keyCode, flags); 66 if (a) 67 return a; 68 } 69 return null; 70 } 71 } 72 73 /// image button for toolbar 74 class ToolBarImageButton : ImageButton { 75 this(const Action a) { 76 super(a); 77 styleId = STYLE_TOOLBAR_BUTTON; 78 focusable = false; 79 } 80 mixin ActionTooltipSupport; 81 } 82 83 /// separator for toolbars 84 class ToolBarSeparator : ImageWidget { 85 this() { 86 super("separator", "toolbar_separator"); 87 styleId = STYLE_TOOLBAR_SEPARATOR; 88 } 89 } 90 91 /// separator for toolbars 92 class ToolBarComboBox : ComboBox { 93 this(string ID, dstring[] items) { 94 super(ID, items); 95 styleId = STYLE_TOOLBAR_CONTROL; 96 if (items.length > 0) 97 selectedItemIndex = 0; 98 } 99 mixin ActionTooltipSupport; 100 } 101 102 /// Layout with buttons 103 class ToolBar : HorizontalLayout { 104 this(string ID) { 105 super(ID); 106 styleId = STYLE_TOOLBAR; 107 } 108 this() { 109 this("TOOLBAR"); 110 } 111 void addCustomControl(Widget widget) { 112 addChild(widget); 113 } 114 /// adds image button to toolbar 115 void addButtons(const Action[] actions...) { 116 foreach(a; actions) { 117 if (a.isSeparator) { 118 addChild(new ToolBarSeparator()); 119 } else { 120 Widget btn; 121 if (a.iconId) { 122 btn = new ToolBarImageButton(a); 123 } else { 124 btn = new Button(a); 125 btn.styleId = STYLE_TOOLBAR_BUTTON; 126 } 127 addChild(btn); 128 } 129 } 130 } 131 132 void addControl(Widget widget) { 133 addChild(widget); 134 } 135 136 /// map key to action 137 override Action findKeyAction(uint keyCode, uint flags) { 138 for (int i = 0; i < childCount; i++) { 139 auto a = child(i).findKeyAction(keyCode, flags); 140 if (a) 141 return a; 142 } 143 return null; 144 } 145 }