Enable Compare module and add smart target file size presets

Compare Module:
- Enable Compare button on main menu (was inactive)
- Module now clickable and functional
- Shows side-by-side video comparison interface

Smart Target File Size:
- Replace simple text entry with intelligent dropdown
- Calculates smart reduction options based on source file size:
  * 75% reduction (source × 0.25)
  * 50% reduction (source × 0.50)
  * 33% reduction (source × 0.67)
- Shows reduction percentage in dropdown labels
- Includes common preset sizes: 25MB, 50MB, 100MB, 200MB, 500MB, 1GB
- Manual entry option for custom sizes
- Entry field hides when preset selected, shows for manual
- Dynamically updates options when video loaded

UI Improvements:
- Dropdown shows "XMB (Y% smaller)" format for smart options
- Parses dropdown value to extract size (handles both formats)
- Manual mode shows entry field with placeholder
- Smart options only shown if resulting size is reasonable (>5MB minimum)
This commit is contained in:
Stu Leak 2025-12-03 22:06:14 -05:00
parent b9cfc5b7c3
commit 3d2e5e18a3

73
main.go
View File

@ -430,7 +430,7 @@ func (s *appState) showMainMenu() {
ID: m.ID,
Label: m.Label,
Color: m.Color,
Enabled: m.ID == "convert", // Only convert module is functional
Enabled: m.ID == "convert" || m.ID == "compare", // Convert and compare modules are functional
})
}
@ -2061,9 +2061,75 @@ func buildConvertView(state *appState, src *videoSource) fyne.CanvasObject {
state.convert.VideoBitrate = val
}
// Target File Size entry (for Target Size mode)
// Target File Size with smart presets + manual entry
targetFileSizeEntry := widget.NewEntry()
targetFileSizeEntry.SetPlaceHolder("e.g., 25MB, 100MB, 8MB")
var targetFileSizeSelect *widget.Select
updateTargetSizeOptions := func() {
if src == nil {
targetFileSizeSelect.Options = []string{"Manual", "25MB", "50MB", "100MB", "200MB", "500MB", "1GB"}
return
}
// Calculate smart reduction options based on source file size
srcPath := src.Path
fileInfo, err := os.Stat(srcPath)
if err != nil {
targetFileSizeSelect.Options = []string{"Manual", "25MB", "50MB", "100MB", "200MB", "500MB", "1GB"}
return
}
srcSize := fileInfo.Size()
srcSizeMB := float64(srcSize) / (1024 * 1024)
// Calculate smart reductions
size33 := int(srcSizeMB * 0.67) // 33% reduction
size50 := int(srcSizeMB * 0.50) // 50% reduction
size75 := int(srcSizeMB * 0.25) // 75% reduction
options := []string{"Manual"}
if size75 > 5 {
options = append(options, fmt.Sprintf("%dMB (75%% smaller)", size75))
}
if size50 > 10 {
options = append(options, fmt.Sprintf("%dMB (50%% smaller)", size50))
}
if size33 > 15 {
options = append(options, fmt.Sprintf("%dMB (33%% smaller)", size33))
}
// Add common sizes
options = append(options, "25MB", "50MB", "100MB", "200MB", "500MB", "1GB")
targetFileSizeSelect.Options = options
}
targetFileSizeSelect = widget.NewSelect([]string{"Manual", "25MB", "50MB", "100MB", "200MB", "500MB", "1GB"}, func(value string) {
if value == "Manual" {
targetFileSizeEntry.Show()
targetFileSizeEntry.SetText(state.convert.TargetFileSize)
} else {
// Extract size from selection (handle "XMB (Y% smaller)" format)
var sizeStr string
if strings.Contains(value, "(") {
// Format: "50MB (50% smaller)"
sizeStr = strings.TrimSpace(strings.Split(value, "(")[0])
} else {
// Format: "100MB"
sizeStr = value
}
state.convert.TargetFileSize = sizeStr
targetFileSizeEntry.SetText(sizeStr)
targetFileSizeEntry.Hide()
}
logging.Debug(logging.CatUI, "target file size set to %s", state.convert.TargetFileSize)
})
targetFileSizeSelect.SetSelected("Manual")
updateTargetSizeOptions()
targetFileSizeEntry.SetText(state.convert.TargetFileSize)
targetFileSizeEntry.OnChanged = func(val string) {
state.convert.TargetFileSize = val
@ -2239,7 +2305,8 @@ func buildConvertView(state *appState, src *videoSource) fyne.CanvasObject {
crfEntry,
widget.NewLabelWithStyle("Video Bitrate (for CBR/VBR)", fyne.TextAlignLeading, fyne.TextStyle{Bold: true}),
videoBitrateEntry,
widget.NewLabelWithStyle("Target File Size (e.g., 25MB, 100MB)", fyne.TextAlignLeading, fyne.TextStyle{Bold: true}),
widget.NewLabelWithStyle("Target File Size", fyne.TextAlignLeading, fyne.TextStyle{Bold: true}),
targetFileSizeSelect,
targetFileSizeEntry,
widget.NewLabelWithStyle("Target Resolution", fyne.TextAlignLeading, fyne.TextStyle{Bold: true}),
resolutionSelect,