Code Monkey home page Code Monkey logo

unitystandalonefilebrowser's Introduction

Unity Standalone File Browser

A simple wrapper for native file dialogs on Windows/Mac/Linux.

  • Works in editor and runtime.
  • Open file/folder, save file dialogs supported.
  • Multiple file selection.
  • File extension filter.
  • Mono/IL2CPP backends supported.
  • Linux support by Ricardo Rodrigues.
  • Basic WebGL support.

Download Package

Example usage:

// Open file
var paths = StandaloneFileBrowser.OpenFilePanel("Open File", "", "", false);

// Open file async
StandaloneFileBrowser.OpenFilePanelAsync("Open File", "", "", false, (string[] paths) => {  });

// Open file with filter
var extensions = new [] {
    new ExtensionFilter("Image Files", "png", "jpg", "jpeg" ),
    new ExtensionFilter("Sound Files", "mp3", "wav" ),
    new ExtensionFilter("All Files", "*" ),
};
var paths = StandaloneFileBrowser.OpenFilePanel("Open File", "", extensions, true);

// Save file
var path = StandaloneFileBrowser.SaveFilePanel("Save File", "", "", "");

// Save file async
StandaloneFileBrowser.SaveFilePanelAsync("Save File", "", "", "", (string path) => {  });

// Save file with filter
var extensionList = new [] {
    new ExtensionFilter("Binary", "bin"),
    new ExtensionFilter("Text", "txt"),
};
var path = StandaloneFileBrowser.SaveFilePanel("Save File", "", "MySaveFile", extensionList);

See Sample/BasicSampleScene.unity for more detailed examples.

Mac Screenshot Alt text

Windows Screenshot Alt text

Linux Screenshot Alt text

Notes:

  • Windows

    • Requires .NET 2.0 api compatibility level
    • Async dialog opening not implemented, ..Async methods simply calls regular sync methods.
    • Plugin import settings should be like this;

    Alt text Alt text

  • Mac

    • Sync calls are throws an exception at development build after native panel loses and gains focus. Use async calls to avoid this.

WebGL:

  • Basic upload/download file support.
  • File filter support.
  • Not well tested, probably not much reliable.
  • Since browsers require more work to do file operations, webgl isn't directly implemented to Open/Save calls. You can check CanvasSampleScene.unity and canvas sample scripts for example usages.

Live Demo: https://gkngkc.github.io/

unitystandalonefilebrowser's People

Contributors

gkngkc avatar gokhangokce-infosfer avatar ricardoeprodrigues avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

unitystandalonefilebrowser's Issues

Windows Namespace missing

Sorry it may be simple error. i am getting "The type or namespace name Windows' does not exist in the namespace System'. Are you missing an assembly reference?"

can any one help me in this.
Thanks

SaveFilePanel crashes the plugin in a Mac App Store build

Sorry to bother you again, Gökhan.

The following code crashes the plugin on a macOS build for the Mac App Store (i.e. built with Mac App Store Validation enabled in Unity, then codesigned and packaged, then installed from the package):

Debug.Log("before StandaloneFileBrowser.SaveFilePanel");
string path = SFB.StandaloneFileBrowser.SaveFilePanel("Export", "", "something", "pdf");
Debug.Log("path: " + path);

The crash results in the following in Unity's Player.log file:

before StandaloneFileBrowser.SaveFilePanel
 
(Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)

2018-11-15 15:22:36.282 Our Application[17987:3915399] init
2018-11-15 15:22:36.390 Our Application[17987:3915399] *** Assertion failure in -[NSVBSavePanel viewWillInvalidate:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/AppKit/AppKit-1671/Nav.subproj/OpenAndSavePanelRemote/NSVBOpenAndSavePanels.m:374
2018-11-15 15:22:36.391 Our Application[17987:3915399] -[NSVBSavePanel init] caught non-fatal NSObjectNotAvailableException 'service com.apple.appkit.xpc.openAndSavePanelService failed to init an instance of NSSavePanelService on behalf of <NSRemoteView: 0x600003308460> due to {
    callStackSymbols = (
	0   CoreFoundation                      0x00007fff4663943d __exceptionPreprocess + 256
	1   libobjc.A.dylib                     0x00007fff72546720 objc_exception_throw + 48
	2   CoreFoundation                      0x00007fff4663926f +[NSException raise:format:] + 201
	3   com.apple.appkit.xpc.openAndSavePanelService 0x000000010258b204 com.apple.appkit.xpc.openAndSavePanelService + 8708
	4   AppKit                              0x00007fff43c5d10b -[NSViewController _loadViewIfRequired] + 75
	5   AppKit                              0x00007fff43c5d076 -[NSViewController view] + 30
	6   ViewBridge                          0x00007fff6f644ac3 -[NSViewServiceMarshal _bootstrap:replyData:] + 2899
	7   ViewBridge                          0x00007fff6f646047 -[NSViewServiceMarshal bootstrap:withReply:] + 167
	8   CoreFoundation                      0x00007fff4658ef8c __invoking___ + 140
	9   CoreFoundation                      0x00007fff4658ee5f -[NSInvocation invoke] + 311
	10  CoreFoundation                      0x00007fff465f053d -[NSInvocation invokeWithTarget:] + 56
	11  ViewBridge                          0x00007fff6f68baaf -[NSVB_ViewServiceImplicitAnimationDecodingProxy forwardInvocation:] + 85
	12  CoreFoundation                      0x00007fff465d880e ___forwarding___ + 780
	13  CoreFoundation                      0x00007fff465d8478 _CF_forwarding_prep_0 + 120
	14  CoreFoundation                      0x00007fff4658ef8c __invoking___ + 140
	15  CoreFoundation                      0x00007fff4658ee5f -[NSInvocation invoke] + 311
	16  CoreFoundation                      0x00007fff465f053d -[NSInvocation invokeWithTarget:] + 56
	17  ViewBridge                          0x00007fff6f653973 -[NSVB_QueueingProxy forwardInvocation:] + 324
	18  CoreFoundation                      0x00007fff465d880e ___forwarding___ + 780
	19  CoreFoundation                      0x00007fff465d8478 _CF_forwarding_prep_0 + 120
	20  CoreFoundation                      0x00007fff4658ef8c __invoking___ + 140
	21  CoreFoundation                      0x00007fff4658ee5f -[NSInvocation invoke] + 311
	22  CoreFoundation                      0x00007fff465f053d -[NSInvocation invokeWithTarget:] + 56
	23  CoreFoundation                      0x00007fff465d880e ___forwarding___ + 780
	24  CoreFoundation                      0x00007fff465d8478 _CF_forwarding_prep_0 + 120
	25  CoreFoundation                      0x00007fff4658ef8c __invoking___ + 140
	26  CoreFoundation                      0x00007fff4658ee5f -[NSInvocation invoke] + 311
	27  ViewBridge                          0x00007fff6f6206cd __deferNSXPCInvocationOntoMainThread_block_invoke + 237
	28  ViewBridge                          0x00007fff6f615af3 __wrapBlockWithVoucher_block_invoke + 37
	29  ViewBridge                          0x00007fff6f6158a4 __deferBlockOntoMainThread_block_invoke_2 + 553
	30  CoreFoundation                      0x00007fff465bcca7 __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12
	31  CoreFoundation                      0x00007fff4657fced __CFRunLoopDoBlocks + 395
	32  CoreFoundation                      0x00007fff4657fa49 __CFRunLoopRun + 2834
	33  CoreFoundation                      0x00007fff4657ece4 CFRunLoopRunSpecific + 463
	34  HIToolbox                           0x00007fff45818895 RunCurrentEventLoopInMode + 293
	35  HIToolbox                           0x00007fff458185cb ReceiveNextEventCommon + 618
	36  HIToolbox                           0x00007fff45818348 _BlockUntilNextEventMatchingListInModeWithFilter + 64
	37  AppKit                              0x00007fff43ad595b _DPSNextEvent + 997
	38  AppKit                              0x00007fff43ad46fa -[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 1362
	39  ViewBridge                          0x00007fff6f61e226 -[NSViewServiceApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 92
	40  AppKit                              0x00007fff43ace75d -[NSApplication run] + 699
	41  AppKit                              0x00007fff43abde97 NSApplicationMain + 780
	42  libxpc.dylib                        0x00007fff7384af1f _xpc_objc_main + 612
	43  libxpc.dylib                        0x00007fff7384a9e5 _xpc_copy_xpcservice_dictionary + 0
	44  ViewBridge                          0x00007fff6f60fa76 xpc_connection_handler + 0
	45  ViewBridge                          0x00007fff6f618a03 NSViewServiceApplicationMain + 2877
	46  com.apple.appkit.xpc.openAndSavePanelService 0x00000001025904ea main + 208
	47  libdyld.dylib                       0x00007fff73614085 start + 1
);
    name = NSInternalInconsistencyException;
    reason = "+[NSOpenAndSavePanelService loadViewToService:isOpenPanel:appCentric:] : failed entitlements check";
    userInfo = "<null>";
}' with backtrace (
	0   CoreFoundation                      0x00007fff4663943d __exceptionPreprocess + 256
	1   libobjc.A.dylib                     0x00007fff72546720 objc_exception_throw + 48
	2   ViewBridge                          0x00007fff6f671b00 -[NSRemoteView _advanceToConfigPhaseLegacy] + 1593
	3   ViewBridge                          0x00007fff6f672845 -[NSRemoteView _viewServiceMarshalProxy:withDetailedErrorHandler:] + 217
	4   ViewBridge                          0x00007fff6f672c1a -[NSRemoteView _viewServiceMarshalProxy:withErrorHandler:] + 73
	5   ViewBridge                          0x00007fff6f6613c0 -[NSRemoteView _bridge] + 393
	6   ViewBridge                          0x00007fff6f661211 -[NSRemoteView bridge] + 30
	7   AppKit                              0x00007fff43e2c5fa -[NSVBSavePanel init] + 290
	8   AppKit                              0x00007fff43e2c119 +[NSSavePanel _crunchyRawUnbonedPanel] + 75
	9   StandaloneFileBrowser               0x000000010e3429f8 -[StandaloneFileBrowser createSavePanel:directory:defaultName:filters:] + 167
	10  StandaloneFileBrowser               0x000000010e342848 -[StandaloneFileBrowser dialogSaveFilePanel:directory:defaultName:filters:] + 19
	11  StandaloneFileBrowser               0x000000010e341ed9 DialogSaveFilePanel + 224
	12  ???                                 0x0000000110e56063 0x0 + 4578435171
)
path: 

The crucial part seems to be "service com.apple.appkit.xpc.openAndSavePanelService failed to init an instance of NSSavePanelService".

The error affects only the plugin (the app itself does not crash), which returns an empty path without opening the save file dialog at all. This does not happen on a standalone macOS build from Unity (i.e. not prepared for the store), which is very strange. StandaloneFileBrowser.OpenFilePanel seems to work regardless of SaveFilePanel not working. Could this be a permissions issue that doesn't happen for non-store builds?

It happens on both a recent iMac with Mojave (the error above is from that) and a very old MacBook Pro from 2010 with High Sierra 10.13.6. We are using the current unitypackage from your repository's "Package" folder.

Any ideas? :)

Cheers!
Daniel Lobo

Is there a way to load local image with only file path string in WebGL?

I am going to load local image files in web GL.
I use file path string without open dialog.
Is it possible with your code?

what does it means? What is the parameter of "UploadFile" method?
[DllImport("__Internal")] private static extern void UploadFile(string id); public void OnPointerDown(PointerEventData eventData) { UploadFile(gameObject.name); }

ArgumentException: The Assembly System.Drawing is referenced by System.Windows.Forms ('Assets/UnityStandaloneFileBrowser-master/Assets/StandaloneFileBrowser/Plugins/System.Windows.Forms.dll'). But the dll is not allowed to be included or could not be found.

Hi,

This time a have an issue:

ArgumentException: The Assembly System.Drawing is referenced by System.Windows.Forms ('Assets/UnityStandaloneFileBrowser-master/Assets/StandaloneFileBrowser/Plugins/System.Windows.Forms.dll'). But the dll is not allowed to be included or could not be found.
UnityEditor.AssemblyHelper.AddReferencedAssembliesRecurse (System.String assemblyPath, System.Collections.Generic.List`1 alreadyFoundAssemblies, System.String[] allAssemblyPaths, System.String[] foldersToSearch, System.Collections.Generic.Dictionary`2 cache, BuildTarget target) (at C:/buildslave/unity/build/Editor/Mono/AssemblyHelper.cs:146)
UnityEditor.AssemblyHelper.AddReferencedAssembliesRecurse (System.String assemblyPath, System.Collections.Generic.List`1 alreadyFoundAssemblies, System.String[] allAssemblyPaths, System.String[] foldersToSearch, System.Collections.Generic.Dictionary`2 cache, BuildTarget target) (at C:/buildslave/unity/build/Editor/Mono/AssemblyHelper.cs:152)
UnityEditor.AssemblyHelper.AddReferencedAssembliesRecurse (System.String assemblyPath, System.Collections.Generic.List`1 alreadyFoundAssemblies, System.String[] allAssemblyPaths, System.String[] foldersToSearch, System.Collections.Generic.Dictionary`2 cache, BuildTarget target) (at C:/buildslave/unity/build/Editor/Mono/AssemblyHelper.cs:152)
UnityEditor.AssemblyHelper.FindAssembliesReferencedBy (System.String[] paths, System.String[] foldersToSearch, BuildTarget target) (at C:/buildslave/unity/build/Editor/Mono/AssemblyHelper.cs:184)
UnityEditor.HostView:OnGUI()

All works great in the Unity Editor, but when I build I CANNOT run the build.

image

ArgumentException of System.Windows.Forms.dll

Issue found when Making Window Standalone Build using Mac
OSX : 10.11.6
Unity : 5.6.1p1

ArgumentException: The Assembly System.Drawing is referenced by System.Windows.Forms ('Assets/StandaloneFileBrowser/Plugins/System.Windows.Forms.dll'). But the dll is not allowed to be included or could not be found.

Windows ASync

Hi, I am looking to add support for ASync with Windows, but I just wanted to see if there was a reason that isn't done currently,
thanks!

WebGL issue

I tried these two blocks of code in WebGL, but both throw an exception (they both work perfectly fine on desktop). Is the source code for the webGL demo available anywhere? Maybe I could copy the code from there.

SFB.ExtensionFilter[] filters = new SFB.ExtensionFilter[]
{
            new SFB.ExtensionFilter("Images",new string[] {"png","jpg"})
};
s = SFB.StandaloneFileBrowser.OpenFilePanel("Open Image", "", filters, false);

 string path = SFB.StandaloneFileBrowser.SaveFilePanel("Save your Form", "", "Form", "png");

Both throw this error:
Uncaught Assertion failed: klass->initialized, at: C:\Program Files\Unity\Editor\Data\il2cpp\libil2cpp\vm/Class.h,97,GetInterfaceInvokeDataFromVTable at Error
at jsStackTrace (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:1325:12)
at stackTrace (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:1339:11)
at ___assert_fail (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:14364:207)
at ___assert_fail (eval at loadDynamicLibrary (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:766:19), :1298:41)
at __ZN21InterfaceFuncInvoker4IP24StringU5BU5D_t1642385972P8String_tS3_P33ExtensionFilterU5BU5D_t2751301106bE6InvokeEjP11Il2CppClassP12Il2CppObjectS3_S3_S5_b [InterfaceFuncInvoker4<StringU5BU5D_t1642385972*, String_t*, String_t*, ExtensionFilterU5BU5D_t2751301106*, bool>::Invoke(unsigned int, Il2CppClass*, Il2CppObject*, String_t*, String_t*, ExtensionFilterU5BU5D_t2751301106*, bool)] (eval at loadDynamicLibrary (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:766:19), :316116:59)
at _StandaloneFileBrowser_OpenFilePanel_m846962723 (eval at loadDynamicLibrary (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:766:19), :440825:9)
at Array._ImagePicker_OnButtonDown_m3895149047 (eval at loadDynamicLibrary (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:766:19), :68547:15)
at mftCall_vii (eval at loadDynamicLibrary (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:766:19), :599113:37)
at _UnityAction_Invoke_m2683711928 (eval at loadDynamicLibrary (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:766:19), :437561:116)
at _InvokableCall_Invoke_m608604614 (eval at loadDynamicLibrary (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:766:19), :598077:80)
at _UnityEvent_Invoke_m4265454736 (eval at loadDynamicLibrary (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:766:19), :393507:10)
at _Button_Press_m73991540 (eval at loadDynamicLibrary (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:766:19), :490240:4)
at Array._Button_OnPointerClick_m2524861687 (eval at loadDynamicLibrary (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:766:19), :624943:36)
at mftCall_viii (eval at loadDynamicLibrary (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:766:19), :585721:38)
at _ZN23InterfaceActionInvoker1IP28PointerEventData_t1599784723E6InvokeEjP11Il2CppClassP12Il2CppObjectS1 [InterfaceActionInvoker1<PointerEventData_t1599784723*>::Invoke(unsigned int, Il2CppClass*, Il2CppObject*, PointerEventData_t1599784723*)] (eval at loadDynamicLibrary (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:766:19), :332877:2)
at Array._ExecuteEvents_Execute_m2476343313 (eval at loadDynamicLibrary (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:766:19), :461746:2)
at mftCall_viiii (eval at loadDynamicLibrary (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:766:19), :575185:39)
at _EventFunction_1_Invoke_m2378823590_gshared (eval at loadDynamicLibrary (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:766:19), :429209:4)
at Array.asm._EventFunction_1_Invoke_m2378823590_gshared (eval at loadDynamicLibrary (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:766:19), :743930:59)
at Object.ftCall_viiii [as dynCall_viiii] (eval at loadDynamicLibrary (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:766:19), :4268:49)
at invoke_viiii (eval at loadDynamicLibrary (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:766:19), :4255:27)
at _ExecuteEvents_Execute_TisRuntimeObject_m4168308247_gshared (eval at loadDynamicLibrary (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:766:19), :123093:6)
at _StandaloneInputModule_ProcessMousePress_m3394019419 (eval at loadDynamicLibrary (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:766:19), :108106:4)
at _StandaloneInputModule_ProcessMouseEvent_m3217430289 (eval at loadDynamicLibrary (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:766:19), :233387:2)
at Array._StandaloneInputModule_Process_m2811362425 (eval at loadDynamicLibrary (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:766:19), :417288:87)
at mftCall_vii (eval at loadDynamicLibrary (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:766:19), :599113:37)
at Array._EventSystem_Update_m3937231239 (eval at loadDynamicLibrary (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:766:19), :221061:5)
at mftCall_vii (eval at loadDynamicLibrary (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:766:19), :599113:37)
at _Z31RuntimeInvoker_Void_t1841601450PFvvEPK10MethodInfoPvPS4 [RuntimeInvoker_Void_t1841601450(void ()(), MethodInfo const, void*, void**)] (eval at loadDynamicLibrary (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:766:19), :618793:2)
at Array.asm._Z31RuntimeInvoker_Void_t1841601450PFvvEPK10MethodInfoPvPS4 [RuntimeInvoker_Void_t1841601450(void ()(), MethodInfo const, void*, void**)] (eval at loadDynamicLibrary (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:766:19), :771236:77)
at Object.ftCall_iiiii [as dynCall_iiiii] (eval at loadDynamicLibrary (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:766:19), :3877:49)
at invoke_iiiii (eval at loadDynamicLibrary (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:766:19), :3864:34)
at __ZN6il2cpp2vm7Runtime6InvokeEPK10MethodInfoPvPS5_PP15Il2CppException [il2cpp::vm::Runtime::Invoke(MethodInfo const*, void*, void**, Il2CppException**)] (eval at loadDynamicLibrary (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:766:19), :439869:8)
at _il2cpp_runtime_invoke (eval at loadDynamicLibrary (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:766:19), :570274:9)
at asm._il2cpp_runtime_invoke (eval at loadDynamicLibrary (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:766:19), :753032:38)
at _il2cpp_runtime_invoke (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:11749:42)
at __Z23scripting_method_invoke18ScriptingMethodPtr18ScriptingObjectPtrR18ScriptingArgumentsP21ScriptingExceptionPtrb [scripting_method_invoke(ScriptingMethodPtr, ScriptingObjectPtr, ScriptingArguments&, ScriptingExceptionPtr*, bool)] (blob:http://localhost:51238/f787593b-8df2-4bda-acfc-25e82f2ed536:2696456:8)
at __ZN19ScriptingInvocation6InvokeEP21ScriptingExceptionPtrb [ScriptingInvocation::Invoke(ScriptingExceptionPtr*, bool)] (blob:http://localhost:51238/f787593b-8df2-4bda-acfc-25e82f2ed536:2083494:7)
at __ZN13MonoBehaviour16CallUpdateMethodEi [MonoBehaviour::CallUpdateMethod(int)] (blob:http://localhost:51238/f787593b-8df2-4bda-acfc-25e82f2ed536:1810363:4)
at __ZN13MonoBehaviour6UpdateEv [MonoBehaviour::Update()] (blob:http://localhost:51238/f787593b-8df2-4bda-acfc-25e82f2ed536:2935647:2)
at mftCall_vi (blob:http://localhost:51238/f787593b-8df2-4bda-acfc-25e82f2ed536:2866617:36)
at __ZN20BaseBehaviourManager12CommonUpdateI16BehaviourManagerEEvv [void BaseBehaviourManager::CommonUpdate()] (blob:http://localhost:51238/f787593b-8df2-4bda-acfc-25e82f2ed536:1602846:5)
at __ZN16BehaviourManager6UpdateEv [BehaviourManager::Update()] (blob:http://localhost:51238/f787593b-8df2-4bda-acfc-25e82f2ed536:2688751:2)
at mftCall_vi (blob:http://localhost:51238/f787593b-8df2-4bda-acfc-25e82f2ed536:2866617:36)
at __ZZ23InitPlayerLoopCallbacksvEN41UpdateScriptRunBehaviourUpdateRegistrator7ForwardEv [InitPlayerLoopCallbacks()::UpdateScriptRunBehaviourUpdateRegistrator::Forward()] (blob:http://localhost:51238/f787593b-8df2-4bda-acfc-25e82f2ed536:2745636:2)
at mftCall_v (blob:http://localhost:51238/f787593b-8df2-4bda-acfc-25e82f2ed536:2888261:35)
at __Z10PlayerLoopv [PlayerLoop()] (blob:http://localhost:51238/f787593b-8df2-4bda-acfc-25e82f2ed536:810476:14)
at __ZL8MainLoopv [MainLoop()] (blob:http://localhost:51238/f787593b-8df2-4bda-acfc-25e82f2ed536:2135425:3)
at Array.UnityLoader.6631f02b50cc31891e3c4b88d89586c2.asm.__ZL8MainLoopv [MainLoop()] (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:209101:29)
at Object.ftCall_v [as dynCall_v] (blob:http://localhost:51238/a7176586-2be9-4aa9-95fd-992b49aebc89:30813:28)

Issue with WebGL build

After updating Unity to 2017.2, I get this error in web console: NetworkError: A network error occurred.
I can reach created blob via url but unity can't read it.

Missing Reference System.Windows.Forms

grafik
For some reason this reference goes missing all the time. I add it again, everything seems to work and shortly after it is gone.

This looks more like some sort of Unity error or related to my IDE but I was still hoping for any help here as I have encountered it only with USFB so far :)

ArgumentException: The Assembly System.Drawing is referenced by System.Windows.Forms

Does this file browser work only in Unity or it should work also after build? Unfortunately I am getting an error:

ArgumentException: The Assembly System.Drawing is referenced by System.Windows.Forms ('Assets/StandaloneFileBrowser/Plugins/System.Windows.Forms.dll'). But the dll is not allowed to be included or could not be found.
UnityEditor.AssemblyHelper.AddReferencedAssembliesRecurse (System.String assemblyPath, System.Collections.Generic.List1 alreadyFoundAssemblies, System.String[] allAssemblyPaths, System.String[] foldersToSearch, System.Collections.Generic.Dictionary2 cache, BuildTarget target) (at /Users/builduser/buildslave/unity/build/Editor/Mono/AssemblyHelper.cs:146)
UnityEditor.AssemblyHelper.AddReferencedAssembliesRecurse (System.String assemblyPath, System.Collections.Generic.List1 alreadyFoundAssemblies, System.String[] allAssemblyPaths, System.String[] foldersToSearch, System.Collections.Generic.Dictionary2 cache, BuildTarget target) (at /Users/builduser/buildslave/unity/build/Editor/Mono/AssemblyHelper.cs:152)
UnityEditor.AssemblyHelper.FindAssembliesReferencedBy (System.String[] paths, System.String[] foldersToSearch, BuildTarget target) (at /Users/builduser/buildslave/unity/build/Editor/Mono/AssemblyHelper.cs:184)

Open Filebrowser doesn't respect directory parameter (Win10-64bit)

Not sure if this problem is exhibited in other Windows versions, but the directory parameter does nothing. The browser always opens to the last location. Probably an issue with Ookii.
Would be nice to get this to work, but if it's an issue with Ookii then it'd be difficult without re-writing that portion of Ookii or writing your own library to handle this.

Unity 2017 support

Unity version: Unity_2017.1.0f3

Hallo,
I integrated the UnityStandaloneFileBrowser with the Unity version 5.5.1f1 to build an application for MacOS. The file browser was working perfectly fine in the Unity editor and in the app. Thank you for your amazing work.

But now I need to update to the new Unity 2017 version. When I tried to open the FileBrowser in the Editor (and in the app) I get the following message: Couldn’t open Assets/Plugins/StandaloneFileBrowser.bundle/Contents/MacOS/StandaloneFileBrowser, error: dlopen(Assets/Plugins/StandaloneFileBrowser.bundle/Contents/MacOS/StandaloneFileBrowser, 2): Library not loaded: @executable_path/…/Frameworks/MonoEmbedRuntime/osx/libmono.0.dylib

Apparently Unity changed the folder @executable_path/../Frameworks/MonoEmbedRuntime/osx/libmono.0.dylib to @executable_path/../Frameworks/Mono/MonoEmbedRuntime/osx/libmono.0.dylib which is causing a linking issue as described here: https://github.com/gree/unity-webview/issues/219#issuecomment-315760749 

I managed that the plugin can access the library so that the file browser opens. But as soon as I click on Cancel or Open in the file browser, Unity crashes. The same is happening for the actual application.

Do you know how to fix this issue?

Greetings, Aleana27

Linux Async

Missing asynchronous behavior in Linux implementation.

Filename containing commas is split into multiple entries

Here's an example of a valid filename we work with:

"Final total approved set Nov 28,2016 14012_INTERLEAF_Approved_Plans_6546176-6473974-page5.pdf"

Comma is a valid character in an actual filename, but it's used to separate filename entries from each other inside the Mac plugin, regardless of whether multi-select flag is set to true.

The plugin needs to avoid separating filename entries with any character that can be present in the filename itself. One way to fix this is for the plugin to return an array instead of a string consisting of filenames with a separator character in between.

The type or namespace name `Windows' does not exist in the namespace `System

Get the following 3 errors, whether I open using Unity in Windows or on the Mac the moment I target Windows in Build Settings.

Assets/StandaloneFileBrowser/StandaloneFileBrowserWindows.cs(5,14): error CS0234: The type or namespace name Windows' does not exist in the namespace System'. Are you missing an assembly reference?

Assets/StandaloneFileBrowser/StandaloneFileBrowserWindows.cs(7,7): error CS0246: The type or namespace name `Ookii' could not be found. Are you missing an assembly reference?

Assets/StandaloneFileBrowser/StandaloneFileBrowserWindows.cs(15,34): error CS0246: The type or namespace name `IWin32Window' could not be found. Are you missing an assembly reference?

Could it be bug in code?

Hi, could it be bug in your code?
Sample/CanvasSampleOpenFileImage.cs, str 57-58:

private IEnumerator OutputRoutine(string url) {
        Debug.Log("URL: " + url);
        var loader = new WWW(url);
        yield return loader;
        output.texture = loader.texture;
    }

It looks like last string is never called making this code not working for me.
I changed to

output.texture = loader.texture;
yield return loader;        

-works fine

Also, thanks for great code, I use a lot.

StandaloneFileBrowserLinux.cs with NullReferenceException

When using StandaloneFileBrowser in Linux OS (ubuntu), if I choose "CANCEL" or "ESC" in file browse dialog, the returned (string[])paths become null.
And will become NullReferenceException at paths.Split(...);

TO FIX, I suggest:

` public string[] OpenFilePanel(string title, string directory, ExtensionFilter[] extensions, bool multiselect) {
var paths = Marshal.PtrToStringAnsi(DialogOpenFilePanel(
title,
directory,
GetFilterFromFileExtensionList(extensions),
multiselect));

        // debug NullReferenceException
        if (string.IsNullOrEmpty(paths))
        {
            return null;
        }

        return paths.Split((char)28);
    }`

` public string[] OpenFolderPanel(string title, string directory, bool multiselect) {
var paths = Marshal.PtrToStringAnsi(DialogOpenFolderPanel(
title,
directory,
multiselect));

        // debug NullReferenceException
        if (string.IsNullOrEmpty(paths))
        {
            return new string[0];
        }

        return paths.Split((char)28);
    }`

Errors submitting macOS build to Mac App Store via Application Loader (i386 architecture and CFBundleIdentifier in Info.plist)

After successfully packaging a macOS build of our Unity application into a .pkg file for the Mac App Store, we get the following errors when submitting it to the store via the Application Loader:

ERROR ITMS-90240: "Unsupported Architectures. Your executable contained the following disallowed architectures: '[i386 (in com.ourcompany.ourapplication.pkg/Payload/Our Application.app/Contents/Plugins/StandaloneFileBrowser.bundle/Contents/MacOS/StandaloneFileBrowser)]'. New apps submitted to the Mac App Store must support 64-bit starting January 2018, and Mac app updates and existing apps must support 64-bit starting June 2018."

ERROR ITMS-90511: "CFBundleIdentifier Collision. The Info.plist CFBundleIdentifier value 'com.gkngkc.sfb' of 'Our Application.app/Contents/Plugins/StandaloneFileBrowser.bundle' is already in use by another application." (EDIT: This one is probably expected, see further below.)

It seems that it doesn't like StandaloneFileBrowser.bundle being compiled for x86 (although it's also compiled for x64, right? Maybe it can't include both?). Mac builds are always x64 in Unity now, and the Platform settings for the bundle only show x64 for Mac OS X, so it seems correct:

image

Furthermore, the inclusion of multiple Info.plist files (ours and yours) seems to not work with the Application Loader, as seen from the second error message. This is also the case with a few other Mac plugins we have in the project that contain the .plist file. Can we remove it from the .bundle? (EDIT: this forum thread mentions replacing the bundle ID in each Info.plist with the app's own ID. So in theory only the x86 issue remains.)

Have you encountered these problems? None of this is an issue when creating non-app-store Mac builds, but we never tried running it on Macs without x64 support. Is this something that can be fixed? (maybe an x64-only build of StandaloneFileBrowser if it helps?)

I appreciate any help. Your plugin is really useful to us. :)

We're using Unity 2017.4.11f1 currently. Feel free to ask for more info.

Cheers!
Daniel Lobo

StandaloneFileBrowser.SaveFilePanelAsync does use directory as defaultName

StandaloneFileBrowser.SaveFilePanelAsync(title,directory,defaultName) does actually open a filebrowser on windows with directory as defaultName in some random folder (likely the last saved position?)

In StandaloneFileBrowserWindows.SaveFilePanel

			if (!string.IsNullOrEmpty(directory))
			{
				finalFilename = GetDirectoryPath(directory);
			}

Should be

			if (!string.IsNullOrEmpty(directory))
			{
				finalFilename = GetDirectoryPath(directory);
		          	if (Directory.Exists(finalFilename))
					fd.InitialDirectory = finalFilename;
			}

for linux

How to make it support linux,or do you have any suggestions to tell me?

Linux dialog problem second time it opens

@RicardoEPRodrigues

I'm only trying the project on this repo on Ubuntu 18.04 (on a VM).

I open the "BasicSampleScene" and I click on the "Open file" button.

  1. The first time it works as it should.
  2. The second time it opens the dialog behind the Unity window so I can't do nothing and the application freezes because it's waiting the dialog to close.

I see that in "gtk_file_chooser_dialog_new" method there is a parameter to set the parent window and I think that this should fix it but I don't know how to get the active Window. I saw this:

https://developer.gnome.org/gtk3/stable/GtkApplication.html#gtk-application-get-active-window

But we also need a reference to the GtkApplication...

Is there any workaround? Thanks.

StandaloneFileBrowser.cs:16~22

Need change as below or have exception if run on editor.

#if UNITY_EDITOR
_platformWrapper = new StandaloneFileBrowserEditor();
#elif UNITY_STANDALONE_OSX
_platformWrapper = new StandaloneFileBrowserMac();
#elif UNITY_STANDALONE_WIN
_platformWrapper = new StandaloneFileBrowserWindows();
#endif

Opening file browser broken on mac, missing dll

Unity 2017.1.1f1

  1. Started new Unity3d project.
  2. Switched build settings to Mac OS X x86.
  3. Imported by doubleclicking StandaloneFileBrowser.unitypackage from readme.
  4. Opened CanvasSampleScene.
  5. Clicked "Open File - Image".

Got: DllNotFoundException: StandaloneFileBrowser
error log

Not working on WebGL build?

not working on ubuntu

Failed to load module "canberra-gtk-module"

test_64:8755): GLib-GObject-WARNING **: 12:30:42.739: cannot register existing type 'GdkDisplayManager'

(test_64:8755): GLib-CRITICAL **: 12:30:42.739: g_once_init_leave: assertion 'result != 0' failed

(test_64.x86_64:8755): GLib-GObject-CRITICAL **: 12:30:42.739: g_object_new_with_properties: assertion 'G_TYPE_IS_OBJECT (object_type)' failed

Android Support

Hello can you make it to support android or do you know any File Browser for Android?

Web GL only need to set specific extension (.obj)

I really like your work it's really clean for all the other platforms except for the WebGL which you pointed it out. If you can help me by just setting the extension it would be really great.

Thank you in Advance! :-}

How to get the file name I write in the File Dialog?

Hi,

It's not an issue because your code works great, but a question. I need to get the file name I write in the File Dialog to use it in a binary serlialization code. I have your code and the serialization code and now I need to join them into one piece of code. How to do that?

Mac image preview only shows spinner

When selecting image files, with the view set to the 3rd view type (that shows an image preview in the rightmost panel), the image never loads and is instead, just the spinner.
opendialog

IL2CPP Support, crashes only in IL2CPP

In the editor itself and in a mono build everything works fine, but when building for IL2CPP the game crashes.

When debugging in Visual Studio, I get:
Unhandled exception at 0x000007FEFEF49A12 (comdlg32.dll) in Galactic Lander.exe: 0xC0000005: Access violation reading location 0x0000000000000000.

image

Using .NET 4.x Equivalent and .NET 4.x for Api Compability Level. I didn't touch the import settings either.

Unable to locate path containing german umlauts on OSX

If the path contains äöüÄÖÜ the filebrowser returns a path for which File.Exists(path) is false because of the encoding of the file. Tested on windows editor (works) and osx (invalid path).

SaveFilePanel returns "Tür" while OpenFilePanel returns "T%%CC%88%%r"

Not sure if this is completly safe but I'd say the returned string should be System.Uri.UnescapeDataString helps. However, I am unsure if this is really safe way according to https://msdn.microsoft.com/de-de/library/system.uri.unescapedatastring(v=vs.110).aspx

"Memory access out of bounds" error with WebGL and Chrome

StandaloneFileBrowser.SaveFilePanel and StandaloneFileBrowser.OpenFilePanel calls seem to give Chrome on Windows 10 a "Memory access out of bounds" error that freezes the WebGL player for Unity and, obviously, doesn't open a file panel for usage.

Unhandled exception: Unity 5.3.4

First off, thanks for sharing this. It looks great. Only thing is I get an unhandled exception when I try to import this package into my scene. Any ideas? Here's what Unity is telling me:

Unhandled Exception: System.Reflection.ReflectionTypeLoadException: The classes in the module cannot be loaded.
at (wrapper managed-to-native) System.Reflection.Assembly:GetTypes (bool)
at System.Reflection.Assembly.GetTypes () [0x00000] in :0
at Mono.CSharp.RootNamespace.ComputeNamespaces (System.Reflection.Assembly assembly, System.Type extensionType) [0x00000] in :0
at Mono.CSharp.RootNamespace.ComputeNamespace (Mono.CSharp.CompilerContext ctx, System.Type extensionType) [0x00000] in :0
at Mono.CSharp.GlobalRootNamespace.ComputeNamespaces (Mono.CSharp.CompilerContext ctx) [0x00000] in :0
at Mono.CSharp.Driver.LoadReferences () [0x00000] in :0
at Mono.CSharp.Driver.Compile () [0x00000] in :0
at Mono.CSharp.Driver.Main (System.String[] args) [0x00000] in :0

The following assembly referenced from /Users/walshr/sourcecode/UnityProject/Assets/StandaloneFileBrowser/Plugins/Ookii.Dialogs.dll could not be loaded:
Assembly: System.Drawing (assemblyref_index=4)
Version: 2.0.0.0
Public Key: b03f5f7f11d50a3a
The assembly was not found in the Global Assembly Cache, a path listed in the MONO_PATH environment variable, or in the location of the executing assembly (/Users/walshr/sourcecode/UnityProject/Assets/StandaloneFileBrowser/Plugins/).

Could not load file or assembly 'System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies.
The following assembly referenced from /Users/walshr/sourcecode/UnityProject/Assets/StandaloneFileBrowser/Plugins/System.Windows.Forms.dll could not be loaded:
Assembly: System.Drawing (assemblyref_index=1)
Version: 2.0.0.0
Public Key: b03f5f7f11d50a3a
The assembly was not found in the Global Assembly Cache, a path listed in the MONO_PATH environment variable, or in the location of the executing assembly (/Users/walshr/sourcecode/UnityProject/Assets/StandaloneFileBrowser/Plugins/).

Could not load file or assembly 'System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies.
Could not load file or assembly 'System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies.
The class System.Windows.Forms.Control could not be loaded, used in System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Could not load file or assembly 'System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies.
The class Ookii.Dialogs.ExtendedForm could not be loaded, used in Ookii.Dialogs, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0c15020868fd6249
The class System.Windows.Forms.Form could not be loaded, used in System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
The class Ookii.Dialogs.VistaFileDialog could not be loaded, used in Ookii.Dialogs, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0c15020868fd6249
Could not load file or assembly 'System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies.
The class Ookii.Dialogs.TaskDialog could not be loaded, used in Ookii.Dialogs, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0c15020868fd6249
The following assembly referenced from /Users/walshr/sourcecode/UnityProject/Assets/StandaloneFileBrowser/Plugins/Ookii.Dialogs.dll could not be loaded:
Assembly: System.Design (assemblyref_index=3)
Version: 2.0.0.0
Public Key: b03f5f7f11d50a3a
The assembly was not found in the Global Assembly Cache, a path listed in the MONO_PATH environment variable, or in the location of the executing assembly (/Users/walshr/sourcecode/UnityProject/Assets/StandaloneFileBrowser/Plugins/).

Could not load file or assembly 'System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies.

Windows Source Code

Hi, Good job. I just couldn't find the windows version of plugin source code (Any Visual Studio project?)

Building demo does not work on upload to server

Thank you so much for this tool!

Perhaps I have some configuration issues? I took the demo included and built it. Works fine when locally hosted but fails while hosted on server.

-Link Removed-

The open never loads the content. I am sorry if I missed something more obvious.

Exceptions thrown results of Async methods crash the Editor on Mac

StandaloneFileBrowser.OpenFilePanelAsync("Test", "", "", false, (string[] paths) =>
{
	throw new Exception("UNHANDLED");
});

This is using MonoBleedingEdge, but any exception thrown from there will kill the Editor or the Standalone player on Mac. Does not crash on PC.

Setup Instructions

Hi!

It would be nice if you could add a few lines explaining how to use/setup this script or plugin on Unity. I will try to download and try to make it work but a few lines of instructions would help people like me who are not very familiar with Unity plugins/extensions/whatever.

Best

How to add extensions on WebGL

[DllImport("__Internal")] private static extern void UploadFile(string id);

All going well, but how to add extensions ?

Thank you !

UnityPackage scene is empty

First off, excellent work. So far I've yet to encounter an issue. I'm setting it up for UnityEvent callbacks so, if I ever have time I'll contribute that work back to you.
When I imported the unity package from
https://github.com/gkngkc/UnityStandaloneFileBrowser/tree/master/Package
The example scene was completely empty. No biggy though because I imagine the sample scene was just a camera with your sample script attatched.
Anyway, all works out of the box other than that (so far).
Thanks for the contribution!!

WebGL IE11 download fix

Trying to use this plugin while in IE11 doesn't allow the download to happen. I'm not that good with js, but here is what I used to finally got working in any browser.

DownloadFile: function(gameObjectNamePtr, filenamePtr, byteArray, byteArraySize) {
        gameObjectName = Pointer_stringify(gameObjectNamePtr);
        filename = Pointer_stringify(filenamePtr);

        var bytes = new Uint8Array(byteArraySize);
        for (var i = 0; i < byteArraySize; i++) {
            bytes[i] = HEAPU8[byteArray + i];
        }
	if (navigator.msSaveOrOpenBlob) {
	    var blob = new Blob([bytes]);
			
	    window.navigator.msSaveOrOpenBlob(blob, filename);
	    window.alert("Check bottom of screen for save options.");
	    document.onmouseup = null;

            SendMessage(gameObjectName, 'OnFileDownloaded');
	    return;
	}
	
	var downloader = window.document.createElement('a');
	downloader.setAttribute('id', gameObjectName);
	downloader.href = window.URL.createObjectURL(new Blob([bytes], { type: 'application/octet-stream' }));
	downloader.download = filename;
	document.body.appendChild(downloader);
		
        document.onmouseup = function() {
			downloader.click();
			document.body.removeChild(downloader);
			
        	document.onmouseup = null;

            SendMessage(gameObjectName, 'OnFileDownloaded');
        }
    }

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.