WhatsThis update 2
[mussa.git] / qui / seqbrowser / SequenceDescription.cpp
1 #include "qui/seqbrowser/SequenceDescription.hpp"
2
3 using namespace std;
4
5 SequenceDescription::SequenceDescription(QWidget *parent)
6   : QFrame(parent),
7     layout(0),
8     name_label(0),
9     position_label(0),
10     length_label(0),
11     pos(-1) // set pos to an invalid value so the setPos function will call
12             // setText
13 {
14   setupWidgets();
15 }
16
17 SequenceDescription::SequenceDescription(
18     boost::shared_ptr<GlSequence> glseq,
19     QWidget *parent
20 ) : QFrame(parent) 
21 {
22   setupWidgets();
23   setGlSequence(glseq);  
24 }
25
26 void SequenceDescription::setupWidgets()
27 {
28   layout = new QVBoxLayout;
29   name_label = new QLineEdit;
30   position_label = new QLabel;
31   length_label = new QLabel;
32   
33   setFrameStyle(QFrame::Panel | QFrame::Sunken);
34   setLineWidth(1);
35
36   // What's this feature descriptions
37   // FIXME: The extra space is added because for some reason
38   // Qt's whatsthis feature is chopping off the last word
39   // under linux.
40   name_label->setWhatsThis("Name of sequence ");
41   position_label->setWhatsThis("Edge of viewport base pair position ");
42   length_label->setWhatsThis("Total length of sequence ");
43   
44   layout->addWidget(name_label);
45   layout->addWidget(position_label);
46   layout->addWidget(length_label);
47   name_label->setMaximumWidth(length_label->fontMetrics().width("01234567"));
48   setLayout(layout);
49   connect(name_label, SIGNAL(textChanged(const QString& )),
50           this, SLOT(setName(const QString& )));
51 }
52
53 void SequenceDescription::setGlSequence(
54   boost::shared_ptr<GlSequence> glseq  )
55 {
56   if (glseq != glsequence_) {
57     glsequence_ = glseq;
58     setName(glsequence_->sequence()->get_species());
59     setLength(glsequence_->sequence()->length());
60     emit glsequenceChanged(glsequence_);
61   }
62 }
63
64 boost::shared_ptr<GlSequence> SequenceDescription::glsequence() 
65 {
66   return glsequence_;
67 }
68
69 void SequenceDescription::setName(std::string name)
70 {
71   setName(QString(name.c_str()));
72 }
73
74 void SequenceDescription::setName(const QString& name_)
75 {
76   std::string std_name_ = name_.toStdString();
77
78   if (std_name_ != glsequence_->sequence()->get_species()) {
79     glsequence_->sequence()->set_species(std_name_);
80     emit nameChanged(name_);
81   }
82
83     // no need to setText again if its because of user editing
84   if (name_ != name_label->text()) {
85     name_label->setText(name_);
86     name_label->setCursorPosition(0);
87   }
88 }
89
90 std::string SequenceDescription::name() const 
91
92   if (glsequence_) 
93     return glsequence_->sequence()->get_species();
94   else
95     return string("");
96 }
97
98 void SequenceDescription::setLength(int length)
99 {
100   QString s;
101   float short_length = length;
102   if (short_length > 1000000) {
103     short_length /= 1000000;
104     s.setNum(short_length, 'f', 2);
105     s += "mb";
106   } if (short_length > 1000) {
107     short_length /= 1000;
108     s.setNum(short_length, 'f', 2);
109     s += "kb";
110   } else {
111     s.setNum(short_length);
112     s += "b";
113   }
114   length_label->setText(s);
115 }
116
117 int SequenceDescription::length() const 
118 {
119   return 0;
120
121   if (glsequence_)
122     return glsequence_->sequence()->size();
123   else
124     return 0;
125 }
126
127 void SequenceDescription::setPosition(int pos_) 
128
129   QString s; 
130   if (pos != pos_) {
131     pos = pos_;
132     position_label->setText(s.setNum(pos_));
133     emit positionChanged(pos);
134   }
135 }
136
137 int SequenceDescription::position() const
138 {
139   return pos;
140 }