diff --git a/DBC_Converter.py b/DBC_Converter.py index 4c52ff9..c85a05e 100644 --- a/DBC_Converter.py +++ b/DBC_Converter.py @@ -13,9 +13,9 @@ class MainView(QtWidgets.QMainWindow): self.file_paths = [] # 파일 경로 저장 리스트 self.loadSettings() # 설정 로드 self.setupUI() # UI 설정 - self.setButtons() # 버튼 설정 + self.centerWindow() # 창을 화면 중앙에 위치 self.sortTreeView(0, True) # 기본 파일명 오름차순 정렬 - self.channel_options = ["채널 1", "채널 2", "채널 3"] # 채널 옵션 설정 + self.channel_options = ["1", "2", "3", "4", "5", "6"] # 채널 옵션 설정 def loadSettings(self): self.settings_file = "settings.json" @@ -24,17 +24,17 @@ class MainView(QtWidgets.QMainWindow): self.settings = json.load(file) # 설정 파일 로드 self.default_save_path = self.settings.get("default_save_path", self.default_save_path) self.file_paths = self.settings.get("file_paths", []) + self.last_opened_dir = self.settings.get("last_opened_dir", os.path.expanduser("~")) else: self.settings = {"theme": "light"} # 기본 설정 + self.last_opened_dir = os.path.expanduser("~") def saveSettings(self): - settings = { - "theme": self.settings.get("theme", "light"), - "default_save_path": self.default_save_path, - "file_paths": self.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(settings, file, ensure_ascii=False) # 설정 파일 저장 + json.dump(self.settings, file, ensure_ascii=False, indent=4) # 설정 파일 저장 def setupUI(self): self.setWindowTitle("DBC to C Converter") @@ -49,44 +49,88 @@ class MainView(QtWidgets.QMainWindow): tools_menu = self.menu_bar.addMenu("도구") # 파일 메뉴 항목 추가 - file_menu.addAction("파일 추가", self.FilesOpen) - file_menu.addSeparator() - file_menu.addAction("선택 파일 삭제", self.deleteSelectedFiles) - file_menu.addSeparator() - file_menu.addAction("모든 파일 삭제", self.deleteAllFiles) + add_file_action = QtWidgets.QAction("파일 추가", self) + add_file_action.setShortcut('Ctrl+O') + add_file_action.triggered.connect(self.FilesOpen) + file_menu.addAction(add_file_action) + + delete_selected_action = QtWidgets.QAction("선택 파일 삭제", self) + delete_selected_action.setShortcut('Delete') + delete_selected_action.triggered.connect(self.deleteSelectedFiles) + file_menu.addAction(delete_selected_action) + + delete_all_action = QtWidgets.QAction("모든 파일 삭제", self) + delete_all_action.setShortcut('Ctrl+Shift+Delete') + delete_all_action.triggered.connect(self.deleteAllFiles) + file_menu.addAction(delete_all_action) # 편집 메뉴 항목 추가 - edit_menu.addAction("모두 선택", self.selectAllFiles) - edit_menu.addSeparator() - edit_menu.addAction("선택 반전", self.invertSelection) + select_all_action = QtWidgets.QAction("모두 선택", self) + select_all_action.setShortcut('Ctrl+A') + select_all_action.triggered.connect(self.selectAllFiles) + edit_menu.addAction(select_all_action) + + invert_selection_action = QtWidgets.QAction("선택 반전", self) + invert_selection_action.setShortcut('Ctrl+I') + invert_selection_action.triggered.connect(self.invertSelection) + edit_menu.addAction(invert_selection_action) # 보기 메뉴 항목 추가 size_menu = view_menu.addMenu("창크기") - size_menu.addAction("작게", lambda: self.setWindowSize("small")) - size_menu.addSeparator() - size_menu.addAction("보통", lambda: self.setWindowSize("medium")) - size_menu.addSeparator() - size_menu.addAction("크게", lambda: self.setWindowSize("large")) - size_menu.addSeparator() - size_menu.addAction("자동", lambda: self.setWindowSize("auto")) + size_menu.addAction("작게", lambda: self.setWindowSize("small")).setShortcut('Ctrl+1') + size_menu.addAction("보통", lambda: self.setWindowSize("medium")).setShortcut('Ctrl+2') + size_menu.addAction("크게", lambda: self.setWindowSize("large")).setShortcut('Ctrl+3') + size_menu.addAction("자동", lambda: self.setWindowSize("auto")).setShortcut('Ctrl+4') sort_menu = view_menu.addMenu("정렬") - sort_menu.addAction("파일명 오름차순", lambda: self.sortTreeView(0, False)) - sort_menu.addSeparator() - sort_menu.addAction("파일명 내림차순", lambda: self.sortTreeView(0, True)) - sort_menu.addSeparator() - sort_menu.addAction("파일경로 오름차순", lambda: self.sortTreeView(1, False)) - sort_menu.addSeparator() - sort_menu.addAction("파일경로 내림차순", lambda: self.sortTreeView(1, True)) - sort_menu.addSeparator() - sort_menu.addAction("파일크기 오름차순", lambda: self.sortTreeView(3, False)) - sort_menu.addSeparator() - sort_menu.addAction("파일크기 내림차순", lambda: self.sortTreeView(3, True)) + sort_menu.addAction("파일명 오름차순", lambda: self.sortTreeView(0, False)).setShortcut('Ctrl+Shift+N') + sort_menu.addAction("파일명 내림차순", lambda: self.sortTreeView(0, True)).setShortcut('Ctrl+Shift+M') + sort_menu.addAction("파일경로 오름차순", lambda: self.sortTreeView(1, False)).setShortcut('Ctrl+Shift+P') + sort_menu.addAction("파일경로 내림차순", lambda: self.sortTreeView(1, True)).setShortcut('Ctrl+Shift+Q') + sort_menu.addAction("파일크기 오름차순", lambda: self.sortTreeView(3, False)).setShortcut('Ctrl+Shift+S') + sort_menu.addAction("파일크기 내림차순", lambda: self.sortTreeView(3, True)).setShortcut('Ctrl+Shift+T') # 도구 메뉴 항목 추가 - tools_menu.addAction("설정", self.openSettings) - tools_menu.addSeparator() - tools_menu.addAction("프로그램 정보", self.openAbout) + settings_action = QtWidgets.QAction("설정", self) + settings_action.setShortcut('Ctrl+P') + settings_action.triggered.connect(self.openSettings) + tools_menu.addAction(settings_action) + + about_action = QtWidgets.QAction("프로그램 정보", self) + about_action.setShortcut('Ctrl+I') + about_action.triggered.connect(self.openAbout) + tools_menu.addAction(about_action) + + # 툴바 추가 + self.toolbar = self.addToolBar("Main Toolbar") + add_file_action = QtWidgets.QAction(QtGui.QIcon("img/add_file.png"), "파일 추가", self) + add_file_action.setShortcut('Ctrl+O') + add_file_action.triggered.connect(self.FilesOpen) + self.toolbar.addAction(add_file_action) + + delete_file_action = QtWidgets.QAction(QtGui.QIcon("img/delete_file.png"), "선택 파일 삭제", self) + delete_file_action.setShortcut('Delete') + delete_file_action.triggered.connect(self.deleteSelectedFiles) + self.toolbar.addAction(delete_file_action) + + delete_all_action = QtWidgets.QAction(QtGui.QIcon("img/delete_all.png"), "모든 파일 삭제", self) + delete_all_action.setShortcut('Ctrl+Shift+Delete') + delete_all_action.triggered.connect(self.deleteAllFiles) + self.toolbar.addAction(delete_all_action) + + delete_description_action = QtWidgets.QAction(QtGui.QIcon("img/delete_description.png"), "알림창 내용 삭제", self) + delete_description_action.setShortcut('Ctrl+Shift+D') + delete_description_action.triggered.connect(self.clearAlerts) + self.toolbar.addAction(delete_description_action) + + convert_action = QtWidgets.QAction(QtGui.QIcon("img/convert.png"), "변환", self) + convert_action.setShortcut('Ctrl+R') + convert_action.triggered.connect(self.convertFiles) + self.toolbar.addAction(convert_action) + + # 상태바 추가 + self.status_bar = self.statusBar() + self.status_bar.showMessage("준비 완료") # 메인 위젯 설정 main_widget = QtWidgets.QWidget() @@ -97,60 +141,37 @@ class MainView(QtWidgets.QMainWindow): self.tree = QtWidgets.QTreeWidget() self.tree.setColumnCount(4) self.tree.setHeaderLabels(['파일명', '파일경로', '채널', '파일크기']) + self.tree.setColumnWidth(0, 400) # 파일명 너비 설정 + self.tree.setColumnWidth(1, 450) # 파일경로 너비 설정 + self.tree.setColumnWidth(2, 50) # 채널 너비 설정 + self.tree.setColumnWidth(3, 50) # 파일크기 너비 설정 self.tree.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) self.tree.header().sectionClicked.connect(self.onHeaderClicked) self.tree.itemDoubleClicked.connect(self.onItemDoubleClicked) main_layout.addWidget(self.tree) - # 버튼 프레임 설정 - button_frame = QtWidgets.QWidget() - button_layout = QtWidgets.QHBoxLayout(button_frame) - main_layout.addWidget(button_frame) - - self.btn_list = QtWidgets.QPushButton("파일 추가") - self.btn_list.clicked.connect(self.FilesOpen) - button_layout.addWidget(self.btn_list) - - self.btn_delete = QtWidgets.QPushButton("파일 삭제") - self.btn_delete.clicked.connect(self.deleteSelectedFiles) - button_layout.addWidget(self.btn_delete) - - self.btn_delete_all = QtWidgets.QPushButton("모든 파일 삭제") - self.btn_delete_all.clicked.connect(self.deleteAllFiles) - button_layout.addWidget(self.btn_delete_all) - - self.btn_convert = QtWidgets.QPushButton("변환") - self.btn_convert.clicked.connect(self.convertFiles) - button_layout.addWidget(self.btn_convert) - - self.btn_clear_alerts = QtWidgets.QPushButton("알림창 내용 삭제") - self.btn_clear_alerts.clicked.connect(self.clearAlerts) - button_layout.addWidget(self.btn_clear_alerts) - # 알림창 설정 self.alert_text = QtWidgets.QTextEdit() self.alert_text.setReadOnly(True) main_layout.addWidget(self.alert_text) - # 초기 테마 설정 적용 - if self.settings["theme"] == "light": - self.setLightMode() + def centerWindow(self): + frame_geometry = self.frameGeometry() + screen_center = QtWidgets.QDesktopWidget().availableGeometry().center() + frame_geometry.moveCenter(screen_center) + self.move(frame_geometry.topLeft()) - def setButtons(self): - self.btn_list.clicked.disconnect() - self.btn_delete.clicked.disconnect() - self.btn_delete_all.clicked.disconnect() - self.btn_clear_alerts.clicked.disconnect() - self.btn_list.clicked.connect(self.FilesOpen) - self.btn_delete.clicked.connect(self.deleteSelectedFiles) - self.btn_delete_all.clicked.connect(self.deleteAllFiles) - self.btn_clear_alerts.clicked.connect(self.clearAlerts) + def centerDialog(self, dialog): + dialog_geometry = dialog.frameGeometry() + dialog_geometry.moveCenter(self.frameGeometry().center()) + dialog.move(dialog_geometry.topLeft()) def FilesOpen(self): file_paths, _ = QtWidgets.QFileDialog.getOpenFileNames( - self, "파일 열기", "", "DBC 파일 (*.dbc);;모든 파일 (*.*)" + self, "파일 열기", self.last_opened_dir, "DBC 파일 (*.dbc);;모든 파일 (*.*)" ) if file_paths: + self.last_opened_dir = os.path.dirname(file_paths[0]) existing_files = [self.tree.topLevelItem(i).text(0) for i in range(self.tree.topLevelItemCount())] duplicate_files = [os.path.split(file_path)[1] for file_path in file_paths if os.path.split(file_path)[1] in existing_files] new_files = [file_path for file_path in file_paths if os.path.split(file_path)[1] not in existing_files] @@ -162,6 +183,7 @@ class MainView(QtWidgets.QMainWindow): self.populateTreeView(new_files) self.file_paths.extend(new_files) # 파일 경로 저장 self.updateAlertText(f"파일 추가 완료", [os.path.split(file_path)[1] for file_path in new_files]) + self.saveSettings() def deleteSelectedFiles(self): selected_items = self.tree.selectedItems() @@ -174,6 +196,7 @@ class MainView(QtWidgets.QMainWindow): index = self.tree.indexOfTopLevelItem(item) self.tree.takeTopLevelItem(index) self.updateAlertText(f"파일 삭제 완료", deleted_files) + self.saveSettings() def deleteAllFiles(self): if self.tree.topLevelItemCount() == 0: @@ -183,6 +206,7 @@ class MainView(QtWidgets.QMainWindow): deleted_files = [self.tree.topLevelItem(i).text(0) for i in range(self.tree.topLevelItemCount())] self.tree.clear() self.updateAlertText(f"모든 파일 삭제 완료", deleted_files) + self.saveSettings() def clearAlerts(self): self.alert_text.clear() @@ -198,9 +222,9 @@ class MainView(QtWidgets.QMainWindow): duplicate_files_str = "\n".join(duplicate_files) new_files_str = "\n".join(new_files_names) if new_files: - self.showWarning("중복 파일 경고", f"중복 파일이 존재합니다\n\n{duplicate_files_str}\n\n\n중복 파일을 제외한 신규 파일을 추가합니다\n\n{new_files_str}") + self.showWarning("중복 파일 경고", f"**중복 파일이 존재합니다**\n\n{duplicate_files_str}\n\n\n**중복 파일을 제외한 신규 파일을 추가합니다**\n\n{new_files_str}") else: - self.showWarning("중복 파일 경고", f"중복 파일이 존재합니다\n\n{duplicate_files_str}") + self.showWarning("중복 파일 경고", f"**중복 파일이 존재합니다**\n\n{duplicate_files_str}") def sortTreeView(self, col, reverse): items = [] @@ -238,6 +262,7 @@ class MainView(QtWidgets.QMainWindow): label = QtWidgets.QLabel("설정 창입니다.") label.setAlignment(QtCore.Qt.AlignCenter) layout.addWidget(label) + self.centerDialog(settings_window) settings_window.exec_() def openAbout(self): @@ -254,19 +279,9 @@ class MainView(QtWidgets.QMainWindow): label3 = QtWidgets.QLabel(f"버전: {self.version}") label3.setAlignment(QtCore.Qt.AlignCenter) layout.addWidget(label3) + self.centerDialog(about_window) about_window.exec_() - def setLightMode(self): - self.setStyleSheet("background-color: white; color: black;") - self.alert_text.setStyleSheet("background-color: white; color: black;") - self.tree.setStyleSheet("background-color: white; color: black;") - self.menu_bar.setStyleSheet("background-color: white; color: black;") - self.btn_list.setStyleSheet("background-color: white; color: black;") - self.btn_delete.setStyleSheet("background-color: white; color: black;") - self.btn_delete_all.setStyleSheet("background-color: white; color: black;") - self.btn_convert.setStyleSheet("background-color: white; color: black;") - self.btn_clear_alerts.setStyleSheet("background-color: white; color: black;") - def populateTreeView(self, file_paths): def format_file_size(size_in_bytes): size_in_kb = size_in_bytes / 1024 @@ -284,6 +299,7 @@ class MainView(QtWidgets.QMainWindow): for file in file_list: self.alert_text.append(f" - {file}") self.alert_text.setAlignment(QtCore.Qt.AlignLeft) + self.alert_text.setStyleSheet("QTextEdit { line-height: 2.5; }") def convertFiles(self): for file_path in self.file_paths: @@ -309,6 +325,35 @@ class MainView(QtWidgets.QMainWindow): os.startfile(file_path) elif column == 1: # 경로를 더블클릭한 경우 os.startfile(item.text(1)) + elif column == 2: # 채널을 더블클릭한 경우 + self.openChannelDialog(item) + + def openChannelDialog(self, item): + channel_dialog = QtWidgets.QDialog(self) + channel_dialog.setWindowTitle("채널 선택") + channel_dialog.setGeometry(100, 100, 200, 100) + layout = QtWidgets.QVBoxLayout(channel_dialog) + + channel_combo = QtWidgets.QComboBox() + channel_combo.addItems(self.channel_options) + layout.addWidget(channel_combo) + + button_layout = QtWidgets.QHBoxLayout() + apply_button = QtWidgets.QPushButton("확인") + apply_button.clicked.connect(lambda: self.applyChannelSelection(item, channel_combo, channel_dialog)) + button_layout.addWidget(apply_button) + + cancel_button = QtWidgets.QPushButton("취소") + cancel_button.clicked.connect(channel_dialog.close) + button_layout.addWidget(cancel_button) + + layout.addLayout(button_layout) + self.centerDialog(channel_dialog) + channel_dialog.exec_() + + def applyChannelSelection(self, item, combo, dialog): + item.setText(2, combo.currentText()) + dialog.close() if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) diff --git a/img/add_file.png b/img/add_file.png new file mode 100644 index 0000000..ca84780 Binary files /dev/null and b/img/add_file.png differ diff --git a/img/convert.png b/img/convert.png new file mode 100644 index 0000000..f453f61 Binary files /dev/null and b/img/convert.png differ diff --git a/img/delete_all.png b/img/delete_all.png new file mode 100644 index 0000000..481a6b7 Binary files /dev/null and b/img/delete_all.png differ diff --git a/img/delete_description.png b/img/delete_description.png new file mode 100644 index 0000000..0d4581d Binary files /dev/null and b/img/delete_description.png differ diff --git a/img/delete_file.png b/img/delete_file.png new file mode 100644 index 0000000..3accae4 Binary files /dev/null and b/img/delete_file.png differ diff --git a/settings.json b/settings.json index 6a5d1e0..b9fdb1f 100644 --- a/settings.json +++ b/settings.json @@ -1 +1,14 @@ -{"theme": "light"} \ No newline at end of file +{ + "theme": "light", + "default_save_path": "C:\\Users\\blueb\\Desktop", + "file_paths": [ + "C:/Users/blueb/SynologyDrive/3min_be/한자연/!사업/초안전/#Debug/DBC/240906_VCU_SCU_RWS.dbc", + "C:/Users/blueb/SynologyDrive/3min_be/한자연/!사업/초안전/#Debug/DBC/CAN_2023WRS_RG3EV_231123_VCU_EMB.dbc", + "C:/Users/blueb/SynologyDrive/3min_be/한자연/!사업/초안전/#Debug/DBC/240906_VCU_SCU_RWS.dbc", + "C:/Users/blueb/SynologyDrive/3min_be/한자연/!사업/초안전/#Debug/DBC/241007_primary_HyperSafe4.dbc", + "C:/Users/blueb/SynologyDrive/3min_be/한자연/!사업/초안전/#Debug/DBC/CAN_2023WRS_RG3EV_240626_VCU_BCU.dbc", + "C:/Users/blueb/SynologyDrive/3min_be/한자연/!사업/초안전/#Debug/DBC/CANFD_SAFETY_v7.dbc", + "C:/Users/blueb/SynologyDrive/3min_be/한자연/!사업/초안전/#Debug/DBC/IMU_SBW_20240826.dbc" + ], + "last_opened_dir": "C:/Users/blueb/SynologyDrive/3min_be/한자연/!사업/초안전/#Debug/DBC" +} \ No newline at end of file