summaryrefslogtreecommitdiff
path: root/gtk2_ardour/audio_clock.h
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2011-11-17 22:49:13 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2011-11-17 22:49:13 +0000
commitb25fbc8a956528a7c648eb3960782aa31cc2a36e (patch)
treeb45c8e70e71dfea92cffd51ff9465d965d6fb333 /gtk2_ardour/audio_clock.h
parentf07c92530c7305fc79de28e8762efcae63040729 (diff)
all new implementation of audio clocks, with entirely new editing model. not entirely finished, but lookable, and usable
git-svn-id: svn://localhost/ardour2/branches/3.0@10662 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/audio_clock.h')
-rw-r--r--gtk2_ardour/audio_clock.h139
1 files changed, 60 insertions, 79 deletions
diff --git a/gtk2_ardour/audio_clock.h b/gtk2_ardour/audio_clock.h
index 4ce057b01b..3771cb763d 100644
--- a/gtk2_ardour/audio_clock.h
+++ b/gtk2_ardour/audio_clock.h
@@ -21,6 +21,9 @@
#define __audio_clock_h__
#include <map>
+#include <vector>
+
+#include <pangomm.h>
#include <gtkmm/alignment.h>
#include <gtkmm/box.h>
@@ -30,15 +33,13 @@
#include "ardour/ardour.h"
#include "ardour/session_handle.h"
-class CairoEditableText;
-class CairoCell;
-class CairoTextCell;
+#include "cairo_widget.h"
namespace ARDOUR {
class Session;
}
-class AudioClock : public Gtk::VBox, public ARDOUR::SessionHandlePtr
+class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr
{
public:
enum Mode {
@@ -55,6 +56,8 @@ class AudioClock : public Gtk::VBox, public ARDOUR::SessionHandlePtr
Mode mode() const { return _mode; }
void set_off (bool yn);
bool off() const { return _off; }
+ void set_widget_name (const std::string& name);
+ void set_active_state (Gtkmm2ext::ActiveState s);
void focus ();
@@ -64,8 +67,7 @@ class AudioClock : public Gtk::VBox, public ARDOUR::SessionHandlePtr
void set_mode (Mode);
void set_bbt_reference (framepos_t);
void set_is_duration (bool);
-
- void set_widget_name (const std::string&);
+ void set_draw_background (bool yn);
std::string name() const { return _name; }
@@ -80,15 +82,11 @@ class AudioClock : public Gtk::VBox, public ARDOUR::SessionHandlePtr
static sigc::signal<void> ModeChanged;
static std::vector<AudioClock*> clocks;
- static bool has_focus() { return _has_focus; }
-
- CairoEditableText& main_display () const { return *display; }
- CairoEditableText* supplemental_left_display () const { return supplemental_left; }
- CairoEditableText* supplemental_right_display () const { return supplemental_right; }
+ protected:
+ void render (cairo_t*);
private:
Mode _mode;
- uint32_t key_entry_state;
std::string _name;
bool is_transient;
bool is_duration;
@@ -96,13 +94,31 @@ class AudioClock : public Gtk::VBox, public ARDOUR::SessionHandlePtr
/** true if this clock follows the playhead, meaning that certain operations are redundant */
bool _follows_playhead;
bool _off;
+ bool _need_bg;
Gtk::Menu *ops_menu;
- CairoEditableText* display;
+ Glib::RefPtr<Pango::Layout> _layout;
+ Glib::RefPtr<Pango::Layout> _left_layout;
+ Glib::RefPtr<Pango::Layout> _right_layout;
+
+ Pango::AttrColor* editing_attr;
+ Pango::AttrColor* background_attr;
+ Pango::AttrColor* foreground_attr;
+
+ Pango::AttrList normal_attributes;
+ Pango::AttrList editing_attributes;
+ Pango::AttrList info_attributes;
+
+ int layout_height;
+ int layout_width;
+ int info_height;
+ int upper_height;
+ double mode_based_info_ratio;
+ static const double info_font_scale_factor;
+ static const double separator_height;
enum Field {
- Timecode_Sign,
Timecode_Hours,
Timecode_Minutes,
Timecode_Seconds,
@@ -115,54 +131,26 @@ class AudioClock : public Gtk::VBox, public ARDOUR::SessionHandlePtr
Beats,
Ticks,
AudioFrames,
-
- Colon1,
- Colon2,
- Colon3,
- Bar1,
- Bar2,
-
- LowerLeft1,
- LowerLeft2,
- LowerRight1,
- LowerRight2,
};
- /** CairoCells of various kinds for each of our non-text Fields */
- std::map<Field,CairoCell*> _fixed_cells;
- /** CairoTextCells for each of our text Fields */
- std::map<Field, CairoTextCell*> _text_cells;
- CairoTextCell* label (Field) const;
-
- Gtk::HBox off_hbox;
-
- CairoEditableText* supplemental_left;
- CairoEditableText* supplemental_right;
+ Field index_to_field (int index) const;
- Gtk::HBox top;
- Gtk::HBox bottom;
-
- Field editing_field;
+ bool editing;
+ std::string edit_string;
+ std::string pre_edit_string;
+ std::string input_string;
+ std::string::size_type insert_max;
+
framepos_t bbt_reference_time;
framepos_t last_when;
bool last_pdelta;
bool last_sdelta;
- uint32_t last_hrs;
- uint32_t last_mins;
- uint32_t last_secs;
- uint32_t last_frames;
- bool last_negative;
-
- long ms_last_hrs;
- long ms_last_mins;
- int ms_last_secs;
- int ms_last_millisecs;
-
bool dragging;
double drag_start_y;
double drag_y;
double drag_accum;
+ Field drag_field;
/** true if the time of this clock is the one displayed in its widgets.
* if false, the time in the widgets is an approximation of _canonical_time,
@@ -172,32 +160,26 @@ class AudioClock : public Gtk::VBox, public ARDOUR::SessionHandlePtr
framepos_t _canonical_time;
void on_realize ();
-
- bool key_press (GdkEventKey *);
- bool key_release (GdkEventKey *);
-
- /* proxied from CairoEditableText */
-
- bool scroll (GdkEventScroll *ev, CairoCell*);
- bool button_press (GdkEventButton *ev, CairoCell*);
- bool button_release (GdkEventButton *ev, CairoCell*);
- sigc::connection scroll_connection;
- sigc::connection button_press_connection;
- sigc::connection button_release_connection;
-
- bool field_motion_notify_event (GdkEventMotion *ev, Field);
- bool field_focus_in_event (GdkEventFocus *, Field);
- bool field_focus_out_event (GdkEventFocus *, Field);
- bool drop_focus_handler (GdkEventFocus*);
+ bool on_key_press_event (GdkEventKey *);
+ bool on_key_release_event (GdkEventKey *);
+ bool on_scroll_event (GdkEventScroll *ev);
+ bool on_button_press_event (GdkEventButton *ev);
+ bool on_button_release_event(GdkEventButton *ev);
+ void on_style_changed (const Glib::RefPtr<Gtk::Style>&);
+ void on_size_request (Gtk::Requisition* req);
+ bool on_motion_notify_event (GdkEventMotion *ev);
+ void on_size_allocate (Gtk::Allocation&);
void set_timecode (framepos_t, bool);
void set_bbt (framepos_t, bool);
void set_minsec (framepos_t, bool);
void set_frames (framepos_t, bool);
- framepos_t get_frames (Field, framepos_t pos = 0, int dir = 1);
+ framepos_t get_frame_step (Field, framepos_t pos = 0, int dir = 1);
+
+ bool timecode_validate_edit (const std::string&);
+ bool bbt_validate_edit (const std::string&);
- void timecode_sanitize_display();
framepos_t timecode_frame_from_display () const;
framepos_t bbt_frame_from_display (framepos_t) const;
framepos_t bbt_frame_duration_from_display (framepos_t) const;
@@ -208,20 +190,19 @@ class AudioClock : public Gtk::VBox, public ARDOUR::SessionHandlePtr
void session_configuration_changed (std::string);
- static uint32_t field_length[];
- static bool _has_focus;
+ Field index_to_field () const;
- void on_style_changed (const Glib::RefPtr<Gtk::Style>&);
- bool on_key_press_event (GdkEventKey*);
- bool on_key_release_event (GdkEventKey*);
-
- void end_edit ();
+ void start_edit ();
+ void end_edit (bool);
void edit_next_field ();
- void connect_signals ();
- void disconnect_signals ();
+ void set_font ();
+ void set_colors ();
+ void show_edit_status (int length);
+
+ void timecode_tester ();
- void set_theme ();
+ double bg_r, bg_g, bg_b, bg_a;
};
#endif /* __audio_clock_h__ */