235 lines
7.8 KiB
Python
235 lines
7.8 KiB
Python
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()
|