4da91a38 by shady

Revert "Revert "增加队列模式,支持同时做多个任务""

This reverts commit f4ceb240.
1 parent f29b806b
...@@ -1043,6 +1043,10 @@ class ImageGeneratorWindow(QMainWindow): ...@@ -1043,6 +1043,10 @@ class ImageGeneratorWindow(QMainWindow):
1043 # Initialize history manager 1043 # Initialize history manager
1044 self.history_manager = HistoryManager() 1044 self.history_manager = HistoryManager()
1045 1045
1046 # Initialize task queue manager
1047 from task_queue import TaskQueueManager
1048 self.task_manager = TaskQueueManager()
1049
1046 self.setup_ui() 1050 self.setup_ui()
1047 self.apply_styles() 1051 self.apply_styles()
1048 1052
...@@ -1254,10 +1258,14 @@ class ImageGeneratorWindow(QMainWindow): ...@@ -1254,10 +1258,14 @@ class ImageGeneratorWindow(QMainWindow):
1254 central_widget = QWidget() 1258 central_widget = QWidget()
1255 self.setCentralWidget(central_widget) 1259 self.setCentralWidget(central_widget)
1256 1260
1257 main_layout = QVBoxLayout() 1261 main_layout = QHBoxLayout()
1258 main_layout.setContentsMargins(10, 10, 10, 10) 1262 main_layout.setContentsMargins(10, 10, 10, 10)
1259 main_layout.setSpacing(10) 1263 main_layout.setSpacing(10)
1260 1264
1265 # Left side: Main content
1266 content_layout = QVBoxLayout()
1267 content_layout.setSpacing(10)
1268
1261 # Create tab widget 1269 # Create tab widget
1262 self.tab_widget = QTabWidget() 1270 self.tab_widget = QTabWidget()
1263 1271
...@@ -1279,7 +1287,20 @@ class ImageGeneratorWindow(QMainWindow): ...@@ -1279,7 +1287,20 @@ class ImageGeneratorWindow(QMainWindow):
1279 history_tab = self.setup_history_tab() 1287 history_tab = self.setup_history_tab()
1280 self.tab_widget.addTab(history_tab, "历史记录") 1288 self.tab_widget.addTab(history_tab, "历史记录")
1281 1289
1282 main_layout.addWidget(self.tab_widget) 1290 content_layout.addWidget(self.tab_widget)
1291
1292 # Create content widget with vertical layout
1293 content_widget = QWidget()
1294 content_widget.setLayout(content_layout)
1295
1296 # Add content to left side
1297 main_layout.addWidget(content_widget, 7) # 70% width
1298
1299 # Right side: Task queue sidebar
1300 from task_queue import TaskQueueWidget
1301 self.task_queue_widget = TaskQueueWidget(self.task_manager)
1302 main_layout.addWidget(self.task_queue_widget, 3) # 30% width
1303
1283 central_widget.setLayout(main_layout) 1304 central_widget.setLayout(main_layout)
1284 1305
1285 self.check_favorite_status() 1306 self.check_favorite_status()
...@@ -1923,26 +1944,66 @@ class ImageGeneratorWindow(QMainWindow): ...@@ -1923,26 +1944,66 @@ class ImageGeneratorWindow(QMainWindow):
1923 self.status_label.setStyleSheet("QLabel { color: #34C759; }") 1944 self.status_label.setStyleSheet("QLabel { color: #34C759; }")
1924 1945
1925 def generate_image_async(self): 1946 def generate_image_async(self):
1926 """Start image generation in a separate thread""" 1947 """Submit image generation task to queue"""
1927 # Create and start worker thread 1948 from task_queue import TaskType
1928 self.worker = ImageGenerationWorker( 1949
1929 self.api_key, 1950 prompt = self.prompt_text.toPlainText().strip()
1930 self.prompt_text.toPlainText().strip(), 1951 if not prompt:
1931 self.uploaded_images, 1952 QMessageBox.warning(self, "提示", "请输入图片描述!")
1932 self.aspect_ratio.currentText(), 1953 return
1933 self.image_size.currentText(), 1954
1934 "gemini-3-pro-image-preview" # 锁死模型 1955 try:
1956 # Submit task to queue
1957 task_id = self.task_manager.submit_task(
1958 task_type=TaskType.IMAGE_GENERATION,
1959 prompt=prompt,
1960 api_key=self.api_key,
1961 reference_images=self.uploaded_images.copy(),
1962 aspect_ratio=self.aspect_ratio.currentText(),
1963 image_size=self.image_size.currentText(),
1964 model="gemini-3-pro-image-preview"
1935 ) 1965 )
1936 self.worker.finished.connect(self.on_image_generated)
1937 self.worker.error.connect(self.on_generation_error)
1938 self.worker.progress.connect(self.update_status)
1939 1966
1940 self.generate_btn.setEnabled(False) 1967 # Connect to task completion signal
1941 self.download_btn.setEnabled(False) 1968 self.task_manager.task_completed.connect(
1942 self.status_label.setText("● 正在生成图片...") 1969 lambda tid, img, p, refs, ar, size, model:
1943 self.status_label.setStyleSheet("QLabel { color: #FF9500; }") 1970 self._on_my_task_completed(task_id, tid, img, p, refs, ar, size, model)
1971 )
1972
1973 # Update UI
1974 self.status_label.setText(f"● 任务已提交 (ID: {task_id[:8]})")
1975 self.status_label.setStyleSheet("QLabel { color: #007AFF; }")
1944 1976
1945 self.worker.start() 1977 except RuntimeError as e:
1978 QMessageBox.warning(self, "队列已满", str(e))
1979
1980 def _on_my_task_completed(self, my_task_id, task_id, image_bytes, prompt,
1981 reference_images, aspect_ratio, image_size, model):
1982 """Handle completion of my submitted task"""
1983 if my_task_id != task_id:
1984 return # Not my task
1985
1986 # Update display
1987 self.generated_image_bytes = image_bytes
1988 self.display_image()
1989 self.download_btn.setEnabled(True)
1990 self.status_label.setText("● 图片生成成功")
1991 self.status_label.setStyleSheet("QLabel { color: #34C759; }")
1992
1993 # Save to history
1994 try:
1995 self.history_manager.save_generation(
1996 image_bytes=image_bytes,
1997 prompt=prompt,
1998 reference_images=reference_images,
1999 aspect_ratio=aspect_ratio,
2000 image_size=image_size,
2001 model=model
2002 )
2003 self.status_label.setText("● 图片生成成功,已保存到历史记录")
2004 self.refresh_history()
2005 except Exception as e:
2006 self.logger.warning(f"保存到历史记录失败: {e}")
1946 2007
1947 def on_image_generated(self, image_bytes, prompt, reference_images, aspect_ratio, image_size, model): 2008 def on_image_generated(self, image_bytes, prompt, reference_images, aspect_ratio, image_size, model):
1948 """Handle successful image generation""" 2009 """Handle successful image generation"""
...@@ -3239,7 +3300,9 @@ class StyleDesignerTab(QWidget): ...@@ -3239,7 +3300,9 @@ class StyleDesignerTab(QWidget):
3239 combo.setCurrentIndex(0) 3300 combo.setCurrentIndex(0)
3240 3301
3241 def generate_image(self): 3302 def generate_image(self):
3242 """调用文生图 API""" 3303 """Submit image generation task to queue"""
3304 from task_queue import TaskType
3305
3243 # 获取 prompt 3306 # 获取 prompt
3244 prompt = self.prompt_preview.toPlainText() 3307 prompt = self.prompt_preview.toPlainText()
3245 if not prompt.strip(): 3308 if not prompt.strip():
...@@ -3249,36 +3312,61 @@ class StyleDesignerTab(QWidget): ...@@ -3249,36 +3312,61 @@ class StyleDesignerTab(QWidget):
3249 # 获取设置 3312 # 获取设置
3250 aspect_ratio = self.aspect_ratio.currentText() 3313 aspect_ratio = self.aspect_ratio.currentText()
3251 image_size = self.image_size.currentText() 3314 image_size = self.image_size.currentText()
3252 model = "gemini-3-pro-image-preview" # 硬编码使用默认模型 3315 model = "gemini-3-pro-image-preview"
3253 3316
3254 # 获取父窗口的 API key 3317 # 获取父窗口的 API key
3255 if not hasattr(self.parent_window, 'api_key') or not self.parent_window.api_key: 3318 if not hasattr(self.parent_window, 'api_key') or not self.parent_window.api_key:
3256 QMessageBox.warning(self, "错误", "未找到 API 密钥,请在主窗口配置") 3319 QMessageBox.warning(self, "错误", "未找到 API 密钥,请在主窗口配置")
3257 return 3320 return
3258 3321
3259 # 非阻塞状态提示
3260 self.generate_btn.setEnabled(False)
3261 self.status_label.setText("● 生成中...")
3262 QApplication.processEvents()
3263
3264 try: 3322 try:
3265 # 创建生成线程 3323 # Submit task to queue
3266 self.gen_thread = ImageGenerationWorker( 3324 task_id = self.parent_window.task_manager.submit_task(
3267 api_key=self.parent_window.api_key, 3325 task_type=TaskType.STYLE_DESIGN,
3268 prompt=prompt, 3326 prompt=prompt,
3269 images=[], 3327 api_key=self.parent_window.api_key,
3328 reference_images=[],
3270 aspect_ratio=aspect_ratio, 3329 aspect_ratio=aspect_ratio,
3271 image_size=image_size, 3330 image_size=image_size,
3272 model=model 3331 model=model
3273 ) 3332 )
3274 self.gen_thread.finished.connect(self.on_generation_success)
3275 self.gen_thread.error.connect(self.on_generation_error)
3276 self.gen_thread.start()
3277 3333
3334 # Connect to task completion signal
3335 self.parent_window.task_manager.task_completed.connect(
3336 lambda tid, img, p, refs, ar, size, mdl:
3337 self._on_my_task_completed(task_id, tid, img, p, refs, ar, size, mdl)
3338 )
3339
3340 # Update UI
3341 self.status_label.setText(f"● 任务已提交 (ID: {task_id[:8]})")
3342
3343 except RuntimeError as e:
3344 QMessageBox.warning(self, "队列已满", str(e))
3345
3346 def _on_my_task_completed(self, my_task_id, task_id, image_bytes, prompt,
3347 reference_images, aspect_ratio, image_size, model):
3348 """Handle completion of my submitted task"""
3349 if my_task_id != task_id:
3350 return # Not my task
3351
3352 # Update display
3353 self.generated_image_bytes = image_bytes
3354 self._display_generated_image_from_bytes()
3355 self.status_label.setText("● 生成成功")
3356
3357 # Save to history
3358 try:
3359 self.parent_window.history_manager.save_generation(
3360 image_bytes=image_bytes,
3361 prompt=prompt,
3362 reference_images=reference_images,
3363 aspect_ratio=aspect_ratio,
3364 image_size=image_size,
3365 model=model
3366 )
3367 self.parent_window.refresh_history()
3278 except Exception as e: 3368 except Exception as e:
3279 self.generate_btn.setEnabled(True) 3369 self.logger.warning(f"保存到历史记录失败: {e}")
3280 self.status_label.setText("● 就绪")
3281 QMessageBox.critical(self, "错误", f"生成失败: {e}")
3282 3370
3283 def on_generation_success(self, image_bytes: bytes): 3371 def on_generation_success(self, image_bytes: bytes):
3284 """生成成功回调""" 3372 """生成成功回调"""
...@@ -3349,6 +3437,34 @@ class StyleDesignerTab(QWidget): ...@@ -3349,6 +3437,34 @@ class StyleDesignerTab(QWidget):
3349 self.status_label.setText("● 就绪") 3437 self.status_label.setText("● 就绪")
3350 QMessageBox.critical(self, "生成失败", error_msg) 3438 QMessageBox.critical(self, "生成失败", error_msg)
3351 3439
3440 def _display_generated_image_from_bytes(self):
3441 """从字节数据显示生成的图片"""
3442 if not self.generated_image_bytes:
3443 return
3444
3445 try:
3446 pixmap = QPixmap()
3447 pixmap.loadFromData(self.generated_image_bytes)
3448
3449 if not pixmap.isNull():
3450 # 缩放以适应标签大小
3451 scaled_pixmap = pixmap.scaled(
3452 self.result_label.size(),
3453 Qt.KeepAspectRatio,
3454 Qt.SmoothTransformation
3455 )
3456 self.result_label.setPixmap(scaled_pixmap)
3457 self.result_label.setStyleSheet("""
3458 QLabel {
3459 border: 1px solid #ddd;
3460 background-color: white;
3461 }
3462 """)
3463 # 启用下载按钮
3464 self.download_btn.setEnabled(True)
3465 except Exception as e:
3466 self.logger.error(f"显示图片失败: {e}")
3467
3352 def download_image(self): 3468 def download_image(self):
3353 """下载图片""" 3469 """下载图片"""
3354 if not self.generated_image_bytes: 3470 if not self.generated_image_bytes:
......