##// END OF EJS Templates
remove useless jquery selector
remove useless jquery selector

File last commit:

r9070:25d6ebf8
r9071:594da803
Show More
celltoolbar.js
353 lines | 12.8 KiB | application/javascript | JavascriptLexer
Matthias BUSSONNIER
Add a per cell toolbar....
r9055 //----------------------------------------------------------------------------
// Copyright (C) 2012 The IPython Development Team
//
// Distributed under the terms of the BSD License. The full license is in
// the file COPYING, distributed as part of this software.
//----------------------------------------------------------------------------
//============================================================================
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 // CellToolbar
Matthias BUSSONNIER
Add a per cell toolbar....
r9055 //============================================================================
/**
* A Module to control the per-cell toolbar.
* @module IPython
* @namespace IPython
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 * @submodule CellToolbar
Matthias BUSSONNIER
Add a per cell toolbar....
r9055 */
var IPython = (function (IPython) {
"use strict";
/**
* @constructor
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 * @class CellToolbar
Matthias BUSSONNIER
Add a per cell toolbar....
r9055 * @param {The cell to attach the metadata UI to} cell
*/
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 var CellToolbar = function (cell) {
CellToolbar._instances.push(this);
this.inner_element = $('<div/>');
Matthias BUSSONNIER
Add a per cell toolbar....
r9055 this.cell = cell;
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 this.element = $('<div/>').addClass('celltoolbar')
.append(this.inner_element)
Matthias BUSSONNIER
Add a per cell toolbar....
r9055 this.rebuild();
return this;
};
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 CellToolbar.dropdown_preset_element = $('<select/>')
Matthias BUSSONNIER
fix css size
r9070 .addClass('ui-widget ui-widget-content')
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 .attr('id','celltoolbar_selector')
Matthias BUSSONNIER
enable dropdown preset change
r9062 .append($('<option/>').attr('value','').text('-'))
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 CellToolbar.dropdown_preset_element.change(function(){
var val = CellToolbar.dropdown_preset_element.val()
Matthias BUSSONNIER
enable dropdown preset change
r9062 if(val ==''){
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 $('body').removeClass('celltoolbar-on')
Matthias BUSSONNIER
enable dropdown preset change
r9062 } else {
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 $('body').addClass('celltoolbar-on')
CellToolbar.set_preset(val)
Matthias BUSSONNIER
enable dropdown preset change
r9062 }
})
Matthias BUSSONNIER
Add a per cell toolbar....
r9055 /**
* Class variable that should contain a dict of all availlable callback
* we need to think of wether or not we allow nested namespace
* @property _callback_dict
* @private
*/
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 CellToolbar._callback_dict = {};
Matthias BUSSONNIER
Add a per cell toolbar....
r9055
/**
* Class variable that should contain the reverse order list of the button
* to add to the toolbar of each cell
Matthias BUSSONNIER
rename _button_list to _ui_controls_list
r9066 * @property _ui_controls_list
Matthias BUSSONNIER
Add a per cell toolbar....
r9055 * @private
*/
Matthias BUSSONNIER
rename _button_list to _ui_controls_list
r9066 CellToolbar._ui_controls_list = [];
Matthias BUSSONNIER
Add a per cell toolbar....
r9055
/**
* keep a list of all instances to
* be able to llop over them...
* but how to 'destroy' them ?
* have to think about it...
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 * or loop over the cells, and find their CellToolbar instances.
Matthias BUSSONNIER
Add a per cell toolbar....
r9055 * @private
* @property _instances
*/
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 CellToolbar._instances =[]
Matthias BUSSONNIER
Add a per cell toolbar....
r9055
/**
* keep a list of all the availlabel presets for the toolbar
* @private
* @property _presets
*/
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 CellToolbar._presets ={}
Matthias BUSSONNIER
Add a per cell toolbar....
r9055
// this is by design not a prototype.
/**
* Register a callback to create an UI element in a cell toolbar.
* @method register_callback
* @param name {String} name to use to refer to the callback. It is advised to use a prefix with the name
* for easier sorting and avoid collision
* @param callback {function(div, cell)} callback that will be called to generate the ui element
*
*
* The callback will receive the following element :
*
* * a div in which to add element.
* * the cell it is responsable from
*
* @example
*
* Example that create callback for a button that toggle between `true` and `false` label,
* with the metadata under the key 'foo' to reflect the status of the button.
*
* // first param reference to a DOM div
* // second param reference to the cell.
* var toggle = function(div, cell) {
* var button_container = $(div)
*
* // let's create a button that show the current value of the metadata
* var button = $('<div/>').button({label:String(cell.metadata.foo)});
*
* // On click, change the metadata value and update the button label
* button.click(function(){
* var v = cell.metadata.foo;
* cell.metadata.foo = !v;
* button.button("option","label",String(!v));
* })
*
* // add the button to the DOM div.
* button_container.append(button);
* }
*
* // now we register the callback under the name `foo` to give the
* // user the ability to use it later
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 * CellToolbar.register_callback('foo',toggle);
Matthias BUSSONNIER
Add a per cell toolbar....
r9055 */
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 CellToolbar.register_callback = function(name, callback){
Matthias BUSSONNIER
Add a per cell toolbar....
r9055 // what do we do if name already exist ?
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 CellToolbar._callback_dict[name] = callback;
Matthias BUSSONNIER
Add a per cell toolbar....
r9055 };
/**
* Register a preset of UI element in a cell toolbar.
* Not supported Yet.
* @method register_preset
* @param name {String} name to use to refer to the preset. It is advised to use a prefix with the name
* for easier sorting and avoid collision
* @param preset_list {List of String} reverse order of the button in the toolbar. Each String of the list
* should correspond to a name of a registerd callback.
*
* @private
* @example
*
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 * CellToolbar.register_callback('foo.c1',function(div,cell){...});
* CellToolbar.register_callback('foo.c2',function(div,cell){...});
* CellToolbar.register_callback('foo.c3',function(div,cell){...});
* CellToolbar.register_callback('foo.c4',function(div,cell){...});
* CellToolbar.register_callback('foo.c5',function(div,cell){...});
Matthias BUSSONNIER
Add a per cell toolbar....
r9055 *
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 * CellToolbar.register_preset('foo.foo_preset1',['foo.c1','foo.c2','foo.c5'])
* CellToolbar.register_preset('foo.foo_preset2',['foo.c4','foo.c5'])
Matthias BUSSONNIER
Add a per cell toolbar....
r9055 */
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 CellToolbar.register_preset = function(name, preset_list){
CellToolbar._presets[name] = preset_list
CellToolbar.dropdown_preset_element.append(
Matthias BUSSONNIER
enable dropdown preset change
r9062 $('<option/>').attr('value',name).text(name)
)
Matthias BUSSONNIER
Add a per cell toolbar....
r9055 }
/**
* set an UI preset from `register_preset`
* @method set_preset
* @param preset_name {String} string corresponding to the preset name
*
* @static
* @private
* @example
*
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 * CellToolbar.set_preset('foo.foo_preset1');
Matthias BUSSONNIER
Add a per cell toolbar....
r9055 */
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 CellToolbar.set_preset= function(preset_name){
var preset = CellToolbar._presets[preset_name];
Matthias BUSSONNIER
Add a per cell toolbar....
r9055
if(preset != undefined){
Matthias BUSSONNIER
rename _button_list to _ui_controls_list
r9066 CellToolbar._ui_controls_list = preset;
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 CellToolbar.rebuild_all();
Matthias BUSSONNIER
Add a per cell toolbar....
r9055 }
}
Matthias BUSSONNIER
enable dropdown preset change
r9062
Matthias BUSSONNIER
Add a per cell toolbar....
r9055 // this is by design not a prototype.
/**
* This should be called on the class and not on a instance as it will trigger
* rebuild of all the instances.
* @method rebuild_all
* @static
*
*/
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 CellToolbar.rebuild_all = function(){
for(var i in CellToolbar._instances){
CellToolbar._instances[i].rebuild();
Matthias BUSSONNIER
Add a per cell toolbar....
r9055 }
}
/**
* Rebuild all the button on the toolbar to update it's state.
* @method rebuild
*/
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 CellToolbar.prototype.rebuild = function(){
Matthias BUSSONNIER
Add a per cell toolbar....
r9055 // strip evrything from the div
// which is probabli metainner.
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 // or this.element.
this.inner_element.empty();
Matthias BUSSONNIER
Add a per cell toolbar....
r9055
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 var cdict = CellToolbar._callback_dict;
Matthias BUSSONNIER
rename _button_list to _ui_controls_list
r9066 var preset = CellToolbar._ui_controls_list;
Matthias BUSSONNIER
Add a per cell toolbar....
r9055 // Yes we iterate on the class varaible, not the instance one.
Matthias BUSSONNIER
rename _button_list to _ui_controls_list
r9066 for ( var index in CellToolbar._ui_controls_list){
Matthias BUSSONNIER
Add a per cell toolbar....
r9055 var local_div = $('<div/>').addClass('button_container');
Matthias BUSSONNIER
add utils and docs for metadata UI...
r9056 // Note,
// do this the other way, wrap in try/catch and don't append if any errors.
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 this.inner_element.append(local_div)
Matthias BUSSONNIER
Add a per cell toolbar....
r9055 cdict[preset[index]](local_div,this.cell)
}
}
Matthias BUSSONNIER
remove most of the duplicate example
r9067
Matthias BUSSONNIER
add a small default metaui-toolbar...
r9061
Matthias BUSSONNIER
Add a per cell toolbar....
r9055
Matthias BUSSONNIER
add utils and docs for metadata UI...
r9056 /**
*/
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 CellToolbar.utils = {};
Matthias BUSSONNIER
add utils and docs for metadata UI...
r9056
/**
* A utility function to generate bindings between a checkbox and metadata
* @method utils.checkbox_ui_generator
* @static
*
* @param name {string} Label in front of the checkbox
Matthias BUSSONNIER
create metadata-dropdowm-menu generator
r9058 * @param setter {function( metadata_dict, newValue )}
* A setter method to set the newValue of the metadata dictionnary
* @param getter {function( metadata )}
* A getter methods which return the current value of the metadata.
Matthias BUSSONNIER
add utils and docs for metadata UI...
r9056 *
* @return callback {function( div, cell )} Callback to be passed to `register_callback`
*
* @example
*
* An exmple that bind the subkey `slideshow.isSectionStart` to a checkbox with a `New Slide` label
*
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 * var newSlide = CellToolbar.utils.checkbox_ui_generator('New Slide',
Matthias BUSSONNIER
add utils and docs for metadata UI...
r9056 * // setter
* function(metadata,value){
* // we check that the slideshow namespace exist and create it if needed
* if (metadata.slideshow == undefined){metadata.slideshow = {}}
* // set the value
* metadata.slideshow.isSectionStart = value
* },
* //geter
* function(metadata){ var ns = metadata.slideshow;
* // if the slideshow namespace does not exist return `undefined`
* // (will be interpreted as `false` by checkbox) otherwise
* // return the value
* return (ns == undefined)? undefined: ns.isSectionStart
* }
* );
*
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 * CellToolbar.register_callback('newSlide', newSlide);
Matthias BUSSONNIER
add utils and docs for metadata UI...
r9056 *
*/
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 CellToolbar.utils.checkbox_ui_generator = function(name,setter,getter){
Matthias BUSSONNIER
add utils and docs for metadata UI...
r9056 return function(div, cell) {
var button_container = $(div)
var chkb = $('<input/>').attr('type','checkbox');
var lbl = $('<label/>').append($('<span/>').text(name).css('font-size','77%'));
lbl.append(chkb);
chkb.attr("checked",getter(cell.metadata));
chkb.click(function(){
var v = getter(cell.metadata);
setter(cell.metadata,!v);
chkb.attr("checked",!v);
})
button_container.append($('<div/>').append(lbl));
}
}
Matthias BUSSONNIER
Add a per cell toolbar....
r9055
Matthias BUSSONNIER
create metadata-dropdowm-menu generator
r9058 /**
* A utility function to generate bindings between a dropdown list and metadata
* @method utils.select_ui_generator
* @static
*
* @param list_list {list of sublist} List of sublist of metadata value and name in the dropdown list.
* subslit shoud contain 2 element each, first a string that woul be displayed in the dropdown list,
* and second the corresponding value for the metadata to be passed to setter/return by getter.
* @param setter {function( metadata_dict, newValue )}
* A setter method to set the newValue of the metadata dictionnary
* @param getter {function( metadata )}
* A getter methods which return the current value of the metadata.
* @param [label=""] {String} optionnal label for the dropdown menu
*
* @return callback {function( div, cell )} Callback to be passed to `register_callback`
*
* @example
*
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 * var select_type = CellToolbar.utils.select_ui_generator([
Matthias BUSSONNIER
create metadata-dropdowm-menu generator
r9058 * ["-" ,undefined ],
* ["Header Slide" ,"header_slide" ],
* ["Slide" ,"slide" ],
* ["Fragment" ,"fragment" ],
* ["Skip" ,"skip" ],
* ],
* // setter
* function(metadata,value){
* // we check that the slideshow namespace exist and create it if needed
* if (metadata.slideshow == undefined){metadata.slideshow = {}}
* // set the value
* metadata.slideshow.slide_type = value
* },
* //geter
* function(metadata){ var ns = metadata.slideshow;
* // if the slideshow namespace does not exist return `undefined`
* // (will be interpreted as `false` by checkbox) otherwise
* // return the value
* return (ns == undefined)? undefined: ns.slide_type
* }
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 * CellToolbar.register_callback('slideshow.select',select_type);
Matthias BUSSONNIER
create metadata-dropdowm-menu generator
r9058 *
*/
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 CellToolbar.utils.select_ui_generator = function(list_list,setter, getter, label){
Matthias BUSSONNIER
create metadata-dropdowm-menu generator
r9058 label= label? label: "";
return function(div, cell) {
var button_container = $(div)
var lbl = $("<label/>").append($('<span/>').text(label).css('font-size','77%'));
var select = $('<select/>');
for(var itemn in list_list){
var opt = $('<option/>');
opt.attr('value',list_list[itemn][1])
opt.text(list_list[itemn][0])
select.append(opt);
}
select.val(getter(cell.metadata));
select.change(function(){
setter(cell.metadata,select.val());
});
button_container.append($('<div/>').append(lbl).append(select));
}
};
Matthias BUSSONNIER
rename metaui -> celltoolbar
r9064 IPython.CellToolbar = CellToolbar;
Matthias BUSSONNIER
Add a per cell toolbar....
r9055
return IPython;
}(IPython));