def show_favourite(self): """ Shows a filled star icon if this layer is a favourite layer or an unfilled one if not """ if self.is_favourite: icon = QtGui.QIcon(icons("64x64", "star_filled.png")) else: icon = QtGui.QIcon(icons("64x64", "star_unfilled.png")) self.setIcon(0, icon)
def filter_favourite_toggled(self): self.filter_favourite = not self.filter_favourite if self.filter_favourite: self.filterFavouriteAction.setIcon(QtGui.QIcon(icons("64x64", "star_filled.png"))) self.filterFavouriteAction.setToolTip("Disable showing only favourite layers") else: self.filterFavouriteAction.setIcon(QtGui.QIcon(icons("64x64", "star_unfilled.png"))) self.filterFavouriteAction.setToolTip("Show only favourite layers") self.filter_multilayers()
def __init__(self, dock_widget): super().__init__(parent=dock_widget) self.setupUi(self) self.setWindowFlags(QtCore.Qt.Window) if isinstance(dock_widget, mslib.msui.wms_control.HSecWMSControlWidget): self.setWindowTitle(self.windowTitle() + " (Top View)") elif isinstance(dock_widget, mslib.msui.wms_control.VSecWMSControlWidget): self.setWindowTitle(self.windowTitle() + " (Side View)") self.dock_widget = dock_widget self.layers = {} self.layers_priority = [] self.current_layer: Layer = None self.threads = 0 self.filter_favourite = False self.settings = load_settings_qsettings("multilayers", { "favourites": [], "saved_styles": {} }) self.synced_reference = Layer(None, None, None, is_empty=True) self.listLayers.itemChanged.connect(self.multilayer_changed) self.listLayers.itemClicked.connect(self.multilayer_clicked) self.listLayers.itemClicked.connect(self.check_icon_clicked) self.listLayers.itemDoubleClicked.connect( self.multilayer_doubleclicked) self.listLayers.setVisible(True) self.leMultiFilter.setVisible(True) self.lFilter.setVisible(True) self.filterFavouriteAction = self.leMultiFilter.addAction( QtGui.QIcon(icons("64x64", "star_unfilled.png")), QtWidgets.QLineEdit.TrailingPosition) self.filterRemoveAction = self.leMultiFilter.addAction( QtGui.QIcon(icons("64x64", "remove.png")), QtWidgets.QLineEdit.TrailingPosition) self.filterRemoveAction.setVisible(False) self.filterRemoveAction.setToolTip("Click to remove the filter") self.filterFavouriteAction.setToolTip("Show only favourite layers") self.filterRemoveAction.triggered.connect( lambda x: self.remove_filter_triggered()) self.filterFavouriteAction.triggered.connect( lambda x: self.filter_favourite_toggled()) self.cbMultilayering.stateChanged.connect(self.toggle_multilayering) self.leMultiFilter.textChanged.connect(self.filter_multilayers) self.listLayers.setColumnWidth(2, 50) self.listLayers.setColumnWidth(1, 200) self.listLayers.setColumnHidden(2, True) self.listLayers.header().setSectionResizeMode( 0, QtWidgets.QHeaderView.Stretch) self.delete_shortcut = QtWidgets.QShortcut( QtGui.QKeySequence("Delete"), self) self.delete_shortcut.activated.connect(self.delete_server)
def __init__(self, parent=None, model=None, _id=None): """Set up user interface, connect signal/slots. """ super(MSSTopViewWindow, self).__init__(parent, model, _id) logging.debug(_id) self.setupUi(self) self.setWindowIcon(QtGui.QIcon(icons('64x64'))) # Dock windows [WMS, Satellite, Trajectories, Remote Sensing, KML Overlay]: self.docks = [None, None, None, None, None] self.settings_tag = "topview" self.load_settings() # Initialise the GUI elements (map view, items of combo boxes etc.). self.setup_top_view() # Boolean to store active wms connection self.wms_connected = False # Connect slots and signals. # ========================== # Map controls. self.btMapRedraw.clicked.connect(self.mpl.canvas.redraw_map) self.cbChangeMapSection.activated.connect(self.changeMapSection) # Settings self.btSettings.clicked.connect(self.settings_dialogue) # Roundtrip self.btRoundtrip.clicked.connect(self.make_roundtrip) # Tool opener. self.cbTools.currentIndexChanged.connect(self.openTool)
def __init__(self, parent=None, model=None, _id=None): """Set up user interface, connect signal/slots. """ super(MSSSideViewWindow, self).__init__(parent, model, _id) self.setupUi(self) self.setWindowIcon(QtGui.QIcon(icons('64x64'))) # Dock windows [WMS]: self.cbTools.clear() self.cbTools.addItems(["(select to open control)", "Vertical Section WMS"]) self.docks = [None] self.setFlightTrackModel(model) self.settings_tag = "sideview" self.load_settings() # Connect slots and signals. # ========================== # Buttons to set sideview options. self.btOptions.clicked.connect(self.set_options) # Tool opener. self.cbTools.currentIndexChanged.connect(self.openTool)
def __init__(self, parent=None, model=None, _id=None): """ """ super(MSUITableViewWindow, self).__init__(parent, model, _id) self.setupUi(self) self.setWindowIcon(QtGui.QIcon(icons('64x64'))) self.setFlightTrackModel(model) self.tableWayPoints.setItemDelegate(ft.WaypointDelegate(self)) toolitems = ["(select to open control)", "Hexagon Control", "Performance Settings"] self.cbTools.clear() self.cbTools.addItems(toolitems) self.tableWayPoints.dropEvent = types.MethodType(dropEvent, self.tableWayPoints) self.tableWayPoints.dragEnterEvent = types.MethodType(dragEnterEvent, self.tableWayPoints) # Dock windows [Hexagon]. self.docks = [None, None] # Connect slots and signals. self.btAddWayPointToFlightTrack.clicked.connect(self.addWayPoint) self.btCloneWaypoint.clicked.connect(self.cloneWaypoint) self.btDeleteWayPoint.clicked.connect(self.removeWayPoint) self.btInvertDirection.clicked.connect(self.invertDirection) self.btRoundtrip.clicked.connect(self.make_roundtrip) self.tableWayPoints.selectionModel().selectionChanged.connect(self.on_selection_changed) # Tool opener. self.cbTools.currentIndexChanged.connect(self.openTool) self.resizeColumns()
def test_upload_file(self): response = self._login() token = response["token"] sio = socketio.Client() self.sockets.append(sio) message_recv = [] def handle_incoming_message(msg): msg = json.loads(msg) message_recv.append(msg) sio.on('chat-message-client', handler=handle_incoming_message) sio.connect(self.url) sio.emit('start', response) sio.sleep(1) files = {'file': open(icons('16x16'), 'rb')} data = { "token": token, "p_id": 1, "message_type": int(MessageType.IMAGE) } url = url_join(self.url, 'message_attachment') requests.post(url, data=data, files=files) sio.sleep(1) assert len(message_recv) == 1 assert fs.path.join("uploads", "1", "mss-logo") in message_recv[0]["text"]
def _icon(self, name, *args): """ wrapper around base method to inject our own icons. """ myname = icons("32x32", name) if os.path.exists(myname): return QtGui.QIcon(myname) else: return super(NavigationToolbar, self)._icon(name, *args)
def add_wms(self, wms): """ Adds a wms to the multilayer list """ if wms.url not in self.layers: header = QtWidgets.QTreeWidgetItem(self.listLayers) header.setText(0, wms.url) header.wms_name = wms.url self.layers[wms.url] = {} self.layers[wms.url]["header"] = header self.layers[wms.url]["wms"] = wms header.setExpanded(True) if not self.height: self.height = self.listLayers.visualItemRect(header).height() icon = QtGui.QIcon(icons("64x64", "bin.png")) header.setIcon(0, icon)
def add_wms(self, wms): """ Adds a wms to the multilayer list """ if wms.url not in self.layers: header = QtWidgets.QTreeWidgetItem(self.listLayers) header.setText(0, wms.url) header.wms_name = wms.url self.layers[wms.url] = {} self.layers[wms.url]["header"] = header self.layers[wms.url]["wms"] = wms header.setExpanded(True) size = QtCore.QSize() size.setHeight(15) header.setSizeHint(0, size) icon = QtGui.QIcon(icons("64x64", "bin.png")) header.setIcon(0, icon)
def test_upload_file(self): sio = self._connect() sio.emit('start', {'token': self.token}) files = {'file': open(icons('16x16'), 'rb')} data = { "token": self.token, "op_id": self.operation.id, "message_type": int(MessageType.IMAGE) } url = url_join(self.url, 'message_attachment') requests.post(url, data=data, files=files) upload_dir = os.path.join(mscolab_settings.UPLOAD_FOLDER, str(self.user.id)) assert os.path.exists(upload_dir) file = os.listdir(upload_dir)[0] assert 'mss-logo' in file assert 'png' in file
def logo(): base_path = icons("64x64", "mss-logo.png") return send_file(base_path)
def favicons(): base_path = icons("16x16", "favicon.ico") return send_file(base_path)
def main(): try: prefix = os.environ["CONDA_DEFAULT_ENV"] except KeyError: prefix = "" app_prefix = prefix if prefix: app_prefix = "-{}".format(prefix) icon_hash = hashlib.md5('.'.join([__version__, app_prefix]).encode('utf-8')).hexdigest() parser = argparse.ArgumentParser() parser.add_argument("-v", "--version", help="show version", action="store_true", default=False) parser.add_argument("--debug", help="show debugging log messages on console", action="store_true", default=False) parser.add_argument("--logfile", help="Specify logfile location. Set to empty string to disable.", action="store", default=os.path.join(constants.MSS_CONFIG_PATH, "mss_pyui.log")) parser.add_argument("-m", "--menu", help="adds mss to menu", action="store_true", default=False) parser.add_argument("-d", "--deinstall", help="removes mss from menu", action="store_true", default=False) args = parser.parse_args() if args.version: print("***********************************************************************") print("\n Mission Support System (mss)\n") print("***********************************************************************") print("Documentation: http://mss.rtfd.io") print("Version:", __version__) sys.exit() setup_logging(args) if args.menu: # Experimental feature to get mss into application menu if platform.system() == "Linux": icon_size = '48x48' src_icon_path = icons(icon_size) icon_destination = constants.POSIX["icon_destination"].format(icon_size, icon_hash) dirname = os.path.dirname(icon_destination) if not os.path.exists(dirname): os.makedirs(dirname) shutil.copyfile(src_icon_path, icon_destination) desktop = constants.POSIX["desktop"] application_destination = constants.POSIX["application_destination"].format(app_prefix) dirname = os.path.dirname(application_destination) if not os.path.exists(dirname): os.makedirs(dirname) if prefix: prefix = "({})".format(prefix) desktop = desktop.format(prefix, os.path.join(sys.prefix, "bin", "mss"), icon_destination) with open(application_destination, 'w') as f: f.write(desktop) logging.info("menu entry created") sys.exit() if args.deinstall: application_destination = constants.POSIX["application_destination"].format(app_prefix) if os.path.exists(application_destination): os.remove(application_destination) icon_size = '48x48' icon_destination = constants.POSIX["icon_destination"].format(icon_size, icon_hash) if os.path.exists(icon_destination): os.remove(icon_destination) logging.info("menu entry removed") sys.exit() logging.info("MSS Version: %s", __version__) logging.info("Python Version: %s", sys.version) logging.info("Platform: %s (%s)", platform.platform(), platform.architecture()) logging.info("Launching user interface...") application = QtWidgets.QApplication(sys.argv) application.setWindowIcon(QtGui.QIcon(icons('128x128'))) application.setApplicationDisplayName("MSS") mainwindow = MSSMainWindow() mainwindow.create_new_flight_track() mainwindow.show() sys.exit(application.exec_())
def __init__(self, *args): super(MSSMainWindow, self).__init__(*args) self.setupUi(self) self.setWindowIcon(QtGui.QIcon(icons('32x32'))) # This code is required in Windows 7 to use the icon set by setWindowIcon in taskbar # instead of the default Icon of python/pythonw try: import ctypes myappid = "mss.mss_pyui.{}".format(__version__) # arbitrary string ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid) except (ImportError, AttributeError) as error: logging.debug("AttributeError, ImportError Exception %s", error) # Reference to the flight track that is currently displayed in the # views. self.active_flight_track = None self.last_save_directory = config_loader(dataset="data_dir") self.mscolab_window = None self.config_editor = None # Connect Qt SIGNALs: # =================== # File menu. self.actionNewFlightTrack.triggered.connect(functools.partial(self.create_new_flight_track, None, None)) self.actionOpenFlightTrack.triggered.connect(self.open_flight_track) self.actionActivateSelectedFlightTrack.triggered.connect(self.activate_selected_flight_track) self.actionCloseSelectedFlightTrack.triggered.connect(self.close_selected_flight_track) self.actionSaveActiveFlightTrack.triggered.connect(self.save_flight_track) self.actionSaveActiveFlightTrackAs.triggered.connect(self.save_flight_track_as) # Views menu. self.actionTopView.triggered.connect(self.create_new_view) self.actionSideView.triggered.connect(self.create_new_view) self.actionTableView.triggered.connect(self.create_new_view) # mscolab menu self.actionMscolabProjects.triggered.connect(self.activate_mscolab_window) # Help menu. self.actionOnlineHelp.triggered.connect(self.show_online_help) self.actionAboutMSUI.triggered.connect(self.show_about_dialog) # Config self.actionConfiguration.triggered.connect(self.open_config_file) # Flight Tracks. self.listFlightTracks.itemActivated.connect(self.activate_flight_track) # Views. self.listViews.itemActivated.connect(self.activate_sub_window) self.add_import_filter("CSV", "csv", load_from_csv, pickertag="filepicker_default") self.add_export_filter("CSV", "csv", save_to_csv, pickertag="filepicker_default") self._imported_plugins, self._exported_plugins = {}, {} self.add_plugins() preload_urls = config_loader(dataset="WMS_preload") self.preload_wms(preload_urls) # Status Bar self.labelStatusbar.setText(self.status())
def __init__(self, parent=None): super(EditorMainWindow, self).__init__(parent) self.path = None self.file_content = None self.layout = QtWidgets.QVBoxLayout() # Could also use a QTextEdit and set self.editor.setAcceptRichText(False) self.editor = QtWidgets.QPlainTextEdit() # Load mss_settings.json (if already exists) self.mss_path = fs.path.join(MSS_CONFIG_PATH, "mss_settings" + ".json") if fs.open_fs(MSS_CONFIG_PATH).exists("mss_settings.json"): file_name = fs.path.basename(self.mss_path) with fs.open_fs(fs.path.dirname(self.mss_path)) as file_dir: self.file_content = file_dir.readtext(file_name) self.editor.setPlainText(self.file_content) self.update_title() # Setup the QTextEdit editor configuration fixedfont = QtGui.QFontDatabase.systemFont(QtGui.QFontDatabase.FixedFont) fixedfont.setPointSize(12) self.editor.setFont(fixedfont) # self.path holds the path of the currently open file. # If none, we haven't got a file open yet (or creating new). self.path = constants.MSS_CONFIG_PATH self.layout.addWidget(self.editor) self.container = QtWidgets.QWidget() self.container.setLayout(self.layout) self.setCentralWidget(self.container) self.status = QtWidgets.QStatusBar() self.setStatusBar(self.status) self.file_toolbar = QtWidgets.QToolBar("File") self.file_toolbar.setIconSize(QtCore.QSize(14, 14)) self.addToolBar(self.file_toolbar) self.file_menu = self.menuBar().addMenu("&File") self.open_file_action = QtWidgets.QAction(QtGui.QIcon(icons('config_editor', 'Folder-new.svg')), "Open file...", self) self.open_file_action.setStatusTip("Open file") self.open_file_action.triggered.connect(self.file_open) self.file_menu.addAction(self.open_file_action) self.file_toolbar.addAction(self.open_file_action) self.save_file_action = QtWidgets.QAction(QtGui.QIcon(icons('config_editor', 'Document-save.svg')), "Save", self) self.save_file_action.setStatusTip("Save current page") self.save_file_action.triggered.connect(self.file_save) self.file_menu.addAction(self.save_file_action) self.file_toolbar.addAction(self.save_file_action) self.saveas_file_action = QtWidgets.QAction(QtGui.QIcon(icons('config_editor', 'Document-save-as.svg')), "Save As...", self) self.saveas_file_action.setStatusTip("Save current page to specified file") self.saveas_file_action.triggered.connect(self.file_saveas) self.file_menu.addAction(self.saveas_file_action) self.file_toolbar.addAction(self.saveas_file_action) self.print_action = QtWidgets.QAction(QtGui.QIcon(icons('config_editor', 'Document-print.svg')), "Print...", self) self.print_action.setStatusTip("Print current page") self.print_action.triggered.connect(self.file_print) self.file_menu.addAction(self.print_action) self.file_toolbar.addAction(self.print_action) self.edit_toolbar = QtWidgets.QToolBar("Edit") self.edit_toolbar.setIconSize(QtCore.QSize(16, 16)) self.addToolBar(self.edit_toolbar) self.edit_menu = self.menuBar().addMenu("&Edit") self.undo_action = QtWidgets.QAction(QtGui.QIcon(icons('config_editor', 'Edit-undo.svg')), "Undo", self) self.undo_action.setStatusTip("Undo last change") self.undo_action.triggered.connect(self.editor.undo) self.edit_menu.addAction(self.undo_action) self.redo_action = QtWidgets.QAction(QtGui.QIcon(icons('config_editor', 'Edit-redo.svg')), "Redo", self) self.redo_action.setStatusTip("Redo last change") self.redo_action.triggered.connect(self.editor.redo) self.edit_toolbar.addAction(self.redo_action) self.edit_menu.addAction(self.redo_action) self.edit_menu.addSeparator() self.cut_action = QtWidgets.QAction(QtGui.QIcon(icons('config_editor', 'Edit-cut.svg')), "Cut", self) self.cut_action.setStatusTip("Cut selected text") self.cut_action.triggered.connect(self.editor.cut) self.edit_toolbar.addAction(self.cut_action) self.edit_menu.addAction(self.cut_action) self.copy_action = QtWidgets.QAction(QtGui.QIcon(icons('config_editor', 'Edit-copy.svg')), "Copy", self) self.copy_action.setStatusTip("Copy selected text") self.copy_action.triggered.connect(self.editor.copy) self.edit_toolbar.addAction(self.copy_action) self.edit_menu.addAction(self.copy_action) self.paste_action = QtWidgets.QAction(QtGui.QIcon(icons('config_editor', 'Edit-paste.svg')), "Paste", self) self.paste_action.setStatusTip("Paste from clipboard") self.paste_action.triggered.connect(self.editor.paste) self.edit_toolbar.addAction(self.paste_action) self.edit_menu.addAction(self.paste_action) self.select_action = QtWidgets.QAction(QtGui.QIcon(icons('config_editor', 'Edit-select-all.svg')), "Select all", self) self.select_action.setStatusTip("Select all text") self.select_action.triggered.connect(self.editor.selectAll) self.edit_menu.addAction(self.select_action) self.edit_menu.addSeparator() self.wrap_action = QtWidgets.QAction(QtGui.QIcon(icons('config_editor', 'Go-next.svg')), "Wrap text to window", self) self.wrap_action.setStatusTip("Toggle wrap text to window") self.wrap_action.setCheckable(True) self.wrap_action.setChecked(True) self.wrap_action.triggered.connect(self.edit_toggle_wrap) self.edit_menu.addAction(self.wrap_action) self.update_title() self.show()
def __init__(self, parent=None): super(EditorMainWindow, self).__init__(parent) self.path = None self.file_content = None self.layout = QtWidgets.QVBoxLayout() # Could also use a QTextEdit and set self.editor.setAcceptRichText(False) self.editor = QtWidgets.QPlainTextEdit() # Load mss_settings.json (if already exists), change \\ to / so fs can work with it self.path = constants.CACHED_CONFIG_FILE if self.path is not None: self.path = self.path.replace("\\", "/") dir_name, file_name = fs.path.split(self.path) with fs.open_fs(dir_name) as _fs: if _fs.exists(file_name): self.file_content = _fs.readtext(file_name) self.editor.setPlainText(self.file_content) self.update_title() else: self.path = MSS_SETTINGS self.path = self.path.replace("\\", "/") self.last_saved = self.editor.toPlainText() # Setup the QTextEdit editor configuration fixedfont = QtGui.QFontDatabase.systemFont( QtGui.QFontDatabase.FixedFont) fixedfont.setPointSize(12) self.editor.setFont(fixedfont) self.layout.addWidget(self.editor) self.container = QtWidgets.QWidget() self.container.setLayout(self.layout) self.setCentralWidget(self.container) self.status = QtWidgets.QStatusBar() self.setStatusBar(self.status) self.file_toolbar = QtWidgets.QToolBar("File") self.file_toolbar.setIconSize(QtCore.QSize(14, 14)) self.addToolBar(self.file_toolbar) self.file_menu = self.menuBar().addMenu("&File") self.open_file_action = QtWidgets.QAction( QtGui.QIcon(icons('config_editor', 'Folder-new.svg')), "Open file...", self) self.open_file_action.setStatusTip("Open file") self.open_file_action.triggered.connect(self.file_open) self.file_menu.addAction(self.open_file_action) self.file_toolbar.addAction(self.open_file_action) self.save_file_action = QtWidgets.QAction( QtGui.QIcon(icons('config_editor', 'Document-save.svg')), "Save and Quit", self) self.save_file_action.setStatusTip("Save current page") self.save_file_action.triggered.connect(self.file_save_and_quit) self.file_menu.addAction(self.save_file_action) self.file_toolbar.addAction(self.save_file_action) self.saveas_file_action = QtWidgets.QAction( QtGui.QIcon(icons('config_editor', 'Document-save-as.svg')), "Save As...", self) self.saveas_file_action.setStatusTip( "Save current page to specified file") self.saveas_file_action.triggered.connect(self.file_saveas) self.file_menu.addAction(self.saveas_file_action) self.file_toolbar.addAction(self.saveas_file_action) self.print_action = QtWidgets.QAction( QtGui.QIcon(icons('config_editor', 'Document-print.svg')), "Print...", self) self.print_action.setStatusTip("Print current page") self.print_action.triggered.connect(self.file_print) self.file_menu.addAction(self.print_action) self.file_toolbar.addAction(self.print_action) self.quit_action = QtWidgets.QAction("Quit", self) self.quit_action.triggered.connect(self.close) self.file_menu.addAction(self.quit_action) self.edit_toolbar = QtWidgets.QToolBar("Edit") self.edit_toolbar.setIconSize(QtCore.QSize(16, 16)) self.addToolBar(self.edit_toolbar) self.edit_menu = self.menuBar().addMenu("&Edit") self.undo_action = QtWidgets.QAction( QtGui.QIcon(icons('config_editor', 'Edit-undo.svg')), "Undo", self) self.undo_action.setStatusTip("Undo last change") self.undo_action.triggered.connect(self.editor.undo) self.edit_menu.addAction(self.undo_action) self.redo_action = QtWidgets.QAction( QtGui.QIcon(icons('config_editor', 'Edit-redo.svg')), "Redo", self) self.redo_action.setStatusTip("Redo last change") self.redo_action.triggered.connect(self.editor.redo) self.edit_toolbar.addAction(self.redo_action) self.edit_menu.addAction(self.redo_action) self.edit_menu.addSeparator() self.cut_action = QtWidgets.QAction( QtGui.QIcon(icons('config_editor', 'Edit-cut.svg')), "Cut", self) self.cut_action.setStatusTip("Cut selected text") self.cut_action.triggered.connect(self.editor.cut) self.edit_toolbar.addAction(self.cut_action) self.edit_menu.addAction(self.cut_action) self.copy_action = QtWidgets.QAction( QtGui.QIcon(icons('config_editor', 'Edit-copy.svg')), "Copy", self) self.copy_action.setStatusTip("Copy selected text") self.copy_action.triggered.connect(self.editor.copy) self.edit_toolbar.addAction(self.copy_action) self.edit_menu.addAction(self.copy_action) self.paste_action = QtWidgets.QAction( QtGui.QIcon(icons('config_editor', 'Edit-paste.svg')), "Paste", self) self.paste_action.setStatusTip("Paste from clipboard") self.paste_action.triggered.connect(self.editor.paste) self.edit_toolbar.addAction(self.paste_action) self.edit_menu.addAction(self.paste_action) self.select_action = QtWidgets.QAction( QtGui.QIcon(icons('config_editor', 'Edit-select-all.svg')), "Select all", self) self.select_action.setStatusTip("Select all text") self.select_action.triggered.connect(self.editor.selectAll) self.edit_menu.addAction(self.select_action) self.edit_menu.addSeparator() self.wrap_action = QtWidgets.QAction( QtGui.QIcon(icons('config_editor', 'Go-next.svg')), "Wrap text to window", self) self.wrap_action.setStatusTip("Toggle wrap text to window") self.wrap_action.setCheckable(True) self.wrap_action.setChecked(True) self.wrap_action.triggered.connect(self.edit_toggle_wrap) self.edit_menu.addAction(self.wrap_action) self.update_title() self.show()
def __init__(self, parent=None): super(ConfigurationEditorWindow, self).__init__(parent) self.setupUi(self) options = config_loader() self.path = MSS_SETTINGS self.last_saved = copy.deepcopy(options) self.optCb.addItem("All") for option in sorted(options.keys(), key=str.lower): self.optCb.addItem(option) # Create view and place in parent widget self.view = JsonView() self.view.setItemDelegate(JsonDelegate()) self.view.setSelectionMode( QtWidgets.QAbstractItemView.ExtendedSelection) self.jsonWidget.setLayout(QtWidgets.QVBoxLayout()) self.jsonWidget.layout().setContentsMargins(0, 0, 0, 0) self.jsonWidget.layout().addWidget(self.view) # Create proxy model for filtering self.proxy_model = JsonSortFilterProxyModel() self.json_model = JsonModel(data=options, editable_keys=True, editable_values=True) self.json_model.setHorizontalHeaderLabels(['Option', 'Value']) # Set view model self.proxy_model.setSourceModel(self.json_model) self.view.setModel(self.proxy_model) # Setting proxy model and view attributes self.proxy_model.setFilterKeyColumn(0) # Add actions to toolbar self.import_file_action = QtWidgets.QAction( QtGui.QIcon(icons("config_editor", "Folder-new.svg")), "Import config", self) self.import_file_action.setStatusTip( "Import an external configuration file") self.toolBar.addAction(self.import_file_action) self.save_file_action = QtWidgets.QAction( QtGui.QIcon(icons("config_editor", "Document-save.svg")), "Save config", self) self.save_file_action.setStatusTip("Save current configuration") self.toolBar.addAction(self.save_file_action) self.export_file_action = QtWidgets.QAction( QtGui.QIcon(icons("config_editor", "Document-save-as.svg")), "Export config", self) self.export_file_action.setStatusTip("Export current configuration") self.toolBar.addAction(self.export_file_action) # Button signals self.optCb.currentIndexChanged.connect(self.set_option_filter) self.addOptBtn.clicked.connect(self.add_option_handler) self.removeOptBtn.clicked.connect(self.remove_option_handler) self.restoreDefaultsBtn.clicked.connect(self.restore_defaults) self.moveUpTb.clicked.connect(lambda: self.move_option(move=1)) self.moveDownTb.clicked.connect(lambda: self.move_option(move=-1)) # File action signals self.import_file_action.triggered.connect(self.import_config) self.save_file_action.triggered.connect(self.save_config) self.export_file_action.triggered.connect(self.export_config) # View/Model signals self.view.selectionModel().selectionChanged.connect( self.tree_selection_changed) self.json_model.dataChanged.connect(self.update_view) # set behaviour of widgets self.moveUpTb.hide() self.moveDownTb.hide() self.moveUpTb.setAutoRaise(True) self.moveUpTb.setArrowType(QtCore.Qt.UpArrow) self.moveUpTb.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly) self.moveDownTb.setAutoRaise(True) self.moveDownTb.setArrowType(QtCore.Qt.DownArrow) self.moveDownTb.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly) self.moveUpTb.setEnabled(False) self.moveDownTb.setEnabled(False) self.addOptBtn.setEnabled(False) self.removeOptBtn.setEnabled(False) self.restoreDefaultsBtn.setEnabled(False) # set tooltip and make keys non-editable self.set_noneditable_items(QtCore.QModelIndex()) # json view attributes self.view.setAlternatingRowColors(True) self.view.setColumnWidth(0, self.view.width() // 2) # Add invalidity roles and update status of keys self.update_view() self.restart_on_save = True