File: clPropertiesPage.hpp

package info (click to toggle)
codelite 17.0.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 136,204 kB
  • sloc: cpp: 491,547; ansic: 280,393; php: 10,259; sh: 8,930; lisp: 7,664; vhdl: 6,518; python: 6,020; lex: 4,920; yacc: 3,123; perl: 2,385; javascript: 1,715; cs: 1,193; xml: 1,110; makefile: 804; cobol: 741; sql: 709; ruby: 620; f90: 566; ada: 534; asm: 464; fortran: 350; objc: 289; tcl: 258; java: 157; erlang: 61; pascal: 51; ml: 49; awk: 44; haskell: 36
file content (152 lines) | stat: -rw-r--r-- 5,452 bytes parent folder | download | duplicates (2)
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#ifndef CLPROPERTIESPAGE_HPP
#define CLPROPERTIESPAGE_HPP

#include "clThemedListCtrl.h"
#include "cl_command_event.h"
#include "codelite_exports.h"

#include <functional>
#include <unordered_map>
#include <vector>
#include <wx/any.h>
#include <wx/arrstr.h>
#include <wx/colour.h>
#include <wx/dataview.h>
#include <wx/panel.h>
#include <wx/window.h>

enum class LineKind {
    UNKNOWN,
    COLOUR,
    CHOICE,
    TEXT_EDIT,
    CHECKBOX,
    FILE_PICKER,
    DIR_PICKER,
    INTEGER,
    BUTTON,
    LANGUAGE_PICKER,
};

struct WXDLLIMPEXP_SDK LineData {
    LineKind line_kind = LineKind::UNKNOWN;
    wxAny value;
    std::function<void(const wxString&, const wxAny&)> callback = nullptr;
};

wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_SDK, wxEVT_PROPERTIES_PAGE_MODIFIED, clCommandEvent);
wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_SDK, wxEVT_PROPERTIES_PAGE_SAVED, clCommandEvent);

class WXDLLIMPEXP_SDK clPropertiesPage : public wxPanel
{
    clThemedListCtrl* m_view = nullptr;
    std::vector<size_t> m_header_rows;
    bool m_theme_event_connected = false;
    std::unordered_map<size_t, LineData> m_lines;
    bool m_isModified = false;

public:
    typedef std::function<void(const wxString&, const wxAny&)> Callback_t;

protected:
    void OnActionButton(wxDataViewEvent& e);
    void OnThemeChanged(clCommandEvent& event);
    void SetHeaderColours(const wxDataViewItem& item);
    void OnInitDone(wxCommandEvent& event);
    void OnChoice(wxDataViewEvent& event);
    void OnValueChanged(wxDataViewEvent& event);

    // Helpers
    void ShowColourPicker(size_t line, const wxColour& colour);
    void ShowLanguagePicker(size_t line, const wxString& langs);
    void ShowTextEditor(size_t line, const wxString& text);
    void ShowStringSelectionMenu(size_t line, const wxArrayString& options);
    void ShowFilePicker(size_t line, const wxString& path);
    void ShowDirPicker(size_t line, const wxString& path);
    void ShowNumberPicker(size_t line, long number);
    void DoButtonClicked(size_t line);
    void SetModified();

    bool GetLineData(size_t line, const LineData** data) const;

    template <typename T>
    void UpdateLineData(size_t line, LineKind kind, const T& data, clPropertiesPage::Callback_t update_cb)
    {
        if(m_lines.count(line) == 0) {
            m_lines.insert({ line, {} });
        }

        // update the values
        LineData& d = m_lines[line];
        d.value = data;
        d.line_kind = kind;
        if(update_cb != nullptr) {
            d.callback = std::move(update_cb);
        }
    }

    template <typename T> void UpdateLastLineData(LineKind kind, const T& data, clPropertiesPage::Callback_t update_cb)
    {
        if(m_view->IsEmpty()) {
            return;
        }

        size_t line = m_view->GetItemCount() - 1;
        UpdateLineData(line, kind, data, update_cb);
    }

    void NotifyChange(size_t line);

public:
    clPropertiesPage(wxWindow* parent, wxWindowID id = wxID_ANY);
    virtual ~clPropertiesPage();

    void AddProperty(const wxString& label, const wxArrayString& choices, size_t sel,
                     clPropertiesPage::Callback_t update_cb);
    void AddProperty(const wxString& label, const std::vector<wxString>& choices, size_t sel,
                     clPropertiesPage::Callback_t update_cb);
    void AddProperty(const wxString& label, const std::vector<wxString>& choices, const wxString& selection,
                     clPropertiesPage::Callback_t update_cb);
    void AddProperty(const wxString& label, const wxArrayString& choices, const wxString& selection,
                     clPropertiesPage::Callback_t update_cb);

    void AddProperty(const wxString& label, bool checked, clPropertiesPage::Callback_t update_cb);
    void AddProperty(const wxString& label, const wxString& value, clPropertiesPage::Callback_t update_cb);
    void AddProperty(const wxString& label, const char* value, clPropertiesPage::Callback_t update_cb)
    {
        AddProperty(label, wxString(value), std::move(update_cb));
    }
    void AddProperty(const wxString& label, const wxColour& value, clPropertiesPage::Callback_t update_cb);
    void AddProperty(const wxString& label, long value, clPropertiesPage::Callback_t update_cb);
    void AddProperty(const wxString& label, int value, clPropertiesPage::Callback_t update_cb)
    {
        AddProperty(label, (long)value, std::move(update_cb));
    }

    void AddPropertyFilePicker(const wxString& label, const wxString& path, clPropertiesPage::Callback_t update_cb);
    void AddPropertyDirPicker(const wxString& label, const wxString& path, clPropertiesPage::Callback_t update_cb);
    void AddPropertyLanguagePicker(const wxString& label, const wxArrayString& langs,
                                   clPropertiesPage::Callback_t update_cb);
    void AddPropertyButton(const wxString& label, const wxString& button_label, clPropertiesPage::Callback_t update_cb);
    void AddHeader(const wxString& label);

    bool IsModified() const { return m_isModified; }
    void ClearModified();

    /**
     * @brief call this method to tell the control what we are done adding items
     */
    void Finalize();
    /**
     * @brief tell the control that we are about to add multiple items, so avoid un-needed drawings
     * once done, call `Finalize`
     */
    void Begin();

    /**
     * @brief clear the view and discard all caches
     */
    virtual void Clear();
};

#endif // CLPROPERTIESPAGE_HPP