def create_command_panel(fig, commands): command_panel = QListWidget() for c in commands: cmd_txt, cntxt = c cntxt[2]['figure'] = fig btn = CommandItem(command_panel, cmd_txt, cntxt) command_panel.itemClicked.connect(on_command_clicked) width = command_panel.size() hint = command_panel.sizeHint() frame_width = command_panel.frameWidth() + 2 column_width = command_panel.sizeHintForColumn(0) + 2 * frame_width command_panel.setMinimumWidth(column_width) command_panel.setMaximumWidth(column_width) command_panel.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Minimum) return command_panel
class LocationLineEditPopup(QWidget): def __init__(self, parent: 'LocationLineEdit') -> None: super().__init__( parent, Qt.Window | Qt.WindowStaysOnTopHint | Qt.X11BypassWindowManagerHint | Qt.FramelessWindowHint) self._parent = parent self._previous_text: Optional[str] = None self._build_gui() self.listwidget.itemClicked.connect(self._on_item_clicked) def _build_gui(self) -> None: # Widgets self.listwidget = QListWidget() # Layout vbox = QVBoxLayout() # vbox.setSizeConstraint(QLayout.SetMaximumSize) vbox.addWidget(self.listwidget) vbox.setContentsMargins(0, 0, 0, 0) self.listwidget.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) self.setLayout(vbox) def set_completions(self, longest: str, candidates: List[str]) -> None: self.listwidget.clear() for candidate in candidates: self.listwidget.addItem(candidate) self._fit_box_to_content() def _fit_box_to_content(self) -> None: self.listwidget.setMinimumWidth(self.listwidget.sizeHintForColumn(0)) def on_key_up(self) -> None: row = self.listwidget.currentRow() if row == -1: self._previous_text = self._parent.text() row -= 1 if row >= 0: self.listwidget.setCurrentRow(row) completion = self.get_current_completion() if completion is not None: self._parent.setText(completion) def on_key_down(self) -> None: row = self.listwidget.currentRow() if row == -1: self._previous_text = self._parent.text() row += 1 if row < self.listwidget.count(): self.listwidget.setCurrentRow(row) completion = self.get_current_completion() if completion is not None: self._parent.setText(completion) def abort_completion(self) -> None: self._parent.setText(self._previous_text) self._previous_text = None self.listwidget.setCurrentRow(-1) def get_prefered_height(self) -> int: height: int = ( self.listwidget.sizeHintForRow(0) * self.listwidget.count() + 2 * self.listwidget.frameWidth()) return min(height, 400) def get_current_completion(self) -> Optional[str]: row = self.listwidget.currentRow() if row == -1: return None else: item = self.listwidget.item(row) return cast(str, item.text()) def _on_item_clicked(self, item): self._parent.setText(item.text()) self._parent.on_return_pressed()