#include "gtk2ardour-config.h"
#endif
+#if !defined USE_CAIRO_IMAGE_SURFACE && !defined NDEBUG
+#define OPTIONAL_CAIRO_IMAGE_SURFACE
+#endif
+
#include <cairo/cairo.h>
#include <boost/algorithm/string.hpp>
using namespace ARDOUR;
using namespace ARDOUR_UI_UTILS;
-class AutoReturnTargetOptions : public OptionEditorBox
-{
- public:
- AutoReturnTargetOptions (RCConfiguration* c, Gtk::Window* p)
- : _rc_config (c)
- , range_selection_button (_("Play Range Selection"))
- , last_roll_button (_("Play from Last Roll"))
- , loop_button (_("Play Loop"))
- , region_selection_button (_("Play Region Selection"))
- , toggle_button (_("Enable/Disable all options"))
- {
- _box->pack_start (range_selection_button, false, false);
- range_selection_button.signal_toggled().connect (sigc::mem_fun (*this, &AutoReturnTargetOptions::range_selection_toggled));
-
- _box->pack_start (loop_button, false, false);
- loop_button.signal_toggled().connect (sigc::mem_fun (*this, &AutoReturnTargetOptions::loop_toggled));
-
- _box->pack_start (region_selection_button, false, false);
- region_selection_button.signal_toggled().connect (sigc::mem_fun (*this, &AutoReturnTargetOptions::region_selection_toggled));
-
- _box->pack_start (last_roll_button, false, false);
- last_roll_button.signal_toggled().connect (sigc::mem_fun (*this, &AutoReturnTargetOptions::last_roll_toggled));
-
- HBox* hbox = manage (new HBox);
- /* keep the toggle button small */
- hbox->pack_start (toggle_button, false, false);
- _box->pack_start (*hbox, false, false);
-
- toggle_button.signal_clicked().connect (sigc::mem_fun (*this, &AutoReturnTargetOptions::toggle));
-
- Gtkmm2ext::UI::instance()->set_tip (range_selection_button,
- _("If enabled, playhead will always start from the beginning of the current range selection.\n\nIf disabled or no range selection, see the next choice in this list"));
- Gtkmm2ext::UI::instance()->set_tip (loop_button,
- _("If enabled, playhead will always start from the beginning of the loop range.\n\nIf disabled or no loop range, see the next choice in this list"));
- Gtkmm2ext::UI::instance()->set_tip (region_selection_button,
- _("If enabled, playhead will always start from the beginning of the first selected region.\n\nIf disabled or no region selection, see the next choice in this list"));
- Gtkmm2ext::UI::instance()->set_tip (last_roll_button,
- _("If enabled, playhead will always start from the last position where it was started.\n\nIf disabled it will start from wherever it is currently located"));
-
- Gtkmm2ext::UI::instance()->set_tip (toggle_button,
- _("Change status of all buttons above to all enabled or all disabled"));
- }
-
- void parameter_changed (string const & p)
- {
- if (p == "auto-return-target-list") {
- AutoReturnTarget art = _rc_config->get_auto_return_target_list();
- range_selection_button.set_active (art & RangeSelectionStart);
- loop_button.set_active (art & Loop);
- region_selection_button.set_active (art & RegionSelectionStart);
- last_roll_button.set_active (art & LastLocate);
- }
- }
-
- void set_state_from_config ()
- {
- parameter_changed ("auto-return-target-list");
- }
-
- private:
-
- void range_selection_toggled () {
- AutoReturnTarget art = _rc_config->get_auto_return_target_list ();
- if (range_selection_button.get_active ()) {
- _rc_config->set_auto_return_target_list (AutoReturnTarget (art | RangeSelectionStart));
- } else {
- _rc_config->set_auto_return_target_list (AutoReturnTarget (art & ~RangeSelectionStart));
- }
- }
- void last_roll_toggled () {
- AutoReturnTarget art = _rc_config->get_auto_return_target_list ();
- if (last_roll_button.get_active ()) {
- _rc_config->set_auto_return_target_list (AutoReturnTarget (art | LastLocate));
- } else {
- _rc_config->set_auto_return_target_list (AutoReturnTarget (art & ~LastLocate));
- }
- }
- void region_selection_toggled () {
- AutoReturnTarget art = _rc_config->get_auto_return_target_list ();
- if (region_selection_button.get_active ()) {
- _rc_config->set_auto_return_target_list (AutoReturnTarget (art | RegionSelectionStart));
- } else {
- _rc_config->set_auto_return_target_list (AutoReturnTarget (art & ~RegionSelectionStart));
- }
- }
- void loop_toggled () {
- AutoReturnTarget art = _rc_config->get_auto_return_target_list ();
- if (loop_button.get_active ()) {
- _rc_config->set_auto_return_target_list (AutoReturnTarget (art | Loop));
- } else {
- _rc_config->set_auto_return_target_list (AutoReturnTarget (art & ~Loop));
- }
- }
-
- void toggle () {
- AutoReturnTarget art = _rc_config->get_auto_return_target_list ();
- if (art) {
- _rc_config->set_auto_return_target_list (AutoReturnTarget (0));
- } else {
- _rc_config->set_auto_return_target_list (AutoReturnTarget (RangeSelectionStart|
- RegionSelectionStart|
- Loop|
- LastLocate));
- }
- }
-
- RCConfiguration* _rc_config;
-
- Gtk::CheckButton range_selection_button;
- Gtk::CheckButton last_roll_button;
- Gtk::CheckButton loop_button;
- Gtk::CheckButton region_selection_button;
- Gtk::Button toggle_button;
-};
-
class ClickOptions : public OptionEditorBox
{
public:
ClickOptions (RCConfiguration* c, Gtk::Window* p)
: _rc_config (c)
+ , _click_browse_button (_("Browse..."))
+ , _click_emphasis_browse_button (_("Browse..."))
{
- Table* t = manage (new Table (2, 3));
+ Table* t = manage (new Table (3, 3));
t->set_spacings (4);
- Label* l = manage (left_aligned_label (_("Click audio file:")));
+ Label* l = manage (left_aligned_label (_("Use default Click:")));
t->attach (*l, 0, 1, 0, 1, FILL);
- t->attach (_click_path_entry, 1, 2, 0, 1, FILL);
- Button* b = manage (new Button (_("Browse...")));
- b->signal_clicked().connect (sigc::mem_fun (*this, &ClickOptions::click_browse_clicked));
- t->attach (*b, 2, 3, 0, 1, FILL);
+ t->attach (_use_default_click_check_button, 1, 2, 0, 1, FILL);
+ _use_default_click_check_button.signal_toggled().connect (
+ sigc::mem_fun (*this, &ClickOptions::use_default_click_toggled));
- l = manage (left_aligned_label (_("Click emphasis audio file:")));
+ l = manage (left_aligned_label (_("Click audio file:")));
t->attach (*l, 0, 1, 1, 2, FILL);
- t->attach (_click_emphasis_path_entry, 1, 2, 1, 2, FILL);
- b = manage (new Button (_("Browse...")));
- b->signal_clicked().connect (sigc::mem_fun (*this, &ClickOptions::click_emphasis_browse_clicked));
- t->attach (*b, 2, 3, 1, 2, FILL);
+ t->attach (_click_path_entry, 1, 2, 1, 2, FILL);
+ _click_browse_button.signal_clicked ().connect (
+ sigc::mem_fun (*this, &ClickOptions::click_browse_clicked));
+ t->attach (_click_browse_button, 2, 3, 1, 2, FILL);
+
+ l = manage (left_aligned_label (_("Click emphasis audio file:")));
+ t->attach (*l, 0, 1, 2, 3, FILL);
+ t->attach (_click_emphasis_path_entry, 1, 2, 2, 3, FILL);
+ _click_emphasis_browse_button.signal_clicked ().connect (
+ sigc::mem_fun (*this, &ClickOptions::click_emphasis_browse_clicked));
+ t->attach (_click_emphasis_browse_button, 2, 3, 2, 3, FILL);
_box->pack_start (*t, false, false);
_click_path_entry.signal_activate().connect (sigc::mem_fun (*this, &ClickOptions::click_changed));
_click_emphasis_path_entry.signal_activate().connect (sigc::mem_fun (*this, &ClickOptions::click_emphasis_changed));
+
+ if (_rc_config->get_click_sound ().empty() &&
+ _rc_config->get_click_emphasis_sound().empty()) {
+ _use_default_click_check_button.set_active (true);
+
+ } else {
+ _use_default_click_check_button.set_active (false);
+ }
}
void parameter_changed (string const & p)
click_emphasis_chosen (_click_emphasis_path_entry.get_text ());
}
+ void use_default_click_toggled ()
+ {
+ if (_use_default_click_check_button.get_active ()) {
+ _rc_config->set_click_sound ("");
+ _rc_config->set_click_emphasis_sound ("");
+ _click_path_entry.set_sensitive (false);
+ _click_emphasis_path_entry.set_sensitive (false);
+ _click_browse_button.set_sensitive (false);
+ _click_emphasis_browse_button.set_sensitive (false);
+ } else {
+ _click_path_entry.set_sensitive (true);
+ _click_emphasis_path_entry.set_sensitive (true);
+ _click_browse_button.set_sensitive (true);
+ _click_emphasis_browse_button.set_sensitive (true);
+ }
+ }
+
RCConfiguration* _rc_config;
+ CheckButton _use_default_click_check_button;
Entry _click_path_entry;
Entry _click_emphasis_path_entry;
+ Button _click_browse_button;
+ Button _click_emphasis_browse_button;
};
class UndoOptions : public OptionEditorBox
}
}
- l = manage (left_aligned_label (_("Resize overlaped regions using:")));
+ l = manage (left_aligned_label (_("Resize overlapped regions using:")));
l->set_name ("OptionsLabel");
t->attach (*l, col, col + 1, row, row + 1, FILL | EXPAND, FILL);
, _playback_slider (_playback_adjustment)
, _capture_slider (_capture_adjustment)
{
+ vector<string> presets;
+
+ /* these must match the order of the enums for BufferingPreset */
+
+ presets.push_back (_("Small sessions (4-16 tracks)"));
+ presets.push_back (_("Medium sessions (16-64 tracks)"));
+ presets.push_back (_("Large sessions (64+ tracks)"));
+ presets.push_back (_("Custom (set by sliders below)"));
+
+ set_popdown_strings (_buffering_presets_combo, presets);
+
+ Label* l = manage (new Label (_("Preset:")));
+ l->set_name ("OptionsLabel");
+ HBox* h = manage (new HBox);
+ h->set_spacing (12);
+ h->pack_start (*l, false, false);
+ h->pack_start (_buffering_presets_combo, true, true);
+ _box->pack_start (*h, false, false);
+
+ _buffering_presets_combo.signal_changed().connect (sigc::mem_fun (*this, &BufferingOptions::preset_changed));
+
_playback_adjustment.set_value (_rc_config->get_audio_playback_buffer_seconds());
- Label* l = manage (new Label (_("Playback (seconds of buffering):")));
+ l = manage (new Label (_("Playback (seconds of buffering):")));
l->set_name ("OptionsLabel");
_playback_slider.set_update_policy (UPDATE_DISCONTINUOUS);
- HBox* h = manage (new HBox);
+ h = manage (new HBox);
h->set_spacing (4);
h->pack_start (*l, false, false);
h->pack_start (_playback_slider, true, true);
void parameter_changed (string const & p)
{
+ if (p == "buffering-preset") {
+ switch (_rc_config->get_buffering_preset()) {
+ case Small:
+ _playback_slider.set_sensitive (false);
+ _capture_slider.set_sensitive (false);
+ _buffering_presets_combo.set_active (0);
+ break;
+ case Medium:
+ _playback_slider.set_sensitive (false);
+ _capture_slider.set_sensitive (false);
+ _buffering_presets_combo.set_active (1);
+ break;
+ case Large:
+ _playback_slider.set_sensitive (false);
+ _capture_slider.set_sensitive (false);
+ _buffering_presets_combo.set_active (2);
+ break;
+ case Custom:
+ _playback_slider.set_sensitive (true);
+ _capture_slider.set_sensitive (true);
+ _buffering_presets_combo.set_active (3);
+ break;
+ }
+ }
+
if (p == "playback-buffer-seconds") {
_playback_adjustment.set_value (_rc_config->get_audio_playback_buffer_seconds());
} else if (p == "capture-buffer-seconds") {
void set_state_from_config ()
{
+ parameter_changed ("buffering-preset");
parameter_changed ("playback-buffer-seconds");
parameter_changed ("capture-buffer-seconds");
}
private:
+ void preset_changed ()
+ {
+ int index = _buffering_presets_combo.get_active_row_number ();
+ if (index < 0) {
+ return;
+ }
+ switch (index) {
+ case 0:
+ _rc_config->set_buffering_preset (Small);
+ break;
+ case 1:
+ _rc_config->set_buffering_preset (Medium);
+ break;
+ case 2:
+ _rc_config->set_buffering_preset (Large);
+ break;
+ case 3:
+ _rc_config->set_buffering_preset (Custom);
+ break;
+ default:
+ error << string_compose (_("programming error: unknown buffering preset string, index = %1"), index) << endmsg;
+ break;
+ }
+ }
+
void playback_changed ()
{
_rc_config->set_audio_playback_buffer_seconds ((long) _playback_adjustment.get_value());
Adjustment _capture_adjustment;
HScale _playback_slider;
HScale _capture_slider;
+ ComboBoxText _buffering_presets_combo;
};
class ControlSurfacesOptions : public OptionEditorBox
/* TRANSPORT */
- add_option (_("Transport"), new OptionEditorHeading (S_("Playhead Behaviour")));
- add_option (_("Transport"), new AutoReturnTargetOptions (_rc_config, this));
add_option (_("Transport"), new OptionEditorHeading (S_("Transport Options")));
BoolOption* tsf;
/* INTERFACE */
+#ifdef OPTIONAL_CAIRO_IMAGE_SURFACE
+ BoolOption* bgc = new BoolOption (
+ "cairo-image-surface",
+ _("Disable Graphics Hardware Acceleration (requires restart)"),
+ sigc::mem_fun (*_ui_config, &UIConfiguration::get_cairo_image_surface),
+ sigc::mem_fun (*_ui_config, &UIConfiguration::set_cairo_image_surface)
+ );
+
+ Gtkmm2ext::UI::instance()->set_tip (bgc->tip_widget(), string_compose (
+ _("Render large parts of the application user-interface in software, instead of using 2D-graphics acceleration.\nThis requires restarting %1 before having an effect"), PROGRAM_NAME));
+ add_option (S_("Preferences|GUI"), bgc);
+#endif
+
#ifdef CAIRO_SUPPORTS_FORCE_BUGGY_GRADIENTS_ENVIRONMENT_VARIABLE
BoolOption* bgo = new BoolOption (
"buggy-gradients",
- _("Possibly improve slow graphical performance"),
+ _("Possibly improve slow graphical performance (requires restart)"),
sigc::mem_fun (*_ui_config, &UIConfiguration::get_buggy_gradients),
sigc::mem_fun (*_ui_config, &UIConfiguration::set_buggy_gradients)
);
- Gtkmm2ext::UI::instance()->set_tip (bgo->tip_widget(), string_compose (_("This requires restarting %1 before having an effect"), PROGRAM_NAME));
+ Gtkmm2ext::UI::instance()->set_tip (bgo->tip_widget(), string_compose (_("Disables hardware gradient rendering on buggy video drivers (\"buggy gradients patch\").\nThis requires restarting %1 before having an effect"), PROGRAM_NAME));
add_option (S_("Preferences|GUI"), bgo);
#endif
-
+
add_option (S_("Preferences|GUI"),
new BoolOption (
"widget-prelight",