Skip to content

Commit c4afd8b

Browse files
authored
Merge pull request #565 from Rafostar/timeline-improvements
Timeline improvements
2 parents 7f326e6 + 266c588 commit c4afd8b

7 files changed

Lines changed: 217 additions & 73 deletions

File tree

src/lib/clapper-gtk/clapper-gtk-seek-bar.c

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,47 @@ _update_duration_label (ClapperGtkSeekBar *self, gdouble duration)
395395
gtk_adjustment_set_upper (adjustment, duration);
396396
}
397397

398+
static gboolean
399+
_find_marks_in_widget (GtkWidget *widget, GtkWidget **top_marks, GtkWidget **bottom_marks)
400+
{
401+
GtkWidget *child;
402+
403+
if (g_strcmp0 (gtk_widget_get_css_name (widget), "marks") == 0) {
404+
if (gtk_widget_has_css_class (widget, "top"))
405+
*top_marks = widget;
406+
else if (gtk_widget_has_css_class (widget, "bottom"))
407+
*bottom_marks = widget;
408+
409+
/* Its unexpected to have marks within marks,
410+
* so do not iterate children of marks widget */
411+
return (*top_marks && *bottom_marks);
412+
}
413+
414+
child = gtk_widget_get_first_child (widget);
415+
416+
while (child != NULL) {
417+
if (_find_marks_in_widget (child, top_marks, bottom_marks))
418+
return TRUE;
419+
420+
child = gtk_widget_get_next_sibling (child);
421+
}
422+
423+
return FALSE;
424+
}
425+
426+
static gboolean
427+
_find_last_mark_in_marks (GtkWidget *marks, GtkWidget **last_mark)
428+
{
429+
GtkWidget *widget = gtk_widget_get_last_child (marks);
430+
431+
if (widget && g_strcmp0 (gtk_widget_get_css_name (widget), "mark") == 0) {
432+
*last_mark = widget;
433+
return TRUE;
434+
}
435+
436+
return FALSE;
437+
}
438+
398439
static void
399440
_update_scale_marks (ClapperGtkSeekBar *self, ClapperTimeline *timeline)
400441
{
@@ -423,11 +464,43 @@ _update_scale_marks (ClapperGtkSeekBar *self, ClapperTimeline *timeline)
423464

424465
for (i = 0; i < n_markers; ++i) {
425466
ClapperMarker *marker = clapper_timeline_get_marker (timeline, i);
467+
ClapperMarkerType marker_type = clapper_marker_get_marker_type (marker);
426468
gdouble start = clapper_marker_get_start (marker);
427469

428470
gtk_scale_add_mark (GTK_SCALE (self->scale), start, GTK_POS_TOP, NULL);
429471
gtk_scale_add_mark (GTK_SCALE (self->scale), start, GTK_POS_BOTTOM, NULL);
430472

473+
if (marker_type >= CLAPPER_MARKER_TYPE_CUSTOM_1) {
474+
GtkWidget *top_marks = NULL, *bottom_marks = NULL;
475+
GtkWidget *top_mark = NULL, *bottom_mark = NULL;
476+
477+
if (_find_marks_in_widget (self->scale, &top_marks, &bottom_marks)
478+
&& _find_last_mark_in_marks (top_marks, &top_mark)
479+
&& _find_last_mark_in_marks (bottom_marks, &bottom_mark)) {
480+
const gchar *custom_name;
481+
482+
switch (marker_type) {
483+
case CLAPPER_MARKER_TYPE_CUSTOM_1:
484+
custom_name = "custom1";
485+
break;
486+
case CLAPPER_MARKER_TYPE_CUSTOM_2:
487+
custom_name = "custom2";
488+
break;
489+
case CLAPPER_MARKER_TYPE_CUSTOM_3:
490+
custom_name = "custom3";
491+
break;
492+
default:
493+
custom_name = NULL;
494+
break;
495+
}
496+
497+
if (G_LIKELY (custom_name != NULL)) {
498+
gtk_widget_add_css_class (top_mark, custom_name);
499+
gtk_widget_add_css_class (bottom_mark, custom_name);
500+
}
501+
}
502+
}
503+
431504
gst_object_unref (marker);
432505
}
433506

src/lib/clapper-gtk/css/styles.css

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,15 @@ clapper-gtk-seek-bar label {
129129
margin-left: 2px;
130130
margin-right: 2px;
131131
}
132+
clapper-gtk-seek-bar scale marks .custom1 indicator {
133+
color: tomato;
134+
}
135+
clapper-gtk-seek-bar scale marks .custom2 indicator {
136+
color: goldenrod;
137+
}
138+
clapper-gtk-seek-bar scale marks .custom3 indicator {
139+
color: limegreen;
140+
}
132141

133142
clapper-gtk-extra-menu-button popover .spinsidebutton {
134143
min-width: 28px;

src/lib/clapper/clapper-timeline-private.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,10 @@ gboolean clapper_timeline_set_toc (ClapperTimeline *timeline, GstToc *toc, gbool
3434
G_GNUC_INTERNAL
3535
void clapper_timeline_refresh (ClapperTimeline *timeline);
3636

37+
G_GNUC_INTERNAL
38+
void clapper_timeline_insert_marker_internal (ClapperTimeline *timeline, ClapperMarker *marker);
39+
40+
G_GNUC_INTERNAL
41+
void clapper_timeline_remove_marker_internal (ClapperTimeline *timeline, ClapperMarker *marker);
42+
3743
G_END_DECLS

src/lib/clapper/clapper-timeline.c

Lines changed: 37 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include "clapper-player-private.h"
3131
#include "clapper-reactables-manager-private.h"
3232
#include "clapper-features-manager-private.h"
33+
#include "clapper-utils-private.h"
3334

3435
#define GST_CAT_DEFAULT clapper_timeline_debug
3536
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
@@ -187,25 +188,12 @@ _take_marker_unlocked (ClapperTimeline *self, ClapperMarker *marker)
187188
return g_sequence_iter_get_position (iter);
188189
}
189190

190-
/**
191-
* clapper_timeline_insert_marker:
192-
* @timeline: a #ClapperTimeline
193-
* @marker: a #ClapperMarker
194-
*
195-
* Insert the #ClapperMarker into @timeline.
196-
*
197-
* Returns: %TRUE if inserted, %FALSE if marker was
198-
* already inserted into timeline.
199-
*/
200-
gboolean
201-
clapper_timeline_insert_marker (ClapperTimeline *self, ClapperMarker *marker)
191+
void
192+
clapper_timeline_insert_marker_internal (ClapperTimeline *self, ClapperMarker *marker)
202193
{
203194
gboolean success;
204195
gint position = 0;
205196

206-
g_return_val_if_fail (CLAPPER_IS_TIMELINE (self), FALSE);
207-
g_return_val_if_fail (CLAPPER_IS_MARKER (marker), FALSE);
208-
209197
GST_OBJECT_LOCK (self);
210198

211199
if ((success = !g_sequence_lookup (self->markers_seq, marker,
@@ -220,30 +208,34 @@ clapper_timeline_insert_marker (ClapperTimeline *self, ClapperMarker *marker)
220208

221209
clapper_timeline_post_item_updated (self);
222210
}
223-
224-
return success;
225211
}
226212

227213
/**
228-
* clapper_timeline_remove_marker:
214+
* clapper_timeline_insert_marker:
229215
* @timeline: a #ClapperTimeline
230216
* @marker: a #ClapperMarker
231217
*
232-
* Removes #ClapperMarker from the timeline.
233-
*
234-
* If marker was not in the @timeline, this function will do nothing,
235-
* so it is safe to call if unsure.
218+
* Insert the #ClapperMarker into @timeline.
236219
*/
237220
void
238-
clapper_timeline_remove_marker (ClapperTimeline *self, ClapperMarker *marker)
221+
clapper_timeline_insert_marker (ClapperTimeline *self, ClapperMarker *marker)
222+
{
223+
g_return_if_fail (CLAPPER_IS_TIMELINE (self));
224+
g_return_if_fail (CLAPPER_IS_MARKER (marker));
225+
226+
if (g_main_context_is_owner (g_main_context_default ()))
227+
clapper_timeline_insert_marker_internal (self, marker);
228+
else
229+
clapper_utils_timeline_insert_on_main_sync (self, marker);
230+
}
231+
232+
void
233+
clapper_timeline_remove_marker_internal (ClapperTimeline *self, ClapperMarker *marker)
239234
{
240235
GSequenceIter *iter;
241236
gint position = 0;
242237
gboolean success = FALSE;
243238

244-
g_return_if_fail (CLAPPER_IS_TIMELINE (self));
245-
g_return_if_fail (CLAPPER_IS_MARKER (marker));
246-
247239
GST_OBJECT_LOCK (self);
248240

249241
if ((iter = g_sequence_lookup (self->markers_seq, marker,
@@ -264,6 +256,25 @@ clapper_timeline_remove_marker (ClapperTimeline *self, ClapperMarker *marker)
264256
}
265257
}
266258

259+
/**
260+
* clapper_timeline_remove_marker:
261+
* @timeline: a #ClapperTimeline
262+
* @marker: a #ClapperMarker
263+
*
264+
* Removes #ClapperMarker from the timeline if present.
265+
*/
266+
void
267+
clapper_timeline_remove_marker (ClapperTimeline *self, ClapperMarker *marker)
268+
{
269+
g_return_if_fail (CLAPPER_IS_TIMELINE (self));
270+
g_return_if_fail (CLAPPER_IS_MARKER (marker));
271+
272+
if (g_main_context_is_owner (g_main_context_default ()))
273+
clapper_timeline_remove_marker_internal (self, marker);
274+
else
275+
clapper_utils_timeline_remove_on_main_sync (self, marker);
276+
}
277+
267278
/**
268279
* clapper_timeline_get_marker:
269280
* @timeline: a #ClapperTimeline

src/lib/clapper/clapper-timeline.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ CLAPPER_API
3838
G_DECLARE_FINAL_TYPE (ClapperTimeline, clapper_timeline, CLAPPER, TIMELINE, GstObject)
3939

4040
CLAPPER_API
41-
gboolean clapper_timeline_insert_marker (ClapperTimeline *timeline, ClapperMarker *marker);
41+
void clapper_timeline_insert_marker (ClapperTimeline *timeline, ClapperMarker *marker);
4242

4343
CLAPPER_API
4444
void clapper_timeline_remove_marker (ClapperTimeline *timeline, ClapperMarker *marker);

src/lib/clapper/clapper-utils-private.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
#include "clapper-utils.h"
2727
#include "clapper-queue.h"
2828
#include "clapper-media-item.h"
29+
#include "clapper-timeline.h"
30+
#include "clapper-marker.h"
2931

3032
G_BEGIN_DECLS
3133

@@ -44,6 +46,12 @@ void clapper_utils_queue_remove_on_main_sync (ClapperQueue *queue, ClapperMediaI
4446
G_GNUC_INTERNAL
4547
void clapper_utils_queue_clear_on_main_sync (ClapperQueue *queue);
4648

49+
G_GNUC_INTERNAL
50+
void clapper_utils_timeline_insert_on_main_sync (ClapperTimeline *timeline, ClapperMarker *marker);
51+
52+
G_GNUC_INTERNAL
53+
void clapper_utils_timeline_remove_on_main_sync (ClapperTimeline *timeline, ClapperMarker *marker);
54+
4755
G_GNUC_INTERNAL
4856
void clapper_utils_prop_notify_on_main_sync (GObject *object, GParamSpec *pspec);
4957

0 commit comments

Comments
 (0)