/* TextureXPanel::handleAction * Handles the action [id]. Returns true if the action was handled, * false otherwise *******************************************************************/ bool TextureXPanel::handleAction(string id) { // Don't handle if hidden if (!tx_editor->IsShown() || !IsShown()) return false; // Only interested in "txed_" events if (!id.StartsWith("txed_")) return false; // Handle action if (id == "txed_new") newTexture(); else if (id == "txed_delete") removeTexture(); else if (id == "txed_new_patch") newTextureFromPatch(); else if (id == "txed_new_file") newTextureFromFile(); else if (id == "txed_up") moveUp(); else if (id == "txed_down") moveDown(); else if (id == "txed_sort") sort(); else if (id == "txed_copy") copy(); else if (id == "txed_cut") { copy(); removeTexture(); } else if (id == "txed_paste") paste(); else if (id == "txed_export") exportTexture(); else if (id == "txed_extract") extractTexture(); else if (id == "txed_rename") renameTexture(); else if (id == "txed_rename_each") renameTexture(true); else if (id == "txed_offsets") modifyOffsets(); else return false; // Not handled here return true; }
// ----------------------------------------------------------------------------- // Creates a new texture from an existing patch // ----------------------------------------------------------------------------- void TextureXPanel::newTextureFromPatch() { // Browse for patch string patch; if (TxListIsTextures(texturex_)) patch = tx_editor_->browsePatchEntry(); else patch = tx_editor_->patchTable().patchName(tx_editor_->browsePatchTable()); if (!patch.IsEmpty()) { // Prompt for new texture name string name = wxGetTextFromUser("Enter a texture name:", "New Texture", patch); // Do nothing if no name entered if (name.IsEmpty()) return; // Process name name = name.Upper().Truncate(8); // Create new texture from patch CTexture* tex = newTextureFromPatch(name, patch); // Add texture after the last selected item int selected = list_textures_->getItemIndex(list_textures_->getLastSelected()); if (selected == -1) selected = texturex_.nTextures() - 1; // Add to end of the list if nothing selected texturex_.addTexture(tex, selected + 1); // Record undo level undo_manager_->beginRecord("New Texture from Patch"); undo_manager_->recordUndoStep(new TextureCreateDeleteUS(this, tex, true)); undo_manager_->endRecord(true); // Update texture list list_textures_->updateList(); // Select the new texture list_textures_->clearSelection(); list_textures_->selectItem(selected + 1); list_textures_->EnsureVisible(selected + 1); // Update patch table counts tx_editor_->patchTable().updatePatchUsage(tex); } }
/* TextureXPanel::newTextureFromFile * Creates a new texture from an image file. The file will be * imported and added to the patch table if needed *******************************************************************/ void TextureXPanel::newTextureFromFile() { // Get all entry types vector<EntryType*> etypes = EntryType::allTypes(); // Go through types string ext_filter = "All files (*.*)|*.*|"; for (unsigned a = 0; a < etypes.size(); a++) { // If the type is a valid image type, add its extension filter if (etypes[a]->extraProps().propertyExists("image")) { ext_filter += etypes[a]->getFileFilterString(); ext_filter += "|"; } } // Create open file dialog wxFileDialog dialog_open(this, "Choose file(s) to open", dir_last, wxEmptyString, ext_filter, wxFD_OPEN|wxFD_MULTIPLE|wxFD_FILE_MUST_EXIST, wxDefaultPosition); // Run the dialog & check that the user didn't cancel if (dialog_open.ShowModal() == wxID_OK) { // Get file selection wxArrayString files; dialog_open.GetPaths(files); // Save 'dir_last' dir_last = dialog_open.GetDirectory(); // Go through file selection for (unsigned a = 0; a < files.size(); a++) { // Load the file into a temporary ArchiveEntry ArchiveEntry* entry = new ArchiveEntry(); entry->importFile(files[a]); // Determine type EntryType::detectEntryType(entry); // If it's not a valid image type, ignore this file if (!entry->getType()->extraProps().propertyExists("image")) { wxLogMessage("%s is not a valid image file", files[a]); continue; } // Ask for name for texture wxFileName fn(files[a]); string name = fn.GetName().Upper().Truncate(8); name = wxGetTextFromUser(S_FMT("Enter a texture name for %s:", fn.GetFullName()), "New Texture", name); name = name.Truncate(8); // Add patch to archive entry->setName(name); entry->setExtensionByType(); tx_entry->getParent()->addEntry(entry, "patches"); // Add patch to patch table if needed if (texturex.getFormat() != TXF_TEXTURES) tx_editor->patchTable().addPatch(name); // Create new texture from patch CTexture* tex = newTextureFromPatch(name, name); // Add texture after the last selected item int selected = list_textures->getLastSelected(); if (selected == -1) selected = texturex.nTextures() - 1; // Add to end of the list if nothing selected texturex.addTexture(tex, selected + 1); // Record undo level undo_manager->beginRecord("New Texture from File"); undo_manager->recordUndoStep(new TextureCreateDeleteUS(this, tex, true)); undo_manager->endRecord(true); // Update texture list list_textures->updateList(); // Select the new texture list_textures->clearSelection(); list_textures->selectItem(selected + 1); list_textures->EnsureVisible(selected + 1); // Update patch table counts tx_editor->patchTable().updatePatchUsage(tex); } } }
/* TextureXPanel::onBtnNewTextureFromPatch * Called when the 'New Texture from Patch' button is clicked *******************************************************************/ void TextureXPanel::onBtnNewTextureFromPatch(wxCommandEvent& e) { newTextureFromPatch(); }
/* TextureXPanel::onTextureListKeyDown * Called when a key is pressed in the texture list *******************************************************************/ void TextureXPanel::onTextureListKeyDown(wxKeyEvent& e) { // Check if keypress matches any keybinds wxArrayString binds = KeyBind::getBinds(KeyBind::asKeyPress(e.GetKeyCode(), e.GetModifiers())); // Go through matching binds for (unsigned a = 0; a < binds.size(); a++) { string name = binds[a]; // Copy if (name == "copy") { copy(); return; } // Cut else if (name == "cut") { copy(); removeTexture(); return; } // Paste else if (name == "paste") { paste(); return; } // Move texture up else if (name == "txed_tex_up") { moveUp(); return; } // Move texture down else if (name == "txed_tex_down") { moveDown(); return; } // New texture else if (name == "txed_tex_new") { newTexture(); return; } // New texture from patch else if (name == "txed_tex_new_patch") { newTextureFromPatch(); return; } // New texture from file else if (name == "txed_tex_new_file") { newTextureFromFile(); return; } // Delete texture else if (name == "txed_tex_delete") { removeTexture(); return; } } // Not handled here, send off to be handled by a parent window e.Skip(); }
// ----------------------------------------------------------------------------- // TextureXPanel class constructor // ----------------------------------------------------------------------------- TextureXPanel::TextureXPanel(wxWindow* parent, TextureXEditor& tx_editor) : wxPanel{ parent, -1 }, tx_editor_{ &tx_editor }, undo_manager_{ tx_editor.getUndoManager() } { // Setup sizer wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL); SetSizer(sizer); // Add textures list wxStaticBox* frame = new wxStaticBox(this, -1, "Textures"); wxStaticBoxSizer* framesizer = new wxStaticBoxSizer(frame, wxVERTICAL); wxBoxSizer* hbox = new wxBoxSizer(wxHORIZONTAL); label_tx_format_ = new wxStaticText(this, -1, "Format:"); hbox->Add(label_tx_format_, 0, wxALIGN_BOTTOM | wxRIGHT, UI::pad()); btn_save_ = new SIconButton(this, "save", "Save"); hbox->AddStretchSpacer(); hbox->Add(btn_save_, 0, wxEXPAND); framesizer->Add(hbox, 0, wxEXPAND | wxLEFT | wxRIGHT, UI::pad()); list_textures_ = new TextureXListView(this, &texturex_); framesizer->Add(list_textures_, 1, wxEXPAND | wxALL, UI::pad()); sizer->Add(framesizer, 0, wxEXPAND | wxLEFT | wxTOP | wxBOTTOM, UI::pad()); // Texture list filter text_filter_ = new wxTextCtrl(this, -1); btn_clear_filter_ = new SIconButton(this, "close", "Clear Filter"); WxUtils::layoutHorizontally( framesizer, vector<wxObject*>{ WxUtils::createLabelHBox(this, "Filter:", text_filter_), btn_clear_filter_ }, wxSizerFlags(0).Expand().Border(wxLEFT | wxRIGHT | wxBOTTOM, UI::pad()), 0); // Add texture operations buttons wxGridBagSizer* gbsizer = new wxGridBagSizer(UI::pad(), UI::pad()); framesizer->Add(gbsizer, 0, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, UI::pad()); btn_move_up_ = new SIconButton(this, "up", "Move Up"); btn_move_down_ = new SIconButton(this, "down", "Move Down"); btn_new_texture_ = new SIconButton(this, "tex_new", "New"); btn_remove_texture_ = new SIconButton(this, "tex_delete", "Remove"); btn_new_from_patch_ = new SIconButton(this, "tex_newpatch", "New from Patch"); btn_new_from_file_ = new SIconButton(this, "tex_newfile", "New from File"); gbsizer->Add(btn_new_texture_, { 0, 0 }, { 1, 1 }); gbsizer->Add(btn_new_from_patch_, { 0, 1 }, { 1, 1 }); gbsizer->Add(btn_new_from_file_, { 0, 2 }, { 1, 1 }); gbsizer->Add(btn_remove_texture_, { 0, 3 }, { 1, 1 }); gbsizer->Add(btn_move_up_, { 0, 4 }, { 1, 1 }); gbsizer->Add(btn_move_down_, { 0, 5 }, { 1, 1 }); // Bind events list_textures_->Bind(wxEVT_LIST_ITEM_SELECTED, &TextureXPanel::onTextureListSelect, this); list_textures_->Bind(wxEVT_LIST_ITEM_RIGHT_CLICK, &TextureXPanel::onTextureListRightClick, this); list_textures_->Bind(wxEVT_KEY_DOWN, &TextureXPanel::onTextureListKeyDown, this); btn_new_texture_->Bind(wxEVT_BUTTON, [&](wxCommandEvent&) { newTexture(); }); btn_new_from_patch_->Bind(wxEVT_BUTTON, [&](wxCommandEvent&) { newTextureFromPatch(); }); btn_new_from_file_->Bind(wxEVT_BUTTON, [&](wxCommandEvent&) { newTextureFromFile(); }); btn_remove_texture_->Bind(wxEVT_BUTTON, [&](wxCommandEvent&) { removeTexture(); }); btn_move_up_->Bind(wxEVT_BUTTON, [&](wxCommandEvent&) { moveUp(); }); btn_move_down_->Bind(wxEVT_BUTTON, [&](wxCommandEvent&) { moveDown(); }); btn_save_->Bind(wxEVT_BUTTON, [&](wxCommandEvent&) { tx_editor_->saveChanges(); }); Bind(wxEVT_SHOW, [&](wxShowEvent&) { tx_editor_->updateMenuStatus(); }); text_filter_->Bind(wxEVT_TEXT, &TextureXPanel::onTextFilterChanged, this); btn_clear_filter_->Bind(wxEVT_BUTTON, &TextureXPanel::onBtnClearFitler, this); }