Show More
@@ -104,7 +104,7 b' div#notebook {' | |||
|
104 | 104 | width: 100%; |
|
105 | 105 | /* This spaces the cell away from the edge of the notebook area */ |
|
106 | 106 | padding: 5px 5px 15px 5px; |
|
107 | margin: 0px | |
|
107 | margin: 0px; | |
|
108 | 108 | background-color: white; |
|
109 | 109 | } |
|
110 | 110 | |
@@ -137,6 +137,7 b' div.cell {' | |||
|
137 | 137 | div.code_cell { |
|
138 | 138 | background-color: white; |
|
139 | 139 | } |
|
140 | ||
|
140 | 141 | /* any special styling for code cells that are currently running goes here */ |
|
141 | 142 | div.code_cell.running { |
|
142 | 143 | } |
@@ -168,13 +169,50 b' div.input_prompt {' | |||
|
168 | 169 | border-top: 1px solid transparent; |
|
169 | 170 | } |
|
170 | 171 | |
|
171 | div.output { | |
|
172 | div.output_wrapper { | |
|
172 | 173 | /* This is a spacer between the input and output of each cell */ |
|
173 | 174 | margin-top: 5px; |
|
175 | margin-left: 5px; | |
|
176 | /* FF needs explicit width to stretch */ | |
|
177 | width: 100%; | |
|
178 | /* this position must be relative to enable descendents to be absolute within it */ | |
|
179 | position: relative; | |
|
180 | } | |
|
181 | ||
|
182 | /* class for the output area when it should be height-limited */ | |
|
183 | div.output_scroll { | |
|
184 | /* ideally, this would be max-height, but FF barfs all over that */ | |
|
185 | height: 24em; | |
|
186 | /* FF needs this *and the wrapper* to specify full width, or it will shrinkwrap */ | |
|
187 | width: 100%; | |
|
188 | ||
|
189 | overflow: auto; | |
|
190 | border-radius: 3px; | |
|
191 | box-shadow: inset 0 2px 8px rgba(0, 0, 0, .8); | |
|
192 | } | |
|
193 | ||
|
194 | /* output div while it is collapsed */ | |
|
195 | div.output_collapsed { | |
|
196 | margin-right: 5px; | |
|
197 | } | |
|
198 | ||
|
199 | div.out_prompt_overlay { | |
|
200 | height: 100%; | |
|
201 | padding: 0px; | |
|
202 | position: absolute; | |
|
203 | border-radius: 3px; | |
|
204 | } | |
|
205 | ||
|
206 | div.out_prompt_overlay:hover { | |
|
207 | /* use inner shadow to get border that is computed the same on WebKit/FF */ | |
|
208 | box-shadow: inset 0 0 1px #000; | |
|
209 | background: rgba(240, 240, 240, 0.5); | |
|
174 | 210 | } |
|
175 | 211 | |
|
176 | 212 | div.output_prompt { |
|
177 | 213 | color: darkred; |
|
214 | /* 5px right shift to account for margin in parent container */ | |
|
215 | margin: 0 5px 0 -5px; | |
|
178 | 216 | } |
|
179 | 217 | |
|
180 | 218 | /* This class is the outer container of all output sections. */ |
@@ -218,6 +218,11 b' var IPython = (function (IPython) {' | |||
|
218 | 218 | }; |
|
219 | 219 | |
|
220 | 220 | |
|
221 | CodeCell.prototype.toggle_output_scroll = function () { | |
|
222 | this.output_area.toggle_scroll(); | |
|
223 | }; | |
|
224 | ||
|
225 | ||
|
221 | 226 | CodeCell.prototype.set_input_prompt = function (number) { |
|
222 | 227 | this.input_prompt_number = number; |
|
223 | 228 | var ns = number || " "; |
@@ -158,6 +158,15 b' var IPython = (function (IPython) {' | |||
|
158 | 158 | this.element.find('#toggle_output').click(function () { |
|
159 | 159 | IPython.notebook.toggle_output(); |
|
160 | 160 | }); |
|
161 | this.element.find('#collapse_all_output').click(function () { | |
|
162 | IPython.notebook.collapse_all_output(); | |
|
163 | }); | |
|
164 | this.element.find('#scroll_all_output').click(function () { | |
|
165 | IPython.notebook.scroll_all_output(); | |
|
166 | }); | |
|
167 | this.element.find('#expand_all_output').click(function () { | |
|
168 | IPython.notebook.expand_all_output(); | |
|
169 | }); | |
|
161 | 170 | this.element.find('#clear_all_output').click(function () { |
|
162 | 171 | IPython.notebook.clear_all_output(); |
|
163 | 172 | }); |
@@ -194,7 +194,11 b' var IPython = (function (IPython) {' | |||
|
194 | 194 | return false; |
|
195 | 195 | } else if (event.which === 79 && that.control_key_active) { |
|
196 | 196 | // Toggle output = o |
|
197 | that.toggle_output(); | |
|
197 | if (event.shiftKey){ | |
|
198 | that.toggle_output_scroll(); | |
|
199 | } else { | |
|
200 | that.toggle_output(); | |
|
201 | } | |
|
198 | 202 | that.control_key_active = false; |
|
199 | 203 | return false; |
|
200 | 204 | } else if (event.which === 83 && that.control_key_active) { |
@@ -883,6 +887,53 b' var IPython = (function (IPython) {' | |||
|
883 | 887 | }; |
|
884 | 888 | |
|
885 | 889 | |
|
890 | Notebook.prototype.toggle_output_scroll = function (index) { | |
|
891 | var i = this.index_or_selected(index); | |
|
892 | this.get_cell(i).toggle_output_scroll(); | |
|
893 | }; | |
|
894 | ||
|
895 | ||
|
896 | Notebook.prototype.collapse_all_output = function () { | |
|
897 | var ncells = this.ncells(); | |
|
898 | var cells = this.get_cells(); | |
|
899 | for (var i=0; i<ncells; i++) { | |
|
900 | if (cells[i] instanceof IPython.CodeCell) { | |
|
901 | cells[i].output_area.collapse(); | |
|
902 | } | |
|
903 | }; | |
|
904 | // this should not be set if the `collapse` key is removed from nbformat | |
|
905 | this.dirty = true; | |
|
906 | }; | |
|
907 | ||
|
908 | ||
|
909 | Notebook.prototype.scroll_all_output = function () { | |
|
910 | var ncells = this.ncells(); | |
|
911 | var cells = this.get_cells(); | |
|
912 | for (var i=0; i<ncells; i++) { | |
|
913 | if (cells[i] instanceof IPython.CodeCell) { | |
|
914 | cells[i].output_area.expand(); | |
|
915 | cells[i].output_area.scroll_if_long(20); | |
|
916 | } | |
|
917 | }; | |
|
918 | // this should not be set if the `collapse` key is removed from nbformat | |
|
919 | this.dirty = true; | |
|
920 | }; | |
|
921 | ||
|
922 | ||
|
923 | Notebook.prototype.expand_all_output = function () { | |
|
924 | var ncells = this.ncells(); | |
|
925 | var cells = this.get_cells(); | |
|
926 | for (var i=0; i<ncells; i++) { | |
|
927 | if (cells[i] instanceof IPython.CodeCell) { | |
|
928 | cells[i].output_area.expand(); | |
|
929 | cells[i].output_area.unscroll_area(); | |
|
930 | } | |
|
931 | }; | |
|
932 | // this should not be set if the `collapse` key is removed from nbformat | |
|
933 | this.dirty = true; | |
|
934 | }; | |
|
935 | ||
|
936 | ||
|
886 | 937 | Notebook.prototype.clear_all_output = function () { |
|
887 | 938 | var ncells = this.ncells(); |
|
888 | 939 | var cells = this.get_cells(); |
@@ -16,28 +16,92 b' var IPython = (function (IPython) {' | |||
|
16 | 16 | |
|
17 | 17 | var OutputArea = function (selector, prompt_area) { |
|
18 | 18 | this.selector = selector; |
|
19 |
this. |
|
|
19 | this.wrapper = $(selector); | |
|
20 | 20 | this.outputs = []; |
|
21 | 21 | this.collapsed = false; |
|
22 | this.scrolled = false; | |
|
22 | 23 | this.clear_out_timeout = null; |
|
23 | 24 | if (prompt_area === undefined) { |
|
24 | 25 | this.prompt_area = true; |
|
25 | 26 | } else { |
|
26 | 27 | this.prompt_area = prompt_area; |
|
27 | 28 | }; |
|
29 | this.create_elements(); | |
|
28 | 30 | this.style(); |
|
31 | this.bind_events(); | |
|
32 | }; | |
|
33 | ||
|
34 | OutputArea.prototype.create_elements = function () { | |
|
35 | this.element = $("<div/>"); | |
|
36 | this.collapse_button = $("<div/>"); | |
|
37 | this.prompt_overlay = $("<div/>"); | |
|
38 | this.wrapper.append(this.prompt_overlay); | |
|
39 | this.wrapper.append(this.element); | |
|
40 | this.wrapper.append(this.collapse_button); | |
|
29 | 41 | }; |
|
30 | 42 | |
|
31 | 43 | |
|
32 | 44 | OutputArea.prototype.style = function () { |
|
45 | this.collapse_button.hide(); | |
|
46 | this.prompt_overlay.hide(); | |
|
47 | ||
|
48 | this.wrapper.addClass('output_wrapper'); | |
|
33 | 49 | this.element.addClass('output vbox'); |
|
50 | ||
|
51 | this.collapse_button.button(); | |
|
52 | this.collapse_button.addClass('output_collapsed vbox'); | |
|
53 | this.collapse_button.attr('title', 'click to expand outout'); | |
|
54 | this.collapse_button.html('. . .'); | |
|
55 | ||
|
56 | this.prompt_overlay.addClass('out_prompt_overlay prompt'); | |
|
57 | this.prompt_overlay.attr('title', 'click to expand outout; double click to hide output'); | |
|
58 | ||
|
34 | 59 | this.collapse(); |
|
35 | 60 | }; |
|
36 | 61 | |
|
37 | 62 | |
|
63 | OutputArea.prototype._should_scroll = function (lines) { | |
|
64 | if (!lines) { | |
|
65 | lines = 50; | |
|
66 | } | |
|
67 | // line-height from http://stackoverflow.com/questions/1185151 | |
|
68 | var fontSize = this.element.css('font-size'); | |
|
69 | var lineHeight = Math.floor(parseInt(fontSize.replace('px','')) * 1.5); | |
|
70 | ||
|
71 | return (this.element.height() > lines * lineHeight); | |
|
72 | }; | |
|
73 | ||
|
74 | ||
|
75 | OutputArea.prototype.bind_events = function () { | |
|
76 | var that = this; | |
|
77 | this.prompt_overlay.dblclick(function () { that.toggle_output(); }); | |
|
78 | this.prompt_overlay.click(function () { that.toggle_scroll(); }); | |
|
79 | ||
|
80 | this.element.resize(function () { | |
|
81 | // maybe scroll output, | |
|
82 | // if it's grown large enough and hasn't already been scrolled. | |
|
83 | if ( !that.scrolled && that._should_scroll()) { | |
|
84 | that.scroll_area(); | |
|
85 | } | |
|
86 | }); | |
|
87 | this.collapse_button.click(function () { | |
|
88 | that.expand(); | |
|
89 | }); | |
|
90 | this.collapse_button.hover(function () { | |
|
91 | $(this).addClass("ui-state-hover"); | |
|
92 | }, function () { | |
|
93 | $(this).removeClass("ui-state-hover"); | |
|
94 | }); | |
|
95 | }; | |
|
96 | ||
|
97 | ||
|
38 | 98 | OutputArea.prototype.collapse = function () { |
|
39 | 99 | if (!this.collapsed) { |
|
40 | 100 | this.element.hide(); |
|
101 | this.prompt_overlay.hide(); | |
|
102 | if (this.element.html()){ | |
|
103 | this.collapse_button.show(); | |
|
104 | } | |
|
41 | 105 | this.collapsed = true; |
|
42 | 106 | }; |
|
43 | 107 | }; |
@@ -45,7 +109,9 b' var IPython = (function (IPython) {' | |||
|
45 | 109 | |
|
46 | 110 | OutputArea.prototype.expand = function () { |
|
47 | 111 | if (this.collapsed) { |
|
112 | this.collapse_button.hide(); | |
|
48 | 113 | this.element.show(); |
|
114 | this.prompt_overlay.show(); | |
|
49 | 115 | this.collapsed = false; |
|
50 | 116 | }; |
|
51 | 117 | }; |
@@ -60,6 +126,38 b' var IPython = (function (IPython) {' | |||
|
60 | 126 | }; |
|
61 | 127 | |
|
62 | 128 | |
|
129 | OutputArea.prototype.scroll_area = function () { | |
|
130 | this.element.addClass('output_scroll'); | |
|
131 | this.prompt_overlay.attr('title', 'click to unscroll output; double click to hide'); | |
|
132 | this.scrolled = true; | |
|
133 | }; | |
|
134 | ||
|
135 | ||
|
136 | OutputArea.prototype.unscroll_area = function () { | |
|
137 | this.element.removeClass('output_scroll'); | |
|
138 | this.prompt_overlay.attr('title', 'click to scroll output; double click to hide'); | |
|
139 | this.scrolled = false; | |
|
140 | }; | |
|
141 | ||
|
142 | ||
|
143 | OutputArea.prototype.scroll_if_long = function (lines) { | |
|
144 | if (this._should_scroll(lines)) { | |
|
145 | // only allow scrolling long-enough output | |
|
146 | this.scroll_area(); | |
|
147 | }; | |
|
148 | }; | |
|
149 | ||
|
150 | ||
|
151 | OutputArea.prototype.toggle_scroll = function () { | |
|
152 | if (this.scrolled) { | |
|
153 | this.unscroll_area(); | |
|
154 | } else { | |
|
155 | // only allow scrolling long-enough output | |
|
156 | this.scroll_if_long(20); | |
|
157 | }; | |
|
158 | }; | |
|
159 | ||
|
160 | ||
|
63 | 161 | // typeset with MathJax if MathJax is available |
|
64 | 162 | OutputArea.prototype.typeset = function () { |
|
65 | 163 | if (window.MathJax){ |
@@ -132,6 +230,8 b' var IPython = (function (IPython) {' | |||
|
132 | 230 | this.append_stream(json); |
|
133 | 231 | }; |
|
134 | 232 | this.outputs.push(json); |
|
233 | var that = this; | |
|
234 | setTimeout(function(){that.element.trigger('resize');}, 100); | |
|
135 | 235 | }; |
|
136 | 236 | |
|
137 | 237 | |
@@ -346,6 +446,7 b' var IPython = (function (IPython) {' | |||
|
346 | 446 | // clear all, no need for logic |
|
347 | 447 | output_div.html(""); |
|
348 | 448 | this.outputs = []; |
|
449 | this.unscroll_area(); | |
|
349 | 450 | return; |
|
350 | 451 | } |
|
351 | 452 | // remove html output |
@@ -360,7 +461,8 b' var IPython = (function (IPython) {' | |||
|
360 | 461 | if (other) { |
|
361 | 462 | output_div.find("div.output_subarea").not("div.output_stderr").not("div.output_stdout").parent().remove(); |
|
362 | 463 | } |
|
363 | ||
|
464 | this.unscroll_area(); | |
|
465 | ||
|
364 | 466 | // remove cleared outputs from JSON list: |
|
365 | 467 | for (var i = this.outputs.length - 1; i >= 0; i--) { |
|
366 | 468 | var out = this.outputs[i]; |
@@ -35,6 +35,7 b' var IPython = (function (IPython) {' | |||
|
35 | 35 | {key: 'Ctrl-m a', help: 'insert cell above'}, |
|
36 | 36 | {key: 'Ctrl-m b', help: 'insert cell below'}, |
|
37 | 37 | {key: 'Ctrl-m o', help: 'toggle output'}, |
|
38 | {key: 'Ctrl-m O', help: 'toggle output scroll'}, | |
|
38 | 39 | {key: 'Ctrl-m l', help: 'toggle line numbers'}, |
|
39 | 40 | {key: 'Ctrl-m s', help: 'save notebook'}, |
|
40 | 41 | {key: 'Ctrl-m j', help: 'move cell down'}, |
@@ -117,8 +117,15 b' data-notebook-id={{notebook_id}}' | |||
|
117 | 117 | <li id="to_heading5"><a href="#">Heading 5</a></li> |
|
118 | 118 | <li id="to_heading6"><a href="#">Heading 6</a></li> |
|
119 | 119 | <hr/> |
|
120 | <li id="toggle_output"><a href="#">Toggle Output</a></li> | |
|
121 |
<li id=" |
|
|
120 | <li id="toggle_output"><a href="#">Toggle Current Output</a></li> | |
|
121 | <li id="all_outputs"><a href="#">All Output</a> | |
|
122 | <ul> | |
|
123 | <li id="expand_all_output"><a href="#">Expand</a></li> | |
|
124 | <li id="scroll_all_output"><a href="#">Scroll Long</a></li> | |
|
125 | <li id="collapse_all_output"><a href="#">Collapse</a></li> | |
|
126 | <li id="clear_all_output"><a href="#">Clear</a></li> | |
|
127 | </ul> | |
|
128 | </li> | |
|
122 | 129 | </ul> |
|
123 | 130 | </li> |
|
124 | 131 | <li><a href="#">Kernel</a> |
General Comments 0
You need to be logged in to leave comments.
Login now