Added better download management and remembering export settings.

This commit is contained in:
Joey Payne 2014-09-26 22:28:16 +12:00
commit bd61087a30

114
main.py
View file

@ -23,6 +23,11 @@ else:
CWD = os.getcwd()
TEMP_DIR = get_temp_dir()
DEFAULT_DOWNLOAD_PATH = os.path.join(CWD, 'files', 'downloads')
try:
os.makedirs(DEFAULT_DOWNLOAD_PATH)
except:
pass
def get_base_url():
url = None
@ -49,6 +54,7 @@ class Setting(object):
self.name = name
self.display_name = display_name if display_name else name.replace('_',' ').capitalize()
self.value = value
self.last_value = None
self.required = required
self.type = type
self.file_types = file_types
@ -62,7 +68,7 @@ class Setting(object):
if self.value is None:
self.value = self.default_value
self.save_path = kwargs.pop('save_path', TEMP_DIR)
self.save_path = kwargs.pop('save_path', '')
self.get_file_information_from_url()
@ -78,7 +84,13 @@ class Setting(object):
self.extract_class = TarFile.open
self.extract_args = ('r:gz',)
def save_file_path(self, version):
def save_file_path(self, version, location=None):
if location:
self.save_path = location
else:
self.save_path = DEFAULT_DOWNLOAD_PATH
self.get_file_information_from_url()
if self.full_file_path:
return self.full_file_path.format(version)
return ''
@ -94,6 +106,7 @@ class Setting(object):
def get_file_bytes(self, version):
fbytes = []
file = self.extract_class(self.save_file_path(version), *self.extract_args)
for extract_path, dest_path in zip(self.extract_files, self.dest_files):
new_bytes = None
@ -207,8 +220,12 @@ class MainWindow(QtGui.QWidget):
self.getVersionsInBackground()
download_settings = {'nw_version':Setting('nw_version', 'Node-webkit version', default_value='0.9.2', values=[], type='list', button='Update NW Versions', button_callback=update_nw_versions),
'force_download': Setting('force_download', default_value=False, type='check')}
download_settings = {'nw_version':Setting('nw_version', 'Node-webkit version', default_value='0.9.2',
values=[], type='list', button='Update',
button_callback=update_nw_versions),
'force_download': Setting('force_download', default_value=False, type='check'),
'download_dir': Setting('download_dir', 'Download Location', default_value=DEFAULT_DOWNLOAD_PATH, type='folder'),
}
_setting_groups = [app_settings, webkit_settings, window_settings, export_settings, download_settings]
@ -222,10 +239,11 @@ class MainWindow(QtGui.QWidget):
export_setting_order = ['windows', 'linux-x64', 'mac', 'linux-x32']
download_setting_order = ['nw_version', 'force_download']
download_setting_order = ['nw_version', 'download_dir','force_download']
def __init__(self, width, height, parent=None):
super(MainWindow, self).__init__(parent)
self.update_json = False
self.setup_nw_versions()
@ -324,11 +342,12 @@ class MainWindow(QtGui.QWidget):
def download_file_with_error_handling(self):
setting = self.files_to_download.pop()
location = self.getSetting('download_dir').value
try:
self.downloadFile(setting.url.format(self.selected_version(), self.selected_version()), setting)
except Exception as e:
if os.path.exists(setting.save_file_path(self.selected_version())):
os.remove(setting.save_file_path(self.selected_version()))
if os.path.exists(setting.save_file_path(self.selected_version(), location)):
os.remove(setting.save_file_path(self.selected_version(), location))
error = ''.join(traceback.format_exception(sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2]))
self.show_error(error)
@ -369,6 +388,8 @@ class MainWindow(QtGui.QWidget):
if setting.type == 'file' and setting.value and not os.path.exists(os.path.join(self.projectDir(),setting.value)):
log(setting.value, "does not exist")
settings_valid = False
if setting.type == 'folder' and setting.value and not os.path.exists(setting.value):
settings_valid = False
export_chosen = False
for setting_name, setting in self.export_settings.items():
@ -543,8 +564,9 @@ class MainWindow(QtGui.QWidget):
def extractFiles(self):
self.extract_error = None
location = self.getSetting('download_dir').value
for setting_name, setting in self.export_settings.items():
save_file_path = setting.save_file_path(self.selected_version())
save_file_path = setting.save_file_path(self.selected_version(), location)
try:
if setting.value:
extract_path = os.path.join('files', setting.name)
@ -555,8 +577,8 @@ class MainWindow(QtGui.QWidget):
d.write(fbytes)
self.progress_text += '.'
if os.path.exists(save_file_path):
os.remove(save_file_path) #remove the zip/tar since we don't need it anymore
#if os.path.exists(save_file_path):
# os.remove(save_file_path) #remove the zip/tar since we don't need it anymore
self.progress_text += '.'
@ -596,17 +618,19 @@ class MainWindow(QtGui.QWidget):
def downloadFile(self, path, setting):
self.progress_text = 'Downloading {}'.format(path.replace(self.base_url.format(self.selected_version()),''))
location = self.getSetting('download_dir').value
url = QUrl(path)
fileInfo = QFileInfo(url.path())
fileName = setting.save_file_path(self.selected_version())
fileName = setting.save_file_path(self.selected_version(), location)
archive_exists = QFile.exists(fileName)
dest_files_exist = True
dest_files_exist = False
for dest_file in setting.dest_files:
dest_file_path = os.path.join('files', setting.name, dest_file)
dest_files_exist &= QFile.exists(dest_file_path)
#for dest_file in setting.dest_files:
# dest_file_path = os.path.join('files', setting.name, dest_file)
# dest_files_exist &= QFile.exists(dest_file_path)
forced = self.getSetting('force_download').value
@ -695,6 +719,7 @@ class MainWindow(QtGui.QWidget):
return self.findChildByName('name').text()
def browseDir(self):
self.update_json = False
directory = QtGui.QFileDialog.getExistingDirectory(self, "Find Project Directory",
self.projectDir() or QtCore.QDir.currentPath())
if directory:
@ -718,18 +743,29 @@ class MainWindow(QtGui.QWidget):
title_input.setText(proj_name)
self.loadPackageJson()
self.update_json = True
def browseOutDir(self):
self.update_json=False
directory = QtGui.QFileDialog.getExistingDirectory(self, "Choose Output Directory",
self.projectDir() or QtCore.QDir.currentPath())
self.output_line.text() or self.projectDir() or QtCore.QDir.currentPath())
if directory:
self.output_line.setText(directory)
self.update_json = True
def getFile(self, obj, text_obj, setting, *args, **kwargs):
file, junk = QtGui.QFileDialog.getOpenFileName(self, 'Choose File', self.projectDir() or QtCore.QDir.currentPath(), setting.file_types)
file, junk = QtGui.QFileDialog.getOpenFileName(self, 'Choose File', setting.last_value or self.projectDir() or QtCore.QDir.currentPath(), setting.file_types)
if file:
file = file.replace(self.projectDir()+os.path.sep,'')
text_obj.setText(file)
setting.last_value = file
def getFolder(self, obj, text_obj, setting, *args, **kwargs):
folder = QtGui.QFileDialog.getExistingDirectory(self, 'Choose Folder', setting.last_value or QtCore.QDir.currentPath())
if folder:
folder = folder.replace(self.projectDir()+os.path.sep,'')
text_obj.setText(folder)
setting.last_value = folder
def createApplicationSettings(self):
@ -745,6 +781,8 @@ class MainWindow(QtGui.QWidget):
return self.createTextInputSetting(name)
elif setting.type == 'file':
return self.createTextInputWithFileSetting(name)
elif setting.type == 'folder':
return self.createTextInputWithFolderSetting(name)
elif setting.type == 'check':
return self.createCheckSetting(name)
elif setting.type == 'list':
@ -833,12 +871,36 @@ class MainWindow(QtGui.QWidget):
return hlayout
def createTextInputWithFolderSetting(self, name):
hlayout = QtGui.QHBoxLayout()
setting = self.getSetting(name)
text = QtGui.QLineEdit()
text.setObjectName(setting.name)
button = QtGui.QPushButton('...')
button.setMaximumWidth(30)
button.setMaximumHeight(26)
button.clicked.connect(self.callWithObject('getFolder', button, text, setting))
if setting.value:
text.setText(str(setting.value))
text.textChanged.connect(self.callWithObject('settingChanged', text, setting))
hlayout.addWidget(text)
hlayout.addWidget(button)
return hlayout
def resetSettings(self):
for sgroup in self._setting_groups:
for setting in sgroup.values():
widget = self.findChildByName(setting.name)
if setting.type == 'string' or setting.type == 'file':
if setting.type == 'string' or setting.type == 'file' or setting.type == 'folder':
old_val = ''
if setting.default_value is not None:
@ -858,13 +920,19 @@ class MainWindow(QtGui.QWidget):
def settingChanged(self, obj, setting, *args, **kwargs):
if setting.type == 'string' or setting.type == 'file':
if setting.type == 'string' or setting.type == 'file' or setting.type == 'folder':
setting.value = obj.text()
elif setting.type == 'check':
setting.value = obj.isChecked()
elif setting.type == 'list':
setting.value = obj.currentText()
if self.update_json:
json_file = os.path.join(self.projectDir(), 'package.json')
with open(json_file, 'w+') as f:
f.write(self.generate_json())
self.ex_button.setEnabled(self.requiredSettingsFilled())
def projectPathChanged(self):
@ -934,6 +1002,8 @@ class MainWindow(QtGui.QWidget):
self.original_packagejson['webkit'] = {}
if 'window' not in self.original_packagejson:
self.original_packagejson['window'] = {}
if 'webexe_settings' not in self.original_packagejson:
self.original_packagejson['webexe_settings'] = {}
dic = self.original_packagejson
@ -958,6 +1028,10 @@ class MainWindow(QtGui.QWidget):
if setting.value is not None:
dic['webkit'][setting_name] = setting.value
for setting_name, setting in self.download_settings.items()+self.export_settings.items():
if setting.value is not None:
dic['webexe_settings'][setting_name] = setting.value
s = json.dumps(dic, indent=4)
return s
@ -984,7 +1058,7 @@ class MainWindow(QtGui.QWidget):
setting_field = self.findChildByName(item)
setting = self.getSetting(item)
if setting_field:
if setting.type == 'file' or setting.type == 'string':
if setting.type == 'file' or setting.type == 'string' or setting.type == 'folder':
val_str = self.convert_val_to_str(new_dic[item])
setting_field.setText(val_str)
setting.value = val_str