Fix the bug where leaving the program open makes us always fail due to being logged out.

Also, some major refactoring to make the gui code cleaner.
This commit is contained in:
Anna Rose Wiggins 2016-01-28 11:52:09 -05:00
parent 4fdd7ba705
commit 0c2626ee5b
4 changed files with 191 additions and 134 deletions

146
gui.py Normal file
View file

@ -0,0 +1,146 @@
import actions
from datetime import datetime
import Tkinter as tk
import tkSimpleDialog, tkMessageBox
import utils
class UpdateWindow(object):
def __init__(self, parent, settings):
self.parent = parent
if settings is not None:
self.settings = settings
else:
self.settings = utils.update_settings(self._render_config_dialog, self.settings)
self.frame = tk.Frame(parent)
self.frame.pack(expand=True, fill=tk.BOTH)
self.message = tk.StringVar()
self.message.set("Click Update to update!")
message_label = tk.Label(self.frame, textvariable=self.message)
message_label.grid(columnspan=2, padx=20, pady=20)
self.update_button = tk.Button(self.frame, text="Update", height=2, width=4,
command=self._update_inara)
self.update_button.grid(row=1, column=0, pady=10)
config_button = tk.Button(self.frame, text="Config", height=1, width=2,
command=self._update_settings)
config_button.grid(row=1, column=1, sticky=tk.E+tk.S, padx=5, pady=5)
self._try_login()
def _update_inara(self, second_try=False):
self.message.set("Updating, please wait...")
self.parent.update()
try:
actions.update_inara(self.session)
self.message.set("Update successful! (Last update: %s)" %
datetime.now().isoformat(' ')[:16])
except:
if second_try:
self.message.set("Error updating! Double-check your config,\nor try again later.")
else:
# We don't use self._try_login() here because we don't want to disable the update button in this case.
self.session = actions.do_logins(self.settings)
self._update_inara(True)
def _update_settings(self):
self.settings = utils.update_settings(self._render_config_dialog, self.settings)
self._try_login()
def _try_login(self):
try:
self.session = actions.do_logins(self.settings)
self.update_button['state'] = tk.NORMAL
except:
self.update_button['state'] = tk.DISABLED
self.message.set("Error logging in. Double-check your config!")
def _render_config_dialog(self, settings):
dialog = ConfigDialog(self.frame, settings)
class ShipFrame(tk.Frame):
INSURANCE = {'0': .05, '1': .04, '2': .02}
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent, *args, **kwargs)
self.ship_data = []
name_header = tk.Label(self, text="Ship Name")
name_header.grid()
rebuy_header = tk.Label(self, text="Rebuy")
name_header.grid(column=1)
value_header = tk.Label(self, text="Value")
name_header.grid(column=2)
def add_ship(self, data):
"""
'data' should contain the following keys: name, id, rebuy, insurance, date, main, star, description, config, image.
Some of these are probably blank, but we need to propagate all of them to the Inara form eventually.
"""
if not self._validate_data(data):
return False
label = tk.Label(self, text="%s:" % data['name'])
label.grid()
entry = tk.Entry(self, text=value)
entry.grid(column=1)
ship_value = int(data['rebuy']) / INSURANCE[data['insurance']]
value_label = tk.Label(self, text=str(ship_value))
value_label.grid(column=2)
data['rebuy_entry'] = entry
self.ship_data.append(data)
def _validate_date(self, data):
return all(key in data.keys() for key in
('name', 'id', 'rebuy', 'insurance', 'date', 'main', 'star', 'description', 'config', 'image'))
class ConfigDialog(tkSimpleDialog.Dialog):
def __init__(self, parent, settings, title="Authentication Data"):
self.settings = settings
self.entries = []
self.data = []
tkSimpleDialog.Dialog.__init__(self, parent, title)
def body(self, parent):
i = 0
values = []
for section, value in (('ed_companion', 'username'),
('ed_companion', 'password'),
('inara', 'username'),
('inara', 'password')):
if self.settings.has_option(section, value):
values.append(self.settings.get(section, value))
else:
values.append("")
for field in ("Elite Username (email address):",
"Elite Password:",
"Inara Username:",
"Inara Password:"):
label = tk.Label(parent, text=field)
label.grid(row=i, column=0, sticky=tk.W)
entry = tk.Entry(parent, width=30)
entry.insert(0, values[i])
entry.grid(row=i, column=1, sticky=tk.E)
self.entries.append(entry)
i += 1
return self.entries[0]
def validate(self):
for entry in self.entries:
if entry.get().strip() == "":
tkMessageBox.showwarning("Missing Data",
"You must provide a value for every field.")
return False
return True
def apply(self):
self.settings.set('ed_companion', 'username', self.entries[0].get().strip())
self.settings.set('ed_companion', 'password', self.entries[1].get().strip())
self.settings.set('inara', 'username', self.entries[2].get().strip())
self.settings.set('inara', 'password', self.entries[3].get().strip())