diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/icon.svg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/icon.svg index 81b6634..1f30265 120000 --- a/cinnamon-dynamic-wallpaper@TobiZog/5.4/icon.svg +++ b/cinnamon-dynamic-wallpaper@TobiZog/5.4/icon.svg @@ -1 +1 @@ -icons/icon.svg \ No newline at end of file +res/icons/icon.svg \ No newline at end of file diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/preferences.py b/cinnamon-dynamic-wallpaper@TobiZog/5.4/preferences.py deleted file mode 100755 index 80f1a07..0000000 --- a/cinnamon-dynamic-wallpaper@TobiZog/5.4/preferences.py +++ /dev/null @@ -1,642 +0,0 @@ -#!/usr/bin/python3 - -############################################################ -# Imports # -############################################################ - -# Packages -import gi, os, subprocess, time -from datetime import timedelta - -# Local scripts -from scripts import cinnamon_pref_handler, dialogs, display, images, location, suntimes, time_bar_chart, ui -from loop import * -from enums.ImageSourceEnum import ImageSourceEnum -from enums.PeriodSourceEnum import PeriodSourceEnum - -gi.require_version("Gtk", "3.0") -from gi.repository import Gtk, GdkPixbuf - - -# Global definitions -PREFERENCES_URI = os.path.dirname(os.path.abspath(__file__)) -GLADE_URI = PREFERENCES_URI + "/preferences.glade" - - -class Preferences: - """ Preference window class - """ - - ############################################################ - # Lifecycle # - ############################################################ - - def __init__(self) -> None: - # Objects from external scripts - self.prefs = cinnamon_pref_handler.Cinnamon_Pref_Handler() - self.dialogs = dialogs.Dialogs() - self.display = display.Display() - self.images = images.Images() - self.location = location.Location() - self.suntimes = suntimes.Suntimes() - self.time_bar_chart = time_bar_chart.Time_Bar_Chart() - - # Glade - self.builder = Gtk.Builder() - self.builder.add_from_file(GLADE_URI) - self.builder.connect_signals(self) - - self.ui = ui.UI(self.builder) - - - # Local Config - self.smaller_ui_height = 1000 - - - def show(self): - """ Display the window to the screen - """ - window = self.builder.get_object("window_main") - window.show_all() - - # Load from preferences - if self.prefs.image_source == ImageSourceEnum.IMAGESET: - self.ui.tb_image_set.set_active(True) - elif self.prefs.image_source == ImageSourceEnum.HEICFILE: - self.ui.tb_heic_file.set_active(True) - elif self.prefs.image_source == ImageSourceEnum.SOURCEFOLDER: - self.ui.tb_source_folder.set_active(True) - - - # Remove icons in the ToggleButtons if the screen height resolution < 1000 px - if self.display.get_screen_height() < self.smaller_ui_height: - self.ui.img_tb_image_set.clear() - self.ui.img_tb_heic_file.clear() - self.ui.img_tb_source_folder.clear() - self.ui.img_tb_network_location.clear() - self.ui.img_tb_custom_location.clear() - self.ui.img_tb_time_periods.clear() - - - picture_aspects = ["centered", "scaled", "stretched", "zoom", "spanned"] - self.ui.add_items_to_combo_box(self.ui.cb_picture_aspect, picture_aspects) - self.ui.set_active_combobox_item(self.ui.cb_picture_aspect, self.prefs.picture_aspect) - - self.ui.sw_dynamic_background_color.set_active(self.prefs.dynamic_background_color) - - - if self.prefs.period_source == PeriodSourceEnum.NETWORKLOCATION: - self.ui.tb_network_location.set_active(True) - elif self.prefs.period_source == PeriodSourceEnum.CUSTOMLOCATION: - self.ui.tb_custom_location.set_active(True) - elif self.prefs.period_source == PeriodSourceEnum.CUSTOMTIMEPERIODS: - self.ui.tb_time_periods.set_active(True) - - - # Time diagram - try: - self.refresh_chart() - except: - pass - - # Show the main window - Gtk.main() - - - def on_destroy(self, *args): - """ Lifecycle handler when window will be destroyed - """ - Gtk.main_quit() - - - - ############################################################ - # Local methods # - ############################################################ - - def refresh_chart(self): - """ Recomputes both time bar charts and load them to the UI - """ - # Stores the start times of the periods in minutes since midnight - time_periods_min = [] - - if self.prefs.period_source == PeriodSourceEnum.CUSTOMTIMEPERIODS: - for i in range(0, 10): - time_str = self.prefs.period_custom_start_time[i] - - time_periods_min.append(int(time_str[0:2]) * 60 + int(time_str[3:5])) - else: - if self.prefs.period_source == PeriodSourceEnum.NETWORKLOCATION: - self.suntimes.calc_suntimes(float(self.prefs.latitude_auto), float(self.prefs.longitude_auto)) - else: - self.suntimes.calc_suntimes(float(self.ui.etr_latitude.get_text()), float(self.ui.etr_longitude.get_text())) - - - # Get all time periods. Store the minutes to the list and print the values to the text views - for i in range(0, 10): - time_range_now = self.suntimes.day_periods[i] - - if i != 9: - time_range_next = self.suntimes.day_periods[i + 1] - else: - time_range_next = time(hour=23, minute=59) - - self.ui.etr_periods[i].set_text( - str(time_range_now.hour).rjust(2, '0') + ":" + str(time_range_now.minute).rjust(2, '0') + \ - " - " + str(time_range_next.hour).rjust(2, '0') + ":" + str(time_range_next.minute).rjust(2, '0')) - - time_periods_min.append(time_range_now.hour * 60 + time_range_now.minute) - - # Create time bar - # Reduce size for small displays - if self.display.get_screen_height() < self.smaller_ui_height: - bar_width = 1150 - bar_height = 110 - else: - bar_width = 1300 - bar_height = 150 - - self.time_bar_chart.create_bar_chart_with_polylines(PREFERENCES_URI, bar_width, bar_height, time_periods_min) - self.time_bar_chart.create_bar_chart(PREFERENCES_URI, bar_width, bar_height, time_periods_min) - - # Load to the views - pixbuf = GdkPixbuf.Pixbuf.new_from_file(PREFERENCES_URI + "/time_bar_polylines.svg") - self.ui.img_bar_images.set_from_pixbuf(pixbuf) - - pixbuf2 = GdkPixbuf.Pixbuf.new_from_file(PREFERENCES_URI + "/time_bar.svg") - self.ui.img_bar_times.set_from_pixbuf(pixbuf2) - - - def load_image_options_to_combo_boxes(self, options: list): - """ Add a list of Strings to all image option comboboxes - - Args: - options (list): All possible options - """ - options.insert(0, "") - - for combobox in self.ui.cb_periods: - self.ui.add_items_to_combo_box(combobox, options) - - - def load_image_to_preview(self, image_preview: Gtk.Image, image_src: str): - """ Scales the image to a lower resoultion and put them into the time bar chart - - Args: - image_preview (Gtk.Image): Gtk Image where it will be displayed - image_src (str): Absolute path to the image - """ - try: - pixbuf = GdkPixbuf.Pixbuf.new_from_file(image_src) - - screen_height = self.display.get_screen_height() - - # Scaling the images smaller for screens - if screen_height < self.smaller_ui_height: - pixbuf = pixbuf.scale_simple(221, 128, GdkPixbuf.InterpType.BILINEAR) - else: - pixbuf = pixbuf.scale_simple(260, 150, GdkPixbuf.InterpType.BILINEAR) - - image_preview.set_from_pixbuf(pixbuf) - except: - pass - - - ############################################################ - # Callbacks # - ############################################################ - - ## Image Configuration - - # +-----------+-----------+---------------+ - # | Image Set | HEIC file | Source Folder | - # +-----------+-----------+---------------+ - - def on_toggle_button_image_set_clicked(self, button: Gtk.ToggleButton): - """ Clicked on ToggleButton "Image Set" - - Args: - button (Gtk.ToggleButton): Clicked ToggleButton - """ - if button.get_active(): - self.prefs.image_source = ImageSourceEnum.IMAGESET - self.ui.tb_heic_file.set_active(False) - self.ui.tb_source_folder.set_active(False) - - self.ui.lbr_image_set.set_visible(True) - self.ui.lbr_heic_file.set_visible(False) - self.ui.lbr_source_folder.set_visible(False) - - image_set_choices = [ - "aurora", "beach", - "bitday", "cliffs", - "earth", "gradient", - "lakeside", "mountains", - "sahara" - ] - self.ui.add_items_to_combo_box(self.ui.cb_image_set, image_set_choices) - - self.ui.set_active_combobox_item(self.ui.cb_image_set, self.prefs.selected_image_set) - - for i, combobox in enumerate(self.ui.cb_periods): - selected_image_name = self.prefs.period_images[i] - self.ui.set_active_combobox_item(combobox, selected_image_name) - - # Make the comboboxes invisible - for combobox in self.ui.cb_periods: - combobox.set_visible(False) - - - def on_toggle_button_heic_file_clicked(self, button: Gtk.ToggleButton): - """ Clicked on ToggleButton "Heic file" - - Args: - button (Gtk.ToggleButton): Clicked ToggleButton - """ - if button.get_active(): - self.prefs.image_source = ImageSourceEnum.HEICFILE - self.ui.tb_image_set.set_active(False) - self.ui.tb_source_folder.set_active(False) - - self.ui.lbr_image_set.set_visible(False) - self.ui.lbr_heic_file.set_visible(True) - self.ui.lbr_source_folder.set_visible(False) - - # Make the comboboxes visible - for combobox in self.ui.cb_periods: - combobox.set_visible(True) - - # Load images from source folder - files = self.images.get_images_from_folder(self.prefs.source_folder) - - if len(files) != 0: - self.load_image_options_to_combo_boxes(files) - - # Load the values for the images from the preferences - for i in range(0, 10): - self.ui.set_active_combobox_item(self.ui.cb_periods[i], self.prefs.period_images[i]) - else: - print("No image files!") - - - def on_toggle_button_source_folder_clicked(self, button: Gtk.ToggleButton): - """ Clicked on ToggleButton "Source Folder" - - Args: - button (Gtk.ToggleButton): Clicked ToggleButton - """ - if button.get_active(): - self.prefs.image_source = ImageSourceEnum.SOURCEFOLDER - self.ui.tb_image_set.set_active(False) - self.ui.tb_heic_file.set_active(False) - - self.ui.lbr_image_set.set_visible(False) - self.ui.lbr_heic_file.set_visible(False) - self.ui.lbr_source_folder.set_visible(True) - - # Make the comboboxes visible - for combobox in self.ui.cb_periods: - combobox.set_visible(True) - - # Load the source folder to the view - # This will update the comboboxes in the preview to contain the right items - self.ui.lbl_source_folder.set_label(self.prefs.source_folder) - - # Load files from saved source folder - files = self.images.get_images_from_folder(self.prefs.source_folder) - - if len(files) != 0: - self.load_image_options_to_combo_boxes(files) - - # Load the values for the images from the preferences - for i in range(0, 10): - self.ui.set_active_combobox_item(self.ui.cb_periods[i], self.prefs.period_images[i]) - else: - print("No image files!") - - - - # +------------------------------------+ - # | Select an image set | aurora ▼ | - # +------------------------------------+ - - def on_cb_image_set_changed(self, combobox: Gtk.ComboBox): - """ User select on of the included image sets - - Args: - combobox (Gtk.ComboBox): The used ComboBox - """ - tree_iter = combobox.get_active_iter() - - if tree_iter is not None and self.prefs.image_source == ImageSourceEnum.IMAGESET: - # Get the selected value - model = combobox.get_model() - selected_image_set = model[tree_iter][0] - - # Store to the preferences - self.prefs.selected_image_set = selected_image_set - self.prefs.source_folder = os.path.abspath(os.path.join(PREFERENCES_URI, os.pardir)) + \ - "/5.4/images/included_image_sets/" + selected_image_set + "/" - - # Load all possible options to the comboboxes - image_names = self.images.get_images_from_folder(self.prefs.source_folder) - self.load_image_options_to_combo_boxes(image_names) - - # Image sets have the same names for the images: - # 9.jpg = Period 0 - # 1.jpg = Period 1 - # 2.jpg = Period 2 - # and so on.... - for i in range(0, 10): - self.ui.cb_periods[i].set_active(i + 1) - - - # +----------------------------------------------+ - # | Select a heic file to import | (None) 📄 | - # +----------------------------------------------+ - - def on_fc_heic_file_file_set(self, fc_button: Gtk.FileChooser): - """ User has a heic file selected with the FileChooserDialog - - Args: - fc_button (Gtk.FileChooser): Parameter about the selected file - """ - # The the absolute path to the heic file - file_path: str = fc_button.get_filename() - - # Extract the heic file - result = self.images.extract_heic_file(file_path) - - # Update the preferences - self.prefs.selected_image_set = "" - self.prefs.source_folder = PREFERENCES_URI + "/images/extracted_images/" - - # Load images only if the extraction was successfully - if result: - # Collect all extracted images and push them to the comboboxes - image_names = self.images.get_images_from_folder(self.prefs.source_folder) - self.load_image_options_to_combo_boxes(image_names) - else: - self.dialogs.message_dialog("Error during extraction") - - - # +------------------------------------------------------------+ - # | Select a source folder | 📂 Open file selection dialog | - # | /home/developer/Downloads/ - # +------------------------------------------------------------+ - - def on_btn_source_folder_clicked(self, button: Gtk.Button): - """ Button to choose an image source folder was clicked - - Args: - button (Gtk.Button): The clicked button - """ - folder = self.dialogs.source_folder_dialog() - files = self.images.get_images_from_folder(folder) - - # Update the preferences - self.prefs.selected_image_set = "" - self.prefs.source_folder = folder + "/" - - # Update the label - self.ui.lbl_source_folder.set_label(folder) - - # Update the image comboboxes - self.load_image_options_to_combo_boxes(files) - - # Load the values for the images from the preferences - for i in range(0, 10): - self.ui.cb_periods[i].set_active(0) - - if len(files) == 1: - self.dialogs.message_dialog("No image files found!") - - - def on_cb_period_preview_changed(self, combobox: Gtk.ComboBox): - """ User select an image from the ComboBox for the time period - - Args: - combobox (Gtk.ComboBox): The used ComboBox - """ - tree_iter = combobox.get_active_iter() - - combobox_name = Gtk.Buildable.get_name(combobox) - period_index = int(combobox_name[10:11]) - - if tree_iter is not None: - # Get the selected value - model = combobox.get_model() - image_file_name = model[tree_iter][0] - - # Store selection to preferences - self.prefs.period_images[period_index] = image_file_name - - # Build up image path - image_path = self.prefs.source_folder + image_file_name - - self.load_image_to_preview(self.ui.img_periods[period_index], image_path) - - - ## Location & Times - - def on_toggle_button_network_location_clicked(self, button: Gtk.ToggleButton): - """ User clicks on the ToggleButton for the network location - - Args: - button (Gtk.ToggleButton): Clicked ToggleButton - """ - if button.get_active(): - self.prefs.period_source = PeriodSourceEnum.NETWORKLOCATION - self.ui.tb_custom_location.set_active(False) - self.ui.tb_time_periods.set_active(False) - - self.ui.lbr_network_location.set_visible(True) - self.ui.lbr_current_location.set_visible(True) - self.ui.lbr_custom_location_longitude.set_visible(False) - self.ui.lbr_custom_location_latitude.set_visible(False) - self.ui.lbr_time_periods.set_visible(False) - - self.ui.spb_network_location_refresh_time.set_value(self.prefs.location_refresh_intervals) - - - # Display the location in the UI - current_location = self.location.get_location() - self.ui.lb_current_location.set_text("Latitude: " + current_location["latitude"] + \ - ", Longitude: " + current_location["longitude"]) - - # Store the location to the preferences - self.prefs.latitude_auto = float(current_location["latitude"]) - self.prefs.longitude_auto = float(current_location["longitude"]) - - self.refresh_chart() - - - def on_toggle_button_custom_location_clicked(self, button: Gtk.ToggleButton): - if button.get_active(): - self.prefs.period_source = PeriodSourceEnum.CUSTOMLOCATION - self.ui.tb_network_location.set_active(False) - self.ui.tb_time_periods.set_active(False) - - self.ui.lbr_network_location.set_visible(False) - self.ui.lbr_current_location.set_visible(False) - self.ui.lbr_custom_location_longitude.set_visible(True) - self.ui.lbr_custom_location_latitude.set_visible(True) - self.ui.lbr_time_periods.set_visible(False) - - self.ui.etr_latitude.set_text(str(self.prefs.latitude_custom)) - self.ui.etr_longitude.set_text(str(self.prefs.longitude_custom)) - - - def on_toggle_button_time_periods_clicked(self, button: Gtk.ToggleButton): - if button.get_active(): - self.prefs.period_source = PeriodSourceEnum.CUSTOMTIMEPERIODS - self.ui.tb_network_location.set_active(False) - self.ui.tb_custom_location.set_active(False) - - self.ui.lbr_network_location.set_visible(False) - self.ui.lbr_current_location.set_visible(False) - self.ui.lbr_custom_location_longitude.set_visible(False) - self.ui.lbr_custom_location_latitude.set_visible(False) - self.ui.lbr_time_periods.set_visible(True) - - - for i in range(0, 9): - pref_value = self.prefs.period_custom_start_time[i + 1] - time_parts = [int(pref_value[0:pref_value.find(":")]), int(pref_value[pref_value.find(":") + 1:])] - - self.ui.spb_periods_hour[i].set_value(time_parts[0]) - self.ui.spb_periods_minute[i].set_value(time_parts[1]) - - - - def on_spb_period_value_changed(self, spin_button: Gtk.SpinButton): - """ Callback if one of the time spinners (minute or hour) will be clicked - - (1) (2) (3) - Previous period Current period Next period - 12:34 - 14:40 14:41 - 16:20 16:21 - 17:30 - ^ - Variable to change - - Args: - spin_button (Gtk.SpinButton): SpinButton which was changed - """ - spin_button_name = Gtk.Buildable.get_name(spin_button) - index = int(spin_button_name[11:12]) - 1 - - # Determe time string and store to prefs - time_current_start = datetime(2024,1,1, int(self.ui.spb_periods_hour[index].get_value()), int(self.ui.spb_periods_minute[index].get_value())) - time_current_start_str = str(time_current_start.hour).rjust(2, '0') + ":" + str(time_current_start.minute).rjust(2, '0') - - self.prefs.period_custom_start_time[index + 1] = time_current_start_str - - - time_previous_end = time_current_start - timedelta(minutes=1) - self.ui.lb_period_end[index].set_text(str(time_previous_end.hour).rjust(2, '0') + ":" + str(time_previous_end.minute).rjust(2, '0')) - - - self.refresh_chart() - - - def on_spb_network_location_refresh_time_changed(self, spin_button: Gtk.SpinButton): - """ User changed the refresh time of network location estimation - - Args: - spin_button (Gtk.SpinButton): The used SpinButton - """ - self.prefs.location_refresh_intervals = spin_button.get_value() - - - def on_etr_longitude_changed(self, entry: Gtk.Entry): - """ User changes the value of the longitude Entry - - Args: - entry (Gtk.Entry): The manipulated Entry object - """ - try: - self.prefs.longitude_custom = float(entry.get_text()) - self.refresh_chart() - except: - pass - - - def on_etr_latitude_changed(self, entry: Gtk.Entry): - """ User changes the value of the latitude Entry - - Args: - entry (Gtk.Entry): The manipulated Entry object - """ - try: - self.prefs.latitude_custom = float(entry.get_text()) - self.refresh_chart() - except: - pass - - - # Behaviour - - def on_cb_picture_aspect_changed(self, combobox: Gtk.ComboBox): - tree_iter = combobox.get_active_iter() - - if tree_iter is not None: - model = combobox.get_model() - self.prefs.picture_aspect = model[tree_iter][0] - - def on_sw_dynamic_background_color_state_set(self, switch: Gtk.Switch, state): - self.prefs.dynamic_background_color = state - - - # About - - def on_cinnamon_spices_website_button_clicked(self, button: Gtk.Button): - """ Callback for the button to navigate to the Cinnamon Spices web page of this project - - Args: - button (Gtk.Button): Button which was clicked - """ - subprocess.Popen(["xdg-open", "https://cinnamon-spices.linuxmint.com/extensions/view/97"]) - - - def on_github_website_button_clicked(self, button: Gtk.Button): - """ Callback for the button to navigate to the GitHub web page of this project - - Args: - button (Gtk.Button): Button which was clicked - """ - subprocess.Popen(["xdg-open", "https://github.com/TobiZog/cinnamon-dynamic-wallpaper"]) - - - def on_create_issue_button_clicked(self, button): - """ Callback for the button to navigate to the Issues page on GitHub of this project - - Args: - button (Gtk.Button): Button which was clicked - """ - subprocess.Popen(["xdg-open", "https://github.com/TobiZog/cinnamon-dynamic-wallpaper/issues/new"]) - - - def on_ok(self, *args): - """ Callback for the OK button in the top bar - """ - try: - self.on_apply() - except: - pass - - # Close the window - self.on_destroy() - - - def on_apply(self, *args): - """ Callback for the Apply button in the top bar - """ - # Store all values to the JSON file - self.prefs.store_preferences() - - # Use the new settings - loop = Loop() - loop.exchange_image() - - -if __name__ == "__main__": - Preferences().show() \ No newline at end of file diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/icons/icon.png b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/icons/icon.png similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/icons/icon.png rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/icons/icon.png diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/icons/icon.svg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/icons/icon.svg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/icons/icon.svg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/icons/icon.svg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/aurora/0.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/aurora/0.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/aurora/0.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/aurora/0.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/aurora/1.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/aurora/1.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/aurora/1.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/aurora/1.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/aurora/2.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/aurora/2.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/aurora/2.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/aurora/2.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/aurora/3.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/aurora/3.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/aurora/3.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/aurora/3.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/aurora/4.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/aurora/4.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/aurora/4.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/aurora/4.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/aurora/5.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/aurora/5.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/aurora/5.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/aurora/5.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/aurora/6.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/aurora/6.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/aurora/6.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/aurora/6.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/aurora/7.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/aurora/7.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/aurora/7.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/aurora/7.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/aurora/8.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/aurora/8.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/aurora/8.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/aurora/8.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/aurora/9.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/aurora/9.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/aurora/9.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/aurora/9.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/beach/0.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/beach/0.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/beach/0.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/beach/0.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/beach/1.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/beach/1.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/beach/1.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/beach/1.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/beach/2.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/beach/2.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/beach/2.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/beach/2.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/beach/3.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/beach/3.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/beach/3.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/beach/3.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/beach/4.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/beach/4.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/beach/4.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/beach/4.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/beach/5.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/beach/5.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/beach/5.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/beach/5.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/beach/6.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/beach/6.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/beach/6.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/beach/6.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/beach/7.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/beach/7.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/beach/7.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/beach/7.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/beach/8.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/beach/8.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/beach/8.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/beach/8.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/beach/9.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/beach/9.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/beach/9.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/beach/9.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/bitday/0.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/bitday/0.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/bitday/0.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/bitday/0.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/bitday/1.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/bitday/1.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/bitday/1.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/bitday/1.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/bitday/2.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/bitday/2.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/bitday/2.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/bitday/2.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/bitday/3.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/bitday/3.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/bitday/3.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/bitday/3.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/bitday/4.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/bitday/4.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/bitday/4.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/bitday/4.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/bitday/5.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/bitday/5.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/bitday/5.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/bitday/5.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/bitday/6.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/bitday/6.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/bitday/6.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/bitday/6.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/bitday/7.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/bitday/7.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/bitday/7.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/bitday/7.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/bitday/8.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/bitday/8.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/bitday/8.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/bitday/8.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/bitday/9.png b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/bitday/9.png similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/bitday/9.png rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/bitday/9.png diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/cliffs/0.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/cliffs/0.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/cliffs/0.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/cliffs/0.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/cliffs/1.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/cliffs/1.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/cliffs/1.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/cliffs/1.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/cliffs/2.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/cliffs/2.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/cliffs/2.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/cliffs/2.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/cliffs/3.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/cliffs/3.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/cliffs/3.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/cliffs/3.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/cliffs/4.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/cliffs/4.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/cliffs/4.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/cliffs/4.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/cliffs/5.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/cliffs/5.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/cliffs/5.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/cliffs/5.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/cliffs/6.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/cliffs/6.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/cliffs/6.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/cliffs/6.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/cliffs/7.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/cliffs/7.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/cliffs/7.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/cliffs/7.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/cliffs/8.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/cliffs/8.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/cliffs/8.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/cliffs/8.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/cliffs/9.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/cliffs/9.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/cliffs/9.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/cliffs/9.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/earth/0.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/earth/0.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/earth/0.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/earth/0.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/earth/1.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/earth/1.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/earth/1.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/earth/1.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/earth/2.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/earth/2.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/earth/2.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/earth/2.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/earth/3.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/earth/3.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/earth/3.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/earth/3.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/earth/4.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/earth/4.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/earth/4.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/earth/4.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/earth/5.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/earth/5.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/earth/5.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/earth/5.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/earth/6.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/earth/6.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/earth/6.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/earth/6.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/earth/7.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/earth/7.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/earth/7.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/earth/7.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/earth/8.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/earth/8.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/earth/8.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/earth/8.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/earth/9.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/earth/9.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/earth/9.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/earth/9.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/gradient/0.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/gradient/0.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/gradient/0.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/gradient/0.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/gradient/1.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/gradient/1.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/gradient/1.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/gradient/1.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/gradient/2.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/gradient/2.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/gradient/2.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/gradient/2.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/gradient/3.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/gradient/3.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/gradient/3.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/gradient/3.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/gradient/4.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/gradient/4.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/gradient/4.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/gradient/4.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/gradient/5.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/gradient/5.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/gradient/5.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/gradient/5.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/gradient/6.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/gradient/6.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/gradient/6.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/gradient/6.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/gradient/7.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/gradient/7.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/gradient/7.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/gradient/7.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/gradient/8.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/gradient/8.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/gradient/8.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/gradient/8.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/gradient/9.png b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/gradient/9.png similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/gradient/9.png rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/gradient/9.png diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/lakeside/0.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/lakeside/0.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/lakeside/0.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/lakeside/0.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/lakeside/1.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/lakeside/1.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/lakeside/1.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/lakeside/1.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/lakeside/2.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/lakeside/2.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/lakeside/2.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/lakeside/2.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/lakeside/3.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/lakeside/3.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/lakeside/3.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/lakeside/3.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/lakeside/4.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/lakeside/4.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/lakeside/4.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/lakeside/4.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/lakeside/5.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/lakeside/5.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/lakeside/5.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/lakeside/5.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/lakeside/6.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/lakeside/6.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/lakeside/6.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/lakeside/6.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/lakeside/7.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/lakeside/7.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/lakeside/7.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/lakeside/7.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/lakeside/8.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/lakeside/8.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/lakeside/8.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/lakeside/8.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/lakeside/9.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/lakeside/9.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/lakeside/9.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/lakeside/9.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/mountains/0.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/mountains/0.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/mountains/0.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/mountains/0.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/mountains/1.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/mountains/1.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/mountains/1.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/mountains/1.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/mountains/2.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/mountains/2.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/mountains/2.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/mountains/2.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/mountains/3.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/mountains/3.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/mountains/3.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/mountains/3.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/mountains/4.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/mountains/4.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/mountains/4.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/mountains/4.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/mountains/5.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/mountains/5.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/mountains/5.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/mountains/5.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/mountains/6.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/mountains/6.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/mountains/6.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/mountains/6.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/mountains/7.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/mountains/7.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/mountains/7.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/mountains/7.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/mountains/8.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/mountains/8.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/mountains/8.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/mountains/8.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/mountains/9.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/mountains/9.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/mountains/9.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/mountains/9.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/sahara/0.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/sahara/0.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/sahara/0.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/sahara/0.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/sahara/1.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/sahara/1.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/sahara/1.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/sahara/1.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/sahara/2.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/sahara/2.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/sahara/2.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/sahara/2.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/sahara/3.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/sahara/3.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/sahara/3.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/sahara/3.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/sahara/4.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/sahara/4.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/sahara/4.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/sahara/4.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/sahara/5.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/sahara/5.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/sahara/5.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/sahara/5.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/sahara/6.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/sahara/6.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/sahara/6.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/sahara/6.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/sahara/7.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/sahara/7.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/sahara/7.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/sahara/7.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/sahara/8.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/sahara/8.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/sahara/8.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/sahara/8.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/sahara/9.jpg b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/sahara/9.jpg similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/images/included_image_sets/sahara/9.jpg rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/images/included_image_sets/sahara/9.jpg diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/preferences.glade b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/preferences.glade similarity index 98% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/preferences.glade rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/res/preferences.glade index e5144a3..fefd337 100644 --- a/cinnamon-dynamic-wallpaper@TobiZog/5.4/preferences.glade +++ b/cinnamon-dynamic-wallpaper@TobiZog/5.4/res/preferences.glade @@ -1147,7 +1147,7 @@ none False - + True True @@ -1173,7 +1173,7 @@ - + True True adjustment1 @@ -1189,6 +1189,49 @@ + + + True + True + + + True + False + 8 + 8 + 8 + 8 + 8 + 8 + True + + + True + False + start + Location provider + + + False + True + 0 + + + + + True + False + + + False + True + 1 + + + + + + True diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/scripts/location.py b/cinnamon-dynamic-wallpaper@TobiZog/5.4/scripts/location.py deleted file mode 100644 index bc8169f..0000000 --- a/cinnamon-dynamic-wallpaper@TobiZog/5.4/scripts/location.py +++ /dev/null @@ -1,22 +0,0 @@ -import urllib.request, json - -class Location(): - """ Class to handle location requests - """ - def __init__(self): - self.GEO_URL = "https://get.geojs.io/v1/ip/geo.json" - - def get_location(self) -> dict: - """ Request the location via network - - Returns: - dict: latitude and longitude - """ - request = urllib.request.urlopen(self.GEO_URL) - - data = json.load(request) - - return { - "latitude": data["latitude"], - "longitude": data["longitude"] - } diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/scripts/ui.py b/cinnamon-dynamic-wallpaper@TobiZog/5.4/scripts/ui.py deleted file mode 100644 index daa0a69..0000000 --- a/cinnamon-dynamic-wallpaper@TobiZog/5.4/scripts/ui.py +++ /dev/null @@ -1,147 +0,0 @@ -import gi -gi.require_version("Gtk", "3.0") -from gi.repository import Gtk - -class UI: - """ Class to handle UI components and actions - """ - def __init__(self, builder: Gtk.Builder) -> None: - # Page 1 - self.tb_image_set: Gtk.ToggleButton = builder.get_object("tb_image_set") - self.tb_heic_file: Gtk.ToggleButton = builder.get_object("tb_heic_file") - self.tb_source_folder: Gtk.ToggleButton = builder.get_object("tb_source_folder") - self.img_tb_image_set: Gtk.Image = builder.get_object("img_tb_image_set") - self.img_tb_heic_file: Gtk.Image = builder.get_object("img_tb_heic_file") - self.img_tb_source_folder: Gtk.Image = builder.get_object("img_tb_source_folder") - - # Image set - self.lbr_image_set: Gtk.ListBoxRow = builder.get_object("lbr_image_set") - self.cb_image_set: Gtk.ComboBox = builder.get_object("cb_image_set") - - # HEIC file - self.lbr_heic_file: Gtk.ListBoxRow = builder.get_object("lbr_heic_file") - - # Source folder - self.lbr_source_folder: Gtk.ListBoxRow = builder.get_object("lbr_source_folder") - self.btn_source_folder: Gtk.Button = builder.get_object("btn_source_folder") - self.lbl_source_folder: Gtk.Label = builder.get_object("lbl_source_folder") - - # Time bar chart - self.img_bar_images: Gtk.Image = builder.get_object("img_bar_images") - self.etr_periods: list[Gtk.Entry] = [ - builder.get_object("etr_period_1"), builder.get_object("etr_period_2"), - builder.get_object("etr_period_3"), builder.get_object("etr_period_4"), - builder.get_object("etr_period_5"), builder.get_object("etr_period_6"), - builder.get_object("etr_period_7"), builder.get_object("etr_period_8"), - builder.get_object("etr_period_9"), builder.get_object("etr_period_10"), - ] - - self.img_periods: list[Gtk.Image] = [ - builder.get_object("img_period_0"), builder.get_object("img_period_1"), - builder.get_object("img_period_2"), builder.get_object("img_period_3"), - builder.get_object("img_period_4"), builder.get_object("img_period_5"), - builder.get_object("img_period_6"), builder.get_object("img_period_7"), - builder.get_object("img_period_8"), builder.get_object("img_period_9"), - ] - - self.cb_periods: list[Gtk.ComboBox] = [ - builder.get_object("cb_period_0"), builder.get_object("cb_period_1"), - builder.get_object("cb_period_2"), builder.get_object("cb_period_3"), - builder.get_object("cb_period_4"), builder.get_object("cb_period_5"), - builder.get_object("cb_period_6"), builder.get_object("cb_period_7"), - builder.get_object("cb_period_8"), builder.get_object("cb_period_9"), - ] - - - - #### Page 2: Location & Times - self.tb_network_location: Gtk.ToggleButton = builder.get_object("tb_network_location") - self.tb_custom_location: Gtk.ToggleButton = builder.get_object("tb_custom_location") - self.tb_time_periods: Gtk.ToggleButton = builder.get_object("tb_time_periods") - self.img_tb_network_location: Gtk.Image = builder.get_object("img_tb_network_location") - self.img_tb_custom_location: Gtk.Image = builder.get_object("img_tb_custom_location") - self.img_tb_time_periods: Gtk.Image = builder.get_object("img_tb_time_periods") - - # Network Location - self.lb_current_location: Gtk.Label = builder.get_object("lb_current_location") - self.lbr_current_location: Gtk.ListBoxRow = builder.get_object("lbr_current_location") - self.lbr_network_location: Gtk.ListBoxRow = builder.get_object("lbr_network_location") - self.spb_network_location_refresh_time: Gtk.SpinButton = builder.get_object("spb_network_location_refresh_time") - - # Custom location - self.lbr_custom_location_longitude: Gtk.ListBoxRow = builder.get_object("lbr_custom_location_longitude") - self.lbr_custom_location_latitude: Gtk.ListBoxRow = builder.get_object("lbr_custom_location_latitude") - self.lbr_time_periods: Gtk.ListBoxRow = builder.get_object("lbr_time_periods") - self.etr_longitude: Gtk.Entry = builder.get_object("etr_longitude") - self.etr_latitude: Gtk.Entry = builder.get_object("etr_latitude") - self.img_bar_times: Gtk.Image = builder.get_object("img_bar_times") - self.spb_periods_hour: list[Gtk.SpinButton] = [ - builder.get_object("spb_period_1_hour"), - builder.get_object("spb_period_2_hour"), - builder.get_object("spb_period_3_hour"), - builder.get_object("spb_period_4_hour"), - builder.get_object("spb_period_5_hour"), - builder.get_object("spb_period_6_hour"), - builder.get_object("spb_period_7_hour"), - builder.get_object("spb_period_8_hour"), - builder.get_object("spb_period_9_hour"), - ] - self.spb_periods_minute: list[Gtk.SpinButton] = [ - builder.get_object("spb_period_1_minute"), - builder.get_object("spb_period_2_minute"), - builder.get_object("spb_period_3_minute"), - builder.get_object("spb_period_4_minute"), - builder.get_object("spb_period_5_minute"), - builder.get_object("spb_period_6_minute"), - builder.get_object("spb_period_7_minute"), - builder.get_object("spb_period_8_minute"), - builder.get_object("spb_period_9_minute") - ] - self.lb_period_end: list[Gtk.Label] = [ - builder.get_object("lb_period_0_end"), builder.get_object("lb_period_1_end"), - builder.get_object("lb_period_2_end"), builder.get_object("lb_period_3_end"), - builder.get_object("lb_period_4_end"), builder.get_object("lb_period_5_end"), - builder.get_object("lb_period_6_end"), builder.get_object("lb_period_7_end"), - builder.get_object("lb_period_8_end"), builder.get_object("lb_period_9_end"), - ] - - - # Page 3: Behaviour - self.cb_picture_aspect: Gtk.ComboBox = builder.get_object("cb_picture_aspect") - self.sw_dynamic_background_color: Gtk.Switch = builder.get_object("sw_dynamic_background_color") - - - def set_active_combobox_item(self, combobox: Gtk.ComboBoxText, active_item: str): - """ Change active item in combobox by String value - - Args: - combobox (Gtk.ComboBoxText): ComboBox to set active - active_item (str): String item to set active - """ - list_store = combobox.get_model() - - for i in range(0, len(list_store)): - row = list_store[i] - if row[0] == active_item: - combobox.set_active(i) - - - def add_items_to_combo_box(self, combobox: Gtk.ComboBox, items: list): - """ Add items to a combo box - - Args: - combobox (Gtk.ComboBox): ComboBox where to add the options - items (list): Possible options - """ - model = combobox.get_model() - store = Gtk.ListStore(str) - - for image_set in items: - store.append([image_set]) - - combobox.set_model(store) - - if model == None: - renderer_text = Gtk.CellRendererText() - combobox.pack_start(renderer_text, True) - combobox.add_attribute(renderer_text, "text", 0) diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/enums/ImageSourceEnum.py b/cinnamon-dynamic-wallpaper@TobiZog/5.4/src/enums/ImageSourceEnum.py similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/enums/ImageSourceEnum.py rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/src/enums/ImageSourceEnum.py diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/src/enums/NetworkLocationProvider.py b/cinnamon-dynamic-wallpaper@TobiZog/5.4/src/enums/NetworkLocationProvider.py new file mode 100644 index 0000000..02d4486 --- /dev/null +++ b/cinnamon-dynamic-wallpaper@TobiZog/5.4/src/enums/NetworkLocationProvider.py @@ -0,0 +1,5 @@ +from enum import Enum + +class NetworkLocationProvider(Enum): + GEOJS = "https://get.geojs.io/v1/ip/geo.json" + IPAPI = "http://ip-api.com/json/?fields=61439" \ No newline at end of file diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/enums/PeriodSourceEnum.py b/cinnamon-dynamic-wallpaper@TobiZog/5.4/src/enums/PeriodSourceEnum.py similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/enums/PeriodSourceEnum.py rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/src/enums/PeriodSourceEnum.py diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/loop.py b/cinnamon-dynamic-wallpaper@TobiZog/5.4/src/loop.py similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/loop.py rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/src/loop.py diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/src/model/main_view_model.py b/cinnamon-dynamic-wallpaper@TobiZog/5.4/src/model/main_view_model.py new file mode 100644 index 0000000..a8fd7f1 --- /dev/null +++ b/cinnamon-dynamic-wallpaper@TobiZog/5.4/src/model/main_view_model.py @@ -0,0 +1,81 @@ +import os, json +from pathlib import Path + +from service.display import * +from service.cinnamon_pref_handler import * +from service.suntimes import * +from service.time_bar_chart import * +from enums.PeriodSourceEnum import * + +class Main_View_Model: + def __init__(self) -> None: + # Paths + self.WORKING_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + self.RES_DIR = self.WORKING_DIR + "/res" + self.IMAGES_DIR = self.RES_DIR + "/images" + self.GLADE_URI = self.RES_DIR + "/preferences.glade" + self.TIMEBAR_URI = self.WORKING_DIR + "/src/time_bar.svg" + self.TIMEBAR_URI_POLYLINES = self.WORKING_DIR + "/src/time_bar_polylines.svg" + self.PREF_URI = os.path.expanduser("~") + \ + "/.config/cinnamon/spices/cinnamon-dynamic-wallpaper@TobiZog/cinnamon-dynamic-wallpaper@TobiZog.json" + + # Datasets + self.image_sets = ["aurora", "beach", "bitday", "cliffs", "earth", "gradient", "lakeside", "mountains", "sahara"] + self.picture_aspects = ["centered", "scaled", "stretched", "zoom", "spanned"] + self.network_location_provider = ["geojs.io", "ip-api.com"] + + # Objects from scripts + self.screen_height = Display().get_screen_height() + self.cinnamon_prefs = Cinnamon_Pref_Handler() + self.time_bar_chart = Time_Bar_Chart() + self.suntimes = Suntimes() + + # Breakpoint for smaller UI + self.breakpoint_ui = 1000 + + + def refresh_charts(self): + # Stores the start times of the periods in minutes since midnight + time_periods_min = [] + + if self.cinnamon_prefs.period_source == PeriodSourceEnum.CUSTOMTIMEPERIODS: + for i in range(0, 10): + time_str = self.cinnamon_prefs.period_custom_start_time[i] + + time_periods_min.append(int(time_str[0:2]) * 60 + int(time_str[3:5])) + else: + if self.cinnamon_prefs.period_source == PeriodSourceEnum.NETWORKLOCATION: + self.suntimes.calc_suntimes(float(self.cinnamon_prefs.latitude_auto), float(self.cinnamon_prefs.longitude_auto)) + else: + pass + # todo self.suntimes.calc_suntimes(float(self.ui.etr_latitude.get_text()), float(self.ui.etr_longitude.get_text())) + + + # Get all time periods. Store the minutes to the list and print the values to the text views + for i in range(0, 10): + time_range_now = self.suntimes.day_periods[i] + + if i != 9: + time_range_next = self.suntimes.day_periods[i + 1] + else: + time_range_next = time(hour=23, minute=59) + + # todo self.ui.etr_periods[i].set_text( + # str(time_range_now.hour).rjust(2, '0') + ":" + str(time_range_now.minute).rjust(2, '0') + \ + # " - " + str(time_range_next.hour).rjust(2, '0') + ":" + str(time_range_next.minute).rjust(2, '0')) + + time_periods_min.append(time_range_now.hour * 60 + time_range_now.minute) + + # Create time bar + # Reduce size for small displays + if self.screen_height < self.breakpoint_ui: + bar_width = 1150 + bar_height = 110 + else: + bar_width = 1300 + bar_height = 150 + + self.time_bar_chart.create_bar_chart_with_polylines(self.TIMEBAR_URI_POLYLINES, bar_width, bar_height, time_periods_min) + self.time_bar_chart.create_bar_chart(self.TIMEBAR_URI, bar_width, bar_height, time_periods_min) + + diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/src/preferences.py b/cinnamon-dynamic-wallpaper@TobiZog/5.4/src/preferences.py new file mode 100755 index 0000000..da0326d --- /dev/null +++ b/cinnamon-dynamic-wallpaper@TobiZog/5.4/src/preferences.py @@ -0,0 +1,57 @@ +#!/usr/bin/python3 + +############################################################ +# Imports # +############################################################ + +# Packages +import gi, os, subprocess, time +from datetime import timedelta + +# Local scripts +from scripts import cinnamon_pref_handler, dialogs, display, images, location, suntimes, time_bar_chart, ui +from loop import * +from enums.ImageSourceEnum import ImageSourceEnum +from enums.PeriodSourceEnum import PeriodSourceEnum +from enums.NetworkLocationProvider import NetworkLocationProvider + +gi.require_version("Gtk", "3.0") +from gi.repository import Gtk, GdkPixbuf + + + + + + +class Preferences: + """ Preference window class + """ + + ############################################################ + # Lifecycle # + ############################################################ + + def __init__(self) -> None: + # UI helper object + self.ui = ui.UI(self.builder) + + # Layout breakpoint for smaller displays + self.smaller_ui_height = 1000 + + + def show(self): + """ Display the window to the screen + """ + self.ui.show_main_window(self.builder, self.smaller_ui_height, self.prefs) + + # Time diagram + try: + self.refresh_chart() + except: + self.dialogs.message_dialog("Error on creating time bar!") + + + + +if __name__ == "__main__": + Preferences().show() \ No newline at end of file diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/scripts/cinnamon_pref_handler.py b/cinnamon-dynamic-wallpaper@TobiZog/5.4/src/service/cinnamon_pref_handler.py similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/scripts/cinnamon_pref_handler.py rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/src/service/cinnamon_pref_handler.py diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/scripts/display.py b/cinnamon-dynamic-wallpaper@TobiZog/5.4/src/service/display.py similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/scripts/display.py rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/src/service/display.py diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/scripts/images.py b/cinnamon-dynamic-wallpaper@TobiZog/5.4/src/service/images.py similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/scripts/images.py rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/src/service/images.py diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/src/service/location.py b/cinnamon-dynamic-wallpaper@TobiZog/5.4/src/service/location.py new file mode 100644 index 0000000..0794971 --- /dev/null +++ b/cinnamon-dynamic-wallpaper@TobiZog/5.4/src/service/location.py @@ -0,0 +1,29 @@ +import urllib.request, json +from enums.NetworkLocationProvider import NetworkLocationProvider + +class Location(): + """ Class to handle location requests + """ + def __init__(self): + pass + + def get_location(self, provider: NetworkLocationProvider) -> dict: + """ Request the location via network + + Returns: + dict: latitude and longitude + """ + request = urllib.request.urlopen(provider.value) + + data = json.load(request) + + if provider == NetworkLocationProvider.GEOJS: + return { + "latitude": data["latitude"], + "longitude": data["longitude"] + } + elif provider == NetworkLocationProvider.IPAPI: + return { + "latitude": data["lat"], + "longitude": data["lon"] + } diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/scripts/suntimes.py b/cinnamon-dynamic-wallpaper@TobiZog/5.4/src/service/suntimes.py similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/scripts/suntimes.py rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/src/service/suntimes.py diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/scripts/time_bar_chart.py b/cinnamon-dynamic-wallpaper@TobiZog/5.4/src/service/time_bar_chart.py similarity index 97% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/scripts/time_bar_chart.py rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/src/service/time_bar_chart.py index 26b16e1..70b2c75 100644 --- a/cinnamon-dynamic-wallpaper@TobiZog/5.4/scripts/time_bar_chart.py +++ b/cinnamon-dynamic-wallpaper@TobiZog/5.4/src/service/time_bar_chart.py @@ -39,7 +39,7 @@ class Time_Bar_Chart: self.image_code.insert(0, '' % (image_width, image_height)) self.image_code.append('') - file = open(save_location + "/time_bar_polylines.svg", "w") + file = open(save_location, "w") for i in self.image_code: file.write(i + '\n') @@ -63,7 +63,7 @@ class Time_Bar_Chart: self.image_code.insert(0, '' % (image_width, image_height)) self.image_code.append('') - file = open(save_location + "/time_bar.svg", "w") + file = open(save_location, "w") for i in self.image_code: file.write(i + '\n') diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/src/test.py b/cinnamon-dynamic-wallpaper@TobiZog/5.4/src/test.py new file mode 100755 index 0000000..dcbe5d1 --- /dev/null +++ b/cinnamon-dynamic-wallpaper@TobiZog/5.4/src/test.py @@ -0,0 +1,6 @@ +#!/usr/bin/python3 + +import ui.main_window + +main = ui.main_window.Main_Window() +main.show() diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/scripts/dialogs.py b/cinnamon-dynamic-wallpaper@TobiZog/5.4/src/ui/dialogs.py similarity index 100% rename from cinnamon-dynamic-wallpaper@TobiZog/5.4/scripts/dialogs.py rename to cinnamon-dynamic-wallpaper@TobiZog/5.4/src/ui/dialogs.py diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/src/ui/main_window.py b/cinnamon-dynamic-wallpaper@TobiZog/5.4/src/ui/main_window.py new file mode 100644 index 0000000..42e1db9 --- /dev/null +++ b/cinnamon-dynamic-wallpaper@TobiZog/5.4/src/ui/main_window.py @@ -0,0 +1,712 @@ +############################################################ +# Imports # +############################################################ + +# GTK +import gi +gi.require_version("Gtk", "3.0") +from gi.repository import Gtk, GdkPixbuf + +# Packages +import time, subprocess +from datetime import timedelta + +# Local scripts +from model.main_view_model import * +from service.images import * +from service.location import * +from service.suntimes import * +from service.time_bar_chart import * +from ui.dialogs import * +from enums.ImageSourceEnum import * +from enums.NetworkLocationProvider import * +from enums.PeriodSourceEnum import * + + +class Main_Window: + ############################################################ + # Lifecycle # + ############################################################ + + def __init__(self) -> None: + """ Initialize all UI components which should be handleable + + Args: + builder (Gtk.Builder): Gtk self.builder resource + """ + # View Model + self.view_model = Main_View_Model() + + # Glade + self.builder = Gtk.Builder() + self.builder.add_from_file(self.view_model.GLADE_URI) + self.builder.connect_signals(self) + + + # Objects from scripts + self.images = Images() + self.dialogs = Dialogs() + self.location = Location() + self.suntimes = Suntimes() + self.time_bar_chart = Time_Bar_Chart() + + + # Page 1: Image Configuration + # Toggle Buttons + self.tb_image_set: Gtk.ToggleButton = self.builder.get_object("tb_image_set") + self.tb_heic_file: Gtk.ToggleButton = self.builder.get_object("tb_heic_file") + self.tb_source_folder: Gtk.ToggleButton = self.builder.get_object("tb_source_folder") + self.img_tb_image_set: Gtk.Image = self.builder.get_object("img_tb_image_set") + self.img_tb_heic_file: Gtk.Image = self.builder.get_object("img_tb_heic_file") + self.img_tb_source_folder: Gtk.Image = self.builder.get_object("img_tb_source_folder") + + # Image set + self.lbr_image_set: Gtk.ListBoxRow = self.builder.get_object("lbr_image_set") + self.cb_image_set: Gtk.ComboBox = self.builder.get_object("cb_image_set") + + # HEIC file + self.lbr_heic_file: Gtk.ListBoxRow = self.builder.get_object("lbr_heic_file") + + # Source folder + self.lbr_source_folder: Gtk.ListBoxRow = self.builder.get_object("lbr_source_folder") + self.btn_source_folder: Gtk.Button = self.builder.get_object("btn_source_folder") + self.lbl_source_folder: Gtk.Label = self.builder.get_object("lbl_source_folder") + + # Time bar chart + self.img_bar_images: Gtk.Image = self.builder.get_object("img_bar_images") + self.etr_periods: list[Gtk.Entry] = [ + self.builder.get_object("etr_period_1"), self.builder.get_object("etr_period_2"), + self.builder.get_object("etr_period_3"), self.builder.get_object("etr_period_4"), + self.builder.get_object("etr_period_5"), self.builder.get_object("etr_period_6"), + self.builder.get_object("etr_period_7"), self.builder.get_object("etr_period_8"), + self.builder.get_object("etr_period_9"), self.builder.get_object("etr_period_10"), + ] + + self.img_periods: list[Gtk.Image] = [ + self.builder.get_object("img_period_0"), self.builder.get_object("img_period_1"), + self.builder.get_object("img_period_2"), self.builder.get_object("img_period_3"), + self.builder.get_object("img_period_4"), self.builder.get_object("img_period_5"), + self.builder.get_object("img_period_6"), self.builder.get_object("img_period_7"), + self.builder.get_object("img_period_8"), self.builder.get_object("img_period_9"), + ] + + self.cb_periods: list[Gtk.ComboBox] = [ + self.builder.get_object("cb_period_0"), self.builder.get_object("cb_period_1"), + self.builder.get_object("cb_period_2"), self.builder.get_object("cb_period_3"), + self.builder.get_object("cb_period_4"), self.builder.get_object("cb_period_5"), + self.builder.get_object("cb_period_6"), self.builder.get_object("cb_period_7"), + self.builder.get_object("cb_period_8"), self.builder.get_object("cb_period_9"), + ] + + + #### Page 2: Location & Times + # Toggle Buttons + self.tb_network_location: Gtk.ToggleButton = self.builder.get_object("tb_network_location") + self.tb_custom_location: Gtk.ToggleButton = self.builder.get_object("tb_custom_location") + self.tb_time_periods: Gtk.ToggleButton = self.builder.get_object("tb_time_periods") + self.img_tb_network_location: Gtk.Image = self.builder.get_object("img_tb_network_location") + self.img_tb_custom_location: Gtk.Image = self.builder.get_object("img_tb_custom_location") + self.img_tb_time_periods: Gtk.Image = self.builder.get_object("img_tb_time_periods") + + # Network Location + self.lbr_network_refresh_time: Gtk.ListBoxRow = self.builder.get_object("lbr_network_refresh_time") + self.spb_network_refresh_time: Gtk.SpinButton = self.builder.get_object("spb_network_refresh_time") + self.lbr_network_provider: Gtk.ListBoxRow = self.builder.get_object("lbr_network_provider") + self.cb_network_provider: Gtk.ComboBox = self.builder.get_object("cb_network_provider") + self.lbr_current_location: Gtk.ListBoxRow = self.builder.get_object("lbr_current_location") + self.lb_current_location: Gtk.Label = self.builder.get_object("lb_current_location") + + # Custom location + self.lbr_custom_location_longitude: Gtk.ListBoxRow = self.builder.get_object("lbr_custom_location_longitude") + self.lbr_custom_location_latitude: Gtk.ListBoxRow = self.builder.get_object("lbr_custom_location_latitude") + self.lbr_time_periods: Gtk.ListBoxRow = self.builder.get_object("lbr_time_periods") + self.etr_longitude: Gtk.Entry = self.builder.get_object("etr_longitude") + self.etr_latitude: Gtk.Entry = self.builder.get_object("etr_latitude") + self.img_bar_times: Gtk.Image = self.builder.get_object("img_bar_times") + self.spb_periods_hour: list[Gtk.SpinButton] = [ + self.builder.get_object("spb_period_1_hour"), + self.builder.get_object("spb_period_2_hour"), + self.builder.get_object("spb_period_3_hour"), + self.builder.get_object("spb_period_4_hour"), + self.builder.get_object("spb_period_5_hour"), + self.builder.get_object("spb_period_6_hour"), + self.builder.get_object("spb_period_7_hour"), + self.builder.get_object("spb_period_8_hour"), + self.builder.get_object("spb_period_9_hour"), + ] + self.spb_periods_minute: list[Gtk.SpinButton] = [ + self.builder.get_object("spb_period_1_minute"), + self.builder.get_object("spb_period_2_minute"), + self.builder.get_object("spb_period_3_minute"), + self.builder.get_object("spb_period_4_minute"), + self.builder.get_object("spb_period_5_minute"), + self.builder.get_object("spb_period_6_minute"), + self.builder.get_object("spb_period_7_minute"), + self.builder.get_object("spb_period_8_minute"), + self.builder.get_object("spb_period_9_minute") + ] + self.lb_period_end: list[Gtk.Label] = [ + self.builder.get_object("lb_period_0_end"), self.builder.get_object("lb_period_1_end"), + self.builder.get_object("lb_period_2_end"), self.builder.get_object("lb_period_3_end"), + self.builder.get_object("lb_period_4_end"), self.builder.get_object("lb_period_5_end"), + self.builder.get_object("lb_period_6_end"), self.builder.get_object("lb_period_7_end"), + self.builder.get_object("lb_period_8_end"), self.builder.get_object("lb_period_9_end"), + ] + + + # Page 3: Behaviour + self.cb_picture_aspect: Gtk.ComboBox = self.builder.get_object("cb_picture_aspect") + self.sw_dynamic_background_color: Gtk.Switch = self.builder.get_object("sw_dynamic_background_color") + + + def show(self): + self.builder.get_object("window_main").show_all() + + # Smaller UI handling + if self.view_model.screen_height < self.view_model.breakpoint_ui: + self.img_tb_image_set.clear() + self.img_tb_heic_file.clear() + self.img_tb_source_folder.clear() + self.img_tb_network_location.clear() + self.img_tb_custom_location.clear() + self.img_tb_time_periods.clear() + + # Page 1: Image Configuration + self.add_items_to_combo_box(self.cb_image_set, self.view_model.image_sets) + + self.tb_image_set.set_active(self.view_model.cinnamon_prefs.image_source == ImageSourceEnum.IMAGESET) + self.tb_heic_file.set_active(self.view_model.cinnamon_prefs.image_source == ImageSourceEnum.HEICFILE) + self.tb_source_folder.set_active(self.view_model.cinnamon_prefs.image_source == ImageSourceEnum.SOURCEFOLDER) + + # Page 2: Location & Times + self.add_items_to_combo_box(self.cb_network_provider, self.view_model.network_location_provider) + + self.tb_network_location.set_active(self.view_model.cinnamon_prefs.period_source == PeriodSourceEnum.NETWORKLOCATION) + self.tb_custom_location.set_active(self.view_model.cinnamon_prefs.period_source == PeriodSourceEnum.CUSTOMLOCATION) + self.tb_time_periods.set_active(self.view_model.cinnamon_prefs.period_source == PeriodSourceEnum.CUSTOMTIMEPERIODS) + + # Page 3: Behaviour + self.add_items_to_combo_box(self.cb_picture_aspect, self.view_model.picture_aspects) + self.set_active_combobox_item(self.cb_picture_aspect, self.view_model.cinnamon_prefs.picture_aspect) + self.sw_dynamic_background_color.set_active(self.view_model.cinnamon_prefs.dynamic_background_color) + + + # Show the main window + Gtk.main() + + + ############################################################ + # UI Helper # + ############################################################ + + def set_active_combobox_item(self, combobox: Gtk.ComboBox, active_item: str): + """ Change active item in combobox by String value + + Args: + combobox (Gtk.ComboBoxText): ComboBox to set active + active_item (str): String item to set active + """ + list_store = combobox.get_model() + + for i in range(0, len(list_store)): + row = list_store[i] + if row[0] == active_item: + combobox.set_active(i) + + + def add_items_to_combo_box(self, combobox: Gtk.ComboBox, items: list): + """ Add items to a combo box + + Args: + combobox (Gtk.ComboBox): ComboBox where to add the options + items (list): Possible options + """ + model = combobox.get_model() + store = Gtk.ListStore(str) + + for image_set in items: + store.append([image_set]) + + combobox.set_model(store) + + if model == None: + renderer_text = Gtk.CellRendererText() + combobox.pack_start(renderer_text, True) + combobox.add_attribute(renderer_text, "text", 0) + + + def load_image_options_to_combo_boxes(self, options: list): + """ Add a list of Strings to all image option comboboxes + + Args: + options (list): All possible options + """ + options.insert(0, "") + + for combobox in self.cb_periods: + self.add_items_to_combo_box(combobox, options) + + + def load_image_to_preview(self, image_preview: Gtk.Image, image_src: str): + """ Scales the image to a lower resoultion and put them into the time bar chart + + Args: + image_preview (Gtk.Image): Gtk Image where it will be displayed + image_src (str): Absolute path to the image + """ + try: + pixbuf = GdkPixbuf.Pixbuf.new_from_file(image_src) + + # Scaling the images smaller for screens + if self.view_model.screen_height < self.view_model.breakpoint_ui: + pixbuf = pixbuf.scale_simple(221, 128, GdkPixbuf.InterpType.BILINEAR) + else: + pixbuf = pixbuf.scale_simple(260, 150, GdkPixbuf.InterpType.BILINEAR) + + image_preview.set_from_pixbuf(pixbuf) + except: + pass + + def refresh_charts(self): + self.view_model.refresh_charts() + + # Load to the views + pixbuf = GdkPixbuf.Pixbuf.new_from_file(self.view_model.TIMEBAR_URI_POLYLINES) + self.img_bar_images.set_from_pixbuf(pixbuf) + + pixbuf2 = GdkPixbuf.Pixbuf.new_from_file(self.view_model.TIMEBAR_URI) + self.img_bar_times.set_from_pixbuf(pixbuf2) + + + + + ############################################################ + # Callbacks # + ############################################################ + + ## Image Configuration + + # +-----------+-----------+---------------+ + # | Image Set | HEIC file | Source Folder | + # +-----------+-----------+---------------+ + + def on_toggle_button_image_set_clicked(self, button: Gtk.ToggleButton): + """ Clicked on ToggleButton "Image Set" + + Args: + button (Gtk.ToggleButton): Clicked ToggleButton + """ + if button.get_active(): + self.view_model.cinnamon_prefs.image_source = ImageSourceEnum.IMAGESET + self.tb_heic_file.set_active(False) + self.tb_source_folder.set_active(False) + + self.lbr_image_set.set_visible(True) + self.lbr_heic_file.set_visible(False) + self.lbr_source_folder.set_visible(False) + + self.set_active_combobox_item(self.cb_image_set, self.view_model.cinnamon_prefs.selected_image_set) + + for i, combobox in enumerate(self.cb_periods): + selected_image_name = self.view_model.cinnamon_prefs.period_images[i] + self.set_active_combobox_item(combobox, selected_image_name) + + # Make the comboboxes invisible + for combobox in self.cb_periods: + combobox.set_visible(False) + + + def on_toggle_button_heic_file_clicked(self, button: Gtk.ToggleButton): + """ Clicked on ToggleButton "Heic file" + + Args: + button (Gtk.ToggleButton): Clicked ToggleButton + """ + if button.get_active(): + self.view_model.cinnamon_prefs.image_source = ImageSourceEnum.HEICFILE + self.tb_image_set.set_active(False) + self.tb_source_folder.set_active(False) + + self.lbr_image_set.set_visible(False) + self.lbr_heic_file.set_visible(True) + self.lbr_source_folder.set_visible(False) + + # Make the comboboxes visible + for combobox in self.cb_periods: + combobox.set_visible(True) + + # Load images from source folder + files = self.images.get_images_from_folder(self.view_model.cinnamon_prefs.source_folder) + + if len(files) != 0: + self.load_image_options_to_combo_boxes(files) + + # Load the values for the images from the preferences + for i in range(0, 10): + self.set_active_combobox_item(self.cb_periods[i], self.view_model.cinnamon_prefs.period_images[i]) + else: + print("No image files!") + + + def on_toggle_button_source_folder_clicked(self, button: Gtk.ToggleButton): + """ Clicked on ToggleButton "Source Folder" + + Args: + button (Gtk.ToggleButton): Clicked ToggleButton + """ + if button.get_active(): + self.view_model.cinnamon_prefs.image_source = ImageSourceEnum.SOURCEFOLDER + self.tb_image_set.set_active(False) + self.tb_heic_file.set_active(False) + + self.lbr_image_set.set_visible(False) + self.lbr_heic_file.set_visible(False) + self.lbr_source_folder.set_visible(True) + + # Make the comboboxes visible + for combobox in self.cb_periods: + combobox.set_visible(True) + + # Load the source folder to the view + # This will update the comboboxes in the preview to contain the right items + self.lbl_source_folder.set_label(self.view_model.cinnamon_prefs.source_folder) + + # Load files from saved source folder + files = self.images.get_images_from_folder(self.view_model.cinnamon_prefs.source_folder) + + if len(files) != 0: + self.load_image_options_to_combo_boxes(files) + + # Load the values for the images from the preferences + for i in range(0, 10): + self.set_active_combobox_item(self.cb_periods[i], self.view_model.cinnamon_prefs.period_images[i]) + else: + print("No image files!") + + + + # +------------------------------------+ + # | Select an image set | aurora ▼ | + # +------------------------------------+ + + def on_cb_image_set_changed(self, combobox: Gtk.ComboBox): + """ User select on of the included image sets + + Args: + combobox (Gtk.ComboBox): The used ComboBox + """ + tree_iter = combobox.get_active_iter() + + if tree_iter is not None and self.view_model.cinnamon_prefs.image_source == ImageSourceEnum.IMAGESET: + # Get the selected value + model = combobox.get_model() + selected_image_set = model[tree_iter][0] + + # Store to the preferences + self.view_model.cinnamon_prefs.selected_image_set = selected_image_set + self.view_model.cinnamon_prefs.source_folder = \ + self.view_model.IMAGES_DIR + "/included_image_sets/" + selected_image_set + "/" + + # Load all possible options to the comboboxes + image_names = self.images.get_images_from_folder(self.view_model.cinnamon_prefs.source_folder) + self.load_image_options_to_combo_boxes(image_names) + + # Image sets have the same names for the images: + # 9.jpg = Period 0 + # 1.jpg = Period 1 + # 2.jpg = Period 2 + # and so on.... + for i in range(0, 10): + self.cb_periods[i].set_active(i + 1) + + + # +----------------------------------------------+ + # | Select a heic file to import | (None) 📄 | + # +----------------------------------------------+ + + def on_fc_heic_file_file_set(self, fc_button: Gtk.FileChooser): + """ User has a heic file selected with the FileChooserDialog + + Args: + fc_button (Gtk.FileChooser): Parameter about the selected file + """ + # The the absolute path to the heic file + file_path: str = fc_button.get_filename() + + # Extract the heic file + result = self.images.extract_heic_file(file_path) + + # Update the preferences + self.view_model.cinnamon_prefs.selected_image_set = "" + self.view_model.cinnamon_prefs.source_folder = self.view_model.IMAGES_DIR + "/extracted_images/" + + # Load images only if the extraction was successfully + if result: + # Collect all extracted images and push them to the comboboxes + image_names = self.images.get_images_from_folder(self.view_model.cinnamon_prefs.source_folder) + self.load_image_options_to_combo_boxes(image_names) + else: + self.dialogs.message_dialog("Error during extraction") + + + # +------------------------------------------------------------+ + # | Select a source folder | 📂 Open file selection dialog | + # | /home/developer/Downloads/ + # +------------------------------------------------------------+ + + def on_btn_source_folder_clicked(self, button: Gtk.Button): + """ Button to choose an image source folder was clicked + + Args: + button (Gtk.Button): The clicked button + """ + folder = self.dialogs.source_folder_dialog() + files = self.images.get_images_from_folder(folder) + + # Update the preferences + self.view_model.cinnamon_prefs.selected_image_set = "" + self.view_model.cinnamon_prefs.source_folder = folder + "/" + + # Update the label + self.lbl_source_folder.set_label(folder) + + # Update the image comboboxes + self.load_image_options_to_combo_boxes(files) + + # Load the values for the images from the preferences + for i in range(0, 10): + self.cb_periods[i].set_active(0) + + if len(files) == 1: + self.dialogs.message_dialog("No image files found!") + + + def on_cb_period_preview_changed(self, combobox: Gtk.ComboBox): + """ User select an image from the ComboBox for the time period + + Args: + combobox (Gtk.ComboBox): The used ComboBox + """ + tree_iter = combobox.get_active_iter() + + combobox_name = Gtk.Buildable.get_name(combobox) + period_index = int(combobox_name[10:11]) + + if tree_iter is not None: + # Get the selected value + model = combobox.get_model() + image_file_name = model[tree_iter][0] + + # Store selection to preferences + self.view_model.cinnamon_prefs.period_images[period_index] = image_file_name + + # Build up image path + image_path = self.view_model.cinnamon_prefs.source_folder + image_file_name + + self.load_image_to_preview(self.img_periods[period_index], image_path) + + + ## Location & Times + + def on_toggle_button_network_location_clicked(self, button: Gtk.ToggleButton): + """ User clicks on the ToggleButton for the network location + + Args: + button (Gtk.ToggleButton): Clicked ToggleButton + """ + if button.get_active(): + self.view_model.cinnamon_prefs.period_source = PeriodSourceEnum.NETWORKLOCATION + self.tb_custom_location.set_active(False) + self.tb_time_periods.set_active(False) + + self.lbr_network_refresh_time.set_visible(True) + self.lbr_current_location.set_visible(True) + self.lbr_custom_location_longitude.set_visible(False) + self.lbr_custom_location_latitude.set_visible(False) + self.lbr_time_periods.set_visible(False) + + self.spb_network_refresh_time.set_value(self.view_model.cinnamon_prefs.location_refresh_intervals) + + + # Display the location in the UI + current_location = self.location.get_location(NetworkLocationProvider.GEOJS) + self.lb_current_location.set_text("Latitude: " + current_location["latitude"] + \ + ", Longitude: " + current_location["longitude"]) + + # Store the location to the preferences + self.view_model.cinnamon_prefs.latitude_auto = float(current_location["latitude"]) + self.view_model.cinnamon_prefs.longitude_auto = float(current_location["longitude"]) + + self.refresh_charts() + + + def on_toggle_button_custom_location_clicked(self, button: Gtk.ToggleButton): + if button.get_active(): + self.view_model.cinnamon_prefs.period_source = PeriodSourceEnum.CUSTOMLOCATION + self.tb_network_location.set_active(False) + self.tb_time_periods.set_active(False) + + self.lbr_network_refresh_time.set_visible(False) + self.lbr_current_location.set_visible(False) + self.lbr_custom_location_longitude.set_visible(True) + self.lbr_custom_location_latitude.set_visible(True) + self.lbr_time_periods.set_visible(False) + + self.etr_latitude.set_text(str(self.view_model.cinnamon_prefs.latitude_custom)) + self.etr_longitude.set_text(str(self.view_model.cinnamon_prefs.longitude_custom)) + + + def on_toggle_button_time_periods_clicked(self, button: Gtk.ToggleButton): + if button.get_active(): + self.view_model.cinnamon_prefs.period_source = PeriodSourceEnum.CUSTOMTIMEPERIODS + self.tb_network_location.set_active(False) + self.tb_custom_location.set_active(False) + + self.lbr_network_refresh_time.set_visible(False) + self.lbr_current_location.set_visible(False) + self.lbr_custom_location_longitude.set_visible(False) + self.lbr_custom_location_latitude.set_visible(False) + self.lbr_time_periods.set_visible(True) + + + for i in range(0, 9): + pref_value = self.view_model.cinnamon_prefs.period_custom_start_time[i + 1] + time_parts = [int(pref_value[0:pref_value.find(":")]), int(pref_value[pref_value.find(":") + 1:])] + + self.spb_periods_hour[i].set_value(time_parts[0]) + self.spb_periods_minute[i].set_value(time_parts[1]) + + + + def on_spb_period_value_changed(self, spin_button: Gtk.SpinButton): + """ Callback if one of the time spinners (minute or hour) will be clicked + + (1) (2) (3) + Previous period Current period Next period + 12:34 - 14:40 14:41 - 16:20 16:21 - 17:30 + ^ + Variable to change + + Args: + spin_button (Gtk.SpinButton): SpinButton which was changed + """ + spin_button_name = Gtk.Buildable.get_name(spin_button) + index = int(spin_button_name[11:12]) - 1 + + # Determe time string and store to prefs + time_current_start = datetime(2024,1,1, int(self.spb_periods_hour[index].get_value()), int(self.spb_periods_minute[index].get_value())) + time_current_start_str = str(time_current_start.hour).rjust(2, '0') + ":" + str(time_current_start.minute).rjust(2, '0') + + self.view_model.cinnamon_prefs.period_custom_start_time[index + 1] = time_current_start_str + + + time_previous_end = time_current_start - timedelta(minutes=1) + self.lb_period_end[index].set_text(str(time_previous_end.hour).rjust(2, '0') + ":" + str(time_previous_end.minute).rjust(2, '0')) + + + self.refresh_charts() + + + def on_spb_network_location_refresh_time_changed(self, spin_button: Gtk.SpinButton): + """ User changed the refresh time of network location estimation + + Args: + spin_button (Gtk.SpinButton): The used SpinButton + """ + self.view_model.cinnamon_prefs.location_refresh_intervals = spin_button.get_value() + + + def on_etr_longitude_changed(self, entry: Gtk.Entry): + """ User changes the value of the longitude Entry + + Args: + entry (Gtk.Entry): The manipulated Entry object + """ + try: + self.view_model.cinnamon_prefs.longitude_custom = float(entry.get_text()) + self.refresh_chart() + except: + pass + + + def on_etr_latitude_changed(self, entry: Gtk.Entry): + """ User changes the value of the latitude Entry + + Args: + entry (Gtk.Entry): The manipulated Entry object + """ + try: + self.view_model.cinnamon_prefs.latitude_custom = float(entry.get_text()) + self.refresh_chart() + except: + pass + + + # Behaviour + + def on_cb_picture_aspect_changed(self, combobox: Gtk.ComboBox): + tree_iter = combobox.get_active_iter() + + if tree_iter is not None: + model = combobox.get_model() + self.view_model.cinnamon_prefs.picture_aspect = model[tree_iter][0] + + def on_sw_dynamic_background_color_state_set(self, switch: Gtk.Switch, state): + self.view_model.cinnamon_prefs.dynamic_background_color = state + + + # About + + def on_cinnamon_spices_website_button_clicked(self, _: Gtk.Button): + """ Callback for the button to navigate to the Cinnamon Spices web page of this project + + Args: + button (Gtk.Button): Button which was clicked + """ + subprocess.Popen(["xdg-open", "https://cinnamon-spices.linuxmint.com/extensions/view/97"]) + + + def on_github_website_button_clicked(self, _: Gtk.Button): + """ Callback for the button to navigate to the GitHub web page of this project + + Args: + button (Gtk.Button): Button which was clicked + """ + subprocess.Popen(["xdg-open", "https://github.com/TobiZog/cinnamon-dynamic-wallpaper"]) + + + def on_create_issue_button_clicked(self, _: Gtk.Button): + """ Callback for the button to navigate to the Issues page on GitHub of this project + + Args: + button (Gtk.Button): Button which was clicked + """ + subprocess.Popen(["xdg-open", "https://github.com/TobiZog/cinnamon-dynamic-wallpaper/issues/new"]) + + + def on_ok(self, *args): + """ Callback for the OK button in the top bar + """ + try: + self.on_apply() + except: + pass + + # Close the window + self.on_destroy() + + + def on_apply(self, *args): + """ Callback for the Apply button in the top bar + """ + # Store all values to the JSON file + self.view_model.cinnamon_prefs.store_preferences() + + # Use the new settings + # todo loop = Loop() + #loop.exchange_image() + + def on_destroy(self, *args): + """ Lifecycle handler when window will be destroyed + """ + Gtk.main_quit() \ No newline at end of file diff --git a/cinnamon-dynamic-wallpaper@TobiZog/icon.png b/cinnamon-dynamic-wallpaper@TobiZog/icon.png index 3c8c923..4fb4316 120000 --- a/cinnamon-dynamic-wallpaper@TobiZog/icon.png +++ b/cinnamon-dynamic-wallpaper@TobiZog/icon.png @@ -1 +1 @@ -5.4/icons/icon.png \ No newline at end of file +5.4/res/icons/icon.png \ No newline at end of file diff --git a/cinnamon-dynamic-wallpaper@TobiZog/icon.svg b/cinnamon-dynamic-wallpaper@TobiZog/icon.svg index 9f41539..cc60fb9 120000 --- a/cinnamon-dynamic-wallpaper@TobiZog/icon.svg +++ b/cinnamon-dynamic-wallpaper@TobiZog/icon.svg @@ -1 +1 @@ -5.4/icons/icon.svg \ No newline at end of file +5.4/res/icons/icon.svg \ No newline at end of file diff --git a/cinnamon-dynamic-wallpaper@TobiZog/metadata.json b/cinnamon-dynamic-wallpaper@TobiZog/metadata.json index 96dba18..cc6bfbe 100644 --- a/cinnamon-dynamic-wallpaper@TobiZog/metadata.json +++ b/cinnamon-dynamic-wallpaper@TobiZog/metadata.json @@ -1,9 +1,9 @@ { - "external-configuration-app": "preferences.py", + "external-configuration-app": "src/test.py", "uuid": "cinnamon-dynamic-wallpaper@TobiZog", "name": "Cinnamon Dynamic Wallpaper", "description": "Cinnamon extension for dynamic desktop backgrounds based on time and location", - "version": "2.1", + "version": "2.2", "multiversion": true, "cinnamon-version": [ "5.4",