Fix the new analysis dialog so it starts at a good size on os x
[mussa.git] / qui / mussa_setup_dialog / SequenceSetupFrame.cpp
1 #include <QFrame>
2 #include <QList>
3 #include <QScrollArea>
4 #include <QVBoxLayout>
5
6 #include "qui/mussa_setup_dialog/SequenceSetupWidget.hpp"
7 #include "qui/mussa_setup_dialog/SequenceSetupFrame.hpp"
8 #include "qui/mussa_setup_dialog/SetupInfo.hpp"
9
10
11 SequenceSetupFrame::SequenceSetupFrame(QWidget *parent)
12   : QWidget(parent),
13     sequenceFrame(0),
14     scrollArea(0),
15     seqCount(1),
16     default_directory(QDir::current()),
17     sequenceLayout(0)
18 {
19
20   // frame
21   sequenceFrame = new QFrame;
22   sequenceFrame->setFrameStyle(QFrame::Panel | QFrame::Sunken);
23   
24   sequenceLayout = new QVBoxLayout;  
25
26   sequenceFrame->setLayout(sequenceLayout);
27
28   //scroll area
29   scrollArea = new QScrollArea;
30   scrollArea->setWidget(sequenceFrame);
31
32   QVBoxLayout *mainLayout = new QVBoxLayout;
33   mainLayout->addWidget(scrollArea);
34   setLayout(mainLayout);
35
36   //Initialize to one sequence
37   changeSequenceCount(2);
38   
39   //scrollArea->resize(sequenceFrame->sizeHint());
40   //sequenceFrame->resize(500,500);
41   //sequenceFrame->resize(scrollArea->size());
42   scrollArea->setWidgetResizable(TRUE);
43   scrollArea->show();
44
45 }
46
47 QDir SequenceSetupFrame::get_default_dir() const 
48 {
49   return default_directory;
50 }
51
52 void SequenceSetupFrame::set_default_dir(const QDir& d)
53 {
54   default_directory = d;
55 }
56
57 void SequenceSetupFrame::changeSequenceCount(int newSeqCount)
58 {
59   seqCount = newSeqCount;
60   setupSequences(seqCount);
61   resizeInnerFrame();
62 }
63
64 void SequenceSetupFrame::resizeInnerFrame()
65 {
66   QSize box(seqList.front()->sizeHint());
67
68   sequenceFrame->resize(box.width(), box.height() * seqList.size() + 30);
69 }
70
71 void SequenceSetupFrame::setupSequences(int newSeqCount)
72 {
73   const int curSeqCount = seqList.size();
74
75   if (curSeqCount == newSeqCount)
76   {
77     return;
78   }
79   else if (curSeqCount < newSeqCount)
80   {
81     int numSeqsToAdd = newSeqCount - curSeqCount;
82
83     SequenceSetupWidget *seq = 0;
84     for (int i = 1; i <= numSeqsToAdd; i++)
85     {
86       seq = new SequenceSetupWidget(this);
87       seqList.push_back(seq);
88       sequenceLayout->addWidget(seq);
89     } 
90   }
91   else if (curSeqCount > newSeqCount)
92   {
93     int numSeqsToRemove = curSeqCount - newSeqCount;
94     
95     if (numSeqsToRemove > curSeqCount)
96     {
97       numSeqsToRemove = curSeqCount;
98     }
99     
100     SequenceSetupWidget *seqWidget = 0;
101     for (int i=1; i <= numSeqsToRemove; i++)
102     {
103       seqWidget = seqList.back();
104       sequenceLayout->removeWidget(seqWidget);
105       seqList.pop_back();
106       delete seqWidget;
107     }
108
109   }
110   updateGeometry();  
111 }
112
113 std::list<SetupInfo *> SequenceSetupFrame::getSetupInfo()
114 {
115   const int curSeqCount = seqList.size();
116   
117   std::list<SetupInfo *> setupInfoList;
118
119   QString seqName;
120   QString seqFile;
121   QString annotFile;
122   int fastaIndex;
123   int start;
124   int end;
125
126
127   SequenceSetupWidget *seq = 0;
128   //SetupInfo *setupInfo = 0;
129   for (int i = 0; i < curSeqCount; i++)
130   {
131     seq = seqList.back();
132    
133     seqName = seq->getName();
134     seqFile = seq->getSeqFile();
135     annotFile = seq->getAnnotFile();
136     fastaIndex = seq->getFastaIndex();
137     start = seq->getStart();
138     end = seq->getEnd();
139
140     seqList.push_front(seq);
141     seqList.pop_back();
142
143     setupInfoList.push_back(new SetupInfo(seqName.toStdString(),
144             seqFile.toStdString(), 
145                                           annotFile.toStdString(), 
146                                           fastaIndex, start, end));
147     
148   } 
149
150   return setupInfoList;
151 }
152