private void buttonMoveImage_Click(object sender, EventArgs e) { if (selectedImages != null) { using (CommonOpenFileDialog dialog = new CommonOpenFileDialog()) { dialog.IsFolderPicker = true; if (dialog.ShowDialog() == CommonFileDialogResult.Ok) { if (WallpaperData.ThemeContainsFolder(dialog.FileName)) { HandleImageRenaming(OptionsData.ThemeOptions.AllowTagBasedRenamingForMovedImages, new DirectoryInfo(dialog.FileName)); } else { MessageBox.Show("The selected folder is not included in your theme"); } } } } else { MessageBox.Show("There are no images selected to move"); } }
public WallpaperManagerForm() { WallpaperData.WallpaperManagerForm = this; //? this needs to be at the very front for a few other initializers InitializeComponent(); Application.ApplicationExit += OnApplicationExit; this.Load += OnLoad; this.Resize += OnResize; this.Closing += OnClosing; DisplayData.Initialize(); InitializeDisplayTabControl(); InitializeImageSelector(); InitializeImageInspector(); WallpaperPathing.Validate(); // ensures that all needed folders exist WallpaperData.Initialize(false); // loads in all necessary data OptionsData.Initialize(); InitializeWallpapers(); InitializeTimer(); InitializeKeys(); InitializeNotifyIcon(); }
private void RemoveImageFolders(string[] folderPaths) { // output properties string invalidFolderPaths = ""; int initialLength = flowLayoutPanelImageFolders.Controls.Count; bool pauseLayout = folderPaths.Length > 1; // loops through selected paths and adds the paths that don't already exist if (pauseLayout) { flowLayoutPanelImageFolders.SuspendLayout(); } // prevents inefficiency by handling controls all at once instead of one-by-one foreach (string path in folderPaths) { if (WallpaperData.RemoveFolder(path)) // if the path exists, remove the checkBox at the index of path { flowLayoutPanelImageFolders.Controls.RemoveAt(GetImageFolderPaths().IndexOf(path)); } else { invalidFolderPaths += "\n" + path; } } if (pauseLayout) { flowLayoutPanelImageFolders.ResumeLayout(); } // prevents inefficiency by handling controls all at once instead of one-by-one // displays a list of folder paths the user attempted to add that already exist if (invalidFolderPaths != "") { MessageBox.Show("The following folders were invalid: " + invalidFolderPaths); } }
private void buttonRankImages_Click(object sender, EventArgs e) { if (selectedImages != null && selectedImages.Length > 0) { int newRank; try { newRank = Int32.Parse(Interaction.InputBox("Enter a new rank for all selected images: ", "Select a new rank")); } catch // no response { return; } if (newRank >= 0 && newRank <= WallpaperData.GetMaxRank()) { foreach (string image in selectedImages) { WallpaperData.GetImageData(image).Rank = newRank; UpdateImageRanks(); } } else { MessageBox.Show("The selected rank was out of range"); } } else { MessageBox.Show("There are no images selected to rank"); } }
private void HandleHotKey() { // opens the default theme if (OptionsData.EnableDefaultThemeHotkey) { WallpaperData.SaveData(WallpaperPathing.ActiveWallpaperTheme); WallpaperData.LoadDefaultTheme(); } }
private void buttonSaveTheme_Click(object sender, EventArgs e) { using (SaveFileDialog dialog = new SaveFileDialog()) { dialog.Title = "Save data to json"; dialog.Filter = "Wallpaper Data JSON (*.json) | *.json"; if (dialog.ShowDialog() == DialogResult.OK) { WallpaperData.SaveData(dialog.FileName); } } }
private void HandleImageRenaming(bool allowTagBasedNaming, DirectoryInfo moveDirectory = null) { List <ImageType> filter = new List <ImageType>(); if (OptionsData.ThemeOptions.ExcludeRenamingStatic) { filter.Add(ImageType.Static); } if (OptionsData.ThemeOptions.ExcludeRenamingGif) { filter.Add(ImageType.GIF); } if (OptionsData.ThemeOptions.ExcludeRenamingVideo) { filter.Add(ImageType.Video); } switch (WallpaperManagerTools.ChooseSelectionType()) { case SelectionType.Active: if (InspectedImage != "") { if (WallpaperData.ContainsImage(InspectedImage)) { int imageIndex = selectedImages.IndexOf(InspectedImage); string[] newName = ImagePathing.RenameImage(InspectedImage, moveDirectory, allowTagBasedNaming); if (newName != null && newName.Length > 0) // this can occur if the given image is not able to be named { selectedImages[imageIndex] = newName[0]; // there will only be one entry in this array, the renamed image } } else { MessageBox.Show("Invalid image"); } } else { MessageBox.Show("There is no image selected"); } break; case SelectionType.All: if (MessageBox.Show("Are you sure you want to rename ALL " + selectedImages.Length + " selected images?", "Choose an option", MessageBoxButtons.YesNo) == DialogResult.Yes) { // Doing this will require a rebuild of the image selector to keep it in tact RebuildImageSelector(ImagePathing.RenameImages(selectedImages, moveDirectory, allowTagBasedNaming), false); } break; } }
private void buttonLoadTheme_Click(object sender, EventArgs e) { using (OpenFileDialog dialog = new OpenFileDialog()) { // dialog properties dialog.Title = "Select a compatible json file to load"; dialog.Filter = "Wallpaper Data JSON (*.json) | *.json"; if (dialog.ShowDialog() == DialogResult.OK) { WallpaperData.LoadData(dialog.FileName); WallpaperPathing.ActiveWallpaperTheme = dialog.FileName; } } }
private void imageFolderCheckBox_CheckedChanged(object sender, EventArgs e) { if (sender is CheckBox folderCheckBox) { string folderPath = folderCheckBox.Text; if (Directory.Exists(folderPath)) // activate or deactive images within folder based on option selected { if (folderCheckBox.Checked) { WallpaperData.ActivateFolder(folderPath); } else { WallpaperData.DeactivateFolder(folderPath); } } else // folder path does not exist, display error message and as if user wants to remove invalid folder { DialogResult result = MessageBox.Show("Invalid folder path encountered: \n" + folderPath + "\n\nRemove folder?", "Invalid Folder Path", MessageBoxButtons.YesNo); if (result == DialogResult.Yes) { int folderIndex = GetImageFolderPaths().IndexOf(folderPath); if (folderIndex != -1) // yes this can happen { flowLayoutPanelImageFolders.Controls.RemoveAt(GetImageFolderPaths().IndexOf(folderPath)); } else { MessageBox.Show("Error: This folder was not found in your collection \n (That is, your collection within the application not file explorer)"); } } } } else { MessageBox.Show("An error occured. Check Box item is invalid"); } flowLayoutPanelImageFolders.Focus(); // prevents the weird behavior where clicking on a checkbox resets the scroll every second }
private void AddImageFolders(Dictionary <string, bool> imageFolders) { // output properties string duplicateFolderPaths = ""; int initialLength = flowLayoutPanelImageFolders.Controls.Count; bool pauseLayout = imageFolders.Count > 1; // loops through selected paths and adds the paths that don't already exist if (pauseLayout) { flowLayoutPanelImageFolders.SuspendLayout(); } // prevents inefficiency by handling controls all at once instead of one-by-one foreach (string path in imageFolders.Keys) { if (WallpaperData.AddFolder(path)) // if the path does not exist, create a new CheckBox with this path as the text and add it to flowLayoutPanelImageFolders { CheckBox newCheckBox = new CheckBox { AutoSize = true, Text = path, ForeColor = Color.White }; newCheckBox.Checked = imageFolders[path]; //? The below event must be added after declaring Checked since AddFolder() already handles activation newCheckBox.CheckedChanged += imageFolderCheckBox_CheckedChanged; flowLayoutPanelImageFolders.Controls.Add(newCheckBox); } else { duplicateFolderPaths += "\n" + path; } } if (pauseLayout) { flowLayoutPanelImageFolders.ResumeLayout(); } // prevents inefficiency by handling controls all at once instead of one-by-one // displays a list of folder paths the user attempted to add that already exist if (duplicateFolderPaths != "") { MessageBox.Show("The following folders already exist: " + duplicateFolderPaths); } }
public void NextWallpaper(int index, bool ignoreErrorMessages) { if (!WallpaperData.IsLoadingData) // Rank Percentiles won't be properly set-up until after a theme is loaded, which can cause a crash is NextWallpaper is called { if (!WallpaperData.FileDataIsEmpty()) { if (!WallpaperData.NoImagesActive() && WallpaperData.GetAllRankedImages().Length != 0) { //? Note that Previous Wallpaper should only be set when Next Wallpaper is updated // Set push the current wallpaper to its corresponding index in previous wallpapers if a wallpaper exists if (WallpaperPathing.ActiveWallpapers[index] != null) { WallpaperPathing.PreviousWallpapers[index].Push(WallpaperPathing.ActiveWallpapers[index]); } ResetTimer(index); SetWallpaper(index, false); // randomize wallpaper will check if it even can randomize the wallpapers first } else { if (!ignoreErrorMessages) { MessageBox.Show("No active wallpapers were found " + "\n(This can occur is none of your images have been ranked, you can rank them by selecting " + "the images with the Select Image(s) button)"); } } } else { if (!ignoreErrorMessages) { MessageBox.Show("Add some wallpapers first! Use the Add Folder button to add a collection of images that'll be used as potential wallpapers" + "\n(Before they can be used, you'll have to rank your images. You can rank them by selecting the images the Select Image(s) button)"); } } } }
private void SetWallpaper(int index, bool ignoreIdenticalWallpapers) { //-----Set Next Wallpaper----- string wallpaperPath = WallpaperPathing.SetNextWallpaperOrder(index, ignoreIdenticalWallpapers); //-----Update Notify Icons----- string wallpaperName = new FileInfo(wallpaperPath).Name; // pathless string of file name if (WallpaperData.ContainsImage(wallpaperPath)) { /*x * wallpaperMenuItems[index].Text = WallpaperData.ContainsImage(wallpaperPath) ? * index + 1 + " | R: " + WallpaperData.GetImageRank(wallpaperPath) + " | " + wallpaperName : * index + 1 + " | [NOT FOUND]" + wallpaperName; */ wallpaperMenuItems[index].Text = index + 1 + " | R: " + WallpaperData.GetImageRank(wallpaperPath) + " | " + wallpaperName; } else //? this can occur after swapping themes as next wallpaper still holds data from the previous theme { WallpaperPathing.SetNextWallpaperOrder(index, ignoreIdenticalWallpapers); } //? without this, if the inspector wasn't open prior to setting a new wallpaper it would never allow it's MvpPlayer to display // TODO find a permanent solution to this | Using a different player such as VLC did not work WallpaperData.WallpaperManagerForm.FixInspectorPlayer(WallpaperPathing.ActiveWallpapers[index]); //-----Update Wallpaper Forms----- //? This needs to be above the call to WallpaperForum's SetWallpaper() otherwise the form will call its load event second & override some settings //! the moment this is shown, any new MpvPlayers will stop working, only the ones that were started by the player previously will continue to function if (!wallpapers[index].Visible) { wallpapers[index].Show(); // this is processed only once after the first wallpaper change } wallpapers[index].SetWallpaper(WallpaperPathing.ActiveWallpapers[index]); }
public void RebuildImageSelector(string[] selectedImages, bool reverseOrder, int imagesPerPage = 30, int maxLoadedTabs = 25) { // Cancel the rebuild early if there were no images selected if (selectedImages == null) { MessageBox.Show("No images were selected"); return; } // Check for null images (The EnableDetectionOfInactiveImages function is handled further down) int invalidCounter = 0; foreach (string image in selectedImages) { if (image == null) { invalidCounter++; } } if (invalidCounter == selectedImages.Length) { MessageBox.Show("No images were selected"); return; } if (invalidCounter > 0) { MessageBox.Show("Error, some of the images selected were null (Does not include disabled images)"); return; } ClearImageSelector(); if (reverseOrder) { Array.Reverse(selectedImages); // generally, with the way the collections have been handled an "in-order" result will start from z, or backwards } // Ensure that only enabled images are selected if (!OptionsData.ThemeOptions.EnableDetectionOfInactiveImages) { HashSet <string> activeSelectedImages = new HashSet <string>(); foreach (string image in selectedImages) { if (WallpaperData.ContainsImage(image)) // nothing's stopping you from seleting any image in the file explorer search { if (WallpaperData.GetImageData(image).Active) { activeSelectedImages.Add(image); } } } selectedImages = activeSelectedImages.ToArray(); } if (selectedImages.Length == 0) { MessageBox.Show("No images were selected"); return; } int pageCount = (selectedImages.Length / imagesPerPage) + 1; for (int i = 0; i < pageCount; i++) { tabControlImagePages.TabPages.Add((i + 1).ToString() + " Key", (i + 1).ToString()); TabPage curTab = tabControlImagePages.TabPages[i]; curTab.BackColor = Color.Black; } // Finalization this.selectedImages = selectedImages; this.imagesPerPage = imagesPerPage; this.maxLoadedTabs = maxLoadedTabs; LoadTab(0); //tabControlImagePages.Refresh(); tabControlImagePages.ResumeLayout(); panelImageSelector.Visible = true; }
private async void LoadTab(int tabIndex) { if (tabIndex != -1 && selectedImages != null) // tabIndex will equal -1 when resetting the tabControl | selectedImages may equal null when clearing { tabControlImagePages.SuspendLayout(); ClearLoadedImages(); // Add controls to their panels activeTabLayoutPanel?.Dispose(); SmoothScrollFlowLayoutPanel tabLayoutPanel = new SmoothScrollFlowLayoutPanel(); tabLayoutPanel.Size = new Size(tabControlImagePages.Size.Width - 5, tabControlImagePages.Size.Height - tabControlImagePages.ItemSize.Height - 5); tabLayoutPanel.AutoScroll = true; tabLayoutPanel.HorizontalScroll.Visible = false; tabLayoutPanel.MouseClick += tabLayoutPanel_MouseClick; if (tabControlImagePages.TabPages[tabIndex].Controls.Count > 0) { tabControlImagePages.TabPages[tabIndex].Controls.RemoveAt(0); } tabControlImagePages.TabPages[tabIndex].Controls.Add(tabLayoutPanel); // panel added here // Load in image editors int indexOffset = tabIndex * imagesPerPage; int maxIndex = imagesPerPage + indexOffset - 1; maxIndex = maxIndex < selectedImages.Length ? maxIndex : selectedImages.Length; string invalidImageSelection = "The following images are not included in your theme: "; string invalidImageSelectionDefault = invalidImageSelection; tabLayoutPanel.SuspendLayout(); for (int i = indexOffset; i <= maxIndex; i++) { if (i != selectedImages.Length) { if (selectedImages[i] != null && File.Exists(selectedImages[i]) && WallpaperData.ContainsImage(selectedImages[i])) { tabLayoutPanel.Controls.Add(new ImageEditorControl(WallpaperData.GetImageData(selectedImages[i]), false)); } else { invalidImageSelection += "\n" + selectedImages[i]; } } } //?tabLayoutPanel.UpdateScroll(); Used in the FastScrollFlowLayoutPanel version of the tabLayoutPanel, may swap back to this in the future tabLayoutPanel.ResumeLayout(); // Loading all of these at the same time is not ideal await Task.Run(() => { ImageEditorControl[] imageEditorControls = tabLayoutPanel.Controls.OfType <ImageEditorControl>().ToArray(); foreach (ImageEditorControl control in imageEditorControls) { LoadImage(control, control.ImageData.Path); } }); tabLayoutPanel.Focus(); // clicking on the Tab Control to change pages loses the focus of the panel activeTabLayoutPanel = tabLayoutPanel; //tabControlImagePages.Refresh(); tabControlImagePages.ResumeLayout(); if (invalidImageSelectionDefault != invalidImageSelection) { MessageBox.Show(invalidImageSelection); } } }
private void buttonUpdateTheme_Click(object sender, EventArgs e) { WallpaperData.EvaluateImageFolders(); // scans for new images WallpaperData.SaveData(WallpaperPathing.ActiveWallpaperTheme); }