def __init__(self): widgets.MainWindow.__init__( self, "Matcol Editor", ) self.resize(450, 500) self.matcol_data = MatcolFile() self.file_src = "" self.widgets = [] self.tooltips = config.read_config("ovl_util/tooltips/matcol.txt") self.games = ("Jurassic World Evolution", "Planet Zoo") self.default_fgms = config.read_list( "ovl_util/tooltips/matcol-fgm-names.txt") mainMenu = self.menuBar() fileMenu = mainMenu.addMenu('File') helpMenu = mainMenu.addMenu('Help') button_data = ( (fileMenu, "Open", self.open_materialcollection, "CTRL+O", ""), \ (fileMenu, "Save", self.save_materialcollection, "CTRL+S", ""), \ (fileMenu, "Exit", self.close, "", ""), \ (helpMenu, "Report Bug", self.report_bug, "", ""), \ (helpMenu, "Documentation", self.online_support, "", ""), \ ) self.add_to_menu(button_data) self.cleaner = QtCore.QObjectCleanupHandler() self.scrollarea = QtWidgets.QScrollArea(self) self.scrollarea.setWidgetResizable(True) self.setCentralWidget(self.scrollarea) # the actual scrollable stuff self.widget = QtWidgets.QWidget() self.scrollarea.setWidget(self.widget) self.game_container = widgets.LabelCombo("Game:", self.games) # self.game_container.entry.currentIndexChanged.connect(self.game_changed) self.game_container.entry.setEditable(False) self.materialcollection_container = widgets.LabelEdit("MATCOL:") self.tex_container = QtWidgets.QGroupBox("Slots") self.attrib_container = QtWidgets.QGroupBox("Attributes") self.vbox = QtWidgets.QVBoxLayout() self.vbox.addWidget(self.game_container) self.vbox.addWidget(self.materialcollection_container) self.vbox.addWidget(self.tex_container) self.vbox.addWidget(self.attrib_container) self.vbox.addStretch(1) self.widget.setLayout(self.vbox) self.tex_grid = self.create_grid() self.attrib_grid = self.create_grid() self.tex_container.setLayout(self.tex_grid) self.attrib_container.setLayout(self.attrib_grid)
def __init__(self): widgets.MainWindow.__init__( self, "OVL Archive Editor", ) self.resize(800, 600) self.ovl_data = OvlFile(progress_callback=self.update_progress) self.filter = "Supported files ({})".format(" ".join( "*" + t for t in extract.SUPPORTED_TYPES)) self.file_widget = widgets.FileWidget(self, self.cfg) self.file_widget.setToolTip( "The name of the OVL file that is currently open.") self.p_action = QtWidgets.QProgressBar(self) self.p_action.setGeometry(0, 0, 200, 15) self.p_action.setTextVisible(True) self.p_action.setMaximum(1) self.p_action.setValue(0) self.t_action_current_message = "No operation in progress" self.t_action = QtWidgets.QLabel(self, text=self.t_action_current_message) self.game_container = widgets.LabelCombo("Game:", games) self.game_container.entry.currentIndexChanged.connect( self.game_changed) self.game_container.entry.setEditable(False) header_names = ["Name", "File Type", "DJB", "Unk0", "Unk1"] self.files_container = widgets.SortableTable(header_names, self) self.dir_container = widgets.EditCombo(self) # toggles self.t_show_temp_files = QtWidgets.QCheckBox("Save Temp Files") self.t_show_temp_files.setToolTip( "By default, temporary files are converted to usable ones and back on the fly." ) self.t_show_temp_files.setChecked(False) self.t_2K = QtWidgets.QCheckBox("Inject 2K") self.t_2K.setToolTip( "Experimental: Increase a JWE Diffuse or Normal map to 2048x2048 resolution." ) self.t_2K.setChecked(False) self.sp_hash = QtWidgets.QCheckBox("New Species Hash") self.sp_hash.setToolTip("Experimental") self.sp_hash.setChecked(False) self.ext_dat = QtWidgets.QCheckBox("Use External DAT") self.ext_dat.setToolTip( "Experimental: Save the ovl with an external STATIC DAT instead of one in memory" ) self.ext_dat.setChecked(False) self.ext_dat.stateChanged.connect(self.dat_show) self.dat_widget = widgets.FileWidget(self, self.cfg, ask_user=False, dtype="DAT", poll=False) self.dat_widget.setToolTip("External .dat file path") self.dat_widget.hide() self.e_name_pairs = [(QtWidgets.QLineEdit("old"), QtWidgets.QLineEdit("new")) for i in range(1)] self.t_write_dat = QtWidgets.QCheckBox("Save DAT") self.t_write_dat.setToolTip( "Writes decompressed archive streams to DAT files for debugging.") self.t_write_dat.setChecked(False) self.t_write_dat.stateChanged.connect(self.load) self.t_write_frag_log = QtWidgets.QCheckBox("Save Frag Log") self.t_write_frag_log.setToolTip("For devs.") self.t_write_frag_log.setChecked(False) self.t_write_frag_log.stateChanged.connect(self.load) self.qgrid = QtWidgets.QGridLayout() self.qgrid.addWidget(self.file_widget, 0, 0, 1, 5) self.qgrid.addWidget(self.t_show_temp_files, 1, 0) self.qgrid.addWidget(self.t_write_dat, 1, 1) self.qgrid.addWidget(self.t_write_frag_log, 1, 2) self.qgrid.addWidget(self.ext_dat, 1, 3) self.qgrid.addWidget(self.sp_hash, 1, 4) for (old, new) in self.e_name_pairs: self.qgrid.addWidget(old, 2, 0, 1, 2) self.qgrid.addWidget(new, 2, 2, 1, 2) self.qgrid.addWidget( self.game_container, 2, 4, ) self.qgrid.addWidget(self.files_container, 3, 0, 1, 5) self.qgrid.addWidget(self.dir_container, 4, 0, 1, 5) self.qgrid.addWidget(self.p_action, 5, 0, 1, 5) self.qgrid.addWidget(self.t_action, 6, 0, 1, 5) self.qgrid.addWidget(self.dat_widget, 7, 0, 1, 5) self.central_widget.setLayout(self.qgrid) mainMenu = self.menuBar() fileMenu = mainMenu.addMenu('File') editMenu = mainMenu.addMenu('Edit') helpMenu = mainMenu.addMenu('Help') button_data = ( (fileMenu, "New", self.file_widget.ask_open_dir, "CTRL+N", "new"), (fileMenu, "Open", self.file_widget.ask_open, "CTRL+O", "dir"), (fileMenu, "Save", self.save_ovl, "CTRL+S", "save"), (fileMenu, "Exit", self.close, "", "exit"), (editMenu, "Unpack", self.extract_all, "CTRL+U", "extract"), (editMenu, "Inject", self.inject, "CTRL+I", "inject"), (editMenu, "Rename", self.hasher, "CTRL+R", ""), (editMenu, "Dat Edit", self.dat_replacement, "CTRL+J", ""), (editMenu, "Remove Selected", self.remover, "DEL", ""), (editMenu, "Walk", self.walker, "", ""), # (editMenu, "Reload", self.reload, "", ""), (editMenu, "Generate Hash Table", self.walker_hash, "", ""), (helpMenu, "Report Bug", self.report_bug, "", "report"), (helpMenu, "Documentation", self.online_support, "", "manual")) self.add_to_menu(button_data) self.check_version() self.load_hash_table()
def __init__(self): """View initializer.""" super().__init__() # save config file name from args self.config_path = '' # Set some main window's properties self.setWindowTitle('Mod Pack Tool ' + __version__ ) self.setFixedSize(435, 125) # Add a menu main_menu = QMenuBar(self) file_menu = main_menu.addMenu('File') help_menu = main_menu.addMenu('Help') button_data = ( (file_menu, "Open", self.load_config, "CTRL+O", "dir"), (file_menu, "Save", self.save_config, "CTRL+S", "save"), (file_menu, "Exit", self.close, "", "exit"), (help_menu, "Report Bug", self.report_bug, "", "report"), (help_menu, "Documentation", self.online_support, "", "manual")) self.add_to_menu(button_data) self.setMenuBar(main_menu) self.aboutAction = QAction("&About", self) help_menu.addAction(self.aboutAction) # Set the central widget self.generalLayout = QVBoxLayout() self._centralWidget = QWidget() self._centralWidget.setLayout(self.generalLayout) self.setCentralWidget(self._centralWidget) # Add app widgets self.src_widget = widgets.DirWidget(self, {}) self.src_widget.setToolTip("Source folder to pack files from.") self.generalLayout.addWidget(self.src_widget) self.dst_widget = widgets.DirWidget(self, {}) self.dst_widget.setToolTip("Destination folder to pack files to.") self.generalLayout.addWidget(self.dst_widget) # Add a line for controls self.boxLayout = QHBoxLayout() self.boxLayout.addStretch(1) self.generalLayout.addLayout(self.boxLayout) # Add a button self.watch = QCheckBox("Watch changes") self.watch.setToolTip("Experimental") self.watch.setChecked(False) self.watch.stateChanged.connect(self.watchChanged) self.boxLayout.addWidget(self.watch) self.fs_watcher = '' self.game_container = widgets.LabelCombo("Game:", [g.value for g in games]) self.boxLayout.addWidget(self.game_container) self.packButton = QPushButton("Pack") self.boxLayout.addWidget(self.packButton) self.packButton.clicked.connect(self.pack_mod) if len(sys.argv) > 1: self.apply_from_config(sys.argv[1])
def __init__(self): widgets.MainWindow.__init__( self, "FGM Editor", ) self.resize(800, 600) self.fgm_data = FgmFile() self.widgets = [] self.tooltips = config.read_config("ovl_util/tooltips/fgm.txt") self.shaders = {} for game in games: self.shaders[game] = config.read_list( f"ovl_util/tooltips/fgm-shaders-{game.lower().replace(' ', '-')}.txt" ) self.cleaner = QtCore.QObjectCleanupHandler() self.scrollarea = QtWidgets.QScrollArea(self) self.scrollarea.setWidgetResizable(True) self.setCentralWidget(self.scrollarea) # the actual scrollable stuff self.widget = QtWidgets.QWidget() self.scrollarea.setWidget(self.widget) self.game_container = widgets.LabelCombo("Game:", games) self.game_container.entry.currentIndexChanged.connect( self.game_changed) self.game_container.entry.setEditable(False) self.file_widget = widgets.FileWidget(self, self.cfg, dtype="FGM") self.shader_container = widgets.LabelCombo("Shader:", ()) self.shader_container.entry.activated.connect(self.shader_changed) self.tex_container = QtWidgets.QGroupBox("Textures") self.attrib_container = QtWidgets.QGroupBox("Attributes") vbox = QtWidgets.QVBoxLayout() vbox.addWidget(self.file_widget) vbox.addWidget(self.game_container) vbox.addWidget(self.shader_container) vbox.addWidget(self.tex_container) vbox.addWidget(self.attrib_container) vbox.addStretch(1) self.widget.setLayout(vbox) self.tex_grid = self.create_grid() self.attrib_grid = self.create_grid() self.tex_container.setLayout(self.tex_grid) self.attrib_container.setLayout(self.attrib_grid) mainMenu = self.menuBar() fileMenu = mainMenu.addMenu('File') helpMenu = mainMenu.addMenu('Help') button_data = ( (fileMenu, "Open", self.file_widget.ask_open, "CTRL+O", ""), \ (fileMenu, "Save", self.save_fgm, "CTRL+S", ""), \ (fileMenu, "Exit", self.close, "", ""), \ (helpMenu, "Report Bug", self.report_bug, "", ""), \ (helpMenu, "Documentation", self.online_support, "", ""), \ ) self.add_to_menu(button_data)
def __init__(self): widgets.MainWindow.__init__( self, "OVL Archive Editor", ) self.resize(800, 600) self.ovl_data = OvlFile(progress_callback=self.update_progress) self.ovl_data.load_hash_table() self.filter = "Supported files ({})".format(" ".join( "*" + t for t in SUPPORTED_TYPES)) self.file_widget = widgets.FileWidget(self, self.cfg) self.file_widget.setToolTip( "The name of the OVL file that is currently open") self.p_action = QtWidgets.QProgressBar(self) self.p_action.setGeometry(0, 0, 200, 15) self.p_action.setTextVisible(True) self.p_action.setMaximum(1) self.p_action.setValue(0) self.t_action_current_message = "No operation in progress" self.t_action = QtWidgets.QLabel(self, text=self.t_action_current_message) self.game_choice = widgets.LabelCombo("Game:", [g.value for g in games]) # only listen to user changes self.game_choice.entry.textActivated.connect(self.game_changed) self.game_choice.entry.setEditable(False) self.compression_choice = widgets.LabelCombo( "Compression:", [c.name for c in Compression]) # only listen to user changes self.compression_choice.entry.textActivated.connect( self.compression_changed) self.compression_choice.entry.setEditable(False) header_names = ["Name", "File Type", "DJB"] self.model = QtWidgets.QFileSystemModel() self.dirs_container = QtWidgets.QTreeView() self.dirs_container.setModel(self.model) self.dirs_container.setColumnHidden(1, True) self.dirs_container.setColumnHidden(2, True) self.dirs_container.setColumnHidden(3, True) self.dirs_container.doubleClicked.connect(self.dirs_clicked) self.set_game_dir() self.dirs_container.header().setSortIndicator(0, QtCore.Qt.AscendingOrder) self.dirs_container.model().sort( self.dirs_container.header().sortIndicatorSection(), self.dirs_container.header().sortIndicatorOrder()) self.dirs_container.setAnimated(False) self.dirs_container.setIndentation(20) self.dirs_container.setSortingEnabled(True) self.dirs_container.setWindowTitle("Dir View") self.dirs_container.resize(640, 480) # create the table self.files_container = widgets.SortableTable(header_names, IGNORE_TYPES) # connect the interaction functions self.files_container.table.model.member_renamed.connect( self.rename_handle) self.files_container.table.files_dragged.connect(self.drag_files) self.files_container.table.files_dropped.connect(self.inject_files) # self.files_container.table.file_selected.connect(self.show_dependencies) self.included_ovls_view = widgets.EditCombo(self) self.included_ovls_view.setToolTip( "These OVL files are loaded by the current OVL file, so their files are included" ) self.included_ovls_view.entries_changed.connect( self.ovl_data.set_included_ovl_names) self.dat_widget = widgets.FileWidget(self, self.cfg, ask_user=False, dtype="DAT", poll=False) self.dat_widget.setToolTip( "External .dat file path to overwrite internal OVS data") self.dat_widget.hide() right_frame = QtWidgets.QWidget() hbox = QtWidgets.QVBoxLayout() hbox.addWidget(self.file_widget) hbox.addWidget(self.files_container) hbox.addWidget(self.included_ovls_view) hbox.addWidget(self.dat_widget) right_frame.setLayout(hbox) # toggles self.t_show_temp_files = QtWidgets.QCheckBox("Save Temp Files") self.t_show_temp_files.setToolTip( "By default, temporary files are converted to usable ones and back on the fly" ) self.t_show_temp_files.setChecked(False) self.in_folder = QtWidgets.QCheckBox("Process Folder") self.in_folder.setToolTip( "Runs commands on all OVLs of current folder") self.in_folder.setChecked(False) self.ext_dat = QtWidgets.QCheckBox("Use External DAT") self.ext_dat.setToolTip( "Experimental: Save the ovl with an external STATIC DAT instead of one in memory" ) self.ext_dat.setChecked(False) self.ext_dat.stateChanged.connect(self.dat_show) self.t_animal_ovl = QtWidgets.QCheckBox("Animal OVL Mode") self.t_animal_ovl.setToolTip( "Renames only MS2, MDL2 and MOTIONGRAPH files.") self.t_animal_ovl.setChecked(False) self.t_unsafe = QtWidgets.QCheckBox("Unsafe Mode") self.t_unsafe.setToolTip( "Forces unsafe (brute force) replacement. May break your files.") self.t_unsafe.setChecked(False) self.e_name_old = QtWidgets.QTextEdit("old") self.e_name_new = QtWidgets.QTextEdit("new") self.e_name_old.setFixedHeight(100) self.e_name_new.setFixedHeight(100) self.e_name_old.setTabChangesFocus(True) self.e_name_new.setTabChangesFocus(True) self.t_write_dat = QtWidgets.QCheckBox("Save DAT") self.t_write_dat.setToolTip( "Writes decompressed archive streams to DAT files for debugging") self.t_write_dat.setChecked(False) self.t_write_dat.stateChanged.connect(self.load) self.splitter = QtWidgets.QSplitter(QtCore.Qt.Horizontal) self.splitter.addWidget(self.dirs_container) self.splitter.addWidget(right_frame) self.splitter.setSizes([200, 400]) self.splitter.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) self.qgrid = QtWidgets.QGridLayout() self.qgrid.addWidget(self.e_name_old, 0, 0, 5, 1) self.qgrid.addWidget(self.e_name_new, 0, 1, 5, 1) self.qgrid.addWidget(self.t_show_temp_files, 0, 3) self.qgrid.addWidget(self.t_write_dat, 1, 3) self.qgrid.addWidget(self.ext_dat, 2, 3) self.qgrid.addWidget(self.in_folder, 3, 3) self.qgrid.addWidget( self.game_choice, 0, 4, ) self.qgrid.addWidget( self.compression_choice, 1, 4, ) self.qgrid.addWidget(self.t_animal_ovl, 2, 4) self.qgrid.addWidget(self.t_unsafe, 3, 4) self.qgrid.addWidget(self.splitter, 5, 0, 1, 5) self.qgrid.addWidget(self.p_action, 6, 0, 1, 5) self.qgrid.addWidget(self.t_action, 7, 0, 1, 5) self.central_widget.setLayout(self.qgrid) main_menu = self.menuBar() file_menu = main_menu.addMenu('File') edit_menu = main_menu.addMenu('Edit') util_menu = main_menu.addMenu('Util') help_menu = main_menu.addMenu('Help') button_data = ((file_menu, "New", self.file_widget.ask_open_dir, "CTRL+N", "new"), (file_menu, "Open", self.file_widget.ask_open, "CTRL+O", "dir"), (file_menu, "Save", self.save_ovl, "CTRL+S", "save"), (file_menu, "Save As", self.save_as_ovl, "CTRL+SHIFT+S", "save"), (file_menu, "Exit", self.close, "", "exit"), (edit_menu, "Unpack", self.extract_all, "CTRL+U", "extract"), (edit_menu, "Inject", self.inject_ask, "CTRL+I", "inject"), (edit_menu, "Rename", self.rename, "CTRL+R", ""), (edit_menu, "Rename Contents", self.rename_contents, "CTRL+SHIFT+R", ""), (edit_menu, "Remove Selected", self.remover, "DEL", ""), (util_menu, "Inspect Models", self.inspect_models, "", ""), (util_menu, "Inspect FGMs", self.walker_fgm, "", ""), (util_menu, "Generate Hash Table", self.walker_hash, "", ""), (util_menu, "Save Frag Log", self.ovl_data.dump_frag_log, "", ""), (util_menu, "Open Tools Dir", self.open_tools_dir, "", ""), (util_menu, "Export File List", self.save_file_list, "", ""), (util_menu, "Set Game Dir", self.ask_game_dir, "", ""), (util_menu, "Export included ovl list", self.save_included_ovls, "", ""), (help_menu, "Report Bug", self.report_bug, "", "report"), (help_menu, "Documentation", self.online_support, "", "manual")) self.add_to_menu(button_data) self.check_version()
def load_materialcollection(self): if self.file_src: for w in self.widgets: w.deleteLater() self.cfg[ "dir_materialcollections_in"], materialcollection_name = os.path.split( self.file_src) try: self.matcol_data.load(self.file_src) game = get_game(self.matcol_data)[0] print("from game", game) self.game_container.entry.setText(game.value) self.materialcollection_container.entry.setText( materialcollection_name) # delete existing widgets self.clear_layout(self.tex_grid) self.clear_layout(self.attrib_grid) self.tex_grid = self.create_grid() self.attrib_grid = self.create_grid() self.tex_container.setLayout(self.tex_grid) self.attrib_container.setLayout(self.attrib_grid) line_i = 0 for i, tex in enumerate(self.matcol_data.textures): # w = widgets.VectorEntry(tex, self.tooltips) # form.addRow(w.label, w.data) box = widgets.CollapsibleBox(f"Slot {i}") # box = QtWidgets.QGroupBox(f"Slot {i}") self.tex_grid.addWidget(box, line_i, 0) line_i += 1 lay = self.create_grid() a = QtWidgets.QLabel("texture type") b = QtWidgets.QLabel("texture suffix") x = QtWidgets.QLineEdit(tex.texture_type) y = QtWidgets.QLineEdit(tex.texture_suffix) combo = widgets.LabelCombo("First FGM:", self.default_fgms, tex, "fgm_name") lay.addWidget(a, 0, 0) lay.addWidget(b, 1, 0) lay.addWidget(x, 0, 1) lay.addWidget(y, 1, 1) lay.addWidget(combo.label, 2, 0) lay.addWidget(combo.entry, 2, 1) box.setLayout(lay) line_i = 0 for i, attrib in enumerate(self.matcol_data.layers): box = widgets.CollapsibleBox(f"Slot {i}") self.attrib_grid.addWidget(box, line_i, 0) line_i += 1 lay = self.create_grid() combo = widgets.LabelCombo("FGM:", self.default_fgms, attrib, "name") lay.addWidget(combo.label, 0, 0) lay.addWidget(combo.entry, 0, 1) l = 1 for infow in attrib.infos: w = widgets.MatcolInfo(infow, self.tooltips) lay.addWidget(w.label, l, 0) lay.addWidget(w.data, l, 1) l += 1 box.setLayout(lay) line_i = 0 # for zstr in self.matcol_data.layers: # # a = QtWidgets.QLabel("variant fgm") # b = QtWidgets.QLineEdit(zstr) # self.attrib_grid.addWidget(a, line_i, 0) # self.attrib_grid.addWidget(b, line_i, 1) # line_i += 1 except Exception as ex: ovl_util.interaction.showdialog(str(ex)) print(traceback.print_exc()) print("Done!")
def __init__(self): widgets.MainWindow.__init__(self, "FGM Editor", ) self.resize(800, 600) self.fgm_data = FgmFile() self.tooltips = config.read_config("ovl_util/tooltips/fgm.txt") self.games = [g.value for g in games] self.fgm_dict = None self.cleaner = QtCore.QObjectCleanupHandler() self.scrollarea = QtWidgets.QScrollArea(self) self.scrollarea.setWidgetResizable(True) self.setCentralWidget(self.scrollarea) # the actual scrollable stuff self.widget = QtWidgets.QWidget() self.scrollarea.setWidget(self.widget) self.game_container = widgets.LabelCombo("Game:", self.games) self.game_container.entry.currentIndexChanged.connect(self.game_changed) self.game_container.entry.setEditable(False) self.file_widget = widgets.FileWidget(self, self.cfg, dtype="FGM") self.shader_choice = widgets.LabelCombo("Shader:", ()) self.shader_choice.entry.activated.connect(self.shader_changed) self.attribute_choice = widgets.LabelCombo("Attribute:", ()) self.texture_choice = widgets.LabelCombo("Texture:", ()) self.attribute_add = QtWidgets.QPushButton("Add Attribute") self.attribute_add.clicked.connect(self.add_attribute) self.texture_add = QtWidgets.QPushButton("Add Texture") self.texture_add.clicked.connect(self.add_texture) self.tex_container = ProptertyContainer(self, "Textures") self.attrib_container = ProptertyContainer(self, "Attributes") self.game_changed() # self.populate_choices() self.shader_changed() vbox = QtWidgets.QVBoxLayout() vbox.addWidget(self.file_widget) vbox.addWidget(self.game_container) vbox.addWidget(self.shader_choice) vbox.addWidget(self.attribute_choice) vbox.addWidget(self.attribute_add) vbox.addWidget(self.texture_choice) vbox.addWidget(self.texture_add) vbox.addWidget(self.tex_container) vbox.addWidget(self.attrib_container) vbox.addStretch(1) self.widget.setLayout(vbox) main_menu = self.menuBar() file_menu = main_menu.addMenu('File') help_menu = main_menu.addMenu('Help') button_data = ( (file_menu, "Open", self.file_widget.ask_open, "CTRL+O", "dir"), (file_menu, "Save", self.save_fgm, "CTRL+S", "save"), (file_menu, "Save As", self.save_as_fgm, "CTRL+SHIFT+S", "save"), (file_menu, "Exit", self.close, "", "exit"), (help_menu, "Report Bug", self.report_bug, "", "report"), (help_menu, "Documentation", self.online_support, "", "manual") ) self.add_to_menu(button_data)