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()
}
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),
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)
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();
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)
// 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;