center on path
[mussa.git] / alg / glseqbrowser.cpp
index 70637a0dae60a12df2af47015545ec81ed79d927..96496a2fd751102532a32e616ba846006e90a87e 100644 (file)
@@ -7,11 +7,10 @@
 using namespace std;
 
 GlSeqBrowser::GlSeqBrowser()
-  : border(25),
-    max_ortho(400.0, 0.0, 600.0, 0.0),
-    cur_ortho(max_ortho),
+  : border_width(25),
+    cur_ortho(400.0, 0.0, 600.0, 0.0),
     viewport_size(600, 400),
-    viewport_center(0),
+    viewport_center((cur_ortho.right-cur_ortho.left)/2+cur_ortho.left),
     zoom_level(2),
     color_mapper(),
     track_container()
@@ -19,7 +18,7 @@ GlSeqBrowser::GlSeqBrowser()
 }
 
 GlSeqBrowser::GlSeqBrowser(const GlSeqBrowser& gt)
-  : border(gt.border),
+  : border_width(gt.border_width),
     max_ortho(gt.max_ortho),
     cur_ortho(gt.cur_ortho),
     viewport_size(gt.viewport_size),
@@ -173,14 +172,45 @@ void GlSeqBrowser::selectRegion(int top, int left, int bottom, int right)
   processSelection(hits, selectBuf, select_buf_size);
 }
 
+float GlSeqBrowser::border() const
+{
+  return border_width;
+}
+
 float GlSeqBrowser::left() const
 { 
-  return max_ortho.left; 
+  float left;
+  if (track_container.size() == 0)
+  {
+    return cur_ortho.left;
+  } else {
+    vector<GlSequence>::const_iterator track_i = track_container.begin();    
+    left = track_i->x();
+    for( ; track_i != track_container.end(); ++track_i)
+    {
+      if (track_i->x() < left)
+        left = track_i->x();
+    }
+    return left-border_width;
+  }
 }
 
 float GlSeqBrowser::right() const
 { 
-  return max_ortho.right; 
+  float right;
+  if (track_container.size() == 0)
+  {
+    return cur_ortho.right;
+  } else {
+    vector<GlSequence>::const_iterator track_i = track_container.begin();
+    right = track_i->right();
+    for( ; track_i != track_container.end(); ++track_i)
+    {
+      if (track_i->right() > right)
+        right = track_i->right();
+    }
+    return right+border_width;
+  }
 }
 
 void GlSeqBrowser::setViewportCenter(float x)
@@ -322,6 +352,18 @@ const set<int>& GlSeqBrowser::selectedPaths() const
   return selected_paths;
 }
 
+void GlSeqBrowser::centerOnPath(const vector<int>& paths)
+{
+  if (paths.size() != track_container.size()) {
+    throw mussa_error("Path length didn't match the number of sequences");
+  }
+
+  for(size_t track_i = 0; track_i != track_container.size(); ++track_i)
+  {
+    track_container[track_i].setX(viewport_center - paths[track_i]);
+  }
+}
+
 void GlSeqBrowser::update_viewport(float center, int new_zoom)
 {
   float max_width = max_ortho.width();
@@ -337,14 +379,14 @@ void GlSeqBrowser::update_viewport(float center, int new_zoom)
 void GlSeqBrowser::update_layout()
 {
   typedef std::vector<GlSequence>::iterator glseq_itor_type;
-  float available_height = (float)cur_ortho.top - 2 * (float)border;
+  float available_height = (float)cur_ortho.top - 2 * (float)border_width;
   float max_base_pairs = 0;
   size_t track_count = track_container.size();
 
   if (track_count > 1) {
     // we have several sequences
     float track_spacing = available_height / (track_count-1);
-    float y = available_height + (float)border;
+    float y = available_height + (float)border_width;
     for(glseq_itor_type seq_i = track_container.begin();
         seq_i != track_container.end();
         ++seq_i, y-=track_spacing)
@@ -364,8 +406,8 @@ void GlSeqBrowser::update_layout()
     // nothing to do as we're empty
     return;
   }
-  max_ortho.right = max_base_pairs + border;
-  max_ortho.left = -border;
+  max_ortho.right = max_base_pairs + border_width;
+  max_ortho.left = -border_width;
   max_ortho.top = viewport_size.x;
   max_ortho.bottom = 0;
   cur_ortho = max_ortho;