clapp-pm 1.0.44__py3-none-any.whl → 1.0.46__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.
- {clapp_pm-1.0.44.data → clapp_pm-1.0.46.data}/data/version.json +1 -1
- {clapp_pm-1.0.44.dist-info → clapp_pm-1.0.46.dist-info}/METADATA +1 -1
- {clapp_pm-1.0.44.dist-info → clapp_pm-1.0.46.dist-info}/RECORD +13 -29
- manifest_schema.py +1 -1
- manifest_validator.py +1 -1
- package_runner.py +1 -0
- packages/luaozgur-moba/README.md +159 -0
- packages/luaozgur-moba/manifest.json +8 -0
- version.py +1 -1
- packages/pycloudos/README.md +0 -279
- packages/pycloudos/core/appmon.py +0 -0
- packages/pycloudos/main.py +0 -193
- packages/pycloudos/manifest.json +0 -15
- packages/pycloudos/rain/__init__.py +0 -7
- packages/pycloudos/rain/contextmenu.py +0 -1370
- packages/pycloudos/rain/desktop.py +0 -556
- packages/pycloudos/rain/dock.py +0 -722
- packages/pycloudos/rain/flet_html_widgets.py +0 -1448
- packages/pycloudos/rain/theme.py +0 -930
- packages/pycloudos/rain/topbar.py +0 -1421
- packages/pycloudos/rain/ui.py +0 -381
- packages/pycloudos/rain/wallpaper.py +0 -830
- packages/pycloudos/rain/widgets.py +0 -688
- packages/pycloudos/rain/windowmanager.py +0 -605
- packages/pycloudos/requirements-dev.txt +0 -43
- packages/pycloudos/requirements.txt +0 -43
- packages/pycloudos/setup_deps.py +0 -422
- {clapp_pm-1.0.44.dist-info → clapp_pm-1.0.46.dist-info}/WHEEL +0 -0
- {clapp_pm-1.0.44.dist-info → clapp_pm-1.0.46.dist-info}/entry_points.txt +0 -0
- {clapp_pm-1.0.44.dist-info → clapp_pm-1.0.46.dist-info}/licenses/LICENSE +0 -0
- {clapp_pm-1.0.44.dist-info → clapp_pm-1.0.46.dist-info}/top_level.txt +0 -0
@@ -1,830 +0,0 @@
|
|
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
|