##// END OF EJS Templates
Remove the popup widget
Jonathan Frederic -
Show More
@@ -1,369 +1,153 b''
1 // Copyright (c) IPython Development Team.
1 // Copyright (c) IPython Development Team.
2 // Distributed under the terms of the Modified BSD License.
2 // Distributed under the terms of the Modified BSD License.
3
3
4 define([
4 define([
5 "widgets/js/widget",
5 "widgets/js/widget",
6 "jqueryui",
6 "jqueryui",
7 "base/js/utils",
7 "base/js/utils",
8 "bootstrap",
8 "bootstrap",
9 ], function(widget, $, utils){
9 ], function(widget, $, utils){
10
10
11 var BoxView = widget.DOMWidgetView.extend({
11 var BoxView = widget.DOMWidgetView.extend({
12 initialize: function(){
12 initialize: function(){
13 /**
13 /**
14 * Public constructor
14 * Public constructor
15 */
15 */
16 BoxView.__super__.initialize.apply(this, arguments);
16 BoxView.__super__.initialize.apply(this, arguments);
17 this.children_views = new widget.ViewList(this.add_child_model, null, this);
17 this.children_views = new widget.ViewList(this.add_child_model, null, this);
18 this.listenTo(this.model, 'change:children', function(model, value) {
18 this.listenTo(this.model, 'change:children', function(model, value) {
19 this.children_views.update(value);
19 this.children_views.update(value);
20 }, this);
20 }, this);
21 this.listenTo(this.model, 'change:overflow_x', function(model, value) {
21 this.listenTo(this.model, 'change:overflow_x', function(model, value) {
22 this.update_overflow_x();
22 this.update_overflow_x();
23 }, this);
23 }, this);
24 this.listenTo(this.model, 'change:overflow_y', function(model, value) {
24 this.listenTo(this.model, 'change:overflow_y', function(model, value) {
25 this.update_overflow_y();
25 this.update_overflow_y();
26 }, this);
26 }, this);
27 this.listenTo(this.model, 'change:box_style', function(model, value) {
27 this.listenTo(this.model, 'change:box_style', function(model, value) {
28 this.update_box_style();
28 this.update_box_style();
29 }, this);
29 }, this);
30 },
30 },
31
31
32 update_attr: function(name, value) {
32 update_attr: function(name, value) {
33 /**
33 /**
34 * Set a css attr of the widget view.
34 * Set a css attr of the widget view.
35 */
35 */
36 this.$box.css(name, value);
36 this.$box.css(name, value);
37 },
37 },
38
38
39 render: function(){
39 render: function(){
40 /**
40 /**
41 * Called when view is rendered.
41 * Called when view is rendered.
42 */
42 */
43 this.$box = this.$el;
43 this.$box = this.$el;
44 this.$box.addClass('widget-box');
44 this.$box.addClass('widget-box');
45 this.children_views.update(this.model.get('children'));
45 this.children_views.update(this.model.get('children'));
46 this.update_overflow_x();
46 this.update_overflow_x();
47 this.update_overflow_y();
47 this.update_overflow_y();
48 this.update_box_style('');
48 this.update_box_style('');
49 },
49 },
50
50
51 update_overflow_x: function() {
51 update_overflow_x: function() {
52 /**
52 /**
53 * Called when the x-axis overflow setting is changed.
53 * Called when the x-axis overflow setting is changed.
54 */
54 */
55 this.$box.css('overflow-x', this.model.get('overflow_x'));
55 this.$box.css('overflow-x', this.model.get('overflow_x'));
56 },
56 },
57
57
58 update_overflow_y: function() {
58 update_overflow_y: function() {
59 /**
59 /**
60 * Called when the y-axis overflow setting is changed.
60 * Called when the y-axis overflow setting is changed.
61 */
61 */
62 this.$box.css('overflow-y', this.model.get('overflow_y'));
62 this.$box.css('overflow-y', this.model.get('overflow_y'));
63 },
63 },
64
64
65 update_box_style: function(previous_trait_value) {
65 update_box_style: function(previous_trait_value) {
66 var class_map = {
66 var class_map = {
67 success: ['alert', 'alert-success'],
67 success: ['alert', 'alert-success'],
68 info: ['alert', 'alert-info'],
68 info: ['alert', 'alert-info'],
69 warning: ['alert', 'alert-warning'],
69 warning: ['alert', 'alert-warning'],
70 danger: ['alert', 'alert-danger']
70 danger: ['alert', 'alert-danger']
71 };
71 };
72 this.update_mapped_classes(class_map, 'box_style', previous_trait_value, this.$box);
72 this.update_mapped_classes(class_map, 'box_style', previous_trait_value, this.$box);
73 },
73 },
74
74
75 add_child_model: function(model) {
75 add_child_model: function(model) {
76 /**
76 /**
77 * Called when a model is added to the children list.
77 * Called when a model is added to the children list.
78 */
78 */
79 var that = this;
79 var that = this;
80 var dummy = $('<div/>');
80 var dummy = $('<div/>');
81 that.$box.append(dummy);
81 that.$box.append(dummy);
82 return this.create_child_view(model).then(function(view) {
82 return this.create_child_view(model).then(function(view) {
83 dummy.replaceWith(view.el);
83 dummy.replaceWith(view.el);
84
84
85 // Trigger the displayed event of the child view.
85 // Trigger the displayed event of the child view.
86 that.after_displayed(function() {
86 that.after_displayed(function() {
87 view.trigger('displayed');
87 view.trigger('displayed');
88 });
88 });
89 return view;
89 return view;
90 }).catch(utils.reject("Couldn't add child view to box", true));
90 }).catch(utils.reject("Couldn't add child view to box", true));
91 },
91 },
92
92
93 remove: function() {
93 remove: function() {
94 /**
94 /**
95 * We remove this widget before removing the children as an optimization
95 * We remove this widget before removing the children as an optimization
96 * we want to remove the entire container from the DOM first before
96 * we want to remove the entire container from the DOM first before
97 * removing each individual child separately.
97 * removing each individual child separately.
98 */
98 */
99 BoxView.__super__.remove.apply(this, arguments);
99 BoxView.__super__.remove.apply(this, arguments);
100 this.children_views.remove();
100 this.children_views.remove();
101 },
101 },
102 });
102 });
103
103
104
104
105 var FlexBoxView = BoxView.extend({
105 var FlexBoxView = BoxView.extend({
106 render: function(){
106 render: function(){
107 FlexBoxView.__super__.render.apply(this);
107 FlexBoxView.__super__.render.apply(this);
108 this.listenTo(this.model, 'change:orientation', this.update_orientation, this);
108 this.listenTo(this.model, 'change:orientation', this.update_orientation, this);
109 this.listenTo(this.model, 'change:flex', this._flex_changed, this);
109 this.listenTo(this.model, 'change:flex', this._flex_changed, this);
110 this.listenTo(this.model, 'change:pack', this._pack_changed, this);
110 this.listenTo(this.model, 'change:pack', this._pack_changed, this);
111 this.listenTo(this.model, 'change:align', this._align_changed, this);
111 this.listenTo(this.model, 'change:align', this._align_changed, this);
112 this._flex_changed();
112 this._flex_changed();
113 this._pack_changed();
113 this._pack_changed();
114 this._align_changed();
114 this._align_changed();
115 this.update_orientation();
115 this.update_orientation();
116 },
116 },
117
117
118 update_orientation: function(){
118 update_orientation: function(){
119 var orientation = this.model.get("orientation");
119 var orientation = this.model.get("orientation");
120 if (orientation == "vertical") {
120 if (orientation == "vertical") {
121 this.$box.removeClass("hbox").addClass("vbox");
121 this.$box.removeClass("hbox").addClass("vbox");
122 } else {
122 } else {
123 this.$box.removeClass("vbox").addClass("hbox");
123 this.$box.removeClass("vbox").addClass("hbox");
124 }
124 }
125 },
125 },
126
126
127 _flex_changed: function(){
127 _flex_changed: function(){
128 if (this.model.previous('flex')) {
128 if (this.model.previous('flex')) {
129 this.$box.removeClass('box-flex' + this.model.previous('flex'));
129 this.$box.removeClass('box-flex' + this.model.previous('flex'));
130 }
130 }
131 this.$box.addClass('box-flex' + this.model.get('flex'));
131 this.$box.addClass('box-flex' + this.model.get('flex'));
132 },
132 },
133
133
134 _pack_changed: function(){
134 _pack_changed: function(){
135 if (this.model.previous('pack')) {
135 if (this.model.previous('pack')) {
136 this.$box.removeClass(this.model.previous('pack'));
136 this.$box.removeClass(this.model.previous('pack'));
137 }
137 }
138 this.$box.addClass(this.model.get('pack'));
138 this.$box.addClass(this.model.get('pack'));
139 },
139 },
140
140
141 _align_changed: function(){
141 _align_changed: function(){
142 if (this.model.previous('align')) {
142 if (this.model.previous('align')) {
143 this.$box.removeClass('align-' + this.model.previous('align'));
143 this.$box.removeClass('align-' + this.model.previous('align'));
144 }
144 }
145 this.$box.addClass('align-' + this.model.get('align'));
145 this.$box.addClass('align-' + this.model.get('align'));
146 },
146 },
147 });
147 });
148
148
149 var PopupView = BoxView.extend({
150
151 render: function(){
152 /**
153 * Called when view is rendered.
154 */
155 var that = this;
156
157 this.$el.on("remove", function(){
158 that.$backdrop.remove();
159 });
160 this.$backdrop = $('<div />')
161 .appendTo($('#notebook-container'))
162 .addClass('modal-dialog')
163 .css('position', 'absolute')
164 .css('left', '0px')
165 .css('top', '0px');
166 this.$window = $('<div />')
167 .appendTo(this.$backdrop)
168 .addClass('modal-content widget-modal')
169 .mousedown(function(){
170 that.bring_to_front();
171 });
172
173 // Set the elements array since the this.$window element is not child
174 // of this.$el and the parent widget manager or other widgets may
175 // need to know about all of the top-level widgets. The IPython
176 // widget manager uses this to register the elements with the
177 // keyboard manager.
178 this.additional_elements = [this.$window];
179
180 this.$title_bar = $('<div />')
181 .addClass('popover-title')
182 .appendTo(this.$window)
183 .mousedown(function(){
184 that.bring_to_front();
185 });
186 this.$close = $('<button />')
187 .addClass('close fa fa-remove')
188 .css('margin-left', '5px')
189 .appendTo(this.$title_bar)
190 .click(function(){
191 that.hide();
192 event.stopPropagation();
193 });
194 this.$minimize = $('<button />')
195 .addClass('close fa fa-arrow-down')
196 .appendTo(this.$title_bar)
197 .click(function(){
198 that.popped_out = !that.popped_out;
199 if (!that.popped_out) {
200 that.$minimize
201 .removeClass('fa-arrow-down')
202 .addClass('fa-arrow-up');
203
204 that.$window
205 .draggable('destroy')
206 .resizable('destroy')
207 .removeClass('widget-modal modal-content')
208 .addClass('docked-widget-modal')
209 .detach()
210 .insertBefore(that.$show_button);
211 that.$show_button.hide();
212 that.$close.hide();
213 } else {
214 that.$minimize
215 .addClass('fa-arrow-down')
216 .removeClass('fa-arrow-up');
217
218 that.$window
219 .removeClass('docked-widget-modal')
220 .addClass('widget-modal modal-content')
221 .detach()
222 .appendTo(that.$backdrop)
223 .draggable({handle: '.popover-title', snap: '#notebook, .modal', snapMode: 'both'})
224 .resizable()
225 .children('.ui-resizable-handle').show();
226 that.show();
227 that.$show_button.show();
228 that.$close.show();
229 }
230 event.stopPropagation();
231 });
232 this.$title = $('<div />')
233 .addClass('widget-modal-title')
234 .html("&nbsp;")
235 .appendTo(this.$title_bar);
236 this.$box = $('<div />')
237 .addClass('modal-body')
238 .addClass('widget-modal-body')
239 .addClass('widget-box')
240 .addClass('vbox')
241 .appendTo(this.$window);
242
243 this.$show_button = $('<button />')
244 .html("&nbsp;")
245 .addClass('btn btn-info widget-modal-show')
246 .appendTo(this.$el)
247 .click(function(){
248 that.show();
249 });
250
251 this.$window.draggable({handle: '.popover-title', snap: '#notebook, .modal', snapMode: 'both'});
252 this.$window.resizable();
253 this.$window.on('resize', function(){
254 that.$box.outerHeight(that.$window.innerHeight() - that.$title_bar.outerHeight());
255 });
256
257 this._shown_once = false;
258 this.popped_out = true;
259
260 this.children_views.update(this.model.get('children'))
261 },
262
263 hide: function() {
264 /**
265 * Called when the modal hide button is clicked.
266 */
267 this.$window.hide();
268 this.$show_button.removeClass('btn-info');
269 },
270
271 show: function() {
272 /**
273 * Called when the modal show button is clicked.
274 */
275 this.$show_button.addClass('btn-info');
276 this.$window.show();
277 if (this.popped_out) {
278 this.$window.css("positon", "absolute");
279 this.$window.css("top", "0px");
280 this.$window.css("left", Math.max(0, (($('body').outerWidth() - this.$window.outerWidth()) / 2) +
281 $(window).scrollLeft()) + "px");
282 this.bring_to_front();
283 }
284 },
285
286 bring_to_front: function() {
287 /**
288 * Make the modal top-most, z-ordered about the other modals.
289 */
290 var $widget_modals = $(".widget-modal");
291 var max_zindex = 0;
292 $widget_modals.each(function (index, el){
293 var zindex = parseInt($(el).css('z-index'));
294 if (!isNaN(zindex)) {
295 max_zindex = Math.max(max_zindex, zindex);
296 }
297 });
298
299 // Start z-index of widget modals at 2000
300 max_zindex = Math.max(max_zindex, 2000);
301
302 $widget_modals.each(function (index, el){
303 $el = $(el);
304 if (max_zindex == parseInt($el.css('z-index'))) {
305 $el.css('z-index', max_zindex - 1);
306 }
307 });
308 this.$window.css('z-index', max_zindex);
309 },
310
311 update: function(){
312 /**
313 * Update the contents of this view
314 *
315 * Called when the model is changed. The model may have been
316 * changed by another view or by a state update from the back-end.
317 */
318 var description = this.model.get('description');
319 if (description.trim().length === 0) {
320 this.$title.html("&nbsp;"); // Preserve title height
321 } else {
322 this.typeset(this.$title, description);
323 }
324
325 var button_text = this.model.get('button_text');
326 if (button_text.trim().length === 0) {
327 this.$show_button.html("&nbsp;"); // Preserve button height
328 } else {
329 this.$show_button.text(button_text);
330 }
331
332 if (!this._shown_once) {
333 this._shown_once = true;
334 this.show();
335 }
336
337 return PopupView.__super__.update.apply(this);
338 },
339
340 _get_selector_element: function(selector) {
341 /**
342 * Get an element view a 'special' jquery selector. (see widget.js)
343 *
344 * Since the modal actually isn't within the $el in the DOM, we need to extend
345 * the selector logic to allow the user to set css on the modal if need be.
346 * The convention used is:
347 * "modal" - select the modal div
348 * "modal [selector]" - select element(s) within the modal div.
349 * "[selector]" - select elements within $el
350 * "" - select the $el
351 */
352 if (selector.substring(0, 5) == 'modal') {
353 if (selector == 'modal') {
354 return this.$window;
355 } else {
356 return this.$window.find(selector.substring(6));
357 }
358 } else {
359 return PopupView.__super__._get_selector_element.apply(this, [selector]);
360 }
361 },
362 });
363
364 return {
149 return {
365 'BoxView': BoxView,
150 'BoxView': BoxView,
366 'PopupView': PopupView,
367 'FlexBoxView': FlexBoxView,
151 'FlexBoxView': FlexBoxView,
368 };
152 };
369 });
153 });
@@ -1,38 +1,38 b''
1 from .widget import Widget, DOMWidget, CallbackDispatcher, register
1 from .widget import Widget, DOMWidget, CallbackDispatcher, register
2
2
3 from .widget_bool import Checkbox, ToggleButton
3 from .widget_bool import Checkbox, ToggleButton
4 from .widget_button import Button
4 from .widget_button import Button
5 from .widget_box import Box, Popup, FlexBox, HBox, VBox
5 from .widget_box import Box, FlexBox, HBox, VBox
6 from .widget_float import FloatText, BoundedFloatText, FloatSlider, FloatProgress, FloatRangeSlider
6 from .widget_float import FloatText, BoundedFloatText, FloatSlider, FloatProgress, FloatRangeSlider
7 from .widget_image import Image
7 from .widget_image import Image
8 from .widget_int import IntText, BoundedIntText, IntSlider, IntProgress, IntRangeSlider
8 from .widget_int import IntText, BoundedIntText, IntSlider, IntProgress, IntRangeSlider
9 from .widget_output import Output
9 from .widget_output import Output
10 from .widget_selection import RadioButtons, ToggleButtons, Dropdown, Select
10 from .widget_selection import RadioButtons, ToggleButtons, Dropdown, Select
11 from .widget_selectioncontainer import Tab, Accordion
11 from .widget_selectioncontainer import Tab, Accordion
12 from .widget_string import HTML, Latex, Text, Textarea
12 from .widget_string import HTML, Latex, Text, Textarea
13 from .interaction import interact, interactive, fixed, interact_manual
13 from .interaction import interact, interactive, fixed, interact_manual
14 from .widget_link import Link, link, DirectionalLink, dlink
14 from .widget_link import Link, link, DirectionalLink, dlink
15
15
16 # Deprecated classes
16 # Deprecated classes
17 from .widget_bool import CheckboxWidget, ToggleButtonWidget
17 from .widget_bool import CheckboxWidget, ToggleButtonWidget
18 from .widget_button import ButtonWidget
18 from .widget_button import ButtonWidget
19 from .widget_box import ContainerWidget, PopupWidget
19 from .widget_box import ContainerWidget
20 from .widget_float import FloatTextWidget, BoundedFloatTextWidget, FloatSliderWidget, FloatProgressWidget
20 from .widget_float import FloatTextWidget, BoundedFloatTextWidget, FloatSliderWidget, FloatProgressWidget
21 from .widget_image import ImageWidget
21 from .widget_image import ImageWidget
22 from .widget_int import IntTextWidget, BoundedIntTextWidget, IntSliderWidget, IntProgressWidget
22 from .widget_int import IntTextWidget, BoundedIntTextWidget, IntSliderWidget, IntProgressWidget
23 from .widget_selection import RadioButtonsWidget, ToggleButtonsWidget, DropdownWidget, SelectWidget
23 from .widget_selection import RadioButtonsWidget, ToggleButtonsWidget, DropdownWidget, SelectWidget
24 from .widget_selectioncontainer import TabWidget, AccordionWidget
24 from .widget_selectioncontainer import TabWidget, AccordionWidget
25 from .widget_string import HTMLWidget, LatexWidget, TextWidget, TextareaWidget
25 from .widget_string import HTMLWidget, LatexWidget, TextWidget, TextareaWidget
26
26
27 # We use warn_explicit so we have very brief messages without file or line numbers.
27 # We use warn_explicit so we have very brief messages without file or line numbers.
28 # The concern is that file or line numbers will confuse the interactive user.
28 # The concern is that file or line numbers will confuse the interactive user.
29 # To ignore this warning, do:
29 # To ignore this warning, do:
30 #
30 #
31 # from warnings import filterwarnings
31 # from warnings import filterwarnings
32 # filterwarnings('ignore', module='IPython.html.widgets')
32 # filterwarnings('ignore', module='IPython.html.widgets')
33
33
34 from warnings import warn_explicit
34 from warnings import warn_explicit
35 __warningregistry__ = {}
35 __warningregistry__ = {}
36 warn_explicit("IPython widgets are experimental and may change in the future.",
36 warn_explicit("IPython widgets are experimental and may change in the future.",
37 FutureWarning, '', 0, module = 'IPython.html.widgets',
37 FutureWarning, '', 0, module = 'IPython.html.widgets',
38 registry = __warningregistry__, module_globals = globals)
38 registry = __warningregistry__, module_globals = globals)
@@ -1,91 +1,80 b''
1 """Box class.
1 """Box class.
2
2
3 Represents a container that can be used to group other widgets.
3 Represents a container that can be used to group other widgets.
4 """
4 """
5
5
6 # Copyright (c) IPython Development Team.
6 # Copyright (c) IPython Development Team.
7 # Distributed under the terms of the Modified BSD License.
7 # Distributed under the terms of the Modified BSD License.
8
8
9 from .widget import DOMWidget, register
9 from .widget import DOMWidget, register
10 from IPython.utils.traitlets import Unicode, Tuple, TraitError, Int, CaselessStrEnum
10 from IPython.utils.traitlets import Unicode, Tuple, TraitError, Int, CaselessStrEnum
11 from IPython.utils.warn import DeprecatedClass
11 from IPython.utils.warn import DeprecatedClass
12
12
13 @register('IPython.Box')
13 @register('IPython.Box')
14 class Box(DOMWidget):
14 class Box(DOMWidget):
15 """Displays multiple widgets in a group."""
15 """Displays multiple widgets in a group."""
16 _view_name = Unicode('BoxView', sync=True)
16 _view_name = Unicode('BoxView', sync=True)
17
17
18 # Child widgets in the container.
18 # Child widgets in the container.
19 # Using a tuple here to force reassignment to update the list.
19 # Using a tuple here to force reassignment to update the list.
20 # When a proper notifying-list trait exists, that is what should be used here.
20 # When a proper notifying-list trait exists, that is what should be used here.
21 children = Tuple(sync=True, allow_none=False)
21 children = Tuple(sync=True, allow_none=False)
22
22
23 _overflow_values = ['visible', 'hidden', 'scroll', 'auto', 'initial', 'inherit', '']
23 _overflow_values = ['visible', 'hidden', 'scroll', 'auto', 'initial', 'inherit', '']
24 overflow_x = CaselessStrEnum(
24 overflow_x = CaselessStrEnum(
25 values=_overflow_values,
25 values=_overflow_values,
26 default_value='', allow_none=False, sync=True, help="""Specifies what
26 default_value='', allow_none=False, sync=True, help="""Specifies what
27 happens to content that is too large for the rendered region.""")
27 happens to content that is too large for the rendered region.""")
28 overflow_y = CaselessStrEnum(
28 overflow_y = CaselessStrEnum(
29 values=_overflow_values,
29 values=_overflow_values,
30 default_value='', allow_none=False, sync=True, help="""Specifies what
30 default_value='', allow_none=False, sync=True, help="""Specifies what
31 happens to content that is too large for the rendered region.""")
31 happens to content that is too large for the rendered region.""")
32
32
33 box_style = CaselessStrEnum(
33 box_style = CaselessStrEnum(
34 values=['success', 'info', 'warning', 'danger', ''],
34 values=['success', 'info', 'warning', 'danger', ''],
35 default_value='', allow_none=True, sync=True, help="""Use a
35 default_value='', allow_none=True, sync=True, help="""Use a
36 predefined styling for the box.""")
36 predefined styling for the box.""")
37
37
38 def __init__(self, children = (), **kwargs):
38 def __init__(self, children = (), **kwargs):
39 kwargs['children'] = children
39 kwargs['children'] = children
40 super(Box, self).__init__(**kwargs)
40 super(Box, self).__init__(**kwargs)
41 self.on_displayed(Box._fire_children_displayed)
41 self.on_displayed(Box._fire_children_displayed)
42
42
43 def _fire_children_displayed(self):
43 def _fire_children_displayed(self):
44 for child in self.children:
44 for child in self.children:
45 child._handle_displayed()
45 child._handle_displayed()
46
46
47
47
48 @register('IPython.Popup')
49 class Popup(Box):
50 """Displays multiple widgets in an in page popup div."""
51 _view_name = Unicode('PopupView', sync=True)
52
53 description = Unicode(sync=True)
54 button_text = Unicode(sync=True)
55
56
57 @register('IPython.FlexBox')
48 @register('IPython.FlexBox')
58 class FlexBox(Box):
49 class FlexBox(Box):
59 """Displays multiple widgets using the flexible box model."""
50 """Displays multiple widgets using the flexible box model."""
60 _view_name = Unicode('FlexBoxView', sync=True)
51 _view_name = Unicode('FlexBoxView', sync=True)
61 orientation = CaselessStrEnum(values=['vertical', 'horizontal'], default_value='vertical', sync=True)
52 orientation = CaselessStrEnum(values=['vertical', 'horizontal'], default_value='vertical', sync=True)
62 flex = Int(0, sync=True, help="""Specify the flexible-ness of the model.""")
53 flex = Int(0, sync=True, help="""Specify the flexible-ness of the model.""")
63 def _flex_changed(self, name, old, new):
54 def _flex_changed(self, name, old, new):
64 new = min(max(0, new), 2)
55 new = min(max(0, new), 2)
65 if self.flex != new:
56 if self.flex != new:
66 self.flex = new
57 self.flex = new
67
58
68 _locations = ['start', 'center', 'end', 'baseline', 'stretch']
59 _locations = ['start', 'center', 'end', 'baseline', 'stretch']
69 pack = CaselessStrEnum(
60 pack = CaselessStrEnum(
70 values=_locations,
61 values=_locations,
71 default_value='start', allow_none=False, sync=True)
62 default_value='start', allow_none=False, sync=True)
72 align = CaselessStrEnum(
63 align = CaselessStrEnum(
73 values=_locations,
64 values=_locations,
74 default_value='start', allow_none=False, sync=True)
65 default_value='start', allow_none=False, sync=True)
75
66
76
67
77 def VBox(*pargs, **kwargs):
68 def VBox(*pargs, **kwargs):
78 """Displays multiple widgets vertically using the flexible box model."""
69 """Displays multiple widgets vertically using the flexible box model."""
79 kwargs['orientation'] = 'vertical'
70 kwargs['orientation'] = 'vertical'
80 return FlexBox(*pargs, **kwargs)
71 return FlexBox(*pargs, **kwargs)
81
72
82 def HBox(*pargs, **kwargs):
73 def HBox(*pargs, **kwargs):
83 """Displays multiple widgets horizontally using the flexible box model."""
74 """Displays multiple widgets horizontally using the flexible box model."""
84 kwargs['orientation'] = 'horizontal'
75 kwargs['orientation'] = 'horizontal'
85 return FlexBox(*pargs, **kwargs)
76 return FlexBox(*pargs, **kwargs)
86
77
87
78
88 # Remove in IPython 4.0
79 # Remove in IPython 4.0
89 ContainerWidget = DeprecatedClass(Box, 'ContainerWidget')
80 ContainerWidget = DeprecatedClass(Box, 'ContainerWidget')
90 PopupWidget = DeprecatedClass(Popup, 'PopupWidget')
91
General Comments 0
You need to be logged in to leave comments. Login now