예제 #1
0
        private DeskBandMenuAction CreateSubMenuAction(int timeWindowInMinutes)
        {
            string             actionName    = timeWindowInMinutes != 0 ? $"{timeWindowInMinutes} minutes" : "Stop";
            DeskBandMenuAction submenuAction = new DeskBandMenuAction(actionName);

            submenuAction.Clicked += (sender, args) => {
                minutesLeft = defaultTimerMinutes = timeWindowInMinutes;

                this.Options.Title = $"{clockIcon}";
                if (timeWindowInMinutes != 0)
                {
                    this.Options.Title += $" {timeWindowInMinutes}";
                }
                else
                {
                    Task.Run(() => CalloutUserTriggeredStopMessage());
                }

                if (cancellationSource != null)
                {
                    cancellationSource.Cancel();
                }

                Task.Run(() => RunTimer());
            };

            return(submenuAction);
        }
예제 #2
0
        /// <summary>
        /// 发现新设备
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnDiscoveryLamp(object sender, EventArgs e)
        {
            Lamp lamp = ((LampDiscoveryEventArgs)e).lamp;

            try
            {
                //查重
                foreach (DeskBandMenuItem item in _deviceListMenu.Items)
                {
                    if (item.tag != null)
                    {
                        if (((Lamp)item.tag).Address == lamp.Address)
                        {
                            return;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            DeskBandMenuAction subMenuItem = new DeskBandMenuAction(lamp.Address);

            subMenuItem.tag      = lamp;
            subMenuItem.Clicked += OnLampMenuItem_Clicked;
            _deviceListMenu.Items.Add(subMenuItem);
        }
예제 #3
0
        private async Task AddNewAudioSource(IInternalAudioSource audioSource)
        {
            var menuItem = new DeskBandMenuAction(audioSource.Name);

            menuItem.Clicked += AudioSourceMenuItemOnClicked;

            lock (_audiosourceListLock)
            {
                _audioSourceContextMenuItems.Add(menuItem);
                RefreshContextMenu();
            }

            var settings = audioSource.Settings;

            if (settings.Count > 0)
            {
                // check if the settings were saved previously and reuse them
                var matchingSetting = _audioSourceSettingsModel.FirstOrDefault(s => s.AudioSourceName == audioSource.Name);
                if (matchingSetting != null)
                {
                    var viewModel = new AudioSourceSettingsVM(matchingSetting, audioSource);

                    // the collection was created on the ui thread
                    await _uiDispatcher.InvokeAsync(() => _settingsWindowVm.AudioSourceSettingsVM.Add(viewModel));
                }
                else
                {
                    var newSettingsModel = new AudioSourceSettings {
                        AudioSourceName = audioSource.Name
                    };
                    _audioSourceSettingsModel.Add(newSettingsModel);
                    var newViewModel = new AudioSourceSettingsVM(newSettingsModel, audioSource);
                    await _uiDispatcher.InvokeAsync(() => _settingsWindowVm.AudioSourceSettingsVM.Add(newViewModel));
                }
            }

            // If user was using this audio source last, then automatically activate it
            var savedAudioSourceName = _appSettings.AudioSource;

            if (savedAudioSourceName == null || audioSource.Name != savedAudioSourceName)
            {
                return;
            }

            await HandleAudioSourceContextMenuItemClick(menuItem).ConfigureAwait(false);
        }
예제 #4
0
        private List <DeskBandMenuItem> BuildContextMenu()
        {
            var pluginList = _audioSourceLoader.AudioSources.Select(audioSource =>
            {
                var item      = new DeskBandMenuAction(audioSource.Name);
                item.Clicked += AudioSourceMenuItemOnClicked;
                return(item);
            });

            _pluginSubMenu = new DeskBandMenu("Audio Source", pluginList);
            var settingsMenuItem = new DeskBandMenuAction("Audio Band Settings");

            settingsMenuItem.Clicked += SettingsMenuItemOnClicked;

            return(new List <DeskBandMenuItem> {
                settingsMenuItem, _pluginSubMenu
            });
        }
예제 #5
0
        private async Task HandleAudioSourceContextMenuItemClick(DeskBandMenuAction menuItem)
        {
            try
            {
                if (menuItem.Checked)
                {
                    menuItem.Checked = false;
                    await UnsubscribeToAudioSource(_currentAudioSource).ConfigureAwait(false);

                    return;
                }

                // Uncheck old items and unsubscribe from the current source
                foreach (var otherMenuItem in _pluginSubMenu.Items.Cast <DeskBandMenuAction>().Where(i => i != null))
                {
                    otherMenuItem.Checked = false;
                }

                await UnsubscribeToAudioSource(_currentAudioSource).ConfigureAwait(false);

                _currentAudioSource = _audioSourceManager.AudioSources.FirstOrDefault(c => c.Name == menuItem.Text);
                if (_currentAudioSource == null)
                {
                    var menuItemsText = _audioSourceContextMenuItems.Select(m => m.Text);
                    var sources       = _audioSourceManager.AudioSources.Select(s => s.Name);
                    Logger.Warn("Contenxt menu item {menuName} had no matching audiosource. Context menu items: {@items}. Audiosources: {@audiosources}", menuItem.Text, menuItemsText, sources);
                    return;
                }

                await SubscribeToAudioSource(_currentAudioSource).ConfigureAwait(false);

                menuItem.Checked = true;
            }
            catch (Exception e)
            {
                Logger.Error(e, "Error changing audio source. Current: {current}. Menu item: {menu}", _currentAudioSource?.Name, menuItem.Text);
                _currentAudioSource = null;
            }
        }
예제 #6
0
        private async Task InitializeAsync()
        {
            try
            {
                Logger.Debug("Initialization started");

                _audioSourceContextMenuItems = new List <DeskBandMenuAction>();
                _settingsMenuItem            = new DeskBandMenuAction("Audio Band Settings");
                _settingsMenuItem.Clicked   += SettingsMenuItemOnClicked;
                RefreshContextMenu();

                _labelService.CustomLabelAdded   += LabelServiceOnAddCustomTextLabel;
                _labelService.CustomLabelRemoved += LabelServiceOnRemoveCustomTextLabel;
                foreach (var label in _labelService.Labels)
                {
                    LabelServiceOnAddCustomTextLabel(null, label);
                }

                await _uiDispatcher.InvokeAsync(() => InitializeBindingSources(
                                                    _settingsWindow.AlbumArtPopupVM,
                                                    _settingsWindow.AlbumArtVM,
                                                    _settingsWindow.AudioBandVM,
                                                    _settingsWindow.NextButtonVM,
                                                    _settingsWindow.PlayPauseButtonVM,
                                                    _settingsWindow.PreviousButtonVM,
                                                    _settingsWindow.ProgressBarVM));

                _settingsWindow.Saved += SettingsWindowOnSaved;

                _audioSourceManager.AudioSources.CollectionChanged += AudioSourcesOnCollectionChanged;
                _audioSourceManager.LoadAudioSources();

                Logger.Debug("Initialization complete");
            }
            catch (Exception e)
            {
                Logger.Error(e, "Error during initialization");
            }
        }
예제 #7
0
        private async Task InitializeAsync()
        {
            try
            {
                Logger.Debug("Initialization started");

                await Task.Run(() =>
                {
                    _audioSourceContextMenuItems = new List <DeskBandMenuAction>();
                    _settingsMenuItem            = new DeskBandMenuAction("Audio Band Settings");
                    _settingsMenuItem.Clicked   += SettingsMenuItemOnClicked;
                    RefreshContextMenu();

                    InitializeModels();
                }).ConfigureAwait(false);

                _settingsWindowVm = await SetupViewModels().ConfigureAwait(false);

                await _uiDispatcher.InvokeAsync(() =>
                {
                    _settingsWindow           = new SettingsWindow(_settingsWindowVm);
                    _settingsWindow.Saved    += SettingsWindowOnSaved;
                    _settingsWindow.Canceled += SettingsWindowOnCanceled;
                    ElementHost.EnableModelessKeyboardInterop(_settingsWindow);
                });

                _audioSourceManager = new AudioSourceManager();
                _audioSourceManager.AudioSources.CollectionChanged += AudioSourcesOnCollectionChanged;
                _audioSourceManager.LoadAudioSources();

                Logger.Debug("Initialization complete");
            }
            catch (Exception e)
            {
                Logger.Error(e, "Error during initialization");
            }
        }
예제 #8
0
        /// <summary>
        /// 列表被点击
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        private void OnLampMenuItem_Clicked(object sender, EventArgs args)
        {
            DeskBandMenuAction subMenuItem = (DeskBandMenuAction)sender;

            if (activeMenuItem == null)
            {
                activeMenuItem = subMenuItem;
            }
            if (subMenuItem != activeMenuItem)
            {
                activeMenuItem.Checked = false;
                activeMenuItem         = subMenuItem;
            }

            if (activeMenuItem.Checked)
            {
                activeMenuItem.Checked = false;
            }
            else
            {
                activeMenuItem.Checked = true;
                activeLamp.Open();
            }
        }