compute the correct starting window size
authorDiane Trout <diane@caltech.edu>
Sat, 28 Oct 2006 01:40:35 +0000 (01:40 +0000)
committerDiane Trout <diane@caltech.edu>
Sat, 28 Oct 2006 01:40:35 +0000 (01:40 +0000)
ticket:233
try to compute a window size that will show the tracks as the
gl canvas decided to draw them.

alg/glseqbrowser.cpp
alg/glseqbrowser.hpp
qui/seqbrowser/SequenceBrowser.cpp
qui/seqbrowser/SequenceBrowserWidget.cpp
qui/seqbrowser/SequenceBrowserWidget.hpp

index 7238f15701f5e478370d20ac1785320acd38de3c..5d93c6ce6087b4f9ef2b3d54d2365da20b77b149 100644 (file)
@@ -265,6 +265,16 @@ float GlSeqBrowser::viewportWidth() const
   return cur_ortho.right - cur_ortho.left;
 }
 
+int GlSeqBrowser::viewportPixelHeight() const
+{
+  return viewport_size.y;
+}
+
+int GlSeqBrowser::viewportPixelWidth() const
+{
+  return viewport_size.x;
+}
+
 double GlSeqBrowser::zoomOut()
 {
 
index 2b313f65e5fca7bcd62434118572ea6fc702555d..5cc06720f20837ecbc32b1a56d57d283ee86f406 100644 (file)
@@ -50,6 +50,11 @@ public:
   float viewportHeight() const;
   //! return width of the viewport in world coordinates
   float viewportWidth() const;
+  
+  //! return viewport height in pixels
+  int viewportPixelHeight() const;
+  //! return viewport width in pixels
+  int viewportPixelWidth() const;
 
   //! zoom out far enough to show the full size of the sequence
   double zoomOut();
index a74ee78a88e3f0a62b08dd9f599b4f3084283ec4..99fbea7d69c047ffb490c0d7c6891facebb57af3 100644 (file)
@@ -62,8 +62,7 @@ QAction *SequenceBrowser::getCopySelectedSequenceAsStringAction()
 
 QSize SequenceBrowser::sizeHint() const
 {
-  //return QSize((int)GlSeqBrowser::viewportHeight(), (int)GlSeqBrowser::viewportWidth());
-  return QSize(600, 400);
+  return QSize(viewportPixelWidth(), viewportPixelHeight());
 }
 
 void SequenceBrowser::setViewportCenter(float x)
index ddc2d5c57fc200bcc50792803a441b72e4efa3ac..f0f0b4432385e6c55a5b1398e6be5597ba779253 100644 (file)
@@ -24,71 +24,93 @@ SequenceBrowserWidget::SequenceBrowserWidget(
 )
   : QWidget(parent),
     default_dir(default_dir_),
-    scrollable_browser(this)
+    left_sidebar(new SequenceBrowserSidebar),
+    scrollable_browser(new ScrollableSequenceBrowser),
+    right_sidebar(new SequenceBrowserSidebar),
+    layout(new QHBoxLayout)
 {
-  QHBoxLayout *hlayout = new QHBoxLayout;
-  hlayout->addWidget(&left_sidebar, 0);
-  hlayout->addWidget(&scrollable_browser, 1);
-  hlayout->addWidget(&right_sidebar, 0);
-  setLayout(hlayout);
+  layout->addWidget(left_sidebar, 0);
+  layout->addWidget(scrollable_browser, 1);
+  layout->addWidget(right_sidebar, 0);
+
+  setLayout(layout);
 
   // update position values when something in the SequenceBrowser changes
-  connect(&scrollable_browser.browser(), SIGNAL(viewportChanged()),
+  connect(&(scrollable_browser->browser()), SIGNAL(viewportChanged()),
           this, SLOT(updatePosition()));
-  connect(&scrollable_browser.browser(), SIGNAL(basepairsCopied(size_t)),
+  connect(&(scrollable_browser->browser()), SIGNAL(basepairsCopied(size_t)),
           this, SIGNAL(basepairsCopied(size_t)));
 }
 
+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();
+  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)
+  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();
+  left_sidebar->clear();
+  right_sidebar->clear();
 }
 
 QMenu *SequenceBrowserWidget::getPopupMenu()
 {
-  return scrollable_browser.browser().getPopupMenu();
+  return scrollable_browser->browser().getPopupMenu();
 }
 
 QAction *SequenceBrowserWidget::getCopySelectedSequenceAsStringAction()
 {
-  return scrollable_browser.browser().getCopySelectedSequenceAsStringAction();
+  return scrollable_browser->browser().getCopySelectedSequenceAsStringAction();
 }
 
 QAction *SequenceBrowserWidget::getCopySelectedSequenceAsFastaAction()
 {
-  return scrollable_browser.browser().getCopySelectedSequenceAsFastaAction();
+  return scrollable_browser->browser().getCopySelectedSequenceAsFastaAction();
 }
 
 void SequenceBrowserWidget::copySelectedSequenceAsFasta()
 {
-  scrollable_browser.browser().copySelectedSequenceAsFasta();
+  scrollable_browser->browser().copySelectedSequenceAsFasta();
 }
 
 void SequenceBrowserWidget::copySelectedTracksAsSeqLocation(
     std::list<SequenceLocation>& locations
 )
 {
-  scrollable_browser.browser().copySelectedTracksAsSeqLocation(locations);
+  scrollable_browser->browser().copySelectedTracksAsSeqLocation(locations);
 }
 
 void SequenceBrowserWidget::setSequences(
     const std::vector<boost::shared_ptr<Sequence> >& sequences,
     boost::shared_ptr<AnnotationColors> cm)
 {
-  SequenceBrowser& browser = scrollable_browser.browser();
+  SequenceBrowser& browser = scrollable_browser->browser();
   clear();
   for(Mussa::vector_sequence_type::const_iterator seq_i = sequences.begin();
       seq_i != sequences.end();
@@ -98,12 +120,12 @@ void SequenceBrowserWidget::setSequences(
     converted_sequences.push_back(gs);
     browser.push_sequence(gs);
   }
-  left_sidebar.setSequences(converted_sequences);
-  right_sidebar.setSequences(converted_sequences);
+  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;
+  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)
   {
     connect(left[i], SIGNAL(nameChanged(const QString &)),
@@ -119,7 +141,7 @@ void SequenceBrowserWidget::setSequences(
   std::vector<boost::shared_ptr<GlSequence> >& sequences
 )
 {
-  SequenceBrowser& browser = scrollable_browser.browser();
+  SequenceBrowser& browser = scrollable_browser->browser();
   clear();
   for(vector<boost::shared_ptr<GlSequence> >::iterator seq_i = sequences.begin();
       seq_i != sequences.end();
@@ -127,37 +149,37 @@ void SequenceBrowserWidget::setSequences(
   {
     browser.push_sequence(*seq_i);
   }
-  left_sidebar.setSequences(sequences);
-  right_sidebar.setSequences(sequences);
+  left_sidebar->setSequences(sequences);
+  right_sidebar->setSequences(sequences);
   updatePosition();
 }
 
 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();
 }
 
@@ -173,55 +195,55 @@ void SequenceBrowserWidget::centerOnPath(const vector<int>& paths)
  */
 void SequenceBrowserWidget::updatePosition()
 {
-  const SequenceBrowser& browser = scrollable_browser.browser();
+  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;
+  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()));
   }
-  scrollable_browser.browser().update();
-  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(default_dir, &scrollable_browser, this);
+  ImageSaveDialog imageSaveDialog(default_dir, scrollable_browser, this);
   imageSaveDialog.setSize(size.width(), size.height());
   imageSaveDialog.exec();
 }
 
 double SequenceBrowserWidget::zoom()
 {
-  return scrollable_browser.browser().zoom();
+  return scrollable_browser->browser().zoom();
 }
 
 double SequenceBrowserWidget::zoomOut()
 {
-  double zoom_level = scrollable_browser.browser().zoomOut();
-  scrollable_browser.updateScrollBar();
+  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();
+  double zoom_level = scrollable_browser->browser().zoomToSequence();
+  scrollable_browser->updateScrollBar();
   return zoom_level;
 }
 
 void SequenceBrowserWidget::setZoom(double z)
 {
-  scrollable_browser.browser().setZoom(z);
+  scrollable_browser->browser().setZoom(z);
 }
 
 void SequenceBrowserWidget::update()
 {
   QWidget::update();
-  scrollable_browser.browser().update();
+  scrollable_browser->browser().update();
 }
index 48bb0894e194ec0b298fc79960554bd03205b45f..3527e20bb5a004ad8856a2db2b99a82304352180 100644 (file)
@@ -5,6 +5,8 @@
 #include <boost/shared_ptr.hpp>
 
 #include <QDir>
+#include <QScrollArea>
+#include <QSize>
 #include <QWidget>
 
 #include "alg/sequence.hpp"
@@ -27,6 +29,8 @@ public:
   //! return our string copy action (reference stored internally)
   QAction *getCopySelectedSequenceAsStringAction();
 
+  QSize sizeHint() const;
+    
   //! copy selected track regions into a list of SequenceLocations
   void copySelectedTracksAsSeqLocation(std::list<SequenceLocation>& );
 
@@ -79,9 +83,10 @@ signals:
   
 private:
   boost::shared_ptr<QDir> default_dir;
-  ScrollableSequenceBrowser scrollable_browser;
-  SequenceBrowserSidebar left_sidebar;
-  SequenceBrowserSidebar right_sidebar;
+  ScrollableSequenceBrowser *scrollable_browser;
+  SequenceBrowserSidebar *left_sidebar;
+  SequenceBrowserSidebar *right_sidebar;
+  QHBoxLayout *layout;
 
   //! sequences created by a setSequences(vector<Sequences>) call
   /*! I need to save them so i can free them to avoid a memory leak