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 {
.head-icon {
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_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",

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_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",

View File

@ -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",

View File

@ -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",

View File

@ -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,

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)
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,

View File

@ -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",
]

View File

@ -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

View File

@ -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},

View File

@ -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

View File

@ -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

View File

@ -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>

View File

@ -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>

View File

@ -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>