import Tkinter as tk import tkFileDialog as filedialog from ttkHyperlinkLabel import HyperlinkLabel import sys import csv import os from monitor import monitor import urllib import json if sys.platform.startswith('linux'): import subprocess this = sys.modules[__name__] this.plugin_version = "1.1.0" this.update_available = False this.next_stop = "No route planned" this.route = [] this.next_wp_label = "Next waypoint: " this.jumpcountlbl_txt = "Estimated jumps left: " this.parent = None this.save_route_path = "" this.offset_file_path = "" this.offset = 0 this.jumps_left = 0 def plugin_start(plugin_dir): # Check for newer versions url = "https://raw.githubusercontent.com/CMDR-Kiel42/EDMC_SpanshRouter/master/version.json" response = urllib.urlopen(url) latest_version = response.read() if response.code == 200 and this.plugin_version != latest_version: this.update_available = True this.save_route_path = os.path.join(plugin_dir, 'route.csv') this.offset_file_path = os.path.join(plugin_dir, 'offset') try: # Open the last saved route with open(this.save_route_path, 'r') as csvfile: route_reader = csv.reader(csvfile) for row in route_reader: this.route.append(row) try: with open(this.offset_file_path, 'r') as offset_fh: this.offset = int(offset_fh.readline()) except: this.offset = 0 for row in this.route[this.offset:]: this.jumps_left += int(row[1]) this.next_stop = this.route[this.offset][0] copy_waypoint() except: print("No previously saved route.") def plugin_stop(): if this.route.__len__() != 0: # Save route for next time with open(this.save_route_path, 'w') as csvfile: writer = csv.writer(csvfile) writer.writerows(this.route) with open(this.offset_file_path, 'w') as offset_fh: offset_fh.write(str(this.offset)) def update_gui(): this.waypoint_btn["text"] = this.next_wp_label + this.next_stop this.jumpcounttxt_lbl["text"] = this.jumpcountlbl_txt + str(this.jumps_left) this.jumpcounttxt_lbl.grid() this.waypoint_prev_btn.grid() this.waypoint_btn.grid() this.waypoint_next_btn.grid() def copy_waypoint(self=None): if sys.platform == "win32": this.parent.clipboard_clear() this.parent.clipboard_append(this.next_stop) this.parent.update() else: command = subprocess.Popen(["echo", "-n", this.next_stop], stdout=subprocess.PIPE) subprocess.Popen(["xclip", "-selection", "c"], stdin=command.stdout) def goto_next_waypoint(self=None): if this.offset < this.route.__len__(): update_route(1) def goto_prev_waypoint(self=None): if this.offset > 0: update_route(-1) def new_route(self=None): filename = filedialog.askopenfilename(filetypes = (("csv files", "*.csv"),)) # show an "Open" dialog box and return the path to the selected file if filename.__len__() > 0: with open(filename, 'r') as csvfile: route_reader = csv.reader(csvfile) # Skip the header route_reader.next() this.jumps_left = 0 for row in route_reader: this.route.append([row[0], row[4]]) this.jumps_left += int(row[4]) this.offset = 0 this.next_stop = this.route[0][0] copy_waypoint() update_gui() def update_route(direction=1): if direction > 0: this.jumps_left -= int(this.route[this.offset][1]) this.offset += 1 else: this.offset -= 1 this.jumps_left += int(this.route[this.offset][1]) if this.offset >= this.route.__len__(): this.next_stop = "End of the road!" update_gui() else: this.next_stop = this.route[this.offset][0] update_gui() copy_waypoint(this.parent) def journal_entry(cmdr, is_beta, system, station, entry, state): if (entry['event'] == 'FSDJump' or entry['event'] == 'Location') and entry["StarSystem"] == this.next_stop: update_route() elif entry['event'] in ['SupercruiseEntry', 'SupercruiseExit'] and entry['StarSystem'] == this.next_stop: update_route() elif entry['event'] == 'FSSDiscoveryScan' and entry['SystemName'] == this.next_stop: update_route() def plugin_app(parent): this.parent = parent this.frame = tk.Frame(parent) this.waypoint_prev_btn = tk.Button(this.frame, text="^") this.waypoint_btn = tk.Button(this.frame, text=this.next_wp_label + this.next_stop) this.waypoint_next_btn = tk.Button(this.frame, text="v") this.upload_route_btn = tk.Button(this.frame, text="Upload new route") this.waypoint_prev_btn.bind("", goto_prev_waypoint) this.waypoint_btn.bind("", copy_waypoint) this.waypoint_next_btn.bind("", goto_next_waypoint) this.upload_route_btn.bind("", new_route) this.waypoint_prev_btn.grid(row=0) this.waypoint_btn.grid(row=1) this.waypoint_next_btn.grid(row=2) this.upload_route_btn.grid(row=3, pady=10) this.jumpcounttxt_lbl = tk.Label(this.frame, text=this.jumpcountlbl_txt + str(this.jumps_left)) this.jumpcounttxt_lbl.grid(row=4, pady=5, sticky=tk.W) if not this.route.__len__() > 0: this.waypoint_prev_btn.grid_remove() this.waypoint_btn.grid_remove() this.waypoint_next_btn.grid_remove() this.jumpcounttxt_lbl.grid_remove() if this.update_available: this.update_lbl = tk.Label(this.frame, text="SpanshRouter update available for download!") this.update_lbl.grid(row=5, pady=5) return this.frame