예제 #1
0
        public CollectionTracksViewModel(IContainerProvider container) : base(container)
        {
            // Dependency injection
            this.container       = container;
            this.dialogService   = container.Resolve <IDialogService>();
            this.eventAggregator = container.Resolve <IEventAggregator>();

            // Settings
            SettingsClient.SettingChanged += (_, e) =>
            {
                if (SettingsClient.IsSettingChanged(e, "Behaviour", "EnableRating"))
                {
                    this.EnableRating = (bool)e.Entry.Value;
                    this.GetVisibleColumns();
                }

                if (SettingsClient.IsSettingChanged(e, "Behaviour", "EnableLove"))
                {
                    this.EnableLove = (bool)e.Entry.Value;
                    this.GetVisibleColumns();
                }
            };

            // Commands
            this.ChooseColumnsCommand        = new DelegateCommand(this.ChooseColumns);
            this.RemoveSelectedTracksCommand = new DelegateCommand(async() => await this.RemoveTracksFromCollectionAsync(this.SelectedTracks), () => !this.IsIndexing);

            // Show only the columns which are visible
            this.GetVisibleColumns();
        }
예제 #2
0
        public WindowsIntegrationService(IPlaybackService playbackService)
        {
            this.playbackService       = playbackService;
            this.isStartedFromExplorer = Environment.GetCommandLineArgs().Length > 1;

            if (SettingsClient.Get <bool>("Playback", "PreventSleepWhilePlaying"))
            {
                this.EnableSleepPrevention();
            }

            SettingsClient.SettingChanged += (_, e) =>
            {
                if (SettingsClient.IsSettingChanged(e, "Playback", "PreventSleepWhilePlaying"))
                {
                    bool preventSleepWhilePlaying = (bool)e.Entry.Value;

                    if (preventSleepWhilePlaying)
                    {
                        this.EnableSleepPrevention();
                    }
                    else
                    {
                        this.DisableSleepPrevention();
                    }
                }
            };
        }
        public RichPresenceService(IPlaybackService playbackService)
        {
            this.playbackService = playbackService;

            if (SettingsClient.Get <bool>("Discord", "EnableDiscordRichPresence"))
            {
                this.RegisterClient();
            }

            SettingsClient.SettingChanged += (_, e) =>
            {
                if (SettingsClient.IsSettingChanged(e, "Discord", "EnableDiscordRichPresence"))
                {
                    bool enableDiscordRichPresence = (bool)e.Entry.Value;

                    if (enableDiscordRichPresence)
                    {
                        this.RegisterClient();
                        this.ShowTrackDetails();
                    }
                    else
                    {
                        this.UnregisterClient();
                    }
                }
            };
        }
        public CollectionPlaylistsViewModel(IContainerProvider container, IDialogService dialogService,
                                            IPlaybackService playbackService, IPlaylistService playlistService, IMetadataService metadataService,
                                            IFileService fileService, IEventAggregator eventAggregator) : base(container)
        {
            this.dialogService   = dialogService;
            this.playlistService = playlistService;
            this.playbackService = playbackService;
            this.fileService     = fileService;
            this.eventAggregator = eventAggregator;
            this.dialogService   = dialogService;
            this.metadataService = metadataService;
            this.container       = container;

            // Events
            this.playlistService.PlaylistFolderChanged += PlaylistService_PlaylistFolderChanged;
            this.playlistService.TracksAdded           += PlaylistService_TracksAdded;
            this.playlistService.TracksDeleted         += PlaylistService_TracksDeleted;

            this.metadataService.LoveChanged += async(_) => await this.GetTracksIfSmartPlaylistSelectedAsync();

            this.metadataService.RatingChanged += async(_) => await this.GetTracksIfSmartPlaylistSelectedAsync();

            this.metadataService.MetadataChanged += async(_) => await this.GetTracksIfSmartPlaylistSelectedAsync();

            this.playbackService.PlaybackCountersChanged += async(_) => await this.GetTracksIfSmartPlaylistSelectedAsync();

            // Commands
            this.EditSelectedPlaylistCommand    = new DelegateCommand(async() => await this.EditSelectedPlaylistAsync());
            this.DeletePlaylistCommand          = new DelegateCommand <PlaylistViewModel>(async(playlist) => await this.ConfirmDeletePlaylistAsync(playlist));
            this.ImportPlaylistsCommand         = new DelegateCommand(async() => await this.ImportPlaylistsAsync());
            this.AddPlaylistToNowPlayingCommand = new DelegateCommand(async() => await this.AddPlaylistToNowPlayingAsync());
            this.ShuffleSelectedPlaylistCommand = new DelegateCommand(async() => await this.ShuffleSelectedPlaylistAsync());
            this.NewPlaylistCommand             = new DelegateCommand(async() => await this.ConfirmCreateNewPlaylistAsync());
            this.RemoveSelectedTracksCommand    = new DelegateCommand(async() => await this.DeleteTracksFromPlaylistsAsync());

            this.DeleteSelectedPlaylistCommand = new DelegateCommand(async() =>
            {
                if (this.IsPlaylistSelected)
                {
                    await this.ConfirmDeletePlaylistAsync(this.SelectedPlaylist);
                }
            });

            // Settings changed
            SettingsClient.SettingChanged += (_, e) =>
            {
                if (SettingsClient.IsSettingChanged(e, "Behaviour", "EnableRating"))
                {
                    this.EnableRating = (bool)e.Entry.Value;
                }

                if (SettingsClient.IsSettingChanged(e, "Behaviour", "EnableLove"))
                {
                    this.EnableLove = (bool)e.Entry.Value;
                }
            };

            // Load settings
            this.LeftPaneWidthPercent = SettingsClient.Get <int>("ColumnWidths", "PlaylistsLeftPaneWidthPercent");
        }
예제 #5
0
        private void InitializeShellWindow()
        {
            // Start monitoring tablet mode
            this.windowsIntegrationService.StartMonitoringTabletMode();

            // Tray controls
            this.trayControls = this.container.Resolve <TrayControls>();

            // Create the Mini Player playlist
            this.miniPlayerPlaylist = this.container.Resolve <MiniPlayerPlaylist>(new DependencyOverride(typeof(DopamineWindow), this));

            // NotificationService needs to know about the application windows
            this.notificationService.SetApplicationWindows(this, this.miniPlayerPlaylist, this.trayControls);

            // Settings changed
            SettingsClient.SettingChanged += (_, e) =>
            {
                if (SettingsClient.IsSettingChanged(e, "Appearance", "ShowWindowBorder"))
                {
                    this.SetWindowBorder((bool)e.SettingValue);
                }

                if (SettingsClient.IsSettingChanged(e, "Behaviour", "ShowTrayIcon"))
                {
                    this.trayIcon.Visible = (bool)e.SettingValue;
                }
            };

            // Make sure the window geometry respects tablet mode at startup
            this.CheckIfTabletMode();
        }
예제 #6
0
        public MiniPlayerPlaylist(Windows10BorderlessWindow parent, IPlaybackService playbackService, IRegionManager regionManager, IEventAggregator eventAggregator)
        {
            InitializeComponent();

            this.parent          = parent;
            this.playbackService = playbackService;
            this.regionManager   = regionManager;
            this.eventAggregator = eventAggregator;

            SettingsClient.SettingChanged += (_, e) =>
            {
                if (SettingsClient.IsSettingChanged(e, "Appearance", "ShowWindowBorder"))
                {
                    this.WindowBorder.BorderThickness = new Thickness((bool)e.Entry.Value ? 1 : 0);
                }
            };

            this.eventAggregator.GetEvent <ToggledCoverPlayerAlignPlaylistVertically>().Subscribe(async alignPlaylistVertically =>
            {
                this.alignCoverPlayerPlaylistVertically = alignPlaylistVertically;
                if (this.IsVisible)
                {
                    await this.SetGeometry();
                }
            });
        }
예제 #7
0
        public LyricsControlViewModel(IUnityContainer container) : base(container)
        {
            this.container       = container;
            this.info            = container.Resolve <ILocalizationInfo>();
            this.metadataService = container.Resolve <IMetadataService>();
            this.playbackService = container.Resolve <IPlaybackService>();
            this.eventAggregator = container.Resolve <IEventAggregator>();

            this.highlightTimer.Interval = this.highlightTimerIntervalMilliseconds;
            this.highlightTimer.Elapsed += HighlightTimer_Elapsed;

            this.updateLyricsAfterEditingTimer.Interval = this.updateLyricsAfterEditingTimerIntervalMilliseconds;
            this.updateLyricsAfterEditingTimer.Elapsed += UpdateLyricsAfterEditingTimer_Elapsed;

            this.refreshTimer.Interval = this.refreshTimerIntervalMilliseconds;
            this.refreshTimer.Elapsed += RefreshTimer_Elapsed;

            this.playbackService.PlaybackPaused  += (_, __) => this.highlightTimer.Stop();
            this.playbackService.PlaybackResumed += (_, __) => this.highlightTimer.Start();

            this.metadataService.MetadataChanged += (_) => this.RestartRefreshTimer();

            SettingsClient.SettingChanged += (_, e) =>
            {
                if (SettingsClient.IsSettingChanged(e, "Lyrics", "DownloadLyrics"))
                {
                    if ((bool)e.SettingValue)
                    {
                        this.RestartRefreshTimer();
                    }
                }
            };

            this.isNowPlayingPageActive       = SettingsClient.Get <bool>("FullPlayer", "IsNowPlayingSelected");
            this.isNowPlayingLyricsPageActive = ((NowPlayingSubPage)SettingsClient.Get <int>("FullPlayer", "SelectedNowPlayingSubPage")) == NowPlayingSubPage.Lyrics;

            this.eventAggregator.GetEvent <IsNowPlayingPageActiveChanged>().Subscribe(isNowPlayingPageActive =>
            {
                this.isNowPlayingPageActive = isNowPlayingPageActive;
                this.RestartRefreshTimer();
            });

            this.eventAggregator.GetEvent <IsNowPlayingSubPageChanged>().Subscribe(tuple =>
            {
                this.isNowPlayingLyricsPageActive = tuple.Item2 == NowPlayingSubPage.Lyrics;
                this.RestartRefreshTimer();
            });

            this.RefreshLyricsCommand = new DelegateCommand(() => this.RestartRefreshTimer(), () => !this.IsDownloadingLyrics);
            ApplicationCommands.RefreshLyricsCommand.RegisterCommand(this.RefreshLyricsCommand);

            this.playbackService.PlaybackSuccess += (_, e) =>
            {
                this.ContentSlideInFrom = e.IsPlayingPreviousTrack ? -30 : 30;
                this.RestartRefreshTimer();
            };

            this.ClearLyrics(); // Makes sure the loading animation can be shown even at first start
        }
예제 #8
0
        private void InitializeWindows()
        {
            // Start monitoring tablet mode
            this.windowsIntegrationService.StartMonitoringTabletMode();

            // Tray controls
            this.trayControls = this.container.Resolve <TrayControls>();

            // Create the Mini Player playlist
            this.miniPlayerPlaylist = this.container.Resolve <Func <BorderlessWindows10Window, MiniPlayerPlaylist> >()(this);

            // NotificationService needs to know about the application windows
            this.notificationService.SetApplicationWindows(this, this.miniPlayerPlaylist, this.trayControls);

            // Settings changed
            SettingsClient.SettingChanged += (_, e) =>
            {
                if (SettingsClient.IsSettingChanged(e, "Appearance", "ShowWindowBorder"))
                {
                    this.WindowBorder.BorderThickness = new Thickness((bool)e.SettingValue ? 1 : 0);
                }

                if (SettingsClient.IsSettingChanged(e, "Behaviour", "ShowTrayIcon"))
                {
                    this.trayIcon.Visible = (bool)e.SettingValue;
                }
            };

            this.shellService.WindowStateChangeRequested += (_, e) => this.WindowState = e.WindowState;
            this.shellService.IsMovableChangeRequested   += (_, e) => this.IsMovable = e.IsMovable;
            this.shellService.ResizeModeChangeRequested  += (_, e) => this.ResizeMode = e.ResizeMode;
            this.shellService.TopmostChangeRequested     += (_, e) => this.Topmost = e.IsTopmost;

            this.shellService.GeometryChangeRequested += (_, e) => this.SetGeometry(
                e.Top, e.Left, e.Size.Width, e.Size.Height,
                Constants.DefaultShellTop,
                Constants.DefaultShellLeft);

            this.shellService.MinimumSizeChangeRequested += (_, e) =>
            {
                this.MinWidth  = e.MinimumSize.Width;
                this.MinHeight = e.MinimumSize.Height;
            };

            this.shellService.PlaylistVisibilityChangeRequested += (_, e) =>
            {
                if (e.IsPlaylistVisible)
                {
                    this.miniPlayerPlaylist.Show(e.MiniPlayerType);
                }
                else
                {
                    this.miniPlayerPlaylist.Hide();
                }
            };

            this.shellService.CheckIfTabletMode(true); // Make sure the window geometry respects tablet mode at startup
            this.SetWindowBorder();
        }
예제 #9
0
        public TracksViewModelBase(IContainerProvider container) : base(container)
        {
            // Dependency injection
            this.container         = container;
            this.trackRepository   = container.Resolve <ITrackRepository>();
            this.dialogService     = container.Resolve <IDialogService>();
            this.searchService     = container.Resolve <ISearchService>();
            this.playbackService   = container.Resolve <IPlaybackService>();
            this.collectionService = container.Resolve <ICollectionService>();
            this.i18nService       = container.Resolve <II18nService>();
            this.eventAggregator   = container.Resolve <IEventAggregator>();
            this.providerService   = container.Resolve <IProviderService>();
            this.playlistService   = container.Resolve <IPlaylistService>();
            this.metadataService   = container.Resolve <IMetadataService>();

            // Events
            this.metadataService.MetadataChanged += MetadataChangedHandlerAsync;

            // Commands
            this.ToggleTrackOrderCommand      = new DelegateCommand(() => this.ToggleTrackOrder());
            this.AddTracksToPlaylistCommand   = new DelegateCommand <string>(async(playlistName) => await this.AddTracksToPlaylistAsync(playlistName, this.SelectedTracks));
            this.PlaySelectedCommand          = new DelegateCommand(async() => await this.PlaySelectedAsync());
            this.PlayNextCommand              = new DelegateCommand(async() => await this.PlayNextAsync());
            this.AddTracksToNowPlayingCommand = new DelegateCommand(async() => await this.AddTracksToNowPlayingAsync());

            this.UpdateShowTrackArtCommand = new DelegateCommand <bool?>((showTrackArt) =>
            {
                SettingsClient.Set <bool>("Appearance", "ShowTrackArtOnPlaylists", showTrackArt.Value, true);
            });

            // Settings changed
            SettingsClient.SettingChanged += (_, e) =>
            {
                if (SettingsClient.IsSettingChanged(e, "Behaviour", "ShowRemoveFromDisk"))
                {
                    RaisePropertyChanged(nameof(this.ShowRemoveFromDisk));
                }


                if (SettingsClient.IsSettingChanged(e, "Appearance", "ShowTrackArtOnPlaylists"))
                {
                    this.ShowTrackArt = (bool)e.SettingValue;
                    this.UpdateShowTrackArtAsync();
                }
            };

            // Events
            this.i18nService.LanguageChanged += (_, __) =>
            {
                RaisePropertyChanged(nameof(this.TotalDurationInformation));
                RaisePropertyChanged(nameof(this.TotalSizeInformation));
                this.RefreshLanguage();
            };

            this.playbackService.PlaybackCountersChanged += PlaybackService_PlaybackCountersChanged;

            // Load settings
            this.ShowTrackArt = SettingsClient.Get <bool>("Appearance", "ShowTrackArtOnPlaylists");
        }
예제 #10
0
        public PlaybackInfoControlViewModel(IPlaybackService playbackService, IMetadataService metadataService, IScrobblingService scrobblingService)
        {
            this.playbackService   = playbackService;
            this.metadataService   = metadataService;
            this.scrobblingService = scrobblingService;

            this.refreshTimer.Interval = this.refreshTimerIntervalMilliseconds;
            this.refreshTimer.Elapsed += RefreshTimer_Elapsed;

            this.playbackService.PlaybackSuccess += (_, e) =>
            {
                this.SlideDirection = e.IsPlayingPreviousTrack ? SlideDirection.UpToDown : SlideDirection.DownToUp;
                this.refreshTimer.Stop();
                this.refreshTimer.Start();
            };

            this.playbackService.PlaybackProgressChanged += (_, __) => this.UpdateTime();
            this.playbackService.PlayingTrackChanged     += (_, __) => this.RefreshPlaybackInfoAsync(this.playbackService.CurrentTrack, true);

            this.metadataService.RatingChanged += (e) =>
            {
                if (this.track != null && e.SafePath.Equals(this.track.SafePath))
                {
                    this.track.Rating = e.Rating;
                    this.RaisePropertyChanged(nameof(Rating));
                }
            };

            this.metadataService.LoveChanged += (e) =>
            {
                if (this.track != null && e.SafePath.Equals(this.track.SafePath))
                {
                    this.track.Love = e.Love;
                    this.RaisePropertyChanged(nameof(Love));
                }
            };

            // Settings
            SettingsClient.SettingChanged += async(_, e) =>
            {
                if (SettingsClient.IsSettingChanged(e, "Behaviour", "EnableRating"))
                {
                    this.EnableRating = (bool)e.SettingValue;
                }

                if (SettingsClient.IsSettingChanged(e, "Behaviour", "EnableLove"))
                {
                    this.EnableLove = (bool)e.SettingValue;
                }
            };

            // Defaults
            this.SlideDirection = SlideDirection.DownToUp;
            this.RefreshPlaybackInfoAsync(this.playbackService.CurrentTrack, false);
            this.EnableRating = SettingsClient.Get <bool>("Behaviour", "EnableRating");
            this.EnableLove   = SettingsClient.Get <bool>("Behaviour", "EnableLove");
        }
        public CollectionPlaylistsViewModel(IContainerProvider container) : base(container)
        {
            // Dependency injection
            this.fileService     = container.Resolve <IFileService>();
            this.playlistService = container.Resolve <IPlaylistService>();
            this.playbackService = container.Resolve <IPlaybackService>();
            this.eventAggregator = container.Resolve <IEventAggregator>();
            this.dialogService   = container.Resolve <IDialogService>();

            // Commands
            this.LoadedCommand                  = new DelegateCommand(async() => await this.LoadedCommandAsync());
            this.NewPlaylistCommand             = new DelegateCommand(async() => await this.ConfirmAddPlaylistAsync());
            this.OpenPlaylistCommand            = new DelegateCommand(async() => await this.OpenPlaylistAsync());
            this.RenameSelectedPlaylistCommand  = new DelegateCommand(async() => await this.RenameSelectedPlaylistAsync());
            this.RemoveSelectedTracksCommand    = new DelegateCommand(async() => await this.DeleteTracksFromPlaylistsAsync());
            this.AddPlaylistToNowPlayingCommand = new DelegateCommand(async() => await this.AddPlaylistToNowPlayingAsync());
            this.DeletePlaylistByNameCommand    = new DelegateCommand <string>(async(playlistName) => await this.ConfirmDeletePlaylistAsync(playlistName));
            this.ShuffleSelectedPlaylistCommand = new DelegateCommand(async() => await this.ShuffleSelectedPlaylistAsync());

            this.DeleteSelectedPlaylistCommand = new DelegateCommand(async() =>
            {
                if (this.IsPlaylistSelected)
                {
                    await this.ConfirmDeletePlaylistAsync(this.SelectedPlaylistName);
                }
            });

            // Settings changed
            SettingsClient.SettingChanged += (_, e) =>
            {
                if (SettingsClient.IsSettingChanged(e, "Behaviour", "EnableRating"))
                {
                    this.EnableRating = (bool)e.SettingValue;
                }

                if (SettingsClient.IsSettingChanged(e, "Behaviour", "EnableLove"))
                {
                    this.EnableLove = (bool)e.SettingValue;
                }
            };

            // Events
            this.playlistService.TracksAdded += async(numberTracksAdded, playlistName) => await this.UpdateAddedTracksAsync(playlistName);

            this.playlistService.TracksDeleted += async(playlistName) => await this.UpdateDeletedTracksAsync(playlistName);

            this.playlistService.PlaylistAdded         += (addedPlaylistName) => this.UpdateAddedPlaylist(addedPlaylistName);
            this.playlistService.PlaylistDeleted       += (deletedPlaylistName) => this.UpdateDeletedPlaylist(deletedPlaylistName);
            this.playlistService.PlaylistRenamed       += (oldPlaylistName, newPlaylistName) => this.UpdateRenamedPlaylist(oldPlaylistName, newPlaylistName);
            this.playlistService.PlaylistFolderChanged += async(_, __) => await this.FillListsAsync();

            // Load settings
            this.LeftPaneWidthPercent = SettingsClient.Get <int>("ColumnWidths", "PlaylistsLeftPaneWidthPercent");
        }
예제 #12
0
        public Win32InputService(IPlaybackService playbackService)
        {
            this.playbackService = playbackService;

            SettingsClient.SettingChanged += (_, e) =>
            {
                if (SettingsClient.IsSettingChanged(e, "MediaKeys", "UseAppCommandMediaKeys"))
                {
                    this.SetEventHandlers();
                }
            };
        }
예제 #13
0
 private async void SettingsClient_SettingChanged(object sender, SettingChangedEventArgs e)
 {
     if (SettingsClient.IsSettingChanged(e, "Indexing", "RefreshCollectionAutomatically"))
     {
         if ((bool)e.SettingValue)
         {
             await this.watcherManager.StartWatchingAsync();
         }
         else
         {
             await this.watcherManager.StopWatchingAsync();
         }
     }
 }
예제 #14
0
        public PlaylistViewModelBase(IContainerProvider container) : base(container)
        {
            // Dependency injection
            this.container       = container;
            this.playbackService = container.Resolve <IPlaybackService>();
            this.eventAggregator = container.Resolve <IEventAggregator>();
            this.searchService   = container.Resolve <ISearchService>();
            this.dialogService   = container.Resolve <IDialogService>();
            this.providerService = container.Resolve <IProviderService>();
            this.i18nService     = container.Resolve <II18nService>();

            // Commands
            this.PlaySelectedCommand          = new DelegateCommand(async() => await this.PlaySelectedAsync());
            this.PlayNextCommand              = new DelegateCommand(async() => await this.PlayNextAsync());
            this.AddTracksToNowPlayingCommand = new DelegateCommand(async() => await this.AddTracksToNowPlayingAsync());
            this.UpdateShowTrackArtCommand    = new DelegateCommand <bool?>((showTrackArt) =>
            {
                SettingsClient.Set <bool>("Appearance", "ShowTrackArtOnPlaylists", showTrackArt.Value, true);
            });

            // Settings
            SettingsClient.SettingChanged += (_, e) =>
            {
                if (SettingsClient.IsSettingChanged(e, "Behaviour", "EnableRating"))
                {
                    this.EnableRating = (bool)e.SettingValue;
                }

                if (SettingsClient.IsSettingChanged(e, "Behaviour", "EnableLove"))
                {
                    this.EnableLove = (bool)e.SettingValue;
                }
            };

            // Events
            this.i18nService.LanguageChanged += (_, __) => this.RefreshLanguage();

            SettingsClient.SettingChanged += (_, e) =>
            {
                if (SettingsClient.IsSettingChanged(e, "Appearance", "ShowTrackArtOnPlaylists"))
                {
                    this.ShowTrackArt = (bool)e.SettingValue;
                    this.UpdateShowTrackArtAsync();
                }
            };

            // Settings
            this.ShowTrackArt = SettingsClient.Get <bool>("Appearance", "ShowTrackArtOnPlaylists");
        }
        public TracksViewModelBaseWithTrackArt(IContainerProvider container) : base(container)
        {
            // Settings changed
            SettingsClient.SettingChanged += (_, e) =>
            {
                if (SettingsClient.IsSettingChanged(e, "Appearance", "ShowTrackArtOnPlaylists"))
                {
                    this.ShowTrackArt = (bool)e.SettingValue;
                    this.UpdateShowTrackArtAsync();
                }
            };

            // Load settings
            this.ShowTrackArt = SettingsClient.Get <bool>("Appearance", "ShowTrackArtOnPlaylists");
        }
예제 #16
0
        public CollectionAlbumsViewModel(IContainerProvider container) : base(container)
        {
            // Dependency injection
            this.indexingService   = container.Resolve <IIndexingService>();
            this.collectionService = container.Resolve <ICollectionService>();
            this.metadataService   = container.Resolve <IMetadataService>();
            this.eventAggregator   = container.Resolve <IEventAggregator>();

            // Settings
            SettingsClient.SettingChanged += async(_, e) =>
            {
                if (SettingsClient.IsSettingChanged(e, "Behaviour", "EnableRating"))
                {
                    this.EnableRating = (bool)e.SettingValue;
                    this.SetTrackOrder("AlbumsTrackOrder");
                    await this.GetTracksAsync(null, null, this.SelectedAlbumIds, this.TrackOrder);
                }

                if (SettingsClient.IsSettingChanged(e, "Behaviour", "EnableLove"))
                {
                    this.EnableLove = (bool)e.SettingValue;
                    this.SetTrackOrder("AlbumsTrackOrder");
                    await this.GetTracksAsync(null, null, this.SelectedAlbumIds, this.TrackOrder);
                }
            };

            // Events
            this.metadataService.MetadataChanged   += MetadataChangedHandlerAsync;
            this.indexingService.AlbumArtworkAdded += async(_, e) => await this.RefreshArtworkAsync(e.AlbumIds);

            //  Commands
            this.ToggleAlbumOrderCommand             = new DelegateCommand(async() => await this.ToggleAlbumOrderAsync());
            this.ToggleTrackOrderCommand             = new DelegateCommand(async() => await this.ToggleTrackOrderAsync());
            this.RemoveSelectedTracksCommand         = new DelegateCommand(async() => await this.RemoveTracksFromCollectionAsync(this.SelectedTracks), () => !this.IsIndexing);
            this.RemoveSelectedTracksFromDiskCommand = new DelegateCommand(async() => await this.RemoveTracksFromDiskAsync(this.SelectedTracks), () => !this.IsIndexing);

            // Set the initial AlbumOrder
            this.AlbumOrder = (AlbumOrder)SettingsClient.Get <int>("Ordering", "AlbumsAlbumOrder");

            // Set the initial TrackOrder
            this.SetTrackOrder("AlbumsTrackOrder");

            // Set width of the panels
            this.LeftPaneWidthPercent = SettingsClient.Get <int>("ColumnWidths", "AlbumsLeftPaneWidthPercent");

            // Cover size
            this.SetCoversizeAsync((CoverSizeType)SettingsClient.Get <int>("CoverSizes", "AlbumsCoverSize"));
        }
예제 #17
0
        public Win32InputService(IPlaybackService playbackService)
        {
            this.playbackService = playbackService;

            SettingsClient.SettingChanged += (_, e) =>
            {
                if (SettingsClient.IsSettingChanged(e, "MediaKeys", "UseAppCommandMediaKeys"))
                {
                    this.SetEventHandlers();
                }

                if (SettingsClient.IsSettingChanged(e, "Behaviour", "EnableSystemNotification"))
                {
                    this.SetEventHandlers();
                }
            };
        }
예제 #18
0
        public LyricsControlViewModel(IUnityContainer container) : base(container)
        {
            this.container       = container;
            this.info            = container.Resolve <ILocalizationInfo>();
            this.metadataService = container.Resolve <IMetadataService>();
            this.playbackService = container.Resolve <IPlaybackService>();
            this.eventAggregator = container.Resolve <IEventAggregator>();

            this.highlightTimer.Interval = this.highlightTimerIntervalMilliseconds;
            this.highlightTimer.Elapsed += HighlightTimer_Elapsed;

            this.updateLyricsAfterEditingTimer.Interval = this.updateLyricsAfterEditingTimerIntervalMilliseconds;
            this.updateLyricsAfterEditingTimer.Elapsed += UpdateLyricsAfterEditingTimer_Elapsed;

            this.refreshTimer.Interval = this.refreshTimerIntervalMilliseconds;
            this.refreshTimer.Elapsed += RefreshTimer_Elapsed;

            this.playbackService.PlaybackPaused  += (_, __) => this.highlightTimer.Stop();
            this.playbackService.PlaybackResumed += (_, __) => this.highlightTimer.Start();

            this.metadataService.MetadataChanged += (_) => this.RestartRefreshTimer();

            SettingsClient.SettingChanged += (_, e) =>
            {
                if (SettingsClient.IsSettingChanged(e, "Lyrics", "DownloadLyrics"))
                {
                    if ((bool)e.SettingValue)
                    {
                        this.RestartRefreshTimer();
                    }
                }
            };

            this.RefreshLyricsCommand = new DelegateCommand(() => this.RestartRefreshTimer(), () => !this.IsDownloadingLyrics);
            ApplicationCommands.RefreshLyricsCommand.RegisterCommand(this.RefreshLyricsCommand);

            this.playbackService.PlaybackSuccess += (isPlayingPreviousTrack) =>
            {
                this.ContentSlideInFrom = isPlayingPreviousTrack ? -30 : 30;
                this.RestartRefreshTimer();
            };

            this.ClearLyrics(); // Makes sure the loading animation can be shown even at first start
        }
        public SpectrumAnalyzerControlViewModel(IPlaybackService playbackService, IAppearanceService appearanceService, IEventAggregator eventAggregator)
        {
            this.playbackService   = playbackService;
            this.eventAggregator   = eventAggregator;
            this.appearanceService = appearanceService;

            this.playbackService.SpectrumVisibilityChanged += isSpectrumVisible => this.ShowSpectrumAnalyzer = isSpectrumVisible;

            this.appearanceService.ColorSchemeChanged += (_, __) =>
                                                         Application.Current.Dispatcher.Invoke(() => this.SetSpectrumStyle((SpectrumStyle)SettingsClient.Get <int>("Playback", "SpectrumStyle")));

            this.playbackService.PlaybackFailed  += (_, __) => this.IsPlaying = false;
            this.playbackService.PlaybackStopped += (_, __) => this.IsPlaying = false;
            this.playbackService.PlaybackPaused  += (_, __) => this.IsPlaying = false;
            this.playbackService.PlaybackResumed += (_, __) => this.IsPlaying = true;
            this.playbackService.PlaybackSuccess += (_, __) => this.IsPlaying = true;

            SettingsClient.SettingChanged += (_, e) =>
            {
                if (SettingsClient.IsSettingChanged(e, "Playback", "SpectrumStyle"))
                {
                    this.SetSpectrumStyle((SpectrumStyle)e.SettingValue);
                }
            };

            // Spectrum analyzer performance is only acceptable with Windows Media Foundation
            this.ShowSpectrumAnalyzer = this.playbackService.SupportsWindowsMediaFoundation &&
                                        SettingsClient.Get <bool>("Playback", "ShowSpectrumAnalyzer");

            // Initial value
            if (!this.playbackService.IsStopped & this.playbackService.IsPlaying)
            {
                this.IsPlaying = true;
            }
            else
            {
                this.IsPlaying = false;
            }

            // Default spectrum
            this.SetSpectrumStyle((SpectrumStyle)SettingsClient.Get <int>("Playback", "SpectrumStyle"));
        }
예제 #20
0
        public PlaylistsViewModelBase(IContainerProvider container, IDialogService dialogService,
                                      IPlaybackService playbackService, IPlaylistServiceBase playlistServiceBase) : base(container)
        {
            this.dialogService       = dialogService;
            this.playlistServiceBase = playlistServiceBase;
            this.playbackService     = playbackService;

            // Events
            this.playlistServiceBase.PlaylistFolderChanged += PlaylistServiceBase_PlaylistFolderChanged;;
            this.playlistServiceBase.PlaylistAdded         += PlaylistServiceBase_PlaylistAdded;
            this.playlistServiceBase.PlaylistDeleted       += PlaylistServiceBase_PlaylistDeleted;
            this.playlistServiceBase.PlaylistRenamed       += PlaylistServiceBase_PlaylistRenamed;

            // Commands
            this.RenameSelectedPlaylistCommand  = new DelegateCommand(async() => await this.RenameSelectedPlaylistAsync());
            this.DeletePlaylistCommand          = new DelegateCommand <PlaylistViewModel>(async(playlist) => await this.ConfirmDeletePlaylistAsync(playlist));
            this.ImportPlaylistsCommand         = new DelegateCommand(async() => await this.ImportPlaylistsAsync());
            this.AddPlaylistToNowPlayingCommand = new DelegateCommand(async() => await this.AddPlaylistToNowPlayingAsync());
            this.ShuffleSelectedPlaylistCommand = new DelegateCommand(async() => await this.ShuffleSelectedPlaylistAsync());

            this.DeleteSelectedPlaylistCommand = new DelegateCommand(async() =>
            {
                if (this.IsPlaylistSelected)
                {
                    await this.ConfirmDeletePlaylistAsync(this.SelectedPlaylist);
                }
            });

            // Settings changed
            SettingsClient.SettingChanged += (_, e) =>
            {
                if (SettingsClient.IsSettingChanged(e, "Behaviour", "EnableRating"))
                {
                    this.EnableRating = (bool)e.SettingValue;
                }

                if (SettingsClient.IsSettingChanged(e, "Behaviour", "EnableLove"))
                {
                    this.EnableLove = (bool)e.SettingValue;
                }
            };
        }
        public SpectrumAnalyzerControl()
        {
            InitializeComponent();

            this.playbackService = ServiceLocator.Current.GetInstance <IPlaybackService>();
            this.shellService    = ServiceLocator.Current.GetInstance <IShellService>();

            this.playbackService.PlaybackSuccess += (_, __) => this.TryRegisterSpectrumPlayers();
            this.shellService.WindowStateChanged += (_, __) => this.TryRegisterSpectrumPlayers();

            SettingsClient.SettingChanged += (_, e) =>
            {
                if (SettingsClient.IsSettingChanged(e, "Playback", "ShowSpectrumAnalyzer"))
                {
                    this.TryRegisterSpectrumPlayers();
                }
            };

            this.TryRegisterSpectrumPlayers();
        }
예제 #22
0
        public TracksViewModelBase(IContainerProvider container) : base(container)
        {
            // Dependency injection
            this.container         = container;
            this.trackRepository   = container.Resolve <ITrackRepository>();
            this.dialogService     = container.Resolve <IDialogService>();
            this.searchService     = container.Resolve <ISearchService>();
            this.playbackService   = container.Resolve <IPlaybackService>();
            this.collectionService = container.Resolve <ICollectionService>();
            this.i18nService       = container.Resolve <II18nService>();
            this.eventAggregator   = container.Resolve <IEventAggregator>();
            this.providerService   = container.Resolve <IProviderService>();
            this.playlistService   = container.Resolve <IPlaylistService>();

            // Commands
            this.ToggleTrackOrderCommand      = new DelegateCommand(() => this.ToggleTrackOrder());
            this.AddTracksToPlaylistCommand   = new DelegateCommand <string>(async(playlistName) => await this.AddTracksToPlaylistAsync(playlistName, this.SelectedTracks));
            this.PlaySelectedCommand          = new DelegateCommand(async() => await this.PlaySelectedAsync());
            this.PlayNextCommand              = new DelegateCommand(async() => await this.PlayNextAsync());
            this.AddTracksToNowPlayingCommand = new DelegateCommand(async() => await this.AddTracksToNowPlayingAsync());

            // Settings
            SettingsClient.SettingChanged += (_, e) =>
            {
                if (SettingsClient.IsSettingChanged(e, "Behaviour", "ShowRemoveFromDisk"))
                {
                    RaisePropertyChanged(nameof(this.ShowRemoveFromDisk));
                }
            };

            // Events
            this.i18nService.LanguageChanged += (_, __) =>
            {
                RaisePropertyChanged(nameof(this.TotalDurationInformation));
                RaisePropertyChanged(nameof(this.TotalSizeInformation));
                this.RefreshLanguage();
            };

            this.playbackService.PlaybackCountersChanged += PlaybackService_PlaybackCountersChanged;
        }
        public SpectrumAnalyzerControlViewModel(IPlaybackService playbackService, IAppearanceService appearanceService, IEventAggregator eventAggregator)
        {
            this.playbackService   = playbackService;
            this.eventAggregator   = eventAggregator;
            this.appearanceService = appearanceService;

            this.appearanceService.ColorSchemeChanged += (_, __) =>
                                                         Application.Current.Dispatcher.Invoke(() => this.SetSpectrumStyle((SpectrumStyle)SettingsClient.Get <int>("Playback", "SpectrumStyle")));

            this.playbackService.PlaybackFailed  += (_, __) => this.IsPlaying = false;
            this.playbackService.PlaybackStopped += (_, __) => this.IsPlaying = false;
            this.playbackService.PlaybackPaused  += (_, __) => this.IsPlaying = false;
            this.playbackService.PlaybackResumed += (_, __) => this.IsPlaying = true;
            this.playbackService.PlaybackSuccess += (_, __) => this.IsPlaying = true;

            SettingsClient.SettingChanged += (_, e) =>
            {
                if (SettingsClient.IsSettingChanged(e, "Playback", "SpectrumStyle"))
                {
                    this.SetSpectrumStyle((SpectrumStyle)e.Entry.Value);
                }
            };

            // Initial value
            if (!this.playbackService.IsStopped & this.playbackService.IsPlaying)
            {
                this.IsPlaying = true;
            }
            else
            {
                this.IsPlaying = false;
            }

            // Default spectrum
            this.SetSpectrumStyle((SpectrumStyle)SettingsClient.Get <int>("Playback", "SpectrumStyle"));
        }
예제 #24
0
        public CollectionGenresViewModel(IContainerProvider container) : base(container)
        {
            // Dependency injection
            this.collectionService = container.Resolve <ICollectionService>();
            this.dialogService     = container.Resolve <IDialogService>();
            this.indexingService   = container.Resolve <IIndexingService>();
            this.playbackService   = container.Resolve <IPlaybackService>();
            this.playlistService   = container.Resolve <IPlaylistService>();
            this.searchService     = container.Resolve <ISearchService>();
            this.eventAggregator   = container.Resolve <IEventAggregator>();

            // Commands
            this.ToggleTrackOrderCommand      = new DelegateCommand(async() => await this.ToggleTrackOrderAsync());
            this.ToggleAlbumOrderCommand      = new DelegateCommand(async() => await this.ToggleAlbumOrderAsync());
            this.RemoveSelectedTracksCommand  = new DelegateCommand(async() => await this.RemoveTracksFromCollectionAsync(this.SelectedTracks), () => !this.IsIndexing);
            this.AddGenresToPlaylistCommand   = new DelegateCommand <string>(async(playlistName) => await this.AddGenresToPlaylistAsync(this.SelectedGenres, playlistName));
            this.SelectedGenresCommand        = new DelegateCommand <object>(async(parameter) => await this.SelectedGenresHandlerAsync(parameter));
            this.ShowGenresZoomCommand        = new DelegateCommand(async() => await this.ShowSemanticZoomAsync());
            this.AddGenresToNowPlayingCommand = new DelegateCommand(async() => await this.AddGenresToNowPlayingAsync(this.SelectedGenres));
            this.ShuffleSelectedGenresCommand = new DelegateCommand(async() => await this.playbackService.EnqueueGenresAsync(this.SelectedGenres, true, false));

            this.SemanticJumpCommand = new DelegateCommand <string>((header) =>
            {
                this.HideSemanticZoom();
                this.eventAggregator.GetEvent <PerformSemanticJump>().Publish(new Tuple <string, string>("Genres", header));
            });

            // Settings
            SettingsClient.SettingChanged += async(_, e) =>
            {
                if (SettingsClient.IsSettingChanged(e, "Behaviour", "EnableRating"))
                {
                    this.EnableRating = (bool)e.SettingValue;
                    this.SetTrackOrder("GenresTrackOrder");
                    await this.GetTracksAsync(null, this.SelectedGenres, this.SelectedAlbums, this.TrackOrder);
                }

                if (SettingsClient.IsSettingChanged(e, "Behaviour", "EnableLove"))
                {
                    this.EnableLove = (bool)e.SettingValue;
                    this.SetTrackOrder("GenresTrackOrder");
                    await this.GetTracksAsync(null, this.SelectedGenres, this.SelectedAlbums, this.TrackOrder);
                }
            };

            // PubSub Events
            this.eventAggregator.GetEvent <ShellMouseUp>().Subscribe((_) => this.IsGenresZoomVisible = false);

            // Set the initial AlbumOrder
            this.AlbumOrder = (AlbumOrder)SettingsClient.Get <int>("Ordering", "GenresAlbumOrder");

            // Set the initial TrackOrder
            this.SetTrackOrder("GenresTrackOrder");

            // Set width of the panels
            this.LeftPaneWidthPercent  = SettingsClient.Get <int>("ColumnWidths", "GenresLeftPaneWidthPercent");
            this.RightPaneWidthPercent = SettingsClient.Get <int>("ColumnWidths", "GenresRightPaneWidthPercent");

            // Cover size
            this.SetCoversizeAsync((CoverSizeType)SettingsClient.Get <int>("CoverSizes", "GenresCoverSize"));
        }
예제 #25
0
        private void InitializeWindows()
        {
            // Start monitoring tablet mode
            this.windowsIntegrationService.StartMonitoringTabletMode();

            // Tray controls
            this.trayControls = this.container.Resolve <TrayControls>();

            // Create the Mini Player playlist
            this.miniPlayerPlaylist = this.container.Resolve <MiniPlayerPlaylist>(new DependencyOverride(typeof(DopamineWindow), this));

            // NotificationService needs to know about the application windows
            this.notificationService.SetApplicationWindows(this, this.miniPlayerPlaylist, this.trayControls);

            PART_MiniPlayerButton.ToolTip = SettingsClient.Get <bool>("General", "IsMiniPlayer") ? ResourceUtils.GetString("Language_Restore") : ResourceUtils.GetString("Language_Mini_Player");

            // Settings changed
            SettingsClient.SettingChanged += (_, e) =>
            {
                if (SettingsClient.IsSettingChanged(e, "Appearance", "ShowWindowBorder"))
                {
                    this.WindowBorder.BorderThickness = new Thickness((bool)e.SettingValue ? 1 : 0);
                }

                if (SettingsClient.IsSettingChanged(e, "Behaviour", "ShowTrayIcon"))
                {
                    this.trayIcon.Visible = (bool)e.SettingValue;
                }

                if (SettingsClient.IsSettingChanged(e, "General", "IsMiniPlayer"))
                {
                    PART_MiniPlayerButton.ToolTip = (bool)e.SettingValue ? ResourceUtils.GetString("Language_Restore") : ResourceUtils.GetString("Language_Mini_Player");
                }
            };

            this.shellService.WindowStateChanged        += (_, e) => this.WindowState = e.WindowState;
            this.shellService.IsMovableChanged          += (_, e) => this.IsMovable = e.IsMovable;
            this.shellService.ResizeModeChanged         += (_, e) => this.ResizeMode = e.ResizeMode;
            this.shellService.TopmostChanged            += (_, e) => this.Topmost = e.IsTopmost;
            this.shellService.ShowWindowControlsChanged += (_, e) => this.ShowWindowControls = e.ShowWindowControls;

            this.shellService.GeometryChanged += (_, e) => this.SetGeometry(
                e.Top, e.Left, e.Size.Width, e.Size.Height,
                Constants.DefaultShellTop,
                Constants.DefaultShellLeft);

            this.shellService.MinimumSizeChanged += (_, e) =>
            {
                this.MinWidth  = e.MinimumSize.Width;
                this.MinHeight = e.MinimumSize.Height;
            };

            this.shellService.PlaylistVisibilityChanged += (_, e) =>
            {
                if (e.IsPlaylistVisible)
                {
                    this.miniPlayerPlaylist.Show(e.MiniPlayerType);
                }
                else
                {
                    this.miniPlayerPlaylist.Hide();
                }
            };

            this.shellService.CheckIfTabletMode(true); // Make sure the window geometry respects tablet mode at startup
            this.SetWindowBorder();
        }