Included title box size in zoom to extents and put a limits on the zooming
This commit is contained in:
parent
d55d939971
commit
b15da256fa
3 changed files with 216 additions and 282 deletions
49
Gemfile.lock
49
Gemfile.lock
|
@ -39,8 +39,6 @@ GEM
|
|||
rails (~> 3.1)
|
||||
builder (3.0.4)
|
||||
cancan (1.6.10)
|
||||
childprocess (0.5.3)
|
||||
ffi (~> 1.0, >= 1.0.11)
|
||||
climate_control (0.0.3)
|
||||
activesupport (>= 3.0)
|
||||
cocaine (0.5.4)
|
||||
|
@ -52,7 +50,6 @@ GEM
|
|||
coffee-script-source
|
||||
execjs
|
||||
coffee-script-source (1.7.0)
|
||||
commonwatir (4.0.0)
|
||||
devise (3.2.4)
|
||||
bcrypt (~> 3.0)
|
||||
orm_adapter (~> 0.1)
|
||||
|
@ -61,8 +58,6 @@ GEM
|
|||
warden (~> 1.2.3)
|
||||
erubis (2.7.0)
|
||||
execjs (2.0.2)
|
||||
ffi (1.9.0)
|
||||
ffi (1.9.0-x86-mingw32)
|
||||
formtastic (2.2.1)
|
||||
actionpack (>= 3.0)
|
||||
formula (1.0.1)
|
||||
|
@ -80,8 +75,6 @@ GEM
|
|||
mime-types (~> 1.16)
|
||||
treetop (~> 1.4.8)
|
||||
mime-types (1.25.1)
|
||||
mini_magick (3.5.0)
|
||||
subexec (~> 0.2.1)
|
||||
mini_portile (0.6.0)
|
||||
multi_json (1.10.0)
|
||||
nokogiri (1.6.2.1)
|
||||
|
@ -96,7 +89,6 @@ GEM
|
|||
mime-types
|
||||
pg (0.17.1)
|
||||
pg (0.17.1-x86-mingw32)
|
||||
phantomjs (1.9.7.1)
|
||||
polyglot (0.3.4)
|
||||
rack (1.4.5)
|
||||
rack-cache (1.2)
|
||||
|
@ -123,28 +115,19 @@ GEM
|
|||
rdoc (~> 3.4)
|
||||
thor (>= 0.14.6, < 2.0)
|
||||
rake (10.3.2)
|
||||
rautomation (0.15.0)
|
||||
ffi (= 1.9.0)
|
||||
rdoc (3.12.2)
|
||||
json (~> 1.4)
|
||||
redis (2.2.2)
|
||||
rubyzip (1.1.6)
|
||||
sass (3.3.7)
|
||||
sass-rails (3.2.6)
|
||||
railties (~> 3.2.0)
|
||||
sass (>= 3.1.10)
|
||||
tilt (~> 1.3)
|
||||
selenium-webdriver (2.42.0)
|
||||
childprocess (>= 0.5.0)
|
||||
multi_json (~> 1.0)
|
||||
rubyzip (~> 1.0)
|
||||
websocket (~> 1.0.4)
|
||||
sprockets (2.2.2)
|
||||
hike (~> 1.2)
|
||||
multi_json (~> 1.0)
|
||||
rack (~> 1.0)
|
||||
tilt (~> 1.1, != 1.3.0)
|
||||
subexec (0.2.3)
|
||||
thor (0.19.1)
|
||||
thread_safe (0.3.3)
|
||||
tilt (1.4.1)
|
||||
|
@ -157,36 +140,6 @@ GEM
|
|||
json (>= 1.8.0)
|
||||
warden (1.2.3)
|
||||
rack (>= 1.0)
|
||||
watir (5.0.0)
|
||||
commonwatir (~> 4)
|
||||
watir-webdriver
|
||||
watir (5.0.0-x86-mingw32)
|
||||
commonwatir (~> 4)
|
||||
watir-classic (~> 4.0)
|
||||
watir-webdriver
|
||||
watir-classic (4.0.1)
|
||||
ffi (~> 1.0)
|
||||
multi_json
|
||||
nokogiri (>= 1.5.7.rc3)
|
||||
rautomation (~> 0.7)
|
||||
win32-process (>= 0.5.5)
|
||||
win32screenshot (~> 1.0.9)
|
||||
windows-pr (>= 0.6.6)
|
||||
watir-webdriver (0.6.10)
|
||||
selenium-webdriver (>= 2.18.0)
|
||||
websocket (1.0.7)
|
||||
win32-api (1.5.1-x86-mingw32)
|
||||
win32-process (0.7.4)
|
||||
ffi (>= 1.0.0)
|
||||
win32screenshot (1.0.10)
|
||||
ffi (~> 1.0)
|
||||
mini_magick (~> 3.5.0)
|
||||
rautomation (~> 0.7)
|
||||
windows-api (0.4.2)
|
||||
win32-api (>= 1.4.5)
|
||||
windows-pr (1.2.3)
|
||||
win32-api (>= 1.4.5)
|
||||
windows-api (>= 0.4.0)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
|
@ -205,10 +158,8 @@ DEPENDENCIES
|
|||
json
|
||||
paperclip
|
||||
pg
|
||||
phantomjs
|
||||
rails (= 3.2.17)
|
||||
rails3-jquery-autocomplete
|
||||
redis (= 2.2.2)
|
||||
sass-rails
|
||||
uglifier (>= 1.0.3)
|
||||
watir
|
||||
|
|
|
@ -1461,119 +1461,102 @@ Metamaps.JIT = {
|
|||
|
||||
if (Metamaps.Selected.Nodes.length > 0) {
|
||||
var nodes = Metamaps.Selected.Nodes;
|
||||
}
|
||||
else {
|
||||
var nodes = _.values(Metamaps.Visualize.mGraph.graph.nodes);
|
||||
}
|
||||
|
||||
if(nodes.length > 1){
|
||||
nodes.forEach(function (n) {
|
||||
var x = n.pos.x,
|
||||
y = n.pos.y;
|
||||
if(nodes.length > 1){
|
||||
nodes.forEach(function (n) {
|
||||
var x = n.pos.x,
|
||||
y = n.pos.y;
|
||||
|
||||
if (counter == 0){
|
||||
maxX = x;
|
||||
minX = x;
|
||||
maxY = y;
|
||||
minY = y;
|
||||
}
|
||||
if (counter == 0){
|
||||
maxX = x;
|
||||
minX = x;
|
||||
maxY = y;
|
||||
minY = y;
|
||||
}
|
||||
|
||||
maxX = Math.max(x,maxX);
|
||||
maxY = Math.max(y,maxY);
|
||||
minX = Math.min(x,minX);
|
||||
minY = Math.min(y,minY);
|
||||
var arrayOfLabelLines = Metamaps.Util.splitLine(n.name, 30).split('\n'),
|
||||
dim = n.getData('dim'),
|
||||
ctx = Metamaps.Visualize.mGraph.canvas.getCtx();
|
||||
|
||||
counter++;
|
||||
});
|
||||
console.log(dim);
|
||||
|
||||
var spanX = maxX - minX;
|
||||
var spanY = maxY - minY;
|
||||
var ratioX = spanX / width;
|
||||
var ratioY = spanY / height;
|
||||
var height = 25 * arrayOfLabelLines.length;
|
||||
|
||||
var newRatio = Math.max(ratioX,ratioY);
|
||||
var index, lineWidths = [];
|
||||
for (index = 0; index < arrayOfLabelLines.length; ++index) {
|
||||
lineWidths.push(ctx.measureText(arrayOfLabelLines[index]).width)
|
||||
}
|
||||
var width = Math.max.apply(null, lineWidths) + 8;
|
||||
|
||||
var canvas = Metamaps.Visualize.mGraph.canvas;
|
||||
maxX = Math.max(x + width /2,maxX);
|
||||
maxY = Math.max(y + n.getData("height") + 5 + height,maxY);
|
||||
minX = Math.min(x - width /2,minX);
|
||||
minY = Math.min(y - dim,minY);
|
||||
|
||||
canvas.scale(1/newRatio*0.8,1/newRatio*0.8);
|
||||
counter++;
|
||||
});
|
||||
|
||||
counter = 0;
|
||||
var spanX = maxX - minX;
|
||||
var spanY = maxY - minY;
|
||||
var ratioX = spanX / width;
|
||||
var ratioY = spanY / height;
|
||||
|
||||
nodes.forEach(function (n) {
|
||||
var x = n.pos.x,
|
||||
y = n.pos.y;
|
||||
var newRatio = Math.max(ratioX,ratioY);
|
||||
var scaleMultiplier = 1/newRatio*0.9;
|
||||
|
||||
if (counter == 0){
|
||||
maxX = x;
|
||||
minX = x;
|
||||
maxY = y;
|
||||
minY = y;
|
||||
}
|
||||
|
||||
maxX = Math.max(x,maxX);
|
||||
maxY = Math.max(y,maxY);
|
||||
minX = Math.min(x,minX);
|
||||
minY = Math.min(y,minY);
|
||||
|
||||
counter++;
|
||||
});
|
||||
var canvas = Metamaps.Visualize.mGraph.canvas;
|
||||
if(canvas.scaleOffsetX *scaleMultiplier<= 3 && canvas.scaleOffsetX*scaleMultiplier >= 0.2){
|
||||
canvas.scale(scaleMultiplier,scaleMultiplier);
|
||||
}
|
||||
else if(canvas.scaleOffsetX * scaleMultiplier > 3){
|
||||
scaleMultiplier = 3/ canvas.scaleOffsetX;
|
||||
canvas.scale(scaleMultiplier,scaleMultiplier);
|
||||
}
|
||||
else{
|
||||
scaleMultiplier = 0.2/ canvas.scaleOffsetX;
|
||||
canvas.scale(scaleMultiplier,scaleMultiplier);
|
||||
}
|
||||
|
||||
|
||||
counter = 0;
|
||||
|
||||
nodes.forEach(function (n) {
|
||||
var x = n.pos.x,
|
||||
y = n.pos.y;
|
||||
|
||||
if (counter == 0){
|
||||
maxX = x;
|
||||
minX = x;
|
||||
maxY = y;
|
||||
minY = y;
|
||||
}
|
||||
|
||||
var arrayOfLabelLines = Metamaps.Util.splitLine(n.name, 30).split('\n'),
|
||||
dim = n.getData('dim'),
|
||||
ctx = Metamaps.Visualize.mGraph.canvas.getCtx();
|
||||
|
||||
console.log(dim);
|
||||
|
||||
var height = 25 * arrayOfLabelLines.length;
|
||||
|
||||
var index, lineWidths = [];
|
||||
for (index = 0; index < arrayOfLabelLines.length; ++index) {
|
||||
lineWidths.push(ctx.measureText(arrayOfLabelLines[index]).width)
|
||||
}
|
||||
var width = Math.max.apply(null, lineWidths) + 8;
|
||||
|
||||
maxX = Math.max(x + width /2,maxX);
|
||||
maxY = Math.max(y + n.getData("height") + 5 + height,maxY);
|
||||
minX = Math.min(x - width /2,minX);
|
||||
minY = Math.min(y - dim,minY);
|
||||
|
||||
counter++;
|
||||
});
|
||||
}
|
||||
else{
|
||||
var nodes = Metamaps.Visualize.mGraph.graph;
|
||||
|
||||
if(Object.keys(nodes).length >1){
|
||||
nodes.eachNode(function (n) {
|
||||
var x = n.pos.x,
|
||||
y = n.pos.y;
|
||||
|
||||
if (counter == 0){
|
||||
maxX = x;
|
||||
minX = x;
|
||||
maxY = y;
|
||||
minY = y;
|
||||
}
|
||||
|
||||
maxX = Math.max(x,maxX);
|
||||
maxY = Math.max(y,maxY);
|
||||
minX = Math.min(x,minX);
|
||||
minY = Math.min(y,minY);
|
||||
|
||||
counter++;
|
||||
});
|
||||
|
||||
var spanX = maxX - minX;
|
||||
var spanY = maxY - minY;
|
||||
var ratioX = spanX / width;
|
||||
var ratioY = spanY / height;
|
||||
|
||||
var newRatio = Math.max(ratioX,ratioY);
|
||||
|
||||
var canvas = Metamaps.Visualize.mGraph.canvas;
|
||||
|
||||
canvas.scale(1/newRatio*0.8,1/newRatio*0.8);
|
||||
|
||||
counter = 0;
|
||||
|
||||
nodes.eachNode(function (n) {
|
||||
var x = n.pos.x,
|
||||
y = n.pos.y;
|
||||
|
||||
if (counter == 0){
|
||||
maxX = x;
|
||||
minX = x;
|
||||
maxY = y;
|
||||
minY = y;
|
||||
}
|
||||
|
||||
maxX = Math.max(x,maxX);
|
||||
maxY = Math.max(y,maxY);
|
||||
minX = Math.min(x,minX);
|
||||
minY = Math.min(y,minY);
|
||||
|
||||
counter++;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
var cogX = (maxX + minX)/2;
|
||||
var cogY = (maxY + minY)/2;
|
||||
|
|
266
db/schema.rb
266
db/schema.rb
|
@ -1,133 +1,133 @@
|
|||
# encoding: UTF-8
|
||||
# This file is auto-generated from the current state of the database. Instead
|
||||
# of editing this file, please use the migrations feature of Active Record to
|
||||
# incrementally modify your database, and then regenerate this schema definition.
|
||||
#
|
||||
# Note that this schema.rb definition is the authoritative source for your
|
||||
# database schema. If you need to create the application database on another
|
||||
# system, you should be using db:schema:load, not running all the migrations
|
||||
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
|
||||
# you'll amass, the slower it'll run and the greater likelihood for issues).
|
||||
#
|
||||
# It's strongly recommended to check this file into your version control system.
|
||||
|
||||
ActiveRecord::Schema.define(:version => 20140815162253) do
|
||||
|
||||
create_table "in_metacode_sets", :force => true do |t|
|
||||
t.integer "metacode_id"
|
||||
t.integer "metacode_set_id"
|
||||
t.datetime "created_at", :null => false
|
||||
t.datetime "updated_at", :null => false
|
||||
end
|
||||
|
||||
add_index "in_metacode_sets", ["metacode_id"], :name => "index_in_metacode_sets_on_metacode_id"
|
||||
add_index "in_metacode_sets", ["metacode_set_id"], :name => "index_in_metacode_sets_on_metacode_set_id"
|
||||
|
||||
create_table "mappings", :force => true do |t|
|
||||
t.text "category"
|
||||
t.integer "xloc"
|
||||
t.integer "yloc"
|
||||
t.integer "topic_id"
|
||||
t.integer "synapse_id"
|
||||
t.integer "map_id"
|
||||
t.integer "user_id"
|
||||
t.datetime "created_at", :null => false
|
||||
t.datetime "updated_at", :null => false
|
||||
end
|
||||
|
||||
create_table "maps", :force => true do |t|
|
||||
t.text "name"
|
||||
t.boolean "arranged"
|
||||
t.text "desc"
|
||||
t.text "permission"
|
||||
t.integer "user_id"
|
||||
t.datetime "created_at", :null => false
|
||||
t.datetime "updated_at", :null => false
|
||||
t.boolean "featured"
|
||||
t.string "screenshot_file_name"
|
||||
t.string "screenshot_content_type"
|
||||
t.integer "screenshot_file_size"
|
||||
t.datetime "screenshot_updated_at"
|
||||
end
|
||||
|
||||
create_table "metacode_sets", :force => true do |t|
|
||||
t.string "name"
|
||||
t.text "desc"
|
||||
t.integer "user_id"
|
||||
t.boolean "mapperContributed"
|
||||
t.datetime "created_at", :null => false
|
||||
t.datetime "updated_at", :null => false
|
||||
end
|
||||
|
||||
add_index "metacode_sets", ["user_id"], :name => "index_metacode_sets_on_user_id"
|
||||
|
||||
create_table "metacodes", :force => true do |t|
|
||||
t.text "name"
|
||||
t.string "icon"
|
||||
t.datetime "created_at", :null => false
|
||||
t.datetime "updated_at", :null => false
|
||||
end
|
||||
|
||||
create_table "synapses", :force => true do |t|
|
||||
t.text "desc"
|
||||
t.text "category"
|
||||
t.text "weight"
|
||||
t.text "permission"
|
||||
t.integer "node1_id"
|
||||
t.integer "node2_id"
|
||||
t.integer "user_id"
|
||||
t.datetime "created_at", :null => false
|
||||
t.datetime "updated_at", :null => false
|
||||
end
|
||||
|
||||
create_table "topics", :force => true do |t|
|
||||
t.text "name"
|
||||
t.text "desc"
|
||||
t.text "link"
|
||||
t.text "permission"
|
||||
t.integer "user_id"
|
||||
t.integer "metacode_id"
|
||||
t.datetime "created_at", :null => false
|
||||
t.datetime "updated_at", :null => false
|
||||
t.string "image_file_name"
|
||||
t.string "image_content_type"
|
||||
t.integer "image_file_size"
|
||||
t.datetime "image_updated_at"
|
||||
t.string "audio_file_name"
|
||||
t.string "audio_content_type"
|
||||
t.integer "audio_file_size"
|
||||
t.datetime "audio_updated_at"
|
||||
end
|
||||
|
||||
create_table "users", :force => true do |t|
|
||||
t.string "name"
|
||||
t.string "email"
|
||||
t.text "settings"
|
||||
t.string "code", :limit => 8
|
||||
t.string "joinedwithcode", :limit => 8
|
||||
t.string "crypted_password"
|
||||
t.string "password_salt"
|
||||
t.string "persistence_token"
|
||||
t.string "perishable_token"
|
||||
t.datetime "created_at", :null => false
|
||||
t.datetime "updated_at", :null => false
|
||||
t.string "encrypted_password", :limit => 128, :default => ""
|
||||
t.string "remember_token"
|
||||
t.datetime "remember_created_at"
|
||||
t.string "reset_password_token"
|
||||
t.datetime "last_sign_in_at"
|
||||
t.string "last_sign_in_ip"
|
||||
t.integer "sign_in_count", :default => 0
|
||||
t.datetime "current_sign_in_at"
|
||||
t.string "current_sign_in_ip"
|
||||
t.datetime "reset_password_sent_at"
|
||||
t.boolean "admin"
|
||||
t.string "image_file_name"
|
||||
t.string "image_content_type"
|
||||
t.integer "image_file_size"
|
||||
t.datetime "image_updated_at"
|
||||
end
|
||||
|
||||
add_index "users", ["reset_password_token"], :name => "index_users_on_reset_password_token", :unique => true
|
||||
|
||||
end
|
||||
# encoding: UTF-8
|
||||
# This file is auto-generated from the current state of the database. Instead
|
||||
# of editing this file, please use the migrations feature of Active Record to
|
||||
# incrementally modify your database, and then regenerate this schema definition.
|
||||
#
|
||||
# Note that this schema.rb definition is the authoritative source for your
|
||||
# database schema. If you need to create the application database on another
|
||||
# system, you should be using db:schema:load, not running all the migrations
|
||||
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
|
||||
# you'll amass, the slower it'll run and the greater likelihood for issues).
|
||||
#
|
||||
# It's strongly recommended to check this file into your version control system.
|
||||
|
||||
ActiveRecord::Schema.define(:version => 20140815162253) do
|
||||
|
||||
create_table "in_metacode_sets", :force => true do |t|
|
||||
t.integer "metacode_id"
|
||||
t.integer "metacode_set_id"
|
||||
t.datetime "created_at", :null => false
|
||||
t.datetime "updated_at", :null => false
|
||||
end
|
||||
|
||||
add_index "in_metacode_sets", ["metacode_id"], :name => "index_in_metacode_sets_on_metacode_id"
|
||||
add_index "in_metacode_sets", ["metacode_set_id"], :name => "index_in_metacode_sets_on_metacode_set_id"
|
||||
|
||||
create_table "mappings", :force => true do |t|
|
||||
t.text "category"
|
||||
t.integer "xloc"
|
||||
t.integer "yloc"
|
||||
t.integer "topic_id"
|
||||
t.integer "synapse_id"
|
||||
t.integer "map_id"
|
||||
t.integer "user_id"
|
||||
t.datetime "created_at", :null => false
|
||||
t.datetime "updated_at", :null => false
|
||||
end
|
||||
|
||||
create_table "maps", :force => true do |t|
|
||||
t.text "name"
|
||||
t.boolean "arranged"
|
||||
t.text "desc"
|
||||
t.text "permission"
|
||||
t.integer "user_id"
|
||||
t.datetime "created_at", :null => false
|
||||
t.datetime "updated_at", :null => false
|
||||
t.boolean "featured"
|
||||
t.string "screenshot_file_name"
|
||||
t.string "screenshot_content_type"
|
||||
t.integer "screenshot_file_size"
|
||||
t.datetime "screenshot_updated_at"
|
||||
end
|
||||
|
||||
create_table "metacode_sets", :force => true do |t|
|
||||
t.string "name"
|
||||
t.text "desc"
|
||||
t.integer "user_id"
|
||||
t.boolean "mapperContributed"
|
||||
t.datetime "created_at", :null => false
|
||||
t.datetime "updated_at", :null => false
|
||||
end
|
||||
|
||||
add_index "metacode_sets", ["user_id"], :name => "index_metacode_sets_on_user_id"
|
||||
|
||||
create_table "metacodes", :force => true do |t|
|
||||
t.text "name"
|
||||
t.string "icon"
|
||||
t.datetime "created_at", :null => false
|
||||
t.datetime "updated_at", :null => false
|
||||
end
|
||||
|
||||
create_table "synapses", :force => true do |t|
|
||||
t.text "desc"
|
||||
t.text "category"
|
||||
t.text "weight"
|
||||
t.text "permission"
|
||||
t.integer "node1_id"
|
||||
t.integer "node2_id"
|
||||
t.integer "user_id"
|
||||
t.datetime "created_at", :null => false
|
||||
t.datetime "updated_at", :null => false
|
||||
end
|
||||
|
||||
create_table "topics", :force => true do |t|
|
||||
t.text "name"
|
||||
t.text "desc"
|
||||
t.text "link"
|
||||
t.text "permission"
|
||||
t.integer "user_id"
|
||||
t.integer "metacode_id"
|
||||
t.datetime "created_at", :null => false
|
||||
t.datetime "updated_at", :null => false
|
||||
t.string "image_file_name"
|
||||
t.string "image_content_type"
|
||||
t.integer "image_file_size"
|
||||
t.datetime "image_updated_at"
|
||||
t.string "audio_file_name"
|
||||
t.string "audio_content_type"
|
||||
t.integer "audio_file_size"
|
||||
t.datetime "audio_updated_at"
|
||||
end
|
||||
|
||||
create_table "users", :force => true do |t|
|
||||
t.string "name"
|
||||
t.string "email"
|
||||
t.text "settings"
|
||||
t.string "code", :limit => 8
|
||||
t.string "joinedwithcode", :limit => 8
|
||||
t.string "crypted_password"
|
||||
t.string "password_salt"
|
||||
t.string "persistence_token"
|
||||
t.string "perishable_token"
|
||||
t.datetime "created_at", :null => false
|
||||
t.datetime "updated_at", :null => false
|
||||
t.string "encrypted_password", :limit => 128, :default => ""
|
||||
t.string "remember_token"
|
||||
t.datetime "remember_created_at"
|
||||
t.string "reset_password_token"
|
||||
t.datetime "last_sign_in_at"
|
||||
t.string "last_sign_in_ip"
|
||||
t.integer "sign_in_count", :default => 0
|
||||
t.datetime "current_sign_in_at"
|
||||
t.string "current_sign_in_ip"
|
||||
t.datetime "reset_password_sent_at"
|
||||
t.boolean "admin"
|
||||
t.string "image_file_name"
|
||||
t.string "image_content_type"
|
||||
t.integer "image_file_size"
|
||||
t.datetime "image_updated_at"
|
||||
end
|
||||
|
||||
add_index "users", ["reset_password_token"], :name => "index_users_on_reset_password_token", :unique => true
|
||||
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue