def _build_layout(self, show_head=True, show_control=True, update=True, recurse=False): """build_layout - build layout """ DBG("build layout") self.setLayout(QtWidgets.QVBoxLayout()) self.layout().setContentsMargins(0, 0, 0, 0) self.layout().setSpacing(0) # header self.header = self._add_frame() self.toggle_ctrl = QtWidgets.QPushButton("-", self) self.header.layout().addWidget(self.toggle_ctrl) self.line_edit = QtWidgets.QLineEdit(self) self.header.layout().addWidget(self.line_edit) self.header.layout().addStretch(1) self.btn_close = QtWidgets.QPushButton("X", self) self.btn_close.clicked.connect(lambda checked: self.close()) self.header.layout().addWidget(self.btn_close) # controls self.control = self._add_frame() # checkboxes txt = ",\ncheck to do this always" self.cb_track = self._add_checkbox( "Track", self.change_track, "Track the node selected in the tree" + txt) self.cb_goto = self._add_checkbox( "Goto", self.change_goto, "Make the tree go to this node" + txt) self.cb_update = self._add_checkbox( "Update", self.change_update, "Update view to match changed node" + txt) self.cb_recurse = self._add_checkbox("Recurse", self.change_recurse, "Recursive view" + txt, checked=recurse) # mode menu btn = self.btn_mode = QtWidgets.QPushButton("Mode", self) self.control.layout().addWidget(btn) btn.setContextMenuPolicy(QtConst.CustomContextMenu) btn.customContextMenuRequested.connect( # right click lambda pnt: self.mode_menu()) btn.clicked.connect( # or left click lambda checked: self.mode_menu()) # misc. menu btn = self.control_menu_button = QtWidgets.QPushButton( "More\u25BE", self) self.control.layout().addWidget(btn) btn.setContextMenuPolicy(QtConst.CustomContextMenu) btn.customContextMenuRequested.connect( # right click lambda pnt: self.misc_menu()) btn.clicked.connect( # or left click lambda checked: self.misc_menu()) # padding self.control.layout().addItem( QtWidgets.QSpacerItem(0, 0, hPolicy=QtWidgets.QSizePolicy.Expanding)) # content self.splitter = ClickySplitter(self) self.splitter.setOrientation(QtCore.Qt.Vertical) self.layout().addWidget(self.splitter) self.edit_frame = self._add_frame() self.splitter.addWidget(self.edit_frame) self.view_frame = self._add_frame() self.splitter.addWidget(self.view_frame) self.control_visible = show_control self.header_visible = show_head self.show() # debug self.line_edit.setText("test") # toggle control visibility self.toggle_ctrl.clicked.connect( lambda checked: self.control.setVisible(not self.control.isVisible( )))
def make_ui(self): """make_ui - build up UI""" ui = type('CSVEditUI', (), {}) # a QVBox containing two QHBoxes self.setLayout(QtWidgets.QVBoxLayout()) buttons = QtWidgets.QHBoxLayout() self.layout().addLayout(buttons) buttons2 = QtWidgets.QHBoxLayout() self.layout().addLayout(buttons2) # make 4 directional buttons def mkbuttons(what, function): list_ = [ ('go-first', "%s column left", QtWidgets.QStyle.SP_ArrowLeft), ('go-last', "%s column right", QtWidgets.QStyle.SP_ArrowRight), ('go-top', "%s row above", QtWidgets.QStyle.SP_ArrowUp), ('go-bottom', "%s row below", QtWidgets.QStyle.SP_ArrowDown), ] buttons.addWidget(QtWidgets.QLabel(what + ": ")) for name, tip, fallback in list_: button = QtWidgets.QPushButton() button.setIcon( QtGui.QIcon.fromTheme( name, QtWidgets.QApplication.style().standardIcon(fallback))) button.setToolTip(tip % what) button.clicked.connect( lambda checked, name=name: function(name)) buttons.addWidget(button) # add buttons to move rows / columns mkbuttons("Move", self.move) # add buttons to insert rows / columns mkbuttons("Insert", self.insert) for text, function, layout in [ ("Del row", lambda clicked: self.delete_col(row=True), buttons), ("Del col.", lambda clicked: self.delete_col(), buttons), ("Prev", lambda clicked: self.prev_tbl(), buttons2), ("Next", lambda clicked: self.prev_tbl(next=True), buttons2), ]: btn = QtWidgets.QPushButton(text) layout.addWidget(btn) btn.clicked.connect(function) # input for minimum rows to count as a table ui.min_rows = QtWidgets.QSpinBox() buttons2.addWidget(ui.min_rows) ui.min_rows.setMinimum(1) ui.min_rows.setPrefix("tbl with ") ui.min_rows.setSuffix(" rows") ui.min_rows.setValue(self.state['rows']) # separator text and line start / end text for attr in 'sep', 'start', 'end': buttons2.addWidget(QtWidgets.QLabel(attr.title() + ':')) w = QtWidgets.QLineEdit() w.setText(self.state[attr]) setattr(ui, attr + '_txt', w) # w.textEdited.connect(self.delim_changed) buttons2.addWidget(w) ui.sep_txt.setToolTip("Use Prev/Next to rescan table with new sep") w = QtWidgets.QPushButton('Change') w.setToolTip("Change separator in text") w.clicked.connect(lambda checked: self.delim_changed()) buttons2.addWidget(w) buttons.addStretch(1) buttons2.addStretch(1) ui.table = QtWidgets.QTableView() self.layout().addWidget(ui.table) return ui