mirror of
https://github.com/obsproject/obs-studio.git
synced 2026-09-17 17:16:40 +08:00
UI, image-source: Add slide counter to slideshow toolbar
This shows the current slide and total number of slides in the slideshow toolbar.
This commit is contained in:
committed by
Ryan Foster
parent
02c6ce8b58
commit
cfcad30e3e
@@ -186,7 +186,14 @@ static void free_files(struct darray *array)
|
||||
|
||||
static inline size_t random_file(struct slideshow *ss)
|
||||
{
|
||||
return (size_t)rand() % ss->files.num;
|
||||
size_t next = ss->cur_item;
|
||||
|
||||
if (ss->files.num > 1) {
|
||||
while (next == ss->cur_item)
|
||||
next = (size_t)rand() % ss->files.num;
|
||||
}
|
||||
|
||||
return next;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
@@ -539,7 +546,9 @@ static void ss_next_slide(void *data)
|
||||
if (!ss->files.num || obs_transition_get_time(ss->transition) < 1.0f)
|
||||
return;
|
||||
|
||||
if (++ss->cur_item >= ss->files.num)
|
||||
if (ss->randomize)
|
||||
ss->cur_item = random_file(ss);
|
||||
else if (++ss->cur_item >= ss->files.num)
|
||||
ss->cur_item = 0;
|
||||
|
||||
do_transition(ss, false);
|
||||
@@ -552,7 +561,9 @@ static void ss_previous_slide(void *data)
|
||||
if (!ss->files.num || obs_transition_get_time(ss->transition) < 1.0f)
|
||||
return;
|
||||
|
||||
if (ss->cur_item == 0)
|
||||
if (ss->randomize)
|
||||
ss->cur_item = random_file(ss);
|
||||
else if (ss->cur_item == 0)
|
||||
ss->cur_item = ss->files.num - 1;
|
||||
else
|
||||
--ss->cur_item;
|
||||
@@ -626,6 +637,18 @@ static void previous_slide_hotkey(void *data, obs_hotkey_id id,
|
||||
obs_source_media_previous(ss->source);
|
||||
}
|
||||
|
||||
static void current_slide_proc(void *data, calldata_t *cd)
|
||||
{
|
||||
struct slideshow *ss = data;
|
||||
calldata_set_int(cd, "current_index", ss->cur_item);
|
||||
}
|
||||
|
||||
static void total_slides_proc(void *data, calldata_t *cd)
|
||||
{
|
||||
struct slideshow *ss = data;
|
||||
calldata_set_int(cd, "total_files", ss->files.num);
|
||||
}
|
||||
|
||||
static void ss_destroy(void *data)
|
||||
{
|
||||
struct slideshow *ss = data;
|
||||
@@ -639,6 +662,7 @@ static void ss_destroy(void *data)
|
||||
static void *ss_create(obs_data_t *settings, obs_source_t *source)
|
||||
{
|
||||
struct slideshow *ss = bzalloc(sizeof(*ss));
|
||||
proc_handler_t *ph = obs_source_get_proc_handler(source);
|
||||
|
||||
ss->source = source;
|
||||
|
||||
@@ -667,6 +691,9 @@ static void *ss_create(obs_data_t *settings, obs_source_t *source)
|
||||
obs_module_text("SlideShow.PreviousSlide"),
|
||||
previous_slide_hotkey, ss);
|
||||
|
||||
proc_handler_add(ph, "int current_index()", current_slide_proc, ss);
|
||||
proc_handler_add(ph, "int total_files()", total_slides_proc, ss);
|
||||
|
||||
pthread_mutex_init_value(&ss->mutex);
|
||||
if (pthread_mutex_init(&ss->mutex, NULL) != 0)
|
||||
goto error;
|
||||
@@ -742,20 +769,7 @@ static void ss_video_tick(void *data, float seconds)
|
||||
return;
|
||||
}
|
||||
|
||||
if (ss->randomize) {
|
||||
size_t next = ss->cur_item;
|
||||
if (ss->files.num > 1) {
|
||||
while (next == ss->cur_item)
|
||||
next = random_file(ss);
|
||||
}
|
||||
ss->cur_item = next;
|
||||
|
||||
} else if (++ss->cur_item >= ss->files.num) {
|
||||
ss->cur_item = 0;
|
||||
}
|
||||
|
||||
if (ss->files.num)
|
||||
do_transition(ss, false);
|
||||
obs_source_media_next(ss->source);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user