// ---------------------------------------------------------------------------- // ArchiveEntryList::updateItemAttr // // Called when widget requests the attributes // (text colour / background colour / font) for [item] // ---------------------------------------------------------------------------- void ArchiveEntryList::updateItemAttr(long item, long column, long index) const { // Get associated entry ArchiveEntry* entry = getEntry(item); // Init attributes wxColour col_bg = wxSystemSettings::GetColour(wxSYS_COLOUR_LISTBOX); item_attr->SetTextColour(WXCOL(ColourConfiguration::getColour("error"))); item_attr->SetBackgroundColour(col_bg); // If entry doesn't exist, return error colour if (!entry) return; // Set font if (elist_name_monospace && !list_font_monospace) item_attr->SetFont((column == 0) ? *font_monospace : *font_normal); else item_attr->SetFont(list_font_monospace ? *font_monospace : *font_normal); // Set background colour defined in entry type (if any) rgba_t col = entry->getType()->getColour(); if ((col.r != 255 || col.g != 255 || col.b != 255) && elist_type_bgcol) { rgba_t bcol; bcol.r = (col.r * elist_type_bgcol_intensity) + (col_bg.Red() * (1.0 - elist_type_bgcol_intensity)); bcol.g = (col.g * elist_type_bgcol_intensity) + (col_bg.Green() * (1.0 - elist_type_bgcol_intensity)); bcol.b = (col.b * elist_type_bgcol_intensity) + (col_bg.Blue() * (1.0 - elist_type_bgcol_intensity)); item_attr->SetBackgroundColour(WXCOL(bcol)); } // Alternating row colour if (elist_alt_row_colour && item % 2 > 0) { wxColour dark = item_attr->GetBackgroundColour().ChangeLightness(95); item_attr->SetBackgroundColour(dark); } // Set colour depending on entry state switch (entry->getState()) { case 1: item_attr->SetTextColour(WXCOL(ColourConfiguration::getColour("modified"))); break; case 2: item_attr->SetTextColour(WXCOL(ColourConfiguration::getColour("new"))); break; default: item_attr->SetTextColour(wxSystemSettings::GetColour(wxSYS_COLOUR_LISTBOXTEXT)); break; }; // Locked state overrides others if (entry->isLocked()) item_attr->SetTextColour(WXCOL(ColourConfiguration::getColour("locked"))); }
/* EntryOperations::createTexture * Same as addToPatchTable, but also creates a single-patch texture * from each added patch *******************************************************************/ bool EntryOperations::createTexture(vector<ArchiveEntry*> entries) { // Check any entries were given if (entries.size() == 0) return true; // Get parent archive Archive* parent = entries[0]->getParent(); // Create texture entries if needed if (!TextureXEditor::setupTextureEntries(parent)) return false; // Find texturex entry to add to Archive::search_options_t opt; opt.match_type = EntryType::getType("texturex"); ArchiveEntry* texturex = parent->findFirst(opt); // Check it exists bool zdtextures = false; if (!texturex) { opt.match_type = EntryType::getType("zdtextures"); texturex = parent->findFirst(opt); if (!texturex) return false; else zdtextures = true; } // Find patch table in parent archive ArchiveEntry* pnames = NULL; if (!zdtextures) { opt.match_type = EntryType::getType("pnames"); pnames = parent->findLast(opt); // Check it exists if (!pnames) return false; } // Check entries aren't locked (texture editor open or iwad) if ((pnames && pnames->isLocked()) || texturex->isLocked()) { if (parent->isReadOnly()) wxMessageBox("Cannot perform this action on an IWAD", "Error", wxICON_ERROR); else wxMessageBox("Cannot perform this action because one or more texture related entries is locked. Please close the archive's texture editor if it is open.", "Error", wxICON_ERROR); return false; } TextureXList tx; PatchTable ptable; if (zdtextures) { // Load TEXTURES tx.readTEXTURESData(texturex); } else { // Load patch table ptable.loadPNAMES(pnames); // Load TEXTUREx tx.readTEXTUREXData(texturex, ptable); } // Create textures from entries SImage image; for (unsigned a = 0; a < entries.size(); a++) { // Check entry type if (!(entries[a]->getType()->extraProps().propertyExists("image"))) { wxLogMessage("Entry %s is not a valid image", entries[a]->getName()); continue; } // Check entry name string name = entries[a]->getName(true); if (name.Length() > 8) { wxLogMessage("Entry %s has too long a name to add to the patch table (name must be 8 characters max)", entries[a]->getName()); continue; } // Add to patch table if (!zdtextures) ptable.addPatch(name); // Load patch to temp image Misc::loadImageFromEntry(&image, entries[a]); // Create texture CTexture* ntex = new CTexture(zdtextures); ntex->setName(name); ntex->addPatch(name, 0, 0); ntex->setWidth(image.getWidth()); ntex->setHeight(image.getHeight()); // Setup texture scale if (tx.getFormat() == TXF_TEXTURES) ntex->setScale(1, 1); else ntex->setScale(0, 0); // Add to texture list tx.addTexture(ntex); } if (zdtextures) { // Write texture data back to textures entry tx.writeTEXTURESData(texturex); } else { // Write patch table data back to pnames entry ptable.writePNAMES(pnames); // Write texture data back to texturex entry tx.writeTEXTUREXData(texturex, ptable); } return true; }
/* EntryOperations::addToPatchTable * Adds all [entries] to their parent archive's patch table, if it * exists. If not, the user is prompted to create or import texturex * entries *******************************************************************/ bool EntryOperations::addToPatchTable(vector<ArchiveEntry*> entries) { // Check any entries were given if (entries.size() == 0) return true; // Get parent archive Archive* parent = entries[0]->getParent(); if (parent == NULL) return true; // Find patch table in parent archive Archive::search_options_t opt; opt.match_type = EntryType::getType("pnames"); ArchiveEntry* pnames = parent->findLast(opt); // Check it exists if (!pnames) { // Create texture entries if (!TextureXEditor::setupTextureEntries(parent)) return false; pnames = parent->findLast(opt); // If the archive already has ZDoom TEXTURES, it might still // not have a PNAMES lump; so create an empty one. if (!pnames) { pnames = new ArchiveEntry("PNAMES.lmp", 4); uint32_t nada = 0; pnames->write(&nada, 4); pnames->seek(0, SEEK_SET); parent->addEntry(pnames); } } // Check it isn't locked (texturex editor open or iwad) if (pnames->isLocked()) { if (parent->isReadOnly()) wxMessageBox("Cannot perform this action on an IWAD", "Error", wxICON_ERROR); else wxMessageBox("Cannot perform this action because one or more texture related entries is locked. Please close the archive's texture editor if it is open.", "Error", wxICON_ERROR); return false; } // Load to patch table PatchTable ptable; ptable.loadPNAMES(pnames); // Add entry names to patch table for (unsigned a = 0; a < entries.size(); a++) { // Check entry type if (!(entries[a]->getType()->extraProps().propertyExists("image"))) { wxLogMessage("Entry %s is not a valid image", entries[a]->getName()); continue; } // Check entry name if (entries[a]->getName(true).Length() > 8) { wxLogMessage("Entry %s has too long a name to add to the patch table (name must be 8 characters max)", entries[a]->getName()); continue; } ptable.addPatch(entries[a]->getName(true)); } // Write patch table data back to pnames entry return ptable.writePNAMES(pnames); }