--- gigedit/trunk/src/gigedit/dimregionedit.h 2007/06/10 10:56:11 1225 +++ gigedit/trunk/src/gigedit/dimregionedit.h 2013/01/07 20:41:16 2392 @@ -1,5 +1,5 @@ /* -*- c++ -*- - * Copyright (C) 2006, 2007 Andreas Persson + * Copyright (C) 2006-2013 Andreas Persson * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -22,31 +22,84 @@ #include +#include #include #include #include #include -#include + +#include #include "paramedit.h" +class VelocityCurve : public Gtk::DrawingArea { +public: + VelocityCurve(double (gig::DimensionRegion::*getter)(uint8_t)); + void set_dim_region(gig::DimensionRegion* d) { dimreg = d; } + +protected: +#if (GTKMM_MAJOR_VERSION == 2 && GTKMM_MINOR_VERSION < 90) || GTKMM_MAJOR_VERSION < 2 + bool on_expose_event(GdkEventExpose* e); +#else + bool on_draw(const Cairo::RefPtr& cr); +#endif + +private: + double (gig::DimensionRegion::* const getter)(uint8_t); + gig::DimensionRegion* dimreg; +}; + +class CrossfadeCurve : public Gtk::DrawingArea { +public: + CrossfadeCurve(); + void set_dim_region(gig::DimensionRegion* d) { dimreg = d; } + +protected: +#if (GTKMM_MAJOR_VERSION == 2 && GTKMM_MINOR_VERSION < 90) || GTKMM_MAJOR_VERSION < 2 + bool on_expose_event(GdkEventExpose* e); +#else + bool on_draw(const Cairo::RefPtr& cr); +#endif + +private: + gig::DimensionRegion* dimreg; +}; + class DimRegionEdit : public Gtk::Notebook { public: DimRegionEdit(); virtual ~DimRegionEdit(); void set_dim_region(gig::DimensionRegion* d); + bool set_sample(gig::Sample* sample); Gtk::Entry* wSample; + sigc::signal& signal_dimreg_to_be_changed(); + sigc::signal& signal_dimreg_changed(); + sigc::signal& signal_sample_ref_changed(); + + std::set dimregs; protected: + sigc::signal dimreg_to_be_changed_signal; + sigc::signal dimreg_changed_signal; + sigc::signal sample_ref_changed_signal; + sigc::signal instrument_changed; + gig::DimensionRegion* dimregion; +#ifdef OLD_TOOLTIPS Gtk::Tooltips tooltips; +#endif Gtk::Table* table[7]; Gtk::Label* lSample; + VelocityCurve velocity_curve; + VelocityCurve release_curve; + VelocityCurve cutoff_curve; + CrossfadeCurve crossfade_curve; + NumEntryPermille eEG1PreAttack; NumEntryTemp eEG1Attack; NumEntryTemp eEG1Decay1; @@ -135,6 +188,8 @@ ChoiceEntry eSampleLoopType; BoolEntry eSampleLoopInfinite; NumEntryTemp eSampleLoopPlayCount; + Gtk::Label* lEG2; + Gtk::Label* lLFO2; int rowno; int pageno; @@ -142,10 +197,11 @@ void addProp(BoolEntry& boolentry); + void addProp(BoolEntryPlus6& boolentry); void addProp(LabelWidget& labelwidget); void addString(const char* labelText, Gtk::Label*& label, Gtk::Entry*& widget); - void addHeader(const char* text); + Gtk::Label* addHeader(const char* text); void nextPage(); void VCFEnabled_toggled(); @@ -163,10 +219,82 @@ void crossfade2_changed(); void crossfade3_changed(); void crossfade4_changed(); - void loop_enabled_toggled(); + void update_loop_elements(); + void loop_start_changed(); + void loop_length_changed(); void loop_infinite_toggled(); - void updateLoopElements(); + int update_model; + + // connect a widget to a setter function in DimRegionEdit + template + void connect(C& widget, + void (DimRegionEdit::*setter)(gig::DimensionRegion*, T)) { + connect(widget, + sigc::mem_fun(setter)); + } + + // connect a widget to a member variable in gig::DimensionRegion + template + void connect(C& widget, T gig::DimensionRegion::* member) { + connect(widget, + sigc::bind(sigc::mem_fun(&DimRegionEdit::set_member), member)); + } + + // connect a widget to a setter function in gig::DimensionRegion + template + void connect(C& widget, + void (gig::DimensionRegion::*setter)(T)) { + connect(widget, + sigc::hide<0>(sigc::mem_fun(setter))); + } + + // helper function for the connect functions above + template + void connect(C& widget, + sigc::slot setter) { + widget.signal_value_changed().connect( + sigc::compose(sigc::bind(sigc::mem_fun(*this, &DimRegionEdit::set_many), setter), + sigc::mem_fun(widget, &C::get_value))); + } + + // loop through all dimregions being edited ant set a value in + // each of them + template + void set_many(T value, + sigc::slot setter) { + if (update_model == 0) { + for (std::set::iterator i = dimregs.begin() ; + i != dimregs.end() ; i++) + { + dimreg_changed_signal(*i); + setter(this, *i, value); + } + } + } + + // set a value of a member variable in the given dimregion + template + void set_member(gig::DimensionRegion* d, T value, + T gig::DimensionRegion::* member) { + d->*member = value; + } + + // setters for specific dimregion parameters + + void set_UnityNote(gig::DimensionRegion* d, uint8_t value); + void set_FineTune(gig::DimensionRegion* d, int16_t value); + void set_Crossfade_in_start(gig::DimensionRegion* d, uint8_t value); + void set_Crossfade_in_end(gig::DimensionRegion* d, uint8_t value); + void set_Crossfade_out_start(gig::DimensionRegion* d, uint8_t value); + void set_Crossfade_out_end(gig::DimensionRegion* d, uint8_t value); + void set_Gain(gig::DimensionRegion* d, int32_t value); + void set_LoopEnabled(gig::DimensionRegion* d, bool value); + void set_LoopType(gig::DimensionRegion* d, uint32_t value); + void set_LoopStart(gig::DimensionRegion* d, uint32_t value); + void set_LoopLength(gig::DimensionRegion* d, uint32_t value); + void set_LoopInfinite(gig::DimensionRegion* d, bool value); + void set_LoopPlayCount(gig::DimensionRegion* d, uint32_t value); }; #endif