feat(GUI): Implement route plotting and fuzzy search
Implement route plotting in GUI Use batch fuzzy search to find systems search all systems at once after adding added some error checking
This commit is contained in:
parent
ec3972b06c
commit
c290d5eb12
18 changed files with 1075 additions and 391 deletions
|
@ -1,2 +1,4 @@
|
|||
from _ed_lrr import *
|
||||
from . import gui
|
||||
from .router import Router
|
||||
from .preprocess import Preprocessor
|
||||
|
|
|
@ -2,21 +2,28 @@ import sys
|
|||
import os
|
||||
import requests as RQ
|
||||
from datetime import datetime, timedelta
|
||||
from PyQt5.QtCore import QThread, pyqtSignal, Qt
|
||||
from PyQt5.QtCore import QTimer, QThread, pyqtSignal, Qt, QObject
|
||||
from PyQt5.QtWidgets import (
|
||||
QMainWindow,
|
||||
QApplication,
|
||||
QFileDialog,
|
||||
QProgressDialog,
|
||||
QTreeWidgetItem,
|
||||
QAction,
|
||||
QMessageBox,
|
||||
)
|
||||
from urllib.request import Request, urlopen
|
||||
import gzip
|
||||
import pathlib
|
||||
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
|
||||
from ed_lrr_gui import Router, Preprocessor
|
||||
import multiprocessing as MP
|
||||
import queue
|
||||
import csv
|
||||
import _ed_lrr
|
||||
|
||||
|
||||
def sizeof_fmt(num, suffix="B"):
|
||||
|
@ -37,6 +44,85 @@ class ProgressDialog(QProgressDialog):
|
|||
self.setWindowModality(Qt.WindowModal)
|
||||
|
||||
|
||||
class Job(QObject):
|
||||
progress = pyqtSignal("PyQt_PyObject")
|
||||
|
||||
def __init__(self, app, cls, *args, build_progress=None, **kwargs):
|
||||
super().__init__()
|
||||
self.job = cls(*args, **kwargs)
|
||||
self.timer = QTimer(app)
|
||||
self.app = app
|
||||
self.timer.timeout.connect(self.interval)
|
||||
self.timer.start(100)
|
||||
self.last_val = None
|
||||
self.build_progress = build_progress
|
||||
self.progress_dialog = None
|
||||
self.state = {}
|
||||
|
||||
def start(self):
|
||||
"""
|
||||
if self.diag_prog is None:
|
||||
self.diag_prog = ProgressDialog("", "Cancel", 0, 1000, self.main_window)
|
||||
if self.dl_thread:
|
||||
self.diag_prog.canceled.connect(self.dl_canceled)
|
||||
self.diag_prog.show()
|
||||
t_elapsed = datetime.today() - self.dl_started
|
||||
rate = args["done"] / t_elapsed.total_seconds()
|
||||
remaining = (args["size"] - args["done"]) / rate
|
||||
rate = round(rate, 2)
|
||||
# print(rate, remaining)
|
||||
try:
|
||||
t_rem = timedelta(seconds=remaining)
|
||||
except OverflowError:
|
||||
t_rem = "-"
|
||||
msg = "Downloading {} [{}/{}] ({}/s)\n[{}/{}]".format(
|
||||
filename,
|
||||
sizeof_fmt(args["done"]),
|
||||
sizeof_fmt(args["size"]),
|
||||
sizeof_fmt(rate),
|
||||
t_round(t_elapsed),
|
||||
t_round(t_rem),
|
||||
)
|
||||
self.diag_prog.setLabelText(msg)
|
||||
self.diag_prog.setWindowTitle("Downloading EDSM Dumps")
|
||||
self.diag_prog.setValue((args["done"] * 1000) // args["size"])
|
||||
"""
|
||||
self.started = datetime.today()
|
||||
if self.build_progress:
|
||||
self.progress_dialog = ProgressDialog("", "Cancel", 0, 1000, self.app)
|
||||
self.progress_dialog.canceled.connect(self.cancel)
|
||||
self.progress_dialog.show()
|
||||
self.progress.connect(self.__build_progress)
|
||||
else:
|
||||
self.progress.connect(
|
||||
lambda *args, **kwargs: print("PROGRESS:", *args, **kwargs)
|
||||
)
|
||||
return self.job.start()
|
||||
|
||||
def __build_progress(self, *args, **kwargs):
|
||||
kwargs["self"] = self
|
||||
return self.build_progress(*args, **kwargs)
|
||||
|
||||
def cancel(self):
|
||||
self.job.terminate()
|
||||
self.job = None
|
||||
|
||||
def done(self):
|
||||
return (self.job.is_alive() == False) and (self.job.queue.empty())
|
||||
|
||||
def interval(self):
|
||||
while True:
|
||||
try:
|
||||
res = self.job.queue.get(True, 0.1)
|
||||
except queue.Empty:
|
||||
return
|
||||
if res == self.last_val:
|
||||
continue
|
||||
self.state.update(res)
|
||||
self.progress.emit(self.state)
|
||||
self.last_val = res
|
||||
|
||||
|
||||
class DownloadThread(QThread):
|
||||
progress = pyqtSignal("PyQt_PyObject")
|
||||
|
||||
|
@ -79,45 +165,65 @@ class App(QApplication):
|
|||
def __init__(self):
|
||||
super().__init__(sys.argv)
|
||||
self.setStyle("Fusion")
|
||||
self.set_pallete()
|
||||
self.setup_styles()
|
||||
|
||||
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,
|
||||
def set_style(self, style):
|
||||
print("LOAD:", style)
|
||||
self.setPalette(self.styles[style])
|
||||
|
||||
def setup_styles(self):
|
||||
self.styles = {}
|
||||
styles = {
|
||||
"Dark": {
|
||||
"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)
|
||||
for style, colors in styles.items():
|
||||
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.styles[style] = palette
|
||||
self.styles["Light"] = self.style().standardPalette()
|
||||
|
||||
|
||||
class ED_LRR(Ui_ED_LRR):
|
||||
dl_thread = None
|
||||
diag_prog = None
|
||||
dl_started = None
|
||||
system_found = pyqtSignal("PyQt_PyObject")
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.config = cfg.load()
|
||||
self.jobs = {}
|
||||
|
||||
def start_job(self, cls, *args, **kwargs):
|
||||
print("START JOB:", cls, args, kwargs)
|
||||
name = cls.__name__
|
||||
if name in self.jobs and self.jobs[name].done():
|
||||
del self.jobs[name]
|
||||
if not name in self.jobs:
|
||||
self.jobs[name] = Job(self.app, cls, *args, **kwargs)
|
||||
self.jobs[name].start()
|
||||
|
||||
def get_open_file(self, filetypes, callback=None):
|
||||
fileName, _ = QFileDialog.getOpenFileName(
|
||||
|
@ -148,6 +254,8 @@ class ED_LRR(Ui_ED_LRR):
|
|||
self.config.history_out_path.append(path)
|
||||
self.inp_sys_lst.addItem(path)
|
||||
self.inp_out_pp.addItem(path)
|
||||
self.inp_sys_lst.setCurrentText(path)
|
||||
self.inp_out_pp.setCurrentText(path)
|
||||
|
||||
def set_bodies_file(self, path):
|
||||
if path not in self.config.history_bodies_path:
|
||||
|
@ -170,7 +278,7 @@ class ED_LRR(Ui_ED_LRR):
|
|||
def set_comp_mode(self, _):
|
||||
if self.rd_comp.isChecked():
|
||||
comp_mode = "Compute Route"
|
||||
self.btn_add.setText("Search+Add")
|
||||
self.btn_add.setText("Add")
|
||||
if self.rd_precomp.isChecked():
|
||||
comp_mode = "Precompute Graph"
|
||||
self.btn_add.setText("Select")
|
||||
|
@ -178,7 +286,7 @@ class ED_LRR(Ui_ED_LRR):
|
|||
self.lst_sys.setEnabled(self.rd_comp.isChecked())
|
||||
self.btn_rm.setEnabled(self.rd_comp.isChecked())
|
||||
self.cmb_mode.setEnabled(self.rd_comp.isChecked())
|
||||
self.btn_permute.setEnabled(self.rd_comp.isChecked())
|
||||
self.chk_permute.setEnabled(self.rd_comp.isChecked())
|
||||
self.lbl_keep.setEnabled(self.rd_comp.isChecked())
|
||||
self.lbl_mode.setEnabled(self.rd_comp.isChecked())
|
||||
self.chk_permute_keep_first.setEnabled(self.rd_comp.isChecked())
|
||||
|
@ -190,11 +298,17 @@ class ED_LRR(Ui_ED_LRR):
|
|||
mode = self.cmb_mode.currentText()
|
||||
self.lbl_greedyness.setEnabled(mode == "A*-Search")
|
||||
self.sld_greedyness.setEnabled(mode == "A*-Search")
|
||||
self.log("ROUTE_MODE", mode)
|
||||
|
||||
def set_greedyness(self, value):
|
||||
self.lbl_greedyness.setText("Greedyness Factor ({:.0%})".format(value / 100))
|
||||
|
||||
@property
|
||||
def systems(self):
|
||||
ret = []
|
||||
for n in range(self.lst_sys.topLevelItemCount()):
|
||||
ret.append(self.sys_to_dict(n))
|
||||
return ret
|
||||
|
||||
def sys_to_dict(self, n):
|
||||
header = [
|
||||
self.lst_sys.headerItem().data(c, 0)
|
||||
|
@ -204,34 +318,108 @@ class ED_LRR(Ui_ED_LRR):
|
|||
self.lst_sys.topLevelItem(n).data(c, 0)
|
||||
for c in range(self.lst_sys.topLevelItem(n).columnCount())
|
||||
]
|
||||
return dict(zip(header, system))
|
||||
ret = dict(zip(header, system))
|
||||
ret["id"] = getattr(self.lst_sys.topLevelItem(n), "__id__", None)
|
||||
ret.pop(None, None)
|
||||
return ret
|
||||
|
||||
def error(self, msg):
|
||||
QMessageBox.critical(self.main_window, "ERROR!", msg)
|
||||
|
||||
def get_sys_list(self):
|
||||
if not self.inp_sys_lst.currentText():
|
||||
self.error("System list is required!")
|
||||
return
|
||||
path = pathlib.Path(self.inp_sys_lst.currentText())
|
||||
if not path.exists():
|
||||
self.error("System list does not exist, run download and preprocess first!")
|
||||
return
|
||||
return path
|
||||
|
||||
def run(self):
|
||||
settings = {}
|
||||
settings["permute"] = (
|
||||
self.chk_permute_keep_first.checkState(),
|
||||
self.chk_permute_keep_last.checkState(),
|
||||
if not all(s["Type"] for s in self.systems):
|
||||
self.error('Not all systens have been resolved, please click "Search All"')
|
||||
return
|
||||
print(self.systems)
|
||||
systems = [str(s["id"]) for s in self.systems]
|
||||
jump_range = self.sb_range.value()
|
||||
mode = self.cmb_mode.currentText()
|
||||
primary = self.chk_primary.isChecked()
|
||||
keep_first = self.chk_permute_keep_first.isChecked()
|
||||
keep_last = self.chk_permute_keep_last.isChecked()
|
||||
permute = self.chk_permute.isChecked()
|
||||
greedyness = (
|
||||
self.sld_greedyness.value() / 100
|
||||
if self.sld_greedyness.isEnabled()
|
||||
else None
|
||||
)
|
||||
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(
|
||||
"(Not actually computing)", "Cancel", 0, 0, self.main_window
|
||||
path = self.get_sys_list()
|
||||
if path is None:
|
||||
return
|
||||
precomp = path.with_suffix(".idx")
|
||||
path = str(path)
|
||||
if not precomp.exists():
|
||||
precomp = None
|
||||
else:
|
||||
precomp = str(precomp)
|
||||
mode = {
|
||||
"Breadth-First Search": "bfs",
|
||||
"A*-Search": "astar",
|
||||
"Greedy-Search": "greedy",
|
||||
}[mode]
|
||||
print(
|
||||
systems,
|
||||
jump_range,
|
||||
mode,
|
||||
primary,
|
||||
permute,
|
||||
(keep_first, keep_last),
|
||||
greedyness,
|
||||
path,
|
||||
precomp,
|
||||
)
|
||||
progress.setWindowTitle("Computing Route")
|
||||
progress.setFixedSize(400, 100)
|
||||
progress.setRange(0, 0)
|
||||
progress.show()
|
||||
self.start_job(
|
||||
Router,
|
||||
systems,
|
||||
jump_range,
|
||||
0.1,
|
||||
mode,
|
||||
primary,
|
||||
permute,
|
||||
keep_first,
|
||||
keep_last,
|
||||
greedyness,
|
||||
precomp,
|
||||
path,
|
||||
)
|
||||
|
||||
def find_sys_by_names(self, names):
|
||||
t_s = datetime.today()
|
||||
if not self.get_sys_list():
|
||||
return None
|
||||
ret = _ed_lrr.find_sys(names, self.inp_sys_lst.currentText())
|
||||
print("Took:", datetime.today() - t_s)
|
||||
return ret
|
||||
|
||||
def resolve_systems(self):
|
||||
names = []
|
||||
for n in range(self.lst_sys.topLevelItemCount()):
|
||||
names.append(self.sys_to_dict(n)["Name"])
|
||||
systems = self.find_sys_by_names(names)
|
||||
if systems is None:
|
||||
return
|
||||
for i, name in enumerate(names):
|
||||
_, system = systems[name]
|
||||
self.lst_sys.topLevelItem(i).setData(0, 0, system["system"])
|
||||
self.lst_sys.topLevelItem(i).setData(1, 0, system["star_type"])
|
||||
self.lst_sys.topLevelItem(i).__id__ = system["id"]
|
||||
# diff, item = self.find_sys_by_name(name)
|
||||
# print("Found", (diff, item))
|
||||
|
||||
def add_system(self):
|
||||
n = self.lst_sys.topLevelItemCount() + 1
|
||||
name = self.inp_sys.text()
|
||||
item = QTreeWidgetItem(
|
||||
self.lst_sys, [str(n) + ". Name: " + name, "Type: " + name[::-1]]
|
||||
)
|
||||
item.sys_id = "SYS_ID_HERE"
|
||||
item = QTreeWidgetItem(self.lst_sys, [name, None])
|
||||
item.resolved = False
|
||||
item.setFlags(item.flags() & ~Qt.ItemIsDropEnabled)
|
||||
|
||||
def remove_system(self):
|
||||
|
@ -253,7 +441,7 @@ class ED_LRR(Ui_ED_LRR):
|
|||
self.diag_prog = None
|
||||
self.dl_started = None
|
||||
|
||||
def handle_progress(self, args):
|
||||
def handle_dl_progress(self, args):
|
||||
filename = os.path.split(args["outfile"])[-1]
|
||||
if self.diag_prog is None:
|
||||
self.diag_prog = ProgressDialog("", "Cancel", 0, 1000, self.main_window)
|
||||
|
@ -291,10 +479,15 @@ class ED_LRR(Ui_ED_LRR):
|
|||
self.inp_bodies_dl.currentText(),
|
||||
self.inp_bodies_dest_dl.currentText(),
|
||||
)
|
||||
self.dl_thread.progress.connect(self.handle_progress)
|
||||
self.dl_thread.progress.connect(self.handle_dl_progress)
|
||||
self.dl_thread.start()
|
||||
print(".")
|
||||
|
||||
def update_permute_chk(self, state):
|
||||
self.chk_permute_keep_first.setEnabled(state)
|
||||
self.chk_permute_keep_last.setEnabled(state)
|
||||
self.lbl_keep.setEnabled(state)
|
||||
|
||||
def setup_signals(self):
|
||||
self.btn_download.clicked.connect(self.run_download)
|
||||
self.inp_systems_dest_dl.setCurrentText(r"D:\devel\rust\ed_lrr_gui\DL\s.json")
|
||||
|
@ -307,6 +500,8 @@ class ED_LRR(Ui_ED_LRR):
|
|||
self.btn_go.clicked.connect(self.run)
|
||||
self.btn_add.clicked.connect(self.add_system)
|
||||
self.btn_rm.clicked.connect(self.remove_system)
|
||||
self.chk_permute.stateChanged.connect(self.update_permute_chk)
|
||||
self.btn_search.clicked.connect(self.resolve_systems)
|
||||
self.btn_out_browse_pp.clicked.connect(
|
||||
lambda: self.get_save_file("CSV File (*.csv)", self.set_sys_lst)
|
||||
)
|
||||
|
@ -331,6 +526,14 @@ class ED_LRR(Ui_ED_LRR):
|
|||
cfg.write(self.config)
|
||||
print("BYEEEEEE!")
|
||||
|
||||
def setup_styles(self, win, app):
|
||||
for name in app.styles:
|
||||
action = QAction(app)
|
||||
action.setObjectName("action_load_style_" + name)
|
||||
action.setText(name)
|
||||
action.triggered.connect(lambda _, name=name: app.set_style(name))
|
||||
self.menuStyle.addAction(action)
|
||||
|
||||
def setupUi(self, MainWindow, app):
|
||||
super().setupUi(MainWindow)
|
||||
self.update_dropdowns()
|
||||
|
@ -339,6 +542,8 @@ class ED_LRR(Ui_ED_LRR):
|
|||
self.setup_signals()
|
||||
self.lst_sys.setHeaderLabels(["Name", "Type"])
|
||||
self.set_route_mode()
|
||||
self.update_permute_chk(self.chk_permute.isChecked())
|
||||
self.setup_styles(MainWindow, app)
|
||||
|
||||
|
||||
def main():
|
||||
|
|
|
@ -26,6 +26,14 @@ class Ui_ED_LRR(object):
|
|||
ED_LRR.setDocumentMode(False)
|
||||
ED_LRR.setTabShape(QtWidgets.QTabWidget.Rounded)
|
||||
self.centralwidget = QtWidgets.QWidget(ED_LRR)
|
||||
<<<<<<< Updated upstream
|
||||
=======
|
||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
sizePolicy.setVerticalStretch(0)
|
||||
sizePolicy.setHeightForWidth(self.centralwidget.sizePolicy().hasHeightForWidth())
|
||||
self.centralwidget.setSizePolicy(sizePolicy)
|
||||
>>>>>>> Stashed changes
|
||||
self.centralwidget.setObjectName("centralwidget")
|
||||
self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
|
||||
self.verticalLayout.setObjectName("verticalLayout")
|
||||
|
@ -214,9 +222,12 @@ class Ui_ED_LRR(object):
|
|||
self.rd_precomp.setObjectName("rd_precomp")
|
||||
self.gr_mode.addWidget(self.rd_precomp, 0, 2, 1, 1)
|
||||
self.formLayout_2.setLayout(3, QtWidgets.QFormLayout.FieldRole, self.gr_mode)
|
||||
<<<<<<< Updated upstream
|
||||
self.btn_permute = QtWidgets.QPushButton(self.tab_route)
|
||||
self.btn_permute.setObjectName("btn_permute")
|
||||
self.formLayout_2.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.btn_permute)
|
||||
=======
|
||||
>>>>>>> Stashed changes
|
||||
self.lst_sys = QtWidgets.QTreeWidget(self.tab_route)
|
||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
|
@ -231,6 +242,7 @@ class Ui_ED_LRR(object):
|
|||
self.lst_sys.setAlternatingRowColors(True)
|
||||
self.lst_sys.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
|
||||
self.lst_sys.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
|
||||
<<<<<<< Updated upstream
|
||||
self.lst_sys.setHeaderHidden(True)
|
||||
self.lst_sys.setObjectName("lst_sys")
|
||||
self.lst_sys.headerItem().setText(0, "1")
|
||||
|
@ -241,6 +253,19 @@ class Ui_ED_LRR(object):
|
|||
self.lbl_range = QtWidgets.QLabel(self.tab_route)
|
||||
self.lbl_range.setObjectName("lbl_range")
|
||||
self.formLayout_2.setWidget(8, QtWidgets.QFormLayout.LabelRole, self.lbl_range)
|
||||
=======
|
||||
self.lst_sys.setHeaderHidden(False)
|
||||
self.lst_sys.setObjectName("lst_sys")
|
||||
self.lst_sys.headerItem().setText(0, "Name")
|
||||
self.lst_sys.header().setVisible(False)
|
||||
self.formLayout_2.setWidget(7, QtWidgets.QFormLayout.SpanningRole, self.lst_sys)
|
||||
self.sb_range = QtWidgets.QDoubleSpinBox(self.tab_route)
|
||||
self.sb_range.setObjectName("sb_range")
|
||||
self.formLayout_2.setWidget(9, QtWidgets.QFormLayout.FieldRole, self.sb_range)
|
||||
self.lbl_range = QtWidgets.QLabel(self.tab_route)
|
||||
self.lbl_range.setObjectName("lbl_range")
|
||||
self.formLayout_2.setWidget(9, QtWidgets.QFormLayout.LabelRole, self.lbl_range)
|
||||
>>>>>>> Stashed changes
|
||||
self.gr_opts = QtWidgets.QGridLayout()
|
||||
self.gr_opts.setObjectName("gr_opts")
|
||||
self.cmb_mode = QtWidgets.QComboBox(self.tab_route)
|
||||
|
@ -268,16 +293,28 @@ class Ui_ED_LRR(object):
|
|||
self.lbl_mode = QtWidgets.QLabel(self.tab_route)
|
||||
self.lbl_mode.setObjectName("lbl_mode")
|
||||
self.gr_opts.addWidget(self.lbl_mode, 0, 1, 1, 1)
|
||||
<<<<<<< Updated upstream
|
||||
self.formLayout_2.setLayout(9, QtWidgets.QFormLayout.SpanningRole, self.gr_opts)
|
||||
self.btn_go = QtWidgets.QPushButton(self.tab_route)
|
||||
self.btn_go.setFlat(False)
|
||||
self.btn_go.setObjectName("btn_go")
|
||||
self.formLayout_2.setWidget(10, QtWidgets.QFormLayout.LabelRole, self.btn_go)
|
||||
=======
|
||||
self.formLayout_2.setLayout(10, QtWidgets.QFormLayout.SpanningRole, self.gr_opts)
|
||||
self.btn_go = QtWidgets.QPushButton(self.tab_route)
|
||||
self.btn_go.setFlat(False)
|
||||
self.btn_go.setObjectName("btn_go")
|
||||
self.formLayout_2.setWidget(11, QtWidgets.QFormLayout.LabelRole, self.btn_go)
|
||||
>>>>>>> Stashed changes
|
||||
self.gridLayout_4 = QtWidgets.QGridLayout()
|
||||
self.gridLayout_4.setObjectName("gridLayout_4")
|
||||
self.chk_permute_keep_last = QtWidgets.QCheckBox(self.tab_route)
|
||||
self.chk_permute_keep_last.setObjectName("chk_permute_keep_last")
|
||||
<<<<<<< Updated upstream
|
||||
self.gridLayout_4.addWidget(self.chk_permute_keep_last, 0, 2, 1, 1)
|
||||
=======
|
||||
self.gridLayout_4.addWidget(self.chk_permute_keep_last, 0, 3, 1, 1)
|
||||
>>>>>>> Stashed changes
|
||||
self.chk_permute_keep_first = QtWidgets.QCheckBox(self.tab_route)
|
||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
|
@ -286,7 +323,11 @@ class Ui_ED_LRR(object):
|
|||
self.chk_permute_keep_first.setSizePolicy(sizePolicy)
|
||||
self.chk_permute_keep_first.setTristate(False)
|
||||
self.chk_permute_keep_first.setObjectName("chk_permute_keep_first")
|
||||
<<<<<<< Updated upstream
|
||||
self.gridLayout_4.addWidget(self.chk_permute_keep_first, 0, 1, 1, 1)
|
||||
=======
|
||||
self.gridLayout_4.addWidget(self.chk_permute_keep_first, 0, 2, 1, 1)
|
||||
>>>>>>> Stashed changes
|
||||
self.lbl_keep = QtWidgets.QLabel(self.tab_route)
|
||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
|
@ -294,8 +335,19 @@ class Ui_ED_LRR(object):
|
|||
sizePolicy.setHeightForWidth(self.lbl_keep.sizePolicy().hasHeightForWidth())
|
||||
self.lbl_keep.setSizePolicy(sizePolicy)
|
||||
self.lbl_keep.setObjectName("lbl_keep")
|
||||
<<<<<<< Updated upstream
|
||||
self.gridLayout_4.addWidget(self.lbl_keep, 0, 0, 1, 1)
|
||||
self.formLayout_2.setLayout(4, QtWidgets.QFormLayout.FieldRole, self.gridLayout_4)
|
||||
=======
|
||||
self.gridLayout_4.addWidget(self.lbl_keep, 0, 1, 1, 1)
|
||||
self.formLayout_2.setLayout(4, QtWidgets.QFormLayout.FieldRole, self.gridLayout_4)
|
||||
self.chk_permute = QtWidgets.QCheckBox(self.tab_route)
|
||||
self.chk_permute.setObjectName("chk_permute")
|
||||
self.formLayout_2.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.chk_permute)
|
||||
self.btn_search = QtWidgets.QPushButton(self.tab_route)
|
||||
self.btn_search.setObjectName("btn_search")
|
||||
self.formLayout_2.setWidget(8, QtWidgets.QFormLayout.LabelRole, self.btn_search)
|
||||
>>>>>>> Stashed changes
|
||||
self.tabs.addTab(self.tab_route, "")
|
||||
self.tab_log = QtWidgets.QWidget()
|
||||
self.tab_log.setObjectName("tab_log")
|
||||
|
@ -317,14 +369,32 @@ class Ui_ED_LRR(object):
|
|||
self.menu.setObjectName("menu")
|
||||
self.menu_file = QtWidgets.QMenu(self.menu)
|
||||
self.menu_file.setObjectName("menu_file")
|
||||
<<<<<<< Updated upstream
|
||||
=======
|
||||
self.menuWindow = QtWidgets.QMenu(self.menu)
|
||||
self.menuWindow.setObjectName("menuWindow")
|
||||
self.menuStyle = QtWidgets.QMenu(self.menuWindow)
|
||||
self.menuStyle.setObjectName("menuStyle")
|
||||
>>>>>>> Stashed changes
|
||||
ED_LRR.setMenuBar(self.menu)
|
||||
self.bar_status = QtWidgets.QStatusBar(ED_LRR)
|
||||
self.bar_status.setObjectName("bar_status")
|
||||
ED_LRR.setStatusBar(self.bar_status)
|
||||
self.menu_act_quit = QtWidgets.QAction(ED_LRR)
|
||||
self.menu_act_quit.setObjectName("menu_act_quit")
|
||||
<<<<<<< Updated upstream
|
||||
self.menu_file.addAction(self.menu_act_quit)
|
||||
self.menu.addAction(self.menu_file.menuAction())
|
||||
=======
|
||||
self.actionA = QtWidgets.QAction(ED_LRR)
|
||||
self.actionA.setObjectName("actionA")
|
||||
self.actionB = QtWidgets.QAction(ED_LRR)
|
||||
self.actionB.setObjectName("actionB")
|
||||
self.menu_file.addAction(self.menu_act_quit)
|
||||
self.menuWindow.addAction(self.menuStyle.menuAction())
|
||||
self.menu.addAction(self.menu_file.menuAction())
|
||||
self.menu.addAction(self.menuWindow.menuAction())
|
||||
>>>>>>> Stashed changes
|
||||
|
||||
self.retranslateUi(ED_LRR)
|
||||
self.tabs.setCurrentIndex(2)
|
||||
|
@ -358,12 +428,20 @@ class Ui_ED_LRR(object):
|
|||
self.tabs.setTabText(self.tabs.indexOf(self.tab_preprocess), _translate("ED_LRR", "Preprocess"))
|
||||
self.lbl_sys_lst.setText(_translate("ED_LRR", "System List"))
|
||||
self.btn_sys_lst_browse.setText(_translate("ED_LRR", "..."))
|
||||
<<<<<<< Updated upstream
|
||||
self.btn_add.setText(_translate("ED_LRR", "Search+Add"))
|
||||
=======
|
||||
self.btn_add.setText(_translate("ED_LRR", "Add"))
|
||||
>>>>>>> Stashed changes
|
||||
self.inp_sys.setPlaceholderText(_translate("ED_LRR", "System Name"))
|
||||
self.btn_rm.setText(_translate("ED_LRR", "Remove"))
|
||||
self.rd_comp.setText(_translate("ED_LRR", "Compute Route"))
|
||||
self.rd_precomp.setText(_translate("ED_LRR", "Precompute Graph"))
|
||||
<<<<<<< Updated upstream
|
||||
self.btn_permute.setText(_translate("ED_LRR", "Permute"))
|
||||
=======
|
||||
self.lst_sys.headerItem().setText(1, _translate("ED_LRR", "Type"))
|
||||
>>>>>>> Stashed changes
|
||||
self.lbl_range.setText(_translate("ED_LRR", "Jump Range (Ly)"))
|
||||
self.cmb_mode.setCurrentText(_translate("ED_LRR", "Breadth-First Search"))
|
||||
self.cmb_mode.setItemText(0, _translate("ED_LRR", "Breadth-First Search"))
|
||||
|
@ -376,8 +454,22 @@ class Ui_ED_LRR(object):
|
|||
self.chk_permute_keep_last.setText(_translate("ED_LRR", "Last"))
|
||||
self.chk_permute_keep_first.setText(_translate("ED_LRR", "First"))
|
||||
self.lbl_keep.setText(_translate("ED_LRR", "Keep Endpoints:"))
|
||||
<<<<<<< Updated upstream
|
||||
self.tabs.setTabText(self.tabs.indexOf(self.tab_route), _translate("ED_LRR", "Route"))
|
||||
self.tabs.setTabText(self.tabs.indexOf(self.tab_log), _translate("ED_LRR", "Log"))
|
||||
self.menu_file.setTitle(_translate("ED_LRR", "File"))
|
||||
self.menu_act_quit.setText(_translate("ED_LRR", "Quit"))
|
||||
self.menu_act_quit.setShortcut(_translate("ED_LRR", "Ctrl+Q"))
|
||||
=======
|
||||
self.chk_permute.setText(_translate("ED_LRR", "Permute"))
|
||||
self.btn_search.setText(_translate("ED_LRR", "Search All"))
|
||||
self.tabs.setTabText(self.tabs.indexOf(self.tab_route), _translate("ED_LRR", "Route"))
|
||||
self.tabs.setTabText(self.tabs.indexOf(self.tab_log), _translate("ED_LRR", "Log"))
|
||||
self.menu_file.setTitle(_translate("ED_LRR", "File"))
|
||||
self.menuWindow.setTitle(_translate("ED_LRR", "Window"))
|
||||
self.menuStyle.setTitle(_translate("ED_LRR", "Style"))
|
||||
self.menu_act_quit.setText(_translate("ED_LRR", "Quit"))
|
||||
self.menu_act_quit.setShortcut(_translate("ED_LRR", "Ctrl+Q"))
|
||||
self.actionA.setText(_translate("ED_LRR", "A"))
|
||||
self.actionB.setText(_translate("ED_LRR", "B"))
|
||||
>>>>>>> Stashed changes
|
||||
|
|
|
@ -44,6 +44,15 @@
|
|||
<enum>QTabWidget::Rounded</enum>
|
||||
</property>
|
||||
<widget class="QWidget" name="centralwidget">
|
||||
<<<<<<< Updated upstream
|
||||
=======
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
>>>>>>> Stashed changes
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QTabWidget" name="tabs">
|
||||
|
@ -363,7 +372,11 @@
|
|||
<item row="1" column="0">
|
||||
<widget class="QPushButton" name="btn_add">
|
||||
<property name="text">
|
||||
<<<<<<< Updated upstream
|
||||
<string>Search+Add</string>
|
||||
=======
|
||||
<string>Add</string>
|
||||
>>>>>>> Stashed changes
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
@ -402,6 +415,7 @@
|
|||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<<<<<<< Updated upstream
|
||||
<item row="4" column="0">
|
||||
<widget class="QPushButton" name="btn_permute">
|
||||
<property name="text">
|
||||
|
@ -409,6 +423,8 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
=======
|
||||
>>>>>>> Stashed changes
|
||||
<item row="7" column="0" colspan="2">
|
||||
<widget class="QTreeWidget" name="lst_sys">
|
||||
<property name="sizePolicy">
|
||||
|
@ -445,26 +461,53 @@
|
|||
<enum>QAbstractItemView::SelectRows</enum>
|
||||
</property>
|
||||
<property name="headerHidden">
|
||||
<<<<<<< Updated upstream
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string notr="true">1</string>
|
||||
=======
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<attribute name="headerVisible">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string notr="true">Name</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Type</string>
|
||||
>>>>>>> Stashed changes
|
||||
</property>
|
||||
</column>
|
||||
</widget>
|
||||
</item>
|
||||
<<<<<<< Updated upstream
|
||||
<item row="8" column="1">
|
||||
<widget class="QDoubleSpinBox" name="sb_range"/>
|
||||
</item>
|
||||
<item row="8" column="0">
|
||||
=======
|
||||
<item row="9" column="1">
|
||||
<widget class="QDoubleSpinBox" name="sb_range"/>
|
||||
</item>
|
||||
<item row="9" column="0">
|
||||
>>>>>>> Stashed changes
|
||||
<widget class="QLabel" name="lbl_range">
|
||||
<property name="text">
|
||||
<string>Jump Range (Ly)</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<<<<<<< Updated upstream
|
||||
<item row="9" column="0" colspan="2">
|
||||
=======
|
||||
<item row="10" column="0" colspan="2">
|
||||
>>>>>>> Stashed changes
|
||||
<layout class="QGridLayout" name="gr_opts">
|
||||
<item row="0" column="2">
|
||||
<widget class="QComboBox" name="cmb_mode">
|
||||
|
@ -536,7 +579,11 @@
|
|||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<<<<<<< Updated upstream
|
||||
<item row="10" column="0">
|
||||
=======
|
||||
<item row="11" column="0">
|
||||
>>>>>>> Stashed changes
|
||||
<widget class="QPushButton" name="btn_go">
|
||||
<property name="text">
|
||||
<string>GO!</string>
|
||||
|
@ -548,14 +595,22 @@
|
|||
</item>
|
||||
<item row="4" column="1">
|
||||
<layout class="QGridLayout" name="gridLayout_4">
|
||||
<<<<<<< Updated upstream
|
||||
<item row="0" column="2">
|
||||
=======
|
||||
<item row="0" column="3">
|
||||
>>>>>>> Stashed changes
|
||||
<widget class="QCheckBox" name="chk_permute_keep_last">
|
||||
<property name="text">
|
||||
<string>Last</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<<<<<<< Updated upstream
|
||||
<item row="0" column="1">
|
||||
=======
|
||||
<item row="0" column="2">
|
||||
>>>>>>> Stashed changes
|
||||
<widget class="QCheckBox" name="chk_permute_keep_first">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
||||
|
@ -571,7 +626,11 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<<<<<<< Updated upstream
|
||||
<item row="0" column="0">
|
||||
=======
|
||||
<item row="0" column="1">
|
||||
>>>>>>> Stashed changes
|
||||
<widget class="QLabel" name="lbl_keep">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
|
@ -586,6 +645,23 @@
|
|||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<<<<<<< Updated upstream
|
||||
=======
|
||||
<item row="4" column="0">
|
||||
<widget class="QCheckBox" name="chk_permute">
|
||||
<property name="text">
|
||||
<string>Permute</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="8" column="0">
|
||||
<widget class="QPushButton" name="btn_search">
|
||||
<property name="text">
|
||||
<string>Search All</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
>>>>>>> Stashed changes
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tab_log">
|
||||
|
@ -633,7 +709,23 @@
|
|||
</property>
|
||||
<addaction name="menu_act_quit"/>
|
||||
</widget>
|
||||
<<<<<<< Updated upstream
|
||||
<addaction name="menu_file"/>
|
||||
=======
|
||||
<widget class="QMenu" name="menuWindow">
|
||||
<property name="title">
|
||||
<string>Window</string>
|
||||
</property>
|
||||
<widget class="QMenu" name="menuStyle">
|
||||
<property name="title">
|
||||
<string>Style</string>
|
||||
</property>
|
||||
</widget>
|
||||
<addaction name="menuStyle"/>
|
||||
</widget>
|
||||
<addaction name="menu_file"/>
|
||||
<addaction name="menuWindow"/>
|
||||
>>>>>>> Stashed changes
|
||||
</widget>
|
||||
<widget class="QStatusBar" name="bar_status"/>
|
||||
<action name="menu_act_quit">
|
||||
|
@ -644,6 +736,19 @@
|
|||
<string>Ctrl+Q</string>
|
||||
</property>
|
||||
</action>
|
||||
<<<<<<< Updated upstream
|
||||
=======
|
||||
<action name="actionA">
|
||||
<property name="text">
|
||||
<string>A</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionB">
|
||||
<property name="text">
|
||||
<string>B</string>
|
||||
</property>
|
||||
</action>
|
||||
>>>>>>> Stashed changes
|
||||
</widget>
|
||||
<tabstops>
|
||||
<tabstop>rd_comp</tabstop>
|
||||
|
|
|
@ -14,24 +14,13 @@ class Preprocessor(Process):
|
|||
self.args = args
|
||||
self.kwargs = kwargs
|
||||
self.kwargs["callback"] = self.callback
|
||||
self.start()
|
||||
|
||||
def __iter__(self):
|
||||
while self.is_alive():
|
||||
try:
|
||||
self.state.update(self.queue.get(True, 0.5))
|
||||
yield self.state
|
||||
except queue.Empty:
|
||||
pass
|
||||
while not self.queue.empty():
|
||||
self.state.update(self.queue.get(True, 0.5))
|
||||
yield self.state
|
||||
|
||||
def callback(self, state):
|
||||
self.queue.put({"status": state})
|
||||
|
||||
def run(self):
|
||||
_ed_lrr.preprocess(*self.args, **self.kwargs)
|
||||
res = _ed_lrr.preprocess(*self.args, **self.kwargs)
|
||||
self.queue.put({"result": res})
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
|
|
@ -14,18 +14,6 @@ class Router(Process):
|
|||
self.args = args
|
||||
self.kwargs = kwargs
|
||||
self.kwargs["callback"] = self.callback
|
||||
self.start()
|
||||
|
||||
def __iter__(self):
|
||||
while self.is_alive():
|
||||
try:
|
||||
self.state.update(self.queue.get(True, 0.5))
|
||||
yield self.state
|
||||
except queue.Empty:
|
||||
pass
|
||||
while not self.queue.empty():
|
||||
self.state.update(self.queue.get(True, 0.5))
|
||||
yield self.state
|
||||
|
||||
def callback(self, state):
|
||||
self.queue.put({"status": state})
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue