Turn Convert into Cancel button

This commit is contained in:
Milan Nikolic
2026-06-24 19:53:27 +02:00
parent 26a320ef9d
commit f65fc4bafa
+53 -13
View File
@@ -36,6 +36,9 @@ var (
files []cbconvert.File
config iup.Ihandle
activeConv *cbconvert.Converter
busy bool
)
const (
@@ -223,6 +226,10 @@ func options() cbconvert.Options {
}
func setActive() {
if busy {
return
}
opts := options()
count := iup.GetHandle("Table").GetInt("NUMLIN")
@@ -1162,7 +1169,7 @@ func buttons() iup.Ihandle {
SetAttribute("TIP", "Save current settings to a profile").
SetCallback("ACTION", iup.ActionFunc(onSave))
command := iup.Button("Command").SetAttributes("PADDING=DEFAULTBUTTONPADDING").
command := iup.Button("Command").SetHandle("Command").SetAttributes("PADDING=DEFAULTBUTTONPADDING").
SetAttribute("TIP", "Show the equivalent command line").
SetCallback("ACTION", iup.ActionFunc(onCommand))
@@ -1208,7 +1215,7 @@ func status() iup.Ihandle {
iup.Space().SetAttribute("SIZE", "5"),
iup.Label("(000/000)").SetHandle("LabelStatus2").SetAttributes("VISIBLE=NO"),
iup.Space().SetAttribute("SIZE", "5"),
iup.ProgressBar().SetAttributes("RASTERSIZE=200x, VISIBLE=NO").SetHandle("ProgressBar").
iup.ProgressBar().SetAttributes("VISIBLE=NO").SetHandle("ProgressBar").
SetCallback("POSTMESSAGE_CB", iup.PostMessageFunc(func(ih iup.Ihandle, s string, i int, p any) int {
switch s {
case "convert":
@@ -1216,10 +1223,6 @@ func status() iup.Ihandle {
ih.SetAttributes("VALUE=0, VISIBLE=YES")
ih.SetAttribute("MAX", conv.Ncontents)
iup.GetHandle("Table").SetAttributes("ACTIVE=NO")
iup.GetHandle("Tabs").SetAttributes("ACTIVE=NO")
iup.GetHandle("Buttons").SetAttributes("ACTIVE=NO")
iup.GetHandle("LabelStatus1").SetAttribute("TITLE", fmt.Sprintf("File %d of %d", conv.CurrFile, conv.Nfiles))
iup.GetHandle("LabelStatus1").SetAttributes("VISIBLE=YES")
iup.GetHandle("LabelStatus2").SetAttributes("VISIBLE=YES")
@@ -1230,10 +1233,6 @@ func status() iup.Ihandle {
ih.SetAttributes("VALUE=0, VISIBLE=YES")
ih.SetAttribute("MAX", conv.Nfiles)
iup.GetHandle("Table").SetAttributes("ACTIVE=NO")
iup.GetHandle("Tabs").SetAttributes("ACTIVE=NO")
iup.GetHandle("Buttons").SetAttributes("ACTIVE=NO")
iup.GetHandle("LabelStatus2").SetAttributes("VISIBLE=YES")
case "progress":
conv := p.(*cbconvert.Converter)
@@ -1248,9 +1247,7 @@ func status() iup.Ihandle {
iup.Refresh(iup.GetHandle("StatusBar"))
case "finish":
iup.GetHandle("Table").SetAttributes("ACTIVE=YES")
iup.GetHandle("Tabs").SetAttributes("ACTIVE=YES")
iup.GetHandle("Buttons").SetAttributes("ACTIVE=YES")
setBusy(false)
iup.GetHandle("LabelStatus1").SetAttributes(`TITLE="", VISIBLE=NO`)
iup.GetHandle("LabelStatus2").SetAttributes(`TITLE="", VISIBLE=NO`)
@@ -1392,6 +1389,8 @@ func onRemoveAll(ih iup.Ihandle) int {
func onThumbnail(ih iup.Ihandle) int {
conv := cbconvert.New(options())
conv.Nfiles = len(files)
activeConv = conv
setBusy(true)
conv.OnProgress = func() {
iup.PostMessage(iup.GetHandle("ProgressBar"), "progress2", 0, conv)
@@ -1435,6 +1434,8 @@ func onThumbnail(ih iup.Ihandle) int {
func onCover(ih iup.Ihandle) int {
conv := cbconvert.New(options())
conv.Nfiles = len(files)
activeConv = conv
setBusy(true)
conv.OnProgress = func() {
iup.PostMessage(iup.GetHandle("ProgressBar"), "progress2", 0, conv)
@@ -1475,9 +1476,48 @@ func onCover(ih iup.Ihandle) int {
return iup.DEFAULT
}
// setBusy locks the UI while an operation runs and turns Convert into a Cancel button.
func setBusy(on bool) {
busy = on
// Controls not governed by setActive; setActive owns the rest.
always := "YES"
if on {
always = "NO"
}
for _, h := range []string{"AddFiles", "AddDir", "Profile", "Reset", "Save", "Command", "Tabs", "Table"} {
iup.GetHandle(h).SetAttribute("ACTIVE", always)
}
convert := iup.GetHandle("Convert")
if on {
for _, h := range []string{"Remove", "RemoveAll", "Thumbnail", "Cover"} {
iup.GetHandle(h).SetAttribute("ACTIVE", "NO")
}
convert.SetAttribute("ACTIVE", "YES")
convert.SetAttribute("TITLE", "Cancel")
convert.SetAttribute("TIP", "Cancel the running operation (or press Esc)")
} else {
activeConv = nil
convert.SetAttribute("TITLE", "&Convert")
convert.SetAttribute("TIP", "Convert files to the selected format")
setActive() // restores the conditional buttons and option boxes
}
}
func onConvert(ih iup.Ihandle) int {
if busy {
if activeConv != nil {
activeConv.Cancel()
}
return iup.DEFAULT
}
conv := cbconvert.New(options())
conv.Nfiles = len(files)
activeConv = conv
setBusy(true)
conv.OnStart = func() {
iup.PostMessage(iup.GetHandle("ProgressBar"), "convert", 0, conv)