File: clToolBarButtonBase.h

package info (click to toggle)
codelite 17.0.0%2Bdfsg-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 136,244 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 (142 lines) | stat: -rw-r--r-- 4,241 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
#ifndef CLTOOLBARBUTTONBASE_H
#define CLTOOLBARBUTTONBASE_H

#include "clToolBar.h"

#include <wx/bitmap.h>
#include <wx/dc.h>
#include <wx/settings.h>
#include <wx/string.h>
#include <wx/toolbar.h>

#ifdef __WXOSX__
#define CL_TOOL_BAR_DROPDOWN_ARROW_SIZE 5
#else
#define CL_TOOL_BAR_DROPDOWN_ARROW_SIZE 8
#endif

#define INVALID_BITMAP_ID wxString::npos

class WXDLLIMPEXP_SDK clToolBarButtonBase
{
protected:
    clToolBarGeneric* m_toolbar = nullptr;
    wxWindowID m_id = wxID_ANY;
    size_t m_bmpId = INVALID_BITMAP_ID;
    wxString m_label;
    size_t m_flags = 0;
    wxRect m_dropDownArrowRect;
    wxRect m_buttonRect;
    size_t m_renderFlags = 0;
    wxMenu* m_menu = nullptr;

public:
    enum eFlags {
        kHasMenu = (1 << 0),
        kToggleButton = (1 << 1),
        kChecked = (1 << 2),
        kDisabled = (1 << 3),
        kSeparator = (1 << 4),
        kControl = (1 << 5),
        kHidden = (1 << 6),
        kSpacer = (1 << 7),
        kStretchalbeSpace = (1 << 8),
    };

    enum eRenderFlags {
        kHover = (1 << 0),
        kPressed = (1 << 1),
    };

public:
    clToolBarButtonBase(clToolBarGeneric* parent, wxWindowID id, int bmpId = wxNOT_FOUND, const wxString& label = "",
                        size_t flags = 0);
    virtual ~clToolBarButtonBase();

public:
    /**
     * @brief calculate the size needed for drawing this button
     * @return
     */
    virtual wxSize CalculateSize(wxDC& dc) const = 0;

public:
    /**
     * @brief draw the button in a given wxRect
     */
    virtual void Render(wxDC& dc, const wxRect& rect);

protected:
    void EnableRenderFlag(clToolBarButtonBase::eRenderFlags f, bool b)
    {
        if(b) {
            m_renderFlags |= f;
        } else {
            m_renderFlags &= ~f;
        }
    }

    void EnableFlag(clToolBarButtonBase::eFlags f, bool b)
    {
        if(b) {
            m_flags |= f;
        } else {
            m_flags &= ~f;
        }
    }

public:
    void SetBitmapIndex(size_t index) { this->m_bmpId = index; }
    size_t GetBitmapIndex() const { return this->m_bmpId; }
    bool HasBitmap() const { return GetBitmapIndex() != INVALID_BITMAP_ID; }
    void SetLabel(const wxString& label) { this->m_label = label; }
    const wxBitmap& GetBitmap() const;
    const wxString& GetLabel() const { return m_label; }

    /**
     * @brief does this button has a menu?
     */
    bool IsMenuButton() const { return m_flags & kHasMenu; }
    wxWindowID GetId() const { return m_id; }
    clToolBarGeneric* GetToolbar() { return m_toolbar; }
    void SetMenu(wxMenu* menu);
    wxMenu* GetMenu() const { return m_menu; }
    virtual bool Contains(const wxPoint& pt) const { return m_buttonRect.Contains(pt); }
    bool InsideMenuButton(const wxPoint& pt) const { return IsMenuButton() && (m_dropDownArrowRect.Contains(pt)); }

    void SetRenderFlags(size_t flags) { m_renderFlags = flags; }
    bool IsHover() const { return m_renderFlags & kHover; }
    bool IsPressed() const { return m_renderFlags & kPressed; }
    void SetHover(bool b) { EnableRenderFlag(kHover, b); }
    void SetPressed(bool b)
    {
        ClearRenderFlags();
        EnableRenderFlag(kPressed, b);
    }
    void ClearRenderFlags() { m_renderFlags = 0; }
    const wxRect& GetButtonRect() const { return m_buttonRect; }
    bool IsChecked() const { return (m_flags & kChecked); }
    bool IsToggled() const { return IsChecked(); }
    void Check(bool b)
    {
        EnableFlag(kChecked, b);
        SetPressed(b);
    }
    bool IsToggle() const { return (m_flags & kToggleButton); }
    bool IsSeparator() const { return m_flags & kSeparator; }
    bool IsSpacer() const { return m_flags & kSpacer; }
    bool IsStretchableSpace() const { return m_flags & kStretchalbeSpace; }
    bool IsEnabled() const { return !(m_flags & kDisabled); }
    bool IsControl() const { return m_flags & kControl; }
    bool Enable(bool b)
    {
        EnableFlag(kDisabled, !b);
        return true;
    }
    bool IsHidden() const { return m_flags & kHidden; }
    bool IsShown() const { return !IsHidden(); }
    void Show(bool b) { EnableFlag(kHidden, !b); }

    template <typename T> T* Cast() { return dynamic_cast<T*>(this); }
};
#endif // CLTOOLBARBUTTONBASE_H