Files

112 lines
4.2 KiB
Go

// Copyright (c) 2026 Storm Dragon
// Authors: Storm Dragon, Angus Kola
// SPDX-License-Identifier: GPL-3.0-or-later
package preferences
/*
#include <stdlib.h>
#include "native.h"
*/
import "C"
import (
"errors"
"path/filepath"
"unsafe"
"git.stormux.org/storm/cthulhu/internal/braille"
)
func setBrailleChoice(brief, verbose string, value int) {
setCheck(brief, value == 0)
setCheck(verbose, value != 0)
}
func setBrailleIndicator(prefix string, value int) {
suffix := map[int]string{0: "NoneButton", 0x40: "7Button", 0x80: "8Button", 0xc0: "BothButton"}[value]
setCheck(prefix+suffix, true)
}
func getBrailleIndicator(prefix string) int {
for _, option := range []struct {
suffix string
dots int
}{
{"7Button", 0x40}, {"8Button", 0x80}, {"BothButton", 0xc0},
} {
if getCheck(prefix + option.suffix) {
return option.dots
}
}
return 0
}
func (session *uiSession) set_braille_values(values Values) {
setCheck("enableBrailleCheckButton", values.EnableBraille)
setCheck("contractedBrailleCheckButton", values.EnableContractedBraille)
setCheck("abbrevRolenames", values.Braille.AbbreviateRoles)
setCheck("disableBrailleEOLCheckButton", values.Braille.DisableEOL)
setCheck("enableBrailleWordWrapCheckButton", values.Braille.WordWrap)
setCheck("enableFlashMessagesCheckButton", values.Braille.FlashMessages)
setCheck("flashIsPersistentCheckButton", values.Braille.FlashPersistent)
setCheck("flashIsDetailedCheckButton", values.Braille.FlashDetailed)
setSpin("brailleFlashTimeSpinButton", float64(values.Braille.FlashTime)/1000)
setBrailleChoice("brailleBriefButton", "brailleVerboseButton", values.Braille.Verbosity)
setBrailleIndicator("brailleSelection", values.Braille.SelectionIndicator)
setBrailleIndicator("brailleLink", values.Braille.LinkIndicator)
session.contractionTables = braille.AvailableTables()
comboID := C.CString("contractionTableCombo")
C.prefs_combo_clear(comboID)
defaultLabel := C.CString("Automatic for current language")
C.prefs_combo_append(comboID, defaultLabel)
C.free(unsafe.Pointer(defaultLabel))
selected := 0
for index, table := range session.contractionTables {
label := C.CString(table.Label)
C.prefs_combo_append(comboID, label)
C.free(unsafe.Pointer(label))
if table.File == values.BrailleContractionTable || filepath.Base(table.File) == values.BrailleContractionTable {
selected = index + 1
}
}
if values.BrailleContractionTable != "" && selected == 0 {
// Keep a saved table available even after a locale change or package update.
session.contractionTables = append(session.contractionTables, braille.TableOption{
Label: "Saved: " + filepath.Base(values.BrailleContractionTable),
File: values.BrailleContractionTable,
})
label := C.CString(session.contractionTables[len(session.contractionTables)-1].Label)
C.prefs_combo_append(comboID, label)
C.free(unsafe.Pointer(label))
selected = len(session.contractionTables)
}
C.prefs_combo_set(comboID, C.int(selected))
C.free(unsafe.Pointer(comboID))
}
func (session *uiSession) get_braille_values(values *Values) error {
values.EnableBraille = getCheck("enableBrailleCheckButton")
values.EnableContractedBraille = getCheck("contractedBrailleCheckButton")
values.Braille.AbbreviateRoles = getCheck("abbrevRolenames")
values.Braille.DisableEOL = getCheck("disableBrailleEOLCheckButton")
values.Braille.WordWrap = getCheck("enableBrailleWordWrapCheckButton")
values.Braille.FlashMessages = getCheck("enableFlashMessagesCheckButton")
values.Braille.FlashPersistent = getCheck("flashIsPersistentCheckButton")
values.Braille.FlashDetailed = getCheck("flashIsDetailedCheckButton")
values.Braille.FlashTime = int(getSpin("brailleFlashTimeSpinButton") * 1000)
if getCheck("brailleVerboseButton") {
values.Braille.Verbosity = 1
}
values.Braille.SelectionIndicator = getBrailleIndicator("brailleSelection")
values.Braille.LinkIndicator = getBrailleIndicator("brailleLink")
selectedTable := getCombo("contractionTableCombo")
if selectedTable < 0 || selectedTable > len(session.contractionTables) {
return errors.New("Choose a contraction table.")
}
if selectedTable > 0 {
values.BrailleContractionTable = session.contractionTables[selectedTable-1].File
}
return nil
}