20 #include <gtkmm/stock.h>
46 , _dragging_new_tab (0)
48 add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::POINTER_MOTION_MASK);
49 ColorsChanged.connect (sigc::mem_fun (*
this, &GroupTabs::queue_draw));
60 SessionHandlePtr::set_session (s);
92 using namespace Menu_Helpers;
96 list<Tab>::iterator prev;
97 list<Tab>::iterator next;
103 if (ev->button == 1) {
110 if (next ==
_tabs.end()) {
114 list<Tab>::iterator j =
_tabs.insert (next, n);
127 double const h = (t->
from + t->
to) / 2;
138 }
else if (ev->button == 3) {
142 if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier) && g) {
149 m->popup (ev->button, ev->time);
182 gdk_event_request_motions(ev);
206 if (!routes.empty()) {
210 for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
216 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
218 bool const was_in_tab = find (
222 bool const now_in_tab = find (routes.begin(), routes.end(), *i) != routes.end();
224 if (was_in_tab && !now_in_tab) {
226 }
else if (!was_in_tab && now_in_tab) {
252 Gdk::Color c = get_style()->get_base (Gtk::STATE_NORMAL);
254 cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
255 cairo_rectangle (cr, 0, 0, get_width(), get_height());
260 for (list<Tab>::const_iterator i =
_tabs.begin(); i !=
_tabs.end(); ++i) {
276 *prev = *next =
_tabs.end ();
279 list<Tab>::iterator i =
_tabs.begin ();
280 while (i !=
_tabs.end()) {
293 if (i->from <= c && c < i->to) {
306 using namespace Menu_Helpers;
310 Menu* new_from =
new Menu;
311 MenuList&
f = new_from->items ();
317 _menu->set_name (
"ArdourContextMenu");
318 MenuList& items =
_menu->items();
321 items.push_back (MenuElem (
_(
"Create New Group From"), *new_from));
324 items.push_back (MenuElem (
_(
"Edit Group..."), sigc::bind (sigc::mem_fun (*
this, &
GroupTabs::edit_group), g)));
325 items.push_back (MenuElem (
_(
"Collect Group"), sigc::bind (sigc::mem_fun (*
this, &
GroupTabs::collect), g)));
327 items.push_back (SeparatorElem());
329 items.push_back (MenuElem (
_(
"Remove Subgroup Bus"), sigc::bind (sigc::mem_fun (*
this, &
GroupTabs::un_subgroup), g)));
333 items.push_back (MenuElem (
_(
"Add New Aux Bus (pre-fader)"), sigc::bind (sigc::mem_fun (*
this, &
GroupTabs::subgroup), g,
true,
PreFader)));
334 items.push_back (MenuElem (
_(
"Add New Aux Bus (post-fader)"), sigc::bind (sigc::mem_fun (*
this, &
GroupTabs::subgroup), g,
true,
PostFader)));
339 items.push_back (SeparatorElem());
365 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
366 if ((*i)->record_enabled()) {
367 rec_enabled.push_back (*i);
371 if (rec_enabled.empty()) {
385 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
386 if (!(*i)->is_master() && (*i)->soloed()) {
387 soloed.push_back (*i);
391 if (soloed.empty()) {
430 for (RouteList::const_iterator i = rl.begin(); i != rl.end(); ++i) {
493 int const N = group_routes->size ();
495 RouteList::iterator i = group_routes->begin ();
498 RouteList::const_iterator j = routes->begin ();
502 while (i != group_routes->end() && j != routes->end()) {
504 int const k = (*j)->order_key ();
515 (*j)->set_order_key (coll);
522 (*j)->set_order_key (k + diff);
571 if (r == 0 && g == 0 && b == 0) {
585 snprintf (buf,
sizeof (buf),
"%d:%d:%d", (r<<8), (g<<8), (b<<8));
609 snprintf (buf,
sizeof (buf),
"route_group %s", group->
id().
to_s().c_str ());
637 sscanf (color.c_str(),
"%d:%d:%d", &r, &g, &b);
693 (*i)->gui_changed (
X_(
"color"), 0);
Gdk::Color unique_random_color(std::list< Gdk::Color > &)
bool _drag_moved
true if there has been movement during any current drag
std::string get_string(const std::string &id, const std::string &prop_name, bool *empty=0)
void add_route_group(RouteGroup *)
std::list< Tab > _tabs
current list of tabs
PBD::Signal1< void, const PropertyChange & > PropertyChanged
void new_from_rec_enabled()
double _drag_moving
the position of the moving end of the tab being dragged
double _drag_offset
offset from the mouse to the end of the tab being dragged
PBD::Signal1< void, RouteGroup * > RouteGroupPropertyChanged
Tab * _dragging
tab being dragged, or 0
bool _dragging_new_tab
true if we're dragging a new tab
static ARDOUR_UI * instance()
void route_removed_from_route_group(ARDOUR::RouteGroup *, boost::weak_ptr< ARDOUR::Route >)
static void set_group_color(ARDOUR::RouteGroup *, uint32_t)
void route_added_to_route_group(ARDOUR::RouteGroup *, boost::weak_ptr< ARDOUR::Route >)
void remove_group(ARDOUR::RouteGroup *)
bool has_subgroup() const
void remove_route_group(RouteGroup &)
virtual ARDOUR::RouteList selected_routes() const =0
LIBARDOUR_API PBD::PropertyDescriptor< bool > gain
PBD::Signal2< void, RouteGroup *, boost::weak_ptr< Route > > RouteAddedToRouteGroup
double _drag_max
maximum position for drag
void subgroup(ARDOUR::RouteGroup *, bool, ARDOUR::Placement)
void collect(ARDOUR::RouteGroup *)
#define UINT_TO_RGBA(u, r, g, b, a)
virtual void add_menu_items(Gtk::Menu *, ARDOUR::RouteGroup *)
void route_group_property_changed(ARDOUR::RouteGroup *)
GUIObjectState * gui_object_state
void set_session(ARDOUR::Session *)
Gtk::Menu * get_menu(ARDOUR::RouteGroup *g)
double _drag_fixed
the position of the fixed end of the tab being dragged
LIBGTKMM2EXT_API uint64_t Keyboard
virtual bool apply_changes(PropertyBase const &)
void make_subgroup(bool, Placement)
void new_from_selection()
uint32_t gdk_color_to_rgba(Gdk::Color const &)
bool on_button_release_event(GdkEventButton *)
void foreach_route_group(boost::function< void(RouteGroup *)> f)
PBD::Signal2< void, std::string, void * > gui_changed
static void emit_gui_changed_for_members(ARDOUR::RouteGroup *)
uint32_t order_key() const
Tab * click_to_tab(double, std::list< Tab >::iterator *, std::list< Tab >::iterator *)
double _drag_min
minimum position for drag
LIBARDOUR_API PBD::PropertyDescriptor< bool > recenable
LIBARDOUR_API PBD::PropertyDescriptor< bool > route_active
int remove(boost::shared_ptr< Route >)
const PBD::ID & id() const
ARDOUR::RouteGroup * create_and_add_group() const
virtual void draw_tab(cairo_t *cr, Tab const &t) const =0
virtual PBD::PropertyList default_properties() const
virtual void sync_order_keys()=0
LIBARDOUR_API PBD::PropertyDescriptor< bool > mute
boost::shared_ptr< RouteList > get_routes() const
void un_subgroup(ARDOUR::RouteGroup *)
virtual double extent() const =0
PBD::ScopedConnectionList _session_connections
LIBARDOUR_API PBD::PropertyDescriptor< bool > active
void set_activation(ARDOUR::RouteGroup *, bool)
virtual ARDOUR::RouteList routes_for_tab(Tab const *t) const =0
void render(cairo_t *, cairo_rectangle_t *)
bool on_button_press_event(GdkEventButton *)
static uint32_t group_color(ARDOUR::RouteGroup *)
void on_size_request(Gtk::Requisition *)
double _drag_first
first mouse pointer position during drag
LIBARDOUR_API PBD::PropertyDescriptor< bool > solo
virtual std::list< Tab > compute_tabs() const =0
LIBARDOUR_API PBD::PropertyDescriptor< bool > relative
ARDOUR::RouteGroup * group
route group
boost::shared_ptr< RouteList > route_list()
sigc::signal< void > ColorsChanged
LIBARDOUR_API PBD::PropertyDescriptor< bool > select
bool on_motion_notify_event(GdkEventMotion *)
int add(boost::shared_ptr< Route >)
void edit_group(ARDOUR::RouteGroup *)
static std::string group_gui_id(ARDOUR::RouteGroup *)
void set_property(const std::string &id, const std::string &prop_name, const T &val)
PBD::Signal2< void, RouteGroup *, boost::weak_ptr< Route > > RouteRemovedFromRouteGroup
#define RGBA_TO_UINT(r, g, b, a)
static std::list< Gdk::Color > _used_colors
std::list< boost::shared_ptr< Route > > RouteList
void set_active(bool yn, void *src)
virtual double primary_coordinate(double, double) const =0
bool add(PropertyBase *prop)
void run_new_group_dialog(ARDOUR::RouteList const &)
ARDOUR::Session * _session
PBD::Signal0< void > route_group_removed
ARDOUR::RouteList _initial_dragging_routes
LIBARDOUR_API PBD::PropertyDescriptor< bool > color
LIBARDOUR_API PBD::PropertyDescriptor< bool > monitoring