/lib/code_buddy/public/javascripts/code_buddy.js
https://github.com/houhoulis/code_buddy · JavaScript · 262 lines · 213 code · 45 blank · 4 comment · 16 complexity · d0ff9c1303e129416cd7f7aba1db1907 MD5 · raw file
- var CodeBuddy = {
- backbone : {}
- }
- CodeBuddy.backbone.Address = Backbone.Model.extend({
- selected: function() {
- return CodeBuddy.stack.selectedAddress() == this
- },
- });
- CodeBuddy.backbone.Addresses = Backbone.Collection.extend({
- model:CodeBuddy.backbone.Address,
- bookmarked: function() {
- return this.select(function(address){
- return address.get('bookmarked');
- })
- }
- })
- CodeBuddy.backbone.Stack = Backbone.Model.extend({
- initialize: function() {
- _.bindAll(this, 'toggleBookmark', 'selectNextBookmark')
- this.bind('change:selected', this.selectionChanged);
- this.set({
- addresses: new CodeBuddy.backbone.Addresses(this.get('stack_frames'))
- })
- },
- setSelection: function(newSelected) {
- if (newSelected >= 0 && newSelected < this.addresses().size()) {
- this.set({ selected: newSelected })
- }
- },
- selectPrevious: function() {
- this.setSelection(this.get('selected') - 1)
- },
- selectNext: function() {
- this.setSelection(this.get('selected') + 1)
- },
- addresses: function() {
- return this.get('addresses')
- },
- selectedAddress: function() {
- var selected = this.get('selected')
- return this.addresses().at(selected)
- },
- selectionChanged: function(x) {
- this.addresses().at(x.previousAttributes().selected).view.render()
- this.addresses().at(x.changedAttributes().selected).view.render()
- CodeBuddy.codeView.render()
- },
- toggleBookmark: function() {
- this.selectedAddress().set({bookmarked:!this.selectedAddress().get('bookmarked')})
- this.selectedAddress().view.render();
- },
- selectNextBookmark: function() {
- var bookmarked = this.addresses().bookmarked();
- var length = bookmarked.length;
- var toSelect;
- if(length > 0) {
- var current = _.indexOf(bookmarked, this.selectedAddress())
- if(current > -1 && current < length - 1) {
- toSelect = bookmarked[current + 1]
- } else {
- toSelect = bookmarked[0]
- }
- return this.setSelection(toSelect.cid.substr(1)-1)
- }
- }
- });
- // ADDRESS VIEW - SELECTED ADDRESS IN BOLD
- CodeBuddy.backbone.AddressView = Backbone.View.extend({
- tagName: "li",
- template: _.template("<span class='container'><%= path %>:<%= line%><span class='overlay'></span></span>"),
- initialize: function() {
- this.model.view = this;
- },
- events: {
- click: "open",
- dblclick: "toggleBookmark"
- },
- open: function() {
- CodeBuddy.stack.set({selected: this.model.cid.substr(1)-1});
- },
- toggleBookmark: function() {
- this.open();
- CodeBuddy.stack.toggleBookmark();
- },
- render: function() {
- $(this.el).removeClass('selected bookmarked')
- var html = this.template(this.model.toJSON())
- $(this.el).html(html);
- if (this.model.selected()) {
- $(this.el).addClass('selected')
- }
- if (this.model.get('bookmarked')) {
- $(this.el).addClass('bookmarked')
- }
- return this;
- }
- })
- // STACK VIEW - LOGIC FOR ASSIGNING EACH ADDRESS VIEW TO EACH LI TAG
- CodeBuddy.backbone.StackView = Backbone.View.extend({
- el: $("#stack"),
- initialize: function() {
- _.bindAll(this, 'selectNext', 'selectPrevious', 'addOneAddress')
- this.model.view = this;
- this.model.get('addresses').each(this.addOneAddress);
- },
- selectPrevious: function() {
- this.model.selectPrevious();
- this.ensureVisibility();
- return false;
- },
- selectNext: function() {
- this.model.selectNext();
- this.ensureVisibility();
- return false;
- },
- ensureVisibility: function() {
- var offset = $(CodeBuddy.stack.selectedAddress().view.el).offset()
- var windowHeight = $(window).height()
- if (offset.top > windowHeight + $(window).scrollTop() - 10) {
- // scroll down
- $('html,body').animate({scrollTop: offset.top - 200}, 500);
- } else if (offset.top < $(window).scrollTop() + 100) {
- // scroll up
- $('html,body').animate({scrollTop: offset.top - 500}, 500);
- }
- return false
- },
- addOneAddress: function(address, index) {
- var view = new CodeBuddy.backbone.AddressView({model: address});
- $(this.el).append(view.render().el);
- }
- })
- CodeBuddy.backbone.CodeView = Backbone.View.extend({
- el:$("#code-viewer"),
- initialize: function() {
- _.bindAll(this, 'toggleCommands','increaseOpacity', 'decreaseOpacity', 'toggle')
- this.code = this.$("#code")
- this.current = this.$("#current")
- this.opacity = parseFloat(this.el.css("opacity"))
- },
- render: function() {
- this.current.html('<div>' + CodeBuddy.stack.selectedAddress().get('path') + '</div>')
- this.code.html(CodeBuddy.stack.selectedAddress().get('code'))
- },
- toggleCommands: function() {
- this.$("#legend").toggle()
- },
- toggle: function() {
- this.el.toggle()
- },
- editCode: function() {
- $.get('../edit/' + CodeBuddy.stack.get('selected'))
- },
- setOpacity: function(newOpacity) {
- if(newOpacity < 0) newOpacity = 0;
- if(newOpacity > 1) newOpacity = 1;
- this.el.css("opacity", newOpacity);
- this.opacity = newOpacity;
- },
- increaseOpacity: function() {
- this.setOpacity(this.opacity + 0.1)
- },
- decreaseOpacity: function() {
- this.setOpacity(this.opacity - 0.1)
- }
- })
- CodeBuddy.backbone.FormView = Backbone.View.extend({
- el:$(".form"),
- initialize: function() {
- _.bindAll(this, 'show', 'hide')
- this.el.find('textarea').bind('keydown', 'esc', this.hide)
- },
- show: function(){
- this.el.show();
- CodeBuddy.codeView.el.hide()
- CodeBuddy.stackView.el.hide()
- this.el.find("textarea").focus()
- return false;
- },
- hide: function(){
- this.el.hide();
- CodeBuddy.codeView.el.show()
- CodeBuddy.stackView.el.show()
- return false;
- }
- })
- CodeBuddy.setStackKeyBindings = function(){
- $(document).bind('keydown', 'up', CodeBuddy.stackView.selectPrevious)
- $(document).bind('keydown', 'down', CodeBuddy.stackView.selectNext)
- $(document).bind('keydown', 'right', CodeBuddy.codeView.increaseOpacity)
- $(document).bind('keydown', 'left', CodeBuddy.codeView.decreaseOpacity)
- $(document).bind('keydown', 'a', CodeBuddy.stack.toggleBookmark)
- $(document).bind('keydown', 's', CodeBuddy.stack.selectNextBookmark)
- $(document).bind('keydown', 'h', CodeBuddy.codeView.toggle)
- $(document).bind('keydown', 'e', CodeBuddy.codeView.editCode)
- }
- CodeBuddy.setGlobalKeyBindings = function(){
- $(document).bind('keydown', 'n', CodeBuddy.form.show)
- $(document).bind('keydown', 'esc', CodeBuddy.codeView.toggleCommands)
- }
- CodeBuddy.setup = function(stackJson) {
- CodeBuddy.form = new CodeBuddy.backbone.FormView
- this.stack = new this.backbone.Stack(stackJson);
- this.stackView = new this.backbone.StackView({model: this.stack});
- this.codeView = new this.backbone.CodeView();
- if(stackJson) {
- this.codeView.render();
- this.setStackKeyBindings();
- CodeBuddy.form.hide()
- } else {
- CodeBuddy.form.show()
- }
- CodeBuddy.setGlobalKeyBindings()
- $('#new_stack').click(function(){
- CodeBuddy.form.show()
- })
- }