Skip to content

Commit 29871a1

Browse files
committed
Merge pull request #304 from SylvainCorlay/default_values
Default values for widget model attributes
2 parents 82d1a14 + f50cd48 commit 29871a1

31 files changed

+681
-284
lines changed

examples/development/web/index.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,14 @@ document.addEventListener("DOMContentLoaded", function(event) {
1414

1515
// Create the widget model.
1616
return manager.new_widget({
17-
model_name: 'WidgetModel',
18-
widget_class: 'ipywidgets.' + widgetType,
17+
model_name: widgetType + 'Model',
18+
widget_class: 'jupyter.' + widgetType,
1919
model_id: uuid()
2020
// Create a view for the model.
2121
}).then(function(model) {
2222
console.log(widgetType + ' model created', model);
2323

2424
model.set({
25-
_view_name: widgetType + 'View',
2625
description: description || '',
2726
value: value || null,
2827
visible: true

examples/notebooks/Widget Layout.ipynb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@
130130
"cell_type": "markdown",
131131
"metadata": {},
132132
"source": [
133-
"**5.** Colorpicker alignment, short and long version"
133+
"**5.** Colorpicker alignment, concise and long version"
134134
]
135135
},
136136
{
@@ -152,7 +152,7 @@
152152
},
153153
"outputs": [],
154154
"source": [
155-
"cp.short = True"
155+
"cp.concise = True"
156156
]
157157
},
158158
{
@@ -163,7 +163,7 @@
163163
},
164164
"outputs": [],
165165
"source": [
166-
"cp.short = False"
166+
"cp.concise = False"
167167
]
168168
},
169169
{
@@ -196,7 +196,7 @@
196196
},
197197
"outputs": [],
198198
"source": [
199-
"cp2.short = True"
199+
"cp2.concise = True"
200200
]
201201
},
202202
{
@@ -207,7 +207,7 @@
207207
},
208208
"outputs": [],
209209
"source": [
210-
"cp2.short = False"
210+
"cp2.concise = False"
211211
]
212212
},
213213
{

ipywidgets/static/widgets/js/layout.js

Lines changed: 34 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,40 @@ define([
1212
"jquery"
1313
], function(widget, _, Backbone, $) {
1414

15+
/**
16+
* css properties exposed by the layout widget with their default values.
17+
*/
18+
var css_properties = {
19+
align_content: "",
20+
align_items: "",
21+
align_self: "",
22+
border: "",
23+
bottom: "",
24+
display: "",
25+
flex: "",
26+
flex_flow: "",
27+
height: "",
28+
justify_content: "",
29+
left: "",
30+
margin: "",
31+
overflow: "",
32+
padding: "",
33+
right: "",
34+
top: "",
35+
visibility: "",
36+
width: ""
37+
};
38+
1539
/**
1640
* Represents a group of CSS style attributes
1741
*/
42+
var LayoutModel = widget.WidgetModel.extend({
43+
defaults: _.extend({}, widget.WidgetModel.prototype.defaults, {
44+
_model_name: "LayoutModel",
45+
_view_name: "LayoutView"
46+
}, css_properties),
47+
});
48+
1849
var LayoutView = widget.WidgetView.extend({
1950

2051
/**
@@ -24,33 +55,7 @@ define([
2455
LayoutView.__super__.initialize.apply(this, arguments);
2556
// Register the traits that live on the Python side
2657
this._traitNames = [];
27-
this.initTraits();
28-
},
29-
30-
/**
31-
* Initialize the traits for this layout object
32-
*/
33-
initTraits: function() {
34-
this.registerTraits(
35-
'align_content',
36-
'align_items',
37-
'align_self',
38-
'border',
39-
'bottom',
40-
'display',
41-
'flex',
42-
'flex_flow',
43-
'height',
44-
'justify_content',
45-
'left',
46-
'margin',
47-
'overflow',
48-
'padding',
49-
'right',
50-
'top',
51-
'visibility',
52-
'width'
53-
);
58+
this.registerTraits(Object.keys(css_properties));
5459
},
5560

5661
/**
@@ -126,6 +131,7 @@ define([
126131
});
127132

128133
return {
129-
LayoutView: LayoutView
134+
LayoutView: LayoutView,
135+
LayoutModel: LayoutModel
130136
};
131137
});

ipywidgets/static/widgets/js/requirejs-shim.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,14 @@ function requireLocalFiles() {
1111
require('./utils');
1212
require('./widget');
1313
require('./widget_int');
14+
require('./widget_box');
1415
require('./manager-base');
1516
require('../css/widgets.min.css');
1617
}
1718

1819
module.exports = function createDefine(targetModule) {
1920
var amdefine = require('amdefine')(targetModule, require);
20-
21+
2122
return function define() {
2223
var args = Array.prototype.slice.call(arguments);
2324
if (args.length > 1) {

ipywidgets/static/widgets/js/widget.js

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,15 @@ define(["./utils",
3939
};
4040

4141
var WidgetModel = Backbone.Model.extend({
42+
43+
defaults: {
44+
_model_module: null,
45+
_model_name: "WidgetModel",
46+
_view_module: "",
47+
_view_name: null,
48+
msg_throttle: 3
49+
},
50+
4251
constructor: function (widget_manager, model_id, comm) {
4352
/**
4453
* Constructor
@@ -240,7 +249,7 @@ define(["./utils",
240249
// Handle when a widget is updated via the python side.
241250
this.state_lock = state;
242251
try {
243-
WidgetModel.__super__.set.call(this, state);
252+
this.set(state);
244253
if (this._first_state) {
245254
this.trigger('ready', this);
246255
this._first_state = false;
@@ -305,10 +314,16 @@ define(["./utils",
305314
*/
306315
var return_value = WidgetModel.__super__.set.apply(this, arguments);
307316

308-
// Backbone only remembers the diff of the most recent set()
309-
// operation. Calling set multiple times in a row results in a
310-
// loss of diff information. Here we keep our own running diff.
311-
this._buffered_state_diff = _.extend(this._buffered_state_diff, this.changedAttributes() || {});
317+
if (!this._first_state) {
318+
// Backbone only remembers the diff of the most recent set()
319+
// operation. Calling set multiple times in a row results in a
320+
// loss of diff information. Here we keep our own running diff.
321+
//
322+
// However, we don't buffer the initial state comming from the
323+
// backend or the default values specified in `defaults`.
324+
//
325+
this._buffered_state_diff = _.extend(this._buffered_state_diff, this.changedAttributes() || {});
326+
}
312327
return return_value;
313328
},
314329

@@ -548,7 +563,11 @@ define(["./utils",
548563
}
549564
};
550565

551-
var DOMWidgetModel = WidgetModel.extend({}, {
566+
var DOMWidgetModel = WidgetModel.extend({
567+
defaults: _.extend({}, WidgetModel.prototype.defaults, {
568+
layout: undefined,
569+
}),
570+
}, {
552571
serializers: _.extend({
553572
layout: {deserialize: unpack_models},
554573
}, WidgetModel.serializers),
@@ -830,24 +849,24 @@ define(["./utils",
830849
});
831850
},
832851
});
833-
852+
834853
managerBase.ManagerBase.register_widget_model('WidgetModel', WidgetModel);
835854

836855
// For backwards compatibility.
837856
var WidgetView = Backbone.View.extend(WidgetViewMixin);
838857
var DOMWidgetView = WidgetView.extend(DOMWidgetViewMixin);
839858

840859
var widget = {
841-
'unpack_models': unpack_models,
842-
'WidgetModel': WidgetModel,
843-
'WidgetViewMixin': WidgetViewMixin,
844-
'DOMWidgetViewMixin': DOMWidgetViewMixin,
845-
'ViewList': ViewList,
846-
'DOMWidgetModel': DOMWidgetModel,
860+
unpack_models: unpack_models,
861+
WidgetModel: WidgetModel,
862+
WidgetViewMixin: WidgetViewMixin,
863+
DOMWidgetViewMixin: DOMWidgetViewMixin,
864+
ViewList: ViewList,
865+
DOMWidgetModel: DOMWidgetModel,
847866

848867
// For backwards compatibility.
849-
'WidgetView': WidgetView,
850-
'DOMWidgetView': DOMWidgetView,
868+
WidgetView: WidgetView,
869+
DOMWidgetView: DOMWidgetView,
851870
};
852871

853872
return widget;

ipywidgets/static/widgets/js/widget_bool.js

Lines changed: 46 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,28 @@ if (typeof define !== 'function') { var define = require('./requirejs-shim')(mod
77
define([
88
"./widget",
99
"jquery",
10+
"underscore",
1011
"bootstrap",
11-
], function(widget, $){
12+
], function(widget, $, _) {
13+
14+
var BoolModel = widget.DOMWidgetModel.extend({
15+
defaults: _.extend({}, widget.DOMWidgetModel.prototype.defaults, {
16+
value: false,
17+
description: "",
18+
disabled: false,
19+
_model_name: "BoolModel"
20+
}),
21+
});
22+
23+
var CheckboxModel = BoolModel.extend({
24+
defaults: _.extend({}, BoolModel.prototype.defaults, {
25+
_view_name: "CheckboxView",
26+
_model_name: "CheckboxModel"
27+
}),
28+
});
1229

1330
var CheckboxView = widget.DOMWidgetView.extend({
14-
render : function(){
31+
render: function(){
1532
/**
1633
* Called when view is rendered.
1734
*/
@@ -52,7 +69,7 @@ define([
5269
this.touch();
5370
},
5471

55-
update : function(options){
72+
update: function(options){
5673
/**
5774
* Update the contents of this view
5875
*
@@ -76,9 +93,18 @@ define([
7693
},
7794
});
7895

96+
var ToggleButtonModel = BoolModel.extend({
97+
defaults: _.extend({}, BoolModel.prototype.defaults, {
98+
_view_name: "ToggleButtonView",
99+
_model_name: "ToggleButtonModel",
100+
tooltip: "",
101+
icon: "",
102+
button_style: "",
103+
}),
104+
});
79105

80106
var ToggleButtonView = widget.DOMWidgetView.extend({
81-
render : function() {
107+
render: function() {
82108
/**
83109
* Called when view is rendered.
84110
*/
@@ -108,7 +134,7 @@ define([
108134
this.update_mapped_classes(class_map, 'button_style');
109135
},
110136

111-
update : function(options){
137+
update: function(options){
112138
/**
113139
* Update the contents of this view
114140
*
@@ -150,6 +176,13 @@ define([
150176
},
151177
});
152178

179+
var ValidModel = BoolModel.extend({
180+
defaults: _.extend({}, BoolModel.prototype.defaults, {
181+
readout: "Invalid",
182+
_view_name: "ValidView",
183+
_model_name: "ValidModel"
184+
}),
185+
});
153186

154187
var ValidView = widget.DOMWidgetView.extend({
155188
render: function() {
@@ -160,6 +193,7 @@ define([
160193
this.listenTo(this.model, "change", this.update, this);
161194
this.update();
162195
},
196+
163197
update: function() {
164198
/**
165199
* Update the contents of this view
@@ -188,8 +222,12 @@ define([
188222

189223

190224
return {
191-
'CheckboxView': CheckboxView,
192-
'ToggleButtonView': ToggleButtonView,
193-
'ValidView': ValidView,
225+
BoolModel: BoolModel,
226+
CheckboxModel: CheckboxModel,
227+
CheckboxView: CheckboxView,
228+
ToggleButtonModel: ToggleButtonModel,
229+
ToggleButtonView: ToggleButtonView,
230+
ValidModel: ValidModel,
231+
ValidView: ValidView,
194232
};
195233
});

0 commit comments

Comments
 (0)