From dc178c5ceba73cec053a5c7b8d7900855bb25eab Mon Sep 17 00:00:00 2001 From: Artem30801 Date: Wed, 22 Jan 2020 16:21:02 +0300 Subject: [PATCH] Working column editors --- Server/copter_table.py | 81 +++++++++++++++++------------------ Server/copter_table_models.py | 2 +- Server/server_qt.py | 4 ++ 3 files changed, 44 insertions(+), 43 deletions(-) diff --git a/Server/copter_table.py b/Server/copter_table.py index 254c11a..c1a96c4 100644 --- a/Server/copter_table.py +++ b/Server/copter_table.py @@ -1,6 +1,5 @@ from functools import partial from copy import deepcopy -import logging from PyQt5 import QtWidgets, QtCore, QtGui from PyQt5.QtCore import Qt as Qt @@ -67,12 +66,15 @@ class CopterTableWidget(QTableView): self.horizontalHeader().moveSection(index_from, index_to) def load_columns(self, item_dict: dict=None): + presets = self.config.table_presets if item_dict is None: - item_dict = self.config.table_presets[self.config.table_presets_current] + item_dict = presets[self.config.table_presets_current] + + item_dict.update({key: False for key in presets[HeaderEditWidget.default] if key not in item_dict}) self.set_column_order(list(item_dict.keys())) - for index, show in enumerate(item_dict.values()): - self.horizontalHeader().setColumnHidden(index, not show) + for name, show in item_dict.items(): # for index, name in enumerate(self.columns): + self.setColumnHidden(self.columns.index(name), not show) # self.setColumnHidden(index, not item_dict.get(name, False)) # Some fancy wrappers to simplify syntax def add_client(self, **kwargs): @@ -110,14 +112,13 @@ class CopterTableWidget(QTableView): action.setDefaultWidget(header_view) menu.addAction(action) menu.exec_(QCursor.pos()) - # todo header_view. + header_view.save_preset() @pyqtSlot(QtCore.QPoint) def open_menu(self, point): menu = QMenu(self) index = self.indexAt(point) item = self.model.get_row_data(index) - # print(item, index.row(), index.column()) edit_config = QAction("Edit config") edit_config.triggered.connect(partial(self.edit_copter_config, item)) @@ -144,18 +145,15 @@ class CopterTableWidget(QTableView): class HeaderListWidget(QListWidget): ColumnKeyRole = 998 - def __init__(self, config, parent=None, default_items=None): + def __init__(self, parent=None, default_items=None): super().__init__(parent) - self.populated_items = {} if default_items is not None: self.populate_items(default_items) - self.config = config self.setDragDropMode(QAbstractItemView.InternalMove) self.setDefaultDropAction(Qt.MoveAction) def populate_items(self, item_dict: dict): - self.populated_items = item_dict self.clear() for name, visible in item_dict.items(): flags = Qt.ItemIsUserCheckable | Qt.ItemIsSelectable | Qt.ItemIsDragEnabled | Qt.ItemIsEnabled @@ -171,33 +169,12 @@ class HeaderListWidget(QListWidget): return {self.item(i).data(HeaderListWidget.ColumnKeyRole): bool(self.item(i).checkState()) for i in range(self.count())} - def save_to_config(self, current=None, write=False): - if self.count() != len(self.populated_items): # Do not save when populating - print("nosave") - return - - if current is None: - current = self.config.table_presets_current - print("sAVe", current) - presets = self.config.table_presets - header_dict = self.item_dict - - for key in presets[HeaderEditWidget.default]: - print(key, current, header_dict, presets) - if key not in presets[current] and not header_dict[key]: - header_dict.pop(key) - - presets[current] = header_dict - if write: - self.config.write() - class ActiveHeaderListWidget(HeaderListWidget): - def __init__(self, source: CopterTableWidget, config, parent=None): - super().__init__(config, parent=parent) + def __init__(self, source: CopterTableWidget, parent=None): + super().__init__(parent=parent) self.source_widget = source - self.config = config self.current_columns = source.current_columns self.columns = source.columns @@ -220,31 +197,30 @@ class ActiveHeaderListWidget(HeaderListWidget): return self.source_widget.setColumnHidden(self.columns.index(key), not bool(item.checkState())) - self.save_to_config(write=True) def dropEvent(self, event: QtGui.QDropEvent): super().dropEvent(event) column_order = [self.item(i).data(HeaderListWidget.ColumnKeyRole) for i in range(self.count())] self.source_widget.set_column_order(column_order) - self.save_to_config(write=True) class HeaderEditWidget(QtWidgets.QWidget): add_new_text = "< add new >" default = "DEFAULT" - def __init__(self, source, config_data, menu_mode=False, *args, **kwargs): + def __init__(self, source, config, menu_mode=False, *args, **kwargs): super().__init__(*args, **kwargs) # self.auto_apply = auto_apply self.source = source # source = copter table - self.config = config_data + self.config = config self.menu_mode = menu_mode self.preset_widget = QtWidgets.QComboBox() - self.header_widget = ActiveHeaderListWidget(self.source, self.config) \ - if self.menu_mode else HeaderListWidget(self.config) + self.header_widget = ActiveHeaderListWidget(self.source) \ + if self.menu_mode else HeaderListWidget() self.previous = self.config.table_presets_current + self._dialog = None self.setupUi() @@ -270,6 +246,8 @@ class HeaderEditWidget(QtWidgets.QWidget): save_button.clicked.connect(self.save_preset) apply_button = QPushButton("Apply") apply_button.clicked.connect(self.apply_preset) + apply_button.setDefault(True) + apply_button.setFocus() hbox.addWidget(add_button) hbox.addWidget(remove_button) @@ -277,7 +255,9 @@ class HeaderEditWidget(QtWidgets.QWidget): hbox.addWidget(save_button) hbox.addWidget(apply_button) else: + self._dialog = HeaderEditDialog(self.source, self.config) dialog_button = QPushButton("Manage presets") + dialog_button.clicked.connect(self._dialog.show) hbox.addWidget(dialog_button) vbox.addLayout(hbox) @@ -308,8 +288,6 @@ class HeaderEditWidget(QtWidgets.QWidget): if self.menu_mode: self.source.set_column_order(list(items.keys())) self.config.table_presets_current = index - print(index) - self.config.write() self.header_widget.populate_items(items) def add_preset(self): @@ -348,7 +326,16 @@ class HeaderEditWidget(QtWidgets.QWidget): self.update_preset_list() def save_preset(self): - self.header_widget.save_to_config(current=self.preset_widget.currentText(), write=True) + current = self.preset_widget.currentText() + presets = self.config.table_presets + header_dict = self.header_widget.item_dict + + for key in presets[self.default]: + if key not in presets[current] and not header_dict[key]: + header_dict.pop(key) + + presets[current] = header_dict + self.config.write() def apply_preset(self): self.config.table_presets_current = self.preset_widget.currentText() @@ -356,6 +343,16 @@ class HeaderEditWidget(QtWidgets.QWidget): self.source.load_columns() +class HeaderEditDialog(QtWidgets.QDialog): + def __init__(self, source, config, parent=None): + super(HeaderEditDialog, self).__init__(parent=None) + self.ui = HeaderEditWidget(source, config, menu_mode=False) + self.setWindowTitle("Column preset editor") + layout = QVBoxLayout() + layout.addWidget(self.ui) + self.setLayout(layout) + + if __name__ == '__main__': import sys diff --git a/Server/copter_table_models.py b/Server/copter_table_models.py index e3e5a20..b992aaf 100644 --- a/Server/copter_table_models.py +++ b/Server/copter_table_models.py @@ -230,7 +230,7 @@ class ModelFormatter: @ModelFormatter.col_format(0, ModelFormatter.PLACE_FORMATTER) def place_id(value): - value = value.strip() + value = str(value).strip() # check user hostname spelling http://man7.org/linux/man-pages/man7/hostname.7.html # '-' (hyphen) not first; latin letters/numbers/hyphens; length form 1 to 63 # or matches command pattern diff --git a/Server/server_qt.py b/Server/server_qt.py index 3eb8d05..4af8040 100644 --- a/Server/server_qt.py +++ b/Server/server_qt.py @@ -179,6 +179,10 @@ class MainWindow(QtWidgets.QMainWindow): self.model.selected_calibration_ready_signal.connect(self.ui.calibrate_gyro.setEnabled) self.model.selected_calibration_ready_signal.connect(self.ui.calibrate_level.setEnabled) + def show(self): + self.ui.copter_table.load_columns() + super().show() + def iterate_selected(self, f, *args, **kwargs): for copter in self.model.user_selected(): yield f(copter, *args, **kwargs)