Give mixed selections something to do

A Drag of different kinds showed an empty wheel, because the catalog only
answers for a single category. Filee's answer is a mixed profile, so add
Zip (one archive, flat names) and Merge (non-PDFs are converted to PDF
first); a multi-file drag of one kind gets Zip too.
This commit is contained in:
2026-10-20 01:30:42 +08:00
parent 2d031e58a4
commit a01d5def89
8 changed files with 295 additions and 41 deletions
+12 -11
View File
@@ -38,24 +38,30 @@ enum QuickMenu {
let category = FileKind.category(of: urls[0])
if ConversionCatalog.outputs(for: urls.map { FileKind.category(of: $0) }).isEmpty {
// The convert wheel also carries the combine tools, so it is empty only
// when there is genuinely nothing to offer.
let conversions = WheelBuilder.items(kind: .convert, urls: urls)
if conversions.isEmpty {
let item = NSMenuItem(title: "No conversions for this selection", action: nil, keyEquivalent: "")
item.isEnabled = false
menu.addItem(item)
} else {
let convert = NSMenu()
for item in WheelBuilder.items(kind: .convert, urls: urls) {
for item in conversions {
guard case .format(let target) = item.payload else { continue }
let entry = NSMenuItem(title: item.title, action: #selector(Choice.fire), keyEquivalent: "")
entry.target = makeChoice {
JobStore.shared.submit(urls: urls, target: .format(format(from: item)))
JobStore.shared.submit(urls: urls, target: .format(target))
}
entry.isEnabled = item.isEnabled
if let reason = item.availability.reason { entry.toolTip = reason }
convert.addItem(entry)
}
let submenu = NSMenuItem(title: "Convert", action: nil, keyEquivalent: "")
submenu.submenu = convert
menu.addItem(submenu)
if !convert.items.isEmpty {
let submenu = NSMenuItem(title: "Convert", action: nil, keyEquivalent: "")
submenu.submenu = convert
menu.addItem(submenu)
}
}
let tools = WheelBuilder.items(kind: .tools, urls: urls)
@@ -102,9 +108,4 @@ enum QuickMenu {
retained.append(choice)
return choice
}
private static func format(from item: WheelItem) -> Format {
if case .format(let format) = item.payload { return format }
return .png
}
}