Updated OpenFile and SaveFile to select file types

This commit is contained in:
Kirurobo
2021-11-28 23:36:05 +09:00
parent 81e1bb06b6
commit 9ff49a6966
6 changed files with 117 additions and 30 deletions

View File

@@ -86,6 +86,26 @@ struct ContentView: View {
var body: some View {
Text("File dialog test")
Button(action: {
var filter = Array("Png\tpng\nAll files\t*\nImages\tpng\tjpg\tjpeg\ttiff\n\0".utf16)
var title = Array("Select file\0".utf16)
var settings = LibUniWinC.PanelSettings(
structSize: Int32(MemoryLayout<LibUniWinC.PanelSettings>.size),
flags: 0,
titleText: &title,
filterText: &filter,
initialFile: nil,
initialDirectory: nil,
defaultExt: nil
)
let bufferSize = 2048
let buffer = UnsafeMutablePointer<UniChar>.allocate(capacity: bufferSize)
buffer.initialize(repeating: UniChar.zero, count: bufferSize)
LibUniWinC.openFilePanel(lpSettings: &settings, lpBuffer: buffer, bufferSize: UInt32(bufferSize))
}){ Text("Open") }
Text("Window info").padding()
Button(action: {

View File

@@ -20,6 +20,8 @@
73B2C7C027355B030053A44D /* OverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 731C6C6D25724025002E9709 /* OverlayView.swift */; };
73B2C7C127355B060053A44D /* LibUniWinC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73B2C7BC273559C80053A44D /* LibUniWinC.swift */; };
73B2C7C52736ACE00053A44D /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73B2C7C42736ACE00053A44D /* AppDelegate.swift */; };
73FC88632753777D0024BABB /* PanelWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73FC88622753777D0024BABB /* PanelWrapper.swift */; };
73FC886427537FEC0024BABB /* PanelWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73FC88622753777D0024BABB /* PanelWrapper.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -58,6 +60,7 @@
73B2C7C42736ACE00053A44D /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
73DFCB7722B8ED3300DA41F2 /* LibUniWinC.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LibUniWinC.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
73DFCB7A22B8ED3300DA41F2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
73FC88622753777D0024BABB /* PanelWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PanelWrapper.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -160,6 +163,7 @@
73575EF822BE18B200E9F019 /* LibUniWinC.mm */,
7306572424F1F87900FAB8BC /* README.md */,
731C6C6D25724025002E9709 /* OverlayView.swift */,
73FC88622753777D0024BABB /* PanelWrapper.swift */,
);
path = LibUniWinC;
sourceTree = "<group>";
@@ -348,6 +352,7 @@
73B2C7C127355B060053A44D /* LibUniWinC.swift in Sources */,
73B2C793273559A60053A44D /* DebugUniWinCApp.swift in Sources */,
73B2C7C52736ACE00053A44D /* AppDelegate.swift in Sources */,
73FC886427537FEC0024BABB /* PanelWrapper.swift in Sources */,
73B2C7C027355B030053A44D /* OverlayView.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -373,6 +378,7 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
73FC88632753777D0024BABB /* PanelWrapper.swift in Sources */,
73B2C7BD273559C80053A44D /* LibUniWinC.swift in Sources */,
731C6C6E25724025002E9709 /* OverlayView.swift in Sources */,
73575EF922BE18B200E9F019 /* LibUniWinC.mm in Sources */,
@@ -683,8 +689,8 @@
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "3rd Party Mac Developer Application";
CODE_SIGN_STYLE = Manual;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = F4K53USRZ7;
@@ -699,6 +705,7 @@
MARKETING_VERSION = 0.8.4;
PRODUCT_BUNDLE_IDENTIFIER = com.kirurobo.libuniwinc;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SKIP_INSTALL = YES;
SWIFT_OBJC_BRIDGING_HEADER = "";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@@ -711,8 +718,8 @@
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "3rd Party Mac Developer Application";
CODE_SIGN_STYLE = Manual;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = F4K53USRZ7;
@@ -727,6 +734,7 @@
MARKETING_VERSION = 0.8.4;
PRODUCT_BUNDLE_IDENTIFIER = com.kirurobo.libuniwinc;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SKIP_INSTALL = YES;
SWIFT_OBJC_BRIDGING_HEADER = "";
SWIFT_VERSION = 5.0;

View File

@@ -49,7 +49,7 @@ public class LibUniWinC : NSObject {
}
/// Flag constants for file dialog
private enum PanelFlag : Int32 {
public enum PanelFlag : Int32 {
case None = 0
case FileMustExist = 1
case FolderMustExist = 2
@@ -968,12 +968,12 @@ public class LibUniWinC : NSObject {
/// - bufferSize: Size of UTF-16 string buffer
@objc public static func openFilePanel(lpSettings: UnsafeRawPointer, lpBuffer: UnsafeMutablePointer<UniChar>?, bufferSize: UInt32) -> Bool {
let panel = NSOpenPanel()
let panelUtil = PanelWrapper(panel: panel)
let pPanelSettings = lpSettings.bindMemory(to: PanelSettings.self, capacity: MemoryLayout<PanelSettings>.size)
let ps = pPanelSettings.pointee
let initialDir = getStringFromUtf16Array(textPointer: ps.initialDirectory)
let initialFile = getStringFromUtf16Array(textPointer: ps.initialFile) as NSString
let fileTypes = getFileTypesArray(text: getStringFromUtf16Array(textPointer: ps.filterText))
if (targetWindow != nil && state.isTopmost) {
targetWindow?.level = NSWindow.Level.floating
@@ -981,7 +981,8 @@ public class LibUniWinC : NSObject {
panel.parent = targetWindow // Nil if not attatched
panel.allowsMultipleSelection = PanelFlag.AllowMultipleSelection.containedIn(value: ps.flags)
panel.showsHiddenFiles = PanelFlag.ShowHidden.containedIn(value: ps.flags)
panel.allowedFileTypes = fileTypes
//panel.allowedFileTypes = fileTypes
panelUtil.addFileTypes(text: getStringFromUtf16Array(textPointer: ps.filterText))
panel.message = getStringFromUtf16Array(textPointer: ps.titleText)
panel.title = getStringFromUtf16Array(textPointer: ps.titleText)
@@ -1038,12 +1039,12 @@ public class LibUniWinC : NSObject {
/// - bufferSize: Size of UTF-16 string buffer
@objc public static func openSavePanel(lpSettings: UnsafeRawPointer, lpBuffer: UnsafeMutablePointer<UniChar>?, bufferSize: UInt32) -> Bool {
let panel = NSSavePanel()
let panelUtil = PanelWrapper(panel: panel)
let pPanelSettings = lpSettings.bindMemory(to: PanelSettings.self, capacity: MemoryLayout<PanelSettings>.size)
let ps = pPanelSettings.pointee;
let initialDir = getStringFromUtf16Array(textPointer: ps.initialDirectory)
let initialFile = getStringFromUtf16Array(textPointer: ps.initialFile) as NSString
let fileTypes = getFileTypesArray(text: getStringFromUtf16Array(textPointer: ps.filterText))
if (targetWindow != nil && state.isTopmost) {
targetWindow?.level = NSWindow.Level.floating
@@ -1058,7 +1059,8 @@ public class LibUniWinC : NSObject {
panel.directoryURL = URL(fileURLWithPath: initialFile.deletingLastPathComponent, isDirectory: true)
}
panel.nameFieldStringValue = initialFile.lastPathComponent
panel.allowedFileTypes = fileTypes
//panel.allowedFileTypes = fileTypes
panelUtil.addFileTypes(text: getStringFromUtf16Array(textPointer: ps.filterText))
panel.allowsOtherFileTypes = true
panel.canCreateDirectories = true //PanelFlag.CanCreateDirectories.containedIn(value: ps.flags)
@@ -1105,26 +1107,6 @@ public class LibUniWinC : NSObject {
return String(utf16CodeUnits: textPointer!, count: len)
}
/// Convert filter text to array for allowedFileTypes
/// - Parameters:
/// - text: text = "TitleA(TAB)textA1(TAB)extA2(TAB)...extAn(LF)TitleB(TAB)extB1(TAB)extB2...extBn(LF)"
/// - Returns: [extA1, extA2, ..., extAn, extB1, extB2, ..., extBn]
private static func getFileTypesArray(text: String) -> [String] {
let items = text.components(separatedBy: "\n")
var array: [String] = []
for item in items {
// Drop the first element. Because titles are not supported on macOS yet.
array += item.components(separatedBy: "\t").dropFirst()
}
array.removeAll(where: { $0 == "" })
if (array.contains("*")) {
return [] // If "*" is included, it will eventually be equivalent to no extension specification.
} else {
return array
}
}
/// Call a StringCallback with UTF-16 paramete
/// - Parameters:
/// - callback: Registered callback function

View File

@@ -0,0 +1,77 @@
//
// OpenPanel.swift
// LibUniWinC
//
// Created by owner on 2021/11/28.
// Copyright © 2021 kirurobo. All rights reserved.
//
import Cocoa
import AppKit
class PanelWrapper {
public let panel : NSSavePanel
let customAccessoryView = NSView(frame: NSRect(x:0, y:0, width:400, height:40))
var popup = NSPopUpButton(frame: NSRect(x:120, y:5, width:200, height:25))
var label = NSTextField(frame: NSRect(x: 10, y:0, width: 100, height:25))
var shouldAddSubView : Bool = false
var extArray : [[String]?] = []
init(panel: NSSavePanel)
{
self.panel = panel
label.stringValue = "File type : "
//label.string = "File type : "
label.alignment = NSTextAlignment.right
label.isBordered = false
label.isSelectable = false
label.isEditable = false
label.backgroundColor = NSColor.clear
label.textColor = NSColor.white
popup.pullsDown = false
popup.action = #selector(onFileTypeChanged(_:))
popup.target = self
}
public func addFileType(title: String, ext: [String]?) -> Void {
popup.addItem(withTitle: title)
extArray.append(ext)
// subView
if (!shouldAddSubView) {
customAccessoryView.addSubview(label)
customAccessoryView.addSubview(popup)
panel.accessoryView = customAccessoryView
popup.selectItem(at: 0)
panel.allowedFileTypes = extArray.first ?? nil
shouldAddSubView = true;
}
}
/// Add filters for allowedFileTypes
/// - Parameters:
/// - panel: Custom panel
/// - text: text = "TitleA(TAB)textA1(TAB)extA2(TAB)...extAn(LF)TitleB(TAB)extB1(TAB)extB2...extBn(LF)"
public func addFileTypes(text: String) -> Void {
let items = text.components(separatedBy: "\n")
for item in items {
let array = Array(item.components(separatedBy: "\t"))
//
if (array.count > 1) {
// "*"
self.addFileType(
title: array.first!,
ext: (array.contains("*") ? nil : Array(array.dropFirst()))
)
}
}
}
@objc func onFileTypeChanged(_ sender: Any?) {
panel.allowedFileTypes = extArray[popup.indexOfSelectedItem]
}
}