mirror of
https://github.com/Omni-guides/Jackify.git
synced 2026-01-17 19:47:00 +01:00
Initial public release v0.1.0 - Linux Wabbajack Modlist Application
Jackify provides native Linux support for Wabbajack modlist installation and management with automated Steam integration and Proton configuration. Key Features: - Almost Native Linux implementation (texconv.exe run via proton) - Automated Steam shortcut creation and Proton prefix management - Both CLI and GUI interfaces, with Steam Deck optimization Supported Games: - Skyrim Special Edition - Fallout 4 - Fallout New Vegas - Oblivion, Starfield, Enderal, and diverse other games Technical Architecture: - Clean separation between frontend and backend services - Powered by jackify-engine 0.3.x for Wabbajack-matching modlist installation
This commit is contained in:
200
jackify/frontends/gui/dialogs/completion_dialog.py
Normal file
200
jackify/frontends/gui/dialogs/completion_dialog.py
Normal file
@@ -0,0 +1,200 @@
|
||||
"""
|
||||
Completion Dialog
|
||||
|
||||
Custom completion dialog that shows the same detailed completion message
|
||||
as the CLI frontend, formatted for GUI display.
|
||||
"""
|
||||
|
||||
import logging
|
||||
from pathlib import Path
|
||||
from typing import Optional
|
||||
|
||||
from PySide6.QtWidgets import (
|
||||
QDialog, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QTextEdit,
|
||||
QWidget, QSpacerItem, QSizePolicy
|
||||
)
|
||||
from PySide6.QtCore import Qt
|
||||
from PySide6.QtGui import QPixmap, QIcon
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class NextStepsDialog(QDialog):
|
||||
"""
|
||||
Custom completion dialog showing detailed next steps after modlist configuration.
|
||||
|
||||
Displays the same information as the CLI completion message but in a proper GUI format.
|
||||
"""
|
||||
|
||||
def __init__(self, modlist_name: str, parent=None):
|
||||
"""
|
||||
Initialize the Next Steps dialog.
|
||||
|
||||
Args:
|
||||
modlist_name: Name of the configured modlist
|
||||
parent: Parent widget
|
||||
"""
|
||||
super().__init__(parent)
|
||||
self.modlist_name = modlist_name
|
||||
self.setWindowTitle("Next Steps")
|
||||
self.setModal(True)
|
||||
self.setFixedSize(600, 400)
|
||||
|
||||
# Set the Wabbajack icon if available
|
||||
self._set_dialog_icon()
|
||||
|
||||
self._setup_ui()
|
||||
|
||||
logger.info(f"NextStepsDialog created for modlist: {modlist_name}")
|
||||
|
||||
def _set_dialog_icon(self):
|
||||
"""Set the dialog icon to Wabbajack icon if available"""
|
||||
try:
|
||||
# Try to use the same icon as the main application
|
||||
icon_path = Path(__file__).parent.parent.parent.parent.parent / "Files" / "wabbajack-icon.png"
|
||||
if icon_path.exists():
|
||||
icon = QIcon(str(icon_path))
|
||||
self.setWindowIcon(icon)
|
||||
except Exception as e:
|
||||
logger.debug(f"Could not set dialog icon: {e}")
|
||||
|
||||
def _setup_ui(self):
|
||||
"""Set up the dialog user interface"""
|
||||
layout = QVBoxLayout(self)
|
||||
layout.setSpacing(16)
|
||||
layout.setContentsMargins(20, 20, 20, 20)
|
||||
|
||||
# Header with icon and title
|
||||
self._setup_header(layout)
|
||||
|
||||
# Main content area
|
||||
self._setup_content(layout)
|
||||
|
||||
# Action buttons
|
||||
self._setup_buttons(layout)
|
||||
|
||||
def _setup_header(self, layout):
|
||||
"""Set up the dialog header with title"""
|
||||
header_layout = QHBoxLayout()
|
||||
|
||||
# Title
|
||||
title_label = QLabel("Next Steps:")
|
||||
title_label.setStyleSheet(
|
||||
"QLabel { "
|
||||
" font-size: 18px; "
|
||||
" font-weight: bold; "
|
||||
" color: #2c3e50; "
|
||||
" margin-bottom: 10px; "
|
||||
"}"
|
||||
)
|
||||
header_layout.addWidget(title_label)
|
||||
|
||||
# Add some space
|
||||
header_layout.addStretch()
|
||||
|
||||
layout.addLayout(header_layout)
|
||||
|
||||
def _setup_content(self, layout):
|
||||
"""Set up the main content area with next steps"""
|
||||
# Create content area
|
||||
content_widget = QWidget()
|
||||
content_layout = QVBoxLayout(content_widget)
|
||||
content_layout.setSpacing(12)
|
||||
|
||||
# Add the detailed next steps text (matching CLI completion message)
|
||||
steps_text = self._build_completion_text()
|
||||
|
||||
content_text = QTextEdit()
|
||||
content_text.setPlainText(steps_text)
|
||||
content_text.setReadOnly(True)
|
||||
content_text.setStyleSheet(
|
||||
"QTextEdit { "
|
||||
" background-color: #f8f9fa; "
|
||||
" border: 1px solid #dee2e6; "
|
||||
" border-radius: 6px; "
|
||||
" padding: 12px; "
|
||||
" font-family: 'Segoe UI', Arial, sans-serif; "
|
||||
" font-size: 12px; "
|
||||
" line-height: 1.5; "
|
||||
"}"
|
||||
)
|
||||
content_layout.addWidget(content_text)
|
||||
|
||||
layout.addWidget(content_widget)
|
||||
|
||||
def _setup_buttons(self, layout):
|
||||
"""Set up the action buttons"""
|
||||
button_layout = QHBoxLayout()
|
||||
button_layout.setSpacing(12)
|
||||
|
||||
# Add stretch to center buttons
|
||||
button_layout.addStretch()
|
||||
|
||||
# Return button (goes back to menu)
|
||||
return_btn = QPushButton("Return")
|
||||
return_btn.setFixedSize(100, 35)
|
||||
return_btn.clicked.connect(self.accept) # This will close dialog and return to menu
|
||||
return_btn.setStyleSheet(
|
||||
"QPushButton { "
|
||||
" background-color: #3498db; "
|
||||
" color: white; "
|
||||
" border: none; "
|
||||
" border-radius: 4px; "
|
||||
" font-weight: bold; "
|
||||
" padding: 8px 16px; "
|
||||
"} "
|
||||
"QPushButton:hover { "
|
||||
" background-color: #2980b9; "
|
||||
"} "
|
||||
"QPushButton:pressed { "
|
||||
" background-color: #21618c; "
|
||||
"}"
|
||||
)
|
||||
button_layout.addWidget(return_btn)
|
||||
|
||||
button_layout.addSpacing(10)
|
||||
|
||||
# Exit button (closes the application)
|
||||
exit_btn = QPushButton("Exit")
|
||||
exit_btn.setFixedSize(100, 35)
|
||||
exit_btn.clicked.connect(self.reject) # This will close dialog and potentially exit app
|
||||
exit_btn.setStyleSheet(
|
||||
"QPushButton { "
|
||||
" background-color: #95a5a6; "
|
||||
" color: white; "
|
||||
" border: none; "
|
||||
" border-radius: 4px; "
|
||||
" font-weight: bold; "
|
||||
" padding: 8px 16px; "
|
||||
"} "
|
||||
"QPushButton:hover { "
|
||||
" background-color: #7f8c8d; "
|
||||
"} "
|
||||
"QPushButton:pressed { "
|
||||
" background-color: #6c7b7d; "
|
||||
"}"
|
||||
)
|
||||
button_layout.addWidget(exit_btn)
|
||||
|
||||
button_layout.addStretch()
|
||||
|
||||
layout.addLayout(button_layout)
|
||||
|
||||
def _build_completion_text(self) -> str:
|
||||
"""
|
||||
Build the completion text matching the CLI version from menu_handler.py.
|
||||
|
||||
Returns:
|
||||
Formatted completion text string
|
||||
"""
|
||||
# Match the CLI completion text from menu_handler.py lines 627-631
|
||||
completion_text = f"""✓ Configuration completed successfully!
|
||||
|
||||
Modlist Install and Configuration complete!:
|
||||
|
||||
• You should now be able to Launch '{self.modlist_name}' through Steam.
|
||||
• Congratulations and enjoy the game!
|
||||
|
||||
Detailed log available at: ~/Jackify/logs/Configure_New_Modlist_workflow.log"""
|
||||
|
||||
return completion_text
|
||||
Reference in New Issue
Block a user