/* * Copyright (C) 2006 Ronald Lamprecht * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "gui/LPGroupConfig.hh" #include "gui/LevelPackConfig.hh" #include "ecl.hh" #include "errors.hh" #include "nls.hh" #include "video.hh" #include "lev/Index.hh" #include "main.hh" using namespace ecl; using namespace std; namespace enigma { namespace gui { LPGroupConfig::LPGroupConfig(std::string groupName) : oldGroupName (groupName) { const video::VMInfo &vminfo = *video::GetInfo(); groups = lev::Index::getGroupNames(); position = -1; for (int i = 0; i < groups.size(); i++) { if (groups[i] == groupName) { position = i; break; } } oldPosition = position; if (position < 0) { groups.push_back(groupName); position = groups.size() - 1; } VList * titleVList = new VList; titleVList->set_spacing(12); titleVList->set_alignment(HALIGN_LEFT, VALIGN_CENTER); titleVList->set_default_size(160, 35); Label * groupLabel = new Label(N_("Group:"), HALIGN_RIGHT); titleVList->add_back(groupLabel); VList * groupsVList = new VList; groupsVList->set_spacing(12); groupsVList->set_alignment(HALIGN_LEFT, VALIGN_CENTER); groupsVList->set_default_size(160, 35); Label * positionLabel = new Label(N_("Position:"), HALIGN_LEFT); pre2Group = new UntranslatedLabel(""); pre1Group = new UntranslatedLabel(""); tf_groupName = new TextField(groupName); post1Group = new UntranslatedLabel(""); post2Group = new UntranslatedLabel(""); Label * dummyLabel = new Label(""); groupsVList->add_back(positionLabel); groupsVList->add_back(pre2Group); groupsVList->add_back(pre1Group); groupsVList->add_back(tf_groupName); groupsVList->add_back(post1Group); groupsVList->add_back(post2Group); groupsVList->add_back(dummyLabel); VList * scrollVList = new VList; scrollVList->set_spacing(12); scrollVList->set_alignment(HALIGN_LEFT, VALIGN_CENTER); scrollVList->set_default_size(40, 35); scrollUp = new ImageButton("ic-up", "ic-up1", this); scrollDown = new ImageButton("ic-down", "ic-down1", this); scrollVList->add_back(scrollUp); scrollVList->add_back(scrollDown); this->add(titleVList, Rect(vminfo.width/2 - 290, 0, 160, vminfo.height-100)); this->add(groupsVList, Rect(vminfo.width/2 - 80, 0, 160, vminfo.height-100)); this->add(scrollVList, Rect(vminfo.width/2 + 130, 0, 40, vminfo.height-100)); errorLabel = new Label("", HALIGN_CENTER); this->add(errorLabel, Rect(10, vminfo.height-100, vminfo.width-20, 35)); // Create buttons - positioning identical to Levelmenu but_newPack = new StaticTextButton(N_("New Pack"), this); but_delete = new StaticTextButton(N_("Delete Group"), this); but_ignore = new StaticTextButton(N_("Undo"), this); but_ok = new StaticTextButton(N_("Ok"), this); HList * commandHList = new HList; commandHList->set_spacing(10); commandHList->set_alignment(HALIGN_CENTER, VALIGN_TOP); commandHList->set_default_size(140, 35); commandHList->add_back(but_newPack); commandHList->add_back(but_delete); commandHList->add_back(but_ignore); commandHList->add_back(but_ok); this->add(commandHList, Rect(10, vminfo.height-50, vminfo.width-20, 35)); updateGroupList(); } void LPGroupConfig::updateGroupList() { pre2Group->set_text((position > 1) ? groups[position - 2] : ""); pre1Group->set_text((position > 0) ? groups[position - 1] : ""); post1Group->set_text((position < groups.size() - 1) ? groups[position + 1] : ""); post2Group->set_text((position < groups.size() - 2) ? groups[position + 2] : ""); } bool LPGroupConfig::doChanges() { // rename first for consistency std::string newName = tf_groupName->getText(); std::string::size_type lastChar = newName.find_last_not_of(" "); if (lastChar == std::string::npos) { // the name is effectively an empty string errorLabel->set_text(N_("Error: empty group name not allowed - press \"Undo\" to exit without modifications")); return false; } // strip off trailing and leading spaces newName = newName.substr(0 , lastChar + 1); newName = newName.substr(newName.find_first_not_of(" ")); // check if new group name is unique for (int i = 0; i < groups.size(); i++) { if (i != position && groups[i] == newName) { errorLabel->set_text(N_("Error: group name is a duplicate of an existing group")); return false; } } if (newName == INDEX_EVERY_GROUP) { errorLabel->set_text(N_("Error: \"Every group\" is a reserved group name")); return false; } if (newName.size() > 2 && newName[0] == '[' && newName[newName.size() -1] == ']') { errorLabel->set_text(N_("Error: group name must not be enclosed in square brackets")); return false; } if (oldGroupName.empty()) { // menu called without an existing group lev::Index::insertGroup(newName, position); } else { // menu called with an existing group if (newName != oldGroupName) lev::Index::renameGroup(oldGroupName, newName); if (oldPosition >= 0 && position != oldPosition) { // move the group to the new position lev::Index::moveGroup(newName, position); } } return true; } void LPGroupConfig::on_action(Widget *w) { if (w == but_ok) { if (doChanges()) Menu::quit(); else invalidate_all(); } else if (w == but_ignore) { Menu::quit(); } else if (w == scrollUp) { if (position > 0) { std::string tmp = groups[position]; groups[position] = groups[position - 1]; groups[position - 1] = tmp; position--; updateGroupList(); invalidate_all(); } } else if (w == scrollDown) { if (position < groups.size() - 1) { std::string tmp = groups[position]; groups[position] = groups[position + 1]; groups[position + 1] = tmp; position++; updateGroupList(); invalidate_all(); } } else if (w == but_delete) { std::vector * indices = lev::Index::getGroup(oldGroupName); if (indices != NULL) { // reassign remaining indices from back to front to keep the // group vector valid for (int i = indices->size() - 1; i >= 0; i--) { if ((*indices)[i]->getGroupName() != INDEX_EVERY_GROUP) { LevelPackConfig m((*indices)[i]->getName(), oldGroupName, true); if (!m.manage() || m.isUndoQuit()) { errorLabel->set_text(N_("Error: group not empty")); invalidate_all(); return; } } } lev::Index::deleteGroup(oldGroupName); } Menu::quit(); } else if (w == but_newPack) { if (doChanges()) { LevelPackConfig m(""); m.manage(); Menu::quit(); } else { invalidate_all(); } } } void LPGroupConfig::draw_background(ecl::GC &gc) { video::SetCaption(("Enigma - Level Pack Group Configuration")); blit(gc, 0,0, enigma::GetImage("menu_bg", ".jpg")); } }} // namespace enigma::gui