Updated OpenFile and SaveFile to select file types
This commit is contained in:
@@ -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: {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
77
Xcode/LibUniWinC/PanelWrapper.swift
Normal file
77
Xcode/LibUniWinC/PanelWrapper.swift
Normal 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"))
|
||||
|
||||
// タイトルと拡張子で要素は2以上必要
|
||||
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]
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user