1 /**
2  * UGENE - Integrated Bioinformatics Tools.
3  * Copyright (C) 2008-2021 UniPro <ugene@unipro.ru>
4  * http://ugene.net
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19  * MA 02110-1301, USA.
20  */
21 
22 #ifndef _U2_MSA_EDITOR_DATA_LIST_H_
23 #define _U2_MSA_EDITOR_DATA_LIST_H_
24 
25 #include <QLabel>
26 #include <QPushButton>
27 
28 #include <U2Core/BackgroundTaskRunner.h>
29 #include <U2Core/MultipleSequenceAlignment.h>
30 #include <U2Core/Task.h>
31 
32 #include "MaEditorNameList.h"
33 #include "MsaUpdatedWidgetInterface.h"
34 
35 namespace U2 {
36 
37 class CreateDistanceMatrixTask;
38 class MSADistanceMatrix;
39 class MaUtilsWidget;
40 class Task;
41 
42 class SimilarityStatisticsSettings : public UpdatedWidgetSettings {
43 public:
SimilarityStatisticsSettings()44     SimilarityStatisticsSettings()
45         : usePercents(false), excludeGaps(false) {
46     }
47     QString algoId;  // selected algorithm
48     bool usePercents;
49     bool excludeGaps;
50 };
51 
52 class MsaEditorSimilarityColumn : public MaEditorNameList, public UpdatedWidgetInterface {
53     friend class GTUtilsMSAEditorSequenceArea;
54     Q_OBJECT
55 public:
56     MsaEditorSimilarityColumn(MsaEditorWgt *ui, QScrollBar *nhBar, const SimilarityStatisticsSettings *_settings);
57     virtual ~MsaEditorSimilarityColumn();
58 
59     void setSettings(const UpdatedWidgetSettings *_settings);
60 
61     void cancelPendingTasks();
62 
getSettings()63     const UpdatedWidgetSettings &getSettings() const {
64         return curSettings;
65     }
getWidget()66     QWidget *getWidget() {
67         return this;
68     }
updateWidget()69     void updateWidget() {
70         updateDistanceMatrix();
71     }
72     QString getHeaderText() const;
73 
getState()74     DataState getState() {
75         return state;
76     }
77 
setMatrix(MSADistanceMatrix * _matrix)78     void setMatrix(MSADistanceMatrix *_matrix) {
79         matrix = _matrix;
80     }
81 
82     QString getTextForRow(int maRowIndex) override;
83 
84 protected:
85     QString getSeqName(int s);
86     void updateScrollBar();
87 
88 signals:
89     void si_dataStateChanged(DataState newState);
90 private slots:
91 
92     void onAlignmentChanged(const MultipleSequenceAlignment &maBefore, const MaModificationInfo &modInfo);
93     void sl_createMatrixTaskFinished(Task *);
94 
95 private:
96     void updateDistanceMatrix();
97 
98     MSADistanceMatrix *matrix;
99     SimilarityStatisticsSettings newSettings;
100     SimilarityStatisticsSettings curSettings;
101 
102     BackgroundTaskRunner<MSADistanceMatrix *> createDistanceMatrixTaskRunner;
103 
104     DataState state;
105     bool autoUpdate;
106 };
107 
108 class CreateDistanceMatrixTask : public BackgroundTask<MSADistanceMatrix *> {
109     Q_OBJECT
110 public:
111     CreateDistanceMatrixTask(const SimilarityStatisticsSettings &_s);
112 
113     virtual void prepare();
114 
getResult()115     MSADistanceMatrix *getResult() const {
116         return resMatrix;
117     }
118 
119     QList<Task *> onSubTaskFinished(Task *subTask);
120 
121 private:
122     SimilarityStatisticsSettings s;
123     QString resultText;
124     MSADistanceMatrix *resMatrix;
125 };
126 
127 class MsaEditorAlignmentDependentWidget : public QWidget {
128     Q_OBJECT
129 public:
130     MsaEditorAlignmentDependentWidget(UpdatedWidgetInterface *_contentWidget);
131 
132     void setSettings(const UpdatedWidgetSettings *_settings);
133     void cancelPendingTasks();
getDataState()134     const DataState &getDataState() const {
135         return state;
136     }
getSettings()137     const UpdatedWidgetSettings *getSettings() const {
138         return settings;
139     }
140 
141 private slots:
142     void sl_onAlignmentChanged(const MultipleAlignment &maBefore, const MaModificationInfo &modInfo);
143     void sl_onUpdateButonPressed();
144     void sl_onDataStateChanged(DataState newState);
145     void sl_onFontChanged(const QFont &);
146 
147 private:
148     void createWidgetUI();
149     void createHeaderWidget();
150 
151     MaUtilsWidget *headerWidget;
152     QLabel statusBar;
153     QLabel nameWidget;
154     QPushButton updateButton;
155     UpdatedWidgetInterface *contentWidget;
156     const UpdatedWidgetSettings *settings;
157     DataState state;
158     QWidget *updateBar;
159 
160     bool automaticUpdating;
161 
162     QString DataIsOutdatedMessage;
163     QString DataIsValidMessage;
164     QString DataIsBeingUpdatedMessage;
165 };
166 }  // namespace U2
167 
168 #endif
169