Implemented UI handling of no game detection.

For #161. What happens now is that LOOT starts up and goes straight to
the settings panel, where a new game definition can be added, or the
existing ones edited, so that when LOOT is closed and re-opened, it can
run detect and run for a game.
This commit is contained in:
WrinklyNinja
2014-08-23 21:18:02 +01:00
parent 2b56509527
commit f6d7e802d5
3 changed files with 93 additions and 61 deletions
+75 -51
View File
@@ -219,21 +219,21 @@ function updateSelectedGame() {
/* Highlight game in menu. Could use fa-chevron-right instead. */
var gameMenuItems = document.getElementById('gameMenu').children[0].children;
for (var i = 0; i < gameMenuItems.length; ++i) {
if (gameMenuItems[i].getAttribute('data-folder') != loot.game.folder) {
gameMenuItems[i].getElementsByClassName('fa')[0].classList.toggle('fa-angle-double-right', false);
} else {
if (loot.game && gameMenuItems[i].getAttribute('data-folder') == loot.game.folder) {
gameMenuItems[i].getElementsByClassName('fa')[0].classList.toggle('fa-angle-double-right', true);
} else {
gameMenuItems[i].getElementsByClassName('fa')[0].classList.toggle('fa-angle-double-right', false);
}
}
/* Also enable/disable the redate plugins option. */
var index = undefined;
for (var i = 0; i < loot.settings.games.length; ++i) {
if (loot.settings.games[i].folder == loot.game.folder) {
if (loot.game && loot.settings.games[i].folder == loot.game.folder) {
index = i;
}
}
if (loot.settings.games[index].type == 'Skyrim') {
if (index != undefined && loot.settings.games[index].type == 'Skyrim') {
document.getElementById('redatePluginsButton').classList.toggle('disabled', false);
} else {
document.getElementById('redatePluginsButton').classList.toggle('disabled', true);
@@ -243,7 +243,7 @@ function updateSelectedGame() {
var rows = document.getElementById('gameTable').getElementsByTagName('tbody')[0].getElementsByTagName('tr');
for (var i = 0; i < rows.length; ++i) {
if (rows[i].getElementsByClassName('folder').length > 0) {
if (rows[i].getElementsByClassName('folder')[0].value == loot.game.folder) {
if (loot.game && rows[i].getElementsByClassName('folder')[0].value == loot.game.folder) {
document.getElementById('gameTable').setReadOnly(rows[i], ['fa-trash-o']);
} else {
document.getElementById('gameTable').setReadOnly(rows[i], ['fa-trash-o'], false);
@@ -594,8 +594,8 @@ function onBodyClick(evt) {
}
}
function openMenu(evt) {
if (!isVisible(evt.target.firstElementChild)) {
showElement(evt.target.firstElementChild)
if (!isVisible(evt.currentTarget.firstElementChild)) {
showElement(evt.currentTarget.firstElementChild)
/* To prevent the click event closing this menu just after it was
opened, stop the current event and send off a new one. */
@@ -604,7 +604,7 @@ function openMenu(evt) {
document.body.dispatchEvent(new CustomEvent('click', {
bubbles: true,
detail: {
newMenu: evt.target.firstElementChild
newMenu: evt.currentTarget.firstElementChild
}
}));
}
@@ -694,7 +694,7 @@ function closeSettingsDialog(evt) {
game: document.getElementById('defaultGameSelect').value,
games: document.getElementById('gameTable').getRowsData(false),
language: document.getElementById('languageSelect').value,
lastGame: loot.game.folder,
lastGame: loot.settings.lastGame,
updateMasterlist: document.getElementById('updateMasterlist').checked,
};
@@ -878,51 +878,77 @@ function initVars() {
}
}).catch(processCefError);
var parallelPromises = [
loot.query('getGameTypes'),
loot.query('getInstalledGames'),
loot.query('getGameData'),
loot.query('getSettings'),
];
loot.query('getInitErrors').then(JSON.parse).then(function(result){
if (result) {
var generalMessagesList = document.getElementById('generalMessages').getElementsByTagName('ul')[0];
Promise.all(parallelPromises).then(function(results) {
try {
loot.gameTypes = JSON.parse(results[0]);
} catch (e) {
console.log(e);
console.log('getGameTypes response: ' + results[0]);
result.forEach(function(message){
var li = document.createElement('li');
li.className = 'error';
/* Use the Marked library for Markdown formatting support. */
li.innerHTML = marked(message);
generalMessagesList.appendChild(li);
});
document.getElementById('filterTotalMessageNo').textContent = result.length;
document.getElementById('totalMessageNo').textContent = result.length;
document.getElementById('totalErrorNo').textContent = result.length;
}
/* Fill in game row template's game type options. */
var select = document.getElementById('gameRow').content.querySelector('select');
for (var j = 0; j < loot.gameTypes.length; ++j) {
var option = document.createElement('option');
option.value = loot.gameTypes[j];
option.textContent = loot.gameTypes[j];
select.appendChild(option);
var parallelPromises = [
loot.query('getGameTypes'),
loot.query('getInstalledGames'),
loot.query('getSettings'),
];
if (!result) {
parallelPromises.push(loot.query('getGameData'));
}
try {
loot.installedGames = JSON.parse(results[1]);
} catch (e) {
console.log(e);
console.log('getInstalledGames response: ' + results[1]);
}
updateInterfaceWithGameInfo(results[2]);
try {
loot.settings = JSON.parse(results[3]);
if (loot.settings.filters == undefined) {
loot.settings.filters = {};
Promise.all(parallelPromises).then(function(results) {
try {
loot.gameTypes = JSON.parse(results[0]);
} catch (e) {
console.log(e);
console.log('getGameTypes response: ' + results[0]);
}
applySavedFilters();
} catch (e) {
console.log(e);
console.log('getSettings response: ' + results[3]);
}
updateSettingsUI();
/* Fill in game row template's game type options. */
var select = document.getElementById('gameRow').content.querySelector('select');
for (var j = 0; j < loot.gameTypes.length; ++j) {
var option = document.createElement('option');
option.value = loot.gameTypes[j];
option.textContent = loot.gameTypes[j];
select.appendChild(option);
}
try {
loot.installedGames = JSON.parse(results[1]);
} catch (e) {
console.log(e);
console.log('getInstalledGames response: ' + results[1]);
}
try {
loot.settings = JSON.parse(results[2]);
if (loot.settings.filters == undefined) {
loot.settings.filters = {};
}
applySavedFilters();
updateSettingsUI();
} catch (e) {
console.log(e);
console.log('getSettings response: ' + results[2]);
}
if (results.length > 3) {
updateInterfaceWithGameInfo(results[3]);
} else {
document.getElementById('settingsButton').click();
}
}).catch(processCefError);
}).catch(processCefError);
}
@@ -1004,9 +1030,6 @@ function updateInterfaceWithGameInfo(response) {
/* Observe changes to update UI as appropriate. */
Object.observe(loot.game.masterlist, masterlistObserver);
// Now set up event handlers, as they depend on the plugin cards having been created.
setupEventHandlers();
}
require.config({
@@ -1020,5 +1043,6 @@ require(['marked', 'order!custom', 'order!plugin'], function(response) {
tables: true,
sanitize: true
});
setupEventHandlers();
initVars();
});
+10 -10
View File
@@ -466,10 +466,10 @@
<input type="checkbox" id="hideMessagelessPlugins" />
<label for="hideMessagelessPlugins">Hide messageless plugins</label>
<div>
<span>Hidden plugins</span>: <span id="hiddenPluginNo">0</span> / <span id="filterTotalPluginNo"></span>
<span>Hidden plugins</span>: <span id="hiddenPluginNo">0</span> / <span id="filterTotalPluginNo">0</span>
</div>
<div>
<span>Hidden messages</span>: <span id="hiddenMessageNo">0</span> / <span id="filterTotalMessageNo"></span>
<span>Hidden messages</span>: <span id="hiddenMessageNo">0</span> / <span id="filterTotalMessageNo">0</span>
</div>
</ol>
<li id="filtersToggle"><span class="fa fa-fw fa-filter"></span>Filters
@@ -481,14 +481,14 @@
<h1>Summary</h1>
<table>
<tbody>
<tr><td>Masterlist Revision<td id="masterlistRevision">
<tr><td>Masterlist Date<td id="masterlistDate">
<tr><td>Warnings<td id="totalWarningNo">
<tr><td>Errors<td id="totalErrorNo">
<tr><td>Total Messages<td id="totalMessageNo">
<tr><td>Active Plugins<td id="activePluginNo">
<tr><td>Dirty Plugins<td id="dirtyPluginNo">
<tr><td>Total Plugins<td id="totalPluginNo">
<tr><td>Masterlist Revision<td id="masterlistRevision">N/A
<tr><td>Masterlist Date<td id="masterlistDate">N/A
<tr><td>Warnings<td id="totalWarningNo">0
<tr><td>Errors<td id="totalErrorNo">0
<tr><td>Total Messages<td id="totalMessageNo">0
<tr><td>Active Plugins<td id="activePluginNo">0
<tr><td>Dirty Plugins<td id="dirtyPluginNo">0
<tr><td>Total Plugins<td id="totalPluginNo">0
</table>
</section>
<section id="generalMessages">
+8
View File
@@ -182,6 +182,14 @@ namespace loot {
callback->Success(SortPlugins());
return true;
}
else if (request == "getInitErrors") {
YAML::Node node(g_app_state.InitErrors());
if (node.size() > 0)
callback->Success(JSON::stringify(node));
else
callback->Success("null");
return true;
}
else {
// May be a request with arguments.
YAML::Node req;