fix memory leaks in texture browser::tags functions
This commit is contained in:
parent
ef2fdfa127
commit
fa2a179fd5
|
|
@ -1269,41 +1269,43 @@ void BuildStoreAvailableTags( GtkListStore* storeAvailable,
|
||||||
TextureBrowser* textureBrowser ){
|
TextureBrowser* textureBrowser ){
|
||||||
GtkTreeIter iterAssigned;
|
GtkTreeIter iterAssigned;
|
||||||
GtkTreeIter iterAvailable;
|
GtkTreeIter iterAvailable;
|
||||||
std::set<CopiedString>::const_iterator iterAll;
|
|
||||||
gchar* tag_assigned;
|
|
||||||
|
|
||||||
gtk_list_store_clear( storeAvailable );
|
gtk_list_store_clear( storeAvailable );
|
||||||
|
|
||||||
bool row = gtk_tree_model_get_iter_first( GTK_TREE_MODEL( storeAssigned ), &iterAssigned ) != 0;
|
bool row = gtk_tree_model_get_iter_first( GTK_TREE_MODEL( storeAssigned ), &iterAssigned ) != 0;
|
||||||
|
|
||||||
if ( !row ) { // does the shader have tags assigned?
|
if ( !row ) { // does the shader have tags assigned?
|
||||||
for ( iterAll = allTags.begin(); iterAll != allTags.end(); ++iterAll )
|
for ( const CopiedString& tag : allTags )
|
||||||
{
|
{
|
||||||
gtk_list_store_append( storeAvailable, &iterAvailable );
|
gtk_list_store_append( storeAvailable, &iterAvailable );
|
||||||
gtk_list_store_set( storeAvailable, &iterAvailable, TAG_COLUMN, ( *iterAll ).c_str(), -1 );
|
gtk_list_store_set( storeAvailable, &iterAvailable, TAG_COLUMN, tag.c_str(), -1 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
while ( row ) // available tags = all tags - assigned tags
|
while ( row ) // available tags = all tags - assigned tags
|
||||||
{
|
{
|
||||||
|
gchar* tag_assigned;
|
||||||
gtk_tree_model_get( GTK_TREE_MODEL( storeAssigned ), &iterAssigned, TAG_COLUMN, &tag_assigned, -1 );
|
gtk_tree_model_get( GTK_TREE_MODEL( storeAssigned ), &iterAssigned, TAG_COLUMN, &tag_assigned, -1 );
|
||||||
|
|
||||||
for ( iterAll = allTags.begin(); iterAll != allTags.end(); ++iterAll )
|
for ( const CopiedString& tag : allTags )
|
||||||
{
|
{
|
||||||
if ( strcmp( (char*)tag_assigned, ( *iterAll ).c_str() ) != 0 ) {
|
if ( !string_equal( tag_assigned, tag.c_str() ) ) {
|
||||||
gtk_list_store_append( storeAvailable, &iterAvailable );
|
gtk_list_store_append( storeAvailable, &iterAvailable );
|
||||||
gtk_list_store_set( storeAvailable, &iterAvailable, TAG_COLUMN, ( *iterAll ).c_str(), -1 );
|
gtk_list_store_set( storeAvailable, &iterAvailable, TAG_COLUMN, tag.c_str(), -1 );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
row = gtk_tree_model_iter_next( GTK_TREE_MODEL( storeAssigned ), &iterAssigned ) != 0;
|
row = gtk_tree_model_iter_next( GTK_TREE_MODEL( storeAssigned ), &iterAssigned ) != 0;
|
||||||
|
|
||||||
if ( row ) {
|
if ( row ) {
|
||||||
|
g_free( tag_assigned );
|
||||||
gtk_tree_model_get( GTK_TREE_MODEL( storeAssigned ), &iterAssigned, TAG_COLUMN, &tag_assigned, -1 );
|
gtk_tree_model_get( GTK_TREE_MODEL( storeAssigned ), &iterAssigned, TAG_COLUMN, &tag_assigned, -1 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_free( tag_assigned );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1799,6 +1801,8 @@ void TextureBrowser_assignTags(){
|
||||||
gtk_list_store_remove( g_TextureBrowser.m_available_store, &iter );
|
gtk_list_store_remove( g_TextureBrowser.m_available_store, &iter );
|
||||||
gtk_list_store_append( g_TextureBrowser.m_assigned_store, &iter );
|
gtk_list_store_append( g_TextureBrowser.m_assigned_store, &iter );
|
||||||
gtk_list_store_set( g_TextureBrowser.m_assigned_store, &iter, TAG_COLUMN, (char*)tag_assigned, -1 );
|
gtk_list_store_set( g_TextureBrowser.m_assigned_store, &iter, TAG_COLUMN, (char*)tag_assigned, -1 );
|
||||||
|
|
||||||
|
g_free( tag_assigned );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1814,7 +1818,6 @@ void TextureBrowser_assignTags(){
|
||||||
void TextureBrowser_removeTags(){
|
void TextureBrowser_removeTags(){
|
||||||
GSList* selected = NULL;
|
GSList* selected = NULL;
|
||||||
GSList* node;
|
GSList* node;
|
||||||
gchar* tag;
|
|
||||||
|
|
||||||
GtkTreeSelection* selection = gtk_tree_view_get_selection( GTK_TREE_VIEW( g_TextureBrowser.m_assigned_tree ) );
|
GtkTreeSelection* selection = gtk_tree_view_get_selection( GTK_TREE_VIEW( g_TextureBrowser.m_assigned_tree ) );
|
||||||
|
|
||||||
|
|
@ -1829,9 +1832,11 @@ void TextureBrowser_removeTags(){
|
||||||
GtkTreeIter iter;
|
GtkTreeIter iter;
|
||||||
|
|
||||||
if ( gtk_tree_model_get_iter( GTK_TREE_MODEL( g_TextureBrowser.m_assigned_store ), &iter, path ) ) {
|
if ( gtk_tree_model_get_iter( GTK_TREE_MODEL( g_TextureBrowser.m_assigned_store ), &iter, path ) ) {
|
||||||
|
gchar* tag;
|
||||||
gtk_tree_model_get( GTK_TREE_MODEL( g_TextureBrowser.m_assigned_store ), &iter, TAG_COLUMN, &tag, -1 );
|
gtk_tree_model_get( GTK_TREE_MODEL( g_TextureBrowser.m_assigned_store ), &iter, TAG_COLUMN, &tag, -1 );
|
||||||
TagBuilder.DeleteShaderTag( g_TextureBrowser.shader.c_str(), tag );
|
TagBuilder.DeleteShaderTag( g_TextureBrowser.shader.c_str(), tag );
|
||||||
gtk_list_store_remove( g_TextureBrowser.m_assigned_store, &iter );
|
gtk_list_store_remove( g_TextureBrowser.m_assigned_store, &iter );
|
||||||
|
g_free( tag );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1863,7 +1868,6 @@ void TextureBrowser_buildTagList(){
|
||||||
void TextureBrowser_searchTags(){
|
void TextureBrowser_searchTags(){
|
||||||
GSList* selected = NULL;
|
GSList* selected = NULL;
|
||||||
GSList* node;
|
GSList* node;
|
||||||
gchar* tag;
|
|
||||||
char buffer[256];
|
char buffer[256];
|
||||||
char tags_searched[256];
|
char tags_searched[256];
|
||||||
|
|
||||||
|
|
@ -1883,10 +1887,12 @@ void TextureBrowser_searchTags(){
|
||||||
GtkTreeIter iter;
|
GtkTreeIter iter;
|
||||||
|
|
||||||
if ( gtk_tree_model_get_iter( GTK_TREE_MODEL( g_TextureBrowser.m_all_tags_list ), &iter, path ) ) {
|
if ( gtk_tree_model_get_iter( GTK_TREE_MODEL( g_TextureBrowser.m_all_tags_list ), &iter, path ) ) {
|
||||||
|
gchar* tag;
|
||||||
gtk_tree_model_get( GTK_TREE_MODEL( g_TextureBrowser.m_all_tags_list ), &iter, TAG_COLUMN, &tag, -1 );
|
gtk_tree_model_get( GTK_TREE_MODEL( g_TextureBrowser.m_all_tags_list ), &iter, TAG_COLUMN, &tag, -1 );
|
||||||
|
|
||||||
strcat( buffer, tag );
|
strcat( buffer, tag );
|
||||||
strcat( tags_searched, tag );
|
strcat( tags_searched, tag );
|
||||||
|
g_free( tag );
|
||||||
if ( node != g_slist_last( node ) ) {
|
if ( node != g_slist_last( node ) ) {
|
||||||
strcat( buffer, "' and tag='" );
|
strcat( buffer, "' and tag='" );
|
||||||
strcat( tags_searched, ", " );
|
strcat( tags_searched, ", " );
|
||||||
|
|
@ -2380,7 +2386,7 @@ void TextureBrowser_renameTag(){
|
||||||
gtk_tree_selection_get_selected() doesn't work with GTK_SELECTION_MULTIPLE,
|
gtk_tree_selection_get_selected() doesn't work with GTK_SELECTION_MULTIPLE,
|
||||||
we need to count the number of selected rows first and use
|
we need to count the number of selected rows first and use
|
||||||
gtk_tree_selection_selected_foreach() then to go through the list of selected
|
gtk_tree_selection_selected_foreach() then to go through the list of selected
|
||||||
rows (which always containins a single row).
|
rows (which always contains a single row).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
GSList* selected = NULL;
|
GSList* selected = NULL;
|
||||||
|
|
@ -2394,18 +2400,19 @@ void TextureBrowser_renameTag(){
|
||||||
|
|
||||||
if ( result == eIDOK && !newTag.empty() ) {
|
if ( result == eIDOK && !newTag.empty() ) {
|
||||||
GtkTreeIter iterList;
|
GtkTreeIter iterList;
|
||||||
gchar* rowTag;
|
|
||||||
gchar* oldTag = (char*)selected->data;
|
gchar* oldTag = (char*)selected->data;
|
||||||
|
|
||||||
bool row = gtk_tree_model_get_iter_first( GTK_TREE_MODEL( g_TextureBrowser.m_all_tags_list ), &iterList ) != 0;
|
bool row = gtk_tree_model_get_iter_first( GTK_TREE_MODEL( g_TextureBrowser.m_all_tags_list ), &iterList ) != 0;
|
||||||
|
|
||||||
while ( row )
|
while ( row )
|
||||||
{
|
{
|
||||||
|
gchar* rowTag;
|
||||||
gtk_tree_model_get( GTK_TREE_MODEL( g_TextureBrowser.m_all_tags_list ), &iterList, TAG_COLUMN, &rowTag, -1 );
|
gtk_tree_model_get( GTK_TREE_MODEL( g_TextureBrowser.m_all_tags_list ), &iterList, TAG_COLUMN, &rowTag, -1 );
|
||||||
|
|
||||||
if ( strcmp( rowTag, oldTag ) == 0 ) {
|
if ( string_equal( rowTag, oldTag ) ) {
|
||||||
gtk_list_store_set( g_TextureBrowser.m_all_tags_list, &iterList, TAG_COLUMN, newTag.c_str(), -1 );
|
gtk_list_store_set( g_TextureBrowser.m_all_tags_list, &iterList, TAG_COLUMN, newTag.c_str(), -1 );
|
||||||
}
|
}
|
||||||
|
g_free( rowTag );
|
||||||
row = gtk_tree_model_iter_next( GTK_TREE_MODEL( g_TextureBrowser.m_all_tags_list ), &iterList ) != 0;
|
row = gtk_tree_model_iter_next( GTK_TREE_MODEL( g_TextureBrowser.m_all_tags_list ), &iterList ) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2422,6 +2429,8 @@ void TextureBrowser_renameTag(){
|
||||||
{
|
{
|
||||||
gtk_MessageBox( GTK_WIDGET( g_TextureBrowser.m_parent ), "Select a single tag for renaming." );
|
gtk_MessageBox( GTK_WIDGET( g_TextureBrowser.m_parent ), "Select a single tag for renaming." );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_slist_free_full( selected, g_free );
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextureBrowser_deleteTag(){
|
void TextureBrowser_deleteTag(){
|
||||||
|
|
@ -2435,7 +2444,6 @@ void TextureBrowser_deleteTag(){
|
||||||
|
|
||||||
if ( result == eIDYES ) {
|
if ( result == eIDYES ) {
|
||||||
GtkTreeIter iterSelected;
|
GtkTreeIter iterSelected;
|
||||||
gchar *rowTag;
|
|
||||||
|
|
||||||
gchar* tagSelected = (char*)selected->data;
|
gchar* tagSelected = (char*)selected->data;
|
||||||
|
|
||||||
|
|
@ -2443,12 +2451,15 @@ void TextureBrowser_deleteTag(){
|
||||||
|
|
||||||
while ( row )
|
while ( row )
|
||||||
{
|
{
|
||||||
|
gchar *rowTag;
|
||||||
gtk_tree_model_get( GTK_TREE_MODEL( g_TextureBrowser.m_all_tags_list ), &iterSelected, TAG_COLUMN, &rowTag, -1 );
|
gtk_tree_model_get( GTK_TREE_MODEL( g_TextureBrowser.m_all_tags_list ), &iterSelected, TAG_COLUMN, &rowTag, -1 );
|
||||||
|
|
||||||
if ( strcmp( rowTag, tagSelected ) == 0 ) {
|
if ( string_equal( rowTag, tagSelected ) ) {
|
||||||
gtk_list_store_remove( g_TextureBrowser.m_all_tags_list, &iterSelected );
|
gtk_list_store_remove( g_TextureBrowser.m_all_tags_list, &iterSelected );
|
||||||
|
g_free( rowTag );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
g_free( rowTag );
|
||||||
row = gtk_tree_model_iter_next( GTK_TREE_MODEL( g_TextureBrowser.m_all_tags_list ), &iterSelected ) != 0;
|
row = gtk_tree_model_iter_next( GTK_TREE_MODEL( g_TextureBrowser.m_all_tags_list ), &iterSelected ) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2462,6 +2473,8 @@ void TextureBrowser_deleteTag(){
|
||||||
else {
|
else {
|
||||||
gtk_MessageBox( GTK_WIDGET( g_TextureBrowser.m_parent ), "Select a single tag for deletion." );
|
gtk_MessageBox( GTK_WIDGET( g_TextureBrowser.m_parent ), "Select a single tag for deletion." );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_slist_free_full( selected, g_free );
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextureBrowser_copyTag(){
|
void TextureBrowser_copyTag(){
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user