From c74707415cdba83b3cd63616cc2d31062cd3a5bf Mon Sep 17 00:00:00 2001 From: 3minbe Date: Fri, 21 Feb 2025 10:43:18 +0900 Subject: [PATCH] =?UTF-8?q?=EB=8B=A4=ED=81=AC=20=ED=85=8C=EB=A7=88=20?= =?UTF-8?q?=EC=A7=80=EC=9B=90=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EC=B0=BD=EC=97=90=EC=84=9C=20=ED=85=8C=EB=A7=88=20?= =?UTF-8?q?=EC=84=A0=ED=83=9D=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=20?= =?UTF-8?q?/=20=EC=A0=95=EB=A0=AC=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DBC_Converter.py | 182 +++++++++++++++++++++++++++++++++++++++-------- settings.json | 4 +- 2 files changed, 155 insertions(+), 31 deletions(-) diff --git a/DBC_Converter.py b/DBC_Converter.py index 821afc7..de0491a 100644 --- a/DBC_Converter.py +++ b/DBC_Converter.py @@ -102,24 +102,119 @@ class MainView(QtWidgets.QMainWindow): self.setupCloseEvent() # 프로그램 종료 이벤트 설정 self.tree.itemSelectionChanged.connect(self.onFileSelectionChanged) + # 테마 적용 + theme = self.settings.get("theme", "light") + if theme == "dark": + self.applyDarkTheme() + else: + self.setStyleSheet("") + + def applyDarkTheme(self): + dark_stylesheet = """ + QMainWindow { + background-color: #2b2b2b; + color: #ffffff; + } + QMenuBar { + background-color: #2b2b2b; + color: #ffffff; + } + QMenuBar::item { + background-color: #2b2b2b; + color: #ffffff; + } + QMenuBar::item:selected { + background-color: #3c3c3c; + } + QMenu { + background-color: #2b2b2b; + color: #ffffff; + } + QMenu::item:selected { + background-color: #3c3c3c; + } + QToolBar { + background-color: #2b2b2b; + color: #ffffff; + } + QToolButton { + background-color: #2b2b2b; + color: #ffffff; + } + QToolButton:hover { + background-color: #3c3c3c; + } + QStatusBar { + background-color: #2b2b2b; + color: #ffffff; + } + QTreeWidget { + background-color: #2b2b2b; + color: #ffffff; + } + QTreeWidget::item { + background-color: #2b2b2b; + color: #ffffff; + } + QTreeWidget::item:selected { + background-color: #3c3c3c; + } + QLineEdit { + background-color: #3c3c3c; + color: #ffffff; + } + QPushButton { + background-color: #3c3c3c; + color: #ffffff; + } + QPushButton:hover { + background-color: #4d4d4d; + } + QTextEdit { + background-color: #3c3c3c; + color: #ffffff; + } + QComboBox { + background-color: #3c3c3c; + color: #ffffff; + } + QComboBox QAbstractItemView { + background-color: #3c3c3c; + color: #ffffff; + } + QProgressBar { + background-color: #3c3c3c; + color: #ffffff; + } + QLabel { + color: #ffffff; + } + QDialog { + background-color: #2b2b2b; + color: #ffffff; + } + """ + self.setStyleSheet(dark_stylesheet) + def loadSettings(self): - global channel_info, file_paths self.settings_file = "settings.json" if os.path.exists(self.settings_file): with open(self.settings_file, "r", encoding="utf-8") as file: self.settings = json.load(file) # 설정 파일 로드 self.default_save_path = self.settings.get("default_save_path", os.path.join(os.path.expanduser("~"), "Desktop")) self.last_opened_dir = self.settings.get("last_opened_dir", os.path.expanduser("~")) - self.saveSettings() + theme = self.settings.get("theme", "light") + if theme == "dark": + self.applyDarkTheme() + else: + self.setStyleSheet("") else: self.settings = {"theme": "light"} # 기본 설정 self.default_save_path = os.path.join(os.path.expanduser("~"), "Desktop") # 바탕화면 경로 설정 self.last_opened_dir = os.path.expanduser("~") def saveSettings(self): - global channel_info, file_paths self.settings["default_save_path"] = self.default_save_path - self.settings["file_paths"] = self.file_paths self.settings["last_opened_dir"] = self.last_opened_dir with open(self.settings_file, "w", encoding="utf-8") as file: json.dump(self.settings, file, ensure_ascii=False, indent=4) # 설정 파일 저장 @@ -244,6 +339,7 @@ class MainView(QtWidgets.QMainWindow): self.tree = QtWidgets.QTreeWidget() self.tree.setColumnCount(4) self.tree.setHeaderLabels(['파일명', '파일경로', '채널', '파일크기']) + self.tree.setSortingEnabled(True) # 정렬 기능 활성화 self.tree.setColumnWidth(0, 400) # 파일명 너비 설정 self.tree.setColumnWidth(1, 450) # 파일경로 너비 설정 self.tree.setColumnWidth(2, 50) # 채널 너비 설정 @@ -389,7 +485,6 @@ class MainView(QtWidgets.QMainWindow): for item in selected_items: index = self.tree.indexOfTopLevelItem(item) file_path = os.path.join(item.text(1), item.text(0)) - self.removeChannelInfo(file_path) # 채널 정보 제거 self.tree.takeTopLevelItem(index) self.file_paths = [self.tree.topLevelItem(i).text(1) + '/' + self.tree.topLevelItem(i).text(0) for i in range(self.tree.topLevelItemCount())] self.updateAlertText(f"파일 삭제 완료", deleted_files) @@ -404,18 +499,11 @@ class MainView(QtWidgets.QMainWindow): for i in range(self.tree.topLevelItemCount()): item = self.tree.topLevelItem(i) file_path = os.path.join(item.text(1), item.text(0)) - self.removeChannelInfo(file_path) # 채널 정보 제거 self.tree.clear() self.file_paths = [] self.updateAlertText(f"모든 파일 삭제 완료", deleted_files) self.saveSettings() - def removeChannelInfo(self, file_path): - if "channel_info" in self.settings and file_path in self.settings["channel_info"]: - del self.settings["channel_info"][file_path] - self.saveSettings() - print(f"[INFO] Removed channel info for {file_path}") - def clearAlerts(self): self.alert_text.clear() @@ -470,29 +558,71 @@ class MainView(QtWidgets.QMainWindow): def openSettings(self): settings_window = QtWidgets.QDialog(self) settings_window.setWindowTitle("설정") - settings_window.setGeometry(100, 100, 400, 300) + settings_window.setGeometry(100, 100, 800, 600) layout = QtWidgets.QVBoxLayout(settings_window) - label = QtWidgets.QLabel("설정 창입니다.") - label.setAlignment(QtCore.Qt.AlignCenter) - layout.addWidget(label) + + theme_label = QtWidgets.QLabel("테마 선택:") + layout.addWidget(theme_label) + + self.light_theme_radio = QtWidgets.QRadioButton("Light") + self.dark_theme_radio = QtWidgets.QRadioButton("Dark") + + layout.addWidget(self.light_theme_radio) + layout.addWidget(self.dark_theme_radio) + + # 현재 설정된 테마에 따라 라디오 버튼 상태 설정 + if self.settings.get("theme", "light") == "light": + self.light_theme_radio.setChecked(True) + else: + self.dark_theme_radio.setChecked(True) + + self.light_theme_radio.toggled.connect(self.onThemeChanged) + self.dark_theme_radio.toggled.connect(self.onThemeChanged) + self.centerDialog(settings_window) settings_window.exec_() + def onThemeChanged(self): + if self.light_theme_radio.isChecked(): + self.settings["theme"] = "light" + self.setStyleSheet("") + elif self.dark_theme_radio.isChecked(): + self.settings["theme"] = "dark" + self.applyDarkTheme() + self.saveSettings() + def openAbout(self): about_window = QtWidgets.QDialog(self) about_window.setWindowTitle("프로그램 정보") - about_window.setGeometry(100, 100, 400, 300) + about_window.setGeometry(100, 100, 300, 150) layout = QtWidgets.QVBoxLayout(about_window) - label1 = QtWidgets.QLabel("이 프로그램은 DBC 파일을 C 파일로 변환합니다.") - label1.setAlignment(QtCore.Qt.AlignCenter) + icon_label = QtWidgets.QLabel() + icon_path = os.path.join(os.path.abspath("."), "icon/icon.png") + pixmap = QtGui.QPixmap(icon_path) + scaled_pixmap = pixmap.scaled(100, 100, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation) + icon_label.setPixmap(scaled_pixmap) + icon_label.setAlignment(QtCore.Qt.AlignCenter) - label3 = QtWidgets.QLabel(f"버전: {self.version}") - label3.setAlignment(QtCore.Qt.AlignCenter) + label1 = QtWidgets.QLabel("DBC Converter") + label1.setAlignment(QtCore.Qt.AlignLeft) + label1.setContentsMargins(20, 5, 0, 0) # 좌측 여백 및 상하 여백 추가 + label2 = QtWidgets.QLabel("DBC 파일을 C 파일로 변환") + label2.setAlignment(QtCore.Qt.AlignLeft) + label2.setContentsMargins(20, 5, 0, 0) # 좌측 여백 및 상하 여백 추가 + + label3 = QtWidgets.QLabel(f"버전 {self.version}") + label3.setAlignment(QtCore.Qt.AlignLeft) + label3.setContentsMargins(20, 5, 0, 0) # 좌측 여백 및 상하 여백 추가 + + layout.addWidget(icon_label) layout.addWidget(label1) + layout.addWidget(label2) layout.addWidget(label3) + layout.addStretch() # 하단 여백 추가 self.centerDialog(about_window) + about_window.setStyleSheet(self.styleSheet()) # 다크 테마 적용 about_window.exec_() def populateTreeView(self, file_paths): @@ -567,13 +697,9 @@ class MainView(QtWidgets.QMainWindow): self.progress_bar.setVisible(False) def onHeaderClicked(self, logicalIndex): - header = self.tree.headerItem() - if header.text(logicalIndex).endswith("▲"): - self.sortTreeView(logicalIndex, True) - header.setText(logicalIndex, header.text(logicalIndex).replace("▲", "▼")) - else: - self.sortTreeView(logicalIndex, False) - header.setText(logicalIndex, header.text(logicalIndex).replace("▼", "▲")) + header = self.tree.header() + order = header.sortIndicatorOrder() + self.tree.sortItems(logicalIndex, order) def onItemDoubleClicked(self, item, column): if column == 0: # 파일명을 더블클릭한 경우 diff --git a/settings.json b/settings.json index 656cc45..b62a6ef 100644 --- a/settings.json +++ b/settings.json @@ -1,7 +1,5 @@ { "theme": "light", "default_save_path": "C:/Users/MSI/Desktop", - "file_paths": [], - "last_opened_dir": "C:/Users/MSI/SynologyDrive/3min_be/한자연/!과제/초안전/#Debug/DBC", - "channel_info": {} + "last_opened_dir": "C:/Users/MSI/SynologyDrive/3min_be/한자연/!과제/초안전/#Debug/DBC" } \ No newline at end of file