summaryrefslogtreecommitdiffstats
path: root/src/ui/dialog/color-item.h
blob: 8ca7d9e0a396f670dc7d1cb684f0ad94eeecba70 (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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
// SPDX-License-Identifier: GPL-2.0-or-later
/** @file
 * @brief Inkscape color swatch UI item.
 */
/* Authors:
 *   Jon A. Cruz
 *
 * Copyright (C) 2010 Jon A. Cruz
 *
 * Released under GNU GPL v2+, read the file 'COPYING' for more information.
 */

#ifndef SEEN_DIALOGS_COLOR_ITEM_H
#define SEEN_DIALOGS_COLOR_ITEM_H

#include <boost/ptr_container/ptr_vector.hpp>

#include "widgets/ege-paint-def.h"
#include "ui/previewable.h"

class SPGradient;

namespace Inkscape {
namespace UI {
namespace Dialog {

class ColorItem;

class SwatchPage
{
public:
    SwatchPage();
    ~SwatchPage();

    Glib::ustring _name;
    int _prefWidth;
    boost::ptr_vector<ColorItem> _colors;
};


/**
 * The color swatch you see on screen as a clickable box.
 */
class ColorItem : public Inkscape::UI::Previewable
{
    friend void _loadPaletteFile( gchar const *filename );
public:
    ColorItem( ege::PaintDef::ColorType type );
    ColorItem( unsigned int r, unsigned int g, unsigned int b,
               Glib::ustring& name );
    ~ColorItem() override;
    ColorItem(ColorItem const &other);
    virtual ColorItem &operator=(ColorItem const &other);
    Gtk::Widget* getPreview(UI::Widget::PreviewStyle style,
                            UI::Widget::ViewType     view,
                            UI::Widget::PreviewSize  size,
                            guint                    ratio,
                            guint                    border) override;
    void buttonClicked(bool secondary = false);

    void setGradient(SPGradient *grad);
    SPGradient * getGradient() const { return _grad; }
    void setPattern(cairo_pattern_t *pattern);
    void setName(const Glib::ustring name);

    void setState( bool fill, bool stroke );
    bool isFill() { return _isFill; }
    bool isStroke() { return _isStroke; }

    ege::PaintDef def;

    Gtk::Widget* createWidget();

private:
    Gtk::Widget* _getPreview(UI::Widget::PreviewStyle style,
		  UI::Widget::ViewType view, UI::Widget::PreviewSize size,
		  guint ratio, guint border);

    static void _dropDataIn( GtkWidget *widget,
                             GdkDragContext *drag_context,
                             gint x, gint y,
                             GtkSelectionData *data,
                             guint info,
                             guint event_time,
                             gpointer user_data);

    void _dragGetColorData(const Glib::RefPtr<Gdk::DragContext> &drag_context,
                           Gtk::SelectionData                   &data,
                           guint                                 info,
                           guint                                 time);

    static void _wireMagicColors( SwatchPage *colorSet );
    static void _colorDefChanged(void* data);

    void _updatePreviews();
    void _regenPreview(UI::Widget::Preview * preview);

    void _linkTint( ColorItem& other, int percent );
    void _linkTone( ColorItem& other, int percent, int grayLevel );
    void drag_begin(const Glib::RefPtr<Gdk::DragContext> &dc);
    void handleClick();
    void handleSecondaryClick(gint arg1);
    bool handleEnterNotify(GdkEventCrossing* event);
    bool handleLeaveNotify(GdkEventCrossing* event);

    std::vector<Gtk::Widget*> _previews;

    bool _isFill;
    bool _isStroke;
    bool _isLive;
    bool _linkIsTone;
    int _linkPercent;
    int _linkGray;
    ColorItem* _linkSrc;
    SPGradient* _grad;
    cairo_pattern_t *_pattern;
    std::vector<ColorItem*> _listeners;
};

} // namespace Dialog
} // namespace UI
} // namespace Inkscape

#endif // SEEN_DIALOGS_COLOR_ITEM_H

/*
  Local Variables:
  mode:c++
  c-file-style:"stroustrup"
  c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
  indent-tabs-mode:nil
  fill-column:99
  End:
*/
// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :