private void GoToNextTip() { // If the current tip is not the last tip in the tip history, then go to the next tip in the tip history that exists. List <string> tipHistory = _tipHistoryManager.GetTipHistory(); // Is there a tip later in the history than the current tip? var currentTipIndex = tipHistory.LastIndexOf(currentTip); // Use LastIndexOf for performance as it will normally be towards the end of the list. TipInfo nextTipInHistory = GetNextTipInHistory(tipHistory, currentTipHistoryIndex: currentTipIndex); if (nextTipInHistory != null) { // Navigate to the next tip in history. NavigateToTip(nextTipInHistory, markAsSeen: false); return; } // There are no more tips to show from the history. Find a new tip. TipInfo nextTip = TipOfTheDay.GetNewTip(); var success = NavigateToTip(nextTip, markAsSeen: true); if (!success) { // Failed to show next tip. Close window. Close(); } }
/// <summary> /// Initialization of the package; this method is called right after the package is sited, so this is the place /// where you can put all the initialization code that rely on services provided by VisualStudio. /// </summary> /// <param name="cancellationToken">A cancellation token to monitor for initialization cancellation, which can occur when VS is shutting down.</param> /// <param name="progress">A provider for progress updates.</param> /// <returns>A task representing the async work of package initialization, or an already completed task if there is none. Do not return null from this method.</returns> protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress <ServiceProgressData> progress) { // When initialized asynchronously, the current thread may be a background thread at this point. // Do any initialization that requires the UI thread after switching to the UI thread. await this.JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken); await TipOfTheDayCommand.InitializeAsync(this); // Show TotD at startup if (ShouldShowTOTD()) { TipOfTheDay.ShowWindow(); } }
public void HandleVsInitialized() { var cadence = GetCadence(); if (cadence == DisplayCadence.Never || cadence == DisplayCadence.SolutionLoad) { return; } if (ShouldShowTip(cadence)) { TipOfTheDay.ShowWindow(); Task.Run(async() => await SetLastDisplayTimeNowAsync()); } }
public void HandleSolutionOpened() { var cadence = GetCadence(); // Allow one operation when cadence is Startup and multiple when cadence is SolutionLoad if (!(cadence == DisplayCadence.Startup && !_solutionOpenedOnce) && !(cadence == DisplayCadence.SolutionLoad)) { return; } if (ShouldShowTip(cadence)) { TipOfTheDay.ShowWindow(); _solutionOpenedOnce = true; // When DisplayCadence is Startup, show tip only once Task.Run(async() => await SetLastDisplayTimeNowAsync()); } }
private void GoToNextTip() { // If there's a next tip in the Tip History, show that. Otherwise, grab a new tip. TipInfo nextTip; TipHistoryInfo nextTipInHistory = FindNextTipInHistory(); if (nextTipInHistory != null) { // Build a TipInfo object to show in the UI nextTip = BuildTipInfoFromHistory(nextTipInHistory); } else { // Generate a new Tip to show. Set the LikeStatus to NORMAL. nextTip = TipOfTheDay.GetNewTip(); nextTip.TipLikeStatus = TipLikeEnum.NORMAL; } // Show the tip NavigateToTip(nextTip); }
/// <summary> /// This function is the callback used to execute the command when the menu item is clicked. /// See the constructor to see how the menu item is associated with this function using /// OleMenuCommandService service and MenuCommand class. /// </summary> /// <param name="sender">Event sender.</param> /// <param name="e">Event args.</param> private void Execute(object sender, EventArgs e) { TipOfTheDay.ShowWindow(); }