diff --git a/.drone.yml b/.drone.yml
index c6dcbe4..7c67229 100644
--- a/.drone.yml
+++ b/.drone.yml
@@ -40,3 +40,21 @@ steps:
- dotnet publish Linaris/Linaris.csproj -c Release --no-restore -o $CI_PROJECT_DIR/build/release -f:net7.0-android /p:AndroidSdkDirectory=/usr/lib/android-sdk
- dotnet sonarscanner end /d:sonar.login=$${sonar_token}
depends_on: [tests]
+
+ - name: generate-and-deploy-docs
+ image: hub.codefirst.iut.uca.fr/thomas.bellembois/codefirst-docdeployer
+ failure: ignore
+ volumes:
+ - name: docs
+ path: /docs
+ commands:
+ - /entrypoint.sh
+ environment:
+ NODOXYGEN: true
+ when:
+ branch:
+ - master
+ event:
+ - push
+ - pull_request
+ depends_on: [build,tests]
diff --git a/Documentation/doxygen/Doxyfile b/Documentation/doxygen/Doxyfile
new file mode 100644
index 0000000..319cdef
--- /dev/null
+++ b/Documentation/doxygen/Doxyfile
@@ -0,0 +1,429 @@
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING = UTF-8
+PROJECT_NAME = "Linaris"
+PROJECT_NUMBER = 1.0.0
+PROJECT_BRIEF = "Music player and manager"
+PROJECT_LOGO = appicon.svg
+OUTPUT_DIRECTORY = /docs/doxygen
+CREATE_SUBDIRS = NO
+ALLOW_UNICODE_NAMES = NO
+OUTPUT_LANGUAGE = English
+BRIEF_MEMBER_DESC = YES
+REPEAT_BRIEF = YES
+ABBREVIATE_BRIEF = "The $name class" \
+ "The $name widget" \
+ "The $name file" \
+ is \
+ provides \
+ specifies \
+ contains \
+ represents \
+ a \
+ an \
+ the
+ALWAYS_DETAILED_SEC = NO
+INLINE_INHERITED_MEMB = NO
+FULL_PATH_NAMES = YES
+STRIP_FROM_PATH =
+STRIP_FROM_INC_PATH =
+SHORT_NAMES = NO
+JAVADOC_AUTOBRIEF = NO
+JAVADOC_BANNER = NO
+QT_AUTOBRIEF = NO
+MULTILINE_CPP_IS_BRIEF = NO
+PYTHON_DOCSTRING = YES
+INHERIT_DOCS = YES
+SEPARATE_MEMBER_PAGES = NO
+TAB_SIZE = 4
+ALIASES =
+OPTIMIZE_OUTPUT_FOR_C = NO
+# Well... the one for Java looks so similar to the one for C#...
+OPTIMIZE_OUTPUT_JAVA = YES
+OPTIMIZE_FOR_FORTRAN = NO
+OPTIMIZE_OUTPUT_VHDL = NO
+OPTIMIZE_OUTPUT_SLICE = NO
+EXTENSION_MAPPING =
+MARKDOWN_SUPPORT = YES
+TOC_INCLUDE_HEADINGS = 5
+AUTOLINK_SUPPORT = YES
+BUILTIN_STL_SUPPORT = NO
+CPP_CLI_SUPPORT = NO
+SIP_SUPPORT = NO
+IDL_PROPERTY_SUPPORT = YES
+DISTRIBUTE_GROUP_DOC = NO
+GROUP_NESTED_COMPOUNDS = NO
+SUBGROUPING = YES
+INLINE_GROUPED_CLASSES = NO
+INLINE_SIMPLE_STRUCTS = NO
+TYPEDEF_HIDES_STRUCT = NO
+LOOKUP_CACHE_SIZE = 0
+NUM_PROC_THREADS = 1
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+EXTRACT_ALL = YES
+# I do not like other members to see my private members... but you can set it to YES if you prefer.
+EXTRACT_PRIVATE = NO
+EXTRACT_PRIV_VIRTUAL = NO
+EXTRACT_PACKAGE = NO
+EXTRACT_STATIC = YES
+EXTRACT_LOCAL_CLASSES = YES
+EXTRACT_LOCAL_METHODS = NO
+EXTRACT_ANON_NSPACES = NO
+RESOLVE_UNNAMED_PARAMS = YES
+HIDE_UNDOC_MEMBERS = NO
+HIDE_UNDOC_CLASSES = NO
+HIDE_FRIEND_COMPOUNDS = NO
+HIDE_IN_BODY_DOCS = NO
+INTERNAL_DOCS = NO
+CASE_SENSE_NAMES = NO
+HIDE_SCOPE_NAMES = NO
+HIDE_COMPOUND_REFERENCE= NO
+SHOW_HEADERFILE = YES
+SHOW_INCLUDE_FILES = YES
+SHOW_GROUPED_MEMB_INC = NO
+FORCE_LOCAL_INCLUDES = NO
+INLINE_INFO = YES
+SORT_MEMBER_DOCS = NO
+SORT_BRIEF_DOCS = NO
+SORT_MEMBERS_CTORS_1ST = NO
+SORT_GROUP_NAMES = NO
+SORT_BY_SCOPE_NAME = NO
+STRICT_PROTO_MATCHING = NO
+GENERATE_TODOLIST = YES
+GENERATE_TESTLIST = YES
+GENERATE_BUGLIST = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS =
+MAX_INITIALIZER_LINES = 30
+SHOW_USED_FILES = YES
+SHOW_FILES = YES
+SHOW_NAMESPACES = YES
+FILE_VERSION_FILTER =
+LAYOUT_FILE =
+CITE_BIB_FILES =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+QUIET = NO
+WARNINGS = YES
+WARN_IF_UNDOCUMENTED = YES
+WARN_IF_DOC_ERROR = YES
+WARN_IF_INCOMPLETE_DOC = YES
+WARN_NO_PARAMDOC = NO
+WARN_AS_ERROR = NO
+WARN_FORMAT = "$file:$line: $text"
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+INPUT = ../../Sources
+INPUT_ENCODING = UTF-8
+FILE_PATTERNS = *.c \
+ *.cc \
+ *.cxx \
+ *.cpp \
+ *.c++ \
+ *.java \
+ *.ii \
+ *.ixx \
+ *.ipp \
+ *.i++ \
+ *.inl \
+ *.idl \
+ *.ddl \
+ *.odl \
+ *.h \
+ *.hh \
+ *.hxx \
+ *.hpp \
+ *.h++ \
+ *.l \
+ *.cs \
+ *.d \
+ *.php \
+ *.php4 \
+ *.php5 \
+ *.phtml \
+ *.inc \
+ *.m \
+ *.markdown \
+ *.md \
+ *.mm \
+ *.dox \
+ *.py \
+ *.pyw \
+ *.f90 \
+ *.f95 \
+ *.f03 \
+ *.f08 \
+ *.f18 \
+ *.f \
+ *.for \
+ *.vhd \
+ *.vhdl \
+ *.ucf \
+ *.qsf \
+ *.ice
+RECURSIVE = YES
+EXCLUDE =
+EXCLUDE_SYMLINKS = NO
+EXCLUDE_PATTERNS = */Tests/*
+EXCLUDE_PATTERNS += */bin/*
+EXCLUDE_PATTERNS += */obj/*
+EXCLUDE_SYMBOLS =
+EXAMPLE_PATH =
+EXAMPLE_PATTERNS = *
+EXAMPLE_RECURSIVE = NO
+IMAGE_PATH =
+INPUT_FILTER =
+FILTER_PATTERNS =
+FILTER_SOURCE_FILES = NO
+FILTER_SOURCE_PATTERNS =
+USE_MDFILE_AS_MAINPAGE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+SOURCE_BROWSER = NO
+INLINE_SOURCES = NO
+STRIP_CODE_COMMENTS = YES
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION = NO
+REFERENCES_LINK_SOURCE = YES
+SOURCE_TOOLTIPS = YES
+USE_HTAGS = NO
+VERBATIM_HEADERS = YES
+CLANG_ASSISTED_PARSING = NO
+CLANG_ADD_INC_PATHS = YES
+CLANG_OPTIONS =
+CLANG_DATABASE_PATH =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+ALPHABETICAL_INDEX = YES
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+GENERATE_HTML = YES
+HTML_OUTPUT = html
+HTML_FILE_EXTENSION = .html
+HTML_HEADER =
+HTML_FOOTER =
+HTML_STYLESHEET =
+HTML_EXTRA_STYLESHEET =
+HTML_EXTRA_FILES = images/CodeFirst.png images/clubinfo.png
+HTML_COLORSTYLE_HUE = 215
+HTML_COLORSTYLE_SAT = 45
+HTML_COLORSTYLE_GAMMA = 240
+HTML_TIMESTAMP = NO
+HTML_DYNAMIC_MENUS = YES
+HTML_DYNAMIC_SECTIONS = NO
+HTML_INDEX_NUM_ENTRIES = 100
+GENERATE_DOCSET = NO
+DOCSET_FEEDNAME = "Doxygen generated docs"
+DOCSET_FEEDURL =
+DOCSET_BUNDLE_ID = org.doxygen.Project
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+DOCSET_PUBLISHER_NAME = Publisher
+GENERATE_HTMLHELP = NO
+CHM_FILE =
+HHC_LOCATION =
+GENERATE_CHI = NO
+CHM_INDEX_ENCODING =
+BINARY_TOC = NO
+TOC_EXPAND = NO
+GENERATE_QHP = NO
+QCH_FILE =
+QHP_NAMESPACE = org.doxygen.Project
+QHP_VIRTUAL_FOLDER = doc
+QHP_CUST_FILTER_NAME =
+QHP_CUST_FILTER_ATTRS =
+QHP_SECT_FILTER_ATTRS =
+QHG_LOCATION =
+GENERATE_ECLIPSEHELP = NO
+ECLIPSE_DOC_ID = org.doxygen.Project
+DISABLE_INDEX = NO
+GENERATE_TREEVIEW = NO
+FULL_SIDEBAR = NO
+ENUM_VALUES_PER_LINE = 4
+TREEVIEW_WIDTH = 250
+EXT_LINKS_IN_WINDOW = NO
+OBFUSCATE_EMAILS = YES
+HTML_FORMULA_FORMAT = png
+FORMULA_FONTSIZE = 10
+FORMULA_TRANSPARENT = YES
+FORMULA_MACROFILE =
+USE_MATHJAX = NO
+MATHJAX_VERSION = MathJax_2
+MATHJAX_FORMAT = HTML-CSS
+MATHJAX_RELPATH =
+MATHJAX_EXTENSIONS =
+MATHJAX_CODEFILE =
+SEARCHENGINE = YES
+SERVER_BASED_SEARCH = NO
+EXTERNAL_SEARCH = NO
+SEARCHENGINE_URL =
+SEARCHDATA_FILE = searchdata.xml
+EXTERNAL_SEARCH_ID =
+EXTRA_SEARCH_MAPPINGS =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+GENERATE_LATEX = NO
+LATEX_OUTPUT = latex
+LATEX_CMD_NAME =
+MAKEINDEX_CMD_NAME = makeindex
+LATEX_MAKEINDEX_CMD = makeindex
+COMPACT_LATEX = NO
+PAPER_TYPE = a4
+EXTRA_PACKAGES =
+LATEX_HEADER =
+LATEX_FOOTER =
+LATEX_EXTRA_STYLESHEET =
+LATEX_EXTRA_FILES =
+PDF_HYPERLINKS = YES
+USE_PDFLATEX = YES
+LATEX_BATCHMODE = NO
+LATEX_HIDE_INDICES = NO
+LATEX_BIB_STYLE = plain
+LATEX_TIMESTAMP = NO
+LATEX_EMOJI_DIRECTORY =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+GENERATE_RTF = NO
+RTF_OUTPUT = rtf
+COMPACT_RTF = NO
+RTF_HYPERLINKS = NO
+RTF_STYLESHEET_FILE =
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+GENERATE_MAN = NO
+MAN_OUTPUT = man
+MAN_EXTENSION = .3
+MAN_SUBDIR =
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+GENERATE_XML = NO
+XML_OUTPUT = xml
+XML_PROGRAMLISTING = YES
+XML_NS_MEMB_FILE_SCOPE = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+GENERATE_DOCBOOK = NO
+DOCBOOK_OUTPUT = docbook
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to Sqlite3 output
+#---------------------------------------------------------------------------
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+GENERATE_PERLMOD = NO
+PERLMOD_LATEX = NO
+PERLMOD_PRETTY = YES
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+ENABLE_PREPROCESSING = YES
+MACRO_EXPANSION = NO
+EXPAND_ONLY_PREDEF = NO
+SEARCH_INCLUDES = YES
+INCLUDE_PATH =
+INCLUDE_FILE_PATTERNS =
+PREDEFINED =
+EXPAND_AS_DEFINED =
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+TAGFILES =
+GENERATE_TAGFILE =
+ALLEXTERNALS = NO
+EXTERNAL_GROUPS = YES
+EXTERNAL_PAGES = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+DIA_PATH =
+HIDE_UNDOC_RELATIONS = YES
+HAVE_DOT = NO
+DOT_NUM_THREADS = 0
+DOT_FONTNAME = Helvetica
+DOT_FONTSIZE = 10
+DOT_FONTPATH =
+CLASS_GRAPH = YES
+COLLABORATION_GRAPH = YES
+GROUP_GRAPHS = YES
+UML_LOOK = NO
+UML_LIMIT_NUM_FIELDS = 10
+DOT_UML_DETAILS = NO
+DOT_WRAP_THRESHOLD = 17
+TEMPLATE_RELATIONS = NO
+INCLUDE_GRAPH = YES
+INCLUDED_BY_GRAPH = YES
+CALL_GRAPH = NO
+CALLER_GRAPH = NO
+GRAPHICAL_HIERARCHY = YES
+DIRECTORY_GRAPH = YES
+DIR_GRAPH_MAX_DEPTH = 1
+DOT_IMAGE_FORMAT = png
+INTERACTIVE_SVG = NO
+DOT_PATH =
+DOTFILE_DIRS =
+MSCFILE_DIRS =
+DIAFILE_DIRS =
+PLANTUML_JAR_PATH =
+PLANTUML_CFG_FILE =
+PLANTUML_INCLUDE_PATH =
+DOT_GRAPH_MAX_NODES = 50
+MAX_DOT_GRAPH_DEPTH = 0
+DOT_TRANSPARENT = NO
+DOT_MULTI_TARGETS = NO
+GENERATE_LEGEND = YES
+DOT_CLEANUP = YES
\ No newline at end of file
diff --git a/Documentation/doxygen/appicon.svg b/Documentation/doxygen/appicon.svg
new file mode 100644
index 0000000..90819de
--- /dev/null
+++ b/Documentation/doxygen/appicon.svg
@@ -0,0 +1,1694 @@
+
+
+
diff --git a/Sources/Linaris/LocalFilesPage.xaml.cs b/Sources/Linaris/LocalFilesPage.xaml.cs
index a550e0c..67a754d 100644
--- a/Sources/Linaris/LocalFilesPage.xaml.cs
+++ b/Sources/Linaris/LocalFilesPage.xaml.cs
@@ -1,279 +1,279 @@
-using CommunityToolkit.Maui.Views;
-using Model;
-using System.Collections.ObjectModel;
-
-namespace Linaris;
-
-public partial class LocalFilesPage : ContentPage
-{
- private ObservableCollection customTitles = (Application.Current as App).Manager.GetCustomTitles();
-
- public ObservableCollection CustomTitles
- {
- get => customTitles;
- }
-
- private ObservableCollection playlists = (Application.Current as App).Manager.GetPlaylists();
-
- public ObservableCollection Playlists
- {
- get => playlists;
- }
-
- public LocalFilesPage()
- {
- InitializeComponent();
- BindingContext = this;
- }
-
- // Reset methods
-
- void ResetAll(object sender, EventArgs e)
- {
- ResetSubMenus(sender, e);
- }
-
- void ResetSubMenus(object sender, EventArgs e)
- {
- foreach (var CustomTitle in customTitles)
- {
- CustomTitle.IsSubMenuVisible = false;
- }
- ResetPlaylistMenu(sender, e);
- }
-
- void ResetPlaylistMenu(object sender, EventArgs e)
- {
- foreach (CustomTitle customTitle in CustomTitles)
- {
- customTitle.IsPlaylistMenuVisible = false;
- customTitle.IsNewPlaylistMenuVisible = false;
- }
- }
-
-
- // Add methods
-
- void AddCustomTitle(CustomTitle customTitle)
- {
- (Application.Current as App).Manager.AddCustomTitle(customTitle);
- customTitles = (Application.Current as App).Manager.GetCustomTitles();
- ResetAll(this, null);
- }
-
- private async void AddTitles(object sender, EventArgs e)
- {
- var results = await FilePicker.PickMultipleAsync(new PickOptions
- {
- FileTypes = new FilePickerFileType(
- new Dictionary>
- {
- { DevicePlatform.WinUI, new [] { "*.mp3", "*.m4a" } },
- { DevicePlatform.Android, new [] { "audio/*" } },
- { DevicePlatform.iOS, new[] { "*.mp3", "*.aac", "*.aifc", "*.au", "*.aiff", "*.mp2", "*.3gp", "*.ac3" } }
- })
- });
+using CommunityToolkit.Maui.Views;
+using Model;
+using System.Collections.ObjectModel;
+
+namespace Linaris;
+
+public partial class LocalFilesPage : ContentPage
+{
+ private ObservableCollection customTitles = (Application.Current as App).Manager.GetCustomTitles();
+
+ public ObservableCollection CustomTitles
+ {
+ get => customTitles;
+ }
+
+ private ObservableCollection playlists = (Application.Current as App).Manager.GetPlaylists();
+
+ public ObservableCollection Playlists
+ {
+ get => playlists;
+ }
+
+ public LocalFilesPage()
+ {
+ InitializeComponent();
+ BindingContext = this;
+ }
+
+ // Reset methods
+
+ void ResetAll(object sender, EventArgs e)
+ {
+ ResetSubMenus(sender, e);
+ }
+
+ void ResetSubMenus(object sender, EventArgs e)
+ {
+ foreach (var CustomTitle in customTitles)
+ {
+ CustomTitle.IsSubMenuVisible = false;
+ }
+ ResetPlaylistMenu(sender, e);
+ }
+
+ void ResetPlaylistMenu(object sender, EventArgs e)
+ {
+ foreach (CustomTitle customTitle in CustomTitles)
+ {
+ customTitle.IsPlaylistMenuVisible = false;
+ customTitle.IsNewPlaylistMenuVisible = false;
+ }
+ }
+
+
+ // Add methods
+
+ void AddCustomTitle(CustomTitle customTitle)
+ {
+ (Application.Current as App).Manager.AddCustomTitle(customTitle);
+ customTitles = (Application.Current as App).Manager.GetCustomTitles();
+ ResetAll(this, null);
+ }
+
+ private async void AddTitles(object sender, EventArgs e)
+ {
+ var results = await FilePicker.PickMultipleAsync(new PickOptions
+ {
+ FileTypes = new FilePickerFileType(
+ new Dictionary>
+ {
+ { DevicePlatform.WinUI, new [] { "*.mp3", "*.m4a" } },
+ { DevicePlatform.Android, new [] { "audio/*" } },
+ { DevicePlatform.iOS, new[] { "*.mp3", "*.aac", "*.aifc", "*.au", "*.aiff", "*.mp2", "*.3gp", "*.ac3" } }
+ })
+ });
try
{
if (results.First() == null)
{
return;
}
- }
+ }
catch (Exception ex)
{
return;
- }
-
- if (sender is Button button)
- {
- foreach (var result in results)
- {
- CustomTitle custom = new CustomTitle(result.FileName, "none.png", "", result.FullPath);
- if (!IsCustomTitleInCollection(custom))
- {
- AddCustomTitle(custom);
- }
- }
- }
- }
-
- async void AddToPlaylist(object sender, EventArgs e)
- {
- if (sender is Button button)
- {
- if (button.BindingContext is Playlist playlist)
- {
- if (button.Parent is StackLayout stack && stack.BindingContext is CustomTitle customTitle)
- {
- if (playlist.HasCustomTitle(customTitle))
- {
- await DisplayAlert("Erreur !", "Ce morceau est déjà dans cette playlist !", "OK");
- return;
- }
- playlist.AddTitle(customTitle);
- ResetAll(sender, e);
- }
- }
- }
- }
-
- void AddPlaylist(object sender, EventArgs e)
- {
- if (sender is Entry entry)
- {
- Playlist playlist = new Playlist(entry.Text, "", "none.png");
- if (!IsInPlaylists(playlist))
- {
- (Application.Current as App).Manager.AddPlaylist(playlist);
- playlists = (Application.Current as App).Manager.GetPlaylists();
- }
- if(entry.BindingContext is CustomTitle customTitle)
- {
- customTitle.IsNewPlaylistMenuVisible = false;
- entry.Text = "";
- }
- }
- }
-
-
- // Remove methods
-
- void RemoveCustomTitle(object sender, EventArgs e)
- {
- if (sender is Button button)
- {
- if (button.BindingContext is CustomTitle titleToRemove)
- {
- (Application.Current as App).Manager.RemoveCustomTitle(titleToRemove);
- customTitles.Remove(titleToRemove);
- }
- }
- }
-
-
- // Show methods
-
- void ShowSubMenu(object sender, EventArgs e)
- {
- if (sender is Image image)
- {
- if (image.BindingContext is CustomTitle customTitle)
- {
- if (!customTitle.IsSubMenuVisible)
- {
- ResetAll(sender, e);
- customTitle.IsSubMenuVisible = true;
- }
- else
- {
- ResetSubMenus(sender, e);
- }
- }
- }
- }
-
- void ShowPlaylistMenu(object sender, EventArgs e)
- {
- if (sender is Button button)
- {
- if (button.BindingContext is CustomTitle customTitle)
- {
- if (!customTitle.IsPlaylistMenuVisible)
- {
- customTitle.IsPlaylistMenuVisible = true;
- }
- }
- }
- }
-
- void ShowNewPlaylistMenu(object sender, EventArgs e)
- {
- if (sender is Button button)
- {
- if (button.BindingContext is CustomTitle customTitle)
- {
- if (!customTitle.IsNewPlaylistMenuVisible)
- {
- customTitle.IsNewPlaylistMenuVisible = true;
- }
- }
- }
- }
-
-
- // Change methods
-
- private async void ChangeImage(object sender, EventArgs e)
- {
- var result = await FilePicker.PickAsync(new PickOptions
- {
- PickerTitle = "Choisissez une nouvelle image !",
- FileTypes = FilePickerFileType.Images
- });
-
- if (result == null)
- {
- return;
- }
-
- if (sender is Button button)
- {
- if (button.BindingContext is CustomTitle customTitle)
- {
- customTitle.ImageURL = result.FullPath;
- }
- }
- }
-
- // Search methods
-
- bool IsCustomTitleInCollection(CustomTitle customTitle)
- {
- foreach(var custom in customTitles)
- {
- if (customTitle.Equals(custom))
- {
- return true;
- }
- }
- return false;
- }
-
- bool IsInPlaylists(Playlist playlist)
- {
- foreach (Playlist p in playlists)
- {
- if (p.Equals(playlist))
- {
- return true;
- }
- }
- return false;
- }
-
- protected override void OnDisappearing()
- {
- base.OnDisappearing();
- ContentView footer = this.FindByName("Footer");
- var musicElement = footer?.FindByName("music");
- if (musicElement != null)
- {
- musicElement.Stop();
- }
- }
-
- private void Play(object sender, EventArgs e)
- {
- if (sender is Button button && button.BindingContext is CustomTitle customTitle)
- {
-
- ContentView footer = this.FindByName("Footer");
- var musicElement = footer?.FindByName("music");
- if (musicElement != null)
- {
- musicElement.Source = customTitle.Path;
- }
- }
- }
+ }
+
+ if (sender is Button button)
+ {
+ foreach (var result in results)
+ {
+ CustomTitle custom = new CustomTitle(result.FileName, "none.png", "", result.FullPath);
+ if (!IsCustomTitleInCollection(custom))
+ {
+ AddCustomTitle(custom);
+ }
+ }
+ }
+ }
+
+ async void AddToPlaylist(object sender, EventArgs e)
+ {
+ if (sender is Button button)
+ {
+ if (button.BindingContext is Playlist playlist)
+ {
+ if (button.Parent is StackLayout stack && stack.BindingContext is CustomTitle customTitle)
+ {
+ if (playlist.HasCustomTitle(customTitle))
+ {
+ await DisplayAlert("Erreur !", "Ce morceau est déjà dans cette playlist !", "OK");
+ return;
+ }
+ playlist.AddTitle(customTitle);
+ ResetAll(sender, e);
+ }
+ }
+ }
+ }
+
+ void AddPlaylist(object sender, EventArgs e)
+ {
+ if (sender is Entry entry)
+ {
+ Playlist playlist = new Playlist(entry.Text, "", "none.png");
+ if (!IsInPlaylists(playlist))
+ {
+ (Application.Current as App).Manager.AddPlaylist(playlist);
+ playlists = (Application.Current as App).Manager.GetPlaylists();
+ }
+ if(entry.BindingContext is CustomTitle customTitle)
+ {
+ customTitle.IsNewPlaylistMenuVisible = false;
+ entry.Text = "";
+ }
+ }
+ }
+
+
+ // Remove methods
+
+ void RemoveCustomTitle(object sender, EventArgs e)
+ {
+ if (sender is Button button)
+ {
+ if (button.BindingContext is CustomTitle titleToRemove)
+ {
+ (Application.Current as App).Manager.RemoveCustomTitle(titleToRemove);
+ customTitles.Remove(titleToRemove);
+ }
+ }
+ }
+
+
+ // Show methods
+
+ void ShowSubMenu(object sender, EventArgs e)
+ {
+ if (sender is Image image)
+ {
+ if (image.BindingContext is CustomTitle customTitle)
+ {
+ if (!customTitle.IsSubMenuVisible)
+ {
+ ResetAll(sender, e);
+ customTitle.IsSubMenuVisible = true;
+ }
+ else
+ {
+ ResetSubMenus(sender, e);
+ }
+ }
+ }
+ }
+
+ void ShowPlaylistMenu(object sender, EventArgs e)
+ {
+ if (sender is Button button)
+ {
+ if (button.BindingContext is CustomTitle customTitle)
+ {
+ if (!customTitle.IsPlaylistMenuVisible)
+ {
+ customTitle.IsPlaylistMenuVisible = true;
+ }
+ }
+ }
+ }
+
+ void ShowNewPlaylistMenu(object sender, EventArgs e)
+ {
+ if (sender is Button button)
+ {
+ if (button.BindingContext is CustomTitle customTitle)
+ {
+ if (!customTitle.IsNewPlaylistMenuVisible)
+ {
+ customTitle.IsNewPlaylistMenuVisible = true;
+ }
+ }
+ }
+ }
+
+
+ // Change methods
+
+ private async void ChangeImage(object sender, EventArgs e)
+ {
+ var result = await FilePicker.PickAsync(new PickOptions
+ {
+ PickerTitle = "Choisissez une nouvelle image !",
+ FileTypes = FilePickerFileType.Images
+ });
+
+ if (result == null)
+ {
+ return;
+ }
+
+ if (sender is Button button)
+ {
+ if (button.BindingContext is CustomTitle customTitle)
+ {
+ customTitle.ImageURL = result.FullPath;
+ }
+ }
+ }
+
+ // Search methods
+
+ bool IsCustomTitleInCollection(CustomTitle customTitle)
+ {
+ foreach(var custom in customTitles)
+ {
+ if (customTitle.Equals(custom))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ bool IsInPlaylists(Playlist playlist)
+ {
+ foreach (Playlist p in playlists)
+ {
+ if (p.Equals(playlist))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ protected override void OnDisappearing()
+ {
+ base.OnDisappearing();
+ ContentView footer = this.FindByName("Footer");
+ var musicElement = footer?.FindByName("music");
+ if (musicElement != null)
+ {
+ musicElement.Stop();
+ }
+ }
+
+ private void Play(object sender, EventArgs e)
+ {
+ if (sender is Button button && button.BindingContext is CustomTitle customTitle)
+ {
+
+ ContentView footer = this.FindByName("Footer");
+ var musicElement = footer?.FindByName("music");
+ if (musicElement != null)
+ {
+ musicElement.Source = customTitle.Path;
+ }
+ }
+ }
}
\ No newline at end of file