#!/usr/bin/python3 """App configuration for Custom File Dialog""" import json from pathlib import Path import os from typing import Dict, Any from shared_libs.common_tools import Translate class AppConfig: """Central configuration and system setup manager for the Wire-Py application. This class serves as a singleton-like container for all global configuration data, including paths, UI settings, localization, versioning, and system-specific resources. It ensures that required directories, files, and services are created and configured before the application starts. Additionally, it provides tools for managing translations. Key Responsibilities: - Centralizes all configuration values (paths, UI preferences, localization). - Ensures required directories and files exist. - Handles translation setup via `gettext` for multilingual support. - Manages default settings file generation. - Configures autostart services using systemd for user-specific launch behavior. This class is used globally across the application to access configuration data consistently and perform system-level setup tasks. """ # Helper to make icon paths robust, so the script can be run from anywhere SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) MAX_ITEMS_TO_DISPLAY = 1000 # Base paths BASE_DIR: Path = Path.home() CONFIG_DIR: Path = BASE_DIR / ".config/cfiledialog" # UI configuration UI_CONFIG: Dict[str, Any] = { "window_size": (1050, 850), "window_min_size": (650, 550), "font_family": "Ubuntu", "font_size": 11, "resizable_window": (True, True), } # here is initializing the class for translation strings _ = Translate.setup_translations("custom_file_dialog") class CfdConfigManager: """ Manages CFD-specific settings using a JSON file for flexibility. """ _config = None _config_file = AppConfig.CONFIG_DIR / "cfd_settings.json" _default_settings = { "search_icon_pos": "left", # 'left' or 'right' "button_box_pos": "left", # 'left' or 'right' "window_size_preset": "1050x850", # e.g., "1050x850" "default_view_mode": "icons", # 'icons' or 'list' "search_hidden_files": False, # True or False "use_trash": False, # True or False "confirm_delete": False, # True or False "recursive_search": True, "use_pillow_animation": True } @classmethod def _ensure_config_file(cls): """Ensures the config file exists with default values if not present.""" if not cls._config_file.exists(): try: cls._config_file.parent.mkdir(parents=True, exist_ok=True) with open(cls._config_file, 'w', encoding='utf-8') as f: json.dump(cls._default_settings, f, indent=4) except IOError as e: print(f"Error creating default settings file: {e}") @classmethod def load(cls): """Loads settings from the JSON file, applying defaults for missing keys.""" cls._ensure_config_file() if cls._config is None: try: with open(cls._config_file, 'r', encoding='utf-8') as f: loaded_config = json.load(f) # Merge with defaults to ensure all keys are present cls._config = cls._default_settings.copy() cls._config.update(loaded_config) except (IOError, json.JSONDecodeError): cls._config = cls._default_settings.copy() return cls._config @classmethod def save(cls, settings): """Saves the given settings dictionary to the JSON file.""" try: with open(cls._config_file, 'w', encoding='utf-8') as f: json.dump(settings, f, indent=4) cls._config = settings # Update cached config except IOError as e: print(f"Error saving settings: {e}") class LocaleStrings: # Strings from custom_file_dialog.py CFD = { "title": _("Custom File Dialog"), "select_file": _("Select a file"), "open": _("Open"), "cancel": _("Cancel"), "file_label": _("File:"), "no_file_selected": _("No file selected"), "error_title": _("Error"), "select_file_error": _("Please select a file."), "all_files": _("All Files"), "free_space": _("Free Space"), "entries": _("entries"), "directory_not_found": _("Directory not found"), "unknown": _("Unknown"), "showing": _("Showing"), "of": _("of"), "access_denied": _("Access denied."), "path_not_found": _("Path not found"), "directory": _("Directory"), "not_found": _("not found."), "access_to": _("Access to"), "denied": _("denied."), } # Strings from cfd_view_manager.py VIEW = { "name": _("Name"), "date_modified": _("Date Modified"), "type": _("Type"), "size": _("Size"), "view_mode": _("View Mode"), "icon_view": _("Icon View"), "list_view": _("List View"), "filename": _("Filename"), "path": _("Path"), } # Strings from cfd_ui_setup.py UI = { "search": _("Search"), "go": _("Go"), "up": _("Up"), "back": _("Back"), "forward": _("Forward"), "home": _("Home"), "new_folder": _("New Folder"), "delete": _("Delete"), "settings": _("Settings"), "show_hidden_files": _("Show Hidden Files"), "places": _("Places"), "devices": _("Devices"), "bookmarks": _("Bookmarks"), "new_document": _("New Document"), "hide_hidden_files": _("Hide Hidden Files"), "start_search": _("Start Search"), "cancel_search": _("Cancel Search"), "delete_move": _("Delete/Move selected item"), "copy_filename_to_clipboard": _("Copy Filename to Clipboard"), "copy_path_to_clipboard": _("Copy Path to Clipboard"), "open_file_location": _("Open File Location"), "searching_for": _("Searching for"), "search_cancelled_by_user": _("Search cancelled by user"), "folders_and": _("folders and"), "files_found": _("files found."), "no_results_for": _("No results for"), "error_during_search": _("Error during search"), "search_error": _("Search Error"), } # Strings from cfd_settings_dialog.py SET = { "title": _("Settings"), "search_icon_pos_label": _("Search Icon Position"), "left_radio": _("Left"), "right_radio": _("Right"), "button_box_pos_label": _("Button Box Position"), "window_size_label": _("Window Size"), "default_view_mode_label": _("Default View Mode"), "icons_radio": _("Icons"), "list_radio": _("List"), "search_hidden_check": _("Search hidden files"), "use_trash_check": _("Use trash for deletion"), "confirm_delete_check": _("Confirm file deletion"), "recursive_search_check": _("Recursive search"), "use_pillow_check": _("Use Pillow animation"), "save_button": _("Save"), "cancel_button": _("Cancel"), "search_settings": _("Search Settings"), "deletion_settings": _("Deletion Settings"), "recommended": _("recommended"), "send2trash_not_found": _("send2trash library not found"), "animation_settings": _("Animation Settings"), "pillow": _("Pillow"), "pillow_not_found": _("Pillow library not found"), "animation_type": _("Animation Type"), "counter_arc": _("Counter Arc"), "double_arc": _("Double Arc"), "line": _("Line"), "blink": _("Blink"), "deletion_options_info": _("Deletion options are only available in save mode"), "reset_to_default": _("Reset to Default"), } # Strings from cfd_file_operations.py FILE = { "new_folder_title": _("New Folder"), "enter_folder_name_label": _("Enter folder name:"), "untitled_folder": _("Untitled Folder"), "error_title": _("Error"), "folder_exists_error": _("Folder already exists."), "create_folder_error": _("Could not create folder."), "confirm_delete_title": _("Confirm Deletion"), "confirm_delete_file_message": _("Are you sure you want to permanently delete this file?"), "confirm_delete_files_message": _("Are you sure you want to permanently delete these files?"), "delete_button": _("Delete"), "cancel_button": _("Cancel"), "file_not_found_error": _("File not found."), "trash_error": _("Could not move file to trash."), "delete_error": _("Could not delete file."), "folder": _("Folder"), "file": _("File"), "move_to_trash": _("move to trash"), "delete_permanently": _("delete permanently"), "are_you_sure": _("Are you sure you want to"), "was_successfully_removed": _("was successfully removed."), "error_removing": _("Error removing"), "new_document_txt": _("New Document.txt"), "error_creating": _("Error creating"), "copied_to_clipboard": _("copied to clipboard."), "error_renaming": _("Error renaming"), "not_accessible": _("not accessible"), } # Strings from cfd_navigation_manager.py NAV = { "home": _("Home"), "trash": _("Trash"), "desktop": _("Desktop"), "documents": _("Documents"), "downloads": _("Downloads"), "music": _("Music"), "pictures": _("Pictures"), "videos": _("Videos"), "computer": _("Computer"), }