/* WadArchive::addEntry * Adds [entry] to the end of the namespace matching [add_namespace]. * If [copy] is true a copy of the entry is added. Returns the added * entry or NULL if the entry is invalid *******************************************************************/ ArchiveEntry* WadArchive::addEntry(ArchiveEntry* entry, string add_namespace, bool copy) { // Find requested namespace for (unsigned a = 0; a < namespaces.size(); a++) { if (S_CMPNOCASE(namespaces[a].name, add_namespace)) { // Namespace found, add entry before end marker return addEntry(entry, namespaces[a].end_index++, NULL, copy); } } // If the requested namespace is a special namespace and doesn't exist, create it for (int a = 0; a < n_special_namespaces; a++) { if (add_namespace == special_namespaces[a].name) { addNewEntry(special_namespaces[a].letter + "_start"); addNewEntry(special_namespaces[a].letter + "_end"); return addEntry(entry, add_namespace, copy); } } // Unsupported namespace not found, so add to global namespace (ie end of archive) return addEntry(entry, 0xFFFFFFFF, NULL, copy); }
//******************************************************************************** ASSOC_ENTRY* TBlockPageIndexMap::addNewAssoc(int a_dbId, int a_blkId, int a_nIndex, FPOINTER a_fpPage) { ASSOC_ENTRY *pAssoc = addNewEntry(TKeyMaker(a_dbId, a_blkId, a_nIndex)); // add to chain of decreasing page indexes int hashIdx = getBlockHashIndex(a_dbId, a_blkId); ASSOC_ENTRY** ppAssocBlk = &m_hashBlk[hashIdx]; while(true) { ASSOC_ENTRY* pAssocBlk = *ppAssocBlk; if(pAssocBlk == NULL) { pAssoc->pLowerIndex = NULL; *ppAssocBlk = pAssoc; break; } else if(a_dbId == pAssocBlk->dbId && a_blkId == pAssocBlk->blkId && a_nIndex > pAssocBlk->nIndex) { pAssoc->pLowerIndex = pAssocBlk; *ppAssocBlk = pAssoc; break; } ppAssocBlk = &pAssocBlk->pLowerIndex; } // init data pAssoc->fpPage = a_fpPage; return pAssoc; }
/* Archive::importDir * Imports all files (including subdirectories) from [directory] into * the archive *******************************************************************/ bool Archive::importDir(string directory) { // Get a list of all files in the directory wxArrayString files; wxDir::GetAllFiles(directory, &files); // Go through files for (unsigned a = 0; a < files.size(); a++) { string name = files[a]; name.Replace(directory, "", false); // Remove directory from entry name // Split filename into dir+name wxFileName fn(name); string ename = fn.GetFullName(); string edir = fn.GetPath(); // Remove beginning \ or / from dir if (edir.StartsWith("\\") || edir.StartsWith("/")) edir.Remove(0, 1); // Add the entry ArchiveTreeNode* dir = createDir(edir); ArchiveEntry* entry = addNewEntry(ename, dir->numEntries()+1, dir); // Load data entry->importFile(files[a]); // Set unmodified entry->setState(0); dir->getDirEntry()->setState(0); } return true; }
// ----------------------------------------------------------------------------- // Imports all files (including subdirectories) from [directory] into the // archive // ----------------------------------------------------------------------------- bool Archive::importDir(string_view directory) { // Get a list of all files in the directory vector<string> files; for (const auto& item : std::filesystem::recursive_directory_iterator{ directory }) if (item.is_regular_file()) files.push_back(item.path().string()); // Go through files for (const auto& file : files) { StrUtil::Path fn{ StrUtil::replace(file, directory, "") }; // Remove directory from entry name // Split filename into dir+name auto ename = fn.fileName(); auto edir = fn.path(); // Remove beginning \ or / from dir if (StrUtil::startsWith(edir, '\\') || StrUtil::startsWith(edir, '/')) edir.remove_prefix(1); // Add the entry auto dir = createDir(edir); auto entry = addNewEntry(ename, dir->numEntries() + 1, dir); // Load data entry->importFile(file); // Set unmodified entry->setState(ArchiveEntry::State::Unmodified); dir->dirEntry()->setState(ArchiveEntry::State::Unmodified); } return true; }
/* DatArchive::addEntry * Adds [entry] to the end of the namespace matching [add_namespace]. * If [copy] is true a copy of the entry is added. Returns the added * entry or NULL if the entry is invalid *******************************************************************/ ArchiveEntry* DatArchive::addEntry(ArchiveEntry* entry, string add_namespace, bool copy) { // Find requested namespace, only three non-global namespaces are valid in this format if (S_CMPNOCASE(add_namespace, "textures")) { if (walls[1] >= 0) return addEntry(entry, walls[1], NULL, copy); else { addNewEntry("startwalls"); addNewEntry("endwalls"); return addEntry(entry, add_namespace, copy); } } else if (S_CMPNOCASE(add_namespace, "flats")) { if (flats[1] >= 0) return addEntry(entry, flats[1], NULL, copy); else { addNewEntry("startflats"); addNewEntry("endflats"); return addEntry(entry, add_namespace, copy); } } else if (S_CMPNOCASE(add_namespace, "sprites")) { if (sprites[1] >= 0) return addEntry(entry, sprites[1], NULL, copy); else { addNewEntry("startsprites"); addNewEntry("endmonsters"); return addEntry(entry, add_namespace, copy); } } else return addEntry(entry, 0xFFFFFFFF, NULL, copy); }
// ----------------------------------------------------------------------------- // Extract all sub-images as individual PNGs // ----------------------------------------------------------------------------- bool GfxEntryPanel::extractAll() const { if (image()->size() < 2) return false; // Remember where we are int imgindex = image()->index(); auto parent = entry_->parent(); if (parent == nullptr) return false; int index = parent->entryIndex(entry_, entry_->parentDir()); wxString name = wxFileName(entry_->name()).GetName(); // Loop through subimages and get things done int pos = 0; for (int i = 0; i < image()->size(); ++i) { wxString newname = wxString::Format("%s_%i.png", name, i); Misc::loadImageFromEntry(image(), entry_, i); // Only process images that actually contain some pixels if (image()->width() && image()->height()) { auto newimg = parent->addNewEntry(newname.ToStdString(), index + pos + 1, entry_->parentDir()); if (newimg == nullptr) return false; SIFormat::getFormat("png")->saveImage(*image(), newimg->data(), &gfx_canvas_->palette()); EntryType::detectEntryType(newimg); pos++; } } // Reload image of where we were Misc::loadImageFromEntry(image(), entry_, imgindex); return true; }
void XMLStringPool::serialize(XSerializeEngine& serEng) { /*** * Since we are pretty sure that fIdMap and fHashTable is * not shared by any other object, therefore there is no owned/referenced * issue. Thus we can serialize the raw data only, rather than serializing * both fIdMap and fHashTable. * * And we can rebuild the fIdMap and fHashTable out of the raw data during * deserialization. * ***/ if (serEng.isStoring()) { serEng<<fCurId; for (unsigned int index = 1; index < fCurId; index++) { const XMLCh* stringData = getValueForId(index); serEng.writeString(stringData); } } else { unsigned int mapSize; serEng>>mapSize; assert(1 == fCurId); //make sure empty for (unsigned int index = 1; index < mapSize; index++) { XMLCh* stringData; serEng.readString(stringData); addNewEntry(stringData); //we got to deallocate this string //since stringpool will duplicate this string in the PoolElem and own that copy fMemoryManager->deallocate(stringData); } } }
SettingsTabOther::SettingsTabOther(QWidget *parent, QMap<QString, QVariant> set, bool v) : QWidget(parent) { // The global settings globSet = set; verbose = v; this->setObjectName("tabother"); this->setStyleSheet("#tabother { background: transparent; color: white; }"); tabs = new TabWidget; tabs->expand(false); tabs->setBorderTop("rgba(150,150,150,100)",2); tabs->setBorderBot("rgba(150,150,150,100)",2); QVBoxLayout *mainLay = new QVBoxLayout; mainLay->addWidget(tabs); this->setLayout(mainLay); // the main scroll widget for all LOOK content scrollbarOther = new CustomScrollbar; QScrollArea *scrollOther = new QScrollArea; QVBoxLayout *layOther = new QVBoxLayout(scrollOther); QWidget *scrollWidgOther = new QWidget(scrollOther); scrollWidgOther->setLayout(layOther); scrollOther->setWidget(scrollWidgOther); scrollOther->setWidgetResizable(true); scrollOther->setVerticalScrollBar(scrollbarOther); // the main scroll widget for all FEEL content scrollbarFile = new CustomScrollbar; QScrollArea *scrollFile = new QScrollArea; QVBoxLayout *layFile = new QVBoxLayout(scrollFile); QWidget *scrollWidgFile = new QWidget(scrollFile); scrollWidgFile->setLayout(layFile); scrollFile->setWidget(scrollWidgFile); scrollFile->setWidgetResizable(true); scrollFile->setVerticalScrollBar(scrollbarFile); tabOther = new QWidget; tabFile = new QWidget; QVBoxLayout *scrollLayOther = new QVBoxLayout; scrollLayOther->addWidget(scrollOther); tabOther->setLayout(scrollLayOther); QVBoxLayout *scrollLayFile = new QVBoxLayout; scrollLayFile->addWidget(scrollFile); tabFile->setLayout(scrollLayFile); tabs->addTab(tabOther,tr("Other")); tabs->addTab(tabFile,tr("File Types")); // The titles CustomLabel *titleOther = new CustomLabel("<center><h1>" + tr("Other Settings") + "</h1></center>"); layOther->addWidget(titleOther); layOther->addSpacing(20); CustomLabel *titleFile = new CustomLabel("<center><h1>" + tr("Known File Types") + "</h1></center>"); layFile->addWidget(titleFile); layFile->addSpacing(20); // CHOOSE A LANGUAGE CustomLabel *langLabel = new CustomLabel("<b><span style=\"font-size:12pt\">" + tr("Choose Language") + "</span></b><br><br>" + tr("There are a good few different languages available. Thanks to everybody who took the time to translate PhotoQt!")); langLabel->setWordWrap(true); layOther->addWidget(langLabel); layOther->addSpacing(15); // All the languages available. They are sorted according to their language code (except English) // A GOOD FEW OF THE TRANSLATIONS HAVEN'T BEEN UPDATED IN A LONG TIME AND ARE STANDING AT 0-5% // These translations are NOT included! langDesc << "English"; langShort << "en"; // Arabic // langDesc << QString::fromUtf8("العربية (Amar T.)"); // langShort << "ar"; // Czech langDesc << QString::fromUtf8("Čeština (Robin H. & Petr Š.)"); langShort << "cs"; // German langDesc << "Deutsch"; langShort << "de"; // Greek langDesc << QString::fromUtf8("Ελληνικά (Dimitrios G.)"); langShort << "el"; // Spanish langDesc << QString::fromUtf8("Español (Hector C. & Victoria P.)"); langShort << "es_ES"; // Finnish langDesc << QString::fromUtf8("Suomen kieli (Jiri G.)"); langShort << "fi"; // French langDesc << QString::fromUtf8("Français (Olivier D. & Tubuntu)"); langShort << "fr"; // Hungarian // langDesc << QString::fromUtf8("Magyar (Zoltan H.)"); // langShort << "hu"; // Hebrew langDesc << QString::fromUtf8("עברית (GenghisKhan)"); langShort << "he"; // Italian langDesc << "Italiano (Vincenzo C. & Fabio M.)"; langShort << "it"; // Japanese langDesc << QString::fromUtf8("日本語 (Obytetest)"); langShort << "ja"; // Norwegian Bokmal // langDesc << QString::fromUtf8("Bokmål (Ola Haugen H.)"); // langShort << "nb_NO"; // Norwegian Nynorsk // langDesc << "Nynorsk (Ola Haugen H.)"; // langShort << "nn_NO"; // Polish // langDesc << "Polski (Daniel K.)"; // langShort << "pl"; // Portugal (Brazil) langDesc << QString::fromUtf8("Português (Brasil) (Rafael N. & Everton)"); langShort << "pt_BR"; // Portugal (Portugal) langDesc << QString::fromUtf8("Português (Portugal) (Sérgio M. & Manuela S. & Willow)"); langShort << "pt_PT"; // Russian langDesc << QString::fromUtf8("Pусский (Yuriy T.)"); langShort << "ru_RU"; //Slovak langDesc << QString::fromUtf8("Slovenčina (Lukáš D.)"); langShort << "sk"; // Serbian // langDesc << QString::fromUtf8("српски екавски (Mladen Pejaković)"); // langShort << "sr_RS"; // Turkish // langDesc << QString::fromUtf8("Türkçe (Onuralp SEZER)"); // langShort << "tr"; // Ukrainian langDesc << QString::fromUtf8("Українська (neeesdfsdf & zubr139)"); langShort << "uk_UA"; // Viatnemese // langDesc << QString::fromUtf8("Tiếng Việt (Nguyễn Hữu Tài)"); // langShort << "vi"; // Chinese (China) langDesc << "Chinese (Min Zhang)"; langShort << "zh_CN"; langDesc << "Chinese (traditional) (Min Zhang)"; langShort << "zh_TW"; FlowLayout *langLay = new FlowLayout; QButtonGroup *langButGrp = new QButtonGroup; for(int i = 0; i < langDesc.length(); ++i) { SettingsTabOtherLanguageTiles *tile = new SettingsTabOtherLanguageTiles(langDesc.at(i), langShort.at(i)); allLangTiles << tile; langButGrp->addButton(tile->button); langLay->addWidget(tile); } QHBoxLayout *langWidgLay = new QHBoxLayout; langWidgLay->addSpacing(50); langWidgLay->addLayout(langLay); langWidgLay->addSpacing(50); layOther->addLayout(langWidgLay); layOther->addSpacing(30); // Adjust quick settings trigering CustomLabel *quickSetLabel = new CustomLabel("<b><span style=\"font-size:12pt\">" + tr("Quick Settings") + "</span></b><br><br>" + tr("The 'Quick Settings' is a widget hidden on the right side of the screen. When you move the cursor there, it shows up, and you can adjust a few simple settings on the spot without having to go through this settings dialog. Of course, only a small subset of settings is available (the ones needed most often). Here you can disable the dialog so that it doesn't show on mouse movement anymore.")); quickSet = new CustomCheckBox(tr("Show 'Quick Settings' on mouse hovering")); QHBoxLayout *quickSetLay = new QHBoxLayout; quickSetLay->addStretch(); quickSetLay->addWidget(quickSet); quickSetLay->addStretch(); layOther->addWidget(quickSetLabel); layOther->addSpacing(20); layOther->addLayout(quickSetLay); layOther->addSpacing(30); // Adjust context menu CustomLabel *contextMenuLabel = new CustomLabel("<b><span style=\"font-size:12pt\">" + tr("Adjust Context Menu") + "</span></b><br><br>" + tr("Here you can adjust the context menu. You can simply drag and drop the entries, edit them, add a new one and remove an existing one.")); context = new Context; QHBoxLayout *contextLay = new QHBoxLayout; contextLay->addStretch(); contextLay->addWidget(context); contextLay->addStretch(); CustomPushButton *addNew = new CustomPushButton("+ " + tr("Add new Entry"),this); QHBoxLayout *addNewLay = new QHBoxLayout; connect(addNew, SIGNAL(clicked()), context, SLOT(addNewEntry())); addNewLay->addStretch(); addNewLay->addWidget(addNew); addNewLay->addStretch(); layOther->addWidget(contextMenuLabel); layOther->addSpacing(10); layOther->addLayout(contextLay); layOther->addLayout(addNewLay); layOther->addSpacing(20); allCheckQt.clear(); allCheckGm.clear(); allCheckGmUnstable.clear(); // Adjust known file formats CustomLabel *titleQt = new CustomLabel("<b><span style=\"font-size:12pt\">" + tr("File Types - Qt") + "</span></b><br><br>" + tr("These are the standard file types supported by Qt. Depending on your system, this list can vary a little.") + "<br>" + tr("If you want to add a file type not in the list, you can add them in the text box below. You have to enter the formats like '*.ending', all seperated by commas.") + "</b>"); titleQt->setWordWrap(true); FlowLayout *layQt = new FlowLayout; QStringList formatsQt; formatsQt << ".bmp" << ".gif" << ".tif" << ".tiff" << ".jpeg2000" << ".jpeg" << ".jpg" << ".png" << ".pbm" << ".pgm" << ".ppm" << ".xbm" << ".xpm"; formatsQt.sort(); for(int i = 0; i < formatsQt.length(); ++i) { SettingsTabOtherFileTypesTiles *check = new SettingsTabOtherFileTypesTiles(formatsQt.at(i)); check->setToolTip(formatsQt.at(i)); allCheckQt.insert(formatsQt.at(i),check); layQt->addWidget(check); } QHBoxLayout *layQtBut = new QHBoxLayout; CustomLabel *extraQt = new CustomLabel(tr("Extra File Types:")); extraQt->setWordWrap(false); extraQtEdit = new CustomLineEdit; CustomPushButton *qtMarkAll = new CustomPushButton(tr("Mark All")); CustomPushButton *qtMarkNone = new CustomPushButton(tr("Mark None")); layQtBut->addWidget(extraQt); layQtBut->addWidget(extraQtEdit); layQtBut->addStretch(); layQtBut->addWidget(qtMarkAll); layQtBut->addWidget(qtMarkNone); layFile->addWidget(titleQt); layFile->addSpacing(10); layFile->addLayout(layQt); layFile->addSpacing(5); layFile->addLayout(layQtBut); layFile->addSpacing(35); QSignalMapper *mapQtMark = new QSignalMapper; mapQtMark->setMapping(qtMarkAll,"qtMark"); connect(qtMarkAll, SIGNAL(clicked()), mapQtMark, SLOT(map())); connect(mapQtMark, SIGNAL(mapped(QString)), this, SLOT(markAllNone(QString))); QSignalMapper *mapQtNone = new QSignalMapper; mapQtNone->setMapping(qtMarkNone,"qtNone"); connect(qtMarkNone, SIGNAL(clicked()), mapQtNone, SLOT(map())); connect(mapQtNone, SIGNAL(mapped(QString)), this, SLOT(markAllNone(QString))); #ifndef GM CustomLabel *gmDisabled = new CustomLabel("<b><i>" + tr("Use of GraphicsMagick has been disabled as PhotoQt was compiled/installed!") + "</i></b>"); gmDisabled->setWordWrap(true); #endif CustomLabel *titleGmWorking = new CustomLabel("<b><span style=\"font-size:12pt\">" + tr("File Types - GraphicsMagick") + "</span></b><br><br>" + tr("PhotoQt makes use of GraphicsMagick for support of many different file types. Not all of the formats supported by GraphicsMagick make sense in an image viewer. There are some that aren't quite working at the moment, you can find them in the 'Unstable' category below.") + "<br>" + tr("If you want to add a file type not in the list, you can add them in the text box below. You have to enter the formats like '*.ending', all seperated by commas.") + "</b>"); titleGmWorking->setWordWrap(true); FlowLayout *layGm = new FlowLayout; QStringList formatsGm; formatsGm << ".art" << ".avs" << ".x" << ".cals" << ".cgm" << ".cur" << ".cut" << ".acr" << ".dcm" << ".dicom" << ".dic" << ".dcx" << ".dib" << ".dpx" << ".emf" << ".epdf" << ".epi" << ".eps" << ".eps2" << ".eps3" << ".epsf" << ".epsi" << ".ept" << ".fax" << ".fig" << ".fits" << ".fts" << ".fit" << ".fpx" << ".gplt" << ".ico" << ".jbg" << ".jbig" << ".jng" << ".jp2" << ".j2k" << ".jpf" << ".jpx" << ".jpm" << ".mj2" << ".jpc" << ".mat" << ".miff" << ".mng" << ".mpc" << ".mtv" << ".otb" << ".p7" << ".palm" << ".pam" << ".pcd" << ".pcds" << ".pcx" << ".pdb" << ".pdf" << ".picon" << ".pict" << ".pct" << ".pic" << ".pix" << ".pnm" << ".ps" << ".ps2" << ".ps3" << ".psd" << ".ptif" << ".ras" << ".rast" << ".rad" << ".sgi" << ".sun" << ".svg" << ".tga" << ".vicar" << ".viff" << ".wbmp" << ".wbm" << ".xcf" << ".xwd"; formatsGm.sort(); for(int i = 0; i < formatsGm.length(); ++i) { SettingsTabOtherFileTypesTiles *check = new SettingsTabOtherFileTypesTiles(formatsGm.at(i)); allCheckGm.insert(formatsGm.at(i),check); check->setToolTip(formatsGm.at(i)); layGm->addWidget(check); #ifndef GM check->setEnabled(false); #endif } QHBoxLayout *layGmBut = new QHBoxLayout; CustomLabel *extraGm = new CustomLabel(tr("Extra File Types:")); extraGm->setWordWrap(false); extraGmEdit = new CustomLineEdit; CustomPushButton *gmMarkAll = new CustomPushButton(tr("Mark All")); CustomPushButton *gmMarkNone = new CustomPushButton(tr("Mark None")); layGmBut->addWidget(extraGm); layGmBut->addWidget(extraGmEdit); layGmBut->addStretch(); layGmBut->addWidget(gmMarkAll); layGmBut->addWidget(gmMarkNone); #ifndef GM titleGmWorking->setEnabled(false); gmMarkAll->setEnabled(false); gmMarkNone->setEnabled(false); extraGm->setEnabled(false); extraGmEdit->setEnabled(false); layFile->addWidget(gmDisabled); layFile->addSpacing(10); #endif layFile->addWidget(titleGmWorking); layFile->addSpacing(10); layFile->addLayout(layGm); layFile->addSpacing(5); layFile->addLayout(layGmBut); layFile->addSpacing(35); QSignalMapper *mapGmMark = new QSignalMapper; mapGmMark->setMapping(gmMarkAll,"gmMark"); connect(gmMarkAll, SIGNAL(clicked()), mapGmMark, SLOT(map())); connect(mapGmMark, SIGNAL(mapped(QString)), this, SLOT(markAllNone(QString))); QSignalMapper *mapGmNone = new QSignalMapper; mapGmNone->setMapping(gmMarkNone,"gmNone"); connect(gmMarkNone, SIGNAL(clicked()), mapGmNone, SLOT(map())); connect(mapGmNone, SIGNAL(mapped(QString)), this, SLOT(markAllNone(QString))); CustomLabel *titleGmUnstable = new CustomLabel("<b><span style=\"font-size:12pt\">" + tr("File Types - GraphicsMagick (Unstable)") + "</span></b><br><br>" + tr("The following file types are supported by GraphicsMagick, but aren't quite working in PhotoQt just yet. If you want to experiment around a little, feel free to enable some of them. They shouldn't cause PhotoQt to crash, but you might see an error image instead of the actual image.") + "</b>"); titleGmUnstable->setWordWrap(true); FlowLayout *layGmUnstable = new FlowLayout; QStringList formatsGmUnstable; formatsGmUnstable << ".gray" << ".hpgl" << ".mono" << ".msl" << ".mvg" << ".pcl" << ".pfa" << ".pfb" << ".pwp" << ".rgb" << ".rgba" << ".rla" << ".rle" << ".sct" << ".sfw" << ".tim" << ".uil" << ".uyvy" << ".wmf" << ".wpg" << ".yuv"; formatsGmUnstable.sort(); for(int i = 0; i < formatsGmUnstable.length(); ++i) { SettingsTabOtherFileTypesTiles *check = new SettingsTabOtherFileTypesTiles(formatsGmUnstable.at(i)); check->setToolTip(formatsGmUnstable.at(i)); allCheckGmUnstable.insert(formatsGmUnstable.at(i),check); layGmUnstable->addWidget(check); #ifndef GM check->setEnabled(false); #endif } QHBoxLayout *layGmButUnstable = new QHBoxLayout; CustomPushButton *gmMarkAllUnstable = new CustomPushButton(tr("Mark All")); CustomPushButton *gmMarkNoneUnstable = new CustomPushButton(tr("Mark None")); layGmButUnstable->addStretch(); layGmButUnstable->addWidget(gmMarkAllUnstable); layGmButUnstable->addWidget(gmMarkNoneUnstable); layFile->addWidget(titleGmUnstable); layFile->addSpacing(10); layFile->addLayout(layGmUnstable); layFile->addSpacing(5); layFile->addLayout(layGmButUnstable); layFile->addSpacing(35); #ifndef GM titleGmUnstable->setEnabled(false); gmMarkAllUnstable->setEnabled(false); gmMarkNoneUnstable->setEnabled(false); #endif QSignalMapper *mapGmMarkUnst = new QSignalMapper; mapGmMarkUnst->setMapping(gmMarkAllUnstable,"gmunstMark"); connect(gmMarkAllUnstable, SIGNAL(clicked()), mapGmMarkUnst, SLOT(map())); connect(mapGmMarkUnst, SIGNAL(mapped(QString)), this, SLOT(markAllNone(QString))); QSignalMapper *mapGmNoneUnst = new QSignalMapper; mapGmNoneUnst->setMapping(gmMarkNoneUnstable,"gmunstNone"); connect(gmMarkNoneUnstable, SIGNAL(clicked()), mapGmNoneUnst, SLOT(map())); connect(mapGmNoneUnst, SIGNAL(mapped(QString)), this, SLOT(markAllNone(QString))); layOther->addStretch(); layFile->addStretch(); }