Welcome to mirror list, hosted at ThFree Co, Russian Federation.

TracyFileselector.cpp « server - github.com/wolfpld/tracy.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: be98f89793670e5a258a40750ccbb5d22bb0cc97 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include "TracyFileselector.hpp"

#ifndef TRACY_NO_FILESELECTOR
#  ifdef __EMSCRIPTEN__
#    include <emscripten.h>
#  else
#    include "../nfd/nfd.h"
#  endif
#endif

namespace tracy::Fileselector
{

static bool s_hasFailed = false;

void Init()
{
#if !defined TRACY_NO_FILESELECTOR && !defined __EMSCRIPTEN__
    NFD_Init();
#endif
}

void Shutdown()
{
#if !defined TRACY_NO_FILESELECTOR && !defined __EMSCRIPTEN__
    NFD_Quit();
#endif
}

bool HasFailed()
{
    if( s_hasFailed )
    {
        s_hasFailed = false;
        return true;
    }
    else
    {
        return false;
    }
}

#ifdef __EMSCRIPTEN__
static std::function<void(const char*)> s_openFileCallback;

extern "C" int nativeOpenFile()
{
    s_openFileCallback( "upload.tracy" );
    return 0;
}
#endif

static bool OpenFileImpl( const char* ext, const char* desc, std::function<void(const char*)> callback )
{
#ifndef TRACY_NO_FILESELECTOR
#  ifdef __EMSCRIPTEN__
    s_openFileCallback = callback;
    EM_ASM( {
        var input = document.createElement( 'input' );
        input.type = 'file';
        input.accept = UTF8ToString( $0 );
        input.onchange = (e) => {
            var file = e.target.files[0];
            var reader = new FileReader();
            reader.readAsArrayBuffer( file );
            reader.onload = () => {
                var buf = reader.result;
                var view = new Uint8Array( buf );
                FS.createDataFile( '/', 'upload.tracy', view, true, true );
                Module.ccall( 'nativeOpenFile', 'number', [], [] );
                FS.unlink( '/upload.tracy' );
            };
        };
        input.click();
    }, ext );
    return true;
#  else
    nfdu8filteritem_t filter = { desc, ext };
    nfdu8char_t* fn;
    if( NFD_OpenDialogU8( &fn, &filter, 1, nullptr ) == NFD_OKAY )
    {
        callback( (const char*)fn );
        NFD_FreePathU8( fn );
        return true;
    }
#  endif
#endif
    return false;
}

static bool SaveFileImpl( const char* ext, const char* desc, std::function<void(const char*)> callback )
{
#if !defined TRACY_NO_FILESELECTOR && !defined __EMSCRIPTEN__
    nfdu8filteritem_t filter = { desc, ext };
    nfdu8char_t* fn;
    if( NFD_SaveDialogU8( &fn, &filter, 1, nullptr, nullptr ) == NFD_OKAY )
    {
        callback( (const char*)fn );
        NFD_FreePathU8( fn );
        return true;
    }
#endif
    return false;
}

void OpenFile( const char* ext, const char* desc, std::function<void(const char*)> callback )
{
    if( !OpenFileImpl( ext, desc, callback ) ) s_hasFailed = true;
}

void SaveFile( const char* ext, const char* desc, std::function<void(const char*)> callback )
{
    if( !SaveFileImpl( ext, desc, callback ) ) s_hasFailed = true;
}

}