start repacking beatbox GUI using constraint packing

This commit is contained in:
Paul Davis 2020-07-08 21:49:52 -06:00
parent 28f85747ca
commit d51893dec6
2 changed files with 44 additions and 38 deletions

View file

@ -20,7 +20,7 @@
#include <cstdlib> #include <cstdlib>
#include <ctime> #include <ctime>
#include <boost/math/common_factor.hpp> #include <boost/integer/common_factor.hpp>
#include "pbd/compose.h" #include "pbd/compose.h"
#include "pbd/i18n.h" #include "pbd/i18n.h"
@ -38,6 +38,7 @@
#include "canvas/canvas.h" #include "canvas/canvas.h"
#include "canvas/grid.h" #include "canvas/grid.h"
#include "canvas/box.h" #include "canvas/box.h"
#include "canvas/cbox.h"
#include "canvas/rectangle.h" #include "canvas/rectangle.h"
#include "canvas/polygon.h" #include "canvas/polygon.h"
#include "canvas/scroll_group.h" #include "canvas/scroll_group.h"
@ -69,6 +70,7 @@ BBGUI::BBGUI (boost::shared_ptr<BeatBox> bb)
, bbox (bb) , bbox (bb)
, horizontal_adjustment (0.0, 0.0, 800.0) , horizontal_adjustment (0.0, 0.0, 800.0)
, vertical_adjustment (0.0, 0.0, 10.0, 400.0) , vertical_adjustment (0.0, 0.0, 10.0, 400.0)
, export_as_region_button (_("Export as Region"))
, vscrollbar (vertical_adjustment) , vscrollbar (vertical_adjustment)
{ {
_canvas_viewport = new GtkCanvasViewport (horizontal_adjustment, vertical_adjustment); _canvas_viewport = new GtkCanvasViewport (horizontal_adjustment, vertical_adjustment);
@ -242,67 +244,66 @@ SequencerView::SequencerView (StepSequencer& s, ArdourCanvas::Item *p)
const Duple mode_button_center (mode_button_width/2.0, mode_button_height/2.0); const Duple mode_button_center (mode_button_width/2.0, mode_button_height/2.0);
no_scroll_group = new ArdourCanvas::Container (_canvas->root()); no_scroll_group = new ArdourCanvas::Container (_canvas->root());
no_scroll_vbox = new ArdourCanvas::cBox (_canvas->root(), ArdourCanvas::Vertical);
button_packer = new ArdourCanvas::cBox (_canvas->root(), ArdourCanvas::Horizontal);
no_scroll_vbox->pack_start (button_packer, PackOptions (PackExpand|PackFill), PackOptions (0));
v_scroll_group = new ScrollGroup (_canvas->root(), ScrollGroup::ScrollsVertically); v_scroll_group = new ScrollGroup (_canvas->root(), ScrollGroup::ScrollsVertically);
_canvas->add_scroller (*v_scroll_group); _canvas->add_scroller (*v_scroll_group);
sequence_vbox = new ArdourCanvas::VBox (v_scroll_group); sequence_vbox = new ArdourCanvas::cBox (v_scroll_group, ArdourCanvas::Vertical);
sequence_vbox->set_position (Duple (0, (mode_button_ydim + mode_button_spacing) + _step_dimen + 3)); sequence_vbox->set_position (Duple (0, (mode_button_ydim + mode_button_spacing) + _step_dimen + 3));
velocity_mode_button = new Rectangle (no_scroll_group); velocity_mode_button = new Rectangle (_canvas);
velocity_mode_button->set_corner_radius (10.0); velocity_mode_button->set_corner_radius (10.0);
velocity_mode_button->set_position (Duple (rhs_xoffset, mode_button_spacing)); velocity_mode_button->set_intrinsic_size (mode_button_width, mode_button_height);
velocity_mode_button->set (Rect (0, 0, mode_button_width, mode_button_height));
velocity_mode_button->set_fill_color (current_mode_color); velocity_mode_button->set_fill_color (current_mode_color);
velocity_mode_text = new Text (velocity_mode_button); velocity_mode_text = new Text (velocity_mode_button);
velocity_mode_text->set_font_description (UIConfiguration::instance().get_LargeFont()); velocity_mode_text->set_font_description (UIConfiguration::instance().get_LargeFont());
velocity_mode_text->set (_("Velocity")); velocity_mode_text->set (_("Velocity"));
velocity_mode_text->set_color (contrasting_text_color (velocity_mode_button->fill_color())); velocity_mode_text->set_color (contrasting_text_color (velocity_mode_button->fill_color()));
velocity_mode_text->set_position (mode_button_center.translate (Duple (-velocity_mode_text->width()/2.0, -velocity_mode_text->height()/2.0)));
pitch_mode_button = new Rectangle (no_scroll_group); pitch_mode_button = new Rectangle (_canvas);
pitch_mode_button->set_corner_radius (10.0); pitch_mode_button->set_corner_radius (10.0);
pitch_mode_button->set_position (Duple (rhs_xoffset + mode_button_xdim, mode_button_spacing)); pitch_mode_button->set_intrinsic_size (mode_button_width, mode_button_height);
pitch_mode_button->set (Rect (0, 0, mode_button_width, mode_button_height));
pitch_mode_button->set_fill_color (not_current_mode_color); pitch_mode_button->set_fill_color (not_current_mode_color);
pitch_mode_text = new Text (pitch_mode_button); pitch_mode_text = new Text (pitch_mode_button);
pitch_mode_text->set_font_description (UIConfiguration::instance().get_LargeFont()); pitch_mode_text->set_font_description (UIConfiguration::instance().get_LargeFont());
pitch_mode_text->set (_("Pitch")); pitch_mode_text->set (_("Pitch"));
pitch_mode_text->set_color (contrasting_text_color (pitch_mode_button->fill_color())); pitch_mode_text->set_color (contrasting_text_color (pitch_mode_button->fill_color()));
pitch_mode_text->set_position (mode_button_center.translate (Duple (-pitch_mode_text->width()/2.0, -pitch_mode_text->height()/2.0)));
gate_mode_button = new Rectangle (no_scroll_group); gate_mode_button = new Rectangle (_canvas);
gate_mode_button->set_corner_radius (10.0); gate_mode_button->set_corner_radius (10.0);
gate_mode_button->set_position (Duple (rhs_xoffset + (mode_button_xdim * 2), mode_button_spacing)); gate_mode_button->set_intrinsic_size (mode_button_width, mode_button_height);
gate_mode_button->set (Rect (0, 0, mode_button_width, mode_button_height));
gate_mode_button->set_fill_color (not_current_mode_color); gate_mode_button->set_fill_color (not_current_mode_color);
gate_mode_text = new Text (gate_mode_button); gate_mode_text = new Text (gate_mode_button);
gate_mode_text->set_font_description (UIConfiguration::instance().get_LargeFont()); gate_mode_text->set_font_description (UIConfiguration::instance().get_LargeFont());
gate_mode_text->set (_("Gate")); gate_mode_text->set (_("Gate"));
gate_mode_text->set_color (contrasting_text_color (gate_mode_button->fill_color())); gate_mode_text->set_color (contrasting_text_color (gate_mode_button->fill_color()));
gate_mode_text->set_position (mode_button_center.translate (Duple (-gate_mode_text->width()/2.0, -gate_mode_text->height()/2.0)));
octave_mode_button = new Rectangle (no_scroll_group); octave_mode_button = new Rectangle (_canvas);
octave_mode_button->set_corner_radius (10.0); octave_mode_button->set_corner_radius (10.0);
octave_mode_button->set_position (Duple (rhs_xoffset + (mode_button_xdim * 3), mode_button_spacing)); octave_mode_button->set_intrinsic_size (mode_button_width, mode_button_height);
octave_mode_button->set (Rect (0, 0, mode_button_width, mode_button_height));
octave_mode_button->set_fill_color (not_current_mode_color); octave_mode_button->set_fill_color (not_current_mode_color);
octave_mode_text = new Text (octave_mode_button); octave_mode_text = new Text (octave_mode_button);
octave_mode_text->set_font_description (UIConfiguration::instance().get_LargeFont()); octave_mode_text->set_font_description (UIConfiguration::instance().get_LargeFont());
octave_mode_text->set (_("Octave")); octave_mode_text->set (_("Octave"));
octave_mode_text->set_color (contrasting_text_color (octave_mode_button->fill_color())); octave_mode_text->set_color (contrasting_text_color (octave_mode_button->fill_color()));
octave_mode_text->set_position (mode_button_center.translate (Duple (-octave_mode_text->width()/2.0, -octave_mode_text->height()/2.0)));
timing_mode_button = new Rectangle (no_scroll_group); timing_mode_button = new Rectangle (_canvas);
timing_mode_button->set_corner_radius (10.0); timing_mode_button->set_corner_radius (10.0);
timing_mode_button->set_position (Duple (rhs_xoffset + (mode_button_xdim * 4), mode_button_spacing)); timing_mode_button->set_intrinsic_size (mode_button_width, mode_button_height);
timing_mode_button->set (Rect (0, 0, mode_button_width, mode_button_height));
timing_mode_button->set_fill_color (not_current_mode_color); timing_mode_button->set_fill_color (not_current_mode_color);
timing_mode_text = new Text (timing_mode_button); timing_mode_text = new Text (timing_mode_button);
timing_mode_text->set_font_description (UIConfiguration::instance().get_LargeFont()); timing_mode_text->set_font_description (UIConfiguration::instance().get_LargeFont());
timing_mode_text->set (_("Timing")); timing_mode_text->set (_("Timing"));
timing_mode_text->set_color (contrasting_text_color (timing_mode_button->fill_color())); timing_mode_text->set_color (contrasting_text_color (timing_mode_button->fill_color()));
timing_mode_text->set_position (mode_button_center.translate (Duple (-timing_mode_text->width()/2.0, -timing_mode_text->height()/2.0)));
button_packer->pack_start (velocity_mode_button, PackOptions (PackExpand|PackFill), PackOptions (0));
button_packer->pack_start (pitch_mode_button, PackOptions (PackExpand|PackFill), PackOptions (0));
button_packer->pack_start (gate_mode_button, PackOptions (PackExpand|PackFill), PackOptions (0));
button_packer->pack_start (octave_mode_button, PackOptions (PackExpand|PackFill), PackOptions (0));
button_packer->pack_start (timing_mode_button, PackOptions (PackExpand|PackFill), PackOptions (0));
/* place "us", the rectangle that contains/defines/draws the grid */ /* place "us", the rectangle that contains/defines/draws the grid */
set_position (Duple (rhs_xoffset, _step_dimen + mode_button_ydim + mode_button_spacing)); set_position (Duple (rhs_xoffset, _step_dimen + mode_button_ydim + mode_button_spacing));
@ -370,8 +371,8 @@ SequencerView::sequencer_changed (PropertyChange const &)
set (Rect (0, 0, _width, _height)); set (Rect (0, 0, _width, _height));
if (!step_indicator_box) { if (!step_indicator_box) {
step_indicator_box = new ArdourCanvas::HBox (no_scroll_group); step_indicator_box = new ArdourCanvas::cBox (_canvas, ArdourCanvas::Horizontal);
step_indicator_box->set_position (Duple (rhs_xoffset, mode_button_height + (mode_button_spacing * 2.0))); no_scroll_vbox->pack_start (step_indicator_box);
step_indicator_box->name = "step_indicator_box"; step_indicator_box->name = "step_indicator_box";
step_indicator_box->set_fill (true); step_indicator_box->set_fill (true);
step_indicator_box->set_spacing (1.0); step_indicator_box->set_spacing (1.0);
@ -388,7 +389,8 @@ SequencerView::sequencer_changed (PropertyChange const &)
size_t n = step_indicators.size(); size_t n = step_indicators.size();
while (step_indicators.size() < nsteps) { while (step_indicators.size() < nsteps) {
SequencerStepIndicator* ssi = new SequencerStepIndicator (*this, step_indicator_box, n); SequencerStepIndicator* ssi = new SequencerStepIndicator (*this, canvas(), n);
step_indicator_box->pack_start (ssi, PackOptions (PackExpand|PackFill), PackOptions (0));
step_indicators.push_back (ssi); step_indicators.push_back (ssi);
++n; ++n;
} }
@ -522,8 +524,8 @@ Gtkmm2ext::Color SequencerStepIndicator::current_text_color = Gtkmm2ext::Color (
Gtkmm2ext::Color SequencerStepIndicator::bright_outline_color = Gtkmm2ext::Color (0); Gtkmm2ext::Color SequencerStepIndicator::bright_outline_color = Gtkmm2ext::Color (0);
int SequencerStepIndicator::dragging = 0; int SequencerStepIndicator::dragging = 0;
SequencerStepIndicator::SequencerStepIndicator (SequencerView& s, Item* p, size_t n) SequencerStepIndicator::SequencerStepIndicator (SequencerView& s, ArdourCanvas::Canvas* c, size_t n)
: Rectangle (p) : Rectangle (c)
, sv (s) , sv (s)
, number (n) , number (n)
, being_dragged (false) , being_dragged (false)
@ -536,7 +538,7 @@ SequencerStepIndicator::SequencerStepIndicator (SequencerView& s, Item* p, size_
bright_outline_color = UIConfiguration::instance().color ("gtk_bright_indicator"); bright_outline_color = UIConfiguration::instance().color ("gtk_bright_indicator");
} }
set (Rect (0.0, 0.0, _step_dimen - 1, _step_dimen - 1)); // UR/LR corners, not UR, width, height set_intrinsic_size (_step_dimen - 1, _step_dimen - 1);
set_fill_color (HSV (UIConfiguration::instance().color ("gtk_bases")).lighter (0.1)); set_fill_color (HSV (UIConfiguration::instance().color ("gtk_bases")).lighter (0.1));
set_fill (true); set_fill (true);
@ -696,8 +698,8 @@ SequencerStepIndicator::render (Rect const & area, Cairo::RefPtr<Cairo::Context
Gtkmm2ext::Color StepView::on_fill_color = Gtkmm2ext::Color (0); Gtkmm2ext::Color StepView::on_fill_color = Gtkmm2ext::Color (0);
Gtkmm2ext::Color StepView::off_fill_color = Gtkmm2ext::Color (0); Gtkmm2ext::Color StepView::off_fill_color = Gtkmm2ext::Color (0);
StepView::StepView (SequenceView& sview, Step& s, ArdourCanvas::Item* parent) StepView::StepView (SequenceView& sview, Step& s, ArdourCanvas::Canvas* c)
: ArdourCanvas::Rectangle (parent) : ArdourCanvas::Rectangle (c)
, _step (s) , _step (s)
, sv (sview) , sv (sview)
, text (new Text (this)) , text (new Text (this))
@ -780,7 +782,7 @@ StepView::set_timing_text ()
if (_step.offset() == Temporal::Beats()) { if (_step.offset() == Temporal::Beats()) {
text->set (X_("0")); text->set (X_("0"));
} else { } else {
const int64_t gcd = boost::math::gcd (_step.offset().to_ticks(), int64_t (1920)); const int64_t gcd = boost::integer::gcd (_step.offset().to_ticks(), int64_t (1920));
const int64_t n = _step.offset().to_ticks() / gcd; const int64_t n = _step.offset().to_ticks() / gcd;
const int64_t d = 1920 / gcd; const int64_t d = 1920 / gcd;
text->set (string_compose ("%1/%2", n, d)); text->set (string_compose ("%1/%2", n, d));
@ -1047,7 +1049,7 @@ StepView::adjust_step_duration (Step::DurationRatio const & amt)
/**/ /**/
SequenceView::SequenceView (SequencerView& sview, StepSequence& sq, Item* parent) SequenceView::SequenceView (SequencerView& sview, StepSequence& sq, Item* parent)
: HBox (parent) : cBox (parent, Horizontal)
, sv (sview) , sv (sview)
, sequence (sq) , sequence (sq)
{ {
@ -1098,8 +1100,9 @@ SequenceView::SequenceView (SequencerView& sview, StepSequence& sq, Item* parent
const size_t nsteps = sequencer().nsteps(); const size_t nsteps = sequencer().nsteps();
for (size_t n = 0; n < nsteps; ++n) { for (size_t n = 0; n < nsteps; ++n) {
StepView* stepview = new StepView (*this, sequence.step (n), this); StepView* stepview = new StepView (*this, sequence.step (n), canvas());
step_views.push_back (stepview); step_views.push_back (stepview);
pack_start (stepview, PackOptions (PackExpand|PackFill), PackOptions (PackExpand|PackFill));
} }
} }

View file

@ -36,6 +36,7 @@
#include "widgets/ardour_button.h" #include "widgets/ardour_button.h"
#include "canvas/box.h" #include "canvas/box.h"
#include "canvas/cbox.h"
#include "canvas/canvas.h" #include "canvas/canvas.h"
#include "canvas/rectangle.h" #include "canvas/rectangle.h"
@ -110,8 +111,10 @@ class SequencerView : public ArdourCanvas::Rectangle, public sigc::trackable {
Mode _mode; Mode _mode;
ArdourCanvas::ScrollGroup* v_scroll_group; ArdourCanvas::ScrollGroup* v_scroll_group;
ArdourCanvas::Container* no_scroll_group; ArdourCanvas::Container* no_scroll_group;
ArdourCanvas::HBox* step_indicator_box; ArdourCanvas::cBox* no_scroll_vbox;
ArdourCanvas::VBox* sequence_vbox; ArdourCanvas::cBox* button_packer;
ArdourCanvas::cBox* step_indicator_box;
ArdourCanvas::cBox* sequence_vbox;
ArdourCanvas::Rectangle* velocity_mode_button; ArdourCanvas::Rectangle* velocity_mode_button;
ArdourCanvas::Rectangle* pitch_mode_button; ArdourCanvas::Rectangle* pitch_mode_button;
@ -135,7 +138,7 @@ class SequencerView : public ArdourCanvas::Rectangle, public sigc::trackable {
}; };
class SequenceView : public ArdourCanvas::HBox class SequenceView : public ArdourCanvas::cBox
{ {
public: public:
SequenceView (SequencerView&, ARDOUR::StepSequence&, ArdourCanvas::Item* parent); SequenceView (SequencerView&, ARDOUR::StepSequence&, ArdourCanvas::Item* parent);
@ -172,7 +175,7 @@ class SequenceView : public ArdourCanvas::HBox
class StepView : public ArdourCanvas::Rectangle, public sigc::trackable { class StepView : public ArdourCanvas::Rectangle, public sigc::trackable {
public: public:
StepView (SequenceView&, ARDOUR::Step&, ArdourCanvas::Item* parent); StepView (SequenceView&, ARDOUR::Step&, ArdourCanvas::Canvas* canvas);
void render (ArdourCanvas::Rect const &, Cairo::RefPtr<Cairo::Context>) const; void render (ArdourCanvas::Rect const &, Cairo::RefPtr<Cairo::Context>) const;
bool on_event (GdkEvent*); bool on_event (GdkEvent*);
@ -213,7 +216,7 @@ class StepView : public ArdourCanvas::Rectangle, public sigc::trackable {
class SequencerStepIndicator : public ArdourCanvas::Rectangle, public sigc::trackable { class SequencerStepIndicator : public ArdourCanvas::Rectangle, public sigc::trackable {
public: public:
SequencerStepIndicator (SequencerView&, ArdourCanvas::Item* parent, size_t n); SequencerStepIndicator (SequencerView&, ArdourCanvas::Canvas*, size_t n);
void render (ArdourCanvas::Rect const &, Cairo::RefPtr<Cairo::Context>) const; void render (ArdourCanvas::Rect const &, Cairo::RefPtr<Cairo::Context>) const;
bool on_event (GdkEvent*); bool on_event (GdkEvent*);