In week 5 I worked more on the navigation. I ended up learning a lot of the internals of JS and exploring the jQuery library, something I had refused to do, avoiding unnecessary overheads.
For the navigation I want to be able to drag and drop on the region with reads. My naive idea was to simply calculate a div big enough to populate the whole chromosome, and then fill the divs according to whatever region I had on screen. However, I learnt that having more than 10,000 pixels of width, even when empty, just kills the browser.
My next attempt was to make my container div draggable and whenever I let the mouse go, re-render the divs with the offset. This ended up with adding the native JavaScript listeners to my container div:
_select_chromosome: function(full_region){ this._container.empty(); this.alignments = {}; this.full_region = this.parse_region(full_region); //New object, to avoid modifying the current region unintentionally. var new_div = document.createElement("div"); new_div.addEventListener('dragstart',this._drag_start,false); new_div.addEventListener('dragover',this._drag_over,false); new_div.addEventListener('drop',this._drop,false); new_div.style.width = this.opt.width; new_div.draggable = "true"; new_div.style.position = "absolute"; new_div.style.overflow = "scroll"; new_div.style.height = this.opt.height; new_div.bam_container = this; this._render_div = new_div; this._container.append(new_div); }
And then adding the calculations of the offsets from the beginning and the end of the drag
_drag_start: function (event) { offset_data = event.clientX + ',' + event.clientY; _startX = event.clientX; _bam_offset_data= offset_data; _tmp_target = event.target; }, _move_draged: function(render_div, offset, event){ console.log("From " + _startX + " to " + event.clientX); var diff_x = event.clientX - _startX ; var als_rend = render_div.children; for(var i = 0; i < als_rend.length; i++) { var local_left = parseInt(als_rend[i].offsetLeft , 10); var new_pos = local_left + diff_x; als_rend[i].style.left = new_pos + "px"; } }, _drag_over: function (event) { var offset; offset = _bam_offset_data; var dm = _tmp_target ; var render_div = _tmp_target ; event.preventDefault(); return false; } , _drop: function (event) { var offset; offset = _bam_offset_data; var render_div = _tmp_target ; render_div.bam_container._move_draged(render_div, offset, event); render_div.bam_container._move_to_top(); event.preventDefault(); return false; }
However, this approach ended up not looking natural, so I ended up using jQuery instead. Personaly, I don't like the abuse of the $ sign (bad memories with php and perl!). So, I added a call to jQuery to enrich the div. And now it is now smoother.
_select_chromosome: function(full_region){ this._container.empty(); this.alignments = {}; this.full_region = this.parse_region(full_region); //New object, to avoid modifying the current region unintentionally. var outter_div = document.createElement("div"); outter_div.style.width = this.opt.width; outter_div.style.position = "absolute"; outter_div.style.overflow = "scroll"; outter_div.style.height = this.opt.height; var new_div = document.createElement("div"); new_div.classList.add("ui-widget-content"); jQuery(new_div).draggable({ axis: "x" }); new_div.bam_container = this; this._render_div = new_div; outter_div.appendChild(new_div); this._container.append(outter_div); }
No hay comentarios:
Publicar un comentario