Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
+#include <stdlib.h>
+
#include "pbd/compose.h"
#include "pbd/convert.h"
#include "pbd/debug.h"
#include "gtkmm2ext/rgb_macros.h"
+#include "canvas/colors.h"
+
#include "push2.h"
#include "gui.h"
#include "layout.h"
build_maps ();
build_color_map ();
+ fill_color_table ();
/* master cannot be removed, so no need to connect to going-away signal */
master = session->master_out ();
Push2::build_color_map ()
{
/* These are "standard" colors that Ableton docs suggest will always be
- there
+ there. Put them in our color map so that when we look up these
+ colors, we will use the Ableton indices for them.
*/
color_map.insert (make_pair (RGB_TO_UINT (0,0,0), 0));
color_map_free_list.push (n);
}
}
+
+void
+Push2::fill_color_table ()
+{
+ colors.insert (make_pair (DarkBackground, ArdourCanvas::rgba_to_color (0, 0, 0, 1)));
+ colors.insert (make_pair (LightBackground, ArdourCanvas::rgba_to_color (0.98, 0.98, 0.98, 1)));
+
+ colors.insert (make_pair (ParameterName, ArdourCanvas::rgba_to_color (0.32, 0.28, 0.47, 1)));
+
+ colors.insert (make_pair (KnobArcBackground, ArdourCanvas::rgba_to_color (0.3, 0.3, 0.3, 1.0)));
+ colors.insert (make_pair (KnobArcStart, ArdourCanvas::rgba_to_color (1.0, 0.0, 0.0, 1.0)));
+ colors.insert (make_pair (KnobArcEnd, ArdourCanvas::rgba_to_color (0.0, 1.0, 0.0, 1.0)));
+
+ colors.insert (make_pair (KnobLineShadow, ArdourCanvas::rgba_to_color (0, 0, 0, 0.3)));
+ colors.insert (make_pair (KnobLine, ArdourCanvas::rgba_to_color (1, 1, 1, 1)));
+
+ colors.insert (make_pair (KnobForeground, ArdourCanvas::rgba_to_color (1, 1, 1, 1)));
+ colors.insert (make_pair (KnobBackground, ArdourCanvas::rgba_to_color (1, 1, 1, 1)));
+ colors.insert (make_pair (KnobShadow, ArdourCanvas::rgba_to_color (0, 0, 0, 0.1)));
+ colors.insert (make_pair (KnobBorder, ArdourCanvas::rgba_to_color (0, 0, 0, 1)));
+
+}
+
+uint32_t
+Push2::get_color (ColorName name)
+{
+ Colors::iterator c = colors.find (name);
+ if (c != colors.end()) {
+ return c->second;
+ }
+
+ return random();
+}
: Button (bb, ex, press, release, long_press) {}
};
+ enum ColorName {
+ DarkBackground,
+ LightBackground,
+
+ ParameterName,
+
+ KnobArcBackground,
+ KnobArcStart,
+ KnobArcEnd,
+
+ KnobLine,
+ KnobLineShadow,
+
+ KnobForeground,
+ KnobBackground,
+ KnobShadow,
+ KnobBorder,
+ };
+
public:
Push2 (ARDOUR::Session&);
~Push2 ();
void write (const MidiByteArray&);
uint8_t get_color_index (uint32_t rgb);
+ uint32_t get_color (ColorName);
static const int cols;
static const int rows;
bool percussion;
void set_percussive_mode (bool);
- /* color map */
+ /* color map (device side) */
typedef std::map<uint32_t,uint8_t> ColorMap;
typedef std::stack<uint8_t> ColorMapFreeList;
ColorMap color_map;
ColorMapFreeList color_map_free_list;
void build_color_map ();
+
+ /* our own colors */
+
+ typedef std::map<ColorName,uint32_t> Colors;
+ Colors colors;
+ void fill_color_table ();
};
} /* namespace */
#include "ardour/session.h"
#include "ardour/tempo.h"
+#include "gtkmm2ext/rgb_macros.h"
+
+#include "knob.h"
#include "menu.h"
#include "push2.h"
#include "track_mix.h"
+#include "utils.h"
#include "i18n.h"
{
name_layout = Pango::Layout::create (context);
- Pango::FontDescription fd ("Sans Bold 24");
+ Pango::FontDescription fd ("Sans Bold 14");
name_layout->set_font_description (fd);
Pango::FontDescription fd2 ("Sans 10");
lower_layout[n]->set_text ("mute");
}
+ Push2Knob* knob;
+
+ knob = new Push2Knob (p2);
+ knob->set_position (60, 80);
+ knob->set_radius (35);
+ knobs.push_back (knob);
+
+ knob = new Push2Knob (p2);
+ knob->set_position (180, 80);
+ knob->set_radius (35);
+ knobs.push_back (knob);
}
TrackMixLayout::~TrackMixLayout ()
{
+ for (vector<Push2Knob*>::iterator k = knobs.begin(); k != knobs.end(); ++k) {
+ delete *k;
+ }
}
bool
TrackMixLayout::redraw (Cairo::RefPtr<Cairo::Context> context) const
{
- if (!_dirty) {
+ bool children_dirty = false;
+
+ for (vector<Push2Knob*>::const_iterator k = knobs.begin(); k != knobs.end(); ++k) {
+ if ((*k)->dirty()) {
+ children_dirty = true;
+ break;
+ }
+ }
+
+ if (!children_dirty && !_dirty) {
return false;
}
- context->set_source_rgb (0.764, 0.882, 0.882);
- context->rectangle (0, 0, 960, 160);
+ set_source_rgb (context, p2.get_color (Push2::DarkBackground));
+ context->rectangle (0, 0, p2.cols, p2.rows);
context->fill ();
- context->set_source_rgb (0.23, 0.0, 0.349);
+ if (stripable) {
+ int r,g,b,a;
+ UINT_TO_RGBA (stripable->presentation_info().color(), &r, &g, &b, &a);
+ context->set_source_rgb (r/255.0, g/255.0, b/255.0);
+ } else {
+ context->set_source_rgb (0.23, 0.0, 0.349);
+ }
context->move_to (10, 2);
name_layout->update_from_cairo_context (context);
name_layout->show_in_cairo_context (context);
+ for (vector<Push2Knob*>::const_iterator k = knobs.begin(); k != knobs.end(); ++k) {
+ (*k)->redraw (context);
+ }
+
return true;
}
void
TrackMixLayout::strip_vpot (int n, int delta)
{
+ if (!stripable) {
+ return;
+ }
+
+ switch (n) {
+ case 0: /* gain */
+ boost::shared_ptr<AutomationControl> ac = stripable->gain_control();
+ if (ac) {
+ ac->set_value (ac->get_value() + ((2.0/64.0) * delta), PBD::Controllable::UseGroup);
+ }
+ break;
+ }
}
void
stripable->PropertyChanged.connect (stripable_connections, MISSING_INVALIDATOR, boost::bind (&TrackMixLayout::stripable_property_change, this, _1), &p2);
stripable->presentation_info().PropertyChanged.connect (stripable_connections, MISSING_INVALIDATOR, boost::bind (&TrackMixLayout::stripable_property_change, this, _1), &p2);
+ knobs[0]->set_controllable (stripable->gain_control());
+ knobs[1]->set_controllable (stripable->pan_azimuth_control());
+
name_changed ();
color_changed ();
}
#ifndef __ardour_push2_track_mix_layout_h__
#define __ardour_push2_track_mix_layout_h__
+#include <vector>
+
#include "layout.h"
namespace ARDOUR {
namespace ArdourSurface {
+class Push2Knob;
+
class TrackMixLayout : public Push2Layout
{
public:
Glib::RefPtr<Pango::Layout> upper_layout[8];
Glib::RefPtr<Pango::Layout> lower_layout[8];
+ std::vector<Push2Knob*> knobs;
+
void stripable_property_change (PBD::PropertyChange const& what_changed);
void drop_stripable ();
--- /dev/null
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include <cairomm/context.h>
+
+#include "gtkmm2ext/rgb_macros.h"
+
+#include "utils.h"
+
+void
+set_source_rgba (Cairo::RefPtr<Cairo::Context> context, uint32_t col, bool with_alpha)
+{
+ int r, g, b, a;
+
+ UINT_TO_RGBA (col, &r, &g, &b, &a);
+
+ if (with_alpha) {
+ context->set_source_rgba (r/255.0, g/255.0, b/255.0, a/255.0);
+ } else {
+ context->set_source_rgb (r/255.0, g/255.0, b/255.0);
+ }
+}
+
+void
+set_source_rgb (Cairo::RefPtr<Cairo::Context> context, uint32_t color)
+{
+ set_source_rgba (context, color, false);
+}
--- /dev/null
+/*
+ Copyright (C) 2016 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __ardour_push2_utils_h__
+#define __ardour_push2_utils_h__
+
+#include <stdint.h>
+
+#include <cairomm/refptr.h>
+
+namespace Cairo {
+ class Context;
+}
+
+void set_source_rgba (Cairo::RefPtr<Cairo::Context>, uint32_t color, bool with_alpha = true);
+void set_source_rgb (Cairo::RefPtr<Cairo::Context> context, uint32_t color);
+
+#endif /* __ardour_push2_utils_h__ */
midi_byte_array.cc
leds.cc
gui.cc
+ knob.cc
layout.cc
mode.cc
menu.cc
mix.cc
scale.cc
track_mix.cc
+ utils.cc
'''
obj.export_includes = ['.']
obj.defines = [ 'PACKAGE="ardour_push2"' ]
obj.name = 'libardour_push2'
obj.target = 'ardour_push2'
obj.uselib = 'CAIROMM PANGOMM USB GTKMM'
- obj.use = 'libardour libardour_cp libgtkmm2ext libpbd libevoral libtimecode'
+ obj.use = 'libardour libardour_cp libgtkmm2ext libpbd libevoral libcanvas libtimecode'
obj.install_path = os.path.join(bld.env['LIBDIR'], 'surfaces')
def shutdown():