add prototype wrapping of the qt sequence browser
[mussa.git] / qui / seqbrowser / SequenceBrowserWidget.cpp
index 557174216724dac761c4519310a34302c00f5c7e..34c7a9a14067f690eb35b82967726c6d7890232e 100644 (file)
 #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();
 }
 
-void SequenceBrowserWidget::setSequences(const std::vector<Sequence>& sequences,
-                                            AnnotationColors& cm)
+QMenu *SequenceBrowserWidget::getPopupMenu()
 {
-  SequenceBrowser& browser = scrollable_browser.browser();
+  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<SequenceRef >& new_sequences,
+    AnnotationColorsRef cm)
+{
+  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().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 
@@ -112,29 +245,55 @@ void SequenceBrowserWidget::centerOnPath(const vector<int>& paths)
  */
 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->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();
+}
+
+double SequenceBrowserWidget::zoomOut()
+{
+  double zoom_level = scrollable_browser->browser().zoomOut();
+  scrollable_browser->updateScrollBar();
+  return zoom_level;
+}
+
+double SequenceBrowserWidget::zoomToSequence()
+{
+  double zoom_level = scrollable_browser->browser().zoomToSequence();
+  scrollable_browser->updateScrollBar();
+  return zoom_level;
+}
+
+void SequenceBrowserWidget::setZoom(double z)
+{
+  scrollable_browser->browser().setZoom(z);
 }
 
-void SequenceBrowserWidget::setZoom(int z)
+void SequenceBrowserWidget::update()
 {
-  scrollable_browser.browser().setZoom(z);
+  QWidget::update();
+  scrollable_browser->browser().update();
 }