//! copy sequence from selected track using formating function
template<class Item>
-void GlSeqBrowser::copySelectedTracks(std::list<Item>& result,
+size_t GlSeqBrowser::copySelectedTracks(std::list<Item>& result,
Item (*formatter)(boost::shared_ptr<Sequence> s,
int left,
int right))
{
+ size_t base_pairs_copied = 0;
result.clear();
for(selected_track_iterator track_i = selected_tracks.begin();
// we should be safe
boost::shared_ptr<Sequence> seq = track_container[track_index]->sequence();
result.push_back(formatter(seq, track_i->left, track_i->right));
+ base_pairs_copied += max(track_i->right-track_i->left, 0);
}
}
+ return base_pairs_copied;
}
//! copy sequence from selected tracks as FASTA sequences
-void GlSeqBrowser::copySelectedTracksAsFasta(std::string& copy_buffer)
+size_t GlSeqBrowser::copySelectedTracksAsFasta(std::string& copy_buffer)
{
std::list<std::string> result;
struct AsFasta {
return s.str();
}
};
- copySelectedTracks(result, AsFasta::formatter);
+ size_t base_pairs_copied = copySelectedTracks(result, AsFasta::formatter);
// I wish there was some way to use for_each and bind here
for (list<string>::iterator result_i = result.begin();
result_i != result.end();
{
copy_buffer.append(*result_i);
}
+ return base_pairs_copied;
}
//! copy sequence from selected tracks as new sequences
-void GlSeqBrowser::copySelectedTracksAsSequences(std::list<Sequence>& result)
+size_t GlSeqBrowser::copySelectedTracksAsSequences(std::list<Sequence>& result)
{
struct AsSequence {
static Sequence formatter(boost::shared_ptr<Sequence> seq,
return seq->subseq(left, right-left+1);
}
};
- copySelectedTracks(result, AsSequence::formatter);
+ return copySelectedTracks(result, AsSequence::formatter);
}
-void GlSeqBrowser::copySelectedTracksAsSeqLocation(
+size_t GlSeqBrowser::copySelectedTracksAsSeqLocation(
std::list<SequenceLocation>& result)
{
struct AsSeqLocation {
return SequenceLocation(seq, left, right);
}
};
- copySelectedTracks(result, AsSeqLocation::formatter);
+ return copySelectedTracks(result, AsSeqLocation::formatter);
}
//! copy sequence from selected tracks as plain sequences
-void GlSeqBrowser::copySelectedTracksAsString(std::string& copy_buffer)
+size_t GlSeqBrowser::copySelectedTracksAsString(std::string& copy_buffer)
{
std::list<string> result;
struct AsString {
}
};
- copySelectedTracks(result, AsString::formatter);
+ size_t base_pairs_copied = copySelectedTracks(result, AsString::formatter);
// I wish there was some way to use for_each and bind here
for (list<string>::iterator result_i = result.begin();
result_i != result.end();
{
copy_buffer.append(*result_i);
}
-
+ return base_pairs_copied;
}
void GlSeqBrowser::centerOnPath(const vector<int>& paths)
//! copy sequence from selected track using formating function
template<class Item>
- void copySelectedTracks(std::list<Item>& result,
+ size_t copySelectedTracks(std::list<Item>& result,
Item (*format_track)(boost::shared_ptr<Sequence> s,
int left,
int right));
//! copy sequence from selected tracks as FASTA sequences
- void copySelectedTracksAsFasta(std::string& copy_buffer);
+ /*! \return number of base pairs copied
+ */
+ size_t copySelectedTracksAsFasta(std::string& copy_buffer);
//! copy sequence from selected tracks as a list of sequences
- void copySelectedTracksAsSequences(std::list<Sequence>& result);
+ /*! \return number of base pairs copied
+ */
+ size_t copySelectedTracksAsSequences(std::list<Sequence>& result);
//! copy sequence from selected tracks as plain sequences
- void copySelectedTracksAsString(std::string& copy_buffer);
+ /*! \return number of base pairs copied
+ */
+ size_t copySelectedTracksAsString(std::string& copy_buffer);
//! copy tracks as a sequence and its coordinates
- void copySelectedTracksAsSeqLocation(std::list<SequenceLocation>& result);
+ size_t copySelectedTracksAsSeqLocation(std::list<SequenceLocation>& result);
//! Provide a logical name for a type discriminator for our glName stack
return left;
}
-void SequenceLocation::setCount(int c)
+void SequenceLocation::setCount(SequenceLocation::size_type c)
{
right = left + c;
}
-int SequenceLocation::getCount() const
+SequenceLocation::size_type SequenceLocation::getCount() const
{
return std::max(right - left, 0);
}
{
return right;
}
+
+SequenceLocation::size_type SequenceLocation::size() const
+{
+ return getCount();
+}
\ No newline at end of file
//! convenience structure for holding selected track segments
class SequenceLocation {
public:
+ typedef size_t size_type;
+
SequenceLocation(boost::shared_ptr<Sequence> s, int l, int r);
SequenceLocation(const Sequence& s, int l, int r);
SequenceLocation(const SequenceLocation& );
Sequence getSelectedSequence() const;
void setLeft(int l);
int getLeft() const;
- void setCount(int c);
- int getCount() const ;
+ void setCount(size_type c);
+ size_type getCount() const;
//! set one past the right-most base
void setRight(int r);
int getRight() const;
+ //! return total length of region (alias for getCount())
+ size_type size() const;
private:
boost::shared_ptr<Sequence> sequence;
int left;
alignTB(0)
{
setupActions();
+ connect(&browser, SIGNAL(basepairsCopied(size_t)),
+ this, SLOT(showBasePairsCopied(size_t)));
browser.setSequences(analysis->sequences(), analysis->colorMapper());
setSelectedPaths(analysis, sel_paths);
setAlignment(0);
}
}
+void MussaAlignedWindow::showBasePairsCopied(size_t bp_copied)
+{
+ QString msg("Copied ");
+ QString num;
+ num.setNum(bp_copied);
+ msg += num + " base pairs";
+ statusBar()->showMessage(msg, 5000);
+}
+
void MussaAlignedWindow::toggleViewAlignment(int alignment_index)
{
view_paths[alignment_index]= not view_paths[alignment_index];
//! set the title based on the analysis
void updateTitle();
+ //! display how many base pairs were copied on the status bar
+ void showBasePairsCopied(size_t);
protected:
// figure out what Alignments we have (needed for setupAlignmentMenus)
// to call update()
connect(this, SIGNAL(changedAnnotations()), browser, SLOT(update()));
connect(this, SIGNAL(changedMotifs()), this, SLOT(updateAnnotations()));
+ connect(browser, SIGNAL(basepairsCopied(size_t)),
+ this, SLOT(showBasePairsCopied(size_t)));
//mussaViewTB->addAction(toggleMotifsAction);
mussaViewTB->addWidget(zoom);
mussaViewTB->show();
}
+void MussaWindow::showBasePairsCopied(size_t bp_copied)
+{
+ QString msg("Copied ");
+ QString num;
+ num.setNum(bp_copied);
+ msg += num + " base pairs";
+ statusBar()->showMessage(msg, 5000);
+}
+
+
void MussaWindow::toggleMotifs()
{
NotImplementedBox();
void newMussaWindow();
void showMussaToolbar();
+ //! display how many base pairs were copied on the status bar
+ void showBasePairsCopied(size_t);
+
//! open new window showing our alignment
void viewMussaAlignment();
{
// get fasta data
std::string buffer;
- copySelectedTracksAsFasta(buffer);
+ size_t base_pairs_copied = copySelectedTracksAsFasta(buffer);
// get reference to clipboard
QClipboard *clipboard = QApplication::clipboard();
clipboard->setText(buffer.c_str());
+ emit basepairsCopied(base_pairs_copied);
}
//! emited when someone adds to our list of tracks
void tracksChanged();
void viewportChanged();
+ //! emit when someone copies basepairs
+ void basepairsCopied(size_t);
protected:
void initializeGL();
// 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)));
}
void SequenceBrowserWidget::clear()
void promptSaveBrowserPixmap();
void update();
-
+
+signals:
+ //! emit when someone copies basepairs
+ void basepairsCopied(size_t);
+
private:
boost::shared_ptr<QDir> default_dir;
ScrollableSequenceBrowser scrollable_browser;