slide wip
This commit is contained in:
parent
e2fdc9adaa
commit
9573db6aa1
File diff suppressed because one or more lines are too long
@ -46,7 +46,7 @@
|
||||
.tile-header {
|
||||
.head-icon {
|
||||
i {
|
||||
color: #222;
|
||||
color: #444;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -168,7 +168,6 @@
|
||||
"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_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_entrance_effect": "Slide animation entrance effect",
|
||||
"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_save": "Save",
|
||||
"common_cancel": "Cancel",
|
||||
"common_back": "Back",
|
||||
"common_exit": "Exit",
|
||||
"common_close": "Close",
|
||||
"common_confirm": "Confirm",
|
||||
"common_submit": "Submit",
|
||||
|
||||
@ -168,7 +168,6 @@
|
||||
"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_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_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)",
|
||||
@ -221,6 +220,8 @@
|
||||
"common_enable_plugin": "Habilitar este plugin",
|
||||
"common_save": "Guardar",
|
||||
"common_cancel": "Cancelar",
|
||||
"common_back": "Atrás",
|
||||
"common_exit": "Salir",
|
||||
"common_close": "Cerrar",
|
||||
"common_confirm": "Confirmar",
|
||||
"common_submit": "Enviar",
|
||||
|
||||
@ -169,7 +169,6 @@
|
||||
"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_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_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)",
|
||||
@ -222,6 +221,8 @@
|
||||
"common_enable_plugin": "Activer ce plugin",
|
||||
"common_save": "Enregistrer",
|
||||
"common_cancel": "Annuler",
|
||||
"common_back": "Retour",
|
||||
"common_exit": "Quitter",
|
||||
"common_close": "Fermer",
|
||||
"common_confirm": "Confirmer",
|
||||
"common_submit": "Envoyer",
|
||||
|
||||
@ -168,7 +168,6 @@
|
||||
"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_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_entrance_effect": "Effetto ingresso diapositiva",
|
||||
"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_save": "Salva",
|
||||
"common_cancel": "Annulla",
|
||||
"common_back": "Indietro",
|
||||
"common_exit": "Esci",
|
||||
"common_close": "Chiudi",
|
||||
"common_confirm": "Conferma",
|
||||
"common_submit": "Invia",
|
||||
|
||||
@ -54,7 +54,7 @@ class PlayerController(ObController):
|
||||
polling_interval=self._model_store.variable().get_one_by_name('polling_interval'),
|
||||
slide_animation_enabled=animation_enabled,
|
||||
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'),
|
||||
animation_speed_duration=animation_speed_duration
|
||||
)
|
||||
@ -156,7 +156,7 @@ class PlayerController(ObController):
|
||||
|
||||
playlists = {
|
||||
'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,
|
||||
'preview_mode': preview_mode,
|
||||
'notifications': playlist_notifications,
|
||||
|
||||
@ -37,7 +37,7 @@ class PlaylistController(ObController):
|
||||
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:
|
||||
current_playlist = playlists[0]
|
||||
current_playlist = None
|
||||
|
||||
return render_template(
|
||||
'playlist/list.jinja.html',
|
||||
@ -45,7 +45,7 @@ class PlaylistController(ObController):
|
||||
current_playlist=current_playlist,
|
||||
playlists=playlists,
|
||||
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),
|
||||
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,
|
||||
|
||||
@ -222,6 +222,8 @@ class DatabaseManager:
|
||||
"ALTER TABLE slideshow RENAME TO slides",
|
||||
"DELETE FROM settings WHERE name = 'fleet_studio_enabled'",
|
||||
"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",
|
||||
]
|
||||
|
||||
|
||||
@ -89,7 +89,6 @@ class PlaylistManager(ModelManager):
|
||||
|
||||
return [Playlist(
|
||||
id=None,
|
||||
time_sync=self.variable_manager.map().get('playlist_default_time_sync').as_bool(),
|
||||
name=self.t('common_default_playlist'))
|
||||
] + playlists
|
||||
|
||||
|
||||
@ -119,12 +119,11 @@ class VariableManager:
|
||||
### 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_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},
|
||||
|
||||
### 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_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
|
||||
{"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},
|
||||
|
||||
@ -6,7 +6,7 @@ from typing import Optional, Union
|
||||
|
||||
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._name = name
|
||||
self._slug = slug
|
||||
|
||||
@ -64,7 +64,8 @@
|
||||
const animation_speed_duration = {{ animation_speed_duration[slide_animation_speed.eval()] if slide_animation_enabled else 0 }};
|
||||
const animate_transitions = [
|
||||
"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
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
<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"
|
||||
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="head-icon">
|
||||
<i class="fa {{ 'fa fa-circle' if active else 'fa fa-circle' }}"></i>
|
||||
@ -40,7 +40,7 @@
|
||||
{% endfor %}
|
||||
|
||||
<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>
|
||||
@ -92,9 +92,15 @@
|
||||
|
||||
<div class="page-content">
|
||||
<div class="inner">
|
||||
{% with playlists=playlists %}
|
||||
{% include 'playlist/component/edit.jinja.html' %}
|
||||
{% endwith %}
|
||||
{% if current_playlist %}
|
||||
{% with playlists=playlists %}
|
||||
{% 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>
|
||||
|
||||
@ -1,7 +1,8 @@
|
||||
<table class="slides">
|
||||
<tbody>
|
||||
{% 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">
|
||||
<div class="inner">
|
||||
<a href="javascript:void(0);" class="item-sort slide-sort">
|
||||
@ -11,51 +12,57 @@
|
||||
</div>
|
||||
</td>
|
||||
<td class="">
|
||||
{% if slide.cron_schedule %}
|
||||
{% set cron_desc = cron_descriptor(slide.cron_schedule) %}
|
||||
{% if cron_desc %}
|
||||
{% if is_valid_cron_date_time(slide.cron_schedule) %}
|
||||
{% if slide.is_notification %}
|
||||
🔔 {{ l.slideshow_slide_panel_td_cron_scheduled_notify }} <span class="td-secondary">{{ cron_desc }}</span>
|
||||
<div class="start">
|
||||
{% if slide.cron_schedule %}
|
||||
{% set cron_desc = cron_descriptor(slide.cron_schedule) %}
|
||||
{% if cron_desc %}
|
||||
{% if is_valid_cron_date_time(slide.cron_schedule) %}
|
||||
{% 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 %}
|
||||
🔄 {{ l.slideshow_slide_panel_td_cron_scheduled_loop }}<span class="td-secondary">{{ cron_desc }}</span>
|
||||
⏳ {{ cron_desc }}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
⏳ {{ cron_desc }}
|
||||
<span class="error">⚠️ {{ l.slideshow_slide_panel_td_cron_scheduled_bad_cron }}</span>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<span class="error">⚠️ {{ l.slideshow_slide_panel_td_cron_scheduled_bad_cron }}</span>
|
||||
🔄 {{ l.slideshow_slide_panel_td_cron_scheduled_loop }}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
🔄 {{ l.slideshow_slide_panel_td_cron_scheduled_loop }}
|
||||
{% endif %}
|
||||
</td>
|
||||
<td class="">
|
||||
{% if slide.cron_schedule_end %}
|
||||
{% set cron_desc_end = cron_descriptor(slide.cron_schedule_end) %}
|
||||
{% if cron_desc_end %}
|
||||
{% if is_valid_cron_date_time(slide.cron_schedule_end) %}
|
||||
{% if slide.is_notification %}
|
||||
📆<span class="td-secondary">{{ cron_desc_end }}</span>
|
||||
</div>
|
||||
<div class="end">
|
||||
{% if slide.cron_schedule_end %}
|
||||
{% set cron_desc_end = cron_descriptor(slide.cron_schedule_end) %}
|
||||
{% if cron_desc_end %}
|
||||
{% if is_valid_cron_date_time(slide.cron_schedule_end) %}
|
||||
{% if slide.is_notification %}
|
||||
📆<span class="td-secondary">{{ cron_desc_end }}</span>
|
||||
{% else %}
|
||||
⏱️ {{ slide.duration }} {{ l.slideshow_slide_panel_th_duration_unit }}
|
||||
<span class="td-secondary">{{ cron_desc_end }}</span>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
⏱️ {{ slide.duration }} {{ l.slideshow_slide_panel_th_duration_unit }}<span class="td-secondary">{{ cron_desc_end }}</span>
|
||||
⏳ {{ cron_desc_end }}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
⏳ {{ cron_desc_end }}
|
||||
<span class="error">⚠️ {{ l.slideshow_slide_panel_td_cron_scheduled_bad_cron }}</span>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<span class="error">⚠️ {{ l.slideshow_slide_panel_td_cron_scheduled_bad_cron }}</span>
|
||||
⏱️ {{ slide.duration }} {{ l.slideshow_slide_panel_th_duration_unit }}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
⏱️ {{ slide.duration }} {{ l.slideshow_slide_panel_th_duration_unit }}
|
||||
{% endif %}
|
||||
</div>
|
||||
</td>
|
||||
<td class="actions">
|
||||
<a href="javascript:void(0);" class="item-edit slide-edit">
|
||||
<i class="fa fa-pencil"></i>
|
||||
</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>
|
||||
</a>
|
||||
</td>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user