do not reset session for MonitorSection just because monitor out was removed
[ardour.git] / gtk2_ardour / location_ui.h
index 8f16e2b43ac135a8a4a9a48de4d0276e58e5faa0..2cd69b834c038a89724d1c649982a33457cd44e2 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 1999-2002 Paul Davis 
+    Copyright (C) 1999-2002 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
@@ -15,7 +15,6 @@
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-    $Id$
 */
 
 #ifndef __ardour_location_ui_h__
 #include <gtkmm/table.h>
 #include <gtkmm/entry.h>
 #include <gtkmm/label.h>
+#include <gtkmm/scrolledwindow.h>
 
-#include <ardour/location.h>
-#include <ardour/session.h>
+#include "pbd/signals.h"
 
-#include "ardour_dialog.h"
-#include "keyboard_target.h"
+#include "ardour/location.h"
+#include "ardour/session_handle.h"
+
+#include "widgets/ardour_button.h"
+#include "widgets/pane.h"
+
+#include "ardour_window.h"
+#include "audio_clock.h"
 
 namespace ARDOUR {
-       class LocationStack;
-       class Session;
        class Location;
 }
 
-class LocationEditRow  : public Gtk::HBox
+class ClockGroup;
+
+class LocationEditRow  : public Gtk::HBox, public ARDOUR::SessionHandlePtr
 {
-  public:
+public:
        LocationEditRow (ARDOUR::Session *sess=0, ARDOUR::Location *loc=0, int32_t num=-1);
        virtual ~LocationEditRow();
 
@@ -52,11 +57,14 @@ class LocationEditRow  : public Gtk::HBox
        void set_session (ARDOUR::Session *);
 
        void set_number (int);
-       
-       sigc::signal<void,ARDOUR::Location*> remove_requested;  
-       sigc::signal<void> redraw_ranges;  
+       void focus_name();
+       void set_clock_group (ClockGroup&);
+       void unset_clock_group () { _clock_group = 0; }
 
-  protected:
+       sigc::signal<void,ARDOUR::Location*> remove_requested;
+       sigc::signal<void> redraw_ranges;
+
+protected:
 
        enum LocationPart {
                LocStart,
@@ -65,31 +73,30 @@ class LocationEditRow  : public Gtk::HBox
        };
 
        ARDOUR::Location *location;
-       ARDOUR::Session  *session;
 
-       
-       
        Gtk::Table    item_table;
-       
+
        Gtk::Entry    name_entry;
        Gtk::Label    name_label;
        Gtk::Label    number_label;
-       
+
        Gtk::HBox     start_hbox;
-       Gtk::Button   start_set_button;
-       Gtk::Button   start_go_button;
        AudioClock    start_clock;
+       ArdourWidgets::ArdourButton start_to_playhead_button;
+       ArdourWidgets::ArdourButton locate_to_start_button;
 
        Gtk::HBox     end_hbox;
-       Gtk::Button   end_set_button;
-       Gtk::Button   end_go_button;
        AudioClock    end_clock;
+       ArdourWidgets::ArdourButton end_to_playhead_button;
+       ArdourWidgets::ArdourButton locate_to_end_button;
 
        AudioClock    length_clock;
        Gtk::CheckButton cd_check_button;
        Gtk::CheckButton hide_check_button;
+       Gtk::CheckButton lock_check_button;
+       Gtk::CheckButton glue_check_button;
 
-       Gtk::Button   remove_button;
+       ArdourWidgets::ArdourButton remove_button;
 
        Gtk::HBox     cd_track_details_hbox;
        Gtk::Entry    isrc_entry;
@@ -97,87 +104,93 @@ class LocationEditRow  : public Gtk::HBox
 
 
        Gtk::Label    performer_label;
-       Gtk::Entry  performer_entry;
+       Gtk::Entry    performer_entry;
        Gtk::Label    composer_label;
-       Gtk::Entry  composer_entry;
+       Gtk::Entry    composer_entry;
        Gtk::CheckButton   scms_check_button;
+       Gtk::Label         scms_label;
        Gtk::CheckButton   preemph_check_button;
-
+       Gtk::Label         preemph_label;
+       ClockGroup* _clock_group;
 
        guint32 i_am_the_modifier;
        int   number;
-       
+
        void name_entry_changed ();
        void isrc_entry_changed ();
        void performer_entry_changed ();
        void composer_entry_changed ();
-              
-       void set_button_pressed (LocationPart part);
-       void go_button_pressed (LocationPart part);
+
+       void to_playhead_button_pressed (LocationPart part);
+       void locate_button_pressed (LocationPart part);
 
        void clock_changed (LocationPart part);
+       bool locate_to_clock (GdkEventButton*, AudioClock*);
 
        void cd_toggled ();
        void hide_toggled ();
+       void lock_toggled ();
+       void glue_toggled ();
        void remove_button_pressed ();
 
        void scms_toggled ();
        void preemph_toggled ();
 
-       gint entry_focus_event (GdkEventFocus* ev);
-       
-       void end_changed (ARDOUR::Location *);
-       void start_changed (ARDOUR::Location *);
-       void name_changed (ARDOUR::Location *);
-       void location_changed (ARDOUR::Location *);
-       void flags_changed (ARDOUR::Location *, void *src);
-       
-       sigc::connection start_changed_connection;
-       sigc::connection end_changed_connection;
-       sigc::connection name_changed_connection;
-       sigc::connection changed_connection;
-       sigc::connection flags_changed_connection;
-       
-};
+       void end_changed ();
+       void start_changed ();
+       void name_changed ();
+       void location_changed ();
+       void flags_changed ();
+       void lock_changed ();
+       void position_lock_style_changed ();
+
+       void set_clock_editable_status ();
+       void show_cd_track_details ();
 
+       PBD::ScopedConnectionList connections;
+};
 
-class LocationUI : public ArdourDialog
+class LocationUI : public Gtk::HBox, public ARDOUR::SessionHandlePtr
 {
-  public:
-       LocationUI ();
+public:
+       LocationUI (std::string state_node_name = "LocationUI");
        ~LocationUI ();
 
        void set_session (ARDOUR::Session *);
 
-  private:
-
+       void add_new_location();
+       void add_new_range();
 
-       ARDOUR::LocationStack          *locations;
+       void refresh_location_list ();
 
-       void session_gone();
+       XMLNode & get_state () const;
+       int set_state (const XMLNode&);
 
+private:
+       /** set to the location that has just been created with the LocationUI `add' button
+           (if Config->get_name_new_markers() is true); if it is non-0, the name entry of
+           the location is given the focus by location_added().
+       */
+       ARDOUR::Location *newest_location;
 
-       Gtk::VBox  location_vpacker;
-       Gtk::HBox  location_hpacker;
+       void session_going_away ();
 
        LocationEditRow      loop_edit_row;
        LocationEditRow      punch_edit_row;
-       
-       Gtk::VPaned loc_range_panes;
-       
-       Gtk::Frame loc_frame;
+       Gtk::VBox loop_punch_box;
+
+       ArdourWidgets::VPane loc_range_panes;
+
        Gtk::VBox  loc_frame_box;
        Gtk::Button add_location_button;
        Gtk::ScrolledWindow  location_rows_scroller;
        Gtk::VBox            location_rows;
 
-       Gtk::Frame range_frame;
        Gtk::VBox  range_frame_box;
        Gtk::Button add_range_button;
        Gtk::ScrolledWindow  range_rows_scroller;
        Gtk::VBox            range_rows;
 
-
        /* When any location changes it start
           or end points, it sends a signal that is caught
           by one of these functions
@@ -188,17 +201,37 @@ class LocationUI : public ArdourDialog
        void location_redraw_ranges ();
 
        gint do_location_remove (ARDOUR::Location *);
-       
+
        guint32 i_am_the_modifier;
 
-       void add_new_location();
-       void add_new_range();
-       
-       void refresh_location_list ();
-       void refresh_location_list_s (ARDOUR::Change);
        void location_removed (ARDOUR::Location *);
        void location_added (ARDOUR::Location *);
-       void map_locations (ARDOUR::Locations::LocationList&);
+       void map_locations (const ARDOUR::Locations::LocationList&);
+
+       ClockGroup* _clock_group;
+       AudioClock::Mode clock_mode_from_session_instant_xml ();
+
+       AudioClock::Mode _mode;
+       bool _mode_set;
+
+       std::string _state_node_name;
+};
+
+class LocationUIWindow : public ArdourWindow
+{
+public:
+       LocationUIWindow ();
+       ~LocationUIWindow ();
+
+       void on_map ();
+       void set_session (ARDOUR::Session *);
+
+       LocationUI& ui() { return _ui; }
+
+protected:
+       LocationUI _ui;
+       bool on_delete_event (GdkEventAny*);
+       void session_going_away();
 };
 
 #endif // __ardour_location_ui_h__