clapp-pm 1.0.42__py3-none-any.whl → 1.0.43__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,830 @@
1
+ """
2
+ PyCloud OS Rain Wallpaper
3
+ Sistem temalı ve kullanıcıya özel duvar kağıdı yöneticisi
4
+ """
5
+
6
+ import os
7
+ import json
8
+ import logging
9
+ from pathlib import Path
10
+ from typing import Dict, List, Optional, Any, Callable
11
+ from dataclasses import dataclass, asdict
12
+ from enum import Enum
13
+
14
+ try:
15
+ from PyQt6.QtWidgets import (QWidget, QLabel, QVBoxLayout, QHBoxLayout,
16
+ QPushButton, QFileDialog, QMessageBox, QDialog,
17
+ QGridLayout, QScrollArea, QFrame, QSlider,
18
+ QComboBox, QCheckBox, QSpinBox)
19
+ from PyQt6.QtCore import Qt, QTimer, pyqtSignal, QSize, QRect
20
+ from PyQt6.QtGui import QPixmap, QPainter, QBrush, QColor, QPalette
21
+ PYQT_AVAILABLE = True
22
+ except ImportError:
23
+ PYQT_AVAILABLE = False
24
+ # Dummy classes for type hints
25
+ class QSize:
26
+ pass
27
+ class QPixmap:
28
+ pass
29
+
30
+ class WallpaperMode(Enum):
31
+ """Duvar kağıdı modları"""
32
+ STRETCH = "stretch"
33
+ FIT = "fit"
34
+ FILL = "fill"
35
+ CENTER = "center"
36
+ TILE = "tile"
37
+
38
+ class WallpaperType(Enum):
39
+ """Duvar kağıdı türleri"""
40
+ STATIC = "static"
41
+ SLIDESHOW = "slideshow"
42
+ SOLID_COLOR = "solid_color"
43
+
44
+ @dataclass
45
+ class WallpaperConfig:
46
+ """Duvar kağıdı yapılandırması"""
47
+ wallpaper_type: WallpaperType = WallpaperType.STATIC
48
+ current_path: str = ""
49
+ mode: WallpaperMode = WallpaperMode.FILL
50
+ slideshow_paths: List[str] = None
51
+ slideshow_interval: int = 300 # saniye
52
+ solid_color: str = "#2d2d2d"
53
+ blur_amount: int = 0
54
+ brightness: float = 1.0
55
+ contrast: float = 1.0
56
+
57
+ def __post_init__(self):
58
+ if self.slideshow_paths is None:
59
+ self.slideshow_paths = []
60
+
61
+ def to_dict(self) -> Dict:
62
+ """Dict'e çevir"""
63
+ data = asdict(self)
64
+ data['wallpaper_type'] = self.wallpaper_type.value
65
+ data['mode'] = self.mode.value
66
+ return data
67
+
68
+ @classmethod
69
+ def from_dict(cls, data: Dict) -> 'WallpaperConfig':
70
+ """Dict'ten oluştur"""
71
+ data['wallpaper_type'] = WallpaperType(data.get('wallpaper_type', 'static'))
72
+ data['mode'] = WallpaperMode(data.get('mode', 'fill'))
73
+ return cls(**data)
74
+
75
+ class WallpaperManager:
76
+ """Duvar kağıdı yöneticisi"""
77
+
78
+ def __init__(self, kernel=None):
79
+ self.kernel = kernel
80
+ self.logger = logging.getLogger("WallpaperManager")
81
+
82
+ # Dizinler
83
+ self.system_wallpapers_dir = Path("system/wallpapers")
84
+ self.user_wallpapers_dir = Path("users/wallpapers")
85
+ self.system_wallpapers_dir.mkdir(parents=True, exist_ok=True)
86
+ self.user_wallpapers_dir.mkdir(parents=True, exist_ok=True)
87
+
88
+ # Yapılandırma
89
+ self.config_file = Path("users/wallpaper_config.json")
90
+ self.config = WallpaperConfig()
91
+
92
+ # Slideshow timer
93
+ self.slideshow_timer = None
94
+ self.slideshow_index = 0
95
+
96
+ # Cache
97
+ self.wallpaper_cache: Dict[str, QPixmap] = {}
98
+
99
+ # Başlangıç
100
+ self.create_default_wallpapers()
101
+ self.load_config()
102
+ self.setup_slideshow_timer()
103
+
104
+ def create_default_wallpapers(self):
105
+ """Varsayılan duvar kağıtları oluştur"""
106
+ try:
107
+ # PyQt6 kullanılamıyorsa atlayalım
108
+ if not PYQT_AVAILABLE:
109
+ self.logger.warning("PyQt6 not available, skipping default wallpaper creation")
110
+ return
111
+
112
+ # QApplication henüz başlatılmamışsa atlayalım
113
+ from PyQt6.QtWidgets import QApplication
114
+ if QApplication.instance() is None:
115
+ self.logger.info("QApplication not available yet, will create wallpapers later")
116
+ return
117
+
118
+ # Sistem duvar kağıtları için placeholder'lar
119
+ default_wallpapers = [
120
+ ("default_dark.png", "#1e1e1e"),
121
+ ("default_light.png", "#f5f5f5"),
122
+ ("gradient_blue.png", "#2196F3"),
123
+ ("gradient_purple.png", "#9C27B0"),
124
+ ]
125
+
126
+ for filename, color in default_wallpapers:
127
+ wallpaper_path = self.system_wallpapers_dir / filename
128
+ if not wallpaper_path.exists():
129
+ self.create_solid_color_wallpaper(color, wallpaper_path)
130
+
131
+ self.logger.info("Default wallpapers created")
132
+
133
+ except Exception as e:
134
+ self.logger.error(f"Failed to create default wallpapers: {e}")
135
+
136
+ def create_solid_color_wallpaper(self, color: str, output_path: Path, size: tuple = (1920, 1080)):
137
+ """Düz renk duvar kağıdı oluştur"""
138
+ try:
139
+ if not PYQT_AVAILABLE:
140
+ return
141
+
142
+ pixmap = QPixmap(*size)
143
+ pixmap.fill(QColor(color))
144
+
145
+ # Gradient efekti ekle
146
+ painter = QPainter(pixmap)
147
+ gradient_color = QColor(color)
148
+ gradient_color.setAlpha(50)
149
+
150
+ # Köşelerden merkeze doğru gradient
151
+ for i in range(min(size) // 4):
152
+ painter.setPen(gradient_color)
153
+ painter.drawRect(i, i, size[0] - 2*i, size[1] - 2*i)
154
+
155
+ painter.end()
156
+
157
+ pixmap.save(str(output_path))
158
+
159
+ except Exception as e:
160
+ self.logger.error(f"Failed to create solid color wallpaper: {e}")
161
+
162
+ def load_config(self):
163
+ """Yapılandırmayı yükle"""
164
+ try:
165
+ if self.config_file.exists():
166
+ with open(self.config_file, 'r', encoding='utf-8') as f:
167
+ config_data = json.load(f)
168
+
169
+ self.config = WallpaperConfig.from_dict(config_data)
170
+
171
+ # Mevcut duvar kağıdının var olup olmadığını kontrol et
172
+ if self.config.current_path and not Path(self.config.current_path).exists():
173
+ self.logger.warning(f"Current wallpaper not found: {self.config.current_path}")
174
+ self.config.current_path = ""
175
+
176
+ # Eğer duvar kağıdı ayarlanmamışsa varsayılanı kullan
177
+ if not self.config.current_path:
178
+ # Önce default.png'yi kontrol et
179
+ default_wallpaper = self.system_wallpapers_dir / "default.png"
180
+ if default_wallpaper.exists():
181
+ self.config.current_path = str(default_wallpaper)
182
+ self.logger.info(f"Using default.png wallpaper: {default_wallpaper}")
183
+ else:
184
+ # Fallback: default_dark.png
185
+ fallback_wallpaper = self.system_wallpapers_dir / "default_dark.png"
186
+ if fallback_wallpaper.exists():
187
+ self.config.current_path = str(fallback_wallpaper)
188
+ self.logger.info(f"Using fallback wallpaper: {fallback_wallpaper}")
189
+
190
+ self.save_config()
191
+
192
+ self.logger.info(f"Wallpaper config loaded: {self.config.current_path}")
193
+
194
+ except Exception as e:
195
+ self.logger.error(f"Failed to load wallpaper config: {e}")
196
+ # Hata durumunda default.png'yi kullanmaya çalış
197
+ default_wallpaper = self.system_wallpapers_dir / "default.png"
198
+ if default_wallpaper.exists():
199
+ self.config.current_path = str(default_wallpaper)
200
+ self.save_config()
201
+
202
+ def save_config(self):
203
+ """Yapılandırmayı kaydet"""
204
+ try:
205
+ with open(self.config_file, 'w', encoding='utf-8') as f:
206
+ json.dump(self.config.to_dict(), f, indent=2, ensure_ascii=False)
207
+
208
+ except Exception as e:
209
+ self.logger.error(f"Failed to save wallpaper config: {e}")
210
+
211
+ def setup_slideshow_timer(self):
212
+ """Slideshow timer'ını ayarla"""
213
+ if PYQT_AVAILABLE and self.config.wallpaper_type == WallpaperType.SLIDESHOW:
214
+ if self.slideshow_timer:
215
+ self.slideshow_timer.stop()
216
+
217
+ self.slideshow_timer = QTimer()
218
+ self.slideshow_timer.timeout.connect(self.next_slideshow_wallpaper)
219
+ self.slideshow_timer.start(self.config.slideshow_interval * 1000)
220
+
221
+ def get_available_wallpapers(self) -> List[Dict]:
222
+ """Mevcut duvar kağıtlarını al"""
223
+ wallpapers = []
224
+
225
+ # Sistem duvar kağıtları - tüm desteklenen formatları kontrol et
226
+ for wallpaper_path in self.system_wallpapers_dir.glob("*"):
227
+ if wallpaper_path.suffix.lower() in ['.png', '.jpg', '.jpeg', '.bmp', '.webp']:
228
+ wallpapers.append({
229
+ "name": wallpaper_path.stem,
230
+ "path": str(wallpaper_path),
231
+ "type": "system",
232
+ "size": self.get_image_size(wallpaper_path)
233
+ })
234
+
235
+ # Kullanıcı duvar kağıtları
236
+ for wallpaper_path in self.user_wallpapers_dir.glob("*"):
237
+ if wallpaper_path.suffix.lower() in ['.png', '.jpg', '.jpeg', '.bmp', '.webp']:
238
+ wallpapers.append({
239
+ "name": wallpaper_path.stem,
240
+ "path": str(wallpaper_path),
241
+ "type": "user",
242
+ "size": self.get_image_size(wallpaper_path)
243
+ })
244
+
245
+ # Alfabetik olarak sırala
246
+ wallpapers.sort(key=lambda x: x["name"].lower())
247
+
248
+ return wallpapers
249
+
250
+ def get_image_size(self, image_path: Path) -> tuple:
251
+ """Resim boyutunu al"""
252
+ try:
253
+ if PYQT_AVAILABLE:
254
+ pixmap = QPixmap(str(image_path))
255
+ return (pixmap.width(), pixmap.height())
256
+ return (0, 0)
257
+ except:
258
+ return (0, 0)
259
+
260
+ def set_wallpaper(self, wallpaper_path: str, mode: WallpaperMode = None) -> bool:
261
+ """Duvar kağıdını ayarla"""
262
+ try:
263
+ if not Path(wallpaper_path).exists():
264
+ self.logger.error(f"Wallpaper not found: {wallpaper_path}")
265
+ return False
266
+
267
+ self.config.wallpaper_type = WallpaperType.STATIC
268
+ self.config.current_path = wallpaper_path
269
+
270
+ if mode:
271
+ self.config.mode = mode
272
+
273
+ self.save_config()
274
+ self.apply_wallpaper()
275
+
276
+ self.logger.info(f"Wallpaper set: {wallpaper_path}")
277
+ return True
278
+
279
+ except Exception as e:
280
+ self.logger.error(f"Failed to set wallpaper: {e}")
281
+ return False
282
+
283
+ def set_solid_color(self, color: str) -> bool:
284
+ """Düz renk duvar kağıdı ayarla"""
285
+ try:
286
+ self.config.wallpaper_type = WallpaperType.SOLID_COLOR
287
+ self.config.solid_color = color
288
+
289
+ self.save_config()
290
+ self.apply_wallpaper()
291
+
292
+ self.logger.info(f"Solid color wallpaper set: {color}")
293
+ return True
294
+
295
+ except Exception as e:
296
+ self.logger.error(f"Failed to set solid color: {e}")
297
+ return False
298
+
299
+ def set_slideshow(self, wallpaper_paths: List[str], interval: int = 300) -> bool:
300
+ """Slideshow ayarla"""
301
+ try:
302
+ # Geçerli dosyaları filtrele
303
+ valid_paths = [path for path in wallpaper_paths if Path(path).exists()]
304
+
305
+ if not valid_paths:
306
+ self.logger.error("No valid wallpapers for slideshow")
307
+ return False
308
+
309
+ self.config.wallpaper_type = WallpaperType.SLIDESHOW
310
+ self.config.slideshow_paths = valid_paths
311
+ self.config.slideshow_interval = interval
312
+ self.slideshow_index = 0
313
+
314
+ self.save_config()
315
+ self.setup_slideshow_timer()
316
+ self.apply_wallpaper()
317
+
318
+ self.logger.info(f"Slideshow set with {len(valid_paths)} wallpapers")
319
+ return True
320
+
321
+ except Exception as e:
322
+ self.logger.error(f"Failed to set slideshow: {e}")
323
+ return False
324
+
325
+ def next_slideshow_wallpaper(self):
326
+ """Slideshow'da sonraki duvar kağıdına geç"""
327
+ try:
328
+ if (self.config.wallpaper_type == WallpaperType.SLIDESHOW and
329
+ self.config.slideshow_paths):
330
+
331
+ self.slideshow_index = (self.slideshow_index + 1) % len(self.config.slideshow_paths)
332
+ self.config.current_path = self.config.slideshow_paths[self.slideshow_index]
333
+
334
+ self.apply_wallpaper()
335
+
336
+ except Exception as e:
337
+ self.logger.error(f"Failed to switch slideshow wallpaper: {e}")
338
+
339
+ def apply_wallpaper(self):
340
+ """Duvar kağıdını uygula"""
341
+ try:
342
+ if not self.kernel:
343
+ return
344
+
345
+ # QApplication kontrolü
346
+ if not PYQT_AVAILABLE:
347
+ return
348
+
349
+ from PyQt6.QtWidgets import QApplication
350
+ if QApplication.instance() is None:
351
+ self.logger.info("QApplication not ready, wallpaper will be applied later")
352
+ return
353
+
354
+ ui = self.kernel.get_module("ui")
355
+ if not ui or not hasattr(ui, 'desktop'):
356
+ return
357
+
358
+ desktop = ui.desktop
359
+
360
+ # Varsayılan duvar kağıtlarını kontrol et
361
+ self.ensure_default_wallpapers()
362
+
363
+ if self.config.wallpaper_type == WallpaperType.SOLID_COLOR:
364
+ self.apply_solid_color(desktop)
365
+ else:
366
+ self.apply_image_wallpaper(desktop)
367
+
368
+ except Exception as e:
369
+ self.logger.error(f"Failed to apply wallpaper: {e}")
370
+
371
+ def ensure_default_wallpapers(self):
372
+ """Varsayılan duvar kağıtlarının varlığını garanti et"""
373
+ try:
374
+ # QApplication kontrolü
375
+ if not PYQT_AVAILABLE:
376
+ return
377
+
378
+ from PyQt6.QtWidgets import QApplication
379
+ if QApplication.instance() is None:
380
+ return
381
+
382
+ # Varsayılan duvar kağıtlarını oluştur
383
+ default_wallpapers = [
384
+ ("default_dark.png", "#1e1e1e"),
385
+ ("default_light.png", "#f5f5f5"),
386
+ ("gradient_blue.png", "#2196F3"),
387
+ ("gradient_purple.png", "#9C27B0"),
388
+ ]
389
+
390
+ for filename, color in default_wallpapers:
391
+ wallpaper_path = self.system_wallpapers_dir / filename
392
+ if not wallpaper_path.exists():
393
+ self.create_solid_color_wallpaper(color, wallpaper_path)
394
+
395
+ except Exception as e:
396
+ self.logger.error(f"Failed to ensure default wallpapers: {e}")
397
+
398
+ def apply_solid_color(self, desktop_widget):
399
+ """Düz renk duvar kağıdı uygula"""
400
+ try:
401
+ if not PYQT_AVAILABLE:
402
+ return
403
+
404
+ color = self.config.solid_color
405
+ desktop_widget.setStyleSheet(f"""
406
+ QWidget {{
407
+ background-color: {color};
408
+ }}
409
+ """)
410
+
411
+ except Exception as e:
412
+ self.logger.error(f"Failed to apply solid color: {e}")
413
+
414
+ def apply_image_wallpaper(self, desktop_widget):
415
+ """Resim duvar kağıdı uygula"""
416
+ try:
417
+ if not PYQT_AVAILABLE or not self.config.current_path:
418
+ return
419
+
420
+ wallpaper_path = self.config.current_path
421
+
422
+ # Cache'den al veya yükle
423
+ if wallpaper_path in self.wallpaper_cache:
424
+ pixmap = self.wallpaper_cache[wallpaper_path]
425
+ else:
426
+ pixmap = QPixmap(wallpaper_path)
427
+ if pixmap.isNull():
428
+ self.logger.error(f"Failed to load wallpaper: {wallpaper_path}")
429
+ return
430
+
431
+ # Efektleri uygula
432
+ pixmap = self.apply_effects(pixmap)
433
+ self.wallpaper_cache[wallpaper_path] = pixmap
434
+
435
+ # Desktop boyutunu al
436
+ desktop_size = desktop_widget.size()
437
+
438
+ # Modu uygula
439
+ scaled_pixmap = self.scale_wallpaper(pixmap, desktop_size, self.config.mode)
440
+
441
+ # Stylesheet oluştur
442
+ # PyQt6'da background-image için geçici dosya kullanmak gerekebilir
443
+ temp_path = Path("temp/current_wallpaper.png")
444
+ temp_path.parent.mkdir(exist_ok=True)
445
+ scaled_pixmap.save(str(temp_path))
446
+
447
+ desktop_widget.setStyleSheet(f"""
448
+ QWidget {{
449
+ background-image: url({temp_path});
450
+ background-repeat: no-repeat;
451
+ background-position: center;
452
+ }}
453
+ """)
454
+
455
+ except Exception as e:
456
+ self.logger.error(f"Failed to apply image wallpaper: {e}")
457
+
458
+ def apply_effects(self, pixmap: QPixmap) -> QPixmap:
459
+ """Duvar kağıdına efektler uygula"""
460
+ try:
461
+ if not PYQT_AVAILABLE:
462
+ return pixmap
463
+
464
+ # Brightness ve contrast ayarları
465
+ if self.config.brightness != 1.0 or self.config.contrast != 1.0:
466
+ # Basit brightness/contrast implementasyonu
467
+ # Gerçek uygulamada daha gelişmiş efektler kullanılabilir
468
+ pass
469
+
470
+ # Blur efekti
471
+ if self.config.blur_amount > 0:
472
+ # Blur implementasyonu
473
+ pass
474
+
475
+ return pixmap
476
+
477
+ except Exception as e:
478
+ self.logger.error(f"Failed to apply effects: {e}")
479
+ return pixmap
480
+
481
+ def scale_wallpaper(self, pixmap: QPixmap, target_size: QSize, mode: WallpaperMode) -> QPixmap:
482
+ """Duvar kağıdını ölçekle"""
483
+ try:
484
+ if not PYQT_AVAILABLE:
485
+ return pixmap
486
+
487
+ if mode == WallpaperMode.STRETCH:
488
+ return pixmap.scaled(target_size, Qt.AspectRatioMode.IgnoreAspectRatio,
489
+ Qt.TransformationMode.SmoothTransformation)
490
+
491
+ elif mode == WallpaperMode.FIT:
492
+ return pixmap.scaled(target_size, Qt.AspectRatioMode.KeepAspectRatio,
493
+ Qt.TransformationMode.SmoothTransformation)
494
+
495
+ elif mode == WallpaperMode.FILL:
496
+ return pixmap.scaled(target_size, Qt.AspectRatioMode.KeepAspectRatioByExpanding,
497
+ Qt.TransformationMode.SmoothTransformation)
498
+
499
+ elif mode == WallpaperMode.CENTER:
500
+ # Merkeze yerleştir, ölçekleme yok
501
+ result = QPixmap(target_size)
502
+ result.fill(Qt.GlobalColor.black)
503
+
504
+ painter = QPainter(result)
505
+ x = (target_size.width() - pixmap.width()) // 2
506
+ y = (target_size.height() - pixmap.height()) // 2
507
+ painter.drawPixmap(x, y, pixmap)
508
+ painter.end()
509
+
510
+ return result
511
+
512
+ elif mode == WallpaperMode.TILE:
513
+ # Döşeme modu
514
+ result = QPixmap(target_size)
515
+ painter = QPainter(result)
516
+
517
+ for x in range(0, target_size.width(), pixmap.width()):
518
+ for y in range(0, target_size.height(), pixmap.height()):
519
+ painter.drawPixmap(x, y, pixmap)
520
+
521
+ painter.end()
522
+ return result
523
+
524
+ return pixmap
525
+
526
+ except Exception as e:
527
+ self.logger.error(f"Failed to scale wallpaper: {e}")
528
+ return pixmap
529
+
530
+ def add_wallpaper(self, source_path: str) -> bool:
531
+ """Yeni duvar kağıdı ekle"""
532
+ try:
533
+ source = Path(source_path)
534
+ if not source.exists():
535
+ return False
536
+
537
+ # Hedef dosya adı
538
+ target_name = source.name
539
+ target_path = self.user_wallpapers_dir / target_name
540
+
541
+ # Aynı isimde dosya varsa yeni isim oluştur
542
+ counter = 1
543
+ while target_path.exists():
544
+ name_parts = source.stem, counter, source.suffix
545
+ target_name = f"{name_parts[0]}_{name_parts[1]}{name_parts[2]}"
546
+ target_path = self.user_wallpapers_dir / target_name
547
+ counter += 1
548
+
549
+ # Dosyayı kopyala
550
+ import shutil
551
+ shutil.copy2(source, target_path)
552
+
553
+ self.logger.info(f"Wallpaper added: {target_path}")
554
+ return True
555
+
556
+ except Exception as e:
557
+ self.logger.error(f"Failed to add wallpaper: {e}")
558
+ return False
559
+
560
+ def remove_wallpaper(self, wallpaper_path: str) -> bool:
561
+ """Duvar kağıdını kaldır"""
562
+ try:
563
+ path = Path(wallpaper_path)
564
+
565
+ # Sistem duvar kağıtlarını silmeye izin verme
566
+ if path.parent == self.system_wallpapers_dir:
567
+ self.logger.warning("Cannot remove system wallpaper")
568
+ return False
569
+
570
+ if path.exists():
571
+ path.unlink()
572
+
573
+ # Cache'den kaldır
574
+ if wallpaper_path in self.wallpaper_cache:
575
+ del self.wallpaper_cache[wallpaper_path]
576
+
577
+ self.logger.info(f"Wallpaper removed: {wallpaper_path}")
578
+ return True
579
+
580
+ return False
581
+
582
+ except Exception as e:
583
+ self.logger.error(f"Failed to remove wallpaper: {e}")
584
+ return False
585
+
586
+ def show_wallpaper_dialog(self) -> bool:
587
+ """Duvar kağıdı seçim dialogu göster"""
588
+ try:
589
+ if not PYQT_AVAILABLE:
590
+ return False
591
+
592
+ dialog = WallpaperDialog(self)
593
+ return dialog.exec() == QDialog.DialogCode.Accepted
594
+
595
+ except Exception as e:
596
+ self.logger.error(f"Failed to show wallpaper dialog: {e}")
597
+ return False
598
+
599
+ def shutdown(self):
600
+ """Wallpaper manager'ı kapat"""
601
+ try:
602
+ if self.slideshow_timer:
603
+ self.slideshow_timer.stop()
604
+
605
+ self.wallpaper_cache.clear()
606
+ self.save_config()
607
+
608
+ self.logger.info("Wallpaper manager shutdown completed")
609
+
610
+ except Exception as e:
611
+ self.logger.error(f"Wallpaper manager shutdown failed: {e}")
612
+
613
+ class WallpaperDialog(QDialog if PYQT_AVAILABLE else object):
614
+ """Duvar kağıdı seçim dialogu"""
615
+
616
+ def __init__(self, wallpaper_manager: WallpaperManager):
617
+ super().__init__()
618
+ self.wallpaper_manager = wallpaper_manager
619
+ self.selected_wallpaper = None
620
+
621
+ self.setup_ui()
622
+ self.load_wallpapers()
623
+
624
+ def setup_ui(self):
625
+ """Arayüzü kur"""
626
+ self.setWindowTitle("Duvar Kağıdı Seçici")
627
+ self.setFixedSize(800, 600)
628
+
629
+ layout = QVBoxLayout(self)
630
+
631
+ # Üst kontroller
632
+ controls_layout = QHBoxLayout()
633
+
634
+ # Duvar kağıdı türü
635
+ self.type_combo = QComboBox()
636
+ self.type_combo.addItems(["Statik", "Slideshow", "Düz Renk"])
637
+ self.type_combo.currentTextChanged.connect(self.on_type_changed)
638
+ controls_layout.addWidget(QLabel("Tür:"))
639
+ controls_layout.addWidget(self.type_combo)
640
+
641
+ controls_layout.addStretch()
642
+
643
+ # Duvar kağıdı ekle
644
+ add_btn = QPushButton("📁 Duvar Kağıdı Ekle")
645
+ add_btn.clicked.connect(self.add_wallpaper)
646
+ controls_layout.addWidget(add_btn)
647
+
648
+ layout.addLayout(controls_layout)
649
+
650
+ # Duvar kağıdı listesi
651
+ self.scroll_area = QScrollArea()
652
+ self.wallpaper_widget = QWidget()
653
+ self.wallpaper_layout = QGridLayout(self.wallpaper_widget)
654
+ self.scroll_area.setWidget(self.wallpaper_widget)
655
+ self.scroll_area.setWidgetResizable(True)
656
+ layout.addWidget(self.scroll_area)
657
+
658
+ # Alt kontroller
659
+ bottom_layout = QHBoxLayout()
660
+
661
+ # Mod seçimi
662
+ self.mode_combo = QComboBox()
663
+ self.mode_combo.addItems(["Doldur", "Sığdır", "Uzat", "Merkez", "Döşe"])
664
+ bottom_layout.addWidget(QLabel("Mod:"))
665
+ bottom_layout.addWidget(self.mode_combo)
666
+
667
+ bottom_layout.addStretch()
668
+
669
+ # Butonlar
670
+ apply_btn = QPushButton("Uygula")
671
+ apply_btn.clicked.connect(self.apply_wallpaper)
672
+ bottom_layout.addWidget(apply_btn)
673
+
674
+ cancel_btn = QPushButton("İptal")
675
+ cancel_btn.clicked.connect(self.reject)
676
+ bottom_layout.addWidget(cancel_btn)
677
+
678
+ layout.addLayout(bottom_layout)
679
+
680
+ def load_wallpapers(self):
681
+ """Duvar kağıtlarını yükle"""
682
+ try:
683
+ # Mevcut widget'ları temizle
684
+ for i in reversed(range(self.wallpaper_layout.count())):
685
+ self.wallpaper_layout.itemAt(i).widget().setParent(None)
686
+
687
+ wallpapers = self.wallpaper_manager.get_available_wallpapers()
688
+
689
+ row, col = 0, 0
690
+ max_cols = 4
691
+
692
+ for wallpaper in wallpapers:
693
+ preview = self.create_wallpaper_preview(wallpaper)
694
+ self.wallpaper_layout.addWidget(preview, row, col)
695
+
696
+ col += 1
697
+ if col >= max_cols:
698
+ col = 0
699
+ row += 1
700
+
701
+ except Exception as e:
702
+ self.wallpaper_manager.logger.error(f"Failed to load wallpapers: {e}")
703
+
704
+ def create_wallpaper_preview(self, wallpaper: Dict) -> QWidget:
705
+ """Duvar kağıdı önizlemesi oluştur"""
706
+ try:
707
+ preview = QFrame()
708
+ preview.setFixedSize(150, 120)
709
+ preview.setFrameStyle(QFrame.Shape.Box)
710
+ preview.setStyleSheet("""
711
+ QFrame {
712
+ border: 2px solid #404040;
713
+ border-radius: 8px;
714
+ background-color: #2d2d2d;
715
+ }
716
+ QFrame:hover {
717
+ border-color: #2196F3;
718
+ }
719
+ """)
720
+
721
+ layout = QVBoxLayout(preview)
722
+
723
+ # Önizleme resmi
724
+ image_label = QLabel()
725
+ image_label.setFixedSize(130, 80)
726
+ image_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
727
+ image_label.setStyleSheet("border: 1px solid #555; background-color: #1e1e1e;")
728
+
729
+ # Resmi yükle
730
+ pixmap = QPixmap(wallpaper["path"])
731
+ if not pixmap.isNull():
732
+ scaled_pixmap = pixmap.scaled(130, 80, Qt.AspectRatioMode.KeepAspectRatio,
733
+ Qt.TransformationMode.SmoothTransformation)
734
+ image_label.setPixmap(scaled_pixmap)
735
+ else:
736
+ image_label.setText("📷")
737
+
738
+ layout.addWidget(image_label)
739
+
740
+ # İsim
741
+ name_label = QLabel(wallpaper["name"])
742
+ name_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
743
+ name_label.setStyleSheet("color: white; font-size: 10px; border: none;")
744
+ layout.addWidget(name_label)
745
+
746
+ # Tıklama olayı
747
+ preview.mousePressEvent = lambda event: self.select_wallpaper(wallpaper["path"])
748
+
749
+ return preview
750
+
751
+ except Exception as e:
752
+ self.wallpaper_manager.logger.error(f"Failed to create preview: {e}")
753
+ return QWidget()
754
+
755
+ def select_wallpaper(self, wallpaper_path: str):
756
+ """Duvar kağıdını seç"""
757
+ self.selected_wallpaper = wallpaper_path
758
+
759
+ def on_type_changed(self, type_text: str):
760
+ """Tür değiştiğinde"""
761
+ # TODO: Tür değişikliği implementasyonu
762
+ pass
763
+
764
+ def add_wallpaper(self):
765
+ """Yeni duvar kağıdı ekle"""
766
+ try:
767
+ file_path, _ = QFileDialog.getOpenFileName(
768
+ self, "Duvar Kağıdı Seç", "",
769
+ "Resim Dosyaları (*.png *.jpg *.jpeg *.bmp *.webp)"
770
+ )
771
+
772
+ if file_path:
773
+ if self.wallpaper_manager.add_wallpaper(file_path):
774
+ self.load_wallpapers()
775
+ else:
776
+ QMessageBox.warning(self, "Hata", "Duvar kağıdı eklenemedi!")
777
+
778
+ except Exception as e:
779
+ self.wallpaper_manager.logger.error(f"Failed to add wallpaper: {e}")
780
+
781
+ def apply_wallpaper(self):
782
+ """Duvar kağıdını uygula"""
783
+ try:
784
+ if not self.selected_wallpaper:
785
+ QMessageBox.warning(self, "Uyarı", "Lütfen bir duvar kağıdı seçin!")
786
+ return
787
+
788
+ # Modu al
789
+ mode_map = {
790
+ "Doldur": WallpaperMode.FILL,
791
+ "Sığdır": WallpaperMode.FIT,
792
+ "Uzat": WallpaperMode.STRETCH,
793
+ "Merkez": WallpaperMode.CENTER,
794
+ "Döşe": WallpaperMode.TILE,
795
+ }
796
+
797
+ mode = mode_map.get(self.mode_combo.currentText(), WallpaperMode.FILL)
798
+
799
+ if self.wallpaper_manager.set_wallpaper(self.selected_wallpaper, mode):
800
+ self.accept()
801
+ else:
802
+ QMessageBox.warning(self, "Hata", "Duvar kağıdı ayarlanamadı!")
803
+
804
+ except Exception as e:
805
+ self.wallpaper_manager.logger.error(f"Failed to apply wallpaper: {e}")
806
+
807
+ # Kolaylık fonksiyonları
808
+ _wallpaper_manager = None
809
+
810
+ def init_wallpaper_manager(kernel=None) -> WallpaperManager:
811
+ """Wallpaper manager'ı başlat"""
812
+ global _wallpaper_manager
813
+ _wallpaper_manager = WallpaperManager(kernel)
814
+ return _wallpaper_manager
815
+
816
+ def get_wallpaper_manager() -> Optional[WallpaperManager]:
817
+ """Wallpaper manager'ı al"""
818
+ return _wallpaper_manager
819
+
820
+ def set_wallpaper(wallpaper_path: str, mode: WallpaperMode = WallpaperMode.FILL) -> bool:
821
+ """Duvar kağıdı ayarla (kısayol)"""
822
+ if _wallpaper_manager:
823
+ return _wallpaper_manager.set_wallpaper(wallpaper_path, mode)
824
+ return False
825
+
826
+ def show_wallpaper_dialog() -> bool:
827
+ """Duvar kağıdı dialogu göster (kısayol)"""
828
+ if _wallpaper_manager:
829
+ return _wallpaper_manager.show_wallpaper_dialog()
830
+ return False