keep motifs after closing window
[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   // if our current analysis doesn't match the one in our
52   // model, we probalby changed the analysis.
53   // so delete and restart
54   if (model and model->getAnalysis() != analysis) {
55     delete model;
56   }
57
58   // if we don't have a model, create a new one
59   if (not model) {
60     model = new MotifModel(analysis);
61   }
62   table->setModel(model);
63   updateView();
64 }
65
66 void MotifEditor::updateAnalysisMotifs()
67 {
68   // This function is _sooo_ not thread safe
69   // erase motifs
70   Color motif_default = analysis->colorMapper()->typeColor("motif");
71   analysis->colorMapper()->erase("motif");
72   analysis->colorMapper()->appendTypeColor("motif", motif_default);
73
74   // add our motifs back
75   vector<Sequence> new_motifs;
76   vector<Color> new_colors;
77
78   for(MotifModel::iterator md_i =  model->begin();
79       md_i != model->end();
80       ++md_i)
81   {
82     if (md_i->getSequence().size() > 0 && md_i->isEnabled()) {
83       new_motifs.push_back(md_i->getSequence());
84       new_colors.push_back(md_i->getColor());
85     }
86   }
87   analysis->set_motifs(new_motifs, new_colors);
88
89   emit changedMotifs();
90 }
91
92 void MotifEditor::updateTitle() 
93 {
94   std::string title("Motif Editor: ");
95   if (analysis) {
96     title += analysis->get_title();
97   }
98   setWindowTitle(title.c_str());
99 }
100
101 void MotifEditor::updateView()
102 {
103    for (int row = 0; row < model->rowCount(QModelIndex()); ++row)
104        table->resizeRowToContents(row);
105    for (int column = 0; column < model->columnCount(QModelIndex()); ++column)
106        table->resizeColumnToContents(column);
107 }
108
109