def __init__(self, db_mngr, *db_urls): """Initializes form. Args: db_mngr (SpineDBManager): The manager to use *db_urls (tuple): Database url, codename. """ super().__init__(flags=Qt.Window) from ..ui.data_store_view import Ui_MainWindow self.db_urls = list(db_urls) self.db_url = self.db_urls[0] self.db_mngr = db_mngr self.db_maps = [ self.db_mngr.get_db_map_for_listener(self, url, codename=codename) for url, codename in self.db_urls ] self.db_map = self.db_maps[0] # Setup UI from Qt Designer file self.ui = Ui_MainWindow() self.ui.setupUi(self) self.takeCentralWidget() self.setWindowIcon(QIcon(":/symbols/app.ico")) self.setStyleSheet(MAINWINDOW_SS) self.setAttribute(Qt.WA_DeleteOnClose) self.qsettings = QSettings("SpineProject", "Spine Toolbox") self.err_msg = QErrorMessage(self) self.notification_stack = NotificationStack(self) self.err_msg.setWindowTitle("Error") self.parameter_tag_toolbar = ParameterTagToolBar( self, self.db_mngr, *self.db_maps) self.addToolBar(Qt.TopToolBarArea, self.parameter_tag_toolbar) self.selected_ent_cls_ids = { "object class": {}, "relationship class": {} } self.selected_ent_ids = {"object": {}, "relationship": {}} self.selected_parameter_tag_ids = dict() self.selected_param_def_ids = { "object class": {}, "relationship class": {} } self.parameter_value_list_model = ParameterValueListModel( self, self.db_mngr, *self.db_maps) fm = QFontMetrics(QFont("", 0)) self.default_row_height = 1.2 * fm.lineSpacing() max_screen_height = max( [s.availableSize().height() for s in QGuiApplication.screens()]) self.visible_rows = int(max_screen_height / self.default_row_height) self._selection_source = None self._selection_locked = False self._focusable_childs = [self.ui.treeView_parameter_value_list] self.settings_group = 'treeViewWidget' self.undo_action = None self.redo_action = None db_names = ", ".join( ["{0}[*]".format(db_map.codename) for db_map in self.db_maps]) self.setWindowTitle("{0} - Data store view ".format(db_names)) self.update_commit_enabled()
def __init__(self, db_mngr): """Initializes form. Args: db_mngr (SpineDBManager): The manager to use """ super().__init__(flags=Qt.Window) from ..ui.spine_db_editor_window import Ui_MainWindow # pylint: disable=import-outside-toplevel self.db_mngr = db_mngr self.db_maps = [] self.db_urls = [] self._change_notifiers = [] self._changelog = [] self.db_url = None self._fetcher = None # Setup UI from Qt Designer file self.ui = Ui_MainWindow() self.ui.setupUi(self) self.takeCentralWidget() self.url_toolbar = UrlToolBar(self) self.addToolBar(Qt.TopToolBarArea, self.url_toolbar) self.setStyleSheet(MAINWINDOW_SS) self.setAttribute(Qt.WA_DeleteOnClose) self.qsettings = self.db_mngr.qsettings self.err_msg = QErrorMessage(self) self.err_msg.setWindowTitle("Error") self.err_msg.setWindowFlag(Qt.WindowContextHelpButtonHint, False) self.notification_stack = NotificationStack(self) self.silenced = False fm = QFontMetrics(QFont("", 0)) self.default_row_height = 1.2 * fm.lineSpacing() max_screen_height = max( [s.availableSize().height() for s in QGuiApplication.screens()]) self.visible_rows = int(max_screen_height / self.default_row_height) self.settings_group = "spineDBEditor" self.undo_action = None self.redo_action = None self.ui.actionUndo.setShortcuts(QKeySequence.Undo) self.ui.actionRedo.setShortcuts(QKeySequence.Redo) self.update_commit_enabled() self.setContextMenuPolicy(Qt.NoContextMenu)
def __init__(self, parent=None): super(Snippets, self).__init__(parent) # Create widgets self.setWindowModality(Qt.NonModal) self.title = QLabel(self.tr("Snippet Editor")) self.saveButton = QPushButton(self.tr("Save")) self.revertButton = QPushButton(self.tr("Revert")) self.clearHotkeyButton = QPushButton(self.tr("Clear Hotkey")) self.setWindowTitle(self.title.text()) self.newFolderButton = QPushButton("New Folder") self.deleteSnippetButton = QPushButton("Delete") self.newSnippetButton = QPushButton("New Snippet") self.edit = QPlainTextEdit() self.resetting = False self.columns = 3 self.keySequenceEdit = QKeySequenceEdit(self) self.currentHotkey = QKeySequence() self.currentHotkeyLabel = QLabel("") self.currentFileLabel = QLabel() self.currentFile = "" self.snippetDescription = QLineEdit() self.snippetEditsPending = False self.clearSelection() #Set Editbox Size font = getMonospaceFont(self) self.edit.setFont(font) font = QFontMetrics(font) self.edit.setTabStopWidth(4 * font.width(' ')); #TODO, replace with settings API #Files self.files = QFileSystemModel() self.files.setRootPath(snippetPath) self.files.setNameFilters(["*.py"]) #Tree self.tree = QTreeView() self.tree.setModel(self.files) self.tree.setSortingEnabled(True) self.tree.hideColumn(2) self.tree.sortByColumn(0, Qt.AscendingOrder) self.tree.setRootIndex(self.files.index(snippetPath)) for x in range(self.columns): #self.tree.resizeColumnToContents(x) self.tree.header().setSectionResizeMode(x, QHeaderView.ResizeToContents) treeLayout = QVBoxLayout() treeLayout.addWidget(self.tree) treeButtons = QHBoxLayout() treeButtons.addWidget(self.newFolderButton) treeButtons.addWidget(self.newSnippetButton) treeButtons.addWidget(self.deleteSnippetButton) treeLayout.addLayout(treeButtons) treeWidget = QWidget() treeWidget.setLayout(treeLayout) # Create layout and add widgets buttons = QHBoxLayout() buttons.addWidget(self.clearHotkeyButton) buttons.addWidget(self.keySequenceEdit) buttons.addWidget(self.currentHotkeyLabel) buttons.addWidget(self.revertButton) buttons.addWidget(self.saveButton) description = QHBoxLayout() description.addWidget(QLabel(self.tr("Description: "))) description.addWidget(self.snippetDescription) vlayoutWidget = QWidget() vlayout = QVBoxLayout() vlayout.addWidget(self.currentFileLabel) vlayout.addWidget(self.edit) vlayout.addLayout(description) vlayout.addLayout(buttons) vlayoutWidget.setLayout(vlayout) hsplitter = QSplitter() hsplitter.addWidget(treeWidget) hsplitter.addWidget(vlayoutWidget) hlayout = QHBoxLayout() hlayout.addWidget(hsplitter) self.showNormal() #Fixes bug that maximized windows are "stuck" self.settings = QSettings("Vector 35", "Snippet Editor") if self.settings.contains("ui/snippeteditor/geometry"): self.restoreGeometry(self.settings.value("ui/snippeteditor/geometry")) else: self.edit.setMinimumWidth(80 * font.averageCharWidth()) self.edit.setMinimumHeight(30 * font.lineSpacing()) # Set dialog layout self.setLayout(hlayout) # Add signals self.saveButton.clicked.connect(self.save) self.revertButton.clicked.connect(self.loadSnippet) self.clearHotkeyButton.clicked.connect(self.clearHotkey) self.tree.selectionModel().selectionChanged.connect(self.selectFile) self.newSnippetButton.clicked.connect(self.newFileDialog) self.deleteSnippetButton.clicked.connect(self.deleteSnippet) self.newFolderButton.clicked.connect(self.newFolder)
def _initialize_text(self): metrics = QFontMetrics(QTextEdit().font()) self.text_line_height = metrics.lineSpacing() * 2
def __init__(self, parent, name): global panes panes.append(self) QWidget.__init__(self, parent) DockContextHandler.__init__(self, self, name) self.actionHandler = UIActionHandler() self.actionHandler.setupActionHandler(self) # Top: Headers with line info header_layout = QFormLayout() self.function_info = QLabel("") self.line_info = QLabel("") header_layout.addRow(self.tr("Function:"), self.function_info) header_layout.addRow(self.tr("Line:"), self.line_info) # Middle: main source display pane textbox_layout = QVBoxLayout() self.textbox = QPlainTextEdit() self.textbox.setLineWrapMode(QPlainTextEdit.LineWrapMode.NoWrap) self.textbox.setReadOnly(True) font = getMonospaceFont(self) self.textbox.setFont(font) font = QFontMetrics(font) self.textbox.setMinimumWidth(40 * font.averageCharWidth()) self.textbox.setMinimumHeight(30 * font.lineSpacing()) textbox_layout.addWidget(self.textbox) # Bottom: buttons for stop/start, and substitution paths footer_layout = QVBoxLayout() sync_button_layout = QHBoxLayout() self.sync_button = QPushButton("Turn Source Sync Off") sync_button_layout.addWidget(self.sync_button) path_layout = QFormLayout() self.original_path = QLineEdit() self.substitute_path = QLineEdit() self.substitute_path_button = QPushButton("Do Path Substitution") path_layout.addRow(self.tr("Original Path:"), self.original_path) path_layout.addRow(self.substitute_path_button, self.substitute_path) footer_layout.addLayout(sync_button_layout) footer_layout.addLayout(path_layout) # Putting all the child layouts together layout = QVBoxLayout() layout.addLayout(header_layout) layout.addLayout(textbox_layout) layout.addLayout(footer_layout) self.setLayout(layout) # Set up button signals self.substitute_path_button.clicked.connect(self.do_path_substitution) self.sync_button.clicked.connect(self.toggle_sync) # Actual storage variables self.bv = None self.filename = None self.do_sync = True self.path_substitutions = {} self.failed_substitutions = []
def __init__(self, context, parent=None): super(Snippets, self).__init__(parent) # Create widgets self.setWindowModality(Qt.ApplicationModal) self.title = QLabel(self.tr("Snippet Editor")) self.saveButton = QPushButton(self.tr("&Save")) self.saveButton.setShortcut(QKeySequence(self.tr("Ctrl+S"))) self.runButton = QPushButton(self.tr("&Run")) self.runButton.setShortcut(QKeySequence(self.tr("Ctrl+R"))) self.closeButton = QPushButton(self.tr("Close")) self.clearHotkeyButton = QPushButton(self.tr("Clear Hotkey")) self.setWindowTitle(self.title.text()) #self.newFolderButton = QPushButton("New Folder") self.browseButton = QPushButton("Browse Snippets") self.browseButton.setIcon(QIcon.fromTheme("edit-undo")) self.deleteSnippetButton = QPushButton("Delete") self.newSnippetButton = QPushButton("New Snippet") self.edit = QCodeEditor(HIGHLIGHT_CURRENT_LINE=False, SyntaxHighlighter=PythonHighlighter) self.edit.setPlaceholderText("python code") self.resetting = False self.columns = 3 self.context = context self.keySequenceEdit = QKeySequenceEdit(self) self.currentHotkey = QKeySequence() self.currentHotkeyLabel = QLabel("") self.currentFileLabel = QLabel() self.currentFile = "" self.snippetDescription = QLineEdit() self.snippetDescription.setPlaceholderText("optional description") #Set Editbox Size font = getMonospaceFont(self) self.edit.setFont(font) font = QFontMetrics(font) self.edit.setTabStopWidth(4 * font.width(' ')); #TODO, replace with settings API #Files self.files = QFileSystemModel() self.files.setRootPath(snippetPath) self.files.setNameFilters(["*.py"]) #Tree self.tree = QTreeView() self.tree.setModel(self.files) self.tree.setSortingEnabled(True) self.tree.hideColumn(2) self.tree.sortByColumn(0, Qt.AscendingOrder) self.tree.setRootIndex(self.files.index(snippetPath)) for x in range(self.columns): #self.tree.resizeColumnToContents(x) self.tree.header().setSectionResizeMode(x, QHeaderView.ResizeToContents) treeLayout = QVBoxLayout() treeLayout.addWidget(self.tree) treeButtons = QHBoxLayout() #treeButtons.addWidget(self.newFolderButton) treeButtons.addWidget(self.browseButton) treeButtons.addWidget(self.newSnippetButton) treeButtons.addWidget(self.deleteSnippetButton) treeLayout.addLayout(treeButtons) treeWidget = QWidget() treeWidget.setLayout(treeLayout) # Create layout and add widgets buttons = QHBoxLayout() buttons.addWidget(self.clearHotkeyButton) buttons.addWidget(self.keySequenceEdit) buttons.addWidget(self.currentHotkeyLabel) buttons.addWidget(self.closeButton) buttons.addWidget(self.runButton) buttons.addWidget(self.saveButton) description = QHBoxLayout() description.addWidget(QLabel(self.tr("Description: "))) description.addWidget(self.snippetDescription) vlayoutWidget = QWidget() vlayout = QVBoxLayout() vlayout.addLayout(description) vlayout.addWidget(self.edit) vlayout.addLayout(buttons) vlayoutWidget.setLayout(vlayout) hsplitter = QSplitter() hsplitter.addWidget(treeWidget) hsplitter.addWidget(vlayoutWidget) hlayout = QHBoxLayout() hlayout.addWidget(hsplitter) self.showNormal() #Fixes bug that maximized windows are "stuck" #Because you can't trust QT to do the right thing here if (sys.platform == "darwin"): self.settings = QSettings("Vector35", "Snippet Editor") else: self.settings = QSettings("Vector 35", "Snippet Editor") if self.settings.contains("ui/snippeteditor/geometry"): self.restoreGeometry(self.settings.value("ui/snippeteditor/geometry")) else: self.edit.setMinimumWidth(80 * font.averageCharWidth()) self.edit.setMinimumHeight(30 * font.lineSpacing()) # Set dialog layout self.setLayout(hlayout) # Add signals self.saveButton.clicked.connect(self.save) self.closeButton.clicked.connect(self.close) self.runButton.clicked.connect(self.run) self.clearHotkeyButton.clicked.connect(self.clearHotkey) self.tree.selectionModel().selectionChanged.connect(self.selectFile) self.newSnippetButton.clicked.connect(self.newFileDialog) self.deleteSnippetButton.clicked.connect(self.deleteSnippet) #self.newFolderButton.clicked.connect(self.newFolder) self.browseButton.clicked.connect(self.browseSnippets) if self.settings.contains("ui/snippeteditor/selected"): selectedName = self.settings.value("ui/snippeteditor/selected") self.tree.selectionModel().select(self.files.index(selectedName), QItemSelectionModel.ClearAndSelect | QItemSelectionModel.Rows) if self.tree.selectionModel().hasSelection(): self.selectFile(self.tree.selectionModel().selection(), None) self.edit.setFocus() cursor = self.edit.textCursor() cursor.setPosition(self.edit.document().characterCount()-1) self.edit.setTextCursor(cursor) else: self.readOnly(True) else: self.readOnly(True)