Add space key scrolling for convert settings
This commit is contained in:
parent
61a9464d7f
commit
034f29e9b1
|
|
@ -551,6 +551,39 @@ func (f *FastVScroll) Scrolled(ev *fyne.ScrollEvent) {
|
||||||
f.scroll.Scrolled(fastEvent)
|
f.scroll.Scrolled(fastEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ScrollBy scrolls the content by a delta in pixels (positive = down).
|
||||||
|
func (f *FastVScroll) ScrollBy(delta float32) {
|
||||||
|
if f == nil || f.scroll == nil || f.scroll.Content == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
max := f.scroll.Content.MinSize().Height - f.scroll.Size().Height
|
||||||
|
if max < 0 {
|
||||||
|
max = 0
|
||||||
|
}
|
||||||
|
newY := f.scroll.Offset.Y + delta
|
||||||
|
if newY < 0 {
|
||||||
|
newY = 0
|
||||||
|
} else if newY > max {
|
||||||
|
newY = max
|
||||||
|
}
|
||||||
|
f.scroll.ScrollToOffset(fyne.NewPos(f.scroll.Offset.X, newY))
|
||||||
|
}
|
||||||
|
|
||||||
|
// PageStep returns a reasonable scroll step based on the current viewport.
|
||||||
|
func (f *FastVScroll) PageStep() float32 {
|
||||||
|
if f == nil || f.scroll == nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
height := f.scroll.Size().Height
|
||||||
|
if height <= 0 {
|
||||||
|
height = f.scroll.MinSize().Height
|
||||||
|
}
|
||||||
|
if height <= 0 {
|
||||||
|
height = 240
|
||||||
|
}
|
||||||
|
return height * 0.85
|
||||||
|
}
|
||||||
|
|
||||||
type fastScrollRenderer struct {
|
type fastScrollRenderer struct {
|
||||||
scroll *container.Scroll
|
scroll *container.Scroll
|
||||||
}
|
}
|
||||||
|
|
|
||||||
56
main.go
56
main.go
|
|
@ -505,18 +505,18 @@ func openFile(path string) error {
|
||||||
|
|
||||||
func generatePixelatedQRCode() (fyne.CanvasObject, error) {
|
func generatePixelatedQRCode() (fyne.CanvasObject, error) {
|
||||||
docURL := "https://docs.leaktechnologies.dev/VideoTools"
|
docURL := "https://docs.leaktechnologies.dev/VideoTools"
|
||||||
|
|
||||||
// Generate QR code with fewer pixels for a chunkier, blockier look
|
// Generate QR code with fewer pixels for a chunkier, blockier look
|
||||||
qrBytes, err := qrcode.Encode(docURL, qrcode.Low, 112)
|
qrBytes, err := qrcode.Encode(docURL, qrcode.Low, 112)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert to Fyne image with pixelated look
|
// Convert to Fyne image with pixelated look
|
||||||
img := canvas.NewImageFromReader(bytes.NewReader(qrBytes), "qrcode.png")
|
img := canvas.NewImageFromReader(bytes.NewReader(qrBytes), "qrcode.png")
|
||||||
img.FillMode = canvas.ImageFillOriginal // Keep pixelated look
|
img.FillMode = canvas.ImageFillOriginal // Keep pixelated look
|
||||||
img.SetMinSize(fyne.NewSize(112, 112))
|
img.SetMinSize(fyne.NewSize(112, 112))
|
||||||
|
|
||||||
return img, nil
|
return img, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -985,6 +985,7 @@ type appState struct {
|
||||||
inspectInterlaceAnalyzing bool
|
inspectInterlaceAnalyzing bool
|
||||||
autoCompare bool // Auto-load Compare module after conversion
|
autoCompare bool // Auto-load Compare module after conversion
|
||||||
convertCommandPreviewShow bool // Show FFmpeg command preview in Convert module
|
convertCommandPreviewShow bool // Show FFmpeg command preview in Convert module
|
||||||
|
convertScrollShortcuts bool
|
||||||
|
|
||||||
// Merge state
|
// Merge state
|
||||||
mergeClips []mergeClip
|
mergeClips []mergeClip
|
||||||
|
|
@ -6999,6 +7000,11 @@ func buildConvertView(state *appState, src *videoSource) fyne.CanvasObject {
|
||||||
var updateDVDOptions func()
|
var updateDVDOptions func()
|
||||||
var buildCommandPreview func()
|
var buildCommandPreview func()
|
||||||
|
|
||||||
|
// Declare output widgets early to fix variable order issues
|
||||||
|
var outputExtLabel *widget.Label
|
||||||
|
var outputExtBG *canvas.Rectangle
|
||||||
|
var updateOutputHint func()
|
||||||
|
|
||||||
var formatLabels []string
|
var formatLabels []string
|
||||||
for _, opt := range formatOptions {
|
for _, opt := range formatOptions {
|
||||||
formatLabels = append(formatLabels, opt.Label)
|
formatLabels = append(formatLabels, opt.Label)
|
||||||
|
|
@ -9097,6 +9103,50 @@ func buildConvertView(state *appState, src *videoSource) fyne.CanvasObject {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !state.convertScrollShortcuts && state.window != nil {
|
||||||
|
state.convertScrollShortcuts = true
|
||||||
|
isTextEntryFocused := func() bool {
|
||||||
|
c := state.window.Canvas()
|
||||||
|
if c == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
switch c.Focused().(type) {
|
||||||
|
case *widget.Entry, *widget.MultiLineEntry:
|
||||||
|
return true
|
||||||
|
default:
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
scrollActive := func() *ui.FastVScroll {
|
||||||
|
if tabs.Selected() != nil && tabs.Selected().Text == "Advanced" {
|
||||||
|
return advancedScrollBox
|
||||||
|
}
|
||||||
|
return simpleScrollBox
|
||||||
|
}
|
||||||
|
|
||||||
|
state.window.Canvas().AddShortcut(&desktop.CustomShortcut{KeyName: fyne.KeySpace}, func(_ fyne.Shortcut) {
|
||||||
|
if state.active != "convert" || isTextEntryFocused() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
scroll := scrollActive()
|
||||||
|
if scroll == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
scroll.ScrollBy(scroll.PageStep())
|
||||||
|
})
|
||||||
|
state.window.Canvas().AddShortcut(&desktop.CustomShortcut{KeyName: fyne.KeySpace, Modifier: fyne.KeyModifierControl}, func(_ fyne.Shortcut) {
|
||||||
|
if state.active != "convert" || isTextEntryFocused() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
scroll := scrollActive()
|
||||||
|
if scroll == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
scroll.ScrollBy(-scroll.PageStep())
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
optionsRect := canvas.NewRectangle(utils.MustHex("#13182B"))
|
optionsRect := canvas.NewRectangle(utils.MustHex("#13182B"))
|
||||||
optionsRect.CornerRadius = 8
|
optionsRect.CornerRadius = 8
|
||||||
optionsRect.StrokeColor = gridColor
|
optionsRect.StrokeColor = gridColor
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user