diff --git a/resources/report/css/style.css b/resources/report/css/style.css index a971511a..5d93b5a4 100644 --- a/resources/report/css/style.css +++ b/resources/report/css/style.css @@ -199,9 +199,6 @@ li.warn{ color:red; margin-left: 1.75em; } -plugin-card > ul { - margin-left: 1.75em; -} #settings > paper-checkbox, #settings > core-tooltip, #filters > paper-checkbox { display: block; @@ -239,7 +236,6 @@ body.editMode header #headerOverlay { cursor: move; } .highlight { - box-shadow: inset 0 0 10px 3px #69aaff; outline: 3px solid #69aaff; } #applySortButton { diff --git a/resources/report/html/loot-plugin-card.html b/resources/report/html/loot-plugin-card.html index be60da29..3d6ee1d9 100644 --- a/resources/report/html/loot-plugin-card.html +++ b/resources/report/html/loot-plugin-card.html @@ -1,3 +1,20 @@ + + @@ -58,11 +75,9 @@ :host(.flip) { transform: rotateY(180deg); } - :host(.flip) #front { display: none; } - :host(.flip) #editor { display: block; } @@ -155,10 +170,18 @@ #editor > div { padding: 1em; } + paper-menu-button paper-item:first-child { + padding: 0; + } + #showOnlyConflicts { + height: 48px; + line-height: 48px; + padding: 0 16px; + }
- + @@ -170,12 +193,12 @@ - + - + @@ -188,7 +211,7 @@
- +

@@ -297,13 +320,380 @@ \ No newline at end of file diff --git a/resources/report/html/plugin-card.html b/resources/report/html/plugin-card.html deleted file mode 100644 index b944b6db..00000000 --- a/resources/report/html/plugin-card.html +++ /dev/null @@ -1,899 +0,0 @@ - - - - - \ No newline at end of file diff --git a/resources/report/js/l10n.js b/resources/report/js/l10n.js index db3d97d4..2cd4e48f 100644 --- a/resources/report/js/l10n.js +++ b/resources/report/js/l10n.js @@ -51,24 +51,27 @@ translateStaticText: function(l10n) { /* Plugin card template. */ - var pluginCard = pluginCardImportDoc.querySelector('#pluginCard').content; - pluginCard.getElementById('activeTick').title = l10n.translate("Active Plugin").fetch(); - pluginCard.getElementById('dummyPlugin').title = l10n.translate("Dummy Plugin").fetch(); - pluginCard.getElementById('loadsBSA').title = l10n.translate("Loads BSA").fetch(); - pluginCard.getElementById('hasUserEdits').title = l10n.translate("Has User Metadata").fetch(); - pluginCard.getElementById('menuButton').title = l10n.translate("Click to open the plugin menu.").fetch(); + var pluginCard = document.querySelector('link[rel="import"][href$="loot-plugin-card.html"]').import.querySelector('template').content; + pluginCard.getElementById('front').querySelector('.activeTick').label = l10n.translate("Active Plugin").fetch(); + pluginCard.getElementById('editor').querySelector('.activeTick').label = l10n.translate("Active Plugin").fetch(); + pluginCard.getElementById('front').querySelector('.dummyPlugin').label = l10n.translate("Dummy Plugin").fetch(); + pluginCard.getElementById('editor').querySelector('.dummyPlugin').label = l10n.translate("Dummy Plugin").fetch(); + pluginCard.getElementById('front').querySelector('.loadsBSA').label = l10n.translate("Loads BSA").fetch(); + pluginCard.getElementById('editor').querySelector('.loadsBSA').label = l10n.translate("Loads BSA").fetch(); + pluginCard.getElementById('hasUserEdits').label = l10n.translate("Has User Metadata").fetch(); - pluginCard.getElementById('enableEdits').nextElementSibling.textContent = l10n.translate("Enable Edits").fetch(); - pluginCard.getElementById('globalPriority').nextElementSibling.title = l10n.translate("Global priorities are compared against all other plugins. Normal priorities are compared against only conflicting plugins.").fetch(); - pluginCard.getElementById('globalPriority').nextElementSibling.textContent = l10n.translate("Global Priority").fetch(); + pluginCard.getElementById('enableEdits').label = l10n.translate("Enable Edits").fetch(); + pluginCard.getElementById('globalPriority').parentElement.label = l10n.translate("Global priorities are compared against all other plugins. Normal priorities are compared against only conflicting plugins.").fetch(); + pluginCard.getElementById('globalPriority').label = l10n.translate("Global Priority").fetch(); pluginCard.getElementById('priorityValue').previousElementSibling.textContent = l10n.translate("Priority Value").fetch(); - pluginCard.getElementById('tableTabs').querySelector('[data-for=loadAfter]').textContent = l10n.translate("Load After").fetch(); - pluginCard.getElementById('tableTabs').querySelector('[data-for=req]').textContent = l10n.translate("Requirements").fetch(); - pluginCard.getElementById('tableTabs').querySelector('[data-for=inc]').textContent = l10n.translate("Incompatibilities").fetch(); - pluginCard.getElementById('tableTabs').querySelector('[data-for=message]').textContent = l10n.translate("Messages").fetch(); - pluginCard.getElementById('tableTabs').querySelector('[data-for=tags]').textContent = l10n.translate("Bash Tags").fetch(); - pluginCard.getElementById('tableTabs').querySelector('[data-for=dirty]').textContent = l10n.translate("Dirty Info").fetch(); + pluginCard.getElementById('fileTabs').querySelector('[data-for=loadAfter]').textContent = l10n.translate("Load After").fetch(); + pluginCard.getElementById('fileTabs').querySelector('[data-for=req]').textContent = l10n.translate("Requirements").fetch(); + pluginCard.getElementById('fileTabs').querySelector('[data-for=inc]').textContent = l10n.translate("Incompatibilities").fetch(); + pluginCard.getElementById('miscTabs').querySelector('[data-for=message]').textContent = l10n.translate("Messages").fetch(); + pluginCard.getElementById('miscTabs').querySelector('[data-for=tags]').textContent = l10n.translate("Bash Tags").fetch(); + pluginCard.getElementById('miscTabs').querySelector('[data-for=dirty]').textContent = l10n.translate("Dirty Info").fetch(); + pluginCard.getElementById('miscTabs').querySelector('[data-for=locations]').textContent = l10n.translate("Locations").fetch(); pluginCard.getElementById('loadAfter').querySelector('th:first-child').textContent = l10n.translate("Filename").fetch(); pluginCard.getElementById('loadAfter').querySelector('th:nth-child(2)').textContent = l10n.translate("Display Name").fetch(); @@ -103,13 +106,17 @@ pluginCard.getElementById('dirty').querySelector('th:nth-child(5)').textContent = l10n.translate("Cleaning Utility").fetch(); pluginCard.getElementById('dirty').querySelector('td:first-child').textContent = l10n.translate("Add new row...").fetch(); + pluginCard.getElementById('locations').querySelector('th:first-child').textContent = l10n.translate("URL").fetch(); + pluginCard.getElementById('locations').querySelector('th:nth-child(2)').textContent = l10n.translate("Version").fetch(); + pluginCard.getElementById('locations').querySelector('td:first-child').textContent = l10n.translate("Add new row...").fetch(); + pluginCard.getElementById('accept').textContent = l10n.translate("Apply").fetch(); pluginCard.getElementById('cancel').textContent = l10n.translate("Cancel").fetch(); - pluginCard.getElementById('showOnlyConflicts').nextSibling.textContent = l10n.translate("Show Only Conflicts").fetch(); - pluginCard.getElementById('editMetadata').firstChild.nextSibling.textContent = l10n.translate("Edit Metadata").fetch(); - pluginCard.getElementById('copyMetadata').firstChild.nextSibling.textContent = l10n.translate("Copy Metadata As Text").fetch(); - pluginCard.getElementById('clearMetadata').firstChild.nextSibling.textContent = l10n.translate("Clear User Metadata").fetch(); + pluginCard.getElementById('showOnlyConflicts').label = l10n.translate("Show Only Conflicts").fetch(); + pluginCard.getElementById('editMetadata').label = l10n.translate("Edit Metadata").fetch(); + pluginCard.getElementById('copyMetadata').label = l10n.translate("Copy Metadata As Text").fetch(); + pluginCard.getElementById('clearMetadata').label = l10n.translate("Clear User Metadata").fetch(); /* Plugin List Item Template */ var pluginItem = document.querySelector('link[rel="import"][href$="loot-plugin-item.html"]').import.querySelector('template').content; diff --git a/resources/report/js/plugin.js b/resources/report/js/plugin.js index 5ed5415e..afc69798 100644 --- a/resources/report/js/plugin.js +++ b/resources/report/js/plugin.js @@ -133,7 +133,7 @@ function Plugin(obj) { } Plugin.prototype.createCard = function() { - var card = new PluginCard(); + var card = document.createElement('loot-plugin-card'); this.card = card; card.id = this.id; diff --git a/resources/report/js/script.js b/resources/report/js/script.js index 79646053..c6afbe0d 100644 --- a/resources/report/js/script.js +++ b/resources/report/js/script.js @@ -466,7 +466,7 @@ function getConflictingPluginsFromFilter() { return Promise.resolve([]); } function applyFilters(evt) { - var cards = document.getElementById('main').getElementsByTagName('plugin-card'); + var cards = document.getElementById('main').getElementsByTagName('loot-plugin-card'); var entries = document.getElementById('cardsNav').getElementsByTagName('loot-plugin-item'); var hiddenPluginNo = 0; var hiddenMessageNo = 0; @@ -639,7 +639,7 @@ function sortUIElements(pluginNames) { var main = document.getElementById('main'); var cardsNav = document.getElementById('cardsNav'); var entries = cardsNav.getElementsByTagName('loot-plugin-item'); - if (main.getElementsByTagName('plugin-card').length != entries.length) { + if (main.getElementsByTagName('loot-plugin-card').length != entries.length) { throw Error("Error: Number of plugins in sidebar doesn't match number of plugins in main area!"); } var lastCard; @@ -658,7 +658,7 @@ function sortUIElements(pluginNames) { var move = false; if (index == 0) { /* Special case. */ - move = (card != card.parentElement.getElementsByTagName('plugin-card')[0]); + move = (card != card.parentElement.getElementsByTagName('loot-plugin-card')[0]); } else { move = (card.previousElementSibling.getName() != pluginNames[index-1]); } @@ -677,7 +677,7 @@ function sortUIElements(pluginNames) { if (lastCard) { main.insertBefore(card, lastCard.nextElementSibling); } else { - main.insertBefore(card, main.getElementsByTagName('plugin-card')[0]); + main.insertBefore(card, main.getElementsByTagName('loot-plugin-card')[0]); } cardsNav.removeChild(li); if (lastLi) { @@ -752,7 +752,7 @@ function sortPlugins(evt) { /* Record the previous order in case the user cancels sorting. */ /* Start at 2 to skip summary and general messages. */ - var cards = document.getElementById('main').getElementsByTagName('plugin-card'); + var cards = document.getElementById('main').getElementsByTagName('loot-plugin-card'); loot.newLoadOrder = loadOrder; loot.lastLoadOrder = []; for (var i = 0; i < cards.length; ++i) { @@ -1111,6 +1111,139 @@ function handleUnappliedChangesClose() { } }); } +function handleEditorOpen(evt) { + /* Set up drag 'n' drop event handlers. */ + var elements = document.getElementById('cardsNav').getElementsByTagName('loot-plugin-item'); + for (var i = 0; i < elements.length; ++i) { + elements[i].draggable = true; + elements[i].addEventListener('dragstart', elements[i].handleDragStart, false); + } + + /* Enable priority hover in plugins list and enable header + buttons if this is the only editor instance. */ + var numEditors = 0; + if (document.body.hasAttribute('data-editors')) { + numEditors = parseInt(document.body.getAttribute('data-editors'), 10); + } + ++numEditors; + + if (numEditors == 1) { + document.body.classList.add('editMode'); + } + document.body.setAttribute('data-editors', numEditors); +} +function handleEditorClose(evt) { + /* evt.detail is true if the apply button was pressed. */ + if (evt.detail) { + /* Need to record the editor control values and work out what's + changed, and update any UI elements necessary. Offload the + majority of the work to the C++ side of things. */ + + /* Find the plugin object. */ + var index; + for (var i = 0; i < loot.game.plugins.length; ++i) { + if (loot.game.plugins[i].id == evt.target.id) { + index = i; + break; + } + } + + var request = JSON.stringify({ + name: 'editorClosed', + args: [ + evt.target.readFromEditor(loot.game.plugins[index]) + ] + }); + loot.query(request).then(JSON.parse).then(function(result){ + if (result) { + loot.game.plugins[index].modPriority = result.modPriority; + loot.game.plugins[index].isGlobalPriority = result.isGlobalPriority; + loot.game.plugins[index].messages = result.messages; + loot.game.plugins[index].tags = result.tags; + loot.game.plugins[index].isDirty = result.isDirty; + } + }).catch(processCefError); + } + + /* Remove drag 'n' drop event handlers. */ + var elements = document.getElementById('cardsNav').getElementsByTagName('loot-plugin-item'); + for (var i = 0; i < elements.length; ++i) { + elements[i].removeAttribute('draggable'); + elements[i].removeEventListener('dragstart', elements[i].handleDragStart, false); + } + + /* Disable priority hover in plugins list and enable header + buttons if this is the only editor instance. */ + var numEditors = parseInt(document.body.getAttribute('data-editors'), 10); + --numEditors; + + if (numEditors == 0) { + document.body.classList.remove('editMode'); + } + document.body.setAttribute('data-editors', numEditors); +} +function handleConflictsFilter(evt) { + /* evt.detail is true if the filter has been activated. */ + if (evt.detail) { + /* Un-highlight any existing filter plugin. */ + var cards = document.getElementById('main').getElementsByTagName('loot-plugin-card'); + for (var i = 0; i < cards.length; ++i) { + cards[i].classList.toggle('highlight', false); + cards[i].deactivateConflictFilter(); + } + evt.target.classList.toggle('highlight', true); + document.body.setAttribute('data-conflicts', evt.target.getName()); + } else { + evt.target.classList.toggle('highlight', false); + document.body.removeAttribute('data-conflicts'); + } + applyFilters(evt); +} +function handleCopyMetadata(evt) { + /* evt.detail is the name of the plugin. */ + var request = JSON.stringify({ + name: 'copyMetadata', + args: [ + evt.target.getName(), + ] + }); + + loot.query(request).catch(processCefError); +} +function handleClearMetadata(evt) { + showMessageDialog('Clear Plugin Metadata', 'Are you sure you want to clear all existing user-added metadata from "' + evt.target.getName() + '"?', false, function(result){ + if (result) { + var request = JSON.stringify({ + name: 'clearPluginMetadata', + args: [ + evt.target.getName() + ] + }); + + loot.query(request).then(JSON.parse).then(function(result){ + if (result) { + /* Need to empty the UI-side user metadata. */ + for (var i = 0; i < loot.game.plugins.length; ++i) { + if (loot.game.plugins[i].id == evt.target.id) { + loot.game.plugins[i].userlist = undefined; + + loot.game.plugins[i].modPriority = result.modPriority; + loot.game.plugins[i].isGlobalPriority = result.isGlobalPriority; + loot.game.plugins[i].messages = result.messages; + loot.game.plugins[i].tags = result.tags; + loot.game.plugins[i].isDirty = result.isDirty; + + /* Also update the card content. */ + loot.game.plugins[i].card.setEditorData(loot.game.plugins[i]); + + break; + } + } + } + }).catch(processCefError); + } + }); +} function setupEventHandlers() { var elements; /*Set up filter value and CSS setting storage read/write handlers.*/ @@ -1128,6 +1261,7 @@ function setupEventHandlers() { document.getElementById('hideInactivePluginMessages').addEventListener('change', applyFilters, false); document.getElementById('hideAllPluginMessages').addEventListener('change', applyFilters, false); document.getElementById('hideMessagelessPlugins').addEventListener('change', applyFilters, false); + document.body.addEventListener('loot-filter-conflicts', handleConflictsFilter, false); /* Set up handlers for buttons. */ document.getElementById('redatePluginsButton').addEventListener('click', redatePlugins, false); @@ -1164,6 +1298,12 @@ function setupEventHandlers() { /* Set up handler for closing menus. */ document.body.addEventListener('click', onBodyClick, false); + + /* Set up handler for opening and closing editors. */ + document.body.addEventListener('loot-editor-open', handleEditorOpen, false); + document.body.addEventListener('loot-editor-close', handleEditorClose, false); + document.body.addEventListener('loot-copy-metadata', handleCopyMetadata, false); + document.body.addEventListener('loot-clear-metadata', handleClearMetadata, false); } function initVars() { loot.query('getVersion').then(function(result){ diff --git a/resources/report/report.html b/resources/report/report.html index da416d11..a64dfa5e 100644 --- a/resources/report/report.html +++ b/resources/report/report.html @@ -9,12 +9,12 @@ - + @@ -156,7 +156,7 @@
- +