#include "keyboard.h"
#include "i18n.h"
#include "ardour_ui.h"
+#include "rgb_macros.h"
+#include "ui_config.h"
#include "utils.h"
using namespace std;
using namespace Gtk;
using namespace ARDOUR;
+using namespace ARDOUR_UI_UTILS;
using Gtkmm2ext::Keyboard;
list<Gdk::Color> GroupTabs::_used_colors;
, _dragging_new_tab (0)
{
add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::POINTER_MOTION_MASK);
+ UIConfiguration::instance().ColorsChanged.connect (sigc::mem_fun (*this, &GroupTabs::queue_draw));
}
GroupTabs::~GroupTabs ()
_session->RouteRemovedFromRouteGroup.connect (
_session_connections, invalidator (*this), boost::bind (&GroupTabs::route_removed_from_route_group, this, _1, _2), gui_context()
);
-
- _session->route_group_removed.connect (_session_connections, invalidator (*this), boost::bind (&GroupTabs::set_dirty, this), gui_context());
+
+ _session->route_group_removed.connect (_session_connections, invalidator (*this), boost::bind (&GroupTabs::set_dirty, this, (cairo_rectangle_t*)0), gui_context());
}
}
} else if (ev->button == 3) {
RouteGroup* g = t ? t->group : 0;
-
+
if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier) && g) {
/* edit */
RouteGroupDialog d (g, false);
d.do_run ();
} else {
- Menu* m = get_menu (g);
+ Menu* m = get_menu (g, true);
if (m) {
m->popup (ev->button, ev->time);
}
if (_dragging == 0) {
return false;
}
-
+
if (!_drag_moved) {
-
+
if (_dragging->group) {
/* toggle active state */
_dragging->group->set_active (!_dragging->group->is_active (), this);
}
-
+
} else {
/* finish drag */
RouteList routes = routes_for_tab (_dragging);
-
+
if (!routes.empty()) {
if (_dragging_new_tab) {
RouteGroup* g = create_and_add_group ();
} else {
boost::shared_ptr<RouteList> r = _session->get_routes ();
for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
-
+
bool const was_in_tab = find (
_initial_dragging_routes.begin(), _initial_dragging_routes.end(), *i
) != _initial_dragging_routes.end ();
-
+
bool const now_in_tab = find (routes.begin(), routes.end(), *i) != routes.end();
-
+
if (was_in_tab && !now_in_tab) {
_dragging->group->remove (*i);
} else if (!was_in_tab && now_in_tab) {
}
}
}
-
+
set_dirty ();
queue_draw ();
}
-
+
_dragging = 0;
_initial_dragging_routes.clear ();
}
void
-GroupTabs::render (cairo_t* cr)
+GroupTabs::render (cairo_t* cr, cairo_rectangle_t*)
{
if (_dragging == 0) {
_tabs = compute_tabs ();
cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
cairo_rectangle (cr, 0, 0, get_width(), get_height());
cairo_fill (cr);
-
+
/* tabs */
for (list<Tab>::const_iterator i = _tabs.begin(); i != _tabs.end(); ++i) {
}
Gtk::Menu*
-GroupTabs::get_menu (RouteGroup* g)
+GroupTabs::get_menu (RouteGroup* g, bool TabArea)
{
using namespace Menu_Helpers;
_menu->set_name ("ArdourContextMenu");
MenuList& items = _menu->items();
- items.push_back (MenuElem (_("Create New Group ..."), hide_return (sigc::mem_fun(*this, &GroupTabs::create_and_add_group))));
+ if (!TabArea) {
+ items.push_back (MenuElem (_("Create New Group ..."), hide_return (sigc::mem_fun(*this, &GroupTabs::create_and_add_group))));
+ }
+
items.push_back (MenuElem (_("Create New Group From"), *new_from));
if (g) {
GroupTabs::run_new_group_dialog (RouteList const & rl)
{
RouteGroup* g = new RouteGroup (*_session, "");
- g->apply_changes (default_properties ());
-
RouteGroupDialog d (g, true);
if (d.do_run ()) {
GroupTabs::create_and_add_group () const
{
RouteGroup* g = new RouteGroup (*_session, "");
-
- g->apply_changes (default_properties ());
-
RouteGroupDialog d (g, true);
if (d.do_run ()) {
++j;
}
- sync_order_keys ();
+ _session->sync_order_keys ();
}
void
/** Set the color of the tab of a route group */
void
-GroupTabs::set_group_color (RouteGroup* group, Gdk::Color color)
+GroupTabs::set_group_color (RouteGroup* group, uint32_t color)
{
assert (group);
+ uint32_t r, g, b, a;
+
+ UINT_TO_RGBA (color, &r, &g, &b, &a);
/* Hack to disallow black route groups; force a dark grey instead */
- if (color.get_red() == 0 && color.get_green() == 0 && color.get_blue() == 0) {
- color.set_grey_p (0.1);
+
+ if (r == 0 && g == 0 && b == 0) {
+ r = 25;
+ g = 25;
+ b = 25;
}
-
+
GUIObjectState& gui_state = *ARDOUR_UI::instance()->gui_object_state;
char buf[64];
- snprintf (buf, sizeof (buf), "%d:%d:%d", color.get_red(), color.get_green(), color.get_blue());
+
+ /* for historical reasons the colors must be stored as 16 bit color
+ * values. Ugh.
+ */
+
+ snprintf (buf, sizeof (buf), "%d:%d:%d", (r<<8), (g<<8), (b<<8));
gui_state.set_property (group_gui_id (group), "color", buf);
-
+
/* the group color change notification */
-
+
PBD::PropertyChange change;
change.add (Properties::color);
group->PropertyChanged (change);
}
/** @return the color to use for a route group tab */
-Gdk::Color
+uint32_t
GroupTabs::group_color (RouteGroup* group)
{
assert (group);
-
- GUIObjectState& gui_state = *ARDOUR_UI::instance()->gui_object_state;
+ GUIObjectState& gui_state = *ARDOUR_UI::instance()->gui_object_state;
string const gui_id = group_gui_id (group);
-
bool empty;
string const color = gui_state.get_string (gui_id, "color", &empty);
+
if (empty) {
/* no color has yet been set, so use a random one */
- Gdk::Color const color = unique_random_color (_used_colors);
- set_group_color (group, color);
- return color;
+ uint32_t c = gdk_color_to_rgba (unique_random_color (_used_colors));
+ set_group_color (group, c);
+ return c;
}
- Gdk::Color c;
-
int r, g, b;
+ /* for historical reasons, colors are stored as 16 bit values.
+ */
+
sscanf (color.c_str(), "%d:%d:%d", &r, &g, &b);
- c.set_red (r);
- c.set_green (g);
- c.set_blue (b);
-
- return c;
+ r /= 256;
+ g /= 256;
+ b /= 256;
+
+ return RGBA_TO_UINT (r, g, b, 255);
}
void
*/
emit_gui_changed_for_members (rg);
-
+
set_dirty ();
}