Project Properties added.

This commit is contained in:
Scott Duensing 2023-05-10 21:01:32 -05:00
parent b4d06317ab
commit fc0ebb6e3f
7 changed files with 337 additions and 14 deletions

View file

@ -185,6 +185,7 @@ void compilerRunRecipe(CompilerContextT *context, char *recipe, char *input, cha
context->isRunning = TRUE;
g_idle_add(compilerRunRecipeFinished, context);
//***TODO*** There needs to be a way to kill this thread if the recipe runs away.
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
err = pthread_create(&context->thread, &attr, &compilerRunRecipeThread, context);

View file

@ -32,6 +32,7 @@ static char **_pendingMessages = NULL;
static pthread_mutex_t _mtxMessage;
static gboolean messageScroll(gpointer userData);
static gboolean messagesUpdate(gpointer userData);
EVENT gboolean winMessagesClose(GtkWidget *object, gpointer userData);
static void winMessagesDelete(gpointer userData);
@ -70,6 +71,26 @@ void message(MessageTypesT level, char *format, ...) {
}
static gboolean messageScroll(gpointer userData) {
GtkAdjustment *adjustment;
static int count = 100; // Try this many times to scroll.
(void)userData;
//***TODO*** This doesn't always scroll to the very end.
adjustment = gtk_list_box_get_adjustment(GTK_LIST_BOX(_lstMessages));
gtk_adjustment_set_value(adjustment, gtk_adjustment_get_upper(adjustment));
gtk_widget_show_all(_lstMessages);
utilForceUpdate();
count--;
if (count > 0) return G_SOURCE_CONTINUE;
count = 100;
return G_SOURCE_REMOVE;
}
void messageShutdown(void) {
g_idle_remove_by_data(messagesUpdate);
pthread_mutex_destroy(&_mtxMessage);
@ -101,7 +122,6 @@ static gboolean messagesUpdate(gpointer userData) {
GtkWidget *row;
GtkWidget *box;
GtkWidget *label;
GtkAdjustment *adjustment;
char *string = NULL;
(void)userData;
@ -144,14 +164,12 @@ static gboolean messagesUpdate(gpointer userData) {
gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 0);
gtk_container_add(GTK_CONTAINER(row), box);
gtk_list_box_insert(GTK_LIST_BOX(_lstMessages), row, -1);
// Scroll to show new row.
//***TODO*** This doesn't always scroll to the very end.
adjustment = gtk_list_box_get_adjustment(GTK_LIST_BOX(_lstMessages));
gtk_adjustment_set_value(adjustment, gtk_adjustment_get_upper(adjustment));
gtk_widget_show_all(_lstMessages);
utilForceUpdate();
// Scroll to show new row.
g_idle_add(messageScroll, NULL);
DEL(string); // Finally free the string allocated in message().
}
@ -159,6 +177,21 @@ static gboolean messagesUpdate(gpointer userData) {
}
EVENT void toolMessagesClearClicked(GtkWidget *widget, gpointer userData) {
GList *children;
GList *iter;
(void)widget;
(void)userData;
children = gtk_container_get_children(GTK_CONTAINER(_lstMessages));
for (iter = children; iter != NULL; iter = g_list_next(iter)) {
gtk_widget_destroy(GTK_WIDGET(iter->data));
}
g_list_free(children);
}
EVENT gboolean winMessagesClose(GtkWidget *object, gpointer userData) {
// userData is not reliable due to util indirectly calling us.
WindowDataT *self = (WindowDataT *)utilGetWindowData(object);

View file

@ -77,6 +77,8 @@ typedef struct ProjectDataS {
WindowDataT windowData;
GtkWidget *treeProject;
StringHashT **recipes;
char *projectType;
char *projectName;
char *configName;
char *buildHost;
int buildHTTPPort;
@ -133,6 +135,7 @@ EVENT void menuProjectFileSaveAs(GtkWidget *object, gpointer userData);
EVENT void menuProjectFileClose(GtkWidget *object, gpointer userData);
EVENT void menuProjectProjectAdd(GtkWidget *object, gpointer userData);
EVENT void menuProjectProjectRemove(GtkWidget *object, gpointer userData);
EVENT void menuProjectProjectProperties(GtkWidget *object, gpointer userData);
EVENT void menuProjectBuildSettings(GtkWidget *object, gpointer userData);
EVENT void menuProjectBuildTargets(GtkWidget *object, gpointer userData);
EVENT void menuProjectBuildCookRecipes(GtkWidget *object, gpointer userData);
@ -536,6 +539,18 @@ static void loadProject(ProjectDataT *self) {
DEL(raw);
}
// Is this a 'project' line?
if (strcasecmp(c, "project") == 0) {
c = utilGetToken(NULL, " ", "\"", "\"");
utilDequote(c);
DEL(self->projectType);
self->projectType = strdup(c);
c = utilGetToken(NULL, " ", "\"", "\"");
utilDequote(c);
DEL(self->projectName);
self->projectName = strdup(c);
}
}
fclose(in);
DEL(line);
@ -543,6 +558,13 @@ static void loadProject(ProjectDataT *self) {
} else {
message(MSG_SEVERE, "Unknown error attempting to load %s!", self->windowData.filename);
}
if (self->projectType == NULL) {
self->projectType = strdup("Application");
}
if (self->projectName == NULL) {
self->projectName = strdup("None");
}
}
@ -582,6 +604,12 @@ EVENT void menuProjectFileNew(GtkWidget *object, gpointer userData) {
clearRecipeData(self);
// Clear project properties.
DEL(self->projectName);
DEL(self->projectType);
self->projectType = strdup("Application");
self->projectName = strdup("None");
// Nuke filename & mark clean.
DEL(self->windowData.filename);
DEL(self->windowData.path);
@ -626,6 +654,8 @@ EVENT void menuProjectFileSave(GtkWidget *object, gpointer userData) {
// Save! Write out header.
fprintf(out, "%s\n", PROJECT_VERSION);
fprintf(out, "------------------------------------------------------------------------------\n");
// Write out project properties.
fprintf(out, "project \"%s\" \"%s\"\n", self->projectType, self->projectName);
// Write out file list.
gtk_tree_model_get_iter_first(model, &iter);
do {
@ -778,6 +808,60 @@ EVENT void menuProjectProjectRemove(GtkWidget *object, gpointer userData) {
}
EVENT void menuProjectProjectProperties(GtkWidget *object, gpointer userData) {
ProjectDataT *self = (ProjectDataT *)userData;
GtkWidget *dialogProperties;
GtkWidget *comboType;
GtkWidget *txtName;
(void)object;
char *temp = NULL;
char *widgetNames[] = {
"dialogProjectProperties",
"comboProjectType",
"txtProjectName",
NULL
};
GtkWidget **widgets[] = {
&dialogProperties,
&comboType,
&txtName
};
GtkEntryBuffer *buffer;
int result;
utilGetWidgetsFromMemory("/com/kangaroopunch/joeydev/ProjectProperties.glade", widgetNames, widgets, self);
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);
}
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) {
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);
}
temp = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(comboType));
if (strcmp(self->projectType, temp) != 0) {
DEL(self->projectType);
self->projectType = strdup(temp);
utilSetDirty((WindowDataT *)self, TRUE);
}
DEL(temp);
}
gtk_widget_destroy(dialogProperties);
}
EVENT void menuProjectBuildSettings(GtkWidget *object, gpointer userData) {
ProjectDataT *self = (ProjectDataT *)userData;
GtkWidget *dialog;
@ -1021,9 +1105,9 @@ EVENT void menuProjectBuildBuild(GtkWidget *object, gpointer userData) {
return;
}
// Write what we're building.
fprintf(out, "application\n"); //***TODO*** We don't know how to handle other types yet.
fprintf(out, "%s\n", self->projectType);
// Write it's title.
fprintf(out, "%s\n", "CRAP - MISSING!"); //***TODO*** Collect and remember project name! Derp!
fprintf(out, "%s\n", self->projectName);
// Write desired build targets.
for (i=0; i<arrlen(self->targets); i++) {
archPrinted = FALSE;

View file

@ -6,8 +6,40 @@
<property name="can-focus">False</property>
<property name="title" translatable="yes">Messages</property>
<property name="default-width">800</property>
<property name="default-height">300</property>
<property name="default-height">350</property>
<property name="icon-name">emblem-documents</property>
<signal name="delete-event" handler="winMessagesClose" swapped="no"/>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkToolbar">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkToolButton" id="toolMessagesClear">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="tooltip-text" translatable="yes">Clear all messages</property>
<property name="label" translatable="yes">Clear</property>
<property name="use-underline">True</property>
<property name="icon-name">edit-delete</property>
<signal name="clicked" handler="toolMessagesClearClicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow">
<property name="visible">True</property>
@ -26,6 +58,13 @@
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</interface>

View file

@ -117,6 +117,21 @@
<accelerator key="Delete" signal="activate"/>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem">
<property name="visible">True</property>
<property name="can-focus">False</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="menuProjectProjectProperties">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Properties...</property>
<property name="use-underline">True</property>
<signal name="activate" handler="menuProjectProjectProperties" swapped="no"/>
</object>
</child>
</object>
</child>
</object>

150
ui/ProjectProperties.glade Normal file
View file

@ -0,0 +1,150 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.40.0 -->
<interface>
<requires lib="gtk+" version="3.24"/>
<object class="GtkEntryBuffer" id="entrybufferProjectName">
<property name="max-length">15</property>
</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-height">200</property>
<property name="type-hint">dialog</property>
<child internal-child="vbox">
<object class="GtkBox">
<property name="can-focus">False</property>
<property name="margin-start">15</property>
<property name="margin-end">15</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
<child internal-child="action_area">
<object class="GtkButtonBox">
<property name="can-focus">False</property>
<property name="layout-style">end</property>
<child>
<object class="GtkButton" id="button1">
<property name="label" translatable="yes">Cancel</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button2">
<property name="label" translatable="yes">OK</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="valign">center</property>
<property name="orientation">vertical</property>
<child>
<!-- n-columns=2 n-rows=2 -->
<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>
<property name="can-focus">False</property>
<property name="halign">end</property>
<property name="label" translatable="yes">Project Name: </property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">1</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="txtProjectName">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="buffer">entrybufferProjectName</property>
<property name="max-length">15</property>
<property name="input-purpose">alpha</property>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">1</property>
</packing>
</child>
<child>
<object class="GtkComboBoxText" id="comboProjectType">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="active">0</property>
<property name="has-entry">True</property>
<items>
<item translatable="yes">Application</item>
<item translatable="yes">JoeyLib</item>
</items>
<child internal-child="entry">
<object class="GtkEntry" id="comboProjectTyp">
<property name="can-focus">False</property>
</object>
</child>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">0</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
<action-widgets>
<action-widget response="-6">button1</action-widget>
<action-widget response="-5">button2</action-widget>
</action-widgets>
</object>
</interface>

View file

@ -3,6 +3,7 @@
<gresource prefix="/com/kangaroopunch/joeydev">
<file compressed="true" preprocess="xml-stripblanks">JoeyDev.glade</file>
<file compressed="true" preprocess="xml-stripblanks">Project.glade</file>
<file compressed="true" preprocess="xml-stripblanks">ProjectProperties.glade</file>
<file compressed="true" preprocess="xml-stripblanks">BuildServer.glade</file>
<file compressed="true" preprocess="xml-stripblanks">Cook.glade</file>
<file compressed="true" preprocess="xml-stripblanks">Editor.glade</file>