diff --git a/Docs/ChangeLog.md b/Docs/ChangeLog.md
index 8f99a51..29daf0a 100644
--- a/Docs/ChangeLog.md
+++ b/Docs/ChangeLog.md
@@ -1,3 +1,26 @@
+# Version: 1.119.3
+## Date: 2024-12-3
+### Changes:
+- Fix: Fixed the bug of Logger.
+
+# Version: 1.119.2
+## Date: 2024-12-3
+### Changes:
+- Change: Change the layout of selection group or sample group in the basic plot part to make the layout more clear.
+
+# Version: 1.119.1
+## Date: 2024-11-29
+### Changes:
+- New: Added UpSet plot for basic selection plot part.
+
+
+# Version: 1.119.0
+## Date: 2024-11-28
+### Changes:
+- Change: API updated to 4
+- New: Added an option to plot the upset plot.
+
+
# Version: 1.118.4
## Date: 2024-11-26
### Changes:
diff --git a/README.md b/README.md
index d5d03d0..263bda4 100644
--- a/README.md
+++ b/README.md
@@ -19,7 +19,7 @@ The Tools in OTF Analyzer
![compostion](https://github.com/byemaxx/MetaX/raw/main/Docs/MetaX_Cookbook.assets/composition.png)
-## OTFs Examples
+## OTF Examples
Linking Taxa and Functions in different levels of the hierarchy, and various functional categories. e.g., **Species-KO**, **Genus-CAZy**, **Phylum-EC**, etc. Lots of visualization tools can be selected.
diff --git a/metax/gui/main_gui.py b/metax/gui/main_gui.py
index 78d3b80..13067c2 100644
--- a/metax/gui/main_gui.py
+++ b/metax/gui/main_gui.py
@@ -39,7 +39,7 @@
from PyQt5 import QtWidgets, QtCore
from PyQt5.QtWidgets import QFileDialog, QMessageBox, QTableWidgetItem
from PyQt5.QtWidgets import QApplication, QListWidget, QListWidgetItem,QPushButton
-from PyQt5.QtWidgets import QDialog, QVBoxLayout, QTextBrowser
+from PyQt5.QtWidgets import QDialog, QVBoxLayout, QTextBrowser, QSizePolicy, QLayout
from PyQt5.QtGui import QIcon, QCursor
from PyQt5.QtCore import Qt, QTimer, QDir, QSettings
@@ -377,6 +377,7 @@ def __init__(self, MainWindow):
self.pushButton_plot_basic_treemap.clicked.connect(lambda: self.plot_basic_info_sns('treemap'))
self.pushButton_plot_basic_sankey.clicked.connect(lambda: self.plot_basic_info_sns('sankey'))
self.pushButton_basic_plot_number_bar.clicked.connect(lambda: self.plot_basic_info_sns('num_bar'))
+ self.pushButton_basic_plot_upset.clicked.connect(lambda: self.plot_basic_info_sns('upset'))
# change event for checkBox_pca_if_show_lable
self.comboBox_table4pca.currentIndexChanged.connect(self.change_event_checkBox_basic_plot_table)
@@ -392,9 +393,16 @@ def __init__(self, MainWindow):
self.pushButton_basic_bar_plot.clicked.connect(lambda: self.plot_basic_list('bar'))
self.pushButton_basic_heatmap_get_table.clicked.connect(lambda: self.plot_basic_list('get_table'))
self.pushButton_basic_heatmap_sankey_plot.clicked.connect(lambda: self.plot_basic_list('sankey'))
+ self.pushButton_basic_heatmap_plot_upset.clicked.connect(lambda: self.plot_basic_list('upset'))
self.pushButton_basic_heatmap_add_a_list.clicked.connect(self.add_a_list_to_heatmap)
self.comboBox_basic_heatmap_selection_list.add_all_searched.connect(self.add_all_searched_basic_heatmap_to_list)
self.comboBox_basic_table.currentIndexChanged.connect(self.change_event_comboBox_basic_heatmap_table)
+ self.comboBox_basic_pca_group_sample.currentIndexChanged.connect(lambda:self.change_event_comboBox_group_or_sample('basic_pca_group'))
+ self.comboBox_basic_heatmap_group_or_sample.currentIndexChanged.connect(lambda:self.change_event_comboBox_group_or_sample('basic_heatmap_group'))
+ self.comboBox_co_expr_group_sample.currentIndexChanged.connect(lambda:self.change_event_comboBox_group_or_sample('co_expr_group'))
+ self.comboBox_trends_group_sample.currentIndexChanged.connect(lambda:self.change_event_comboBox_group_or_sample('trends_group'))
+ self.comboBox_tflink_group_sample.currentIndexChanged.connect(lambda:self.change_event_comboBox_group_or_sample('tflink_group'))
+ self.comboBox_radioButton_network_group_sample.currentIndexChanged.connect(lambda:self.change_event_comboBox_group_or_sample('tfnet_group'))
### Peptide Qeruy
self.pushButton_basic_peptide_query.clicked.connect(self.peptide_query)
@@ -637,6 +645,78 @@ def change_event_comboBox_basic_heatmap_table(self):
self.pushButton_basic_heatmap_sankey_plot.setEnabled(True)
else:
self.pushButton_basic_heatmap_sankey_plot.setEnabled(False)
+
+
+ def hide_or_show_all_items_in_layout(self, layout, hide: bool):
+ """
+ Recursively hide or show all items in the given layout, including nested layouts.
+
+ Args:
+ layout (QLayout): The layout to process.
+ hide (bool): True to hide all items, False to show all items.
+ """
+ # check if the layout is a QLayout
+ if not isinstance(layout, QLayout):
+ # set the visibility of the widget
+ layout.setVisible(not hide)
+ else:
+ # iterate over all items in the layout
+ for i in range(layout.count()):
+ item = layout.itemAt(i)
+ if item is not None:
+ widget = item.widget()
+ if widget is not None:
+ widget.setVisible(not hide)
+ elif isinstance(item, QLayout):
+ # If the item is a nested layout, recurse into it
+ self.hide_or_show_all_items_in_layout(item, hide)
+
+
+
+ def change_event_comboBox_group_or_sample(self, position):
+ position_dict = {
+ 'basic_pca_group': {"current_text": 'comboBox_basic_pca_group_sample',
+ "group_layout": ['horizontalLayout_111', 'verticalLayout_basic_pca_group'],
+ "sample_layout": ['verticalLayout_basic_pca_sample']},
+ 'basic_heatmap_group': {"current_text": 'comboBox_basic_heatmap_group_or_sample',
+ "group_layout": ['verticalLayout_basic_heatmap_group', 'horizontalLayout_112'],
+ "sample_layout": ['verticalLayout_basic_heatmap_sample']},
+ 'co_expr_group': {"current_text": 'comboBox_co_expr_group_sample',
+ "group_layout": ['gridLayout_co_expr_group', 'horizontalLayout_42'],
+ "sample_layout": ['gridLayout_co_expr_sample']},
+ 'trends_group': {"current_text": 'comboBox_trends_group_sample',
+ "group_layout": ['horizontalLayout_45', 'verticalLayout_trends_group'],
+ "sample_layout": ['verticalLayout_trends_sample']},
+ 'tflink_group': {"current_text": 'comboBox_tflink_group_sample',
+ "group_layout": ['horizontalLayout_78', 'gridLayout_tflink_group'],
+ "sample_layout": ['gridLayout_tflink_sample']},
+ 'tfnet_group': {"current_text": 'comboBox_radioButton_network_group_sample',
+ "group_layout": ['horizontalLayout_55', 'gridLayout_network_group'],
+ "sample_layout": ['gridLayout_network_sample']},
+ }
+
+
+ # current_text = self.comboBox_basic_heatmap_group_or_sample.currentText()
+ current_combo = position_dict[position]["current_text"]
+ current_text = getattr(self, current_combo).currentText()
+ if current_text == 'Group':
+ # hide all in sample_layout
+ for layout in position_dict[position]["sample_layout"]:
+ self.hide_or_show_all_items_in_layout(getattr(self, layout), hide=True)
+ # show all in group_layout
+ for layout in position_dict[position]["group_layout"]:
+ self.hide_or_show_all_items_in_layout(getattr(self, layout), hide=False)
+
+ self.update_in_condition_layout_state()
+ else:
+ # hide all in group_layout
+ for layout in position_dict[position]["group_layout"]:
+ self.hide_or_show_all_items_in_layout(getattr(self, layout), hide=True)
+ # show all in sample_layout
+ for layout in position_dict[position]["sample_layout"]:
+ self.hide_or_show_all_items_in_layout(getattr(self, layout), hide=False)
+
+
def change_event_checkBox_comparing_group_control_in_condition(self):
if self.checkBox_comparing_group_control_in_condition.isChecked():
@@ -1977,7 +2057,7 @@ def run_after_set_multi_tables(self):
'''
print(f'\n----Multi Table Result----\n{msg_for_print}\n---------------------------\n')
- self.logger.write_log(msg_for_print.replace('\n', ''))
+ self.logger.write_log(msg_for_print.strip())
QMessageBox.information(self.MainWindow, 'Result', msg)
print("\n---------------------------------- Set Multi Table End ----------------------------------\n")
# go to basic analysis tab and the first tab
@@ -2723,7 +2803,6 @@ def set_multi_table(self, restore_taxafunc=False, saved_obj=None):
try:
print("\n---------------------------------- Set Multi Table ----------------------------------\n")
- self.logger.write_log(f'set_multi_table: function: {function}, taxa_level: {taxa_level}, func_threshold: {func_threshold}, outlier_detect_method: {outlier_detect_method}, outlier_handle_method: {outlier_handle_method}, outlier_handle_by_group: {outlier_handle_by_group}, normalize_method: {normalize_method}, transform_method: {transform_method}, batch_group: {batch_meta}, processing_order: {processing_order}')
self.tfa.set_func(function)
# update group and sample in comboBox
# self.update_group_and_sample_combobox() # No longer need due to self.change_event_meta_name_combobox_plot_part()
@@ -2744,6 +2823,9 @@ def set_multi_table(self, restore_taxafunc=False, saved_obj=None):
'split_func': split_func, 'split_func_params': split_func_params,
'taxa_and_func_only_from_otf': taxa_and_func_only_from_otf,
'quant_method': quant_method}
+
+ self.logger.write_log(f"set_multi_table_params: {set_multi_table_params} \
+ \n\nOutlier_params: {outlier_params} \n\nData_preprocess_params: {data_preprocess_params}", 'i')
def callback_after_set_multi_tables(result, success):
if success:
@@ -2862,62 +2944,96 @@ def update_basic_heatmap_combobox(self, type_list = 'taxa'):
self.comboBox_basic_heatmap_selection_list.addItem(type_dict[type_list][0])
self.comboBox_basic_heatmap_selection_list.addItems(type_dict[type_list][1])
self.add_basic_heatmap_list()
-
+
+ def update_in_condition_layout_state(self,):
+ signal_slot_dict = {
+ "checkBox_basic_in_condtion": "horizontalLayout_36",
+ "checkBox_basic_heatmap_in_condition": "horizontalLayout_26",
+ "checkBox_ttest_in_condition": "horizontalLayout_70",
+ "checkBox_anova_in_condition": "horizontalLayout_71",
+ "checkBox_group_control_in_condition": "horizontalLayout_73",
+ "checkBox_deseq2_comparing_in_condition": "horizontalLayout_75",
+ "checkBox_tukey_in_condition": "horizontalLayout_72",
+ "checkBox_co_expression_in_condition": "horizontalLayout_74",
+ "checkBox_trends_in_condition": "horizontalLayout_76",
+ "checkBox_tflink_in_condition": "horizontalLayout_77",
+ "checkBox_tfnetwork_in_condition": "horizontalLayout_80",
+ }
+ for checkbox_name, layout_name in signal_slot_dict.items():
+ checkbox = getattr(self, checkbox_name)
+ self.hide_or_show_all_items_in_layout(getattr(self, layout_name), not checkbox.isChecked())
+
+
def update_in_condition_combobox(self):
- '''
- Update condition_group comboBox to enable multi condition selection
- '''
+ """
+ Update condition_group to enable multi-condition selection based on QCheckBox state.
+ """
+ signal_slot_dict = {
+ "checkBox_basic_in_condtion": "horizontalLayout_36",
+ "checkBox_basic_heatmap_in_condition": "horizontalLayout_26",
+ "checkBox_ttest_in_condition": "horizontalLayout_70",
+ "checkBox_anova_in_condition": "horizontalLayout_71",
+ "checkBox_group_control_in_condition": "horizontalLayout_73",
+ "checkBox_deseq2_comparing_in_condition": "horizontalLayout_75",
+ "checkBox_tukey_in_condition": "horizontalLayout_72",
+ "checkBox_co_expression_in_condition": "horizontalLayout_74",
+ "checkBox_trends_in_condition": "horizontalLayout_76",
+ "checkBox_tflink_in_condition": "horizontalLayout_77",
+ "checkBox_tfnetwork_in_condition": "horizontalLayout_80",
+ }
+
combobox_layout_dict = {
- self.horizontalLayout_68: 'comboBox_basic_condition_group',
- self.horizontalLayout_67: 'comboBox_basic_heatmap_condition_group',
+ self.horizontalLayout_36: 'comboBox_basic_condition_group',
+ self.horizontalLayout_26: 'comboBox_basic_heatmap_condition_group',
self.horizontalLayout_70: 'comboBox_ttest_condition_group',
self.horizontalLayout_71: 'comboBox_anova_condition_group',
- self.horizontalLayout_72: 'comboBox_tukey_condition_group',
self.horizontalLayout_73: 'comboBox_group_control_condition_group',
- self.horizontalLayout_74: 'comboBox_co_expression_condition_group',
self.horizontalLayout_75: 'comboBox_deseq2_condition_group',
+ self.horizontalLayout_72: 'comboBox_tukey_condition_group',
+ self.horizontalLayout_74: 'comboBox_co_expression_condition_group',
self.horizontalLayout_76: 'comboBox_trends_condition_group',
self.horizontalLayout_77: 'comboBox_tflink_condition_group',
self.horizontalLayout_80: 'comboBox_tfnetwork_condition_group',
}
+ # Iterate over layouts and replace only the target QComboBox
for layout, combobox_name in combobox_layout_dict.items():
- try:
- layout.itemAt(0).widget().deleteLater()
- except Exception:
- pass
- new_combobox = CheckableComboBox()
- setattr(self, combobox_name, new_combobox)
- layout.addWidget(new_combobox)
- # set as disabled
- new_combobox.setEnabled(False)
-
- # reconnect the signal and slot
- signnal_slot_dict = {
- self.checkBox_basic_in_condtion: 'comboBox_basic_condition_group',
- self.checkBox_basic_heatmap_in_condition: 'comboBox_basic_heatmap_condition_group',
- self.checkBox_ttest_in_condition: 'comboBox_ttest_condition_group',
- self.checkBox_anova_in_condition: 'comboBox_anova_condition_group',
- self.checkBox_tukey_in_condition: 'comboBox_tukey_condition_group',
- self.checkBox_group_control_in_condition: 'comboBox_group_control_condition_group',
- self.checkBox_co_expression_in_condition: 'comboBox_co_expression_condition_group',
- self.checkBox_deseq2_comparing_in_condition: 'comboBox_deseq2_condition_group',
- self.checkBox_trends_in_condition: 'comboBox_trends_condition_group',
- self.checkBox_tflink_in_condition: 'comboBox_tflink_condition_group',
- self.checkBox_tfnetwork_in_condition: 'comboBox_tfnetwork_condition_group',
- }
+ # Locate the original combobox
+ for i in range(layout.count()):
+ widget = layout.itemAt(i).widget()
+ if isinstance(widget, QtWidgets.QComboBox) and widget.objectName() == combobox_name:
+ # Replace the widget
+ widget.deleteLater()
+ new_combobox = CheckableComboBox()
+ new_combobox.setObjectName(combobox_name)
+ new_combobox.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
+ layout.insertWidget(i, new_combobox)
+ setattr(self, combobox_name, new_combobox)
+ break
+
+
+ # Function to handle checkbox state change
+ def show_layout_by_checkbox(checked, layout_name):
+ """
+ Show or hide the layout based on checkbox state.
+ Args:
+ checked (bool): True if the checkbox is checked, False otherwise.
+ layout_name (str): Name of the layout to show or hide.
+ """
+ self.hide_or_show_all_items_in_layout(getattr(self, layout_name), not checked)
+
+ # Connect each checkbox to the corresponding layout
+ for checkbox_name, layout_name in signal_slot_dict.items():
+ checkbox = getattr(self, checkbox_name)
+ checkbox.toggled.connect(
+ lambda checked, ln=layout_name: show_layout_by_checkbox(checked, ln)
+ )
+
+ # Hide or show all items in layout based on checkbox state
+ self.update_in_condition_layout_state()
- # when checkBox is checked, enable the comboBox
- def enable_combobox_by_checkbox(checkbox, combobox_name):
- if checkbox.isChecked():
- getattr(self, combobox_name).setEnabled(True)
- else:
- getattr(self, combobox_name).setEnabled(False)
- for checkbox, combobox_name in signnal_slot_dict.items():
- checkbox.stateChanged.connect(lambda state, cb=checkbox, cmb_name=combobox_name: enable_combobox_by_checkbox(cb, cmb_name))
-
def update_group_and_sample_combobox(self, meta_name = None, update_group_list = True, update_sample_list = True):
if meta_name is None:
@@ -2970,6 +3086,8 @@ def update_group_and_sample_combobox(self, meta_name = None, update_group_list =
new_combobox = CheckableComboBox()
setattr(self, combobox_name, new_combobox) # Assign to the attribute
layout.addWidget(new_combobox)
+ # set horizontal policy as Expanding
+ new_combobox.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
for group in group_list:
new_combobox.addItem(group)
if update_sample_list:
@@ -2983,6 +3101,8 @@ def update_group_and_sample_combobox(self, meta_name = None, update_group_list =
layout.addWidget(new_combobox)
for sample in sample_list:
new_combobox.addItem(sample)
+ # set new_combobox as invisible
+ new_combobox.setVisible(False)
def update_func_taxa_group_to_combobox(self):
@@ -3082,6 +3202,7 @@ def enable_multi_button(self, state=True):
list_button = [
self.pushButton_plot_pca_sns,
self.pushButton_basic_plot_number_bar,
+ self.pushButton_basic_plot_upset,
self.pushButton_plot_corr,
self.pushButton_plot_box_sns,
self.pushButton_anova_test,
@@ -3108,6 +3229,7 @@ def enable_multi_button(self, state=True):
self.pushButton_basic_heatmap_plot,
self.pushButton_basic_bar_plot,
self.pushButton_basic_heatmap_get_table,
+ self.pushButton_basic_heatmap_plot_upset,
self.pushButton_basic_heatmap_sankey_plot,
self.pushButton_basic_heatmap_add_top,
self.pushButton_co_expr_plot,
@@ -3449,7 +3571,7 @@ def add_basic_heatmap_top_list(self):
if self.checkBox_basic_heatmap_in_condition.isChecked() else None
)
# get sample list
- if self.radioButton_basic_heatmap_group.isChecked(): # select by group
+ if self.comboBox_basic_heatmap_group_or_sample.currentText() == 'Group':
group_list = self.comboBox_basic_group.getCheckedItems()
sample_list = self.get_sample_list_for_group_list_in_condition(group_list, condition=in_condition)
@@ -3561,7 +3683,7 @@ def plot_basic_list(self, plot_type='heatmap'):
cmap = None
# get sample list
- if self.radioButton_basic_heatmap_group.isChecked():
+ if self.comboBox_basic_heatmap_group_or_sample.currentText() == 'Group':
condition = [self.comboBox_basic_heatmap_condition_meta.currentText(),
self.comboBox_basic_heatmap_condition_group.getCheckedItems()]\
if self.checkBox_basic_heatmap_in_condition.isChecked() else None
@@ -3734,7 +3856,22 @@ def plot_basic_list(self, plot_type='heatmap'):
sub_meta=sub_meta, plot_mean=plot_mean,
show_legend=self.checkBox_basic_bar_show_legend.isChecked())
self.save_and_show_js_plot(pic, title)
+
+ elif plot_type == 'upset':
+ show_percentages = self.checkBox_basic_heatmap_plot_upset_show_percentage.isChecked()
+ min_subset_size = self.spinBox_basic_heatmap_plot_upset_min_subset.value()
+ max_subset_rank = self.spinBox_basic_heatmap_plot_upset_max_rank.value()
+ BasicPlot(self.tfa).plot_upset(df = df, title_name = table_name, show_label = True,
+ width=width, height=height, font_size=font_size,
+ plot_sample = False, sub_meta = sub_meta,
+ rename_sample = rename_sample, show_percentages = show_percentages,
+ min_subset_size = min_subset_size, max_subset_rank = max_subset_rank)
+ except (IndexError, AttributeError):
+ error_message = traceback.format_exc()
+ self.logger.write_log(f'plot_basic_info_sns error: {error_message}', 'e')
+ QMessageBox.warning(self.MainWindow, 'Warning', 'The index is out of range! Please check the settings.')
+
except Exception:
error_message = traceback.format_exc()
self.logger.write_log(f'plot_basic_list error: {error_message}', 'e')
@@ -3831,10 +3968,11 @@ def add_trends_top_list(self):
)
# get sample list
- if self.radioButton_trends_group.isChecked(): # select by group
+ # if self.radioButton_trends_group.isChecked(): # select by group
+ if self.comboBox_trends_group_sample.currentText() == 'Group':
sample_list = self.get_sample_list_for_group_list_in_condition(group_list, condition=in_condition)
- elif self.radioButton_trends_sample.isChecked(): # select by sample
+ elif self.comboBox_trends_group_sample.currentText() == 'Sample':
selected_samples = self.comboBox_trends_sample.getCheckedItems()
if selected_samples:
sample_list = selected_samples
@@ -4261,6 +4399,24 @@ def plot_peptide_num_in_func(self):
def plot_basic_info_sns(self, method:str ='pca'):
+ """
+ Plot basic information using seaborn based on the specified method.
+ Parameters:
+ method (str): The method to use for plotting. Options include:
+ - 'pca': Principal Component Analysis (PCA) plot.
+ - 'pca_3d': 3D PCA plot.
+ - 'box': Box plot.
+ - 'corr': Correlation plot.
+ - 'alpha_div': Alpha diversity plot.
+ - 'beta_div': Beta diversity plot.
+ - 'sunburst': Sunburst chart.
+ - 'treemap': Treemap chart.
+ - 'sankey': Sankey diagram.
+ - 'num_bar': Number bar plot.
+ - 'upset': Upset plot.
+ Returns:
+ None
+ """
def get_title_by_table_name(self, table_name):
taxa = (self.tfa.taxa_level or 'Taxa').capitalize()
func = self.tfa.func_name or 'Functions'
@@ -4291,7 +4447,8 @@ def get_title_by_table_name(self, table_name):
title_name = get_title_by_table_name(self, table_name)
# get sample list when plot by group
- if self.radioButton_basic_pca_group.isChecked():
+ # if self.radioButton_basic_pca_group.isChecked():
+ if self.comboBox_basic_pca_group_sample.currentText() == 'Group':
condition = [self.comboBox_basic_condition_meta.currentText(),
self.comboBox_basic_condition_group.getCheckedItems()] \
if self.checkBox_basic_in_condtion.isChecked() else None
@@ -4432,10 +4589,26 @@ def get_title_by_table_name(self, table_name):
show_label = show_label, rename_sample = rename_sample,
legend_col_num=legend_col_num, sub_meta = sub_meta)
+ elif method == 'upset':
+ plot_sample = self.checkBox_basic_plot_number_plot_sample.isChecked()
+ show_percentages = self.checkBox_basic_plot_upset_show_percentage.isChecked()
+ min_subset_size = self.spinBox_basic_plot_upset_min_subset.value()
+ max_subset_rank = self.spinBox_basic_plot_upset_max_rank.value()
+ BasicPlot(self.tfa).plot_upset(df = df, title_name = title_name, show_label = show_label,
+ width=width, height=height, font_size=font_size,
+ plot_sample = plot_sample, sub_meta = sub_meta,
+ rename_sample = rename_sample, show_percentages = show_percentages,
+ min_subset_size = min_subset_size, max_subset_rank = max_subset_rank)
+ except (IndexError, AttributeError):
+ error_message = traceback.format_exc()
+ self.logger.write_log(f'plot_basic_info_sns error: {error_message}', 'e')
+ QMessageBox.warning(self.MainWindow, 'Warning', 'The index is out of range! Please check the settings.')
+
except Exception:
error_message = traceback.format_exc()
+ simplified_message = "An unexpected error occurred. Please check the logs for details."
self.logger.write_log(f'plot_basic_info_sns error: {error_message}', 'e')
- QMessageBox.warning(self.MainWindow, 'Error', f'{error_message}')
+ QMessageBox.warning(self.MainWindow, 'Error', simplified_message)
# differential analysis
@@ -5157,14 +5330,15 @@ def plot_co_expr(self, plot_type = 'network'):
font_size = self.spinBox_co_expr_font_size.value()
sample_list = self.tfa.sample_list
- if self.radioButton_co_expr_bysample.isChecked():
+ if self.comboBox_co_expr_group_sample.currentText() == 'Sample':
slected_list = self.comboBox_co_expr_sample.getCheckedItems()
if len(slected_list) == 0:
print('Did not select any group!, plot all samples')
else:
sample_list = slected_list
# print(f'Plot with selected samples:{sample_list}')
- elif self.radioButton_co_expr_bygroup.isChecked():
+ # elif self.radioButton_co_expr_bygroup.isChecked():
+ elif self.comboBox_co_expr_group_sample.currentText() == 'Group':
condition = [self.comboBox_co_expression_condition_meta.currentText(),
self.comboBox_co_expression_condition_group.getCheckedItems()] \
if self.checkBox_co_expression_in_condition.isChecked() else None
@@ -5346,7 +5520,8 @@ def add_tfnet_top_list(self):
df_type = self.comboBox_tfnet_table.currentText()
filtered = self.checkBox_tfnet_top_filtered.isChecked()
- if self.radioButton_network_bysample.isChecked(): # by sample
+ # if self.radioButton_network_bysample.isChecked(): # by sample
+ if self.comboBox_radioButton_network_group_sample.currentText() == 'Sample':
slected_list = self.comboBox_network_sample.getCheckedItems()
if slected_list:
sample_list = slected_list
@@ -5481,7 +5656,8 @@ def plot_network(self):
def get_sample_list_tflink(self):
# get sample list
- if self.radioButton_tflink_group.isChecked(): # by group
+ # if self.radioButton_tflink_group.isChecked(): # by group
+ if self.comboBox_tflink_group_sample.currentText() == 'Group':
in_condition = (
[self.comboBox_tflink_condition_meta.currentText(), self.comboBox_tflink_condition_group.getCheckedItems()]
if self.checkBox_tflink_in_condition.isChecked() else None
@@ -5489,7 +5665,7 @@ def get_sample_list_tflink(self):
group_list = self.comboBox_tflink_group.getCheckedItems()
sample_list = self.get_sample_list_for_group_list_in_condition(group_list, condition=in_condition)
- elif self.radioButton_tflink_sample.isChecked(): # by sample
+ elif self.comboBox_tflink_group_sample.currentText() == 'Sample':
selected_samples = self.comboBox_tflink_sample.getCheckedItems()
if not selected_samples:
sample_list = self.tfa.sample_list
@@ -5760,36 +5936,63 @@ def set_lineEdit_db_save_path(self):
############### Class LoggerManager Begin ###############
class LoggerManager:
- def __init__(self):
- self.setup_logging()
+ def __init__(self, log_level=logging.DEBUG):
+ self.setup_logging(log_level)
self.write_log(f'------------------------------ MetaX Started Version {__version__} ------------------------------', 'i')
-
- def setup_logging(self):
+
+ def setup_logging(self, log_level=logging.DEBUG):
"""
- Configure logging settings.
+ Configure logging settings for LoggerManager.
"""
+ self.logger = logging.getLogger('MetaXLogger')
+ self.logger.setLevel(log_level)
+
# Disable matplotlib logging for warnings
matplotlib_logger = logging.getLogger('matplotlib')
matplotlib_logger.setLevel(logging.WARNING)
-
+
+ # Create log directory if not exists
home_path = os.path.expanduser("~")
metax_path = os.path.join(home_path, 'MetaX')
- if not os.path.exists(metax_path):
- os.makedirs(metax_path)
+ try:
+ if not os.path.exists(metax_path):
+ os.makedirs(metax_path)
+ except Exception as e:
+ print(f"Error creating log directory: {metax_path}. {e}")
+ metax_path = home_path # Fallback to home directory
+
log_path = os.path.join(metax_path, 'MetaX.log')
+
+ # Define formatter and handlers
log_format = '%(asctime)s - %(levelname)s - %(message)s'
- logging.basicConfig(filename=log_path, level=logging.DEBUG, format=log_format)
+ formatter = logging.Formatter(log_format)
+
+ # File handler
+ file_handler = logging.FileHandler(log_path)
+ file_handler.setFormatter(formatter)
+ self.logger.addHandler(file_handler)
- def write_log(self, msg:str, level:str='i'):
+ # Stream handler (optional, for console logging)
+ stream_handler = logging.StreamHandler()
+ stream_handler.setFormatter(formatter)
+ self.logger.addHandler(stream_handler)
+
+ def write_log(self, msg: str, level: str = 'i'):
+ """
+ Write a log message with the specified logging level.
+ Args:
+ msg (str): The log message.
+ level (str): The log level ('d', 'i', 'w', 'e', 'c').
+ """
level_dict = {
- 'd': logging.debug,
- 'i': logging.info,
- 'w': logging.warning,
- 'e': logging.error,
- 'c': logging.critical
+ 'd': self.logger.debug,
+ 'i': self.logger.info,
+ 'w': self.logger.warning,
+ 'e': self.logger.error,
+ 'c': self.logger.critical,
}
msg = msg.replace('\n', ' ').replace('\r', '')
- log_func = level_dict.get(level, logging.info)
+ log_func = level_dict.get(level, self.logger.info)
log_func(msg)
diff --git a/metax/gui/metax_gui/main_window.ui b/metax/gui/metax_gui/main_window.ui
index 68359a1..9191950 100644
--- a/metax/gui/metax_gui/main_window.ui
+++ b/metax/gui/metax_gui/main_window.ui
@@ -6,8 +6,8 @@
0
0
- 1122
- 816
+ 991
+ 752
@@ -46,7 +46,7 @@
Qt::LeftToRight
- 2
+ 5
false
@@ -245,8 +245,8 @@
0
0
- 528
- 595
+ 462
+ 527
@@ -1454,8 +1454,188 @@
Basic Plot
- -
-
+
-
+
+
-
+
+
+ Counts
+
+
+
+ -
+
+
+ Taxa Overview
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ PCA
+
+
+
+ -
+
+
+ false
+
+
+ Correlation Heatmap
+
+
+
+ -
+
+
+ false
+
+
+
+ 0
+ 0
+
+
+
+ PCA
+
+
+
+ -
+
+
+ false
+
+
+
+ 0
+ 0
+
+
+
+ 3D PCA
+
+
+
+ -
+
+
+ Intensity
+
+
+
+ -
+
+
+ Diversity
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Sankey
+
+
+
+ -
+
+
+ false
+
+
+ Alpha Diversity
+
+
+
+ -
+
+
+ false
+
+
+ Beta Diversity
+
+
+
+ -
+
+
+ false
+
+
+ TreeMap
+
+
+
+ -
+
+
+ false
+
+
+ Sunburst
+
+
+
+ -
+
+
+ false
+
+
+ Sankey
+
+
+
+ -
+
+
+ false
+
+
+ Box
+
+
+
+ -
+
+
+ false
+
+
+ UpSet
+
+
+
+ -
+
+
+ false
+
+
+ Bar
+
+
+
+
+
+ -
+
Qt::Horizontal
@@ -1474,67 +1654,225 @@
- -
-
-
- Qt::Horizontal
-
-
-
- -
-
-
-
- 16777215
- 300
-
-
-
- Plotting Parameter
-
-
-
-
-
-
-
- 0
- 0
-
+
-
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+ Qt::LeftToRight
+
+
+ Table
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
-
+
+ Taxa
-
-
- 16777215
- 16777215
-
+
+ -
+
+ Functions
-
- true
+
+ -
+
+ Taxa-Functions
-
-
-
- 0
- 0
- 1016
- 232
-
-
+
+ -
+
+ Peptides
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Meta
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Sub Meta
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
-
+
+
+
+ 0
+ 0
+
+
+
-
+
+ None
+
+
+
+
+
+
+
+
+ -
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+ Select
+
+
+
+ -
+
+
-
+
+ Group
+
+
+ -
+
+ Sample
+
+
+
+
+
+
+ -
+
+
+
+ 16777215
+ 420
+
+
+
+ Plotting Parameter
+
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+ 16777215
+ 16777215
+
+
+
+ true
+
+
+
+
+ 0
+ 0
+ 885
+ 237
+
+
-
-
-
+
-
+
-
-
+
+
+ false
+
-
+
0
0
-
+ Adjust label text to reduce overlap
- Font Size
+ Adjust Labels
+
+
+
+
+
+ -
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+ The number of columns in the legend, set 0 to hide
+
+
+ Legend Cols
Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
@@ -1542,32 +1880,25 @@
-
-
+
- 1
-
-
- 999
+ 0
- 10
+ 1
-
-
- -
-
-
-
+
-
+
0
0
- Beta Diversity
+ Theme
Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
@@ -1575,55 +1906,10 @@
-
-
-
- true
+
+
+ false
-
-
-
- braycurtis
-
-
- -
-
- jaccard
-
-
- -
-
- euclidean
-
-
- -
-
- manhattan
-
-
- -
-
- canberra
-
-
- -
-
- chebyshev
-
-
- -
-
- dice
-
-
- -
-
- hamming
-
-
- -
-
- yule
-
-
@@ -1699,42 +1985,10 @@
- -
-
-
-
- 0
- 0
-
-
-
- false
-
-
-
-
-
- Plot Samples
-
-
-
- -
-
-
-
- 75
- true
-
-
-
- general
-
-
-
- -
-
-
- Qt::Horizontal
+
-
+
+
+ Qt::Horizontal
@@ -1812,30 +2066,76 @@
- -
-
-
-
-
-
- Show All Labels
-
-
-
- -
-
-
- X
-
-
-
- -
-
-
- Y
-
-
-
-
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 75
+ true
+
+
+
+ Counts Plot
+
+
+
+ -
+
+
+
+ 75
+ true
+
+
+
+ Sunburst
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ show Fliers
+
+
+
+ -
+
+
+
+ 75
+ true
+
+
+
+ general
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Plot Samples
+
+
-
@@ -1888,31 +2188,50 @@
- -
-
+
-
+
+
+
+ 75
+ true
+
+
+
+ Scatter Plot
+
+
+
+ -
+
-
+
0
0
+
+
+ 75
+ true
+
+
- show Fliers
+ Diversity
- -
-
+
-
+
-
-
+
-
+
0
0
- Width
+ Beta Diversity
Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
@@ -1920,23 +2239,118 @@
-
-
+
+
+ true
+
+
-
+
+ braycurtis
+
+
+ -
+
+ jaccard
+
+
+ -
+
+ euclidean
+
+
+ -
+
+ manhattan
+
+
+ -
+
+ canberra
+
+
+ -
+
+ chebyshev
+
+
+ -
+
+ dice
+
+
+ -
+
+ hamming
+
+
+ -
+
+ yule
+
+
+
+
+
+
+ -
+
+
-
+
-
+
0
0
+
+
+
+
+ Font Size
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ -
+
1
+
+ 999
+
10
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ false
+
+
+
+
+
+ Plot Samples
+
+
+
+ -
+
-
-
+
0
@@ -1944,7 +2358,7 @@
- Height
+ Width
Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
@@ -1952,7 +2366,7 @@
-
-
+
0
@@ -1963,83 +2377,12 @@
1
- 8
-
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Plot Samples
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 150
- 0
-
-
-
-
- 75
- true
-
-
-
- Correlation Heatmap
-
-
-
- -
-
-
-
-
-
-
- 0
- 0
-
-
-
- The number of columns in the legend, set 0 to hide
-
-
- Legend Cols
-
-
- Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
-
-
-
- -
-
-
- 0
-
-
- 1
+ 10
-
-
+
0
@@ -2047,7 +2390,7 @@
- Theme
+ Height
Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
@@ -2055,69 +2398,23 @@
-
-
-
- false
-
-
-
-
-
- -
-
-
-
-
-
- false
-
+
0
0
-
- Adjust label text to reduce overlap
+
+ 1
-
- Adjust Labels
+
+ 8
- -
-
-
-
- 0
- 0
-
-
-
-
- 75
- true
-
-
-
- Bar Plot
-
-
-
- -
-
-
-
- 75
- true
-
-
-
- Sunburst
-
-
-
-
@@ -2131,14 +2428,45 @@
- -
-
+
-
+
+
-
+
+
+ Show All Labels
+
+
+
+ -
+
+
+ X
+
+
+
+ -
+
+
+ Y
+
+
+
+
+
+ -
+
-
+
0
0
+
+
+ 0
+ 0
+
+
75
@@ -2146,10 +2474,27 @@
- Diversity
+ Correlation Heatmap
+ -
+
+
-
+
+
+ false
+
+
+ Show All Lables for Sunburst
+
+
+ true
+
+
+
+
+
-
-
@@ -2186,31 +2531,77 @@
- -
-
-
-
- 75
- true
-
-
-
- Scatter Plot
-
-
-
- -
-
+
-
+
-
-
+
+
+
+ 0
+ 0
+
+
+
+ UpSet
+
+
+
+ -
+
false
+
+
+ 0
+ 0
+
+
- Show All Lables for Sunburst
+ Show Percentages
-
- true
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Min Subset Size
+
+
+
+ -
+
+
+ 0
+
+
+ 99999
+
+
+ 1
+
+
+ 1
+
+
+
+ -
+
+
+ Max Rank
+
+
+
+ -
+
+
+ 999
@@ -2223,13 +2614,17 @@
- -
-
-
-
-
-
- -
-
+
-
+
+
+ Qt::Horizontal
+
+
+
+ -
+
+
-
+
-
@@ -2244,24 +2639,30 @@
-
-
-
- false
-
-
-
- 0
- 0
-
-
-
-
- -
-
+
+
-
+
+
+ true
+
+
+
+ 0
+ 0
+
+
+
+
-
- false
+ true
+
+
+
+ 0
+ 0
+
@@ -2269,328 +2670,383 @@
- -
-
-
-
- 0
- 0
-
-
-
- Groups
-
-
- true
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Samples
-
-
+
-
+
- -
+
-
- -
-
-
-
-
-
- Bar of Counts
-
-
-
- -
-
-
- Taxa Overview
+
+
+
+
+ Heatmap and Bar
+
+
+ -
+
+
+ Select for plotting
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ -
+
+
+ Show Plotting Parameter
+
+
+
+ -
+
+
-
+
+
+ false
-
-
- -
-
-
+
0
0
- PCA
-
-
-
- -
-
-
- false
-
-
- Correlation Heatmap
+ Drop Item
- -
-
+
-
+
false
-
+
0
0
- PCA
+ Clean List
- -
-
+
-
+
false
-
+
0
0
-
- 3D PCA
-
-
-
- -
-
-
- Correlation
+
+ Add a list to the drawing box, make sure there is one item per line.
-
-
- -
-
- Diversity
+ Add A List
- -
-
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ -
+
+
-
+
-
+
0
0
- Sankey
-
-
-
- -
-
-
- false
-
-
- Bar
-
-
-
- -
-
-
- false
+ Select Top
-
- Box
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
- -
-
-
- false
+
-
+
+
+
+ 0
+ 0
+
-
- Alpha Diversity
+
+ 1
-
-
- -
-
-
- false
+
+ 99999
-
- Beta Diversity
+
+ 10
- -
-
-
- false
+
-
+
+
+
+ 0
+ 0
+
- TreeMap
+ Sort by
- -
-
-
- false
-
-
- Sunburst
-
+
-
+
+
-
+
+ Total Intensity
+
+
+ -
+
+ Frequency in Samples
+
+
+ -
+
+ Number of links
+
+
+ -
+
+ ANOVA(p-value)
+
+
+ -
+
+ ANOVA(f-statistic)
+
+
+ -
+
+ T-TEST(p-value)
+
+
+ -
+
+ T-TEST(t-statistic)
+
+
+ -
+
+ Deseq2-up(p-value)
+
+
+ -
+
+ Deseq2-down(p-value)
+
+
+ -
+
+ Deseq2-up(log2FC)
+
+
+ -
+
+ Deseq2-down(log2FC)
+
+
- -
-
-
- false
-
+
-
+
- Sankey
+ Filter with threshold
- -
-
+
-
+
+
+
+ 0
+ 0
+
+
+
+ List for Plotting
+
+
+
+ -
+
+
+ false
+
+
+
+ 0
+ 0
+
+
+
+ Add conditionally filtered items to the drawing box
+
+
+ Add Top to List
+
+
+
+ -
+
+
+ false
+
+
+
+ 0
+ 0
+
+
+
+ Add selected item to the drawing box
+
+
+ Add to List
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ -
+
-
-
+
+
+ false
+
-
+
0
0
-
- Qt::LeftToRight
-
- Table
+ Plot Heatmap
+
+
+ false
+
+
+ false
-
-
+
+
+ false
+
-
+
0
0
-
-
-
- Taxa
-
-
- -
-
- Functions
-
-
- -
-
- Taxa-Functions
-
-
- -
-
- Peptides
-
-
+
+ Plot Bar
+
-
-
+
+
+ false
+
-
+
0
0
- Meta
-
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+ UpSet
-
-
+
+
+ false
+
0
0
+
+ Plot Sankey
+
-
-
+
+
+ false
+
-
+
0
0
- Sub Meta
-
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+ Get Table
- -
-
-
-
-
-
-
- 0
- 0
-
-
-
-
-
- None
-
-
-
-
-
-
-
-
-
-
- Heatmap and Bar
-
-
-
-
@@ -2683,100 +3139,16 @@
- -
-
-
- Select for plotting
+
-
+
+
+
+ 16777215
+ 330
+
-
-
- -
-
-
- Show Plotting Parameter
-
-
-
- -
-
-
- Group
-
-
- true
-
-
-
- -
-
-
-
-
-
-
- 0
- 0
-
-
-
- In Condition
-
-
-
- -
-
-
- false
-
-
-
- -
-
-
-
-
-
- false
-
-
-
- 0
- 0
-
-
-
-
-
-
-
-
- -
-
-
- false
-
-
-
- 0
- 0
-
-
-
- Add selected item to the drawing box
-
-
- Add to List
-
-
-
- -
-
-
-
- 16777215
- 300
-
-
-
- Plotting Parameter
+
+ Plotting Parameter
-
@@ -2789,8 +3161,8 @@
0
0
- 621
- 152
+ 885
+ 187
@@ -2993,6 +3365,12 @@
-
+
+
+ 0
+ 0
+
+
75
@@ -3294,6 +3672,106 @@
+ -
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+ 50
+ false
+
+
+
+ UpSet
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Min Subset Size
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ 0
+
+
+ 99999
+
+
+ 1
+
+
+ 1
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Max Rank
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ 999
+
+
+
+ -
+
+
+ true
+
+
+
+ 0
+ 0
+
+
+
+ Show Percentages
+
+
+
+
+
@@ -3303,326 +3781,88 @@
- -
-
-
-
- 0
- 0
-
-
-
- List for Plotting
-
-
-
- -
-
-
- false
-
-
-
- 0
- 0
-
-
-
- Add conditionally filtered items to the drawing box
-
-
- Add Top to List
-
-
-
- -
-
-
-
-
-
- false
-
-
-
- 0
- 0
-
-
-
- Drop Item
-
-
-
- -
-
-
- false
-
-
-
- 0
- 0
-
-
-
- Clean List
-
-
-
- -
-
-
- false
-
-
-
- 0
- 0
-
-
-
- Add a list to the drawing box, make sure there is one item per line.
-
-
- Add A List
-
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- -
-
-
- -
-
-
-
-
-
-
- 0
- 0
-
-
-
- Select Top
-
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- 1
-
-
- 99999
-
-
- 10
-
-
-
+ -
+
-
-
-
-
- 0
- 0
-
-
+
- Sort by
+ Select
-
-
-
-
-
- Total Intensity
-
-
- -
-
- Frequency in Samples
-
-
- -
-
- Number of links
-
-
- -
-
- ANOVA(p-value)
-
-
- -
-
- ANOVA(f-statistic)
-
-
+
-
- T-TEST(p-value)
+ Group
-
- T-TEST(t-statistic)
-
-
- -
-
- Deseq2-up(p-value)
+ Sample
- -
-
- Deseq2-down(p-value)
-
-
- -
-
- Deseq2-up(log2FC)
-
-
- -
-
- Deseq2-down(log2FC)
-
-
-
-
- -
-
-
- Filter with threshold
-
- -
-
-
-
-
-
- false
-
-
-
- 0
- 0
-
-
-
- Get Table
-
-
-
- -
-
-
- false
-
-
-
- 0
- 0
-
-
-
- Plot Sankey
-
-
-
- -
-
-
- false
-
-
-
- 0
- 0
-
-
-
- Plot Bar
-
-
+
-
+
+
-
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+ In Condition
+
+
+
+ -
+
+
-
+
+
+ true
+
+
+
+ 0
+ 0
+
+
+
+
+ -
+
+
+ true
+
+
+
+ 0
+ 0
+
+
+
+
+
+
+
- -
-
-
- false
-
-
-
- 0
- 0
-
-
-
- Plot Heatmap
-
-
+
-
+
+
+ -
+
- -
-
-
- -
-
-
- Sample
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
@@ -3678,6 +3918,12 @@
-
+
+
+ 0
+ 0
+
+
Plot
@@ -3744,7 +3990,7 @@
false
-
+
0
0
@@ -3774,10 +4020,16 @@
-
+
+
+ 0
+ 0
+
+
16777215
- 280
+ 300
@@ -3806,7 +4058,7 @@
0
0
- 1020
+ 889
128
@@ -4836,11 +5088,17 @@
-
+
+
+ 0
+ 0
+
+
QTabWidget::Triangular
- 3
+ 0
@@ -4908,7 +5166,14 @@
-
-
+
+
+
+ 0
+ 0
+
+
+
-
@@ -4926,19 +5191,19 @@
- -
-
-
- false
-
-
-
-
+
-
+
+
+ true
+
+
+
-
- false
+ true
@@ -5126,19 +5391,19 @@
- -
-
-
- false
-
-
-
-
+
-
+
+
+ true
+
+
+
-
- false
+ true
@@ -5188,6 +5453,12 @@
false
+
+
+ 0
+ 0
+
+
Run Dunnett's TEST
@@ -5258,19 +5529,19 @@
- -
-
-
- false
-
-
-
-
+
-
+
+
+ true
+
+
+
-
- false
+ true
@@ -5347,6 +5618,12 @@
-
+
+
+ 0
+ 0
+
+
Qt::Horizontal
@@ -5428,25 +5705,25 @@
- -
-
-
- false
-
-
-
- 0
- 0
-
-
-
-
-
+
-
+
+
+ true
+
+
+
+ 0
+ 0
+
+
+
+
-
- false
+ true
@@ -5712,8 +5989,8 @@
0
0
- 996
- 164
+ 865
+ 117
@@ -6159,94 +6436,270 @@
- -
+
-
+
+
+ Qt::Horizontal
+
+
+
+ -
-
-
+
+
+
+ 0
+ 0
+
+
+
+ Meta
+
+
+
+ -
+
+
+ -
+
+
+ Qt::RightToLeft
+
+
+ In Condition
+
+
+
+ -
+
+
-
+
+
+ true
+
+
+
+ -
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Expression Analysis
+
+
+ -
+
+
+ QTabWidget::Triangular
+
+
+ 0
+
+
+
+ Co-Expression
+
+
+
-
+
+
+ Qt::Horizontal
+
+
+
+ -
+
+
+ -
+
+
-
+
+
+ false
+
+
+
+ 0
+ 0
+
+
+
+ Drop Item
+
+
+
+ -
+
+
+ false
+
-
+
0
0
- Meta
+ Clean List
-
-
-
- -
-
-
- Qt::RightToLeft
+
+
+ false
+
+
+
+ 0
+ 0
+
+
+
+ Add a list to the drawing box, make sure there is one item per line.
- In Condition
+ Add a list
+
+
+ -
+
+
+ false
+
+
+ Add selected item to the drawing box
+
+
+ Add to Focus List
+
+
+
+ -
+
-
-
-
- false
+
+
+ Select
-
-
+
-
-
-
- false
-
-
+
+ Group
+
-
+ -
+
+ Sample
+
+
+
- -
-
-
- Qt::Horizontal
+
-
+
+
+
+ 0
+ 0
+
+
+
+ Show Plotting Parameter
-
-
-
-
-
-
-
-
- Expression Analysis
-
-
- -
-
-
- QTabWidget::Triangular
-
-
- 1
-
-
-
- Co-Expression
-
-
-
-
+
+
-
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+ In Condition
+
+
+
+ -
+
+
-
+
+
+ true
+
+
+
+ -
+
+
+ true
+
+
+
+ 0
+ 0
+
+
+
+
+ 150
+ 0
+
+
+
+
+ 500
+ 16777215
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+
-
16777215
- 240
+ 280
@@ -6263,8 +6716,8 @@
0
0
- 493
- 128
+ 885
+ 168
@@ -6591,433 +7044,92 @@
- -
-
-
- false
-
-
- Add conditionally filtered items to the drawing box
-
-
- Add Top to List
+
-
+
+
+ Qt::Horizontal
-
-
-
-
-
-
-
- 0
- 0
-
-
-
- Table
-
-
-
- -
-
-
- false
-
-
-
- 0
- 0
-
-
-
-
-
- Taxa
-
-
- -
-
- Functions
-
-
- -
-
- Taxa-Functions
-
-
- -
-
- Peptides
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Qt::LeftToRight
-
-
- Meta
-
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
-
-
- -
-
-
- false
-
-
- Add selected item to the drawing box
-
-
- Add to Focus List
-
-
-
- -
-
+
-
-
+
-
+
0
0
- Select Top
+ Table
-
-
-
-
- 0
- 0
-
-
-
- 1
-
-
- 99999
-
-
- 10
+
+
+ false
-
-
- -
-
-
+
0
0
-
- Sort by
-
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
-
-
- -
-
-
-
-
- Total Intensity
-
-
- -
-
- Frequency in Samples
-
-
- -
-
- Number of links
-
-
- -
-
- ANOVA(p-value)
-
-
- -
-
- ANOVA(f-statistic)
-
-
- -
-
- T-TEST(p-value)
-
-
- -
-
- T-TEST(t-statistic)
-
-
-
- Deseq2-up(p-value)
+ Taxa
-
- Deseq2-down(p-value)
+ Functions
-
- Deseq2-up(log2FC)
+ Taxa-Functions
-
- Deseq2-down(log2FC)
+ Peptides
-
-
-
-
- 0
- 0
-
-
-
- Filter with threshold
-
-
-
-
-
- -
-
-
-
-
-
- false
-
-
-
- 0
- 0
-
-
-
- Plot Co-Expression Network
-
-
-
- -
-
-
- false
-
-
- Plot Co-Expression Heatmap
-
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- -
-
-
-
-
-
- In Condition
-
-
-
- -
-
-
- false
-
-
-
- -
-
-
-
-
-
- false
-
-
-
- 0
- 0
-
-
-
-
- 150
- 0
-
-
-
-
- 500
- 16777215
-
-
-
-
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Show Plotting Parameter
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Group
-
-
- true
-
-
-
- -
-
-
-
- 600
- 0
-
-
-
-
- -
-
-
-
-
-
- false
-
+
0
0
-
- Drop Item
-
-
-
- -
-
-
- false
-
-
-
- 0
- 0
-
+
+ Qt::LeftToRight
- Clean List
+ Meta
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
-
-
- false
-
-
-
- 0
- 0
-
-
-
- Add a list to the drawing box, make sure there is one item per line.
-
-
- Add a list
+
+
+
+ 0
+ 0
+
- -
-
-
-
- 0
- 0
-
-
-
- Sample
-
-
-
-
@@ -7031,78 +7143,51 @@
- -
-
-
- -
-
-
- -
-
-
- Qt::Horizontal
+
-
+
+
+ false
+
+
+ Add conditionally filtered items to the drawing box
+
+
+ Add Top to List
-
-
-
-
- Expression Trends
-
-
- -
-
+
-
+
-
-
+
+
+ false
+
-
+
0
0
-
- Qt::LeftToRight
-
- In Condition
+ Plot Co-Expression Network
-
-
+
false
+
+ Plot Co-Expression Heatmap
+
- -
-
-
-
-
-
- false
-
-
-
- 0
- 0
-
-
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
+
-
+
600
@@ -7111,90 +7196,19 @@
- -
-
-
-
- 0
- 0
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Group
-
-
- true
-
-
-
- -
-
-
- false
-
-
-
- 0
- 0
-
-
-
- Add conditionally filtered items to the drawing box
-
-
- Add Top to List
-
-
-
- -
-
+
-
+
Qt::Horizontal
- -
-
-
-
- 0
- 0
-
-
-
- Sample
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- List for Plotting
-
-
-
- -
-
+
-
+
-
-
+
-
+
0
0
@@ -7202,15 +7216,12 @@
Select Top
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
-
-
+
-
+
0
0
@@ -7227,9 +7238,9 @@
-
-
+
-
+
0
0
@@ -7237,10 +7248,13 @@
Sort by
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
-
-
+
-
Total Intensity
@@ -7299,184 +7313,78 @@
-
-
-
- Filter with threshold
-
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- -
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- -
-
-
- -
-
-
- false
-
-
-
- 0
- 0
-
-
-
- Add selected item to the drawing box
-
-
- Add to List
-
-
-
- -
-
-
-
-
-
- false
-
-
-
- 0
- 0
-
-
-
- Drop Item
-
-
-
- -
-
-
- false
-
-
-
- 0
- 0
-
-
-
- Clean List
-
-
-
- -
-
-
- false
-
+
-
+
0
0
-
- Add a list to the drawing box, make sure there is one item per line.
-
- Add A list
+ Filter with threshold
- -
-
+
+
+
+
+ Expression Trends
+
+
+ -
+
-
-
-
-
- 0
- 0
-
-
-
- Qt::LeftToRight
-
+
- Table
-
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+ Select
-
-
-
- false
-
-
-
-
- Taxa
-
-
+
-
- Functions
-
-
- -
-
- Taxa-Functions
+ Group
-
- Peptides
+ Sample
- -
-
-
- Meta
-
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
-
-
- -
-
-
- -
-
+
-
+
+
+
+ 0
+ 0
+
+
- Select for plotting
+ List for Plotting
- -
+
-
+
+
+ Qt::Horizontal
+
+
+
+ -
16777215
- 240
+ 260
@@ -7493,8 +7401,8 @@
0
0
- 1016
- 166
+ 885
+ 119
@@ -7719,7 +7627,375 @@
- -
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+ Qt::LeftToRight
+
+
+ In Condition
+
+
+
+ -
+
+
-
+
+
+ true
+
+
+
+ -
+
+
+ true
+
+
+
+ 0
+ 0
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ false
+
+
+
+ 0
+ 0
+
+
+
+ Add selected item to the drawing box
+
+
+ Add to List
+
+
+
+ -
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+ Select Top
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ 1
+
+
+ 99999
+
+
+ 10
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Sort by
+
+
+
+ -
+
+
-
+
+ Total Intensity
+
+
+ -
+
+ Frequency in Samples
+
+
+ -
+
+ Number of links
+
+
+ -
+
+ ANOVA(p-value)
+
+
+ -
+
+ ANOVA(f-statistic)
+
+
+ -
+
+ T-TEST(p-value)
+
+
+ -
+
+ T-TEST(t-statistic)
+
+
+ -
+
+ Deseq2-up(p-value)
+
+
+ -
+
+ Deseq2-down(p-value)
+
+
+ -
+
+ Deseq2-up(log2FC)
+
+
+ -
+
+ Deseq2-down(log2FC)
+
+
+
+
+ -
+
+
+ Filter with threshold
+
+
+
+
+
+ -
+
+
-
+
+
+ false
+
+
+
+ 0
+ 0
+
+
+
+ Drop Item
+
+
+
+ -
+
+
+ false
+
+
+
+ 0
+ 0
+
+
+
+ Clean List
+
+
+
+ -
+
+
+ false
+
+
+
+ 0
+ 0
+
+
+
+ Add a list to the drawing box, make sure there is one item per line.
+
+
+ Add A list
+
+
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ -
+
+
+ Select for plotting
+
+
+
+ -
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+ Qt::LeftToRight
+
+
+ Table
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+ false
+
+
-
+
+ Taxa
+
+
+ -
+
+ Functions
+
+
+ -
+
+ Taxa-Functions
+
+
+ -
+
+ Peptides
+
+
+
+
+ -
+
+
+ Meta
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 600
+ 0
+
+
+
+
+ -
+
+
+ false
+
+
+
+ 0
+ 0
+
+
+
+ Add conditionally filtered items to the drawing box
+
+
+ Add Top to List
+
+
+
+ -
-
@@ -7838,6 +8114,13 @@
+ -
+
+
+ Qt::Horizontal
+
+
+
@@ -7858,14 +8141,14 @@
QTabWidget::Triangular
- 1
+ 0
Taxa-Func Link
- -
+
-
-
@@ -7901,291 +8184,126 @@
-
- 16777215
- 50
-
-
-
- Plot Bar
-
-
-
- -
-
-
- false
-
-
-
- 0
- 0
-
-
-
- Get Heatmap Table
-
-
-
- -
-
-
- Show Plotting Parameter
-
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- -
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Group
-
-
- true
-
-
-
- -
-
-
-
-
-
-
- 0
- 0
-
+
+ 16777215
+ 50
+
- Linked Number: -
+ Plot Bar
- -
-
+
-
+
false
-
+
0
0
- Show Linked Taxa Only
+ Get Heatmap Table
+
+
+
+ -
+
+
+ Show Plotting Parameter
- -
-
-
- false
-
+
-
+
-
+
0
0
-
- Restore both lists to their original full items
-
- Reset List
+ Function
- -
-
-
-
-
-
- Filter Top
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- 1
-
-
- 99999
-
-
- 10
-
-
-
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Qt::LeftToRight
+
+
+
+ -
+
-
-
+
-
+
0
0
- By
-
-
- Qt::AlignCenter
+ Sub Meta
-
-
-
-
-
- Total Intensity
-
-
- -
-
- Frequency in Samples
-
-
- -
-
- Number of links
-
-
- -
-
- ANOVA(p-value)
-
-
- -
-
- ANOVA(f-statistic)
-
-
- -
-
- T-TEST(p-value)
-
-
- -
-
- T-TEST(t-statistic)
-
-
- -
-
- Deseq2-up(p-value)
-
-
- -
-
- Deseq2-down(p-value)
-
-
- -
-
- Deseq2-up(log2FC)
-
-
- -
-
- Deseq2-down(log2FC)
-
-
-
+
+
+
+ -
+
-
-
+
-
+
0
0
- Filter with threshold
+ Linked Number: -
-
-
+
false
-
+
0
0
-
- Filter items in the two lists by condition
-
- Filter
+ Show Linked Func Only
- -
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Taxa
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Meta
-
-
-
- -
+
-
16777215
- 240
+ 260
@@ -8202,8 +8320,8 @@
0
0
- 775
- 102
+ 885
+ 225
@@ -8642,25 +8760,90 @@
- -
-
+
-
+
-
+
0
0
-
- Qt::LeftToRight
+
+ true
+
+
+
+ -
+
+
-
+
+
+ Select
+
+
+
+ -
+
+
-
+
+ Group
+
+
+ -
+
+ Sample
+
+
+
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ -
+
+
+ false
+
+
+
+ 0
+ 0
+
+
+
+ Restore both lists to their original full items
+
+
+ Reset List
- -
-
+
-
+
-
-
+
-
+
0
0
@@ -8671,7 +8854,7 @@
-
-
+
false
@@ -8682,14 +8865,14 @@
- Show Linked Func Only
+ Show Linked Taxa Only
- -
-
+
-
+
0
@@ -8697,99 +8880,383 @@
- Sample
+ Taxa
- -
-
-
- Qt::Horizontal
+
-
+
+
+
+ 0
+ 0
+
+
+
+ Meta
- -
-
-
- Qt::Horizontal
+
-
+
+
+
+ 0
+ 0
+
+
+
+ true
- -
-
+
-
+
+
-
+
+
+ Filter Top
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ 1
+
+
+ 99999
+
+
+ 10
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ By
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
-
+
+ Total Intensity
+
+
+ -
+
+ Frequency in Samples
+
+
+ -
+
+ Number of links
+
+
+ -
+
+ ANOVA(p-value)
+
+
+ -
+
+ ANOVA(f-statistic)
+
+
+ -
+
+ T-TEST(p-value)
+
+
+ -
+
+ T-TEST(t-statistic)
+
+
+ -
+
+ Deseq2-up(p-value)
+
+
+ -
+
+ Deseq2-down(p-value)
+
+
+ -
+
+ Deseq2-up(log2FC)
+
+
+ -
+
+ Deseq2-down(log2FC)
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Filter with threshold
+
+
+
+ -
+
+
+ false
+
+
+
+ 0
+ 0
+
+
+
+ Filter items in the two lists by condition
+
+
+ Filter
+
+
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+ Qt::LeftToRight
+
+
+ In Condition
+
+
+
+ -
+
+
-
+
+
-
+
+
+ true
+
+
+
+ 0
+ 0
+
+
+
+
+ -
+
+
+ true
+
+
+
+ 0
+ 0
+
+
+
+
+ 300
+ 16777215
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+ Taxa-Func Network
+
+
+ -
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+ Select Top
+
+
+
-
-
+
-
+
0
0
-
- Qt::LeftToRight
+
+ 1
-
- In Condition
+
+ 99999
+
+
+ 10
-
-
-
- false
-
+
-
+
0
0
+
+ Sort by
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
-
-
+
-
-
-
-
-
-
- false
-
-
-
- 0
- 0
-
-
-
-
- 300
- 16777215
-
-
-
-
-
+
+ Total Intensity
+
-
+ -
+
+ Frequency in Samples
+
+
+ -
+
+ Number of links
+
+
+ -
+
+ ANOVA(p-value)
+
+
+ -
+
+ ANOVA(f-statistic)
+
+
+ -
+
+ T-TEST(p-value)
+
+
+ -
+
+ T-TEST(t-statistic)
+
+
+ -
+
+ Deseq2-up(p-value)
+
+
+ -
+
+ Deseq2-down(p-value)
+
+
+ -
+
+ Deseq2-up(log2FC)
+
+
+ -
+
+ Deseq2-down(log2FC)
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Filter with threshold
+
+
- -
-
-
-
- 0
- 0
-
-
-
- true
+
-
+
+
+ Qt::Horizontal
- -
-
+
-
+
0
@@ -8797,60 +9264,20 @@
- Function
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- true
+ Show Parameter
- -
-
-
-
-
-
-
- 0
- 0
-
-
-
- Sub Meta
-
-
-
- -
-
-
-
-
-
-
-
-
- Taxa-Func Network
-
-
- -
-
+
-
+
-
+
0
0
- Sample
+ Focus List
@@ -8906,93 +9333,51 @@
- -
-
-
- Qt::Horizontal
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Focus List
-
-
-
- -
-
+
-
+
-
+
0
0
-
- Qt::Horizontal
-
- -
-
-
-
-
-
-
- 0
- 0
-
-
-
- Qt::RightToLeft
-
-
- In Condition
-
-
-
- -
-
-
- false
-
-
-
- 0
- 0
-
-
-
-
- -
-
-
-
-
-
- false
-
-
-
- 0
- 0
-
-
-
-
-
-
-
-
- -
-
+
-
+
+
+ -
+
+
+ false
+
-
+
+ 0
+ 0
+
+
+
+
+ 120
+ 16777215
+
+
+
+ Add selected item to the drawing box
+
+
+ Add to Focus List
+
+
+
+ -
+
+
+ false
+
+
+
0
0
@@ -9004,21 +9389,27 @@
- Group
+ Plot Ntework
-
- true
+
+ false
- -
-
-
- Show Parameter
+
-
+
+
+
+ 0
+ 0
+
+
+
+ Qt::Horizontal
- -
+
-
-
@@ -9067,48 +9458,7 @@
- -
-
-
- -
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
-
-
-
- false
-
-
-
- 0
- 0
-
-
-
-
- 120
- 16777215
-
-
-
- Add selected item to the drawing box
-
-
- Add to Focus List
-
-
-
- -
false
@@ -9133,45 +9483,10 @@
- -
-
-
- -
-
-
-
-
-
-
- 0
- 0
-
-
-
- Select Top
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- 1
-
-
- 99999
-
-
- 10
-
-
-
+ -
+
-
-
+
0
@@ -9179,125 +9494,32 @@
- Sort by
-
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+ Select
-
-
-
-
-
- Total Intensity
-
-
- -
-
- Frequency in Samples
-
-
- -
-
- Number of links
-
-
- -
-
- ANOVA(p-value)
-
-
- -
-
- ANOVA(f-statistic)
-
-
- -
-
- T-TEST(p-value)
-
-
- -
-
- T-TEST(t-statistic)
-
-
- -
-
- Deseq2-up(p-value)
-
-
- -
-
- Deseq2-down(p-value)
-
-
+
-
- Deseq2-up(log2FC)
+ Group
-
- Deseq2-down(log2FC)
+ Sample
- -
-
-
-
- 0
- 0
-
-
-
- Filter with threshold
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- -
-
-
- false
-
-
-
- 0
- 0
-
-
-
-
- 16777215
- 50
-
-
-
- Plot Ntework
-
-
- false
-
-
-
- -
+
-
16777215
- 240
+ 260
@@ -9314,8 +9536,8 @@
0
0
- 1016
- 179
+ 885
+ 166
@@ -9487,6 +9709,73 @@
+ -
+
+
+ Qt::Horizontal
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+ Qt::RightToLeft
+
+
+ In Condition
+
+
+
+ -
+
+
-
+
+
+ true
+
+
+
+ 0
+ 0
+
+
+
+
+ -
+
+
+ true
+
+
+
+ 0
+ 0
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+
+
@@ -10448,8 +10737,8 @@
0
0
- 1122
- 21
+ 991
+ 23