Can configure custom JoeyLib for application builds. Not implemented in the build code yet.
This commit is contained in:
parent
99010a03bd
commit
2feebae63c
4 changed files with 267 additions and 21 deletions
|
@ -41,6 +41,7 @@ typedef struct ProjectDataS {
|
|||
StringHashT **recipes;
|
||||
char *projectType;
|
||||
char *projectName;
|
||||
char *projectJoeyLib;
|
||||
char *configName;
|
||||
char *buildHost;
|
||||
int buildHTTPPort;
|
||||
|
@ -50,6 +51,9 @@ typedef struct ProjectDataS {
|
|||
TargetT **targets;
|
||||
void *buildResults; // Managed by results.c
|
||||
GtkWidget *tempWidget; // Used to pass data around dialogs.
|
||||
GtkWidget *tempWidget2; // Used to pass data around dialogs.
|
||||
GtkWidget *tempWidget3; // Used to pass data around dialogs.
|
||||
GtkWidget *tempWidget4; // Used to pass data around dialogs.
|
||||
int tempInteger; // Used during recipe building.
|
||||
} ProjectDataT;
|
||||
|
||||
|
|
154
src/project.c
154
src/project.c
|
@ -96,10 +96,13 @@ EVENT void btnEditRawClicked(GtkButton *widget, gpointer userData);
|
|||
EVENT void btnEditRecipeClicked(GtkButton *widget, gpointer userData);
|
||||
EVENT void btnNewRecipeClicked(GtkButton *widget, gpointer userData);
|
||||
static void clearRecipeData(ProjectDataT *self);
|
||||
EVENT void comboProjectTypeChanged(GtkComboBox *object, gpointer userData);
|
||||
static void cookFinished(CompilerContextT **context);
|
||||
static void decompressBuild(ArchiveT *archive);
|
||||
static void dialogCookOptions(char *filename, ProjectDataT *self);
|
||||
EVENT void fileCustomSet(GtkWidget *object, gpointer userData);
|
||||
static int findRecipeData(ProjectDataT *self, char *key);
|
||||
static gboolean isCustomJoeyLibProject(char *filename);
|
||||
static void loadConfig(ProjectDataT *self);
|
||||
static void loadProject(ProjectDataT *self);
|
||||
EVENT void menuProjectFileNew(GtkWidget *object, gpointer userData);
|
||||
|
@ -224,6 +227,26 @@ static void clearRecipeData(ProjectDataT *self) {
|
|||
}
|
||||
|
||||
|
||||
EVENT void comboProjectTypeChanged(GtkComboBox *object, gpointer userData) {
|
||||
ProjectDataT *self = (ProjectDataT *)userData;
|
||||
char *temp = NULL;
|
||||
|
||||
temp = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(object));
|
||||
if (strcmp(temp, "JoeyLib") == 0) {
|
||||
// JoeyLib project - Disable JoeyLib settings.
|
||||
gtk_widget_set_sensitive(self->tempWidget, FALSE);
|
||||
gtk_widget_set_sensitive(self->tempWidget2, FALSE);
|
||||
gtk_widget_set_sensitive(self->tempWidget3, FALSE);
|
||||
} else {
|
||||
// Application project - Enable JoeyLib settings.
|
||||
gtk_widget_set_sensitive(self->tempWidget, TRUE);
|
||||
gtk_widget_set_sensitive(self->tempWidget2, TRUE);
|
||||
gtk_widget_set_sensitive(self->tempWidget3, TRUE);
|
||||
}
|
||||
DEL(temp);
|
||||
}
|
||||
|
||||
|
||||
static void cookFinished(CompilerContextT **context) {
|
||||
CompilerContextT *ctx = *context;
|
||||
ProjectDataT *self = (ProjectDataT *)ctx->userData;
|
||||
|
@ -344,6 +367,31 @@ static void dialogCookOptions(char *filename, ProjectDataT *self) {
|
|||
}
|
||||
|
||||
|
||||
EVENT void fileCustomSet(GtkWidget *object, gpointer userData) {
|
||||
ProjectDataT *self = (ProjectDataT *)userData;
|
||||
char *temp = NULL;
|
||||
gboolean isJoeyLib = FALSE;
|
||||
|
||||
temp = (char *)gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(object));
|
||||
isJoeyLib = isCustomJoeyLibProject(temp);
|
||||
DEL(temp);
|
||||
|
||||
if (isJoeyLib == FALSE) {
|
||||
utilMessageDialog(self->tempWidget4,
|
||||
"Not a Custom JoeyLib Project",
|
||||
"The selected project is not a custom JoeyLib library project.");
|
||||
// Deselect custom JoeyLib.
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(self->tempWidget), TRUE);
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(self->tempWidget2), FALSE);
|
||||
gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(self->tempWidget3), "");
|
||||
} else {
|
||||
// Select custom JoeyLib.
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(self->tempWidget), FALSE);
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(self->tempWidget2), TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int findRecipeData(ProjectDataT *self, char *key) {
|
||||
int i;
|
||||
int result = -1;
|
||||
|
@ -359,6 +407,40 @@ static int findRecipeData(ProjectDataT *self, char *key) {
|
|||
}
|
||||
|
||||
|
||||
static gboolean isCustomJoeyLibProject(char *filename) {
|
||||
FILE *in = NULL;
|
||||
char *line = NULL;
|
||||
size_t len = 0;
|
||||
char *c = NULL;
|
||||
gboolean isJoeyLib = FALSE;
|
||||
|
||||
// Is this project a custom JoeyLib project?
|
||||
in = fopen(filename, "rt");
|
||||
if (in != NULL) {
|
||||
utilEnsureBufferSize((unsigned char **)&line, (int *)&len, 1024); // Not technically needed, but fixes a pointer warning from memmaker.
|
||||
while (utilGetLine(&line, &len, in) != -1) {
|
||||
if (strlen(line) > 0) line[strlen(line) - 1] = 0;
|
||||
c = utilGetToken(line, " ", "\"", "\"");
|
||||
utilDequote(c);
|
||||
|
||||
// Is this a 'project' line?
|
||||
if (strcasecmp(c, "project") == 0) {
|
||||
c = utilGetToken(NULL, " ", "\"", "\"");
|
||||
utilDequote(c);
|
||||
if (strcmp(c, "JoeyLib") == 0) {
|
||||
isJoeyLib = TRUE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
fclose(in);
|
||||
DEL(line);
|
||||
}
|
||||
|
||||
return isJoeyLib;
|
||||
}
|
||||
|
||||
|
||||
static void loadConfig(ProjectDataT *self) {
|
||||
FILE *in = NULL;
|
||||
char *line = NULL;
|
||||
|
@ -506,6 +588,7 @@ static void loadProject(ProjectDataT *self) {
|
|||
addToRecipeData(self, raw, __utilFilenameBuffer);
|
||||
}
|
||||
DEL(raw);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Is this a 'project' line?
|
||||
|
@ -518,6 +601,16 @@ static void loadProject(ProjectDataT *self) {
|
|||
utilDequote(c);
|
||||
DEL(self->projectName);
|
||||
self->projectName = strdup(c);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Is this a 'joeylib' line?
|
||||
if (strcasecmp(c, "joeylib") == 0) {
|
||||
c = utilGetToken(NULL, " ", "\"", "\"");
|
||||
utilDequote(c);
|
||||
DEL(self->projectJoeyLib);
|
||||
self->projectJoeyLib = strdup(c);
|
||||
continue;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -576,8 +669,10 @@ EVENT void menuProjectFileNew(GtkWidget *object, gpointer userData) {
|
|||
// Clear project properties.
|
||||
DEL(self->projectName);
|
||||
DEL(self->projectType);
|
||||
DEL(self->projectJoeyLib);
|
||||
self->projectType = strdup("Application");
|
||||
self->projectName = strdup("None");
|
||||
self->projectJoeyLib = strdup("Latest");
|
||||
|
||||
// Nuke filename & mark clean.
|
||||
DEL(self->windowData.filename);
|
||||
|
@ -625,6 +720,7 @@ EVENT void menuProjectFileSave(GtkWidget *object, gpointer userData) {
|
|||
fprintf(out, "------------------------------------------------------------------------------\n");
|
||||
// Write out project properties.
|
||||
fprintf(out, "project \"%s\" \"%s\"\n", self->projectType, self->projectName);
|
||||
fprintf(out, "joeylib \"%s\"\n", self->projectJoeyLib);
|
||||
// Write out file list.
|
||||
gtk_tree_model_get_iter_first(model, &iter);
|
||||
do {
|
||||
|
@ -782,6 +878,9 @@ EVENT void menuProjectProjectProperties(GtkWidget *object, gpointer userData) {
|
|||
GtkWidget *dialogProperties;
|
||||
GtkWidget *comboType;
|
||||
GtkWidget *txtName;
|
||||
GtkWidget *radioLatest;
|
||||
GtkWidget *radioCustom;
|
||||
GtkWidget *fileCustom;
|
||||
|
||||
(void)object;
|
||||
|
||||
|
@ -790,34 +889,60 @@ EVENT void menuProjectProjectProperties(GtkWidget *object, gpointer userData) {
|
|||
"dialogProjectProperties",
|
||||
"comboProjectType",
|
||||
"txtProjectName",
|
||||
"radioLatest",
|
||||
"radioCustom",
|
||||
"fileCustom",
|
||||
NULL
|
||||
};
|
||||
GtkWidget **widgets[] = {
|
||||
&dialogProperties,
|
||||
&comboType,
|
||||
&txtName
|
||||
&txtName,
|
||||
&radioLatest,
|
||||
&radioCustom,
|
||||
&fileCustom
|
||||
};
|
||||
GtkEntryBuffer *buffer;
|
||||
int result;
|
||||
|
||||
utilGetWidgetsFromMemory("/com/kangaroopunch/joeydev/ProjectProperties.glade", widgetNames, widgets, self);
|
||||
|
||||
// Save for callbacks.
|
||||
self->tempWidget = radioLatest;
|
||||
self->tempWidget2 = radioCustom;
|
||||
self->tempWidget3 = fileCustom;
|
||||
self->tempWidget4 = dialogProperties;
|
||||
|
||||
// What kind of project is this?
|
||||
if (strcmp(self->projectType, "JoeyLib") == 0) {
|
||||
gtk_combo_box_set_active(GTK_COMBO_BOX(comboType), 1);
|
||||
} else {
|
||||
gtk_combo_box_set_active(GTK_COMBO_BOX(comboType), 0);
|
||||
// Which JoeyLib are we using?
|
||||
if (strcmp(self->projectJoeyLib, "Latest") == 0) {
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radioLatest), TRUE);
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radioCustom), FALSE);
|
||||
gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(fileCustom), "");
|
||||
} else {
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radioLatest), FALSE);
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radioCustom), TRUE);
|
||||
gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(fileCustom), self->projectJoeyLib);
|
||||
}
|
||||
}
|
||||
comboProjectTypeChanged(GTK_COMBO_BOX(comboType), self);
|
||||
|
||||
buffer = gtk_entry_get_buffer(GTK_ENTRY(txtName));
|
||||
gtk_entry_buffer_set_text(GTK_ENTRY_BUFFER(buffer), self->projectName, strlen(self->projectName));
|
||||
|
||||
result = gtk_dialog_run(GTK_DIALOG(dialogProperties));
|
||||
if (result == GTK_RESPONSE_OK) {
|
||||
// Did the project name change?
|
||||
if (strcmp(self->projectName, gtk_entry_buffer_get_text(GTK_ENTRY_BUFFER(buffer))) != 0) {
|
||||
DEL(self->projectName);
|
||||
self->projectName = strdup(gtk_entry_buffer_get_text(GTK_ENTRY_BUFFER(buffer)));
|
||||
utilSetDirty((WindowDataT *)self, TRUE);
|
||||
}
|
||||
// Did the project type change?
|
||||
temp = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(comboType));
|
||||
if (strcmp(self->projectType, temp) != 0) {
|
||||
DEL(self->projectType);
|
||||
|
@ -825,6 +950,29 @@ EVENT void menuProjectProjectProperties(GtkWidget *object, gpointer userData) {
|
|||
utilSetDirty((WindowDataT *)self, TRUE);
|
||||
}
|
||||
DEL(temp);
|
||||
// Is it an application project?
|
||||
if (strcmp(self->projectType, "JoeyLib") != 0) {
|
||||
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioLatest))) {
|
||||
temp = strdup("Latest");
|
||||
} else {
|
||||
temp = (char *)gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(fileCustom));
|
||||
if (!isCustomJoeyLibProject(temp)) {
|
||||
DEL(temp);
|
||||
temp = strdup("Latest");
|
||||
utilMessageDialog(dialogProperties,
|
||||
"Not a Custom JoeyLib Project",
|
||||
"The selected project is not a custom JoeyLib library project.\n"
|
||||
"Using the latest build instead.");
|
||||
}
|
||||
}
|
||||
// Did the desired JoeyLib change?
|
||||
if (strcmp(self->projectJoeyLib, temp) != 0) {
|
||||
DEL(self->projectJoeyLib);
|
||||
self->projectJoeyLib = strdup(temp);
|
||||
utilSetDirty((WindowDataT *)self, TRUE);
|
||||
}
|
||||
DEL(temp);
|
||||
}
|
||||
}
|
||||
|
||||
gtk_widget_destroy(dialogProperties);
|
||||
|
@ -1059,6 +1207,8 @@ EVENT void menuProjectBuildBuild(GtkWidget *object, gpointer userData) {
|
|||
gboolean archPrinted;
|
||||
FILE *out;
|
||||
|
||||
//***TODO*** This needs to support building with custom JoeyLib libraries.
|
||||
|
||||
messageShow();
|
||||
|
||||
ssh = sshConnect(self->buildHost, self->buildSSHPort, self->buildUser, self->buildPassword);
|
||||
|
@ -1088,6 +1238,8 @@ EVENT void menuProjectBuildBuild(GtkWidget *object, gpointer userData) {
|
|||
fprintf(out, "%s\n", self->projectType);
|
||||
// Write it's title.
|
||||
fprintf(out, "%s\n", self->projectName);
|
||||
// Write the JoeyLib to use.
|
||||
fprintf(out, "%s\n", self->projectJoeyLib); ///***TODO*** Paths to a custom JoeyLib mean nothing to JoeyBuild.
|
||||
// Write desired build targets.
|
||||
for (i=0; i<arrlen(self->targets); i++) {
|
||||
archPrinted = FALSE;
|
||||
|
|
|
@ -65,6 +65,8 @@ EVENT void messageClicked(GtkButton *widget, gpointer userData) {
|
|||
size_t column;
|
||||
gboolean isWarning;
|
||||
|
||||
(void)isWarning;
|
||||
|
||||
// Extract info from button name.
|
||||
tok = strdup(name);
|
||||
temp = strtok(tok, ":");
|
||||
|
@ -191,6 +193,7 @@ static void resultParseRaw(gboolean release, char **lineArray, ResultsDataT *sel
|
|||
temp = strtok(NULL, ":");
|
||||
column = atol(temp) - 1;
|
||||
DEL(tok);
|
||||
//***TODO*** Keep a list per-file so we can add markers to the editor.
|
||||
}
|
||||
// --- The above is basically GCC only. And lame.
|
||||
|
||||
|
|
|
@ -5,10 +5,15 @@
|
|||
<object class="GtkEntryBuffer" id="entrybufferProjectName">
|
||||
<property name="max-length">15</property>
|
||||
</object>
|
||||
<object class="GtkFileFilter" id="filefilterProjects">
|
||||
<patterns>
|
||||
<pattern>*.joe</pattern>
|
||||
</patterns>
|
||||
</object>
|
||||
<object class="GtkDialog" id="dialogProjectProperties">
|
||||
<property name="can-focus">False</property>
|
||||
<property name="title" translatable="yes">Project Properties</property>
|
||||
<property name="default-width">300</property>
|
||||
<property name="default-width">400</property>
|
||||
<property name="default-height">200</property>
|
||||
<property name="type-hint">dialog</property>
|
||||
<child internal-child="vbox">
|
||||
|
@ -62,24 +67,12 @@
|
|||
<property name="valign">center</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<!-- n-columns=2 n-rows=2 -->
|
||||
<!-- n-columns=2 n-rows=3 -->
|
||||
<object class="GtkGrid">
|
||||
<property name="visible">True</property>
|
||||
<property name="can-focus">False</property>
|
||||
<property name="row-spacing">15</property>
|
||||
<property name="column-spacing">15</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can-focus">False</property>
|
||||
<property name="halign">end</property>
|
||||
<property name="label" translatable="yes">Project Type:</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left-attach">0</property>
|
||||
<property name="top-attach">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
|
@ -89,7 +82,7 @@
|
|||
</object>
|
||||
<packing>
|
||||
<property name="left-attach">0</property>
|
||||
<property name="top-attach">1</property>
|
||||
<property name="top-attach">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
|
@ -102,7 +95,7 @@
|
|||
</object>
|
||||
<packing>
|
||||
<property name="left-attach">1</property>
|
||||
<property name="top-attach">1</property>
|
||||
<property name="top-attach">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
|
@ -115,15 +108,109 @@
|
|||
<item translatable="yes">Application</item>
|
||||
<item translatable="yes">JoeyLib</item>
|
||||
</items>
|
||||
<signal name="changed" handler="comboProjectTypeChanged" swapped="no"/>
|
||||
<child internal-child="entry">
|
||||
<object class="GtkEntry" id="comboProjectTyp">
|
||||
<object class="GtkEntry">
|
||||
<property name="can-focus">False</property>
|
||||
<property name="text" translatable="yes">Application</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left-attach">1</property>
|
||||
<property name="top-attach">0</property>
|
||||
<property name="top-attach">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can-focus">False</property>
|
||||
<property name="halign">end</property>
|
||||
<property name="label" translatable="yes">Project Type:</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left-attach">0</property>
|
||||
<property name="top-attach">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="can-focus">False</property>
|
||||
<property name="halign">end</property>
|
||||
<property name="valign">start</property>
|
||||
<property name="label" translatable="yes">JoeyLib:</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left-attach">0</property>
|
||||
<property name="top-attach">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can-focus">False</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="GtkRadioButton" id="radioLatest">
|
||||
<property name="label" translatable="yes">Latest Official Build</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can-focus">True</property>
|
||||
<property name="receives-default">False</property>
|
||||
<property name="active">True</property>
|
||||
<property name="draw-indicator">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can-focus">False</property>
|
||||
<child>
|
||||
<object class="GtkRadioButton" id="radioCustom">
|
||||
<property name="label" translatable="yes">Custom:</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can-focus">True</property>
|
||||
<property name="receives-default">False</property>
|
||||
<property name="active">True</property>
|
||||
<property name="draw-indicator">True</property>
|
||||
<property name="group">radioLatest</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkFileChooserButton" id="fileCustom">
|
||||
<property name="visible">True</property>
|
||||
<property name="can-focus">False</property>
|
||||
<property name="filter">filefilterProjects</property>
|
||||
<property name="title" translatable="yes"/>
|
||||
<signal name="file-set" handler="fileCustomSet" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left-attach">1</property>
|
||||
<property name="top-attach">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
|
|
Loading…
Add table
Reference in a new issue