Manages user configuration and settings
| 11 | |
| 12 | |
| 13 | class ConfigManager: |
| 14 | """Manages user configuration and settings""" |
| 15 | |
| 16 | def __init__(self): |
| 17 | # 使用绝对路径确保跨平台兼容性 |
| 18 | self.config_dir = Path(__file__).resolve().parent / "config" |
| 19 | self.config_file = self.config_dir / "settings.json" |
| 20 | self.settings = {} |
| 21 | |
| 22 | # Default settings |
| 23 | self.default_settings = { |
| 24 | "language": "zh_CN", |
| 25 | "first_run": True, |
| 26 | "window_geometry": "600x780", # 增加宽度从520到600 |
| 27 | "last_selected_ide": "VS Code", |
| 28 | "show_welcome": True, |
| 29 | "show_about_on_startup": True, |
| 30 | "theme": "default" |
| 31 | } |
| 32 | |
| 33 | # Ensure config directory exists |
| 34 | self._ensure_config_dir() |
| 35 | |
| 36 | # Load existing settings |
| 37 | self._load_settings() |
| 38 | |
| 39 | def _ensure_config_dir(self): |
| 40 | """Ensure config directory exists""" |
| 41 | try: |
| 42 | self.config_dir.mkdir(exist_ok=True, parents=True) |
| 43 | # 在macOS上确保目录权限正确 |
| 44 | if os.name == 'posix': |
| 45 | os.chmod(self.config_dir, 0o755) |
| 46 | except Exception as e: |
| 47 | print(f"Error creating config directory: {e}") |
| 48 | print(f"Config directory path: {self.config_dir}") |
| 49 | |
| 50 | def _load_settings(self): |
| 51 | """Load settings from file""" |
| 52 | try: |
| 53 | if self.config_file.exists(): |
| 54 | with open(self.config_file, 'r', encoding='utf-8') as f: |
| 55 | loaded_settings = json.load(f) |
| 56 | # Merge with defaults to ensure all keys exist |
| 57 | self.settings = {**self.default_settings, **loaded_settings} |
| 58 | else: |
| 59 | # Use defaults for first run |
| 60 | self.settings = self.default_settings.copy() |
| 61 | self._save_settings() |
| 62 | except Exception as e: |
| 63 | print(f"Error loading settings: {e}") |
| 64 | self.settings = self.default_settings.copy() |
| 65 | |
| 66 | def _save_settings(self): |
| 67 | """Save settings to file""" |
| 68 | try: |
| 69 | with open(self.config_file, 'w', encoding='utf-8') as f: |
| 70 | json.dump(self.settings, f, indent=2, ensure_ascii=False) |
no outgoing calls
no test coverage detected