slide wip

This commit is contained in:
jr-k 2024-07-16 02:17:31 +02:00
parent e2fdc9adaa
commit 9573db6aa1
16 changed files with 66 additions and 48 deletions

File diff suppressed because one or more lines are too long

View File

@ -46,7 +46,7 @@
.tile-header { .tile-header {
.head-icon { .head-icon {
i { i {
color: #222; color: #444;
} }
} }
} }

View File

@ -168,7 +168,6 @@
"settings_variable_desc_intro_slide_duration": "Introduction slide duration (in seconds)", "settings_variable_desc_intro_slide_duration": "Introduction slide duration (in seconds)",
"settings_variable_desc_default_slide_time_with_seconds": "Show the seconds on the clock in the introduction slide", "settings_variable_desc_default_slide_time_with_seconds": "Show the seconds on the clock in the introduction slide",
"settings_variable_desc_polling_interval": "Refresh interval applied for settings to the player (in seconds)", "settings_variable_desc_polling_interval": "Refresh interval applied for settings to the player (in seconds)",
"settings_variable_desc_playlist_default_time_sync": "Sync slides across players for default playlist",
"settings_variable_desc_slide_animation_enabled": "Enable animation effect between slides", "settings_variable_desc_slide_animation_enabled": "Enable animation effect between slides",
"settings_variable_desc_slide_animation_entrance_effect": "Slide animation entrance effect", "settings_variable_desc_slide_animation_entrance_effect": "Slide animation entrance effect",
"settings_variable_desc_slide_animation_exit_effect": "Slide animation exit effect (generally better off without it)", "settings_variable_desc_slide_animation_exit_effect": "Slide animation exit effect (generally better off without it)",
@ -221,6 +220,8 @@
"common_enable_plugin": "Enable this plugin", "common_enable_plugin": "Enable this plugin",
"common_save": "Save", "common_save": "Save",
"common_cancel": "Cancel", "common_cancel": "Cancel",
"common_back": "Back",
"common_exit": "Exit",
"common_close": "Close", "common_close": "Close",
"common_confirm": "Confirm", "common_confirm": "Confirm",
"common_submit": "Submit", "common_submit": "Submit",

View File

@ -168,7 +168,6 @@
"settings_variable_desc_intro_slide_duration": "Duración de la diapositiva de introducción (en segundos)", "settings_variable_desc_intro_slide_duration": "Duración de la diapositiva de introducción (en segundos)",
"settings_variable_desc_default_slide_time_with_seconds": "Mostrar los segundos en el reloj de la diapositiva de introducción", "settings_variable_desc_default_slide_time_with_seconds": "Mostrar los segundos en el reloj de la diapositiva de introducción",
"settings_variable_desc_polling_interval": "Intervalo de actualización aplicado para configuraciones del reproductor (en segundos)", "settings_variable_desc_polling_interval": "Intervalo de actualización aplicado para configuraciones del reproductor (en segundos)",
"settings_variable_desc_playlist_default_time_sync": "Sincronizar diapositivas entre reproductores para la playlist predeterminada",
"settings_variable_desc_slide_animation_enabled": "Habilitar efecto de animación entre diapositivas", "settings_variable_desc_slide_animation_enabled": "Habilitar efecto de animación entre diapositivas",
"settings_variable_desc_slide_animation_entrance_effect": "Efecto de entrada de animación de diapositiva", "settings_variable_desc_slide_animation_entrance_effect": "Efecto de entrada de animación de diapositiva",
"settings_variable_desc_slide_animation_exit_effect": "Efecto de salida de animación de diapositiva (generalmente mejor sin él)", "settings_variable_desc_slide_animation_exit_effect": "Efecto de salida de animación de diapositiva (generalmente mejor sin él)",
@ -221,6 +220,8 @@
"common_enable_plugin": "Habilitar este plugin", "common_enable_plugin": "Habilitar este plugin",
"common_save": "Guardar", "common_save": "Guardar",
"common_cancel": "Cancelar", "common_cancel": "Cancelar",
"common_back": "Atrás",
"common_exit": "Salir",
"common_close": "Cerrar", "common_close": "Cerrar",
"common_confirm": "Confirmar", "common_confirm": "Confirmar",
"common_submit": "Enviar", "common_submit": "Enviar",

View File

@ -169,7 +169,6 @@
"settings_variable_desc_intro_slide_duration": "Durée de la slide d'introduction (en secondes)", "settings_variable_desc_intro_slide_duration": "Durée de la slide d'introduction (en secondes)",
"settings_variable_desc_default_slide_time_with_seconds": "Afficher les secondes de l'horloge de la slide d'introduction", "settings_variable_desc_default_slide_time_with_seconds": "Afficher les secondes de l'horloge de la slide d'introduction",
"settings_variable_desc_polling_interval": "Intervalle de rafraîchissement des paramètres à appliquer au lecteur (en secondes)", "settings_variable_desc_polling_interval": "Intervalle de rafraîchissement des paramètres à appliquer au lecteur (en secondes)",
"settings_variable_desc_playlist_default_time_sync": "Synchroniser les slides des lecteurs pour la playlist par défaut",
"settings_variable_desc_slide_animation_enabled": "Activer les effets d'animation entre les slides", "settings_variable_desc_slide_animation_enabled": "Activer les effets d'animation entre les slides",
"settings_variable_desc_slide_animation_entrance_effect": "Effet d'animation d'arrivée de la slide", "settings_variable_desc_slide_animation_entrance_effect": "Effet d'animation d'arrivée de la slide",
"settings_variable_desc_slide_animation_exit_effect": "Effet d'animation de sortie de la slide (généralement mieux sans)", "settings_variable_desc_slide_animation_exit_effect": "Effet d'animation de sortie de la slide (généralement mieux sans)",
@ -222,6 +221,8 @@
"common_enable_plugin": "Activer ce plugin", "common_enable_plugin": "Activer ce plugin",
"common_save": "Enregistrer", "common_save": "Enregistrer",
"common_cancel": "Annuler", "common_cancel": "Annuler",
"common_back": "Retour",
"common_exit": "Quitter",
"common_close": "Fermer", "common_close": "Fermer",
"common_confirm": "Confirmer", "common_confirm": "Confirmer",
"common_submit": "Envoyer", "common_submit": "Envoyer",

View File

@ -168,7 +168,6 @@
"settings_variable_desc_intro_slide_duration": "Durata introduzione slide (in secondi)", "settings_variable_desc_intro_slide_duration": "Durata introduzione slide (in secondi)",
"settings_variable_desc_default_slide_time_with_seconds": "Mostra secondi introduzione slide", "settings_variable_desc_default_slide_time_with_seconds": "Mostra secondi introduzione slide",
"settings_variable_desc_polling_interval": "Intervallo di aggiornamento applicato per le impostazioni del monitor (in secondi)", "settings_variable_desc_polling_interval": "Intervallo di aggiornamento applicato per le impostazioni del monitor (in secondi)",
"settings_variable_desc_playlist_default_time_sync": "Sincronizza le diapositive tra i lettori per la playlist predefinita",
"settings_variable_desc_slide_animation_enabled": "Abilita l'effetto di animazione tra le diapositive", "settings_variable_desc_slide_animation_enabled": "Abilita l'effetto di animazione tra le diapositive",
"settings_variable_desc_slide_animation_entrance_effect": "Effetto ingresso diapositiva", "settings_variable_desc_slide_animation_entrance_effect": "Effetto ingresso diapositiva",
"settings_variable_desc_slide_animation_exit_effect": "Effetto di uscita della diapositiva (meglio senza)", "settings_variable_desc_slide_animation_exit_effect": "Effetto di uscita della diapositiva (meglio senza)",
@ -221,6 +220,8 @@
"common_enable_plugin": "Attiva questo plugin", "common_enable_plugin": "Attiva questo plugin",
"common_save": "Salva", "common_save": "Salva",
"common_cancel": "Annulla", "common_cancel": "Annulla",
"common_back": "Indietro",
"common_exit": "Esci",
"common_close": "Chiudi", "common_close": "Chiudi",
"common_confirm": "Conferma", "common_confirm": "Conferma",
"common_submit": "Invia", "common_submit": "Invia",

View File

@ -54,7 +54,7 @@ class PlayerController(ObController):
polling_interval=self._model_store.variable().get_one_by_name('polling_interval'), polling_interval=self._model_store.variable().get_one_by_name('polling_interval'),
slide_animation_enabled=animation_enabled, slide_animation_enabled=animation_enabled,
slide_animation_entrance_effect=self._model_store.variable().get_one_by_name('slide_animation_entrance_effect'), slide_animation_entrance_effect=self._model_store.variable().get_one_by_name('slide_animation_entrance_effect'),
slide_animation_exit_effect=self._model_store.variable().get_one_by_name('slide_animation_exit_effect'), # slide_animation_exit_effect=self._model_store.variable().get_one_by_name('slide_animation_exit_effect'),
slide_animation_speed=self._model_store.variable().get_one_by_name('slide_animation_speed'), slide_animation_speed=self._model_store.variable().get_one_by_name('slide_animation_speed'),
animation_speed_duration=animation_speed_duration animation_speed_duration=animation_speed_duration
) )
@ -156,7 +156,7 @@ class PlayerController(ObController):
playlists = { playlists = {
'playlist_id': playlist.id if playlist else None, 'playlist_id': playlist.id if playlist else None,
'time_sync': playlist.time_sync if playlist else self._model_store.variable().get_one_by_name("playlist_default_time_sync").as_bool(), 'time_sync': playlist.time_sync if playlist else False,
'loop': playlist_loop, 'loop': playlist_loop,
'preview_mode': preview_mode, 'preview_mode': preview_mode,
'notifications': playlist_notifications, 'notifications': playlist_notifications,

View File

@ -37,7 +37,7 @@ class PlaylistController(ObController):
working_folder = self._model_store.folder().get_one_by_path(path=working_folder_path, entity=FolderEntity.CONTENT) working_folder = self._model_store.folder().get_one_by_path(path=working_folder_path, entity=FolderEntity.CONTENT)
if not current_playlist and len(playlists) > 0: if not current_playlist and len(playlists) > 0:
current_playlist = playlists[0] current_playlist = None
return render_template( return render_template(
'playlist/list.jinja.html', 'playlist/list.jinja.html',
@ -45,7 +45,7 @@ class PlaylistController(ObController):
current_playlist=current_playlist, current_playlist=current_playlist,
playlists=playlists, playlists=playlists,
durations=durations, durations=durations,
slides=self._model_store.slide().get_slides(playlist_id=current_playlist.id), slides=self._model_store.slide().get_slides(playlist_id=current_playlist.id) if current_playlist else [],
foldered_contents=self._model_store.content().get_all_indexed('folder_id', multiple=True), foldered_contents=self._model_store.content().get_all_indexed('folder_id', multiple=True),
contents={content.id: {"id": content.id, "name": content.name, "type": content.type.value} for content in self._model_store.content().get_contents()}, contents={content.id: {"id": content.id, "name": content.name, "type": content.type.value} for content in self._model_store.content().get_contents()},
working_folder_path=working_folder_path, working_folder_path=working_folder_path,

View File

@ -222,6 +222,8 @@ class DatabaseManager:
"ALTER TABLE slideshow RENAME TO slides", "ALTER TABLE slideshow RENAME TO slides",
"DELETE FROM settings WHERE name = 'fleet_studio_enabled'", "DELETE FROM settings WHERE name = 'fleet_studio_enabled'",
"DELETE FROM settings WHERE name = 'default_slide_duration'", "DELETE FROM settings WHERE name = 'default_slide_duration'",
"DELETE FROM settings WHERE name = 'playlist_default_time_sync'",
"DELETE FROM settings WHERE name = 'slide_animation_exit_effect'",
"UPDATE content SET uuid = id WHERE uuid = '' or uuid is null", "UPDATE content SET uuid = id WHERE uuid = '' or uuid is null",
] ]

View File

@ -89,7 +89,6 @@ class PlaylistManager(ModelManager):
return [Playlist( return [Playlist(
id=None, id=None,
time_sync=self.variable_manager.map().get('playlist_default_time_sync').as_bool(),
name=self.t('common_default_playlist')) name=self.t('common_default_playlist'))
] + playlists ] + playlists

View File

@ -119,12 +119,11 @@ class VariableManager:
### Player Animation ### Player Animation
{"name": "slide_animation_enabled", "section": self.t(VariableSection.PLAYER_ANIMATION), "value": False, "type": VariableType.BOOL, "editable": True, "description": self.t('settings_variable_desc_slide_animation_enabled'), "refresh_player": True}, {"name": "slide_animation_enabled", "section": self.t(VariableSection.PLAYER_ANIMATION), "value": False, "type": VariableType.BOOL, "editable": True, "description": self.t('settings_variable_desc_slide_animation_enabled'), "refresh_player": True},
{"name": "slide_animation_entrance_effect", "section": self.t(VariableSection.PLAYER_ANIMATION), "value": AnimationEntranceEffect.FADE_IN.value, "type": VariableType.SELECT_SINGLE, "editable": True, "description": self.t('settings_variable_desc_slide_animation_entrance_effect'), "selectables": enum_to_dict(AnimationEntranceEffect), "refresh_player": True}, {"name": "slide_animation_entrance_effect", "section": self.t(VariableSection.PLAYER_ANIMATION), "value": AnimationEntranceEffect.FADE_IN.value, "type": VariableType.SELECT_SINGLE, "editable": True, "description": self.t('settings_variable_desc_slide_animation_entrance_effect'), "selectables": enum_to_dict(AnimationEntranceEffect), "refresh_player": True},
{"name": "slide_animation_exit_effect", "section": self.t(VariableSection.PLAYER_ANIMATION), "value": AnimationExitEffect.NONE.value, "type": VariableType.SELECT_SINGLE, "editable": True, "description": self.t('settings_variable_desc_slide_animation_exit_effect'), "selectables": enum_to_dict(AnimationExitEffect), "refresh_player": True}, # {"name": "slide_animation_exit_effect", "section": self.t(VariableSection.PLAYER_ANIMATION), "value": AnimationExitEffect.NONE.value, "type": VariableType.SELECT_SINGLE, "editable": True, "description": self.t('settings_variable_desc_slide_animation_exit_effect'), "selectables": enum_to_dict(AnimationExitEffect), "refresh_player": True},
{"name": "slide_animation_speed", "section": self.t(VariableSection.PLAYER_ANIMATION), "value": AnimationSpeed.NORMAL.value, "type": VariableType.SELECT_SINGLE, "editable": True, "description": self.t('settings_variable_desc_slide_animation_speed'), "selectables": self.t(AnimationSpeed), "refresh_player": True}, {"name": "slide_animation_speed", "section": self.t(VariableSection.PLAYER_ANIMATION), "value": AnimationSpeed.NORMAL.value, "type": VariableType.SELECT_SINGLE, "editable": True, "description": self.t('settings_variable_desc_slide_animation_speed'), "selectables": self.t(AnimationSpeed), "refresh_player": True},
### Playlists ### Playlists
{"name": "playlist_enabled", "section": self.t(VariableSection.PLAYLIST), "value": False, "type": VariableType.BOOL, "editable": True, "description": self.t('settings_variable_desc_playlist_enabled'), "refresh_player": False}, {"name": "playlist_enabled", "section": self.t(VariableSection.PLAYLIST), "value": False, "type": VariableType.BOOL, "editable": True, "description": self.t('settings_variable_desc_playlist_enabled'), "refresh_player": False},
{"name": "playlist_default_time_sync", "section": self.t(VariableSection.PLAYLIST), "value": True, "type": VariableType.BOOL, "editable": True, "description": self.t('settings_variable_desc_playlist_default_time_sync'), "refresh_player": True},
### Fleet Management ### Fleet Management
{"name": "fleet_player_enabled", "section": self.t(VariableSection.FLEET), "value": False, "type": VariableType.BOOL, "editable": True, "description": self.t('settings_variable_desc_fleet_player_enabled'), "description_edition": self.t('settings_variable_desc_edition_fleet_player_enabled'), "refresh_player": False}, {"name": "fleet_player_enabled", "section": self.t(VariableSection.FLEET), "value": False, "type": VariableType.BOOL, "editable": True, "description": self.t('settings_variable_desc_fleet_player_enabled'), "description_edition": self.t('settings_variable_desc_edition_fleet_player_enabled'), "refresh_player": False},

View File

@ -6,7 +6,7 @@ from typing import Optional, Union
class Playlist: class Playlist:
def __init__(self, name: str = 'Untitled', slug: str = 'untitled', id: Optional[int] = None, enabled: bool = False, time_sync: bool = True, created_by: Optional[str] = None, updated_by: Optional[str] = None, created_at: Optional[int] = None, updated_at: Optional[int] = None): def __init__(self, name: str = 'Untitled', slug: str = 'untitled', id: Optional[int] = None, enabled: bool = False, time_sync: bool = False, created_by: Optional[str] = None, updated_by: Optional[str] = None, created_at: Optional[int] = None, updated_at: Optional[int] = None):
self._id = id if id else None self._id = id if id else None
self._name = name self._name = name
self._slug = slug self._slug = slug

View File

@ -64,7 +64,8 @@
const animation_speed_duration = {{ animation_speed_duration[slide_animation_speed.eval()] if slide_animation_enabled else 0 }}; const animation_speed_duration = {{ animation_speed_duration[slide_animation_speed.eval()] if slide_animation_enabled else 0 }};
const animate_transitions = [ const animate_transitions = [
"animate__{{ slide_animation_entrance_effect.eval()|default("fadeIn") }}", "animate__{{ slide_animation_entrance_effect.eval()|default("fadeIn") }}",
"animate__{{ slide_animation_exit_effect.eval()|default("none") }}" "animate__none"
{#"animate__{{ slide_animation_exit_effect.eval()|default("none") }}"#}
]; ];
// Slide flow management // Slide flow management

View File

@ -5,7 +5,7 @@
<a href="{{ url_for('playlist_list', playlist_id=playlist.id) }}" <a href="{{ url_for('playlist_list', playlist_id=playlist.id) }}"
class="{% if active %}active{% endif %} tile-item {% if not playlist.enabled %}disabled{% endif %} playlist-item" class="{% if active %}active{% endif %} tile-item {% if not playlist.enabled %}disabled{% endif %} playlist-item"
data-level="{{ playlist.id }}" data-level="{{ playlist.id }}"
data-entity="{{ playlist.to_json({"created_by": track_created(playlist).username, "updated_by": track_updated(playlist).username}) }}"> data-entity="{{ playlist.to_json() }}">
<div class="tile-header"> <div class="tile-header">
<div class="head-icon"> <div class="head-icon">
<i class="fa {{ 'fa fa-circle' if active else 'fa fa-circle' }}"></i> <i class="fa {{ 'fa fa-circle' if active else 'fa fa-circle' }}"></i>
@ -40,7 +40,7 @@
{% endfor %} {% endfor %}
<div class="inner-empty empty-flag {% if playlists|length != 0 %}hidden{% endif %}"> <div class="inner-empty empty-flag {% if playlists|length != 0 %}hidden{% endif %}">
<i class="fa fa-play"></i> <i class="fa fa-list"></i>
</div> </div>
</div> </div>
</div> </div>

View File

@ -92,9 +92,15 @@
<div class="page-content"> <div class="page-content">
<div class="inner"> <div class="inner">
{% with playlists=playlists %} {% if current_playlist %}
{% include 'playlist/component/edit.jinja.html' %} {% with playlists=playlists %}
{% endwith %} {% include 'playlist/component/edit.jinja.html' %}
{% endwith %}
{% else %}
<div class="inner-empty empty-flag ">
<i class="fa fa-play"></i>
</div>
{% endif %}
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,7 +1,8 @@
<table class="slides"> <table class="slides">
<tbody> <tbody>
{% for slide in slides %} {% for slide in slides %}
<tr class="slide-item" data-level="{{ slide.id }}" data-entity="{{ slide.to_json({"content": contents[slide.content_id], "created_by": track_created(slide).username, "updated_by": track_updated(slide).username}) }}"> <tr class="slide-item" data-level="{{ slide.id }}"
data-entity="{{ slide.to_json({"content": contents[slide.content_id]}) }}">
<td class="infos"> <td class="infos">
<div class="inner"> <div class="inner">
<a href="javascript:void(0);" class="item-sort slide-sort"> <a href="javascript:void(0);" class="item-sort slide-sort">
@ -11,51 +12,57 @@
</div> </div>
</td> </td>
<td class=""> <td class="">
{% if slide.cron_schedule %} <div class="start">
{% set cron_desc = cron_descriptor(slide.cron_schedule) %} {% if slide.cron_schedule %}
{% if cron_desc %} {% set cron_desc = cron_descriptor(slide.cron_schedule) %}
{% if is_valid_cron_date_time(slide.cron_schedule) %} {% if cron_desc %}
{% if slide.is_notification %} {% if is_valid_cron_date_time(slide.cron_schedule) %}
🔔 {{ l.slideshow_slide_panel_td_cron_scheduled_notify }} <span class="td-secondary">{{ cron_desc }}</span> {% if slide.is_notification %}
🔔 {{ l.slideshow_slide_panel_td_cron_scheduled_notify }}
<span class="td-secondary">{{ cron_desc }}</span>
{% else %}
🔄 {{ l.slideshow_slide_panel_td_cron_scheduled_loop }}
<span class="td-secondary">{{ cron_desc }}</span>
{% endif %}
{% else %} {% else %}
🔄 {{ l.slideshow_slide_panel_td_cron_scheduled_loop }}<span class="td-secondary">{{ cron_desc }}</span> ⏳ {{ cron_desc }}
{% endif %} {% endif %}
{% else %} {% else %}
⏳ {{ cron_desc }} <span class="error">⚠️ {{ l.slideshow_slide_panel_td_cron_scheduled_bad_cron }}</span>
{% endif %} {% endif %}
{% else %} {% else %}
<span class="error">⚠️ {{ l.slideshow_slide_panel_td_cron_scheduled_bad_cron }}</span> 🔄 {{ l.slideshow_slide_panel_td_cron_scheduled_loop }}
{% endif %} {% endif %}
{% else %} </div>
🔄 {{ l.slideshow_slide_panel_td_cron_scheduled_loop }} <div class="end">
{% endif %} {% if slide.cron_schedule_end %}
</td> {% set cron_desc_end = cron_descriptor(slide.cron_schedule_end) %}
<td class=""> {% if cron_desc_end %}
{% if slide.cron_schedule_end %} {% if is_valid_cron_date_time(slide.cron_schedule_end) %}
{% set cron_desc_end = cron_descriptor(slide.cron_schedule_end) %} {% if slide.is_notification %}
{% if cron_desc_end %} 📆<span class="td-secondary">{{ cron_desc_end }}</span>
{% if is_valid_cron_date_time(slide.cron_schedule_end) %} {% else %}
{% if slide.is_notification %} ⏱️ {{ slide.duration }} {{ l.slideshow_slide_panel_th_duration_unit }}
📆<span class="td-secondary">{{ cron_desc_end }}</span> <span class="td-secondary">{{ cron_desc_end }}</span>
{% endif %}
{% else %} {% else %}
⏱️ {{ slide.duration }} {{ l.slideshow_slide_panel_th_duration_unit }}<span class="td-secondary">{{ cron_desc_end }}</span> ⏳ {{ cron_desc_end }}
{% endif %} {% endif %}
{% else %} {% else %}
⏳ {{ cron_desc_end }} <span class="error">⚠️ {{ l.slideshow_slide_panel_td_cron_scheduled_bad_cron }}</span>
{% endif %} {% endif %}
{% else %} {% else %}
<span class="error">⚠️ {{ l.slideshow_slide_panel_td_cron_scheduled_bad_cron }}</span> ⏱️ {{ slide.duration }} {{ l.slideshow_slide_panel_th_duration_unit }}
{% endif %} {% endif %}
{% else %} </div>
⏱️ {{ slide.duration }} {{ l.slideshow_slide_panel_th_duration_unit }}
{% endif %}
</td> </td>
<td class="actions"> <td class="actions">
<a href="javascript:void(0);" class="item-edit slide-edit"> <a href="javascript:void(0);" class="item-edit slide-edit">
<i class="fa fa-pencil"></i> <i class="fa fa-pencil"></i>
</a> </a>
<a href="javascript:void(0);" class="item-delete slide-delete" data-route="{{ url_for('slideshow_slide_delete', slide_id=slide.id) }}"> <a href="javascript:void(0);" class="item-delete slide-delete"
data-route="{{ url_for('slideshow_slide_delete', slide_id=slide.id) }}">
<i class="fa fa-trash"></i> <i class="fa fa-trash"></i>
</a> </a>
</td> </td>