mirror of
https://github.com/leozide/leocad
synced 2025-01-30 20:34:56 +01:00
Removed old string class.
This commit is contained in:
parent
e22d127660
commit
70fd2c3ce0
12 changed files with 164 additions and 607 deletions
|
@ -81,7 +81,7 @@ void lcApplication::ExportClipboard(const QByteArray& Clipboard)
|
||||||
SetClipboard(Clipboard);
|
SetClipboard(Clipboard);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcApplication::GetFileList(const char* Path, lcArray<String>& FileList)
|
void lcApplication::GetFileList(const char* Path, lcArray<std::string>& FileList)
|
||||||
{
|
{
|
||||||
QDir Dir(Path);
|
QDir Dir(Path);
|
||||||
Dir.setFilter(QDir::Files | QDir::Hidden | QDir::Readable);
|
Dir.setFilter(QDir::Files | QDir::Hidden | QDir::Readable);
|
||||||
|
@ -93,7 +93,7 @@ void lcApplication::GetFileList(const char* Path, lcArray<String>& FileList)
|
||||||
{
|
{
|
||||||
QString AbsolutePath = Dir.absoluteFilePath(Files[FileIdx]);
|
QString AbsolutePath = Dir.absoluteFilePath(Files[FileIdx]);
|
||||||
|
|
||||||
FileList.Add(AbsolutePath.toLocal8Bit().data());
|
FileList.Add(AbsolutePath.toStdString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
|
|
||||||
class Project;
|
class Project;
|
||||||
class lcPiecesLibrary;
|
class lcPiecesLibrary;
|
||||||
class String;
|
|
||||||
|
|
||||||
enum lcLightingMode
|
enum lcLightingMode
|
||||||
{
|
{
|
||||||
|
@ -48,7 +47,7 @@ public:
|
||||||
|
|
||||||
bool LoadPiecesLibrary(const char* LibPath, const char* LibraryInstallPath, const char* LDrawPath);
|
bool LoadPiecesLibrary(const char* LibPath, const char* LibraryInstallPath, const char* LDrawPath);
|
||||||
|
|
||||||
void GetFileList(const char* Path, lcArray<String>& FileList);
|
void GetFileList(const char* Path, lcArray<std::string>& FileList);
|
||||||
void SetClipboard(const QByteArray& Clipboard);
|
void SetClipboard(const QByteArray& Clipboard);
|
||||||
void ExportClipboard(const QByteArray& Clipboard);
|
void ExportClipboard(const QByteArray& Clipboard);
|
||||||
|
|
||||||
|
|
|
@ -143,10 +143,147 @@ bool lcSaveCategories(QTextStream& Stream, const lcArray<lcLibraryCategory>& Cat
|
||||||
for (int CategoryIdx = 0; CategoryIdx < Categories.GetSize(); CategoryIdx++)
|
for (int CategoryIdx = 0; CategoryIdx < Categories.GetSize(); CategoryIdx++)
|
||||||
{
|
{
|
||||||
const lcLibraryCategory& Category = Categories[CategoryIdx];
|
const lcLibraryCategory& Category = Categories[CategoryIdx];
|
||||||
Stream << Format.arg((const char*)Category.Name, (const char*)Category.Keywords);
|
Stream << Format.arg(Category.Name.c_str(), Category.Keywords.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
Stream.flush();
|
Stream.flush();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool lcMatchCategory(const char* PieceName, const char* Expression)
|
||||||
|
{
|
||||||
|
// Check if we need to split the test expression.
|
||||||
|
const char* p = Expression;
|
||||||
|
|
||||||
|
while (*p)
|
||||||
|
{
|
||||||
|
if (*p == '!')
|
||||||
|
{
|
||||||
|
return !lcMatchCategory(PieceName, p + 1);
|
||||||
|
}
|
||||||
|
else if (*p == '(')
|
||||||
|
{
|
||||||
|
// const char* Start = p;
|
||||||
|
int c = 0;
|
||||||
|
|
||||||
|
// Skip what's inside the parenthesis.
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (*p == '(')
|
||||||
|
c++;
|
||||||
|
else if (*p == ')')
|
||||||
|
c--;
|
||||||
|
else if (*p == 0)
|
||||||
|
return false; // Mismatched parenthesis.
|
||||||
|
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
while (c);
|
||||||
|
|
||||||
|
if (*p == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if ((*p == '|') || (*p == '&'))
|
||||||
|
{
|
||||||
|
std::string LeftStr(Expression, (p - Expression) - 1);
|
||||||
|
std::string RightStr(p + 1);
|
||||||
|
|
||||||
|
if (*p == '|')
|
||||||
|
return lcMatchCategory(PieceName, LeftStr.c_str()) || lcMatchCategory(PieceName, RightStr.c_str());
|
||||||
|
else
|
||||||
|
return lcMatchCategory(PieceName, LeftStr.c_str()) && lcMatchCategory(PieceName, RightStr.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strchr(Expression, '('))
|
||||||
|
{
|
||||||
|
p = Expression;
|
||||||
|
while (*p)
|
||||||
|
{
|
||||||
|
if (*p == '(')
|
||||||
|
{
|
||||||
|
const char* Start = p;
|
||||||
|
int c = 0;
|
||||||
|
|
||||||
|
// Extract what's inside the parenthesis.
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (*p == '(')
|
||||||
|
c++;
|
||||||
|
else if (*p == ')')
|
||||||
|
c--;
|
||||||
|
else if (*p == 0)
|
||||||
|
return false; // Mismatched parenthesis.
|
||||||
|
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
while (c);
|
||||||
|
|
||||||
|
std::string SubExpression(Start + 1, p - Start - 2);
|
||||||
|
return lcMatchCategory(PieceName, SubExpression.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* SearchStart = Expression;
|
||||||
|
while (isspace(*SearchStart))
|
||||||
|
SearchStart++;
|
||||||
|
|
||||||
|
const char* SearchEnd = SearchStart + strlen(SearchStart) - 1;
|
||||||
|
while (SearchEnd >= SearchStart && isspace(*SearchEnd))
|
||||||
|
SearchEnd--;
|
||||||
|
|
||||||
|
// Testing a simple case.
|
||||||
|
std::string Search;
|
||||||
|
if (SearchStart != SearchEnd)
|
||||||
|
Search = std::string(SearchStart, SearchEnd - SearchStart + 1);
|
||||||
|
const char* Word = Search.c_str();
|
||||||
|
|
||||||
|
// Check for modifiers.
|
||||||
|
bool WholeWord = 0;
|
||||||
|
bool Begin = 0;
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
if (Word[0] == '^')
|
||||||
|
WholeWord = true;
|
||||||
|
else if (Word[0] == '%')
|
||||||
|
Begin = true;
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
|
||||||
|
Word++;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* Result = strcasestr(PieceName, Word);
|
||||||
|
|
||||||
|
if (!Result)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (Begin && (Result != PieceName))
|
||||||
|
{
|
||||||
|
if ((Result != PieceName + 1) || ((Result[-1] != '_') && (Result[-1] != '~')))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (WholeWord)
|
||||||
|
{
|
||||||
|
char End = Result[strlen(Word)];
|
||||||
|
|
||||||
|
if ((End != 0) && (End != ' '))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if ((Result != PieceName) && ((Result[-1] == '_') || (Result[-1] == '~')))
|
||||||
|
Result--;
|
||||||
|
|
||||||
|
if ((Result != PieceName) && (Result[-1] != ' '))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
|
@ -1,13 +1,12 @@
|
||||||
#ifndef _LC_CATEGORY_H_
|
#ifndef _LC_CATEGORY_H_
|
||||||
#define _LC_CATEGORY_H_
|
#define _LC_CATEGORY_H_
|
||||||
|
|
||||||
#include "str.h"
|
|
||||||
#include "lc_array.h"
|
#include "lc_array.h"
|
||||||
|
|
||||||
struct lcLibraryCategory
|
struct lcLibraryCategory
|
||||||
{
|
{
|
||||||
String Name;
|
std::string Name;
|
||||||
String Keywords;
|
std::string Keywords;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern lcArray<lcLibraryCategory> gCategories;
|
extern lcArray<lcLibraryCategory> gCategories;
|
||||||
|
@ -22,4 +21,6 @@ bool lcLoadCategories(const QByteArray& Buffer, lcArray<lcLibraryCategory>& Cate
|
||||||
bool lcSaveCategories(const QString& FileName, const lcArray<lcLibraryCategory>& Categories);
|
bool lcSaveCategories(const QString& FileName, const lcArray<lcLibraryCategory>& Categories);
|
||||||
bool lcSaveCategories(QTextStream& Stream, const lcArray<lcLibraryCategory>& Categories);
|
bool lcSaveCategories(QTextStream& Stream, const lcArray<lcLibraryCategory>& Categories);
|
||||||
|
|
||||||
|
bool lcMatchCategory(const char* PieceName, const char* Expression);
|
||||||
|
|
||||||
#endif // _LC_CATEGORY_H_
|
#endif // _LC_CATEGORY_H_
|
||||||
|
|
|
@ -424,7 +424,7 @@ void lcPiecesLibrary::ReadArchiveDescriptions(const QString& OfficialFileName, c
|
||||||
bool lcPiecesLibrary::OpenDirectory(const char* Path)
|
bool lcPiecesLibrary::OpenDirectory(const char* Path)
|
||||||
{
|
{
|
||||||
char FileName[LC_MAXPATH];
|
char FileName[LC_MAXPATH];
|
||||||
lcArray<String> FileList;
|
lcArray<std::string> FileList;
|
||||||
|
|
||||||
strcpy(FileName, Path);
|
strcpy(FileName, Path);
|
||||||
strcat(FileName, "parts.lst");
|
strcat(FileName, "parts.lst");
|
||||||
|
@ -501,7 +501,7 @@ bool lcPiecesLibrary::OpenDirectory(const char* Path)
|
||||||
for (int FileIdx = 0; FileIdx < FileList.GetSize(); FileIdx++)
|
for (int FileIdx = 0; FileIdx < FileList.GetSize(); FileIdx++)
|
||||||
{
|
{
|
||||||
char Name[LC_PIECE_NAME_LEN];
|
char Name[LC_PIECE_NAME_LEN];
|
||||||
const char* Src = (const char*)FileList[FileIdx] + PathLength;
|
const char* Src = (const char*)FileList[FileIdx].c_str() + PathLength;
|
||||||
char* Dst = Name;
|
char* Dst = Name;
|
||||||
|
|
||||||
while (*Src && Dst - Name < (int)sizeof(Name))
|
while (*Src && Dst - Name < (int)sizeof(Name))
|
||||||
|
@ -526,7 +526,7 @@ bool lcPiecesLibrary::OpenDirectory(const char* Path)
|
||||||
*Dst = 0;
|
*Dst = 0;
|
||||||
|
|
||||||
lcDiskFile PieceFile;
|
lcDiskFile PieceFile;
|
||||||
if (!PieceFile.Open(FileList[FileIdx], "rt"))
|
if (!PieceFile.Open(FileList[FileIdx].c_str(), "rt"))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
char Line[1024];
|
char Line[1024];
|
||||||
|
@ -575,7 +575,7 @@ bool lcPiecesLibrary::OpenDirectory(const char* Path)
|
||||||
for (int FileIdx = 0; FileIdx < FileList.GetSize(); FileIdx++)
|
for (int FileIdx = 0; FileIdx < FileList.GetSize(); FileIdx++)
|
||||||
{
|
{
|
||||||
char Name[LC_PIECE_NAME_LEN];
|
char Name[LC_PIECE_NAME_LEN];
|
||||||
const char* Src = (const char*)FileList[FileIdx] + PathLength;
|
const char* Src = (const char*)FileList[FileIdx].c_str() + PathLength;
|
||||||
char* Dst = Name;
|
char* Dst = Name;
|
||||||
|
|
||||||
while (*Src && Dst - Name < (int)sizeof(Name))
|
while (*Src && Dst - Name < (int)sizeof(Name))
|
||||||
|
@ -616,7 +616,7 @@ bool lcPiecesLibrary::OpenDirectory(const char* Path)
|
||||||
for (int FileIdx = 0; FileIdx < FileList.GetSize(); FileIdx++)
|
for (int FileIdx = 0; FileIdx < FileList.GetSize(); FileIdx++)
|
||||||
{
|
{
|
||||||
char Name[LC_MAXPATH];
|
char Name[LC_MAXPATH];
|
||||||
const char* Src = (const char*)FileList[FileIdx] + PathLength;
|
const char* Src = (const char*)FileList[FileIdx].c_str() + PathLength;
|
||||||
char* Dst = Name;
|
char* Dst = Name;
|
||||||
|
|
||||||
while (*Src && Dst - Name < (int)sizeof(Name))
|
while (*Src && Dst - Name < (int)sizeof(Name))
|
||||||
|
@ -2450,31 +2450,27 @@ void lcLibraryMeshData::AddMeshDataNoDuplicateCheck(const lcLibraryMeshData& Dat
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool lcPiecesLibrary::PieceInCategory(PieceInfo* Info, const String& CategoryKeywords) const
|
bool lcPiecesLibrary::PieceInCategory(PieceInfo* Info, const char* CategoryKeywords) const
|
||||||
{
|
{
|
||||||
if (Info->IsTemporary())
|
if (Info->IsTemporary())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
String PieceName;
|
const char* PieceName;
|
||||||
if (Info->m_strDescription[0] == '~' || Info->m_strDescription[0] == '_')
|
if (Info->m_strDescription[0] == '~' || Info->m_strDescription[0] == '_')
|
||||||
PieceName = Info->m_strDescription + 1;
|
PieceName = Info->m_strDescription + 1;
|
||||||
else
|
else
|
||||||
PieceName = Info->m_strDescription;
|
PieceName = Info->m_strDescription;
|
||||||
PieceName.MakeLower();
|
|
||||||
|
|
||||||
String Keywords = CategoryKeywords;
|
return lcMatchCategory(PieceName, CategoryKeywords);
|
||||||
Keywords.MakeLower();
|
|
||||||
|
|
||||||
return PieceName.Match(Keywords);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcPiecesLibrary::GetCategoryEntries(int CategoryIndex, bool GroupPieces, lcArray<PieceInfo*>& SinglePieces, lcArray<PieceInfo*>& GroupedPieces)
|
void lcPiecesLibrary::GetCategoryEntries(int CategoryIndex, bool GroupPieces, lcArray<PieceInfo*>& SinglePieces, lcArray<PieceInfo*>& GroupedPieces)
|
||||||
{
|
{
|
||||||
if (CategoryIndex >= 0 && CategoryIndex < gCategories.GetSize())
|
if (CategoryIndex >= 0 && CategoryIndex < gCategories.GetSize())
|
||||||
GetCategoryEntries(gCategories[CategoryIndex].Keywords, GroupPieces, SinglePieces, GroupedPieces);
|
GetCategoryEntries(gCategories[CategoryIndex].Keywords.c_str(), GroupPieces, SinglePieces, GroupedPieces);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcPiecesLibrary::GetCategoryEntries(const String& CategoryKeywords, bool GroupPieces, lcArray<PieceInfo*>& SinglePieces, lcArray<PieceInfo*>& GroupedPieces)
|
void lcPiecesLibrary::GetCategoryEntries(const char* CategoryKeywords, bool GroupPieces, lcArray<PieceInfo*>& SinglePieces, lcArray<PieceInfo*>& GroupedPieces)
|
||||||
{
|
{
|
||||||
SinglePieces.RemoveAll();
|
SinglePieces.RemoveAll();
|
||||||
GroupedPieces.RemoveAll();
|
GroupedPieces.RemoveAll();
|
||||||
|
@ -2534,36 +2530,6 @@ void lcPiecesLibrary::GetCategoryEntries(const String& CategoryKeywords, bool Gr
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcPiecesLibrary::SearchPieces(const char* Keyword, lcArray<PieceInfo*>& Pieces) const
|
|
||||||
{
|
|
||||||
Pieces.RemoveAll();
|
|
||||||
|
|
||||||
String LowerKeyword = Keyword;
|
|
||||||
LowerKeyword.MakeLower();
|
|
||||||
|
|
||||||
for (int PieceIdx = 0; PieceIdx < mPieces.GetSize(); PieceIdx++)
|
|
||||||
{
|
|
||||||
PieceInfo* Info = mPieces[PieceIdx];
|
|
||||||
|
|
||||||
char LowerName[sizeof(Info->m_strName)];
|
|
||||||
strcpy(LowerName, Info->m_strName);
|
|
||||||
strlwr(LowerName);
|
|
||||||
|
|
||||||
if (strstr(LowerName, LowerKeyword))
|
|
||||||
{
|
|
||||||
Pieces.Add(Info);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
char LowerDescription[sizeof(Info->m_strDescription)];
|
|
||||||
strcpy(LowerDescription, Info->m_strDescription);
|
|
||||||
strlwr(LowerDescription);
|
|
||||||
|
|
||||||
if (strstr(LowerDescription, LowerKeyword))
|
|
||||||
Pieces.Add(Info);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void lcPiecesLibrary::GetPatternedPieces(PieceInfo* Parent, lcArray<PieceInfo*>& Pieces) const
|
void lcPiecesLibrary::GetPatternedPieces(PieceInfo* Parent, lcArray<PieceInfo*>& Pieces) const
|
||||||
{
|
{
|
||||||
char Name[LC_PIECE_NAME_LEN];
|
char Name[LC_PIECE_NAME_LEN];
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
#include "lc_mesh.h"
|
#include "lc_mesh.h"
|
||||||
#include "lc_math.h"
|
#include "lc_math.h"
|
||||||
#include "lc_array.h"
|
#include "lc_array.h"
|
||||||
#include "str.h"
|
|
||||||
|
|
||||||
class PieceInfo;
|
class PieceInfo;
|
||||||
class lcZipFile;
|
class lcZipFile;
|
||||||
|
@ -147,10 +146,9 @@ public:
|
||||||
lcTexture* FindTexture(const char* TextureName);
|
lcTexture* FindTexture(const char* TextureName);
|
||||||
bool LoadTexture(lcTexture* Texture);
|
bool LoadTexture(lcTexture* Texture);
|
||||||
|
|
||||||
bool PieceInCategory(PieceInfo* Info, const String& CategoryKeywords) const;
|
bool PieceInCategory(PieceInfo* Info, const char* CategoryKeywords) const;
|
||||||
void SearchPieces(const char* Keyword, lcArray<PieceInfo*>& Pieces) const;
|
|
||||||
void GetCategoryEntries(int CategoryIndex, bool GroupPieces, lcArray<PieceInfo*>& SinglePieces, lcArray<PieceInfo*>& GroupedPieces);
|
void GetCategoryEntries(int CategoryIndex, bool GroupPieces, lcArray<PieceInfo*>& SinglePieces, lcArray<PieceInfo*>& GroupedPieces);
|
||||||
void GetCategoryEntries(const String& CategoryKeywords, bool GroupPieces, lcArray<PieceInfo*>& SinglePieces, lcArray<PieceInfo*>& GroupedPieces);
|
void GetCategoryEntries(const char* CategoryKeywords, bool GroupPieces, lcArray<PieceInfo*>& SinglePieces, lcArray<PieceInfo*>& GroupedPieces);
|
||||||
void GetPatternedPieces(PieceInfo* Parent, lcArray<PieceInfo*>& Pieces) const;
|
void GetPatternedPieces(PieceInfo* Parent, lcArray<PieceInfo*>& Pieces) const;
|
||||||
void GetParts(lcArray<PieceInfo*>& Parts);
|
void GetParts(lcArray<PieceInfo*>& Parts);
|
||||||
|
|
||||||
|
|
|
@ -721,7 +721,7 @@ void lcPartSelectionWidget::UpdateCategories()
|
||||||
mCurrentModelCategoryItem = new QTreeWidgetItem(mCategoriesWidget, QStringList(tr("Parts In Use")));
|
mCurrentModelCategoryItem = new QTreeWidgetItem(mCategoriesWidget, QStringList(tr("Parts In Use")));
|
||||||
|
|
||||||
for (int CategoryIdx = 0; CategoryIdx < gCategories.GetSize(); CategoryIdx++)
|
for (int CategoryIdx = 0; CategoryIdx < gCategories.GetSize(); CategoryIdx++)
|
||||||
new QTreeWidgetItem(mCategoriesWidget, QStringList((const char*)gCategories[CategoryIdx].Name));
|
new QTreeWidgetItem(mCategoriesWidget, QStringList(QString::fromStdString(gCategories[CategoryIdx].Name)));
|
||||||
|
|
||||||
mModelsCategoryItem = new QTreeWidgetItem(mCategoriesWidget, QStringList(tr("Models")));
|
mModelsCategoryItem = new QTreeWidgetItem(mCategoriesWidget, QStringList(tr("Models")));
|
||||||
|
|
||||||
|
|
384
common/str.cpp
384
common/str.cpp
|
@ -1,384 +0,0 @@
|
||||||
//
|
|
||||||
// General purpose string class
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "lc_global.h"
|
|
||||||
#include <ctype.h>
|
|
||||||
#include "str.h"
|
|
||||||
|
|
||||||
static String aux;
|
|
||||||
|
|
||||||
// =============================================================================
|
|
||||||
// Construction / Destruction
|
|
||||||
|
|
||||||
String::String ()
|
|
||||||
{
|
|
||||||
m_pData = new char[1];
|
|
||||||
m_pData[0] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
String::~String ()
|
|
||||||
{
|
|
||||||
delete []m_pData;
|
|
||||||
}
|
|
||||||
|
|
||||||
// =============================================================================
|
|
||||||
// Operators
|
|
||||||
|
|
||||||
const String& String::operator= (const String& src)
|
|
||||||
{
|
|
||||||
delete []m_pData;
|
|
||||||
m_pData = new char[src.GetLength () + 1];
|
|
||||||
strcpy (m_pData, src.m_pData);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
const String& String::operator= (char ch)
|
|
||||||
{
|
|
||||||
delete []m_pData;
|
|
||||||
m_pData = new char[2];
|
|
||||||
m_pData[0] = ch;
|
|
||||||
m_pData[1] = '\0';
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
const String& String::operator= (const char *src)
|
|
||||||
{
|
|
||||||
delete []m_pData;
|
|
||||||
m_pData = new char[strlen (src) + 1];
|
|
||||||
strcpy (m_pData, src);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
const String& String::operator+= (const String& src)
|
|
||||||
{
|
|
||||||
char *tmp = new char[GetLength () + src.GetLength () + 1];
|
|
||||||
strcpy (tmp, m_pData);
|
|
||||||
strcat (tmp, src.m_pData);
|
|
||||||
delete []m_pData;
|
|
||||||
m_pData = tmp;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
const String& String::operator+= (char ch)
|
|
||||||
{
|
|
||||||
size_t len = GetLength ();
|
|
||||||
char *tmp = new char[len + 1 + 1];
|
|
||||||
strcpy (tmp, m_pData);
|
|
||||||
tmp[len] = ch;
|
|
||||||
tmp[len+1] = '\0';
|
|
||||||
delete []m_pData;
|
|
||||||
m_pData = tmp;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
const String& String::operator+= (const char *src)
|
|
||||||
{
|
|
||||||
char *tmp = new char[GetLength () + strlen (src) + 1];
|
|
||||||
strcpy (tmp, m_pData);
|
|
||||||
strcat (tmp, src);
|
|
||||||
delete []m_pData;
|
|
||||||
m_pData = tmp;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// =============================================================================
|
|
||||||
// Non-member operators
|
|
||||||
|
|
||||||
String& operator+ (const String& string1, const String& string2)
|
|
||||||
{
|
|
||||||
String s;
|
|
||||||
s = string1;
|
|
||||||
s += string2;
|
|
||||||
aux = s;
|
|
||||||
return aux;
|
|
||||||
}
|
|
||||||
|
|
||||||
String& operator+ (const String& string, char ch)
|
|
||||||
{
|
|
||||||
String s;
|
|
||||||
s = string;
|
|
||||||
s += ch;
|
|
||||||
aux = s;
|
|
||||||
return aux;
|
|
||||||
}
|
|
||||||
|
|
||||||
String& operator+ (char ch, const String& string)
|
|
||||||
{
|
|
||||||
String s;
|
|
||||||
s = ch;
|
|
||||||
s += string;
|
|
||||||
aux = s;
|
|
||||||
return aux;
|
|
||||||
}
|
|
||||||
|
|
||||||
String& operator+ (const String& string1, const char *string2)
|
|
||||||
{
|
|
||||||
String s;
|
|
||||||
s = string1;
|
|
||||||
s += string2;
|
|
||||||
aux = s;
|
|
||||||
return aux;
|
|
||||||
}
|
|
||||||
|
|
||||||
String& operator+ (const char *string1, const String& string2)
|
|
||||||
{
|
|
||||||
String s;
|
|
||||||
s = string1;
|
|
||||||
s += string2;
|
|
||||||
aux = s;
|
|
||||||
return aux;
|
|
||||||
}
|
|
||||||
|
|
||||||
// =============================================================================
|
|
||||||
// Sub-string extraction
|
|
||||||
|
|
||||||
String& String::Mid (int first, int count) const
|
|
||||||
{
|
|
||||||
if (count < 0)
|
|
||||||
count = 0;
|
|
||||||
else if (count > (int)GetLength ())
|
|
||||||
count = (int)GetLength ();
|
|
||||||
|
|
||||||
String s;
|
|
||||||
strncpy (s.GetBuffer (count+1), m_pData + first, count);
|
|
||||||
s.m_pData[count] = '\0';
|
|
||||||
aux = s;
|
|
||||||
|
|
||||||
return aux;
|
|
||||||
}
|
|
||||||
|
|
||||||
String& String::Left (int count) const
|
|
||||||
{
|
|
||||||
if (count < 0)
|
|
||||||
count = 0;
|
|
||||||
else if (count > (int)GetLength ())
|
|
||||||
count = (int)GetLength ();
|
|
||||||
|
|
||||||
String s;
|
|
||||||
strncpy (s.GetBuffer (count+1), m_pData, count);
|
|
||||||
s.m_pData[count] = '\0';
|
|
||||||
aux = s;
|
|
||||||
|
|
||||||
return aux;
|
|
||||||
}
|
|
||||||
|
|
||||||
String& String::Right (int count) const
|
|
||||||
{
|
|
||||||
if (count < 0)
|
|
||||||
count = 0;
|
|
||||||
else if (count > (int)GetLength ())
|
|
||||||
count = (int)GetLength ();
|
|
||||||
|
|
||||||
String s;
|
|
||||||
strncpy (s.GetBuffer (count+1), m_pData + GetLength () - count, count);
|
|
||||||
s.m_pData[count] = '\0';
|
|
||||||
aux = s;
|
|
||||||
|
|
||||||
return aux;
|
|
||||||
}
|
|
||||||
|
|
||||||
// =============================================================================
|
|
||||||
// Other functions
|
|
||||||
|
|
||||||
// Evaluates the contents of the string against a boolean expression.
|
|
||||||
// For example: (^Car | %Animal) & !Parrot
|
|
||||||
// Will return true for any strings that have the Car word or
|
|
||||||
// begin with Animal and do not have the word Parrot.
|
|
||||||
bool String::Match(const String& Expression) const
|
|
||||||
{
|
|
||||||
// Check if we need to split the test expression.
|
|
||||||
const char* p = Expression;
|
|
||||||
|
|
||||||
while (*p)
|
|
||||||
{
|
|
||||||
if (*p == '!')
|
|
||||||
{
|
|
||||||
return !Match(String(p + 1));
|
|
||||||
}
|
|
||||||
else if (*p == '(')
|
|
||||||
{
|
|
||||||
// const char* Start = p;
|
|
||||||
int c = 0;
|
|
||||||
|
|
||||||
// Skip what's inside the parenthesis.
|
|
||||||
do
|
|
||||||
{
|
|
||||||
if (*p == '(')
|
|
||||||
c++;
|
|
||||||
else if (*p == ')')
|
|
||||||
c--;
|
|
||||||
else if (*p == 0)
|
|
||||||
return false; // Mismatched parenthesis.
|
|
||||||
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
while (c);
|
|
||||||
|
|
||||||
if (*p == 0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if ((*p == '|') || (*p == '&'))
|
|
||||||
{
|
|
||||||
String LeftStr, RightStr;
|
|
||||||
|
|
||||||
LeftStr = Expression.Left((p - Expression) - 1);
|
|
||||||
RightStr = Expression.Right((int)Expression.GetLength() - (p - Expression) - 1);
|
|
||||||
|
|
||||||
if (*p == '|')
|
|
||||||
return Match(LeftStr) || Match(RightStr);
|
|
||||||
else
|
|
||||||
return Match(LeftStr) && Match(RightStr);
|
|
||||||
}
|
|
||||||
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Expression.Find('(') != -1)
|
|
||||||
{
|
|
||||||
p = Expression;
|
|
||||||
while (*p)
|
|
||||||
{
|
|
||||||
if (*p == '(')
|
|
||||||
{
|
|
||||||
const char* Start = p;
|
|
||||||
int c = 0;
|
|
||||||
|
|
||||||
// Extract what's inside the parenthesis.
|
|
||||||
do
|
|
||||||
{
|
|
||||||
if (*p == '(')
|
|
||||||
c++;
|
|
||||||
else if (*p == ')')
|
|
||||||
c--;
|
|
||||||
else if (*p == 0)
|
|
||||||
return false; // Mismatched parenthesis.
|
|
||||||
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
while (c);
|
|
||||||
|
|
||||||
String Expr = Expression.Mid(Start - Expression + 1, p - Start - 2);
|
|
||||||
return Match(Expr);
|
|
||||||
}
|
|
||||||
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Testing a simple case.
|
|
||||||
String Search = Expression;
|
|
||||||
Search.TrimRight();
|
|
||||||
Search.TrimLeft();
|
|
||||||
|
|
||||||
const char* Word = Search;
|
|
||||||
|
|
||||||
// Check for modifiers.
|
|
||||||
bool WholeWord = 0;
|
|
||||||
bool Begin = 0;
|
|
||||||
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
if (Word[0] == '^')
|
|
||||||
WholeWord = true;
|
|
||||||
else if (Word[0] == '%')
|
|
||||||
Begin = true;
|
|
||||||
else
|
|
||||||
break;
|
|
||||||
|
|
||||||
Word++;
|
|
||||||
}
|
|
||||||
|
|
||||||
int Result = Find(Word);
|
|
||||||
|
|
||||||
if (Result == -1)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (Begin && (Result != 0))
|
|
||||||
{
|
|
||||||
if ((Result != 1) || ((GetAt(Result-1) != '_') && (GetAt(Result-1) != '~')))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (WholeWord)
|
|
||||||
{
|
|
||||||
char End = GetAt(Result + (int)strlen(Word));
|
|
||||||
|
|
||||||
if ((End != 0) && (End != ' '))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if ((Result != 0) && ((GetAt(Result-1) == '_') || (GetAt(Result-1) == '~')))
|
|
||||||
Result--;
|
|
||||||
|
|
||||||
if ((Result != 0) && (GetAt(Result-1) != ' '))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
int String::CompareNoCase (const char *string) const
|
|
||||||
{
|
|
||||||
char c1, c2, *ch = m_pData;
|
|
||||||
while (*ch && *string)
|
|
||||||
{
|
|
||||||
c1 = tolower (*ch);
|
|
||||||
c2 = tolower (*string);
|
|
||||||
if (c1 != c2)
|
|
||||||
return (c1 - c2);
|
|
||||||
ch++; string++;
|
|
||||||
}
|
|
||||||
return (((int)*ch) - ((int)*string));
|
|
||||||
}
|
|
||||||
|
|
||||||
int String::CompareNoCase(const char *string, int count) const
|
|
||||||
{
|
|
||||||
char c1, c2, *ch = m_pData;
|
|
||||||
|
|
||||||
while (*ch && *string)
|
|
||||||
{
|
|
||||||
c1 = tolower (*ch);
|
|
||||||
c2 = tolower (*string);
|
|
||||||
|
|
||||||
if (c1 != c2)
|
|
||||||
return (c1 - c2);
|
|
||||||
|
|
||||||
ch++;
|
|
||||||
string++;
|
|
||||||
count--;
|
|
||||||
|
|
||||||
if (!count)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (((int)*ch) - ((int)*string));
|
|
||||||
}
|
|
||||||
|
|
||||||
void String::MakeUpper ()
|
|
||||||
{
|
|
||||||
for (char *cp = m_pData; *cp; ++cp)
|
|
||||||
if ('a' <= *cp && *cp <= 'z')
|
|
||||||
*cp += 'A' - 'a';
|
|
||||||
}
|
|
||||||
|
|
||||||
void String::MakeLower ()
|
|
||||||
{
|
|
||||||
for (char *cp = m_pData; *cp; ++cp)
|
|
||||||
if ('A' <= *cp && *cp <= 'Z')
|
|
||||||
*cp += 'a' - 'A';
|
|
||||||
}
|
|
||||||
|
|
||||||
void String::TrimRight ()
|
|
||||||
{
|
|
||||||
for (char *s = m_pData + strlen (m_pData) - 1; s >= m_pData && isspace (*s); s--)
|
|
||||||
*s = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
void String::TrimLeft ()
|
|
||||||
{
|
|
||||||
char *ch;
|
|
||||||
ch = m_pData;
|
|
||||||
while (isspace (*ch))
|
|
||||||
ch++;
|
|
||||||
memmove (m_pData, ch, strlen (ch)+1);
|
|
||||||
}
|
|
158
common/str.h
158
common/str.h
|
@ -1,158 +0,0 @@
|
||||||
#ifndef _STR_H_
|
|
||||||
#define _STR_H_
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
class String
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
String();
|
|
||||||
String(const String& src)
|
|
||||||
{ m_pData = NULL; *this = src; }
|
|
||||||
String(const char* str)
|
|
||||||
{ m_pData = NULL; *this = str; }
|
|
||||||
~String();
|
|
||||||
|
|
||||||
size_t GetLength() const
|
|
||||||
{ return strlen(m_pData); }
|
|
||||||
bool IsEmpty() const
|
|
||||||
{ return m_pData[0] == '\0'; }
|
|
||||||
void Empty()
|
|
||||||
{ m_pData[0] = '\0'; }
|
|
||||||
|
|
||||||
char GetAt(int index) const
|
|
||||||
{ return m_pData[index]; }
|
|
||||||
char& operator[](int index) const
|
|
||||||
{ return m_pData[index]; }
|
|
||||||
void SetAt(int index, char ch)
|
|
||||||
{ m_pData[index] = ch; }
|
|
||||||
operator char*() const
|
|
||||||
{ return m_pData; }
|
|
||||||
operator const char*() const
|
|
||||||
{ return m_pData; }
|
|
||||||
|
|
||||||
// Operators
|
|
||||||
const String& operator=(const String& src);
|
|
||||||
const String& operator=(char ch);
|
|
||||||
const String& operator=(const char *src);
|
|
||||||
const String& operator+=(const String& string);
|
|
||||||
const String& operator+=(char ch);
|
|
||||||
const String& operator+=(const char *src);
|
|
||||||
|
|
||||||
// Comparison
|
|
||||||
int Compare(const char *string) const
|
|
||||||
{ return strcmp(m_pData, string); }
|
|
||||||
int CompareNoCase(const char *string) const;
|
|
||||||
int CompareNoCase(const char *string, int count) const;
|
|
||||||
bool Match(const String& Expression) const;
|
|
||||||
|
|
||||||
// simple sub-string extraction
|
|
||||||
String& Mid(int first, int count) const;
|
|
||||||
String& Left(int count) const;
|
|
||||||
String& Right(int count) const;
|
|
||||||
|
|
||||||
// upper/lower/reverse conversion
|
|
||||||
void MakeUpper();
|
|
||||||
void MakeLower();
|
|
||||||
|
|
||||||
// trimming whitespace (either side)
|
|
||||||
void TrimRight();
|
|
||||||
void TrimLeft();
|
|
||||||
|
|
||||||
// searching (return starting index, or -1 if not found)
|
|
||||||
// look for a single character match
|
|
||||||
int Find(char ch) const
|
|
||||||
{
|
|
||||||
char *pf = strchr(m_pData, ch);
|
|
||||||
return (pf) ? (pf - m_pData) : -1;
|
|
||||||
}
|
|
||||||
int ReverseFind(char ch) const
|
|
||||||
{
|
|
||||||
char *pf = strrchr(m_pData, ch);
|
|
||||||
return (pf) ? (pf - m_pData) : -1;
|
|
||||||
}
|
|
||||||
int FindOneOf(const char *set) const
|
|
||||||
{
|
|
||||||
char *pf = strpbrk(m_pData, set);
|
|
||||||
return (pf) ? (pf - m_pData) : -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// look for a specific sub-string
|
|
||||||
int Find(const char *str) const
|
|
||||||
{
|
|
||||||
char *pf = strstr(m_pData, str);
|
|
||||||
return (pf) ? (pf - m_pData) : -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
char* Buffer()
|
|
||||||
{
|
|
||||||
return m_pData;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char* Buffer() const
|
|
||||||
{
|
|
||||||
return m_pData;
|
|
||||||
}
|
|
||||||
|
|
||||||
char* GetBuffer(int len)
|
|
||||||
{
|
|
||||||
if (len > (int)strlen(m_pData))
|
|
||||||
{
|
|
||||||
char *tmp = new char[len+1];
|
|
||||||
strcpy(tmp, m_pData);
|
|
||||||
delete []m_pData;
|
|
||||||
m_pData = tmp;
|
|
||||||
}
|
|
||||||
return m_pData;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
char* m_pData;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Concatenation operators
|
|
||||||
String& operator+(const String& string1, const String& string2);
|
|
||||||
String& operator+(const String& string, char ch);
|
|
||||||
String& operator+(char ch, const String& string);
|
|
||||||
String& operator+(const String& string1, const char *string2);
|
|
||||||
String& operator+(const char *string1, const String& string2);
|
|
||||||
|
|
||||||
// Comparison operators
|
|
||||||
inline bool operator==(const String& s1, const String& s2)
|
|
||||||
{ return s1.Compare(s2) == 0; }
|
|
||||||
inline bool operator==(const String& s1, const char *s2)
|
|
||||||
{ return s1.Compare(s2) == 0; }
|
|
||||||
inline bool operator==(const char *s1, const String& s2)
|
|
||||||
{ return s2.Compare(s1) == 0; }
|
|
||||||
inline bool operator!=(const String& s1, const String& s2)
|
|
||||||
{ return s1.Compare(s2) != 0; }
|
|
||||||
inline bool operator!=(const String& s1, const char *s2)
|
|
||||||
{ return s1.Compare(s2) != 0; }
|
|
||||||
inline bool operator!=(const char *s1, const String& s2)
|
|
||||||
{ return s2.Compare(s1) != 0; }
|
|
||||||
inline bool operator<(const String& s1, const String& s2)
|
|
||||||
{ return s1.Compare(s2) < 0; }
|
|
||||||
inline bool operator<(const String& s1, const char *s2)
|
|
||||||
{ return s1.Compare(s2) < 0; }
|
|
||||||
inline bool operator<(const char *s1, const String& s2)
|
|
||||||
{ return s2.Compare(s1) > 0; }
|
|
||||||
inline bool operator>(const String& s1, const String& s2)
|
|
||||||
{ return s1.Compare(s2) > 0; }
|
|
||||||
inline bool operator>(const String& s1, const char *s2)
|
|
||||||
{ return s1.Compare(s2) > 0; }
|
|
||||||
inline bool operator>(const char *s1, const String& s2)
|
|
||||||
{ return s2.Compare(s1) < 0; }
|
|
||||||
inline bool operator<=(const String& s1, const String& s2)
|
|
||||||
{ return s1.Compare(s2) <= 0; }
|
|
||||||
inline bool operator<=(const String& s1, const char *s2)
|
|
||||||
{ return s1.Compare(s2) <= 0; }
|
|
||||||
inline bool operator<=(const char *s1, const String& s2)
|
|
||||||
{ return s2.Compare(s1) >= 0; }
|
|
||||||
inline bool operator>=(const String& s1, const String& s2)
|
|
||||||
{ return s1.Compare(s2) >= 0; }
|
|
||||||
inline bool operator>=(const String& s1, const char *s2)
|
|
||||||
{ return s1.Compare(s2) >= 0; }
|
|
||||||
inline bool operator>=(const char *s1, const String& s2)
|
|
||||||
{ return s2.Compare(s1) <= 0; }
|
|
||||||
|
|
||||||
#endif // _STR_H_
|
|
|
@ -126,7 +126,6 @@ macx {
|
||||||
SOURCES += common/view.cpp \
|
SOURCES += common/view.cpp \
|
||||||
common/tr.cpp \
|
common/tr.cpp \
|
||||||
common/texfont.cpp \
|
common/texfont.cpp \
|
||||||
common/str.cpp \
|
|
||||||
common/project.cpp \
|
common/project.cpp \
|
||||||
common/pieceinf.cpp \
|
common/pieceinf.cpp \
|
||||||
common/piece.cpp \
|
common/piece.cpp \
|
||||||
|
@ -182,7 +181,6 @@ HEADERS += \
|
||||||
common/tr.h \
|
common/tr.h \
|
||||||
common/texfont.h \
|
common/texfont.h \
|
||||||
common/system.h \
|
common/system.h \
|
||||||
common/str.h \
|
|
||||||
common/project.h \
|
common/project.h \
|
||||||
common/pieceinf.h \
|
common/pieceinf.h \
|
||||||
common/piece.h \
|
common/piece.h \
|
||||||
|
|
|
@ -16,8 +16,8 @@ lcQCategoryDialog::lcQCategoryDialog(QWidget *parent, void *data) :
|
||||||
else
|
else
|
||||||
setWindowTitle(tr("New Category"));
|
setWindowTitle(tr("New Category"));
|
||||||
|
|
||||||
ui->name->setText((const char*)options->Name);
|
ui->name->setText(QString::fromStdString(options->Name));
|
||||||
ui->keywords->setText((const char*)options->Keywords);
|
ui->keywords->setText(QString::fromStdString(options->Keywords));
|
||||||
}
|
}
|
||||||
|
|
||||||
lcQCategoryDialog::~lcQCategoryDialog()
|
lcQCategoryDialog::~lcQCategoryDialog()
|
||||||
|
|
|
@ -210,7 +210,7 @@ void lcQPreferencesDialog::updateCategories()
|
||||||
|
|
||||||
for (int categoryIndex = 0; categoryIndex < options->Categories.GetSize(); categoryIndex++)
|
for (int categoryIndex = 0; categoryIndex < options->Categories.GetSize(); categoryIndex++)
|
||||||
{
|
{
|
||||||
categoryItem = new QTreeWidgetItem(tree, QStringList((const char*)options->Categories[categoryIndex].Name));
|
categoryItem = new QTreeWidgetItem(tree, QStringList(QString::fromStdString(options->Categories[categoryIndex].Name)));
|
||||||
categoryItem->setData(0, CategoryRole, QVariant(categoryIndex));
|
categoryItem->setData(0, CategoryRole, QVariant(categoryIndex));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -237,7 +237,7 @@ void lcQPreferencesDialog::updateParts()
|
||||||
{
|
{
|
||||||
lcArray<PieceInfo*> singleParts, groupedParts;
|
lcArray<PieceInfo*> singleParts, groupedParts;
|
||||||
|
|
||||||
library->GetCategoryEntries(options->Categories[categoryIndex].Keywords, false, singleParts, groupedParts);
|
library->GetCategoryEntries(options->Categories[categoryIndex].Keywords.c_str(), false, singleParts, groupedParts);
|
||||||
|
|
||||||
for (int partIndex = 0; partIndex < singleParts.GetSize(); partIndex++)
|
for (int partIndex = 0; partIndex < singleParts.GetSize(); partIndex++)
|
||||||
{
|
{
|
||||||
|
@ -257,7 +257,7 @@ void lcQPreferencesDialog::updateParts()
|
||||||
|
|
||||||
for (categoryIndex = 0; categoryIndex < options->Categories.GetSize(); categoryIndex++)
|
for (categoryIndex = 0; categoryIndex < options->Categories.GetSize(); categoryIndex++)
|
||||||
{
|
{
|
||||||
if (library->PieceInCategory(info, options->Categories[categoryIndex].Keywords))
|
if (library->PieceInCategory(info, options->Categories[categoryIndex].Keywords.c_str()))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -328,7 +328,7 @@ void lcQPreferencesDialog::on_deleteCategory_clicked()
|
||||||
if (categoryIndex == -1)
|
if (categoryIndex == -1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
QString question = tr("Are you sure you want to delete the category '%1'?").arg((const char*)options->Categories[categoryIndex].Name);
|
QString question = tr("Are you sure you want to delete the category '%1'?").arg(QString::fromStdString(options->Categories[categoryIndex].Name));
|
||||||
if (QMessageBox::question(this, "LeoCAD", question, QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes)
|
if (QMessageBox::question(this, "LeoCAD", question, QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue