Project load/save/edit working.
This commit is contained in:
parent
02103f36ef
commit
b3fd82bed3
5 changed files with 203 additions and 92 deletions
|
@ -32,6 +32,7 @@ char *utilCreateStringVArgs(char *format, va_list args);
|
||||||
void utilEnsureBufferSize(unsigned char **buffer, int *length, int wanted);
|
void utilEnsureBufferSize(unsigned char **buffer, int *length, int wanted);
|
||||||
gboolean utilFileExists(char *filename);
|
gboolean utilFileExists(char *filename);
|
||||||
gboolean utilFileOpen(WindowDataT *self, char *extension, char *what);
|
gboolean utilFileOpen(WindowDataT *self, char *extension, char *what);
|
||||||
|
gboolean utilFileSaveAs(WindowDataT *self, char *extension, char *what);
|
||||||
WindowDataT *utilGetWindowData(GtkWidget *window);
|
WindowDataT *utilGetWindowData(GtkWidget *window);
|
||||||
gboolean utilGetWidgetsFromMemory(char *resource, char *name[], GtkWidget **widgets[], gpointer userData);
|
gboolean utilGetWidgetsFromMemory(char *resource, char *name[], GtkWidget **widgets[], gpointer userData);
|
||||||
gboolean utilQuestionDialog(GtkWidget *parent, char *title, char *question);
|
gboolean utilQuestionDialog(GtkWidget *parent, char *title, char *question);
|
||||||
|
|
238
src/project.c
238
src/project.c
|
@ -29,6 +29,12 @@
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
|
|
||||||
|
enum ProjectColumnsE {
|
||||||
|
COL_FILENAME = 0,
|
||||||
|
COL_COUNT
|
||||||
|
};
|
||||||
|
typedef enum ProjectColumnsE ProjectColumnsT;
|
||||||
|
|
||||||
enum ProjectSectionTypeE {
|
enum ProjectSectionTypeE {
|
||||||
SECTION_HEADER = 0,
|
SECTION_HEADER = 0,
|
||||||
SECTION_CODE,
|
SECTION_CODE,
|
||||||
|
@ -52,21 +58,27 @@ typedef struct ProjectDataS {
|
||||||
char *filename;
|
char *filename;
|
||||||
} ProjectDataT;
|
} ProjectDataT;
|
||||||
|
|
||||||
|
typedef struct SectionDataS {
|
||||||
|
char *name;
|
||||||
|
char *extension;
|
||||||
|
} SectionDataT;
|
||||||
|
|
||||||
static char *_SectionName[] = {
|
|
||||||
"Header",
|
static SectionDataT _sectionData[] = {
|
||||||
"Code",
|
{ "Header", "*.h" },
|
||||||
"Bitmap",
|
{ "Code", "*.c" },
|
||||||
"Stencil",
|
{ "Bitmap", "*.img" },
|
||||||
"Vector",
|
{ "Stencil", "*.stn" },
|
||||||
"Sound",
|
{ "Vector", "*.vic" },
|
||||||
"Music",
|
{ "Sound", "*.snd" },
|
||||||
"Raw Data",
|
{ "Music", "*.mod" },
|
||||||
"Cooked Data",
|
{ "Raw Data", "*.raw" },
|
||||||
NULL
|
{ "Cooked Data", NULL },
|
||||||
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static void addToTree(ProjectDataT *self, char *filename);
|
||||||
static void loadProject(ProjectDataT *self);
|
static void loadProject(ProjectDataT *self);
|
||||||
EVENT void menuProjectFileNew(GtkWidget *object, gpointer userData);
|
EVENT void menuProjectFileNew(GtkWidget *object, gpointer userData);
|
||||||
EVENT void menuProjectFileOpen(GtkWidget *object, gpointer userData);
|
EVENT void menuProjectFileOpen(GtkWidget *object, gpointer userData);
|
||||||
|
@ -83,17 +95,41 @@ EVENT gboolean winProjectClose(GtkWidget *object, gpointer userData);
|
||||||
static void winProjectDelete(gpointer userData);
|
static void winProjectDelete(gpointer userData);
|
||||||
|
|
||||||
|
|
||||||
static void loadProject(ProjectDataT *self) {
|
static void addToTree(ProjectDataT *self, char *filename) {
|
||||||
FILE *in = NULL;
|
ProjectSectionTypeT section;
|
||||||
char *line = NULL;
|
|
||||||
size_t len = 0;
|
|
||||||
size_t count = 0;
|
|
||||||
int16_t extension;
|
|
||||||
int end;
|
|
||||||
char temp[4];
|
char temp[4];
|
||||||
GtkTreeIter iterParent;
|
GtkTreeIter iterParent;
|
||||||
GtkTreeIter iter;
|
GtkTreeIter iter;
|
||||||
ProjectSectionTypeT section;
|
int fileLen;
|
||||||
|
int extLen;
|
||||||
|
|
||||||
|
// Is it long enough?
|
||||||
|
if (strlen(filename) > 2) {
|
||||||
|
// Find proper section.
|
||||||
|
for (section = 0; section < SECTION_COUNT; section++) {
|
||||||
|
if (_sectionData[section].extension != NULL) {
|
||||||
|
// Compare last two bytes of filename with extension - it's enough to differentiate them and allows for ".c" and ".h".
|
||||||
|
fileLen = strlen(filename) - 1;
|
||||||
|
extLen = strlen(_sectionData[section].extension) - 1;
|
||||||
|
if (filename[fileLen - 1] == _sectionData[section].extension[extLen - 1] && filename[fileLen] == _sectionData[section].extension[extLen]) {
|
||||||
|
snprintf(temp, 4, "%d", section);
|
||||||
|
gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(self->storeProject), &iterParent, temp);
|
||||||
|
gtk_tree_store_append(self->storeProject, &iter, &iterParent);
|
||||||
|
gtk_tree_store_set(self->storeProject, &iter, COL_FILENAME, filename, -1);
|
||||||
|
//***TODO*** Need to store extra RAW data somewhere.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void loadProject(ProjectDataT *self) {
|
||||||
|
FILE *in = NULL;
|
||||||
|
char *line = NULL;
|
||||||
|
size_t len = 0;
|
||||||
|
size_t count = 0;
|
||||||
|
|
||||||
in = fopen(self->windowData.filename, "rt");
|
in = fopen(self->windowData.filename, "rt");
|
||||||
if (in != NULL) {
|
if (in != NULL) {
|
||||||
|
@ -105,57 +141,7 @@ static void loadProject(ProjectDataT *self) {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default: // Project Data
|
default: // Project Data
|
||||||
// Are we reading single filenames?
|
addToTree(self, line);
|
||||||
// Is it long enough?
|
|
||||||
if (strlen(line) > 5) {
|
|
||||||
// Put last three bytes - the extension - into a short int so we can use it with switch.
|
|
||||||
end = (int)strlen(line) - 1;
|
|
||||||
extension = (line[end - 2] << 16) + (line[end - 1] << 8) + line[end];
|
|
||||||
//debug("%s - %d\n", line, extension);
|
|
||||||
switch (extension) {
|
|
||||||
case 11880: // h
|
|
||||||
section = SECTION_HEADER;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 11875: // c
|
|
||||||
section = SECTION_CODE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 28007: // img
|
|
||||||
section = SECTION_BITMAP;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 29806: // stn
|
|
||||||
section = SECTION_STENCIL;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 26979: // vic
|
|
||||||
section = SECTION_VECTOR;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 28260: // snd
|
|
||||||
section = SECTION_SOUND;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 28516: // mod
|
|
||||||
section = SECTION_MUSIC;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 24951: // raw
|
|
||||||
section = SECTION_RAW_DATA;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
section = SECTION_COUNT;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (section < SECTION_COUNT) {
|
|
||||||
snprintf(temp, 4, "%d", section);
|
|
||||||
gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(self->storeProject), &iterParent, temp);
|
|
||||||
gtk_tree_store_append(self->storeProject, &iter, &iterParent);
|
|
||||||
gtk_tree_store_set(self->storeProject, &iter, 0, line, -1);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
count++;
|
count++;
|
||||||
|
@ -178,6 +164,8 @@ EVENT void menuProjectFileNew(GtkWidget *object, gpointer userData) {
|
||||||
EVENT void menuProjectFileOpen(GtkWidget *object, gpointer userData) {
|
EVENT void menuProjectFileOpen(GtkWidget *object, gpointer userData) {
|
||||||
ProjectDataT *self = (ProjectDataT *)userData;
|
ProjectDataT *self = (ProjectDataT *)userData;
|
||||||
|
|
||||||
|
(void)object;
|
||||||
|
|
||||||
if (utilFileOpen((WindowDataT *)userData, "*.joe", "Project")) {
|
if (utilFileOpen((WindowDataT *)userData, "*.joe", "Project")) {
|
||||||
loadProject(self);
|
loadProject(self);
|
||||||
}
|
}
|
||||||
|
@ -185,12 +173,55 @@ EVENT void menuProjectFileOpen(GtkWidget *object, gpointer userData) {
|
||||||
|
|
||||||
|
|
||||||
EVENT void menuProjectFileSave(GtkWidget *object, gpointer userData) {
|
EVENT void menuProjectFileSave(GtkWidget *object, gpointer userData) {
|
||||||
|
ProjectDataT *self = (ProjectDataT *)userData;
|
||||||
|
FILE *out = NULL;
|
||||||
|
GtkTreeIter iter;
|
||||||
|
GtkTreeIter child;
|
||||||
|
char *temp;
|
||||||
|
|
||||||
|
(void)object;
|
||||||
|
|
||||||
|
// Do we need to save?
|
||||||
|
if (self->windowData.isDirty == TRUE) {
|
||||||
|
|
||||||
|
// Do we have a filename? If not, kick 'em to SaveAs.
|
||||||
|
if (self->windowData.filename == NULL) {
|
||||||
|
menuProjectFileSaveAs(object, userData);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
out = fopen(self->windowData.filename, "wt");
|
||||||
|
if (out != NULL) {
|
||||||
|
// Save!
|
||||||
|
fprintf(out, "%s\n", PROJECT_VERSION);
|
||||||
|
fprintf(out, "------------------------------------------------------------------------------\n");
|
||||||
|
gtk_tree_model_get_iter_first(GTK_TREE_MODEL(self->storeProject), &iter);
|
||||||
|
do {
|
||||||
|
if (gtk_tree_model_iter_children(GTK_TREE_MODEL(self->storeProject), &child, &iter)) {
|
||||||
|
do {
|
||||||
|
//***TODO*** For RAW we need to store function name somewhere.
|
||||||
|
gtk_tree_model_get(GTK_TREE_MODEL(self->storeProject), &child, COL_FILENAME, &temp, -1);
|
||||||
|
fprintf(out, "%s\n", temp);
|
||||||
|
DEL(temp);
|
||||||
|
} while (gtk_tree_model_iter_next(GTK_TREE_MODEL(self->storeProject), &child));
|
||||||
|
}
|
||||||
|
} while (gtk_tree_model_iter_next(GTK_TREE_MODEL(self->storeProject), &iter));
|
||||||
|
fclose(out);
|
||||||
|
// We're clean now.
|
||||||
|
utilSetDirty((WindowDataT *)self, FALSE);
|
||||||
|
} else {
|
||||||
|
//***TODO*** Something bad happened.
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
EVENT void menuProjectFileSaveAs(GtkWidget *object, gpointer userData) {
|
EVENT void menuProjectFileSaveAs(GtkWidget *object, gpointer userData) {
|
||||||
|
(void)object;
|
||||||
|
|
||||||
|
if (utilFileSaveAs((WindowDataT *)userData, "*.joe", "Project")) {
|
||||||
|
menuProjectFileSave(object, (ProjectDataT *)userData);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -204,12 +235,71 @@ EVENT void menuProjectFileClose(GtkWidget *object, gpointer userData) {
|
||||||
|
|
||||||
|
|
||||||
EVENT void menuProjectProjectAdd(GtkWidget *object, gpointer userData) {
|
EVENT void menuProjectProjectAdd(GtkWidget *object, gpointer userData) {
|
||||||
|
ProjectDataT *self = (ProjectDataT *)userData;
|
||||||
|
GtkWidget *dialog;
|
||||||
|
GtkFileFilter *filter;
|
||||||
|
ProjectSectionTypeT section;
|
||||||
|
char *temp;
|
||||||
|
|
||||||
|
(void)object;
|
||||||
|
|
||||||
|
dialog = gtk_file_chooser_dialog_new("Add File to Project",
|
||||||
|
GTK_WINDOW(self->windowData.window),
|
||||||
|
GTK_FILE_CHOOSER_ACTION_OPEN,
|
||||||
|
"_Cancel", GTK_RESPONSE_CANCEL,
|
||||||
|
"_Open", GTK_RESPONSE_ACCEPT,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
for (section=0; section<SECTION_COUNT; section++) {
|
||||||
|
if (_sectionData[section].extension != NULL) {
|
||||||
|
filter = gtk_file_filter_new();
|
||||||
|
gtk_file_filter_set_name(filter, _sectionData[section].name);
|
||||||
|
gtk_file_filter_add_pattern(filter, _sectionData[section].extension);
|
||||||
|
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
|
||||||
|
temp = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
|
||||||
|
addToTree(self, temp);
|
||||||
|
utilSetDirty((WindowDataT *)self, TRUE);
|
||||||
|
DEL(temp);
|
||||||
|
}
|
||||||
|
|
||||||
|
gtk_widget_destroy(dialog);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
EVENT void menuProjectProjectRemove(GtkWidget *object, gpointer userData) {
|
EVENT void menuProjectProjectRemove(GtkWidget *object, gpointer userData) {
|
||||||
|
ProjectDataT *self = (ProjectDataT *)userData;
|
||||||
|
GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(self->treeProject));
|
||||||
|
gboolean found = FALSE;
|
||||||
|
GtkWidget *dialog;
|
||||||
|
GtkTreeModel *model;
|
||||||
|
GtkTreeIter iter;
|
||||||
|
|
||||||
|
// Is anything selected?
|
||||||
|
if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
|
||||||
|
// Are we on a child item?
|
||||||
|
if (gtk_tree_store_iter_depth(self->storeProject, &iter) > 0) {
|
||||||
|
found = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (found) {
|
||||||
|
gtk_tree_store_remove(self->storeProject, &iter);
|
||||||
|
utilSetDirty((WindowDataT *)self, TRUE);
|
||||||
|
} else {
|
||||||
|
// Provide help.
|
||||||
|
dialog = gtk_message_dialog_new(GTK_WINDOW(self->windowData.window),
|
||||||
|
GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
|
||||||
|
GTK_MESSAGE_INFO,
|
||||||
|
GTK_BUTTONS_CLOSE,
|
||||||
|
"Please select a file to remove.");
|
||||||
|
gtk_dialog_run(GTK_DIALOG(dialog));
|
||||||
|
gtk_widget_destroy(dialog);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -263,7 +353,6 @@ void winProjectCreate(void) {
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
GtkWidget **widgets[] = {
|
GtkWidget **widgets[] = {
|
||||||
NULL,
|
|
||||||
NULL,
|
NULL,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
@ -286,20 +375,17 @@ void winProjectCreate(void) {
|
||||||
gtk_tree_view_append_column(GTK_TREE_VIEW(self->treeProject), col);
|
gtk_tree_view_append_column(GTK_TREE_VIEW(self->treeProject), col);
|
||||||
renderer = gtk_cell_renderer_text_new();
|
renderer = gtk_cell_renderer_text_new();
|
||||||
gtk_tree_view_column_pack_start(col, renderer, TRUE);
|
gtk_tree_view_column_pack_start(col, renderer, TRUE);
|
||||||
gtk_tree_view_column_add_attribute(col, renderer, "text", 0);
|
gtk_tree_view_column_add_attribute(col, renderer, "text", COL_FILENAME);
|
||||||
self->storeProject = gtk_tree_store_new(1, G_TYPE_STRING);
|
self->storeProject = gtk_tree_store_new(1, G_TYPE_STRING);
|
||||||
|
|
||||||
for (i=0; i<SECTION_COUNT; i++) {
|
for (i=0; i<SECTION_COUNT; i++) {
|
||||||
gtk_tree_store_append(self->storeProject, &iter, NULL);
|
gtk_tree_store_append(self->storeProject, &iter, NULL);
|
||||||
gtk_tree_store_set(self->storeProject, &iter, 0, _SectionName[i], -1);
|
gtk_tree_store_set(self->storeProject, &iter, COL_FILENAME, _sectionData[i].name, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
gtk_tree_view_set_model(GTK_TREE_VIEW(self->treeProject), GTK_TREE_MODEL(self->storeProject));
|
gtk_tree_view_set_model(GTK_TREE_VIEW(self->treeProject), GTK_TREE_MODEL(self->storeProject));
|
||||||
g_object_unref(self->storeProject);
|
g_object_unref(self->storeProject);
|
||||||
|
|
||||||
// Grab title.
|
|
||||||
self->title = strdup(gtk_window_get_title(GTK_WINDOW(self->windowData.window)));
|
|
||||||
|
|
||||||
// Register window & show it.
|
// Register window & show it.
|
||||||
utilWindowRegister(self);
|
utilWindowRegister(self);
|
||||||
gtk_widget_show_all(self->windowData.window);
|
gtk_widget_show_all(self->windowData.window);
|
||||||
|
|
36
src/utils.c
36
src/utils.c
|
@ -111,6 +111,7 @@ gboolean utilFileOpen(WindowDataT *self, char *extension, char *what) {
|
||||||
"_Open", GTK_RESPONSE_ACCEPT,
|
"_Open", GTK_RESPONSE_ACCEPT,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
filter = gtk_file_filter_new();
|
filter = gtk_file_filter_new();
|
||||||
gtk_file_filter_set_name(filter, files);
|
gtk_file_filter_set_name(filter, files);
|
||||||
gtk_file_filter_add_pattern(filter, extension);
|
gtk_file_filter_add_pattern(filter, extension);
|
||||||
|
@ -135,6 +136,41 @@ gboolean utilFileOpen(WindowDataT *self, char *extension, char *what) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
gboolean utilFileSaveAs(WindowDataT *self, char *extension, char *what) {
|
||||||
|
GtkWidget *dialog;
|
||||||
|
GtkFileFilter *filter;
|
||||||
|
gboolean result = FALSE;
|
||||||
|
char *files = utilCreateString("%s Files", what);
|
||||||
|
|
||||||
|
dialog = gtk_file_chooser_dialog_new("Save As",
|
||||||
|
GTK_WINDOW(self->window),
|
||||||
|
GTK_FILE_CHOOSER_ACTION_SAVE,
|
||||||
|
"_Cancel", GTK_RESPONSE_CANCEL,
|
||||||
|
"_Save", GTK_RESPONSE_ACCEPT,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dialog), TRUE);
|
||||||
|
|
||||||
|
filter = gtk_file_filter_new();
|
||||||
|
gtk_file_filter_set_name(filter, files);
|
||||||
|
gtk_file_filter_add_pattern(filter, extension);
|
||||||
|
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter);
|
||||||
|
|
||||||
|
if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
|
||||||
|
DEL(self->filename);
|
||||||
|
self->filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
|
||||||
|
utilSetDirty(self, TRUE);
|
||||||
|
result = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
DEL(files);
|
||||||
|
|
||||||
|
gtk_widget_destroy(dialog);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
WindowDataT *utilGetWindowData(GtkWidget *window) {
|
WindowDataT *utilGetWindowData(GtkWidget *window) {
|
||||||
return hmget(_windowList, window);
|
return hmget(_windowList, window);
|
||||||
}
|
}
|
||||||
|
|
19
src/vector.c
19
src/vector.c
|
@ -788,25 +788,12 @@ EVENT void menuVectorFileSave(GtkWidget *object, gpointer userData) {
|
||||||
|
|
||||||
|
|
||||||
EVENT void menuVectorFileSaveAs(GtkWidget *object, gpointer userData) {
|
EVENT void menuVectorFileSaveAs(GtkWidget *object, gpointer userData) {
|
||||||
VectorDataT *self = (VectorDataT *)userData;
|
|
||||||
GtkWidget *dialog;
|
|
||||||
|
|
||||||
dialog = gtk_file_chooser_dialog_new("Save As",
|
(void)object;
|
||||||
GTK_WINDOW(self->windowData.window),
|
|
||||||
GTK_FILE_CHOOSER_ACTION_SAVE,
|
|
||||||
"_Cancel", GTK_RESPONSE_CANCEL,
|
|
||||||
"_Save", GTK_RESPONSE_ACCEPT,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dialog), TRUE);
|
if (utilFileSaveAs((WindowDataT *)userData, "*.vic", "Image")) {
|
||||||
|
menuVectorFileSave(object, (VectorDataT *)userData);
|
||||||
if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
|
|
||||||
DEL(self->windowData.filename);
|
|
||||||
self->windowData.filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
|
|
||||||
menuVectorFileSave(object, self);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gtk_widget_destroy(dialog);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -203,6 +203,7 @@
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">True</property>
|
<property name="can-focus">True</property>
|
||||||
<property name="headers-visible">False</property>
|
<property name="headers-visible">False</property>
|
||||||
|
<property name="enable-search">False</property>
|
||||||
<property name="search-column">0</property>
|
<property name="search-column">0</property>
|
||||||
<property name="enable-tree-lines">True</property>
|
<property name="enable-tree-lines">True</property>
|
||||||
<child internal-child="selection">
|
<child internal-child="selection">
|
||||||
|
|
Loading…
Add table
Reference in a new issue