GoForms
EN RU

GoForms

GUI-фреймворк для Go, повторяющий System.Windows.Forms: контролы по X, Y, Width, Height, docking и anchoring, многоадресные события с сигнатурой (sender, e) и форма, разделённая на сгенерированную половину и написанную руками.

Отрисовка, окна и ввод — от Fyne, поэтому рисуется через GPU на Windows, Linux и macOS и собирается ещё под WebAssembly и Android. Всё, что выше этой границы — каталог контролов, правила раскладки, модель событий — это API WinForms, с именами тех типов, которые он заменяет.

Дизайнер — расширение для VS Code. Он читает и пишет тот же Go-файл, который вы написали бы руками: никакого .resx, никаких ресурсных блобов, ничего, что открывается только инструментом.

Форма раскладки из showcase: закреплённые панели, привязанные кнопки, flow- и table-панели, split-контейнер с вкладками.
GoFormsShowcase с открытой формой раскладки.

Форма — это два файла

Ровно то разделение, которое WinForms делает между Form1.Designer.cs и Form1.cs. Дизайнер пишет только первый файл; второй ваш, и он не переписывается.

MainForm-designer.go
type MainForm struct {
	*goforms.Form
	btnGreet *goforms.Button
	lblHello *goforms.Label
}

func (mf *MainForm) initializeComponent() {
	mf.lblHello = goforms.NewLabel("Hello, World!")
	mf.lblHello.SetBounds(20, 20, 200, 24)
	mf.AddControl(mf.lblHello)

	mf.btnGreet = goforms.NewButton("Greet")
	mf.btnGreet.SetBounds(20, 60, 100, 30)
	mf.btnGreet.Click.Handle(mf.btnGreet_Click)
	mf.AddControl(mf.btnGreet)
}
MainForm.go
package mainform

import goforms "github.com/Go-Forms/GoForms"

// Дизайнер написал это, когда вы привязали Click,
// и больше сюда не возвращается.
func (mf *MainForm) btnGreet_Click(
	sender any, e goforms.MouseEventArgs,
) {
	mf.lblHello.SetText("Clicked!")
}

Что перенесено из WinForms

  • Абсолютные координаты. SetBounds(x, y, w, h) ставит контрол туда, куда сказано, считая от размера, под который форма нарисована.
  • Docking и anchoring. Те же пять стилей закрепления и четыре флага привязки, применяемые в том же порядке: закреплённые дети режут клиентскую область, а остаток становится рамкой, относительно которой считаются привязки.
  • Многоадресные события. Event[T] ведёт себя как событие в C#: Handle(h) — это +=, обработчики выполняются в порядке добавления, сигнатура всегда (sender any, e T).
  • Диалоги. ShowDialog возвращает DialogResult; message box, выбор файла, папки и цвета отвечают через колбэк — тулкит рисует их на UI-горутине, и блокировка была бы взаимной.
  • Контейнеры. Panel, GroupBox, TabControl, SplitContainer, FlowLayoutPanel, TableLayoutPanel — каждый раскладывает детей так же, как его двойник в WinForms.
  • Темы. Один литерал Theme задаёт вид всего приложения; незаполненное поле оставляет умолчание тулкита, а не превращается в пустоту.

Геометрия закреплённых и табличных раскладок закреплена golden-тестами: правка, которая сдвинет контрол на пиксель, роняет сборку, а не уезжает в релиз.

Дизайнер

Открытый в VS Code файл *-designer.go превращается в канву. Перетаскивание контрола пишет вызов конструктора, его сеттеры и поле структуры; перемещение переписывает границы; переименование меняет имя поля и все ссылки на него. Привязка события создаёт типизированную заготовку обработчика в рукописном файле, добавляет нужный импорт и переписывает существующую привязку, а не кладёт вторую рядом.

Каждая правка заканчивается уборкой: удаляются сеттеры, которые перекрыты более поздним вызовом, повторные добавления, дублирующиеся поля. Файл записывается в форме gofmt, поэтому правка из дизайнера и правка руками дают один и тот же результат. Закреплённые контролы рисуются там, где они окажутся на самом деле, а не по сохранённым координатам.

Он же создаёт проекты (пустой, пример, под браузер, под Android), открывает тему проекта как визуальный редактор и собирает и запускает проект под десктоп, браузер или подключённый телефон.

VS Code с формой GoForms на канве дизайнера, справа свойства выбранного контрола и его события.
Дизайнер с открытой ControlsForm. Панель справа — выбранный контрол: имя, границы, свойства и все его события.

Каталог контролов

Все типы ниже есть в тулбоксе дизайнера и понятны генератору кода.

Основные контролы

LabelButtonTextBox MaskedTextBoxRichTextBoxCheckBox RadioButtonComboBoxListBox CheckedListBoxPictureBoxProgressBar TrackBarScrollBarNumericUpDown DomainUpDownDateTimePickerMonthCalendar LinkLabelColorPickerButton

Контейнеры

PanelGroupBoxTabControl SplitContainerFlowLayoutPanel TableLayoutPanelScrollBox ViewContainerSplitter

Меню и панели

MenuStripToolStrip StatusStripContextMenu

Данные

DataGridViewListViewTreeView
Форма GoForms с текстовыми полями, комбобоксами, чекбоксами, ползунками и счётчиками.
Все контролы ввода, вживую.
DataGridView с сортируемыми колонками рядом с TreeView.
DataGridView с сортируемыми и растягиваемыми колонками, рядом TreeView.

Установка

Go 1.23 или новее плюс C-тулчейн и заголовки OpenGL, которые нужны Fyne на вашей платформе. На Debian или Ubuntu это gcc pkg-config libgl1-mesa-dev xorg-dev libxkbcommon-dev libwayland-dev. Windows, Linux и macOS поддерживаются одинаково и проверяются на каждом коммите.

Фреймворк
go get github.com/Go-Forms/GoForms

# Либо запустить showcase — это все контролы
# и раскладки в одном приложении:
git clone git@github.com:Go-Forms/GoFormsShowcase.git
cd GoFormsShowcase && go run .
Дизайнер
# Из последнего релиза:
code --install-extension goforms-designer-0.10.2.vsix

# Дальше в VS Code:
#   Ctrl+Shift+P -> "GoForms: Create New Project..."
# Откройте любой *-designer.go, чтобы получить канву.

Репозитории

  • GoForms — сам фреймворк: контролы, раскладка, события, диалоги, темы.
  • GoFormsDesigner — расширение для VS Code и Go-инструмент, который разбирает и переписывает designer-файлы.
  • GoFormsShowcase — по одной форме на тему, с живым журналом событий: всё, что написано на этой странице, можно проверить запуском.
  • GoFormsDemo — пример поменьше, ближе к первым формам настоящего проекта.