mirror of
https://github.com/loot/libloot.git
synced 2026-07-27 14:16:01 -07:00
Issue #70 work.
* Fixed range limits on the priority spinner. * Implemented right-click menu for plugin list, moved "Copy Metadata As Text" into it and added "Copy Name" and "Remove All User-Added Metadata" entries.
This commit is contained in:
+80
-34
@@ -30,6 +30,7 @@
|
||||
#include <boost/filesystem.hpp>
|
||||
|
||||
#include <wx/clipbrd.h>
|
||||
#include <wx/msgdlg.h>
|
||||
|
||||
using namespace std;
|
||||
|
||||
@@ -121,7 +122,7 @@ Editor::Editor(wxWindow *parent, const wxString& title, const std::string userli
|
||||
//Initialise controls.
|
||||
pluginText = new wxStaticText(this, wxID_ANY, "");
|
||||
prioritySpin = new wxSpinCtrl(this, wxID_ANY, "0");
|
||||
prioritySpin->SetRange(-10,10);
|
||||
prioritySpin->SetRange(std::numeric_limits<int>::min(), std::numeric_limits<int>::max());
|
||||
enableUserEditsBox = new wxCheckBox(this, wxID_ANY, translate("Enable User Changes"));
|
||||
|
||||
addBtn = new wxButton(this, BUTTON_AddRow, translate("Add File"));
|
||||
@@ -129,7 +130,6 @@ Editor::Editor(wxWindow *parent, const wxString& title, const std::string userli
|
||||
removeBtn = new wxButton(this, BUTTON_RemoveRow, translate("Remove File"));
|
||||
applyBtn = new wxButton(this, BUTTON_Apply, translate("Save Changes"));
|
||||
cancelBtn = new wxButton(this, BUTTON_Cancel, translate("Cancel"));
|
||||
exportBtn = new wxButton(this, BUTTON_Export, translate("Copy Metadata As Text"));
|
||||
|
||||
pluginList = new wxListView(this, LIST_Plugins, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxLC_SINGLE_SEL);
|
||||
reqsList = new wxListView(reqsTab, LIST_Reqs, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxLC_SINGLE_SEL);
|
||||
@@ -139,6 +139,8 @@ Editor::Editor(wxWindow *parent, const wxString& title, const std::string userli
|
||||
dirtyList = new wxListView(dirtyTab, LIST_DirtyInfo, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxLC_SINGLE_SEL);
|
||||
messageList = new MessageList(messagesTab, LIST_Messages, language);
|
||||
|
||||
pluginMenu = new wxMenu();
|
||||
|
||||
//Tie together notebooks and panels.
|
||||
listBook->AddPage(reqsTab, translate("Requirements"), true);
|
||||
listBook->AddPage(incsTab, translate("Incompatibilities"));
|
||||
@@ -172,13 +174,17 @@ Editor::Editor(wxWindow *parent, const wxString& title, const std::string userli
|
||||
dirtyList->AppendColumn(translate("Deleted Navmesh Count"));
|
||||
dirtyList->AppendColumn(translate("Cleaning Utility"));
|
||||
|
||||
//Set up plugin right-click menu.
|
||||
pluginMenu->Append(MENU_CopyName, translate("Copy Name"));
|
||||
pluginMenu->Append(MENU_CopyMetadata, translate("Copy Metadata As Text"));
|
||||
pluginMenu->Append(MENU_ClearMetadata, translate("Remove All User-Added Metadata"));
|
||||
|
||||
//Initialise control states.
|
||||
addBtn->Enable(false);
|
||||
editBtn->Enable(false);
|
||||
removeBtn->Enable(false);
|
||||
prioritySpin->Enable(false);
|
||||
enableUserEditsBox->Enable(false);
|
||||
exportBtn->Enable(false);
|
||||
|
||||
//Make plugin name bold text.
|
||||
wxFont font = pluginText->GetFont();
|
||||
@@ -199,7 +205,10 @@ Editor::Editor(wxWindow *parent, const wxString& title, const std::string userli
|
||||
Bind(wxEVT_BUTTON, &Editor::OnAddRow, this, BUTTON_AddRow);
|
||||
Bind(wxEVT_BUTTON, &Editor::OnEditRow, this, BUTTON_EditRow);
|
||||
Bind(wxEVT_BUTTON, &Editor::OnRemoveRow, this, BUTTON_RemoveRow);
|
||||
Bind(wxEVT_BUTTON, &Editor::OnExport, this, BUTTON_Export);
|
||||
Bind(wxEVT_LIST_ITEM_RIGHT_CLICK, &Editor::OnPluginListRightClick, this);
|
||||
Bind(wxEVT_MENU, &Editor::OnPluginCopyName, this, MENU_CopyName);
|
||||
Bind(wxEVT_MENU, &Editor::OnPluginCopyMetadata, this, MENU_CopyMetadata);
|
||||
Bind(wxEVT_MENU, &Editor::OnPluginClearMetadata, this, MENU_ClearMetadata);
|
||||
|
||||
//Set up layout.
|
||||
wxBoxSizer * bigBox = new wxBoxSizer(wxHORIZONTAL);
|
||||
@@ -251,8 +260,6 @@ Editor::Editor(wxWindow *parent, const wxString& title, const std::string userli
|
||||
hbox2->Add(removeBtn, 0, wxLEFT, 5);
|
||||
mainBox->Add(hbox2, 0, wxALIGN_RIGHT);
|
||||
|
||||
mainBox->Add(exportBtn, 0, wxALIGN_RIGHT|wxTOP, 10);
|
||||
|
||||
mainBox->AddSpacer(30);
|
||||
|
||||
wxBoxSizer * hbox6 = new wxBoxSizer(wxHORIZONTAL);
|
||||
@@ -372,7 +379,66 @@ void Editor::OnPluginSelect(wxListEvent& event) {
|
||||
addBtn->Enable(true);
|
||||
editBtn->Enable(false);
|
||||
removeBtn->Enable(false);
|
||||
exportBtn->Enable(true);
|
||||
}
|
||||
}
|
||||
|
||||
void Editor::OnPluginListRightClick(wxListEvent& event) {
|
||||
PopupMenu(pluginMenu);
|
||||
}
|
||||
|
||||
void Editor::OnPluginCopyName(wxCommandEvent& event) {
|
||||
if (wxTheClipboard->Open()) {
|
||||
wxTheClipboard->SetData(new wxTextDataObject(pluginList->GetItemText(pluginList->GetFirstSelected())));
|
||||
wxTheClipboard->Close();
|
||||
}
|
||||
}
|
||||
|
||||
void Editor::OnPluginCopyMetadata(wxCommandEvent& event) {
|
||||
wxString selectedPlugin = pluginList->GetItemText(pluginList->GetFirstSelected());
|
||||
boss::Plugin plugin = GetUserData(selectedPlugin);
|
||||
|
||||
string text;
|
||||
if (plugin.HasNameOnly())
|
||||
text = "name: " + plugin.Name();
|
||||
else {
|
||||
YAML::Emitter yout;
|
||||
yout.SetIndent(2);
|
||||
yout << plugin;
|
||||
text = yout.c_str();
|
||||
}
|
||||
|
||||
BOOST_LOG_TRIVIAL(info) << "Exported userlist metadata text for \"" << selectedPlugin.ToUTF8() << "\": " << text;
|
||||
|
||||
if (!text.empty() && wxTheClipboard->Open()) {
|
||||
wxTheClipboard->SetData(new wxTextDataObject(FromUTF8(text)));
|
||||
wxTheClipboard->Close();
|
||||
}
|
||||
}
|
||||
|
||||
void Editor::OnPluginClearMetadata(wxCommandEvent& event) {
|
||||
wxMessageDialog dialog(this,
|
||||
translate("Are you sure you want to clear all existing user-added metadata from this plugin?"),
|
||||
translate("BOSS: Warning"),
|
||||
wxYES_NO | wxCANCEL | wxICON_EXCLAMATION);
|
||||
|
||||
if (dialog.ShowModal() == wxID_YES) {
|
||||
long i = pluginList->GetFirstSelected();
|
||||
wxString selectedPlugin = pluginList->GetItemText(i);
|
||||
boss::Plugin p(string(selectedPlugin.ToUTF8()));
|
||||
|
||||
//Need to clear what's currently in the editor and what's from the userlist.
|
||||
|
||||
vector<boss::Plugin>::const_iterator it = std::find(_editedPlugins.begin(), _editedPlugins.end(), p);
|
||||
|
||||
//Delete existing userlist entry.
|
||||
if (it != _editedPlugins.end())
|
||||
_editedPlugins.erase(it);
|
||||
|
||||
//Also clear any unapplied data. Easiest way to do this is to simulate loading the plugin's data again.
|
||||
pluginText->SetLabelText("");
|
||||
pluginList->Select(i, false);
|
||||
pluginList->Select(i, true);
|
||||
pluginList->SetItemFont(i, wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -751,27 +817,6 @@ void Editor::OnRowSelect(wxListEvent& event) {
|
||||
}
|
||||
}
|
||||
|
||||
void Editor::OnExport(wxCommandEvent& event) {
|
||||
wxString currentPlugin = pluginText->GetLabelText();
|
||||
|
||||
boss::Plugin initial = GetMasterData(currentPlugin);
|
||||
boss::Plugin edited = GetNewData(currentPlugin);
|
||||
|
||||
boss::Plugin diff = edited.DiffMetadata(initial);
|
||||
|
||||
YAML::Emitter yout;
|
||||
yout.SetIndent(2);
|
||||
yout << diff;
|
||||
string text = yout.c_str();
|
||||
|
||||
BOOST_LOG_TRIVIAL(info) << "Exported metadata text for \"" << currentPlugin.ToUTF8() << "\": " << text;
|
||||
|
||||
if (!text.empty() && wxTheClipboard->Open()) {
|
||||
wxTheClipboard->SetData( new wxTextDataObject(FromUTF8(text)) );
|
||||
wxTheClipboard->Close();
|
||||
}
|
||||
}
|
||||
|
||||
void Editor::OnQuit(wxCommandEvent& event) {
|
||||
BOOST_LOG_TRIVIAL(debug) << "Exiting metadata editor.";
|
||||
if (event.GetId() == BUTTON_Apply) {
|
||||
@@ -813,10 +858,12 @@ void Editor::ApplyEdits(const wxString& plugin) {
|
||||
_editedPlugins.push_back(diff);
|
||||
|
||||
//Also mark plugin as edited in list.
|
||||
if (!diff.HasNameOnly()) {
|
||||
long i = pluginList->FindItem(-1, plugin);
|
||||
long i = pluginList->FindItem(-1, plugin);
|
||||
if (!diff.HasNameOnly())
|
||||
pluginList->SetItemFont(i, wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT).Bold());
|
||||
}
|
||||
else
|
||||
pluginList->SetItemFont(i, wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
|
||||
|
||||
}
|
||||
|
||||
boss::Plugin Editor::GetMasterData(const wxString& plugin) const {
|
||||
@@ -834,10 +881,9 @@ boss::Plugin Editor::GetMasterData(const wxString& plugin) const {
|
||||
|
||||
boss::Plugin Editor::GetUserData(const wxString& plugin) const {
|
||||
BOOST_LOG_TRIVIAL(debug) << "Getting userlist metadata for plugin: " << plugin.ToUTF8();
|
||||
boss::Plugin p;
|
||||
boss::Plugin p_in(string(plugin.ToUTF8()));
|
||||
boss::Plugin p(string(plugin.ToUTF8()));
|
||||
|
||||
vector<boss::Plugin>::const_iterator it = std::find(_editedPlugins.begin(), _editedPlugins.end(), p_in);
|
||||
vector<boss::Plugin>::const_iterator it = std::find(_editedPlugins.begin(), _editedPlugins.end(), p);
|
||||
|
||||
if (it != _editedPlugins.end())
|
||||
p = *it;
|
||||
|
||||
+5
-2
@@ -57,24 +57,27 @@ public:
|
||||
Editor(wxWindow *parent, const wxString& title, const std::string userlistPath, const std::vector<boss::Plugin>& basePlugins, std::vector<boss::Plugin>& editedPlugins, const unsigned int language, const boss::Game& game);
|
||||
|
||||
void OnPluginSelect(wxListEvent& event);
|
||||
void OnPluginListRightClick(wxListEvent& event);
|
||||
void OnPluginCopyName(wxCommandEvent& event);
|
||||
void OnPluginCopyMetadata(wxCommandEvent& event);
|
||||
void OnPluginClearMetadata(wxCommandEvent& event);
|
||||
void OnEnabledToggle(wxCommandEvent& event);
|
||||
void OnPriorityChange(wxSpinEvent& event);
|
||||
void OnListBookChange(wxBookCtrlEvent& event);
|
||||
void OnAddRow(wxCommandEvent& event);
|
||||
void OnEditRow(wxCommandEvent& event);
|
||||
void OnRemoveRow(wxCommandEvent& event);
|
||||
void OnExport(wxCommandEvent& event);
|
||||
void OnRecalc(wxCommandEvent& event);
|
||||
void OnRowSelect(wxListEvent& event);
|
||||
void OnQuit(wxCommandEvent& event);
|
||||
private:
|
||||
|
||||
wxMenu * pluginMenu;
|
||||
wxButton * addBtn;
|
||||
wxButton * editBtn;
|
||||
wxButton * removeBtn;
|
||||
wxButton * applyBtn;
|
||||
wxButton * cancelBtn;
|
||||
wxButton * exportBtn;
|
||||
wxListView * pluginList;
|
||||
wxListView * reqsList;
|
||||
wxListView * incsList;
|
||||
|
||||
+3
-1
@@ -63,8 +63,10 @@ enum {
|
||||
BUTTON_RemoveContent,
|
||||
BUTTON_Apply,
|
||||
BUTTON_Cancel,
|
||||
BUTTON_Export,
|
||||
BOOK_Lists,
|
||||
MENU_CopyName,
|
||||
MENU_CopyMetadata,
|
||||
MENU_ClearMetadata,
|
||||
//Main window - dynamically created IDs.
|
||||
MENU_LowestDynamicGameID,
|
||||
LIST_LoadOrder,
|
||||
|
||||
Reference in New Issue
Block a user