#include <math.h>
using namespace std;
-SequenceBrowserWidget::SequenceBrowserWidget(QWidget *parent)
- : QSplitter(parent),
- scrollable_browser(parent)
+SequenceBrowserWidget::SequenceBrowserWidget(
+ QWidget *parent)
+ : QScrollArea(parent),
+ left_sidebar(0),
+ scrollable_browser(0),
+ right_sidebar(0),
+ layout(0),
+ layout_container(0)
{
- setOrientation(Qt::Horizontal);
+ boost::shared_ptr<QDir> empty_dir(new QDir);
+ default_dir = empty_dir;
- addWidget(&left_sidebar);
- addWidget(&scrollable_browser);
- addWidget(&right_sidebar);
+ init();
+}
+
+SequenceBrowserWidget::SequenceBrowserWidget(
+ boost::shared_ptr<QDir> default_dir_,
+ QWidget *parent
+)
+ : QScrollArea(parent),
+ left_sidebar(0),
+ scrollable_browser(0),
+ right_sidebar(0),
+ layout(0),
+ layout_container(0)
+{
+ default_dir = default_dir_;
- connect(&scrollable_browser.browser(), SIGNAL(viewportChanged()),
+ init();
+}
+
+void SequenceBrowserWidget::init()
+{
+ layout_container = new QWidget(this);
+ layout = new QHBoxLayout(layout_container);
+ left_sidebar = new SequenceBrowserSidebar(layout_container);
+ scrollable_browser = new ScrollableSequenceBrowser(layout_container);
+ right_sidebar = new SequenceBrowserSidebar(layout_container);
+
+ layout->addWidget(left_sidebar, 0);
+ layout->addWidget(scrollable_browser, 1);
+ layout->addWidget(right_sidebar, 0);
+
+ layout_container->setLayout(layout);
+ setWidget(layout_container);
+ setWidgetResizable(true);
+
+ // update position values when something in the SequenceBrowser changes
+ connect(&(scrollable_browser->browser()), SIGNAL(viewportChanged()),
this, SLOT(updatePosition()));
+ connect(&(scrollable_browser->browser()), SIGNAL(basepairsCopied(size_t)),
+ this, SIGNAL(basepairsCopied(size_t)));
+
+ // Send the signal mouseWheelZoom signal from seq browser upward.
+ connect(&(scrollable_browser->browser()), SIGNAL(mouseWheelZoom(double)),
+ this, SIGNAL(mouseWheelZoom(double)));
+}
+
+
+SequenceBrowserWidget::SequenceBrowserWidget(const SequenceBrowserWidget &o)
+ : QScrollArea(o.window()),
+ left_sidebar(o.left_sidebar),
+ scrollable_browser(o.scrollable_browser),
+ right_sidebar(o.right_sidebar),
+ layout(o.layout),
+ layout_container(o.layout_container)
+{
+}
+
+QSize SequenceBrowserWidget::sizeHint() const
+{
+ // don't trust the layouts size computation
+ // use some heavy handed brute force to compute
+ // the correct size so our stupid scrollable_browser
+ // will show the full viewport.
+ QSize left = left_sidebar->sizeHint();
+ QSize center = scrollable_browser->sizeHint();
+ QSize right = right_sidebar->sizeHint();
+
+ int width = left.width()+center.width()+right.width();
+ width += 2 * layout->margin();
+ if (layout->spacing() > 0) {
+ width += layout->spacing() * 3;
+ }
+ return QSize(width, center.height());
}
void SequenceBrowserWidget::clear()
{
converted_sequences.clear();
- scrollable_browser.browser().clear();
- left_sidebar.clear();
- right_sidebar.clear();
+ scrollable_browser->browser().clear();
+
+ SequenceBrowserSidebar::collection left = left_sidebar->descriptions;
+ SequenceBrowserSidebar::collection right = right_sidebar->descriptions;
+ for(size_t i = 0; i != left_sidebar->size(); ++i)
+ {
+ disconnect(left[i], SIGNAL(nameChanged(const QString &)),
+ right[i], SLOT(setName(const QString &)));
+ disconnect(right[i], SIGNAL(nameChanged(const QString &)),
+ left[i], SLOT(setName(const QString &)));
+ }
+ left_sidebar->clear();
+ right_sidebar->clear();
+}
+
+QMenu *SequenceBrowserWidget::getPopupMenu()
+{
+ return scrollable_browser->browser().getPopupMenu();
+}
+
+QAction *SequenceBrowserWidget::getCopySelectedSequenceAsStringAction()
+{
+ return scrollable_browser->browser().getCopySelectedSequenceAsStringAction();
+}
+
+QAction *SequenceBrowserWidget::getCopySelectedSequenceAsFastaAction()
+{
+ return scrollable_browser->browser().getCopySelectedSequenceAsFastaAction();
+}
+
+QAction *SequenceBrowserWidget::getEditSequencePropertiesAction()
+{
+ return scrollable_browser->browser().getEditSequencePropertiesAction();
+}
+
+void SequenceBrowserWidget::copySelectedSequenceAsFasta()
+{
+ scrollable_browser->browser().copySelectedSequenceAsFasta();
+}
+
+void SequenceBrowserWidget::copySelectedTracksAsSeqLocation(
+ std::list<SequenceLocation>& locations
+)
+{
+ scrollable_browser->browser().copySelectedTracksAsSeqLocation(locations);
}
-void SequenceBrowserWidget::setSequences(const std::vector<Sequence>& sequences,
- AnnotationColors& cm)
+void SequenceBrowserWidget::setSequences(
+ const std::vector<SequenceRef >& new_sequences,
+ AnnotationColorsRef cm)
{
- SequenceBrowser& browser = scrollable_browser.browser();
+ SequenceBrowser& browser = scrollable_browser->browser();
clear();
- for(vector<Sequence>::const_iterator seq_i = sequences.begin();
- seq_i != sequences.end();
+ for(Mussa::vector_sequence_type::const_iterator seq_i = new_sequences.begin();
+ seq_i != new_sequences.end();
++seq_i)
{
- GlSequence *gs= new GlSequence(*seq_i, cm);
- converted_sequences.push_back(*gs);
- browser.push_sequence(*gs);
+ // Blech *(*seq_i) is dereferencing the shared_ptr stored in the iterator.
+ boost::shared_ptr<GlSequence> gs(new GlSequence(*seq_i, cm));
+ converted_sequences.push_back(gs);
+ browser.push_sequence(gs);
+ }
+ left_sidebar->setSequences(converted_sequences);
+ right_sidebar->setSequences(converted_sequences);
+
+ // connect the text change signals to each other
+ SequenceBrowserSidebar::collection left = left_sidebar->descriptions;
+ SequenceBrowserSidebar::collection right = right_sidebar->descriptions;
+ for(size_t i = 0; i != new_sequences.size() and i != right.size(); ++i)
+ {
+ connect(left[i], SIGNAL(nameChanged(const QString &)),
+ right[i], SLOT(setName(const QString &)));
+ connect(right[i], SIGNAL(nameChanged(const QString &)),
+ left[i], SLOT(setName(const QString &)));
}
- left_sidebar.setSequences(converted_sequences);
- right_sidebar.setSequences(converted_sequences);
+
updatePosition();
}
-void SequenceBrowserWidget::setSequences(std::vector<GlSequence>& sequences)
+void SequenceBrowserWidget::setSequences(
+ std::vector<boost::shared_ptr<GlSequence> >& sequences
+)
{
- SequenceBrowser& browser = scrollable_browser.browser();
+ SequenceBrowser& browser = scrollable_browser->browser();
clear();
- for(vector<GlSequence>::iterator seq_i = sequences.begin();
+ for(vector<boost::shared_ptr<GlSequence> >::iterator seq_i = sequences.begin();
seq_i != sequences.end();
++seq_i)
{
browser.push_sequence(*seq_i);
}
- left_sidebar.setSequences(sequences);
- right_sidebar.setSequences(sequences);
+ left_sidebar->setSequences(sequences);
+ right_sidebar->setSequences(sequences);
updatePosition();
}
-const vector<GlSequence>& SequenceBrowserWidget::sequences() const
+const vector<boost::shared_ptr<GlSequence> >& SequenceBrowserWidget::sequences() const
{
- return scrollable_browser.browser().sequences();
+ return scrollable_browser->browser().sequences();
}
void SequenceBrowserWidget::clear_links()
{
- scrollable_browser.browser().clear_links();
+ scrollable_browser->browser().clear_links();
}
void SequenceBrowserWidget::link(const std::vector<int>& path,
const std::vector<bool>& isRC,
int length)
{
- scrollable_browser.browser().link(path, isRC, length);
- scrollable_browser.browser().update();
+ scrollable_browser->browser().link(path, isRC, length);
+ scrollable_browser->browser().update();
}
const std::set<int> SequenceBrowserWidget::selectedPaths() const
{
- return scrollable_browser.browser().selectedPaths();
+ return scrollable_browser->browser().selectedPaths();
}
void SequenceBrowserWidget::centerOnPath(const vector<int>& paths)
{
- scrollable_browser.browser().centerOnPath(paths);
+ scrollable_browser->browser().centerOnPath(paths);
+ updatePosition();
}
/* This could theoretically be pushed down to some set
*/
void SequenceBrowserWidget::updatePosition()
{
- const SequenceBrowser& browser = scrollable_browser.browser();
- const vector<GlSequence> &sequences = browser.sequences();
- vector<SequenceDescription *> left = left_sidebar.descriptions;
- vector<SequenceDescription *> right = right_sidebar.descriptions;
+ const SequenceBrowser& browser = scrollable_browser->browser();
+ const vector<boost::shared_ptr<GlSequence> > &sequences = browser.sequences();
+ SequenceBrowserSidebar::collection left = left_sidebar->descriptions;
+ SequenceBrowserSidebar::collection right = right_sidebar->descriptions;
for(size_t i = 0; i != sequences.size() and i != right.size(); ++i)
{
- left[i]->setPosition(sequences[i].leftbase(browser.viewportLeft()));
- right[i]->setPosition(sequences[i].rightbase(browser.viewportRight()));
+ left[i]->setPosition(sequences[i]->leftbase(browser.viewportLeft()));
+ right[i]->setPosition(sequences[i]->rightbase(browser.viewportRight()));
}
- scrollable_browser.updateScrollBar();
+ scrollable_browser->browser().update();
+ scrollable_browser->updateScrollBar();
}
void SequenceBrowserWidget::promptSaveBrowserPixmap()
{
QSize size;
- size = scrollable_browser.browser().size();
+ size = scrollable_browser->browser().size();
//Image Save Dialog
- ImageSaveDialog imageSaveDialog(&scrollable_browser.browser(), this);
+ ImageSaveDialog imageSaveDialog(default_dir, scrollable_browser, this);
imageSaveDialog.setSize(size.width(), size.height());
- int result = imageSaveDialog.exec();
- cout << "Result: " << result << "\n";
+ imageSaveDialog.exec();
+}
+
+double SequenceBrowserWidget::zoom()
+{
+ return scrollable_browser->browser().zoom();
}
-int SequenceBrowserWidget::zoom()
+double SequenceBrowserWidget::zoomOut()
{
- return scrollable_browser.browser().zoom();
+ double zoom_level = scrollable_browser->browser().zoomOut();
+ scrollable_browser->updateScrollBar();
+ return zoom_level;
}
-void SequenceBrowserWidget::zoomOut()
+double SequenceBrowserWidget::zoomToSequence()
{
- scrollable_browser.browser().zoomOut();
- scrollable_browser.updateScrollBar();
+ double zoom_level = scrollable_browser->browser().zoomToSequence();
+ scrollable_browser->updateScrollBar();
+ return zoom_level;
}
-void SequenceBrowserWidget::zoomToSequence()
+void SequenceBrowserWidget::setZoom(double z)
{
- scrollable_browser.browser().zoomToSequence();
- scrollable_browser.updateScrollBar();
+ scrollable_browser->browser().setZoom(z);
}
-void SequenceBrowserWidget::setZoom(int z)
+void SequenceBrowserWidget::update()
{
- scrollable_browser.browser().setZoom(z);
+ QWidget::update();
+ scrollable_browser->browser().update();
}