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
|