From e2705a674522a8971d7e65ac6d8876be6ed27ff3 Mon Sep 17 00:00:00 2001 From: Juliane Reinhardt Date: Wed, 18 Mar 2020 13:31:31 -0700 Subject: [PATCH 01/14] add QRadiobuttons to select default time periods no functionality yet --- xicam/gui/bluesky/search.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/xicam/gui/bluesky/search.py b/xicam/gui/bluesky/search.py index ace77b9..00ec3d1 100644 --- a/xicam/gui/bluesky/search.py +++ b/xicam/gui/bluesky/search.py @@ -17,6 +17,7 @@ from qtpy.QtWidgets import ( QAbstractItemView, QPushButton, + QRadioButton, QComboBox, QDateTimeEdit, QHeaderView, @@ -433,6 +434,24 @@ def __init__(self, *args, **kwargs): search_bar_layout.addWidget(mongo_query_help_button) mongo_query_help_button.clicked.connect(self.show_mongo_query_help) + #TODO + # add fixed time selectors: "all", "30 days", "2h" + + self.all_widget = QRadioButton() + select_all_layout = QHBoxLayout() + select_all_layout.addWidget(QLabel('all')) + select_all_layout.addWidget(self.all_widget) + + self.d30_widget = QRadioButton() + select_d30_layout = QHBoxLayout() + select_d30_layout.addWidget(QLabel('30 days')) + select_d30_layout.addWidget(self.d30_widget) + + self.hour_widget = QRadioButton() + select_hour_layout = QHBoxLayout() + select_hour_layout.addWidget(QLabel('1h')) + select_hour_layout.addWidget(self.hour_widget) + self.since_widget = QDateTimeEdit() self.since_widget.setCalendarPopup(True) self.since_widget.setDisplayFormat('yyyy-MM-dd HH:mm') @@ -448,6 +467,9 @@ def __init__(self, *args, **kwargs): until_layout.addWidget(self.until_widget) layout = QVBoxLayout() + layout.addLayout(select_all_layout) + layout.addLayout(select_d30_layout) + layout.addLayout(select_hour_layout) layout.addLayout(since_layout) layout.addLayout(until_layout) layout.addLayout(search_bar_layout) From c0dc3f1f9ed713b621111197e112cc0b6a21529d Mon Sep 17 00:00:00 2001 From: Juliane Reinhardt Date: Wed, 18 Mar 2020 21:35:31 -0700 Subject: [PATCH 02/14] before adding QtDesigner output --- xicam/gui/bluesky/search.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/xicam/gui/bluesky/search.py b/xicam/gui/bluesky/search.py index 00ec3d1..cccf973 100644 --- a/xicam/gui/bluesky/search.py +++ b/xicam/gui/bluesky/search.py @@ -425,7 +425,7 @@ class SearchInputWidget(QWidget): """ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.search_bar = QLineEdit() + self.search_bar = QLineEdit() #QLineEdit is a widget? search_bar_layout = QHBoxLayout() search_bar_layout.addWidget(QLabel('Custom Query:')) search_bar_layout.addWidget(self.search_bar) @@ -435,7 +435,7 @@ def __init__(self, *args, **kwargs): mongo_query_help_button.clicked.connect(self.show_mongo_query_help) #TODO - # add fixed time selectors: "all", "30 days", "2h" + ### add fixed time selectors: "all", "30 days", "2h" self.all_widget = QRadioButton() select_all_layout = QHBoxLayout() @@ -447,11 +447,18 @@ def __init__(self, *args, **kwargs): select_d30_layout.addWidget(QLabel('30 days')) select_d30_layout.addWidget(self.d30_widget) + self.today_widget = QRadioButton() + select_today_layout = QHBoxLayout() + select_today_layout.addWidget(QLabel('today')) + select_today_layout.addWidget(self.today_widget) + self.hour_widget = QRadioButton() select_hour_layout = QHBoxLayout() select_hour_layout.addWidget(QLabel('1h')) select_hour_layout.addWidget(self.hour_widget) + ### + self.since_widget = QDateTimeEdit() self.since_widget.setCalendarPopup(True) self.since_widget.setDisplayFormat('yyyy-MM-dd HH:mm') @@ -469,6 +476,7 @@ def __init__(self, *args, **kwargs): layout = QVBoxLayout() layout.addLayout(select_all_layout) layout.addLayout(select_d30_layout) + layout.addLayout(select_today_layout) layout.addLayout(select_hour_layout) layout.addLayout(since_layout) layout.addLayout(until_layout) From 3fb592ae37c14f7982215b482bc0b25b08aeb81b Mon Sep 17 00:00:00 2001 From: Juliane Reinhardt Date: Thu, 19 Mar 2020 00:11:56 -0700 Subject: [PATCH 03/14] add ui and use QtDesigner created file to build search input widget --- ui/ui_search_input.ui | 120 +++++++++++++++++++++++++++ xicam/gui/bluesky/search.py | 98 +++++++++------------- xicam/gui/bluesky/ui_search_input.py | 90 ++++++++++++++++++++ 3 files changed, 250 insertions(+), 58 deletions(-) create mode 100644 ui/ui_search_input.ui create mode 100644 xicam/gui/bluesky/ui_search_input.py diff --git a/ui/ui_search_input.ui b/ui/ui_search_input.ui new file mode 100644 index 0000000..0e997f6 --- /dev/null +++ b/ui/ui_search_input.ui @@ -0,0 +1,120 @@ + + + SearchInputWidget + + + + 0 + 0 + 389 + 368 + + + + Form + + + + + + + + + + All + + + + + + + 30 Days + + + + + + + Today + + + + + + + Last Hour + + + + + + + + + + + Since: + + + + + + + + 0 + 0 + 0 + 1752 + 9 + 14 + + + + true + + + + + + + Until: + + + + + + + true + + + + + + + + + + + Custom Query: + + + + + + + + + + ? + + + + + + + + + + + + diff --git a/xicam/gui/bluesky/search.py b/xicam/gui/bluesky/search.py index cccf973..9c203c1 100644 --- a/xicam/gui/bluesky/search.py +++ b/xicam/gui/bluesky/search.py @@ -12,6 +12,8 @@ import threading import time +from qtpy import QtCore, QtGui, QtWidgets + from qtpy.QtCore import Qt, Signal, QThread, QSettings from qtpy.QtGui import QStandardItemModel, QStandardItem from qtpy.QtWidgets import ( @@ -419,69 +421,49 @@ def on_until_time_changed(self, datetime): self.until = datetime.toSecsSinceEpoch() self.search_state.search() -class SearchInputWidget(QWidget): +from .ui_search_input import Ui_SearchInputWidget + +class SearchInputWidget(QWidget, Ui_SearchInputWidget): """ Input fields for specifying searches on SearchResultsModel """ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.search_bar = QLineEdit() #QLineEdit is a widget? - search_bar_layout = QHBoxLayout() - search_bar_layout.addWidget(QLabel('Custom Query:')) - search_bar_layout.addWidget(self.search_bar) - mongo_query_help_button = QPushButton() - mongo_query_help_button.setText('?') - search_bar_layout.addWidget(mongo_query_help_button) - mongo_query_help_button.clicked.connect(self.show_mongo_query_help) - - #TODO - ### add fixed time selectors: "all", "30 days", "2h" - - self.all_widget = QRadioButton() - select_all_layout = QHBoxLayout() - select_all_layout.addWidget(QLabel('all')) - select_all_layout.addWidget(self.all_widget) - - self.d30_widget = QRadioButton() - select_d30_layout = QHBoxLayout() - select_d30_layout.addWidget(QLabel('30 days')) - select_d30_layout.addWidget(self.d30_widget) - - self.today_widget = QRadioButton() - select_today_layout = QHBoxLayout() - select_today_layout.addWidget(QLabel('today')) - select_today_layout.addWidget(self.today_widget) - - self.hour_widget = QRadioButton() - select_hour_layout = QHBoxLayout() - select_hour_layout.addWidget(QLabel('1h')) - select_hour_layout.addWidget(self.hour_widget) - - ### - - self.since_widget = QDateTimeEdit() - self.since_widget.setCalendarPopup(True) - self.since_widget.setDisplayFormat('yyyy-MM-dd HH:mm') - since_layout = QHBoxLayout() - since_layout.addWidget(QLabel('Since:')) - since_layout.addWidget(self.since_widget) - - self.until_widget = QDateTimeEdit() - self.until_widget.setCalendarPopup(True) - self.until_widget.setDisplayFormat('yyyy-MM-dd HH:mm') - until_layout = QHBoxLayout() - until_layout.addWidget(QLabel('Until:')) - until_layout.addWidget(self.until_widget) - - layout = QVBoxLayout() - layout.addLayout(select_all_layout) - layout.addLayout(select_d30_layout) - layout.addLayout(select_today_layout) - layout.addLayout(select_hour_layout) - layout.addLayout(since_layout) - layout.addLayout(until_layout) - layout.addLayout(search_bar_layout) - self.setLayout(layout) + # optional + #self._ui = ui + self.setupUi(self) + # self.search_bar = QLineEdit() #QLineEdit is a widget? + # search_bar_layout = QHBoxLayout() + # search_bar_layout.addWidget(QLabel('Custom Query:')) + # search_bar_layout.addWidget(self.search_bar) + # mongo_query_help_button = QPushButton() + # mongo_query_help_button.setText('?') + # search_bar_layout.addWidget(mongo_query_help_button) + # mongo_query_help_button.clicked.connect(self.show_mongo_query_help) + + # self.since_widget = QDateTimeEdit() + # self.since_widget.setCalendarPopup(True) + # self.since_widget.setDisplayFormat('yyyy-MM-dd HH:mm') + # since_layout = QHBoxLayout() + # since_layout.addWidget(QLabel('Since:')) + # since_layout.addWidget(self.since_widget) + + # self.until_widget = QDateTimeEdit() + # self.until_widget.setCalendarPopup(True) + # self.until_widget.setDisplayFormat('yyyy-MM-dd HH:mm') + # until_layout = QHBoxLayout() + # until_layout.addWidget(QLabel('Until:')) + # until_layout.addWidget(self.until_widget) + + # layout = QVBoxLayout() + # layout.addLayout(select_all_layout) + # layout.addLayout(select_d30_layout) + # layout.addLayout(select_today_layout) + # layout.addLayout(select_hour_layout) + # layout.addLayout(since_layout) + # layout.addLayout(until_layout) + # layout.addLayout(search_bar_layout) + # self.setLayout(layout) def mark_custom_query(self, valid): "Indicate whether the current text is a parsable query." diff --git a/xicam/gui/bluesky/ui_search_input.py b/xicam/gui/bluesky/ui_search_input.py new file mode 100644 index 0000000..b9fa114 --- /dev/null +++ b/xicam/gui/bluesky/ui_search_input.py @@ -0,0 +1,90 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'ui_search_input.ui' +# +# Created by: PyQt5 UI code generator 5.9.2 +# +# WARNING! All changes made in this file will be lost! + +from PyQt5 import QtCore, QtGui, QtWidgets + +class Ui_SearchInputWidget(object): + def setupUi(self, SearchInputWidget): + SearchInputWidget.setObjectName("SearchInputWidget") + SearchInputWidget.resize(389, 368) + self.gridLayout_4 = QtWidgets.QGridLayout(SearchInputWidget) + self.gridLayout_4.setObjectName("gridLayout_4") + self.search_input_layout = QtWidgets.QVBoxLayout() + self.search_input_layout.setObjectName("search_input_layout") + self.default_period_layout = QtWidgets.QGridLayout() + self.default_period_layout.setObjectName("default_period_layout") + self.all_widget = QtWidgets.QRadioButton(SearchInputWidget) + self.all_widget.setObjectName("all_widget") + self.default_period_layout.addWidget(self.all_widget, 0, 0, 1, 1) + self.days_widget = QtWidgets.QRadioButton(SearchInputWidget) + self.days_widget.setObjectName("days_widget") + self.default_period_layout.addWidget(self.days_widget, 0, 1, 1, 1) + self.today_widget = QtWidgets.QRadioButton(SearchInputWidget) + self.today_widget.setObjectName("today_widget") + self.default_period_layout.addWidget(self.today_widget, 1, 0, 1, 1) + self.hour_widget = QtWidgets.QRadioButton(SearchInputWidget) + self.hour_widget.setObjectName("hour_widget") + self.default_period_layout.addWidget(self.hour_widget, 1, 1, 1, 1) + self.search_input_layout.addLayout(self.default_period_layout) + self.since_until_layout = QtWidgets.QGridLayout() + self.since_until_layout.setObjectName("since_until_layout") + self.since_label = QtWidgets.QLabel(SearchInputWidget) + self.since_label.setObjectName("since_label") + self.since_until_layout.addWidget(self.since_label, 0, 0, 1, 1) + self.since_widget = QtWidgets.QDateTimeEdit(SearchInputWidget) + self.since_widget.setMinimumDateTime(QtCore.QDateTime(QtCore.QDate(1752, 9, 14), QtCore.QTime(0, 0, 0))) + self.since_widget.setCalendarPopup(True) + self.since_widget.setObjectName("since_widget") + self.since_until_layout.addWidget(self.since_widget, 0, 1, 1, 1) + self.until_label = QtWidgets.QLabel(SearchInputWidget) + self.until_label.setObjectName("until_label") + self.since_until_layout.addWidget(self.until_label, 1, 0, 1, 1) + self.until_widget = QtWidgets.QDateTimeEdit(SearchInputWidget) + self.until_widget.setCalendarPopup(True) + self.until_widget.setObjectName("until_widget") + self.since_until_layout.addWidget(self.until_widget, 1, 1, 1, 1) + self.search_input_layout.addLayout(self.since_until_layout) + self.search_bar_layout = QtWidgets.QHBoxLayout() + self.search_bar_layout.setObjectName("search_bar_layout") + self.custom_query_label = QtWidgets.QLabel(SearchInputWidget) + self.custom_query_label.setObjectName("custom_query_label") + self.search_bar_layout.addWidget(self.custom_query_label) + self.search_bar = QtWidgets.QLineEdit(SearchInputWidget) + self.search_bar.setObjectName("search_bar") + self.search_bar_layout.addWidget(self.search_bar) + self.mongo_query_help_button = QtWidgets.QPushButton(SearchInputWidget) + self.mongo_query_help_button.setObjectName("mongo_query_help_button") + self.search_bar_layout.addWidget(self.mongo_query_help_button) + self.search_input_layout.addLayout(self.search_bar_layout) + self.gridLayout_4.addLayout(self.search_input_layout, 0, 0, 1, 1) + + self.retranslateUi(SearchInputWidget) + QtCore.QMetaObject.connectSlotsByName(SearchInputWidget) + + def retranslateUi(self, SearchInputWidget): + _translate = QtCore.QCoreApplication.translate + SearchInputWidget.setWindowTitle(_translate("SearchInputWidget", "Form")) + self.all_widget.setText(_translate("SearchInputWidget", "All")) + self.days_widget.setText(_translate("SearchInputWidget", "30 Days")) + self.today_widget.setText(_translate("SearchInputWidget", "Today")) + self.hour_widget.setText(_translate("SearchInputWidget", "Last Hour")) + self.since_label.setText(_translate("SearchInputWidget", "Since:")) + self.until_label.setText(_translate("SearchInputWidget", "Until:")) + self.custom_query_label.setText(_translate("SearchInputWidget", "Custom Query:")) + self.mongo_query_help_button.setText(_translate("SearchInputWidget", "?")) + + +if __name__ == "__main__": + import sys + app = QtWidgets.QApplication(sys.argv) + SearchInputWidget = QtWidgets.QWidget() + ui = Ui_SearchInputWidget() + ui.setupUi(SearchInputWidget) + SearchInputWidget.show() + sys.exit(app.exec_()) + From 5b83189bdad89ef574993c0c483dedcaec5723b5 Mon Sep 17 00:00:00 2001 From: Juliane Reinhardt Date: Thu, 19 Mar 2020 23:39:28 -0700 Subject: [PATCH 04/14] add ui file from QtDesigner and use converted .py for SearchInputWidget --- ui/ui_search_input.ui | 12 +++++++++--- xicam/gui/bluesky/ui_search_input.py | 4 +++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/ui/ui_search_input.ui b/ui/ui_search_input.ui index 0e997f6..6b51650 100644 --- a/ui/ui_search_input.ui +++ b/ui/ui_search_input.ui @@ -64,11 +64,14 @@ 0 0 0 - 1752 - 9 - 14 + 2000 + 1 + 1 + + yyyy-MM-dd HH:mm + true @@ -83,6 +86,9 @@ + + yyyy-MM-dd HH:mm + true diff --git a/xicam/gui/bluesky/ui_search_input.py b/xicam/gui/bluesky/ui_search_input.py index b9fa114..7ede562 100644 --- a/xicam/gui/bluesky/ui_search_input.py +++ b/xicam/gui/bluesky/ui_search_input.py @@ -37,7 +37,7 @@ def setupUi(self, SearchInputWidget): self.since_label.setObjectName("since_label") self.since_until_layout.addWidget(self.since_label, 0, 0, 1, 1) self.since_widget = QtWidgets.QDateTimeEdit(SearchInputWidget) - self.since_widget.setMinimumDateTime(QtCore.QDateTime(QtCore.QDate(1752, 9, 14), QtCore.QTime(0, 0, 0))) + self.since_widget.setMinimumDateTime(QtCore.QDateTime(QtCore.QDate(2000, 1, 1), QtCore.QTime(0, 0, 0))) self.since_widget.setCalendarPopup(True) self.since_widget.setObjectName("since_widget") self.since_until_layout.addWidget(self.since_widget, 0, 1, 1, 1) @@ -74,7 +74,9 @@ def retranslateUi(self, SearchInputWidget): self.today_widget.setText(_translate("SearchInputWidget", "Today")) self.hour_widget.setText(_translate("SearchInputWidget", "Last Hour")) self.since_label.setText(_translate("SearchInputWidget", "Since:")) + self.since_widget.setDisplayFormat(_translate("SearchInputWidget", "yyyy-MM-dd HH:mm")) self.until_label.setText(_translate("SearchInputWidget", "Until:")) + self.until_widget.setDisplayFormat(_translate("SearchInputWidget", "yyyy-MM-dd HH:mm")) self.custom_query_label.setText(_translate("SearchInputWidget", "Custom Query:")) self.mongo_query_help_button.setText(_translate("SearchInputWidget", "?")) From 4130bdec04c2ce210f640550216e3c94e8c904a2 Mon Sep 17 00:00:00 2001 From: Juliane Reinhardt Date: Fri, 20 Mar 2020 00:43:49 -0700 Subject: [PATCH 05/14] further changes to use QtDesigner for BS DataBroker --- ui/catalog_selection.ui | 35 ++++++++++++++++++ xicam/gui/bluesky/search.py | 39 +++++++++++--------- xicam/gui/bluesky/summary.py | 2 +- xicam/gui/bluesky/ui_catalog_selection.py | 44 +++++++++++++++++++++++ 4 files changed, 102 insertions(+), 18 deletions(-) create mode 100644 ui/catalog_selection.ui create mode 100644 xicam/gui/bluesky/ui_catalog_selection.py diff --git a/ui/catalog_selection.ui b/ui/catalog_selection.ui new file mode 100644 index 0000000..fb7e87a --- /dev/null +++ b/ui/catalog_selection.ui @@ -0,0 +1,35 @@ + + + CatalogSelectionWidget + + + + 0 + 0 + 225 + 50 + + + + Form + + + + + + + + Select Calalog: + + + + + + + + + + + + + diff --git a/xicam/gui/bluesky/search.py b/xicam/gui/bluesky/search.py index 9c203c1..60f9e60 100644 --- a/xicam/gui/bluesky/search.py +++ b/xicam/gui/bluesky/search.py @@ -12,7 +12,12 @@ import threading import time + from qtpy import QtCore, QtGui, QtWidgets +# import everything produced with QtDesigner +from .ui_search_input import Ui_SearchInputWidget +from .ui_catalog_selection import Ui_CatalogSelectionWidget + from qtpy.QtCore import Qt, Signal, QThread, QSettings from qtpy.QtGui import QStandardItemModel, QStandardItem @@ -421,7 +426,6 @@ def on_until_time_changed(self, datetime): self.until = datetime.toSecsSinceEpoch() self.search_state.search() -from .ui_search_input import Ui_SearchInputWidget class SearchInputWidget(QWidget, Ui_SearchInputWidget): """ @@ -439,7 +443,7 @@ def __init__(self, *args, **kwargs): # mongo_query_help_button = QPushButton() # mongo_query_help_button.setText('?') # search_bar_layout.addWidget(mongo_query_help_button) - # mongo_query_help_button.clicked.connect(self.show_mongo_query_help) + self.mongo_query_help_button.clicked.connect(self.show_mongo_query_help) # self.since_widget = QDateTimeEdit() # self.since_widget.setCalendarPopup(True) @@ -456,10 +460,6 @@ def __init__(self, *args, **kwargs): # until_layout.addWidget(self.until_widget) # layout = QVBoxLayout() - # layout.addLayout(select_all_layout) - # layout.addLayout(select_d30_layout) - # layout.addLayout(select_today_layout) - # layout.addLayout(select_hour_layout) # layout.addLayout(since_layout) # layout.addLayout(until_layout) # layout.addLayout(search_bar_layout) @@ -490,24 +490,29 @@ def show_mongo_query_help(self): msg.exec_() -class CatalogList(QComboBox): - """ - List of subcatalogs - """ - ... +# class CatalogList(QComboBox): +# """ +# List of subcatalogs +# """ +# ... -class CatalogSelectionWidget(QWidget): +class CatalogSelectionWidget(QWidget, Ui_CatalogSelectionWidget): """ Input widget for selecting a subcatalog """ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.catalog_list = CatalogList() - layout = QHBoxLayout() - layout.addWidget(QLabel("Catalog:")) - layout.addWidget(self.catalog_list) - self.setLayout(layout) + # optional + #self._ui = ui + self.setupUi(self) + # def __init__(self, *args, **kwargs): + # super().__init__(*args, **kwargs) + # self.catalog_list = CatalogList() + # layout = QHBoxLayout() + # layout.addWidget(QLabel("Catalog:")) + # layout.addWidget(self.catalog_list) + # self.setLayout(layout) class SearchResultsWidget(QTableView): diff --git a/xicam/gui/bluesky/summary.py b/xicam/gui/bluesky/summary.py index 53d8300..6a9351c 100644 --- a/xicam/gui/bluesky/summary.py +++ b/xicam/gui/bluesky/summary.py @@ -17,7 +17,7 @@ class SummaryWidget(QWidget): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.uid_label = QLabel() - self.open_individually_button = QPushButton('Open') + self.open_individually_button = QPushButton('Open Catalog') self.open_individually_button.setEnabled(False) self.open_individually_button.clicked.connect(self._open_individually) self.copy_uid_button = QPushButton('Copy UID to Clipboard') diff --git a/xicam/gui/bluesky/ui_catalog_selection.py b/xicam/gui/bluesky/ui_catalog_selection.py new file mode 100644 index 0000000..e91ca9a --- /dev/null +++ b/xicam/gui/bluesky/ui_catalog_selection.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'ui/catalog_selection.ui' +# +# Created by: PyQt5 UI code generator 5.9.2 +# +# WARNING! All changes made in this file will be lost! + +from PyQt5 import QtCore, QtGui, QtWidgets + +class Ui_CatalogSelectionWidget(object): + def setupUi(self, CatalogSelectionWidget): + CatalogSelectionWidget.setObjectName("CatalogSelectionWidget") + CatalogSelectionWidget.resize(225, 50) + self.horizontalLayout_2 = QtWidgets.QHBoxLayout(CatalogSelectionWidget) + self.horizontalLayout_2.setObjectName("horizontalLayout_2") + self.horizontalLayout = QtWidgets.QHBoxLayout() + self.horizontalLayout.setObjectName("horizontalLayout") + self.Catalog = QtWidgets.QLabel(CatalogSelectionWidget) + self.Catalog.setObjectName("Catalog") + self.horizontalLayout.addWidget(self.Catalog) + self.catalog_list = QtWidgets.QComboBox(CatalogSelectionWidget) + self.catalog_list.setObjectName("catalog_list") + self.horizontalLayout.addWidget(self.catalog_list) + self.horizontalLayout_2.addLayout(self.horizontalLayout) + + self.retranslateUi(CatalogSelectionWidget) + QtCore.QMetaObject.connectSlotsByName(CatalogSelectionWidget) + + def retranslateUi(self, CatalogSelectionWidget): + _translate = QtCore.QCoreApplication.translate + CatalogSelectionWidget.setWindowTitle(_translate("CatalogSelectionWidget", "Form")) + self.Catalog.setText(_translate("CatalogSelectionWidget", "Select Calalog:")) + + +if __name__ == "__main__": + import sys + app = QtWidgets.QApplication(sys.argv) + CatalogSelectionWidget = QtWidgets.QWidget() + ui = Ui_CatalogSelectionWidget() + ui.setupUi(CatalogSelectionWidget) + CatalogSelectionWidget.show() + sys.exit(app.exec_()) + From 47ea45eca7429f8e967c1a84f66f37184d6522df Mon Sep 17 00:00:00 2001 From: Juliane Reinhardt Date: Sun, 22 Mar 2020 00:34:35 -0700 Subject: [PATCH 06/14] further testing --- ui/treeview_test.ui | 24 ++++++ xicam/gui/bluesky/search.py | 11 ++- xicam/gui/bluesky/treeview_test.py | 103 ++++++++++++++++++++++++++ xicam/gui/bluesky/ui_treeview_test.py | 37 +++++++++ 4 files changed, 173 insertions(+), 2 deletions(-) create mode 100644 ui/treeview_test.ui create mode 100644 xicam/gui/bluesky/treeview_test.py create mode 100644 xicam/gui/bluesky/ui_treeview_test.py diff --git a/ui/treeview_test.ui b/ui/treeview_test.ui new file mode 100644 index 0000000..75561b6 --- /dev/null +++ b/ui/treeview_test.ui @@ -0,0 +1,24 @@ + + + Form + + + + 0 + 0 + 597 + 422 + + + + Form + + + + + + + + + + diff --git a/xicam/gui/bluesky/search.py b/xicam/gui/bluesky/search.py index 60f9e60..547e9f2 100644 --- a/xicam/gui/bluesky/search.py +++ b/xicam/gui/bluesky/search.py @@ -17,7 +17,7 @@ # import everything produced with QtDesigner from .ui_search_input import Ui_SearchInputWidget from .ui_catalog_selection import Ui_CatalogSelectionWidget - +from .ui_treeview_test import Ui_Workspace from qtpy.QtCore import Qt, Signal, QThread, QSettings from qtpy.QtGui import QStandardItemModel, QStandardItem @@ -514,8 +514,13 @@ def __init__(self, *args, **kwargs): # layout.addWidget(self.catalog_list) # self.setLayout(layout) +class WorkspaceWidget(QWidget, Ui_Workspace): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.setupUi(self) + -class SearchResultsWidget(QTableView): +class SearchResultsWidget(QTableView): """ Table of search results """ @@ -548,10 +553,12 @@ def __init__(self, *args, **kwargs): self.catalog_selection_widget = CatalogSelectionWidget() self.search_input_widget = SearchInputWidget() self.search_results_widget = SearchResultsWidget() + self.workspace_widget = WorkspaceWidget() layout = QVBoxLayout() layout.addWidget(self.catalog_selection_widget) layout.addWidget(self.search_input_widget) layout.addWidget(self.search_results_widget) + layout.addWidget(self.workspace_widget) self.setLayout(layout) header = self.search_results_widget.horizontalHeader() diff --git a/xicam/gui/bluesky/treeview_test.py b/xicam/gui/bluesky/treeview_test.py new file mode 100644 index 0000000..a56687a --- /dev/null +++ b/xicam/gui/bluesky/treeview_test.py @@ -0,0 +1,103 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'ui/treeview_test.ui' +# +# Created by: PyQt5 UI code generator 5.9.2 +# +# WARNING! All changes made in this file will be lost! + +from PyQt5 import QtCore, QtGui, QtWidgets +from qtpy.QtGui import QStandardItemModel, QStandardItem + +data = [ + ("Alice", [ + ("Keys", []), + ("Purse", [ + ("Cellphone", []) + ]) + ]), + ("Bob", [ + ("Wallet", [ + ("Credit card", []), + ("Money", []) + ]) + ]) + ] + + +class Ui_Form(object): + def setupUi(self, Form): + Form.setObjectName("Form") + Form.resize(600, 371) + self.horizontalLayout = QtWidgets.QHBoxLayout(Form) + self.horizontalLayout.setObjectName("horizontalLayout") + # self.treeWidget = QtWidgets.QTreeWidget(Form) + # self.treeWidget.setObjectName("treeWidget") + # item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget) + # item_1 = QtWidgets.QTreeWidgetItem(item_0) + # item_2 = QtWidgets.QTreeWidgetItem(item_1) + # item_2 = QtWidgets.QTreeWidgetItem(item_1) + # item_1 = QtWidgets.QTreeWidgetItem(item_0) + # item_2 = QtWidgets.QTreeWidgetItem(item_1) + # item_2 = QtWidgets.QTreeWidgetItem(item_1) + # item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget) + # item_1 = QtWidgets.QTreeWidgetItem(item_0) + # item_1 = QtWidgets.QTreeWidgetItem(item_0) + # item_2 = QtWidgets.QTreeWidgetItem(item_1) + # item_2 = QtWidgets.QTreeWidgetItem(item_1) + # item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget) + # self.horizontalLayout.addWidget(self.treeWidget) + + self.treeView = QtWidgets.QTreeView(Form) + self.treeView.setObjectName("treeView") + self.horizontalLayout.addWidget(self.treeView) + + self.model = QStandardItemModel() + self.treeView.addItems(self.model, data) + self.treeView.setModel(self.model) + + self.retranslateUi(Form) + QtCore.QMetaObject.connectSlotsByName(Form) + + def retranslateUi(self, Form): + _translate = QtCore.QCoreApplication.translate + Form.setWindowTitle(_translate("Form", "Form")) + # self.treeWidget.headerItem().setText(0, _translate("Form", "Scan ID")) + # self.treeWidget.headerItem().setText(1, _translate("Form", "Energy")) + # self.treeWidget.headerItem().setText(2, _translate("Form", "Temp")) + # self.treeWidget.headerItem().setText(3, _translate("Form", "Pressure")) + # __sortingEnabled = self.treeWidget.isSortingEnabled() + # self.treeWidget.setSortingEnabled(False) + # self.treeWidget.topLevelItem(0).setText(0, _translate("Form", "Scan 1")) + # self.treeWidget.topLevelItem(0).setText(1, _translate("Form", "12 keV")) + # self.treeWidget.topLevelItem(0).setText(2, _translate("Form", "0K")) + # self.treeWidget.topLevelItem(0).setText(3, _translate("Form", "1000bar")) + # self.treeWidget.topLevelItem(0).child(0).setText(0, _translate("Form", "Analysis Settings")) + # self.treeWidget.topLevelItem(0).child(0).setText(1, _translate("Form", "Calibrant")) + # self.treeWidget.topLevelItem(0).child(0).setText(2, _translate("Form", "FIt Model")) + # self.treeWidget.topLevelItem(0).child(0).child(0).setText(0, _translate("Form", "Setting 1.A")) + # self.treeWidget.topLevelItem(0).child(0).child(1).setText(0, _translate("Form", "Setting 1.B")) + # self.treeWidget.topLevelItem(0).child(1).setText(0, _translate("Form", "ROIs")) + # self.treeWidget.topLevelItem(0).child(1).child(0).setText(0, _translate("Form", "ROI 1.1")) + # self.treeWidget.topLevelItem(0).child(1).child(1).setText(0, _translate("Form", "ROI")) + # self.treeWidget.topLevelItem(1).setText(0, _translate("Form", "Scan 2")) + # self.treeWidget.topLevelItem(1).setText(1, _translate("Form", "11.9 keV")) + # self.treeWidget.topLevelItem(1).setText(2, _translate("Form", "0K")) + # self.treeWidget.topLevelItem(1).setText(3, _translate("Form", "1000bar")) + # self.treeWidget.topLevelItem(1).child(0).setText(0, _translate("Form", "Analysis Settings")) + # self.treeWidget.topLevelItem(1).child(1).setText(0, _translate("Form", "ROIs")) + # self.treeWidget.topLevelItem(1).child(1).child(0).setText(0, _translate("Form", "ROI 2.1")) + # self.treeWidget.topLevelItem(1).child(1).child(1).setText(0, _translate("Form", "ROI 2.2")) + # self.treeWidget.topLevelItem(2).setText(0, _translate("Form", "Scan 3")) + # self.treeWidget.setSortingEnabled(__sortingEnabled) + + +if __name__ == "__main__": + import sys + app = QtWidgets.QApplication(sys.argv) + Form = QtWidgets.QWidget() + ui = Ui_Form() + ui.setupUi(Form) + Form.show() + sys.exit(app.exec_()) + diff --git a/xicam/gui/bluesky/ui_treeview_test.py b/xicam/gui/bluesky/ui_treeview_test.py new file mode 100644 index 0000000..e95f490 --- /dev/null +++ b/xicam/gui/bluesky/ui_treeview_test.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'ui/treeview_test.ui' +# +# Created by: PyQt5 UI code generator 5.9.2 +# +# WARNING! All changes made in this file will be lost! + +from PyQt5 import QtCore, QtGui, QtWidgets + +class Ui_Workspace(object): + def setupUi(self, Form): + Form.setObjectName("Form") + Form.resize(597, 422) + self.gridLayout = QtWidgets.QGridLayout(Form) + self.gridLayout.setObjectName("gridLayout") + self.treeView = QtWidgets.QTreeView(Form) + self.treeView.setObjectName("treeView") + self.gridLayout.addWidget(self.treeView, 0, 0, 1, 1) + + self.retranslateUi(Form) + QtCore.QMetaObject.connectSlotsByName(Form) + + def retranslateUi(self, Form): + _translate = QtCore.QCoreApplication.translate + Form.setWindowTitle(_translate("Form", "Form")) + + +if __name__ == "__main__": + import sys + app = QtWidgets.QApplication(sys.argv) + Form = QtWidgets.QWidget() + ui = Ui_Workspace() + ui.setupUi(Form) + Form.show() + sys.exit(app.exec_()) + From affcb8c5fac2c253ea2bf815edcc58affd41f411 Mon Sep 17 00:00:00 2001 From: Juliane Reinhardt Date: Tue, 24 Mar 2020 00:01:50 -0700 Subject: [PATCH 07/14] remove workspace widget for now --- xicam/gui/bluesky/search.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/xicam/gui/bluesky/search.py b/xicam/gui/bluesky/search.py index 547e9f2..4c0b2ee 100644 --- a/xicam/gui/bluesky/search.py +++ b/xicam/gui/bluesky/search.py @@ -514,10 +514,6 @@ def __init__(self, *args, **kwargs): # layout.addWidget(self.catalog_list) # self.setLayout(layout) -class WorkspaceWidget(QWidget, Ui_Workspace): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.setupUi(self) class SearchResultsWidget(QTableView): From b24bda5485f71ee96d18eba5101303b9f97d30ff Mon Sep 17 00:00:00 2001 From: Juliane Reinhardt Date: Tue, 24 Mar 2020 15:31:33 -0700 Subject: [PATCH 08/14] clean_up and methods to connect radiobuttons with functionality --- xicam/gui/bluesky/central.py | 56 ++++++++++++++++++++++++---- xicam/gui/bluesky/search.py | 71 +++++++++--------------------------- 2 files changed, 66 insertions(+), 61 deletions(-) diff --git a/xicam/gui/bluesky/central.py b/xicam/gui/bluesky/central.py index 4b8f0a2..076b496 100644 --- a/xicam/gui/bluesky/central.py +++ b/xicam/gui/bluesky/central.py @@ -49,23 +49,63 @@ def show_double_clicked_entry(index): # Set models, connect signals, and set initial values. now = time.time() - ONE_WEEK = 60 * 60 * 24 * 7 - self.search_widget.search_results_widget.setModel( - search_state.search_results_model) - self.search_widget.search_input_widget.search_bar.textChanged.connect( - search_state.search_results_model.on_search_text_changed) - self.search_widget.catalog_selection_widget.catalog_list.setModel( - search_state.catalog_selection_model) + ONE_HOUR = 60 * 60 + TODAY = ONE_HOUR * 24 + ONE_WEEK = TODAY * 7 + ONE_MONTH = TODAY * 30 #used for 30 days QRadioButton + + def set_timerange(timerange): + search_state.search_results_model.on_select_range(timerange) + self.search_widget.search_input_widget.since_widget.setDateTime( + QDateTime.fromSecsSinceEpoch(now - timerange)) + self.search_widget.search_input_widget.until_widget.setDateTime( + QDateTime.fromSecsSinceEpoch(now)) + + def on_select_today(): + set_timerange(TODAY) + + def on_select_lasthour(): + set_timerange(ONE_HOUR) + + def on_select_30days(): + set_timerange(ONE_MONTH) + + def on_select_all(): + search_state.search_results_model.on_select_all() + self.search_widget.search_input_widget.since_widget.setDateTime( + QDateTime.fromSecsSinceEpoch(0)) + self.search_widget.search_input_widget.until_widget.setDateTime( + QDateTime.fromSecsSinceEpoch(now)) + + # connect QRadioButtons and change date dropdowns (since/until widgets) accordingly + self.search_widget.search_input_widget.today_widget.clicked.connect( + on_select_today) + self.search_widget.search_input_widget.hour_widget.clicked.connect( + on_select_lasthour) + self.search_widget.search_input_widget.days_widget.clicked.connect( + on_select_30days) + self.search_widget.search_input_widget.all_widget.clicked.connect( + on_select_all) + # connect input since/until widgets self.search_widget.search_input_widget.until_widget.dateTimeChanged.connect( search_state.search_results_model.on_until_time_changed) self.search_widget.search_input_widget.until_widget.setDateTime( - QDateTime.fromSecsSinceEpoch(now + ONE_WEEK)) + QDateTime.fromSecsSinceEpoch(now)) self.search_widget.search_input_widget.since_widget.dateTimeChanged.connect( search_state.search_results_model.on_since_time_changed) self.search_widget.search_input_widget.since_widget.setDateTime( QDateTime.fromSecsSinceEpoch(now - ONE_WEEK)) + # connect catalog_list dropdown + self.search_widget.catalog_selection_widget.catalog_list.setModel( + search_state.catalog_selection_model) self.search_widget.catalog_selection_widget.catalog_list.currentIndexChanged.connect( search_state.set_selected_catalog) + + self.search_widget.search_input_widget.search_bar.textChanged.connect( + search_state.search_results_model.on_search_text_changed) + + self.search_widget.search_results_widget.setModel( + search_state.search_results_model) self.search_widget.search_results_widget.selectionModel().selectionChanged.connect( search_state.search_results_model.emit_selected_result) self.search_widget.search_results_widget.doubleClicked.connect( diff --git a/xicam/gui/bluesky/search.py b/xicam/gui/bluesky/search.py index 4c0b2ee..988561b 100644 --- a/xicam/gui/bluesky/search.py +++ b/xicam/gui/bluesky/search.py @@ -2,7 +2,7 @@ Experimental Qt-based data browser for bluesky """ import ast -from datetime import datetime +from datetime import datetime, date import event_model import functools import itertools @@ -17,7 +17,6 @@ # import everything produced with QtDesigner from .ui_search_input import Ui_SearchInputWidget from .ui_catalog_selection import Ui_CatalogSelectionWidget -from .ui_treeview_test import Ui_Workspace from qtpy.QtCore import Qt, Signal, QThread, QSettings from qtpy.QtGui import QStandardItemModel, QStandardItem @@ -418,53 +417,36 @@ def on_search_text_changed(self, text): self.valid_custom_query.emit(True) self.search_state.search() - def on_since_time_changed(self, datetime): - self.since = datetime.toSecsSinceEpoch() + def on_since_time_changed(self, qdatetime): + self.since = qdatetime.toSecsSinceEpoch() self.search_state.search() - def on_until_time_changed(self, datetime): - self.until = datetime.toSecsSinceEpoch() + def on_until_time_changed(self, qdatetime): + self.until = qdatetime.toSecsSinceEpoch() + self.search_state.search() + + def on_select_range(self, set_range): + self.until = time.time() + self.since = self.until-set_range + self.search_state.search() + + def on_select_all(self): + self.until = None + self.since = None self.search_state.search() + + class SearchInputWidget(QWidget, Ui_SearchInputWidget): """ Input fields for specifying searches on SearchResultsModel """ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - # optional - #self._ui = ui self.setupUi(self) - # self.search_bar = QLineEdit() #QLineEdit is a widget? - # search_bar_layout = QHBoxLayout() - # search_bar_layout.addWidget(QLabel('Custom Query:')) - # search_bar_layout.addWidget(self.search_bar) - # mongo_query_help_button = QPushButton() - # mongo_query_help_button.setText('?') - # search_bar_layout.addWidget(mongo_query_help_button) self.mongo_query_help_button.clicked.connect(self.show_mongo_query_help) - # self.since_widget = QDateTimeEdit() - # self.since_widget.setCalendarPopup(True) - # self.since_widget.setDisplayFormat('yyyy-MM-dd HH:mm') - # since_layout = QHBoxLayout() - # since_layout.addWidget(QLabel('Since:')) - # since_layout.addWidget(self.since_widget) - - # self.until_widget = QDateTimeEdit() - # self.until_widget.setCalendarPopup(True) - # self.until_widget.setDisplayFormat('yyyy-MM-dd HH:mm') - # until_layout = QHBoxLayout() - # until_layout.addWidget(QLabel('Until:')) - # until_layout.addWidget(self.until_widget) - - # layout = QVBoxLayout() - # layout.addLayout(since_layout) - # layout.addLayout(until_layout) - # layout.addLayout(search_bar_layout) - # self.setLayout(layout) - def mark_custom_query(self, valid): "Indicate whether the current text is a parsable query." if valid: @@ -490,29 +472,14 @@ def show_mongo_query_help(self): msg.exec_() -# class CatalogList(QComboBox): -# """ -# List of subcatalogs -# """ -# ... - - class CatalogSelectionWidget(QWidget, Ui_CatalogSelectionWidget): """ Input widget for selecting a subcatalog """ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - # optional - #self._ui = ui self.setupUi(self) - # def __init__(self, *args, **kwargs): - # super().__init__(*args, **kwargs) - # self.catalog_list = CatalogList() - # layout = QHBoxLayout() - # layout.addWidget(QLabel("Catalog:")) - # layout.addWidget(self.catalog_list) - # self.setLayout(layout) + @@ -549,12 +516,10 @@ def __init__(self, *args, **kwargs): self.catalog_selection_widget = CatalogSelectionWidget() self.search_input_widget = SearchInputWidget() self.search_results_widget = SearchResultsWidget() - self.workspace_widget = WorkspaceWidget() layout = QVBoxLayout() layout.addWidget(self.catalog_selection_widget) layout.addWidget(self.search_input_widget) layout.addWidget(self.search_results_widget) - layout.addWidget(self.workspace_widget) self.setLayout(layout) header = self.search_results_widget.horizontalHeader() From 9ae29007815776459a9d3bb1b21b8341e1c8d43b Mon Sep 17 00:00:00 2001 From: Juliane Reinhardt Date: Thu, 2 Apr 2020 22:04:52 -0700 Subject: [PATCH 09/14] clean-up ui/ui_**.py files delete treeview test files, that were accidentally commited --- ui/{ui_search_input.ui => search_input.ui} | 11 ++- ui/treeview_test.ui | 24 ----- xicam/gui/bluesky/central.py | 4 +- xicam/gui/bluesky/treeview_test.py | 103 --------------------- xicam/gui/bluesky/ui_treeview_test.py | 37 -------- 5 files changed, 12 insertions(+), 167 deletions(-) rename ui/{ui_search_input.ui => search_input.ui} (93%) delete mode 100644 ui/treeview_test.ui delete mode 100644 xicam/gui/bluesky/treeview_test.py delete mode 100644 xicam/gui/bluesky/ui_treeview_test.py diff --git a/ui/ui_search_input.ui b/ui/search_input.ui similarity index 93% rename from ui/ui_search_input.ui rename to ui/search_input.ui index 6b51650..1bb5bc3 100644 --- a/ui/ui_search_input.ui +++ b/ui/search_input.ui @@ -7,15 +7,24 @@ 0 0 389 - 368 + 351 + + + 0 + 200 + + Form + + QLayout::SetMinimumSize + diff --git a/ui/treeview_test.ui b/ui/treeview_test.ui deleted file mode 100644 index 75561b6..0000000 --- a/ui/treeview_test.ui +++ /dev/null @@ -1,24 +0,0 @@ - - - Form - - - - 0 - 0 - 597 - 422 - - - - Form - - - - - - - - - - diff --git a/xicam/gui/bluesky/central.py b/xicam/gui/bluesky/central.py index 076b496..82e7409 100644 --- a/xicam/gui/bluesky/central.py +++ b/xicam/gui/bluesky/central.py @@ -9,6 +9,7 @@ from .search import SearchWidget, SearchState from xicam.gui.bluesky.summary import SummaryWidget + from qtpy.QtCore import QDateTime, Qt from qtpy.QtWidgets import ( QWidget, @@ -24,7 +25,6 @@ def __init__(self, *args, catalog, menuBar, zmq_address=None, **kwargs): super().__init__(*args, **kwargs) - # Define models. search_state = SearchState( catalog=catalog) @@ -103,7 +103,7 @@ def on_select_all(): self.search_widget.search_input_widget.search_bar.textChanged.connect( search_state.search_results_model.on_search_text_changed) - + self.search_widget.search_results_widget.setModel( search_state.search_results_model) self.search_widget.search_results_widget.selectionModel().selectionChanged.connect( diff --git a/xicam/gui/bluesky/treeview_test.py b/xicam/gui/bluesky/treeview_test.py deleted file mode 100644 index a56687a..0000000 --- a/xicam/gui/bluesky/treeview_test.py +++ /dev/null @@ -1,103 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file 'ui/treeview_test.ui' -# -# Created by: PyQt5 UI code generator 5.9.2 -# -# WARNING! All changes made in this file will be lost! - -from PyQt5 import QtCore, QtGui, QtWidgets -from qtpy.QtGui import QStandardItemModel, QStandardItem - -data = [ - ("Alice", [ - ("Keys", []), - ("Purse", [ - ("Cellphone", []) - ]) - ]), - ("Bob", [ - ("Wallet", [ - ("Credit card", []), - ("Money", []) - ]) - ]) - ] - - -class Ui_Form(object): - def setupUi(self, Form): - Form.setObjectName("Form") - Form.resize(600, 371) - self.horizontalLayout = QtWidgets.QHBoxLayout(Form) - self.horizontalLayout.setObjectName("horizontalLayout") - # self.treeWidget = QtWidgets.QTreeWidget(Form) - # self.treeWidget.setObjectName("treeWidget") - # item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget) - # item_1 = QtWidgets.QTreeWidgetItem(item_0) - # item_2 = QtWidgets.QTreeWidgetItem(item_1) - # item_2 = QtWidgets.QTreeWidgetItem(item_1) - # item_1 = QtWidgets.QTreeWidgetItem(item_0) - # item_2 = QtWidgets.QTreeWidgetItem(item_1) - # item_2 = QtWidgets.QTreeWidgetItem(item_1) - # item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget) - # item_1 = QtWidgets.QTreeWidgetItem(item_0) - # item_1 = QtWidgets.QTreeWidgetItem(item_0) - # item_2 = QtWidgets.QTreeWidgetItem(item_1) - # item_2 = QtWidgets.QTreeWidgetItem(item_1) - # item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget) - # self.horizontalLayout.addWidget(self.treeWidget) - - self.treeView = QtWidgets.QTreeView(Form) - self.treeView.setObjectName("treeView") - self.horizontalLayout.addWidget(self.treeView) - - self.model = QStandardItemModel() - self.treeView.addItems(self.model, data) - self.treeView.setModel(self.model) - - self.retranslateUi(Form) - QtCore.QMetaObject.connectSlotsByName(Form) - - def retranslateUi(self, Form): - _translate = QtCore.QCoreApplication.translate - Form.setWindowTitle(_translate("Form", "Form")) - # self.treeWidget.headerItem().setText(0, _translate("Form", "Scan ID")) - # self.treeWidget.headerItem().setText(1, _translate("Form", "Energy")) - # self.treeWidget.headerItem().setText(2, _translate("Form", "Temp")) - # self.treeWidget.headerItem().setText(3, _translate("Form", "Pressure")) - # __sortingEnabled = self.treeWidget.isSortingEnabled() - # self.treeWidget.setSortingEnabled(False) - # self.treeWidget.topLevelItem(0).setText(0, _translate("Form", "Scan 1")) - # self.treeWidget.topLevelItem(0).setText(1, _translate("Form", "12 keV")) - # self.treeWidget.topLevelItem(0).setText(2, _translate("Form", "0K")) - # self.treeWidget.topLevelItem(0).setText(3, _translate("Form", "1000bar")) - # self.treeWidget.topLevelItem(0).child(0).setText(0, _translate("Form", "Analysis Settings")) - # self.treeWidget.topLevelItem(0).child(0).setText(1, _translate("Form", "Calibrant")) - # self.treeWidget.topLevelItem(0).child(0).setText(2, _translate("Form", "FIt Model")) - # self.treeWidget.topLevelItem(0).child(0).child(0).setText(0, _translate("Form", "Setting 1.A")) - # self.treeWidget.topLevelItem(0).child(0).child(1).setText(0, _translate("Form", "Setting 1.B")) - # self.treeWidget.topLevelItem(0).child(1).setText(0, _translate("Form", "ROIs")) - # self.treeWidget.topLevelItem(0).child(1).child(0).setText(0, _translate("Form", "ROI 1.1")) - # self.treeWidget.topLevelItem(0).child(1).child(1).setText(0, _translate("Form", "ROI")) - # self.treeWidget.topLevelItem(1).setText(0, _translate("Form", "Scan 2")) - # self.treeWidget.topLevelItem(1).setText(1, _translate("Form", "11.9 keV")) - # self.treeWidget.topLevelItem(1).setText(2, _translate("Form", "0K")) - # self.treeWidget.topLevelItem(1).setText(3, _translate("Form", "1000bar")) - # self.treeWidget.topLevelItem(1).child(0).setText(0, _translate("Form", "Analysis Settings")) - # self.treeWidget.topLevelItem(1).child(1).setText(0, _translate("Form", "ROIs")) - # self.treeWidget.topLevelItem(1).child(1).child(0).setText(0, _translate("Form", "ROI 2.1")) - # self.treeWidget.topLevelItem(1).child(1).child(1).setText(0, _translate("Form", "ROI 2.2")) - # self.treeWidget.topLevelItem(2).setText(0, _translate("Form", "Scan 3")) - # self.treeWidget.setSortingEnabled(__sortingEnabled) - - -if __name__ == "__main__": - import sys - app = QtWidgets.QApplication(sys.argv) - Form = QtWidgets.QWidget() - ui = Ui_Form() - ui.setupUi(Form) - Form.show() - sys.exit(app.exec_()) - diff --git a/xicam/gui/bluesky/ui_treeview_test.py b/xicam/gui/bluesky/ui_treeview_test.py deleted file mode 100644 index e95f490..0000000 --- a/xicam/gui/bluesky/ui_treeview_test.py +++ /dev/null @@ -1,37 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file 'ui/treeview_test.ui' -# -# Created by: PyQt5 UI code generator 5.9.2 -# -# WARNING! All changes made in this file will be lost! - -from PyQt5 import QtCore, QtGui, QtWidgets - -class Ui_Workspace(object): - def setupUi(self, Form): - Form.setObjectName("Form") - Form.resize(597, 422) - self.gridLayout = QtWidgets.QGridLayout(Form) - self.gridLayout.setObjectName("gridLayout") - self.treeView = QtWidgets.QTreeView(Form) - self.treeView.setObjectName("treeView") - self.gridLayout.addWidget(self.treeView, 0, 0, 1, 1) - - self.retranslateUi(Form) - QtCore.QMetaObject.connectSlotsByName(Form) - - def retranslateUi(self, Form): - _translate = QtCore.QCoreApplication.translate - Form.setWindowTitle(_translate("Form", "Form")) - - -if __name__ == "__main__": - import sys - app = QtWidgets.QApplication(sys.argv) - Form = QtWidgets.QWidget() - ui = Ui_Workspace() - ui.setupUi(Form) - Form.show() - sys.exit(app.exec_()) - From 8f0e288c8fa650c5568f28528ca045ec6d701bc6 Mon Sep 17 00:00:00 2001 From: Juliane Reinhardt Date: Sun, 12 Apr 2020 14:49:24 -0700 Subject: [PATCH 10/14] remove/ignore ui files --- ui/catalog_selection.ui | 35 ----------- ui/search_input.ui | 135 ---------------------------------------- 2 files changed, 170 deletions(-) delete mode 100644 ui/catalog_selection.ui delete mode 100644 ui/search_input.ui diff --git a/ui/catalog_selection.ui b/ui/catalog_selection.ui deleted file mode 100644 index fb7e87a..0000000 --- a/ui/catalog_selection.ui +++ /dev/null @@ -1,35 +0,0 @@ - - - CatalogSelectionWidget - - - - 0 - 0 - 225 - 50 - - - - Form - - - - - - - - Select Calalog: - - - - - - - - - - - - - diff --git a/ui/search_input.ui b/ui/search_input.ui deleted file mode 100644 index 1bb5bc3..0000000 --- a/ui/search_input.ui +++ /dev/null @@ -1,135 +0,0 @@ - - - SearchInputWidget - - - - 0 - 0 - 389 - 351 - - - - - 0 - 200 - - - - Form - - - - - - QLayout::SetMinimumSize - - - - - - - All - - - - - - - 30 Days - - - - - - - Today - - - - - - - Last Hour - - - - - - - - - - - Since: - - - - - - - - 0 - 0 - 0 - 2000 - 1 - 1 - - - - yyyy-MM-dd HH:mm - - - true - - - - - - - Until: - - - - - - - yyyy-MM-dd HH:mm - - - true - - - - - - - - - - - Custom Query: - - - - - - - - - - ? - - - - - - - - - - - - From cee36ea1500da20f4c14f693df8e764ed26dcc02 Mon Sep 17 00:00:00 2001 From: Juliane Reinhardt Date: Sun, 12 Apr 2020 14:53:54 -0700 Subject: [PATCH 11/14] merge Radiobuttons into bluesky databrowser --- xicam/gui/bluesky/search.py | 53 ++++++++++++- xicam/gui/bluesky/ui_catalog_selection.py | 44 ----------- xicam/gui/bluesky/ui_search_input.py | 92 ----------------------- 3 files changed, 49 insertions(+), 140 deletions(-) delete mode 100644 xicam/gui/bluesky/ui_catalog_selection.py delete mode 100644 xicam/gui/bluesky/ui_search_input.py diff --git a/xicam/gui/bluesky/search.py b/xicam/gui/bluesky/search.py index 988561b..7bf293a 100644 --- a/xicam/gui/bluesky/search.py +++ b/xicam/gui/bluesky/search.py @@ -28,6 +28,7 @@ QDateTimeEdit, QHeaderView, QHBoxLayout, + QGridLayout, QMessageBox, QLabel, QLineEdit, @@ -438,14 +439,53 @@ def on_select_all(self): -class SearchInputWidget(QWidget, Ui_SearchInputWidget): +class SearchInputWidget(QWidget): """ Input fields for specifying searches on SearchResultsModel """ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.setupUi(self) + # 4 Radiobuttons to quickly select default time period + self.all_widget = QRadioButton("All") + self.days_widget = QRadioButton("30 Days") + self.today_widget = QRadioButton("Today") + self.hour_widget = QRadioButton("Last Hour") + default_period_layout = QGridLayout() + default_period_layout.addWidget(self.all_widget, 0, 0, 1, 1) + default_period_layout.addWidget(self.days_widget, 0, 1, 1, 1) + default_period_layout.addWidget(self.today_widget, 1, 0, 1, 1) + default_period_layout.addWidget(self.hour_widget, 1, 1, 1, 1) + # Since and Until time selector + self.since_label = QLabel("Since:") + self.since_widget = QDateTimeEdit() + self.since_widget.setCalendarPopup(True) + self.since_widget.setDisplayFormat('yyyy-MM-dd HH:mm') + self.until_label = QLabel("Until:") + self.until_widget = QDateTimeEdit() + self.until_widget.setCalendarPopup(True) + self.until_widget.setDisplayFormat('yyyy-MM-dd HH:mm') + since_until_layout = QGridLayout() + since_until_layout.addWidget(self.since_label, 0, 0, 1, 1) + since_until_layout.addWidget(self.since_widget, 0, 1, 1, 1) + since_until_layout.addWidget(self.until_label, 1, 0, 1, 1) + since_until_layout.addWidget(self.until_widget, 1, 1, 1, 1) + # Custom Query + self.custom_query_label = QLabel("Custom Query:") + self.search_bar = QLineEdit() + self.mongo_query_help_button = QPushButton("?") self.mongo_query_help_button.clicked.connect(self.show_mongo_query_help) + search_bar_layout = QHBoxLayout() + search_bar_layout.addWidget(self.custom_query_label) + search_bar_layout.addWidget(self.search_bar) + search_bar_layout.addWidget(self.mongo_query_help_button) + # add individual layouts to search_input_layout + search_input_layout = QVBoxLayout() + search_input_layout.addLayout(default_period_layout) + search_input_layout.addLayout(since_until_layout) + search_input_layout.addLayout(search_bar_layout) + + self.setLayout(search_input_layout) + def mark_custom_query(self, valid): "Indicate whether the current text is a parsable query." @@ -472,13 +512,18 @@ def show_mongo_query_help(self): msg.exec_() -class CatalogSelectionWidget(QWidget, Ui_CatalogSelectionWidget): +class CatalogSelectionWidget(QWidget): """ Input widget for selecting a subcatalog """ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.setupUi(self) + self.catalog = QLabel("Select Catalog:") + self.catalog_list = QComboBox() + horizontal_layout = QHBoxLayout() + horizontal_layout.addWidget(self.catalog) + horizontal_layout.addWidget(self.catalog_list) + self.setLayout(horizontal_layout) diff --git a/xicam/gui/bluesky/ui_catalog_selection.py b/xicam/gui/bluesky/ui_catalog_selection.py deleted file mode 100644 index e91ca9a..0000000 --- a/xicam/gui/bluesky/ui_catalog_selection.py +++ /dev/null @@ -1,44 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file 'ui/catalog_selection.ui' -# -# Created by: PyQt5 UI code generator 5.9.2 -# -# WARNING! All changes made in this file will be lost! - -from PyQt5 import QtCore, QtGui, QtWidgets - -class Ui_CatalogSelectionWidget(object): - def setupUi(self, CatalogSelectionWidget): - CatalogSelectionWidget.setObjectName("CatalogSelectionWidget") - CatalogSelectionWidget.resize(225, 50) - self.horizontalLayout_2 = QtWidgets.QHBoxLayout(CatalogSelectionWidget) - self.horizontalLayout_2.setObjectName("horizontalLayout_2") - self.horizontalLayout = QtWidgets.QHBoxLayout() - self.horizontalLayout.setObjectName("horizontalLayout") - self.Catalog = QtWidgets.QLabel(CatalogSelectionWidget) - self.Catalog.setObjectName("Catalog") - self.horizontalLayout.addWidget(self.Catalog) - self.catalog_list = QtWidgets.QComboBox(CatalogSelectionWidget) - self.catalog_list.setObjectName("catalog_list") - self.horizontalLayout.addWidget(self.catalog_list) - self.horizontalLayout_2.addLayout(self.horizontalLayout) - - self.retranslateUi(CatalogSelectionWidget) - QtCore.QMetaObject.connectSlotsByName(CatalogSelectionWidget) - - def retranslateUi(self, CatalogSelectionWidget): - _translate = QtCore.QCoreApplication.translate - CatalogSelectionWidget.setWindowTitle(_translate("CatalogSelectionWidget", "Form")) - self.Catalog.setText(_translate("CatalogSelectionWidget", "Select Calalog:")) - - -if __name__ == "__main__": - import sys - app = QtWidgets.QApplication(sys.argv) - CatalogSelectionWidget = QtWidgets.QWidget() - ui = Ui_CatalogSelectionWidget() - ui.setupUi(CatalogSelectionWidget) - CatalogSelectionWidget.show() - sys.exit(app.exec_()) - diff --git a/xicam/gui/bluesky/ui_search_input.py b/xicam/gui/bluesky/ui_search_input.py deleted file mode 100644 index 7ede562..0000000 --- a/xicam/gui/bluesky/ui_search_input.py +++ /dev/null @@ -1,92 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file 'ui_search_input.ui' -# -# Created by: PyQt5 UI code generator 5.9.2 -# -# WARNING! All changes made in this file will be lost! - -from PyQt5 import QtCore, QtGui, QtWidgets - -class Ui_SearchInputWidget(object): - def setupUi(self, SearchInputWidget): - SearchInputWidget.setObjectName("SearchInputWidget") - SearchInputWidget.resize(389, 368) - self.gridLayout_4 = QtWidgets.QGridLayout(SearchInputWidget) - self.gridLayout_4.setObjectName("gridLayout_4") - self.search_input_layout = QtWidgets.QVBoxLayout() - self.search_input_layout.setObjectName("search_input_layout") - self.default_period_layout = QtWidgets.QGridLayout() - self.default_period_layout.setObjectName("default_period_layout") - self.all_widget = QtWidgets.QRadioButton(SearchInputWidget) - self.all_widget.setObjectName("all_widget") - self.default_period_layout.addWidget(self.all_widget, 0, 0, 1, 1) - self.days_widget = QtWidgets.QRadioButton(SearchInputWidget) - self.days_widget.setObjectName("days_widget") - self.default_period_layout.addWidget(self.days_widget, 0, 1, 1, 1) - self.today_widget = QtWidgets.QRadioButton(SearchInputWidget) - self.today_widget.setObjectName("today_widget") - self.default_period_layout.addWidget(self.today_widget, 1, 0, 1, 1) - self.hour_widget = QtWidgets.QRadioButton(SearchInputWidget) - self.hour_widget.setObjectName("hour_widget") - self.default_period_layout.addWidget(self.hour_widget, 1, 1, 1, 1) - self.search_input_layout.addLayout(self.default_period_layout) - self.since_until_layout = QtWidgets.QGridLayout() - self.since_until_layout.setObjectName("since_until_layout") - self.since_label = QtWidgets.QLabel(SearchInputWidget) - self.since_label.setObjectName("since_label") - self.since_until_layout.addWidget(self.since_label, 0, 0, 1, 1) - self.since_widget = QtWidgets.QDateTimeEdit(SearchInputWidget) - self.since_widget.setMinimumDateTime(QtCore.QDateTime(QtCore.QDate(2000, 1, 1), QtCore.QTime(0, 0, 0))) - self.since_widget.setCalendarPopup(True) - self.since_widget.setObjectName("since_widget") - self.since_until_layout.addWidget(self.since_widget, 0, 1, 1, 1) - self.until_label = QtWidgets.QLabel(SearchInputWidget) - self.until_label.setObjectName("until_label") - self.since_until_layout.addWidget(self.until_label, 1, 0, 1, 1) - self.until_widget = QtWidgets.QDateTimeEdit(SearchInputWidget) - self.until_widget.setCalendarPopup(True) - self.until_widget.setObjectName("until_widget") - self.since_until_layout.addWidget(self.until_widget, 1, 1, 1, 1) - self.search_input_layout.addLayout(self.since_until_layout) - self.search_bar_layout = QtWidgets.QHBoxLayout() - self.search_bar_layout.setObjectName("search_bar_layout") - self.custom_query_label = QtWidgets.QLabel(SearchInputWidget) - self.custom_query_label.setObjectName("custom_query_label") - self.search_bar_layout.addWidget(self.custom_query_label) - self.search_bar = QtWidgets.QLineEdit(SearchInputWidget) - self.search_bar.setObjectName("search_bar") - self.search_bar_layout.addWidget(self.search_bar) - self.mongo_query_help_button = QtWidgets.QPushButton(SearchInputWidget) - self.mongo_query_help_button.setObjectName("mongo_query_help_button") - self.search_bar_layout.addWidget(self.mongo_query_help_button) - self.search_input_layout.addLayout(self.search_bar_layout) - self.gridLayout_4.addLayout(self.search_input_layout, 0, 0, 1, 1) - - self.retranslateUi(SearchInputWidget) - QtCore.QMetaObject.connectSlotsByName(SearchInputWidget) - - def retranslateUi(self, SearchInputWidget): - _translate = QtCore.QCoreApplication.translate - SearchInputWidget.setWindowTitle(_translate("SearchInputWidget", "Form")) - self.all_widget.setText(_translate("SearchInputWidget", "All")) - self.days_widget.setText(_translate("SearchInputWidget", "30 Days")) - self.today_widget.setText(_translate("SearchInputWidget", "Today")) - self.hour_widget.setText(_translate("SearchInputWidget", "Last Hour")) - self.since_label.setText(_translate("SearchInputWidget", "Since:")) - self.since_widget.setDisplayFormat(_translate("SearchInputWidget", "yyyy-MM-dd HH:mm")) - self.until_label.setText(_translate("SearchInputWidget", "Until:")) - self.until_widget.setDisplayFormat(_translate("SearchInputWidget", "yyyy-MM-dd HH:mm")) - self.custom_query_label.setText(_translate("SearchInputWidget", "Custom Query:")) - self.mongo_query_help_button.setText(_translate("SearchInputWidget", "?")) - - -if __name__ == "__main__": - import sys - app = QtWidgets.QApplication(sys.argv) - SearchInputWidget = QtWidgets.QWidget() - ui = Ui_SearchInputWidget() - ui.setupUi(SearchInputWidget) - SearchInputWidget.show() - sys.exit(app.exec_()) - From 6d205a86d6de304c0a09ccfd45b0255d32afce1f Mon Sep 17 00:00:00 2001 From: Juliane Reinhardt Date: Sun, 12 Apr 2020 15:02:09 -0700 Subject: [PATCH 12/14] add ui to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index de24304..d56d2a5 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ build/ dist/ *.egg-info/ +ui From 521b2d0749b3d86b70dbce648cd0d5bfd7212d23 Mon Sep 17 00:00:00 2001 From: Juliane Reinhardt Date: Mon, 13 Apr 2020 09:55:02 -0700 Subject: [PATCH 13/14] remove unnecessary imports --- xicam/gui/bluesky/search.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/xicam/gui/bluesky/search.py b/xicam/gui/bluesky/search.py index 7bf293a..62c28ea 100644 --- a/xicam/gui/bluesky/search.py +++ b/xicam/gui/bluesky/search.py @@ -13,11 +13,6 @@ import time -from qtpy import QtCore, QtGui, QtWidgets -# import everything produced with QtDesigner -from .ui_search_input import Ui_SearchInputWidget -from .ui_catalog_selection import Ui_CatalogSelectionWidget - from qtpy.QtCore import Qt, Signal, QThread, QSettings from qtpy.QtGui import QStandardItemModel, QStandardItem from qtpy.QtWidgets import ( From 8f805d5ae8adafc2285cede26a07cfc1d52763d9 Mon Sep 17 00:00:00 2001 From: Juliane Reinhardt Date: Mon, 13 Apr 2020 23:18:57 -0700 Subject: [PATCH 14/14] reset radiobuttons when custom datetime range is selected --- xicam/gui/bluesky/central.py | 9 +++++++-- xicam/gui/bluesky/search.py | 17 +++++++++++++++-- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/xicam/gui/bluesky/central.py b/xicam/gui/bluesky/central.py index 82e7409..b76b9ba 100644 --- a/xicam/gui/bluesky/central.py +++ b/xicam/gui/bluesky/central.py @@ -31,6 +31,7 @@ def __init__(self, *args, self.search_model = search_state.search_results_model # Define widgets. self.search_widget = SearchWidget() + # self.search_input_widget = SearchInputWidget() self.summary_widget = SummaryWidget() left_pane = QSplitter(Qt.Vertical) @@ -57,18 +58,21 @@ def show_double_clicked_entry(index): def set_timerange(timerange): search_state.search_results_model.on_select_range(timerange) self.search_widget.search_input_widget.since_widget.setDateTime( - QDateTime.fromSecsSinceEpoch(now - timerange)) + QDateTime.fromSecsSinceEpoch(now - timerange)) self.search_widget.search_input_widget.until_widget.setDateTime( - QDateTime.fromSecsSinceEpoch(now)) + QDateTime.fromSecsSinceEpoch(now)) def on_select_today(): set_timerange(TODAY) + self.search_widget.search_input_widget.today_widget.setChecked(True) def on_select_lasthour(): set_timerange(ONE_HOUR) + self.search_widget.search_input_widget.hour_widget.setChecked(True) def on_select_30days(): set_timerange(ONE_MONTH) + self.search_widget.search_input_widget.days_widget.setChecked(True) def on_select_all(): search_state.search_results_model.on_select_all() @@ -76,6 +80,7 @@ def on_select_all(): QDateTime.fromSecsSinceEpoch(0)) self.search_widget.search_input_widget.until_widget.setDateTime( QDateTime.fromSecsSinceEpoch(now)) + self.search_widget.search_input_widget.all_widget.setChecked(True) # connect QRadioButtons and change date dropdowns (since/until widgets) accordingly self.search_widget.search_input_widget.today_widget.clicked.connect( diff --git a/xicam/gui/bluesky/search.py b/xicam/gui/bluesky/search.py index 62c28ea..89b140a 100644 --- a/xicam/gui/bluesky/search.py +++ b/xicam/gui/bluesky/search.py @@ -14,7 +14,7 @@ from qtpy.QtCore import Qt, Signal, QThread, QSettings -from qtpy.QtGui import QStandardItemModel, QStandardItem +from qtpy.QtGui import QStandardItemModel, QStandardItem, QButtonGroup from qtpy.QtWidgets import ( QAbstractItemView, QPushButton, @@ -433,7 +433,6 @@ def on_select_all(self): - class SearchInputWidget(QWidget): """ Input fields for specifying searches on SearchResultsModel @@ -445,6 +444,11 @@ def __init__(self, *args, **kwargs): self.days_widget = QRadioButton("30 Days") self.today_widget = QRadioButton("Today") self.hour_widget = QRadioButton("Last Hour") + self.radio_button_group = QButtonGroup() + self.radio_button_group.addButton(self.all_widget) + self.radio_button_group.addButton(self.days_widget) + self.radio_button_group.addButton(self.today_widget) + self.radio_button_group.addButton(self.hour_widget) default_period_layout = QGridLayout() default_period_layout.addWidget(self.all_widget, 0, 0, 1, 1) default_period_layout.addWidget(self.days_widget, 0, 1, 1, 1) @@ -455,10 +459,12 @@ def __init__(self, *args, **kwargs): self.since_widget = QDateTimeEdit() self.since_widget.setCalendarPopup(True) self.since_widget.setDisplayFormat('yyyy-MM-dd HH:mm') + self.since_widget.dateTimeChanged.connect(self.uncheck_radiobuttons) self.until_label = QLabel("Until:") self.until_widget = QDateTimeEdit() self.until_widget.setCalendarPopup(True) self.until_widget.setDisplayFormat('yyyy-MM-dd HH:mm') + self.until_widget.dateTimeChanged.connect(self.uncheck_radiobuttons) since_until_layout = QGridLayout() since_until_layout.addWidget(self.since_label, 0, 0, 1, 1) since_until_layout.addWidget(self.since_widget, 0, 1, 1, 1) @@ -481,6 +487,13 @@ def __init__(self, *args, **kwargs): self.setLayout(search_input_layout) + def uncheck_radiobuttons(self): + self.radio_button_group.setExclusive(False) + self.all_widget.setChecked(False) + self.days_widget.setChecked(False) + self.today_widget.setChecked(False) + self.hour_widget.setChecked(False) + self.radio_button_group.setExclusive(True) def mark_custom_query(self, valid): "Indicate whether the current text is a parsable query."