thumbnail-maker 0.1.6__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,386 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """
4
+ GUI 위젯 생성 모듈
5
+ """
6
+
7
+ from PySide6.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QLabel,
8
+ QPushButton, QSpinBox, QTextEdit, QCheckBox,
9
+ QComboBox, QGroupBox, QLineEdit, QSlider, QFileDialog)
10
+ from PySide6.QtCore import Qt
11
+
12
+
13
+ class WidgetFactory:
14
+ """위젯 생성 팩토리 클래스"""
15
+
16
+ @staticmethod
17
+ def create_preview_widget(parent):
18
+ """미리보기 위젯 생성"""
19
+ group = QGroupBox('미리보기')
20
+ layout = QVBoxLayout()
21
+
22
+ parent.preview_label = QLabel('미리보기가 여기에 표시됩니다')
23
+ parent.preview_label.setMinimumSize(480, 270)
24
+ parent.preview_label.setStyleSheet('border: 2px solid gray; background: white;')
25
+ parent.preview_label.setAlignment(Qt.AlignCenter)
26
+
27
+ btn_layout = QHBoxLayout()
28
+
29
+ parent.preview_btn = QPushButton('미리보기 생성')
30
+ parent.preview_btn.clicked.connect(parent.generate_preview)
31
+
32
+ parent.save_btn = QPushButton('저장')
33
+ parent.save_btn.clicked.connect(parent.save_thumbnail)
34
+
35
+ parent.show_dsl_btn = QPushButton('DSL 보기')
36
+ parent.show_dsl_btn.clicked.connect(parent.show_dsl_dialog)
37
+
38
+ parent.save_dsl_btn = QPushButton('DSL 저장')
39
+ parent.save_dsl_btn.clicked.connect(parent.save_dsl)
40
+
41
+ parent.save_thl_btn = QPushButton('패키지 저장(.thl)')
42
+ parent.save_thl_btn.clicked.connect(parent.save_thl_package)
43
+
44
+ parent.load_thl_btn = QPushButton('패키지 로드(.thl)')
45
+ parent.load_thl_btn.clicked.connect(parent.load_thl_package)
46
+
47
+ btn_layout.addWidget(parent.preview_btn)
48
+ btn_layout.addWidget(parent.save_btn)
49
+ btn_layout.addWidget(parent.show_dsl_btn)
50
+ btn_layout.addWidget(parent.save_dsl_btn)
51
+ btn_layout.addWidget(parent.load_thl_btn)
52
+ btn_layout.addWidget(parent.save_thl_btn)
53
+
54
+ layout.addWidget(parent.preview_label)
55
+ layout.addLayout(btn_layout)
56
+ group.setLayout(layout)
57
+
58
+ return group
59
+
60
+ @staticmethod
61
+ def create_resolution_tab(parent):
62
+ """해상도 설정 탭"""
63
+ widget = QWidget()
64
+ layout = QVBoxLayout()
65
+
66
+ # 모드 선택
67
+ parent.res_mode = QComboBox()
68
+ parent.res_mode.addItems(['preset', 'fixedRatio', 'custom'])
69
+ parent.res_mode.currentTextChanged.connect(parent.on_resolution_mode_changed)
70
+
71
+ layout.addWidget(QLabel('크기 모드:'))
72
+ layout.addWidget(parent.res_mode)
73
+
74
+ # 비율 선택
75
+ parent.aspect_ratio = QComboBox()
76
+ parent.aspect_ratio.addItems(['16:9', '9:16', '4:3', '1:1'])
77
+ parent.aspect_ratio.currentTextChanged.connect(parent.on_aspect_ratio_changed)
78
+
79
+ layout.addWidget(QLabel('비율:'))
80
+ layout.addWidget(parent.aspect_ratio)
81
+
82
+ # 너비/높이
83
+ parent.width_spin = QSpinBox()
84
+ parent.width_spin.setRange(100, 2000)
85
+ parent.width_spin.setValue(480)
86
+ parent.width_spin.valueChanged.connect(parent.on_width_changed)
87
+
88
+ parent.height_spin = QSpinBox()
89
+ parent.height_spin.setRange(100, 2000)
90
+ parent.height_spin.setValue(270)
91
+ parent.height_spin.valueChanged.connect(parent.on_height_changed)
92
+
93
+ # fixedRatio 모드에서 무한 루프 방지를 위한 플래그
94
+ parent._updating_dimension = False
95
+
96
+ layout.addWidget(QLabel('너비:'))
97
+ layout.addWidget(parent.width_spin)
98
+ layout.addWidget(QLabel('높이:'))
99
+ layout.addWidget(parent.height_spin)
100
+
101
+ layout.addStretch()
102
+ widget.setLayout(layout)
103
+ return widget
104
+
105
+ @staticmethod
106
+ def create_background_tab(parent):
107
+ """배경 설정 탭"""
108
+ widget = QWidget()
109
+ layout = QVBoxLayout()
110
+
111
+ # 배경 타입
112
+ bg_type = QComboBox()
113
+ bg_type.addItems(['solid', 'gradient', 'image'])
114
+ bg_type.currentTextChanged.connect(parent.update_preview)
115
+ parent.bg_type = bg_type
116
+
117
+ layout.addWidget(QLabel('배경 타입:'))
118
+ layout.addWidget(bg_type)
119
+
120
+ # 배경 색상
121
+ parent.bg_color_btn = QPushButton('색상 선택')
122
+ parent.bg_color_btn.clicked.connect(parent.select_bg_color)
123
+ parent.bg_color = '#a3e635'
124
+
125
+ layout.addWidget(QLabel('배경 색상:'))
126
+ layout.addWidget(parent.bg_color_btn)
127
+
128
+ # 배경 이미지 경로
129
+ parent.bg_image_path = QLineEdit()
130
+ parent.bg_image_path.setPlaceholderText('이미지 파일 경로')
131
+
132
+ bg_img_btn = QPushButton('이미지 선택')
133
+ bg_img_btn.clicked.connect(parent.select_background_image)
134
+
135
+ layout.addWidget(QLabel('배경 이미지:'))
136
+ layout.addWidget(parent.bg_image_path)
137
+ layout.addWidget(bg_img_btn)
138
+
139
+ # 이미지 투명도
140
+ parent.bg_opacity = QSlider(Qt.Horizontal)
141
+ parent.bg_opacity.setRange(0, 100)
142
+ parent.bg_opacity.setValue(100)
143
+ parent.bg_opacity.valueChanged.connect(parent.update_preview)
144
+
145
+ layout.addWidget(QLabel('이미지 투명도:'))
146
+ layout.addWidget(parent.bg_opacity)
147
+
148
+ # 이미지 블러
149
+ parent.bg_blur = QSlider(Qt.Horizontal)
150
+ parent.bg_blur.setRange(0, 20)
151
+ parent.bg_blur.setValue(0)
152
+ parent.bg_blur.valueChanged.connect(parent.update_preview)
153
+
154
+ layout.addWidget(QLabel('이미지 블러:'))
155
+ layout.addWidget(parent.bg_blur)
156
+
157
+ layout.addStretch()
158
+ widget.setLayout(layout)
159
+ return widget
160
+
161
+ @staticmethod
162
+ def create_title_tab(parent):
163
+ """제목 설정 탭"""
164
+ widget = QWidget()
165
+ layout = QVBoxLayout()
166
+
167
+ # 제목 텍스트
168
+ parent.title_text = QTextEdit()
169
+ parent.title_text.setPlaceholderText('제목 텍스트 입력 (여러 줄 가능)')
170
+ parent.title_text.textChanged.connect(parent.update_preview)
171
+
172
+ layout.addWidget(QLabel('제목 텍스트:'))
173
+ layout.addWidget(parent.title_text)
174
+
175
+ # 폰트 설정 모드 (웹/로컬)
176
+ parent.title_font_source = QComboBox()
177
+ parent.title_font_source.addItems(['웹 폰트 URL', '로컬 폰트 파일'])
178
+ parent.title_font_source.currentTextChanged.connect(parent.update_preview)
179
+
180
+ layout.addWidget(QLabel('폰트 소스:'))
181
+ layout.addWidget(parent.title_font_source)
182
+
183
+ # 폰트 설정 (이름/URL/굵기/스타일)
184
+ parent.title_font_name = QLineEdit()
185
+ parent.title_font_name.setPlaceholderText('예: SBAggroB')
186
+ parent.title_font_name.textChanged.connect(parent.update_preview)
187
+
188
+ parent.title_font_url = QLineEdit()
189
+ parent.title_font_url.setPlaceholderText('예: https://.../SBAggroB.woff')
190
+ parent.title_font_url.textChanged.connect(parent.update_preview)
191
+
192
+ # 로컬 파일 경로 + 선택 버튼
193
+ row_title_local = QHBoxLayout()
194
+ parent.title_font_file = QLineEdit()
195
+ parent.title_font_file.setPlaceholderText('예: C:/Windows/Fonts/malgun.ttf')
196
+ parent.title_font_file.textChanged.connect(parent.on_title_font_file_changed)
197
+ btn_title_font_browse = QPushButton('찾기')
198
+ def _pick_title_font():
199
+ path, _ = QFileDialog.getOpenFileName(parent, '폰트 파일 선택', '', 'Fonts (*.ttf *.otf *.woff *.woff2)')
200
+ if path:
201
+ parent.title_font_file.setText(path)
202
+ parent.set_title_font_name_from_path(path)
203
+ btn_title_font_browse.clicked.connect(_pick_title_font)
204
+ row_title_local.addWidget(parent.title_font_file)
205
+ row_title_local.addWidget(btn_title_font_browse)
206
+
207
+ parent.title_font_weight = QComboBox()
208
+ parent.title_font_weight.addItems(['normal', 'bold'])
209
+ parent.title_font_weight.currentTextChanged.connect(parent.update_preview)
210
+
211
+ parent.title_font_style = QComboBox()
212
+ parent.title_font_style.addItems(['normal', 'italic'])
213
+ parent.title_font_style.currentTextChanged.connect(parent.update_preview)
214
+
215
+ layout.addWidget(QLabel('폰트 이름:'))
216
+ layout.addWidget(parent.title_font_name)
217
+ # URL/로컬 입력 영역
218
+ parent.label_title_font_url = QLabel('폰트 URL (WOFF/WOFF2/TTF):')
219
+ layout.addWidget(parent.label_title_font_url)
220
+ layout.addWidget(parent.title_font_url)
221
+ parent.label_title_font_file = QLabel('로컬 폰트 파일 경로:')
222
+ layout.addWidget(parent.label_title_font_file)
223
+ layout.addLayout(row_title_local)
224
+ layout.addWidget(QLabel('폰트 굵기/스타일:'))
225
+ row_font = QHBoxLayout()
226
+ row_font.addWidget(parent.title_font_weight)
227
+ row_font.addWidget(parent.title_font_style)
228
+ layout.addLayout(row_font)
229
+
230
+ # 제목 색상
231
+ parent.title_color_btn = QPushButton('색상 선택')
232
+ parent.title_color_btn.clicked.connect(parent.select_title_color)
233
+ parent.title_color = '#4ade80'
234
+
235
+ layout.addWidget(QLabel('제목 색상:'))
236
+ layout.addWidget(parent.title_color_btn)
237
+
238
+ # 폰트 크기
239
+ parent.title_font_size = QSpinBox()
240
+ parent.title_font_size.setRange(8, 200)
241
+ parent.title_font_size.setValue(48)
242
+ parent.title_font_size.valueChanged.connect(parent.update_preview)
243
+
244
+ layout.addWidget(QLabel('폰트 크기:'))
245
+ layout.addWidget(parent.title_font_size)
246
+
247
+ # 외곽선
248
+ parent.title_outline_check = QCheckBox('외곽선 사용')
249
+ parent.title_outline_check.stateChanged.connect(parent.update_preview)
250
+
251
+ parent.title_outline_thickness = QSpinBox()
252
+ parent.title_outline_thickness.setRange(1, 20)
253
+ parent.title_outline_thickness.setValue(7)
254
+ parent.title_outline_thickness.valueChanged.connect(parent.update_preview)
255
+
256
+ layout.addWidget(parent.title_outline_check)
257
+ layout.addWidget(QLabel('외곽선 두께:'))
258
+ layout.addWidget(parent.title_outline_thickness)
259
+
260
+ # 워드 랩
261
+ parent.title_word_wrap = QCheckBox('단어 단위 줄바꿈')
262
+ parent.title_word_wrap.stateChanged.connect(parent.update_preview)
263
+ layout.addWidget(parent.title_word_wrap)
264
+
265
+ # 위치 (9 그리드)
266
+ parent.title_position = QComboBox()
267
+ parent.title_position.addItems(['tl', 'tc', 'tr', 'ml', 'mc', 'mr', 'bl', 'bc', 'br'])
268
+ parent.title_position.currentTextChanged.connect(parent.update_preview)
269
+
270
+ layout.addWidget(QLabel('위치:'))
271
+ layout.addWidget(parent.title_position)
272
+
273
+ layout.addStretch()
274
+ widget.setLayout(layout)
275
+ return widget
276
+
277
+ @staticmethod
278
+ def create_subtitle_tab(parent):
279
+ """부제목 설정 탭"""
280
+ widget = QWidget()
281
+ layout = QVBoxLayout()
282
+
283
+ # 부제목 표시 여부
284
+ parent.subtitle_visible = QCheckBox('부제목 표시')
285
+ parent.subtitle_visible.setChecked(True)
286
+ parent.subtitle_visible.stateChanged.connect(parent.update_preview)
287
+
288
+ layout.addWidget(parent.subtitle_visible)
289
+
290
+ # 부제목 텍스트
291
+ parent.subtitle_text = QTextEdit()
292
+ parent.subtitle_text.setPlaceholderText('부제목 텍스트 입력 (여러 줄 가능)')
293
+ parent.subtitle_text.textChanged.connect(parent.update_preview)
294
+
295
+ layout.addWidget(QLabel('부제목 텍스트:'))
296
+ layout.addWidget(parent.subtitle_text)
297
+
298
+ # 폰트 설정 모드 (웹/로컬)
299
+ parent.subtitle_font_source = QComboBox()
300
+ parent.subtitle_font_source.addItems(['웹 폰트 URL', '로컬 폰트 파일'])
301
+ parent.subtitle_font_source.currentTextChanged.connect(parent.update_preview)
302
+
303
+ layout.addWidget(QLabel('폰트 소스:'))
304
+ layout.addWidget(parent.subtitle_font_source)
305
+
306
+ # 폰트 설정 (이름/URL/굵기/스타일)
307
+ parent.subtitle_font_name = QLineEdit()
308
+ parent.subtitle_font_name.setPlaceholderText('예: SBAggroB')
309
+ parent.subtitle_font_name.textChanged.connect(parent.update_preview)
310
+
311
+ parent.subtitle_font_url = QLineEdit()
312
+ parent.subtitle_font_url.setPlaceholderText('예: https://.../SBAggroB.woff')
313
+ parent.subtitle_font_url.textChanged.connect(parent.update_preview)
314
+
315
+ # 로컬 파일 경로 + 선택 버튼
316
+ row_sub_local = QHBoxLayout()
317
+ parent.subtitle_font_file = QLineEdit()
318
+ parent.subtitle_font_file.setPlaceholderText('예: C:/Windows/Fonts/malgun.ttf')
319
+ parent.subtitle_font_file.textChanged.connect(parent.on_subtitle_font_file_changed)
320
+ btn_sub_font_browse = QPushButton('찾기')
321
+ def _pick_sub_font():
322
+ path, _ = QFileDialog.getOpenFileName(parent, '폰트 파일 선택', '', 'Fonts (*.ttf *.otf *.woff *.woff2)')
323
+ if path:
324
+ parent.subtitle_font_file.setText(path)
325
+ parent.set_subtitle_font_name_from_path(path)
326
+ btn_sub_font_browse.clicked.connect(_pick_sub_font)
327
+ row_sub_local.addWidget(parent.subtitle_font_file)
328
+ row_sub_local.addWidget(btn_sub_font_browse)
329
+
330
+ parent.subtitle_font_weight = QComboBox()
331
+ parent.subtitle_font_weight.addItems(['normal', 'bold'])
332
+ parent.subtitle_font_weight.currentTextChanged.connect(parent.update_preview)
333
+
334
+ parent.subtitle_font_style = QComboBox()
335
+ parent.subtitle_font_style.addItems(['normal', 'italic'])
336
+ parent.subtitle_font_style.currentTextChanged.connect(parent.update_preview)
337
+
338
+ layout.addWidget(QLabel('폰트 이름:'))
339
+ layout.addWidget(parent.subtitle_font_name)
340
+ parent.label_subtitle_font_url = QLabel('폰트 URL (WOFF/WOFF2/TTF):')
341
+ layout.addWidget(parent.label_subtitle_font_url)
342
+ layout.addWidget(parent.subtitle_font_url)
343
+ parent.label_subtitle_font_file = QLabel('로컬 폰트 파일 경로:')
344
+ layout.addWidget(parent.label_subtitle_font_file)
345
+ layout.addLayout(row_sub_local)
346
+ layout.addWidget(QLabel('폰트 굵기/스타일:'))
347
+ row_sub_font = QHBoxLayout()
348
+ row_sub_font.addWidget(parent.subtitle_font_weight)
349
+ row_sub_font.addWidget(parent.subtitle_font_style)
350
+ layout.addLayout(row_sub_font)
351
+
352
+ # 부제목 색상
353
+ parent.subtitle_color_btn = QPushButton('색상 선택')
354
+ parent.subtitle_color_btn.clicked.connect(parent.select_subtitle_color)
355
+ parent.subtitle_color = '#ffffff'
356
+
357
+ layout.addWidget(QLabel('부제목 색상:'))
358
+ layout.addWidget(parent.subtitle_color_btn)
359
+
360
+ # 폰트 크기
361
+ parent.subtitle_font_size = QSpinBox()
362
+ parent.subtitle_font_size.setRange(8, 200)
363
+ parent.subtitle_font_size.setValue(24)
364
+ parent.subtitle_font_size.valueChanged.connect(parent.update_preview)
365
+
366
+ layout.addWidget(QLabel('폰트 크기:'))
367
+ layout.addWidget(parent.subtitle_font_size)
368
+
369
+ # 위치 (9 그리드)
370
+ parent.subtitle_position = QComboBox()
371
+ parent.subtitle_position.addItems(['tl', 'tc', 'tr', 'ml', 'mc', 'mr', 'bl', 'bc', 'br'])
372
+ parent.subtitle_position.setCurrentText('bl')
373
+ parent.subtitle_position.currentTextChanged.connect(parent.update_preview)
374
+
375
+ # 워드 랩
376
+ parent.subtitle_word_wrap = QCheckBox('단어 단위 줄바꿈')
377
+ parent.subtitle_word_wrap.stateChanged.connect(parent.update_preview)
378
+
379
+ layout.addWidget(QLabel('위치:'))
380
+ layout.addWidget(parent.subtitle_position)
381
+ layout.addWidget(parent.subtitle_word_wrap)
382
+
383
+ layout.addStretch()
384
+ widget.setLayout(layout)
385
+ return widget
386
+