Building the UI¶
ForkBit plugins use standard PySide6 widgets. The app’s theme cascades automatically — your widgets look native without any extra styling.
Replace the content of main.py:
from PySide6.QtCore import Qt
from PySide6.QtWidgets import (
QHBoxLayout,
QLabel,
QLineEdit,
QPlainTextEdit,
QPushButton,
QVBoxLayout,
)
from forkbit_sdk import BasePlugin
class ReleaseNotesPlugin(BasePlugin):
def on_ready(self) -> None:
layout = QVBoxLayout(self.container)
layout.setContentsMargins(24, 24, 24, 24)
layout.setSpacing(16)
# Version input
version_row = QHBoxLayout()
version_row.addWidget(QLabel("Version:"))
self.version_input = QLineEdit()
self.version_input.setPlaceholderText("e.g. 1.0.0")
version_row.addWidget(self.version_input)
layout.addLayout(version_row)
# Notes editor
layout.addWidget(QLabel("Release Notes:"))
self.editor = QPlainTextEdit()
self.editor.setPlaceholderText("What's new in this release?")
layout.addWidget(self.editor)
# Action buttons
button_row = QHBoxLayout()
button_row.addStretch()
save_btn = QPushButton("Save Draft")
save_btn.clicked.connect(self._on_save)
button_row.addWidget(save_btn)
publish_btn = QPushButton("Publish")
publish_btn.setProperty("class", "primary")
publish_btn.clicked.connect(self._on_publish)
button_row.addWidget(publish_btn)
layout.addLayout(button_row)
def _on_save(self) -> None:
self.notify("Draft saved.", level="success")
def _on_publish(self) -> None:
version = self.version_input.text().strip()
if not version:
self.notify("Please enter a version number.", level="warning")
return
self.notify(f"Published v{version}!", level="success")
Styling tips¶
Use
setProperty("class", "primary")for primary-styled buttonsUse spacing constants: 4, 8, 12, 16, 24, 32 px
Set
setObjectName()on widgets if you need to target them with QSSDon’t use
setStyleSheet()— the app’s theme handles styling
Your plugin now has a functional editor UI. Next: Plugin Settings.