def test_treeview(): widget = widgets.TreeView() model = widgets.FileSystemModel() widget.setModel(model) widget.selectAll() widget.h_header # widget.h_scrollbar widget.v_scrollbar widget.set_size_adjust_policy("content") with pytest.raises(ValueError): widget.set_size_adjust_policy("test") assert widget.get_size_adjust_policy() == "content" widget.setup_list_style() widget.setup_dragdrop_move() widget.scroll_to_top() widget.current_index() widget.set_selection_mode("extended") widget.set_selection_behaviour("rows") widget.set_horizontal_scrollbar_policy("always_on") widget.set_vertical_scrollbar_policy("always_on") with pytest.raises(ValueError): widget.set_horizontal_scrollbar_policy("test") with pytest.raises(ValueError): widget.set_vertical_scrollbar_policy("test") widget.set_horizontal_scrollbar_width(12) widget.set_vertical_scrollbar_width(12) widget.num_selected() widget.jump_to_column(0) widget.highlight_when_inactive() widget.raise_dock() widget.adapt_sizes()
def __init__(self, obj, name: str = ""): super().__init__() self.set_title("Object browser") self._instance_nr = self._add_instance() self.set_icon("mdi.language-python") self._attr_cols = DEFAULT_ATTR_COLS self._attr_details = DEFAULT_ATTR_DETAILS logger.debug("Reading model settings for window: %d", self._instance_nr) with core.Settings( settings_id=self._settings_group_name("model")) as settings: self._auto_refresh = settings.get("auto_refresh", False) self._refresh_rate = settings.get("refresh_rate", 2) show_callable_attrs = settings.get("show_callable_attrs", True) show_special_attrs = settings.get("show_special_attrs", True) self._tree_model = objectbrowsertreemodel.ObjectBrowserTreeModel( obj, name, attr_cols=self._attr_cols) self._proxy_tree_model = objectbrowsertreemodel.ObjectBrowserTreeProxyModel( show_callable_attrs=show_callable_attrs, show_special_attrs=show_special_attrs, ) self._proxy_tree_model.setSourceModel(self._tree_model) # self._proxy_tree_model.setSortRole(RegistryTableModel.SORT_ROLE) self._proxy_tree_model.setDynamicSortFilter(True) # self._proxy_tree_model.setSortCaseSensitivity(Qt.CaseInsensitive) # Views self._setup_actions() self.central_splitter = widgets.Splitter( parent=self, orientation=constants.VERTICAL) self.setCentralWidget(self.central_splitter) # Tree widget self.obj_tree = widgets.TreeView() self.obj_tree.setRootIsDecorated(True) self.obj_tree.setAlternatingRowColors(True) self.obj_tree.set_model(self._proxy_tree_model) self.obj_tree.set_selection_behaviour("rows") self.obj_tree.setUniformRowHeights(True) self.obj_tree.setAnimated(True) # Stretch last column? # It doesn't play nice when columns are hidden and then shown again. self.obj_tree.h_header.set_id("table_header") self.obj_tree.h_header.setSectionsMovable(True) self.obj_tree.h_header.setStretchLastSection(False) self.central_splitter.addWidget(self.obj_tree) # Bottom pane bottom_pane_widget = widgets.Widget() bottom_pane_widget.set_layout("horizontal", spacing=0, margin=5) self.central_splitter.addWidget(bottom_pane_widget) group_box = widgets.GroupBox("Details") bottom_pane_widget.box.addWidget(group_box) group_box.set_layout("horizontal", margin=2) # Radio buttons radio_widget = widgets.Widget() radio_widget.set_layout("vertical", margin=0) self.button_group = widgets.ButtonGroup(self) for button_id, attr_detail in enumerate(self._attr_details): radio_button = widgets.RadioButton(attr_detail.name) radio_widget.box.addWidget(radio_button) self.button_group.addButton(radio_button, button_id) self.button_group.buttonClicked.connect(self._change_details_field) self.button_group.button(0).setChecked(True) radio_widget.box.addStretch(1) group_box.box.addWidget(radio_widget) # Editor widget font = gui.Font("Courier") font.setFixedPitch(True) # font.setPointSize(14) self.editor = widgets.PlainTextEdit() self.editor.setReadOnly(True) self.editor.setFont(font) group_box.box.addWidget(self.editor) # Splitter parameters self.central_splitter.setCollapsible(0, False) self.central_splitter.setCollapsible(1, True) self.central_splitter.setSizes([400, 200]) self.central_splitter.setStretchFactor(0, 10) self.central_splitter.setStretchFactor(1, 0) selection_model = self.obj_tree.selectionModel() selection_model.currentChanged.connect(self._update_details) menubar = self.menuBar() file_menu = menubar.add_menu("&File") file_menu.addAction("C&lose", self.close, "Ctrl+W") file_menu.addAction("E&xit", lambda: widgets.app().closeAllWindows(), "Ctrl+Q") view_menu = menubar.add_menu("&View") view_menu.addAction("&Refresh", self._tree_model.refresh_tree, "Ctrl+R") view_menu.addAction(self.toggle_auto_refresh_action) view_menu.addSeparator() self.show_cols_submenu = widgets.Menu("Table columns") view_menu.add_menu(self.show_cols_submenu) actions = self.obj_tree.h_header.get_header_actions() self.show_cols_submenu.add_actions(actions) view_menu.addSeparator() view_menu.addAction(self.toggle_callable_action) view_menu.addAction(self.toggle_special_attribute_action) assert self._refresh_rate > 0 self._refresh_timer = core.Timer(self) self._refresh_timer.setInterval(self._refresh_rate * 1000) self._refresh_timer.timeout.connect(self._tree_model.refresh_tree) # Update views with model self.toggle_special_attribute_action.setChecked(show_special_attrs) self.toggle_callable_action.setChecked(show_callable_attrs) self.toggle_auto_refresh_action.setChecked(self._auto_refresh) # Select first row so that a hidden root node will not be selected. first_row_index = self._proxy_tree_model.first_item_index() self.obj_tree.setCurrentIndex(first_row_index) if self._tree_model.inspected_node_is_visible: self.obj_tree.expand(first_row_index)
) column_ready = custom_models.ColumnItem( name="Available", doc="Available", label=None, checkstate=lambda volume: volume.isReady(), ) column_readonly = custom_models.ColumnItem( name="Read-only", doc="Read-only", label=None, checkstate=lambda volume: volume.isReadOnly(), ) if __name__ == "__main__": import sys from prettyqt import widgets app = widgets.Application(sys.argv) view = widgets.TreeView() view.setModel(StorageInfoModel(view)) view.resize(640, 480) view.set_selection_behaviour("rows") for column in range(view.model().columnCount()): view.resizeColumnToContents(column) view.show() app.main_loop()
:param fallback: fallback icon path (qrc or file system) :returns: QIcon or None if the file mimetype icon could not be found. """ mime = mimetypes.guess_type(path)[0] if mime: icon = mime.replace("/", "-") # if system.WINDOWS: # return icons.file() if gui.Icon.hasThemeIcon(icon): icon = gui.Icon.fromTheme(icon) if not icon.isNull(): return icon if fallback: return gui.Icon(fallback) return gui.Icon.fromTheme("text-x-generic") if __name__ == "__main__": from prettyqt import widgets app = widgets.app() app.load_language("de") model = widgets.FileSystemModel() model.set_root_path("root") prov = AwesomeFileIconProvider() model.setIconProvider(prov) tree = widgets.TreeView() tree.set_model(model) tree.show() app.main_loop()
renderer = svg.SvgRenderer(xml_byte) renderer.render(painter, core.RectF(rect)) def clone(self): """Required to subclass abstract QIconEngine.""" return SVGBufferIconEngine(self._xml, self._color) def pixmap(self, size: QtCore.QSize, mode: QtGui.QIcon.Mode, state: QtGui.QIcon.State) -> QtGui.QPixmap: """Return the icon as a pixmap with requested size, mode, and state.""" img = gui.Image(size, QtGui.QImage.Format.Format_ARGB32) img.fill(QtCore.Qt.GlobalColor.transparent) pixmap = QtGui.QPixmap.fromImage( img, QtCore.Qt.ImageConversionFlag.NoFormatConversion) rect = QtCore.QRect(QtCore.QPoint(0, 0), size) self.paint(QtGui.QPainter(pixmap), rect, mode, state) return pixmap def change_color(self, color: types.ColorType) -> None: self._color = colors.get_color(color) if __name__ == "__main__": from prettyqt import widgets app = widgets.app() engine = SVGBufferIconEngine("") widget = widgets.TreeView() widget.show() app.main_loop()