import sys from PyQt5.QtCore import QThread, pyqtSignal, Qt from PyQt5.QtWidgets import ( QMainWindow, QApplication, QFileDialog, QProgressDialog, QTreeWidgetItem, ) from PyQt5.QtGui import QPalette, QColor import ed_lrr_gui import ed_lrr_gui.config as cfg from ed_lrr_gui.gui.ed_lrr import Ui_ED_LRR import os from datetime import datetime # print(ed_lrr_gui.test({"a": 1, "b": 2})) # exit(1) class Progressdialog(QProgressDialog): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setWindowModality(Qt.WindowModal) class App(QApplication): def __init__(self): super().__init__(sys.argv) self.setStyle("Fusion") self.set_pallete() def set_pallete(self): colors = { "Window": QColor(53, 53, 53), "WindowText": Qt.white, "Base": QColor(15, 15, 15), "AlternateBase": QColor(53, 53, 53), "ToolTipBase": Qt.white, "ToolTipText": Qt.white, "Text": Qt.white, "Button": QColor(53, 53, 53), "ButtonText": Qt.white, "BrightText": Qt.red, "Highlight": QColor(255, 128, 0), "HighlightedText": Qt.black, } palette = QPalette() for entry, color in colors.items(): palette.setColor(getattr(QPalette, entry), color) if color == Qt.darkGray: palette.setColor( QPalette.Disabled, getattr(QPalette, entry), QColor(53, 53, 53) ) else: palette.setColor( QPalette.Disabled, getattr(QPalette, entry), Qt.darkGray ) self.setPalette(palette) class ED_LRR(Ui_ED_LRR): pbar_thread = None def __init__(self): super().__init__() self.config = cfg.load() def get_open_file(self, filetypes, callback=None): fileName, _ = QFileDialog.getOpenFileName( self.main_window, "Open file", str(cfg.data_dir), filetypes, options=QFileDialog.DontUseNativeDialog, ) if callback: return callback(fileName) return fileName def get_save_file(self, filetypes, callback=None): fileName, _ = QFileDialog.getSaveFileName( self.main_window, "Save file", str(cfg.data_dir), filetypes, options=QFileDialog.DontUseNativeDialog, ) if callback: return callback(fileName) return fileName def set_sys_lst(self, path): if path not in self.config.history_out_path: self.config.history_out_path.append(path) self.inp_sys_lst.addItem(path) self.inp_out_pp.addItem(path) def set_bodies_file(self, path): if path not in self.config.history_bodies_path: self.config.history_bodies_path.append(path) self.inp_bodies_pp.addItem(path) def set_systems_file(self, path): if path not in self.config.history_systems_path: self.config.history_systems_path.append(path) self.inp_systems_pp.addItem(path) def update_dropdowns(self): return def log(self, *args): t = datetime.today() msg_t = "[{}] {}".format(t, str.format(*args)) self.txt_log.append(msg_t) def set_comp_mode(self, _): if self.rd_comp.isChecked(): comp_mode = "Compute Route" self.btn_add.setText("Search+Add") self.lst_sys.setEnabled(True) self.btn_rm.setEnabled(True) self.cmb_mode.setEnabled(True) mode = self.cmb_mode.currentText() self.set_route_mode(mode) if self.rd_precomp.isChecked(): comp_mode = "Precompute Graph" self.btn_add.setText("Select") self.lst_sys.setEnabled(False) self.btn_rm.setEnabled(False) self.lbl_greedyness.setEnabled(False) self.sld_greedyness.setEnabled(False) self.cmb_mode.setEnabled(False) def set_route_mode(self, mode): self.lbl_greedyness.setEnabled(mode == "A*-Search") self.sld_greedyness.setEnabled(mode == "A*-Search") def set_greedyness(self, value): val = value / 100 self.lbl_greedyness.setText("Greedyness Factor ({:.0%})".format(val)) def sys_to_dict(self, n): header = [ self.lst_sys.headerItem().data(c, 0) for c in range(self.lst_sys.headerItem().columnCount()) ] system = [ self.lst_sys.topLevelItem(n).data(c, 0) for c in range(self.lst_sys.topLevelItem(n).columnCount()) ] return dict(zip(header, system)) def run(self): settings = {} settings["permute"] = [None, False, True][self.chk_permute_keep.checkState()] settings["range"] = self.sb_range.value() settings["systems"] = [ self.sys_to_dict(i) for i in range(self.lst_sys.topLevelItemCount()) ] print(settings) # progress = Progressdialog("TEST\nBLAH", "Cancel", 0, 0, self.main_window) # progress.setWindowTitle("Computing Route") # progress.setFixedSize(400, 100) # progress.setRange(0, 0) # progress.show() def add_system(self): n = self.lst_sys.topLevelItemCount() + 1 item = QTreeWidgetItem(self.lst_sys, ["A" + str(n), "B" + str(n)]) item.setFlags(item.flags() & ~Qt.ItemIsDropEnabled) def remove_system(self): root = self.lst_sys.invisibleRootItem() for item in self.lst_sys.selectedItems(): root.removeChild(item) def setup_signals(self): self.set_greedyness(self.sld_greedyness.value()) self.cmb_mode.currentTextChanged.connect(self.set_route_mode) self.rd_comp.toggled.connect(self.set_comp_mode) self.rd_precomp.toggled.connect(self.set_comp_mode) self.sld_greedyness.valueChanged.connect(self.set_greedyness) self.btn_go.clicked.connect(self.run) self.btn_add.clicked.connect(self.add_system) self.btn_rm.clicked.connect(self.remove_system) self.btn_out_browse_pp.clicked.connect( lambda: self.get_save_file("CSV File (*.csv)", self.set_sys_lst) ) self.btn_sys_lst_browse.clicked.connect( lambda: self.get_open_file("CSV File (*.csv)", self.set_sys_lst) ) self.btn_bodies_browse_pp.clicked.connect( lambda: self.get_open_file("JSON File (*.json)", self.set_bodies_file) ) self.btn_bodies_dest_browse_dl.clicked.connect( lambda: self.get_save_file("JSON File (*.json)", self.set_bodies_file) ) self.btn_systems_browse_pp.clicked.connect( lambda: self.get_open_file("JSON File (*.json)", self.set_systems_file) ) self.btn_systems_dest_browse_dl.clicked.connect( lambda: self.get_save_file("JSON File (*.json)", self.set_systems_file) ) self.menu_act_quit.triggered.connect(self.app.quit) def handle_close(self): cfg.write(self.config) print("BYEEEEEE!") def setupUi(self, MainWindow, app): super().setupUi(MainWindow) self.update_dropdowns() self.main_window = MainWindow self.app = app self.setup_signals() self.lst_sys.setHeaderLabels(["Name", "Type"]) def main(): import sys app = App() MainWindow = QMainWindow() ui = ED_LRR() ui.setupUi(MainWindow, app) MainWindow.show() ret = app.exec_() ui.handle_close() sys.exit(ret) if __name__ == "__main__": main()