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
+
+
+ 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, '')
- 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, '')
- 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",