f98402689b3e763c41216b02fe008624109f8268
[mussa.git] / qui / motif_editor / MotifEditor.cpp
1 #include "qui/motif_editor/MotifEditor.hpp"
2 #include "alg/sequence.hpp"
3
4 #include <set>
5 #include <string>
6
7 using namespace std;
8
9 MotifEditor::MotifEditor(MussaRef m, QWidget *parent)
10   : QWidget(parent),
11     analysis(m),
12     editor_layout(0),
13     button_layout(0),
14     table(0),
15     delegate(0),
16     applyButton(0),
17     model(0)
18 {
19   setupWidgets();
20   
21   assert (m != 0);
22   const set<Sequence> &motif = analysis->motifs();
23   vector<Sequence> motif_seq(motif.begin(), motif.end());
24
25   applyButton->setFocusPolicy(Qt::StrongFocus);
26   connect(applyButton, SIGNAL(clicked()), this, SLOT(updateAnalysisMotifs()));
27   button_layout->addStretch();
28   button_layout->addWidget(applyButton);
29   
30   table->setItemDelegate(delegate);
31
32   editor_layout->addWidget(table);
33   editor_layout->addLayout(button_layout);
34   setLayout(editor_layout);
35   
36   updateTitle();
37   updateModel();
38 }
39
40 void MotifEditor::setupWidgets()
41 {
42   editor_layout = new QVBoxLayout(this);
43   button_layout = new QHBoxLayout(this);
44   table = new QTableView(this);
45   delegate = new MotifEditorDelegate(this);
46   applyButton = new QPushButton("apply");
47 }
48
49 void MotifEditor::updateModel()
50 {
51   MotifModel *new_model = new MotifModel(analysis);
52    
53   // if there was an old model, delete it
54   if (model) {
55     delete model;
56   }
57   // update the QTableView
58   model = new_model;  
59   table->setModel(model);
60   updateView();
61 }
62
63 void MotifEditor::updateAnalysisMotifs()
64 {
65   // This function is _sooo_ not thread safe
66   // erase motifs
67   Color motif_default = analysis->colorMapper()->typeColor("motif");
68   analysis->colorMapper()->erase("motif");
69   analysis->colorMapper()->appendTypeColor("motif", motif_default);
70
71   // add our motifs back
72   vector<Sequence> new_motifs;
73   vector<Color> new_colors;
74
75   for(MotifModel::iterator md_i =  model->begin();
76       md_i != model->end();
77       ++md_i)
78   {
79     if (md_i->getSequence().size() > 0 && md_i->isEnabled()) {
80       new_motifs.push_back(md_i->getSequence());
81       new_colors.push_back(md_i->getColor());
82     }
83   }
84   analysis->set_motifs(new_motifs, new_colors);
85
86   emit changedMotifs();
87 }
88
89 void MotifEditor::updateTitle() 
90 {
91   std::string title("Motif Editor: ");
92   if (analysis) {
93     title += analysis->get_title();
94   }
95   setWindowTitle(title.c_str());
96 }
97
98 void MotifEditor::updateView()
99 {
100    for (int row = 0; row < model->rowCount(QModelIndex()); ++row)
101        table->resizeRowToContents(row);
102    for (int column = 0; column < model->columnCount(QModelIndex()); ++column)
103        table->resizeColumnToContents(column);
104 }
105
106