83 lines
2.1 KiB
Go
83 lines
2.1 KiB
Go
|
package options
|
||
|
|
||
|
import (
|
||
|
"log/slog"
|
||
|
|
||
|
"fyne.io/fyne/v2"
|
||
|
"fyne.io/fyne/v2/container"
|
||
|
"fyne.io/fyne/v2/dialog"
|
||
|
"fyne.io/fyne/v2/lang"
|
||
|
"fyne.io/fyne/v2/widget"
|
||
|
)
|
||
|
|
||
|
func (o *options) closeOptionsDialog(save bool) {
|
||
|
slog.Debug("Closing options dialog.", "save", save)
|
||
|
|
||
|
if !save {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
for _, widget := range o.widgets {
|
||
|
if widget.SaveHandler == nil {
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
if err := widget.SaveHandler(); err != nil {
|
||
|
slog.Error("Failed to save options for module!", "module", widget.Name, "error", err.Error())
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (o *options) optionsListCreateItem() fyne.CanvasObject {
|
||
|
return widget.NewLabel("")
|
||
|
}
|
||
|
|
||
|
func (o *options) optionsListLength() int {
|
||
|
return len(o.widgetsItems)
|
||
|
}
|
||
|
|
||
|
func (o *options) optionsListUpdateItem(itemID widget.ListItemID, obj fyne.CanvasObject) {
|
||
|
label, _ := obj.(*widget.Label)
|
||
|
|
||
|
label.SetText(o.widgets[o.widgetsItems[itemID]].Name)
|
||
|
}
|
||
|
|
||
|
func (o *options) ShowOptionsDialog() {
|
||
|
optionsWidgetScroll := container.NewScroll(widget.NewLabel(lang.L("options_dialog.select_section")))
|
||
|
|
||
|
optionsList := widget.NewList(o.optionsListLength, o.optionsListCreateItem, o.optionsListUpdateItem)
|
||
|
optionsList.OnSelected = func(listID widget.ListItemID) {
|
||
|
// listID должно быть всегда меньше длины, так как является индексом.
|
||
|
// Эта проверка отрабатывает, если настроек по какой-то причине нет.
|
||
|
if listID >= len(o.widgetsItems) {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
optionsWidget := o.widgets[o.widgetsItems[listID]].Widget
|
||
|
|
||
|
if optionsWidget != nil {
|
||
|
optionsWidgetScroll.Content = optionsWidget
|
||
|
} else {
|
||
|
optionsWidgetScroll.Content = widget.NewLabel(lang.L("options_dialog.no_settings"))
|
||
|
}
|
||
|
|
||
|
optionsWidgetScroll.Refresh()
|
||
|
}
|
||
|
|
||
|
optionsListSplitter := container.NewHSplit(optionsList, optionsWidgetScroll)
|
||
|
//nolint:mnd
|
||
|
optionsListSplitter.SetOffset(0.25)
|
||
|
|
||
|
optionsDlg := dialog.NewCustomConfirm(
|
||
|
"Options",
|
||
|
"Save",
|
||
|
"Cancel",
|
||
|
optionsListSplitter,
|
||
|
o.closeOptionsDialog,
|
||
|
o.mainWindow.MainWindow(),
|
||
|
)
|
||
|
optionsDlg.Resize(o.mainWindow.MainWindow().Canvas().Size())
|
||
|
|
||
|
optionsDlg.Show()
|
||
|
}
|