summaryrefslogtreecommitdiffstats
path: root/src/file_chooser_portal.h
blob: 9732b8d5c47e244b47818b627abe6fb4559c9882 (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
/*******************************************************************************
  XDG desktop portal implementation for TDE
  Copyright © 2024 Mavridis Philippe <mavridisf@gmail.com>

  This program or library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public License as
  published by the Free Software Foundation; either version 2.1 of the License,
  or (at your option) any later version.

  This library is distributed in the hope that it will be useful, but WITHOUT
  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
  details.

  You should have received a copy of the GNU Lesser General Public License
  along with this library; if not, write to the Free Software Foundation, Inc.,
  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

  Improvements and feedback are welcome!
*******************************************************************************/

#ifndef __FILE_CHOOSER_PORTAL_H
#define __FILE_CHOOSER_PORTAL_H

// TDE
#include <tdefile.h>

// Portal
#include "interfaces/filechooserInterface.h"
#include "interface.h"

struct FileDialogOpts
{
    TQString caption;
    TQString okButtonText;
    TQString startDir;
    TQString startName;
    TQString filters;
    bool multiple = false;
    bool directory = false;
    bool savingMode = false;
    bool modal = true;
    WId windowId = 0;

    inline KFile::Mode mode()
    {
        if (directory) return KFile::Directory;
        return multiple ? KFile::Files : KFile::File;
    }
};

class KFileDialog;

class TDEFileChooserPortal : public TQObject,
                             public org::freedesktop::impl::portal::FileChooserInterface
{
    INTERFACE("org.freedesktop.impl.portal.FileChooser")

    public:
        TDEFileChooserPortal(TQT_DBusConnection &connection);
        virtual ~TDEFileChooserPortal();

    protected:
        virtual bool OpenFile(const TQT_DBusObjectPath& handle,
                              const TQString& app_id,
                              const TQString& parent_window,
                              const TQString& title,
                              const TQT_DBusVariantMap &options,
                              TQ_UINT32& response,
                              TQT_DBusVariantMap &results,
                              TQT_DBusError& error);

        virtual bool SaveFile(const TQT_DBusObjectPath& handle,
                              const TQString& app_id,
                              const TQString& parent_window,
                              const TQString& title,
                              const TQT_DBusVariantMap &options,
                              TQ_UINT32& response,
                              TQT_DBusVariantMap &results,
                              TQT_DBusError& error);

        virtual bool SaveFiles(const TQT_DBusObjectPath& handle,
                               const TQString& app_id,
                               const TQString& parent_window,
                               const TQString& title,
                               const TQT_DBusVariantMap &options,
                               TQ_UINT32& response,
                               TQT_DBusVariantMap &results,
                               TQT_DBusError& error);

        virtual void handleMethodReply(const TQT_DBusMessage& reply);
        virtual bool handleSignalSend(const TQT_DBusMessage& reply);

    private:
        TQT_DBusConnection m_connection;

        WId parseWindowId(const TQString data);
        TQString parseFilter(const TQT_DBusData data);
        TQString parseFilterList(const TQT_DBusVariant filterData,
                                 const TQT_DBusVariant currentFilterData);

        bool execFileDialog(FileDialogOpts options,
                            const TQT_DBusObjectPath& handle,
                            TQ_UINT32& response,
                            TQT_DBusVariantMap &results,
                            TQT_DBusError& error);
};

#endif // __FILE_CHOOSER_PORTAL_H

// kate: replace-tabs true; tab-width 4; indent-width 4;