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 SEEN_INK_SELECT_ONE_ACTION
#define SEEN_INK_SELECT_ONE_ACTION
/*
* Authors:
* Tavmjong Bah <tavmjong@free.fr>
*
* Copyright (C) 2017 Tavmjong Bah
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
/**
An action (menu/toolbar item) that allows selecting one choice out of many.
The choices may be displayed as:
1. A group of items in a toolbar with labels and/or icons.
2. As a drop-down menu with a labels and/or icons.
*/
#include <gtkmm/action.h>
#include <gtkmm/liststore.h>
#include <sigc++/sigc++.h>
#include <vector>
namespace Gtk {
class ComboBox;
class RadioAction;
class MenuItem;
class RadioMenuItem;
}
class InkSelectOneActionColumns : public Gtk::TreeModel::ColumnRecord {
public:
InkSelectOneActionColumns() {
add (col_label);
add (col_icon);
add (col_pixbuf);
add (col_data); // Used to store a pointer
add (col_tooltip);
add (col_sensitive);
}
Gtk::TreeModelColumn<Glib::ustring> col_label;
Gtk::TreeModelColumn<Glib::ustring> col_icon;
Gtk::TreeModelColumn<Glib::RefPtr<Gdk::Pixbuf> > col_pixbuf;
Gtk::TreeModelColumn<void *> col_data;
Gtk::TreeModelColumn<Glib::ustring> col_tooltip;
Gtk::TreeModelColumn<bool> col_sensitive;
};
class InkSelectOneAction : public Gtk::Action {
public:
static InkSelectOneAction* create(const Glib::ustring &name,
const Glib::ustring &label,
const Glib::ustring &tooltip,
const Glib::ustring &stock_id,
Glib::RefPtr<Gtk::ListStore> store );
/* Style of action */
void use_radio( bool use_radio ) { _use_radio = use_radio; }
void use_label( bool use_label ) { _use_label = use_label; }
void use_icon( bool use_icon ) { _use_icon = use_icon; }
void use_pixbuf( bool use_pixbuf ) { _use_pixbuf = use_pixbuf; }
void use_group_label( bool use_group_label ) { _use_group_label = use_group_label; }
gint get_active() { return _active; }
Glib::ustring get_active_text();
void set_active( gint active );
void set_icon_size( Gtk::BuiltinIconSize size ) { _icon_size = size; }
Glib::RefPtr<Gtk::ListStore> get_store() { return _store; }
sigc::signal<void, int> signal_changed() { return _changed; }
sigc::signal<void, int> signal_changed_after() { return _changed_after; }
protected:
Gtk::Widget* create_menu_item_vfunc() override;
Gtk::Widget* create_tool_item_vfunc() override;
/* Signals */
sigc::signal<void, int> _changed;
sigc::signal<void, int> _changed_after; // Needed for unit tracker which eats _changed.
private:
Glib::ustring _name;
Glib::ustring _group_label;
Glib::ustring _tooltip;
Glib::ustring _stock_id;
Glib::RefPtr<Gtk::ListStore> _store;
gint _active; /* Active menu item/button */
/* Style */
bool _use_radio; // Applies to tool item only
bool _use_label;
bool _use_icon; // Applies to menu item only
bool _use_pixbuf;
bool _use_group_label; // Applies to tool item only
Gtk::BuiltinIconSize _icon_size;
/* Combobox in tool */
Gtk::ComboBox* _combobox;
/* Need to track one action to get active action. */
Glib::RefPtr<Gtk::RadioAction> _radioaction;
Gtk::MenuItem* _menuitem;
std::vector<Gtk::RadioMenuItem*> _radiomenuitems;
/* Internal Callbacks */
void on_changed_combobox();
void on_changed_radioaction(const Glib::RefPtr<Gtk::RadioAction>& current);
void on_toggled_radiomenu(int n);
InkSelectOneAction (const Glib::ustring &name,
const Glib::ustring &group_label,
const Glib::ustring &tooltip,
const Glib::ustring &stock_id,
Glib::RefPtr<Gtk::ListStore> store );
};
#endif /* SEEN_INK_SELECT_ONE_ACTION */
/*
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 :
|