mirror of
https://github.com/loot/libloot.git
synced 2026-07-27 14:16:01 -07:00
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:
@@ -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();
|
||||
});
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user