Zrythm
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
ruler.h
Go to the documentation of this file.
1// clang-format off
2// SPDX-FileCopyrightText: © 2018-2022, 2024 Alexandros Theodotou <alex@zrythm.org>
3// SPDX-License-Identifier: LicenseRef-ZrythmLicense
4// clang-format on
5
12#ifndef __GUI_WIDGETS_RULER_H__
13#define __GUI_WIDGETS_RULER_H__
14
15#include "utils/ui.h"
16
17#include <gtk/gtk.h>
18
19#define RW_RULER_MARKER_SIZE 8
20#define RW_CUE_MARKER_HEIGHT 12
21#define RW_CUE_MARKER_WIDTH 7
22#define RW_PLAYHEAD_TRIANGLE_WIDTH 12
23#define RW_PLAYHEAD_TRIANGLE_HEIGHT 8
24#define RW_RANGE_HEIGHT_DIVISOR 4
25
26#define RW_HEIGHT 42
27
29#define RW_SCROLL_SPEED 48
30
34#define RW_PX_TO_HIDE_BEATS 40.0
35
36#define RULER_WIDGET_TYPE (ruler_widget_get_type ())
37G_DECLARE_FINAL_TYPE (RulerWidget, ruler_widget, Z, RULER_WIDGET, GtkWidget)
38
39
45typedef struct Position Position;
46typedef struct EditorSettings EditorSettings;
47
53#define DEFAULT_PX_PER_TICK 0.03
54
58#define SPACE_BEFORE_START 10
59#define SPACE_BEFORE_START_F 10.f
60#define SPACE_BEFORE_START_D 10.0
61
63#define RULER_ZOOM_LEVEL_MULTIPLIER 1.28
64
65#define MIN_ZOOM_LEVEL 0.04
66#define MAX_ZOOM_LEVEL 1800.
67
71typedef enum RWTarget
72{
73 RW_TARGET_PLAYHEAD,
74 RW_TARGET_LOOP_START,
75 RW_TARGET_LOOP_END,
76 RW_TARGET_PUNCH_IN,
77 RW_TARGET_PUNCH_OUT,
78 RW_TARGET_CLIP_START,
81} RWTarget;
82
83typedef enum RulerWidgetType
84{
85 RULER_WIDGET_TYPE_TIMELINE,
86 RULER_WIDGET_TYPE_EDITOR,
87} RulerWidgetType;
88
101
102typedef struct _RulerWidget
103{
104 GtkWidget parent_instance;
105
106 RulerWidgetType type;
107
108 double px_per_beat;
109 double px_per_bar;
110 double px_per_sixteenth;
111 double px_per_tick;
112 double px_per_min;
113 double px_per_10sec;
114 double px_per_sec;
115 double px_per_100ms;
116 double total_px;
117
122
124 double start_x;
125 double start_y;
126 double last_offset_x;
127 double last_offset_y;
128
129 double hover_x;
130 double hover_y;
131 bool hovering;
132
133 bool vertical_panning_started;
134
135 GtkGestureDrag * drag;
136 GtkGestureClick * click;
137
140
145
148
149 bool ctrl_held;
150
155
158
161
164
171 Position range2_start_pos;
172
180
183
184 cairo_t * cached_cr;
185
186 cairo_surface_t * cached_surface;
187
189 graphene_rect_t last_rect;
190
191 /* layout for drawing text */
192 PangoLayout * layout_normal;
193 PangoLayout * monospace_layout_small;
194 PangoLayout * marker_layout;
195
197 GtkPopoverMenu * popover_menu;
199
205bool
206ruler_widget_set_zoom_level (RulerWidget * self, double zoom_level);
207
211double
213
225void
227 RulerWidget * self,
228 double * x_pos,
229 double dy);
230
235int
237
242int
244
248int
250
254int
256
257bool
258ruler_widget_is_range_hit (
259 RulerWidget * self,
261 double x,
262 double y);
263
267bool
269 RulerWidget * self,
271 double x,
272 double y);
273
274void
275ruler_widget_px_to_pos (
276 RulerWidget * self,
277 double px,
278 Position * pos,
279 bool has_padding);
280
281int
282ruler_widget_pos_to_px (RulerWidget * self, Position * pos, int use_padding);
283
290
294void
295ruler_widget_get_visible_rect (RulerWidget * self, GdkRectangle * rect);
296
304int
305ruler_widget_get_playhead_px (RulerWidget * self, bool after_loops);
306
307void
308ruler_widget_refresh (RulerWidget * self);
309
314#endif
UiOverlayAction
Various overlay actions to be shared.
Definition ui.h:247
EditorSettings * ruler_widget_get_editor_settings(RulerWidget *self)
Gets the pointer to the EditorSettings associated with the arranger this ruler is for.
int ruler_widget_get_10sec_interval(RulerWidget *self)
Returns the 10 sec interval.
int ruler_widget_get_sec_interval(RulerWidget *self)
Returns the sec interval.
void ruler_widget_get_visible_rect(RulerWidget *self, GdkRectangle *rect)
Fills in the visible rectangle.
int ruler_widget_get_playhead_px(RulerWidget *self, bool after_loops)
Returns the playhead's x coordinate in absolute coordinates.
bool ruler_widget_set_zoom_level(RulerWidget *self, double zoom_level)
Sets zoom level and disables/enables buttons accordingly.
int ruler_widget_get_sixteenth_interval(RulerWidget *self)
Returns the sixteenth interval for drawing vertical lines.
bool ruler_widget_is_loop_range_hit(RulerWidget *self, RulerWidgetRangeType type, double x, double y)
Whether the loop range is hit.
int ruler_widget_get_beat_interval(RulerWidget *self)
Returns the beat interval for drawing vertical lines.
RulerWidgetRangeType
Range type.
Definition ruler.h:93
void ruler_widget_handle_horizontal_zoom(RulerWidget *self, double *x_pos, double dy)
Handle horizontal zoom.
RWTarget
The ruler widget target acting upon.
Definition ruler.h:72
double ruler_widget_get_zoom_level(RulerWidget *self)
Gets the zoom level associated with this RulerWidget from the backend.
@ RW_RANGE_FULL
Whole range.
Definition ruler.h:97
@ RW_RANGE_END
Range end.
Definition ruler.h:99
@ RW_RANGE_START
Range start.
Definition ruler.h:95
@ RW_TARGET_RANGE
for timeline only
Definition ruler.h:79
@ RW_TARGET_LOOP_RANGE
for timeline only
Definition ruler.h:80
Common editor settings.
A Position is made up of bars.beats.sixteenths.ticks.
Definition position.h:126
int redraw
Set to 1 to redraw.
Definition ruler.h:157
graphene_rect_t last_rect
Rectangle in the last call.
Definition ruler.h:189
int shift_held
If shift was held down during the press.
Definition ruler.h:144
UiOverlayAction action
Dragging playhead or creating range, etc.
Definition ruler.h:121
bool alt_held
Whether alt is currently held down.
Definition ruler.h:147
int range1_first
Whether range1 was before range2 at drag start.
Definition ruler.h:160
GtkPopoverMenu * popover_menu
Popover to be reused for context menus.
Definition ruler.h:197
int last_playhead_px
Px the playhead was last drawn at, so we can redraw this and the new px only when the playhead change...
Definition ruler.h:154
Position drag_start_pos
Position at start of drag.
Definition ruler.h:182
Position last_set_pos
Last position the playhead was set to.
Definition ruler.h:179
RWTarget target
Target acting upon.
Definition ruler.h:139
double start_x
For dragging.
Definition ruler.h:124
int dragging
Set to 1 between drag begin and drag end.
Definition ruler.h:163
Position range1_start_pos
Set on drag begin.
Definition ruler.h:170
User Interface utils.