ladish/clients/panel/project.c

316 lines
11 KiB
C

/* LASH Control Panel
* Copyright (C) 2006 Dave Robillard <drobilla@connect.carleton.ca>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "project.h"
#include <malloc.h>
#include <lash/lash.h>
#include <assert.h>
#include <unistd.h>
/* Button callbacks */
void
save_cb(GtkButton * button, void *data)
{
project_t *project = (project_t *) data;
lash_event_t *event = lash_event_new_with_type(LASH_Save);
lash_event_set_project(event, project->name);
lash_send_event(project->lash_client, event);
printf("Told server to save project %s\n", project->name);
}
void
close_cb(GtkButton * button, void *data)
{
project_t *project = (project_t *) data;
lash_event_t *event = lash_event_new_with_type(LASH_Project_Remove);
lash_event_set_project(event, project->name);
lash_send_event(project->lash_client, event);
printf("Told server to close project %s\n", project->name);
}
void
set_dir_cb(GtkButton * button, void *data)
{
project_t *project = (project_t *) data;
int response = GTK_RESPONSE_NONE;
char *filename = NULL;
lash_event_t *event = NULL;
GtkWidget *open_dialog =
gtk_file_chooser_dialog_new("Set Project Directory", NULL,
GTK_FILE_CHOOSER_ACTION_SAVE,
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
GTK_STOCK_OK, GTK_RESPONSE_OK, NULL);
response = gtk_dialog_run(GTK_DIALOG(open_dialog));
if (response == GTK_RESPONSE_OK) {
filename =
gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(open_dialog));
project_set_dir(project, filename);
event = lash_event_new_with_type(LASH_Project_Dir);
lash_event_set_project(event, project->name);
lash_event_set_string(event, filename);
lash_send_event(project->lash_client, event);
printf("Told server to set project directory %s\n", filename);
}
gtk_widget_destroy(open_dialog);
}
void
set_name_cb(GtkEntry * entry, void *data)
{
project_t *project = (project_t *) data;
lash_event_t *event = NULL;
const char *new_name = gtk_entry_get_text(GTK_ENTRY(project->name_entry));
printf("Name changed: %s\n", new_name);
event = lash_event_new_with_type(LASH_Project_Name);
lash_event_set_project(event, project->name);
lash_event_set_string(event, new_name);
lash_send_event(project->lash_client, event);
}
/* Project */
project_t *
project_create(lash_client_t * lash_client, const char *const name)
{
project_t *project = (project_t *) malloc(sizeof(project_t));
project->lash_client = lash_client;
project->name = NULL;
project->dir = NULL;
project->page_number = -1;
project->box = gtk_vbox_new(FALSE, 6);
gtk_widget_show(project->box);
gtk_container_set_border_width(GTK_CONTAINER(project->box), 8);
project->tab_label = gtk_label_new("Unnamed project");
gtk_widget_show(project->tab_label);
/* Clients header */
project->clients_label =
gtk_label_new("<span weight=\"bold\">Clients</span>");
gtk_widget_show(project->clients_label);
gtk_misc_set_alignment(GTK_MISC(project->clients_label), 0.0, 0.5);
gtk_label_set_use_markup(GTK_LABEL(project->clients_label), TRUE);
gtk_box_pack_start(GTK_BOX(project->box), project->clients_label, FALSE,
FALSE, 0);
project->clients_align_box = gtk_hbox_new(FALSE, 2);
gtk_widget_show(project->clients_align_box);
project->clients_align_label = gtk_label_new(" ");
gtk_widget_show(project->clients_align_label);
gtk_box_pack_start(GTK_BOX(project->clients_align_box),
project->clients_align_label, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(project->box), project->clients_align_box,
TRUE, TRUE, 0);
project->clients_list_scroll = gtk_scrolled_window_new(NULL, NULL);
gtk_widget_show(project->clients_list_scroll);
gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(project->clients_list_scroll),
GTK_SHADOW_IN);
gtk_box_pack_start(GTK_BOX(project->clients_align_box),
project->clients_list_scroll, TRUE, TRUE, 0);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW
(project->clients_list_scroll),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
/* Properties header */
project->properties_label =
gtk_label_new("<span weight=\"bold\">Properties</span>");
gtk_widget_show(project->properties_label);
gtk_misc_set_alignment(GTK_MISC(project->properties_label), 0.0, 0.5);
gtk_label_set_use_markup(GTK_LABEL(project->properties_label), TRUE);
gtk_box_pack_start(GTK_BOX(project->box), project->properties_label,
FALSE, FALSE, 0);
/* Properties table */
project->properties_table = gtk_table_new(2, 3, FALSE);
gtk_widget_show(project->properties_table);
gtk_box_pack_start(GTK_BOX(project->box), project->properties_table,
FALSE, TRUE, 0);
/* Name label */
project->name_label = gtk_label_new(" Name: ");
gtk_misc_set_alignment(GTK_MISC(project->name_label), 0.0, 0.5);
gtk_widget_show(project->name_label);
gtk_table_attach(GTK_TABLE(project->properties_table),
project->name_label, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 2, 2);
project->name_entry = gtk_entry_new();
gtk_entry_set_editable(GTK_ENTRY(project->name_entry), TRUE);
gtk_widget_show(project->name_entry);
g_signal_connect(G_OBJECT(project->name_entry), "activate",
G_CALLBACK(set_name_cb), project);
gtk_table_attach(GTK_TABLE(project->properties_table),
project->name_entry, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL,
0, 2, 2);
project->set_name_button = gtk_button_new_with_label("Apply");
gtk_widget_show(project->set_name_button);
g_signal_connect(G_OBJECT(project->set_name_button), "clicked",
G_CALLBACK(set_name_cb), project);
gtk_table_attach(GTK_TABLE(project->properties_table),
project->set_name_button, 2, 3, 0, 1, GTK_FILL, GTK_FILL,
2, 2);
/* Directory label */
project->dir_label = gtk_label_new(" Directory: ");
gtk_misc_set_alignment(GTK_MISC(project->dir_label), 0.0, 0.5);
gtk_widget_show(project->dir_label);
gtk_table_attach(GTK_TABLE(project->properties_table), project->dir_label,
0, 1, 1, 2, GTK_FILL, GTK_FILL, 2, 2);
project->dir_entry = gtk_entry_new();
gtk_entry_set_editable(GTK_ENTRY(project->dir_entry), FALSE);
gtk_widget_show(project->dir_entry);
gtk_table_attach(GTK_TABLE(project->properties_table), project->dir_entry,
1, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 2);
project->set_dir_button = gtk_button_new_with_label("Move...");
gtk_widget_show(project->set_dir_button);
g_signal_connect(G_OBJECT(project->set_dir_button), "clicked",
G_CALLBACK(set_dir_cb), project);
gtk_table_attach(GTK_TABLE(project->properties_table),
project->set_dir_button, 2, 3, 1, 2, GTK_FILL, GTK_FILL,
2, 2);
/* Buttons */
project->clients_button_box = gtk_hbutton_box_new();
gtk_widget_show(project->clients_button_box);
gtk_button_box_set_layout(GTK_BUTTON_BOX(project->clients_button_box),
GTK_BUTTONBOX_END);
gtk_button_box_set_spacing(GTK_BUTTON_BOX(project->clients_button_box),
4);
gtk_box_pack_start(GTK_BOX(project->box), project->clients_button_box,
FALSE, TRUE, 4);
/* Close button */
project->close_button = gtk_button_new_with_label("Close Project");
gtk_button_set_image(GTK_BUTTON(project->close_button),
gtk_image_new_from_stock(GTK_STOCK_CLOSE, GTK_ICON_SIZE_BUTTON));
gtk_widget_show(project->close_button);
g_signal_connect(G_OBJECT(project->close_button), "clicked",
G_CALLBACK(close_cb), project);
gtk_box_pack_start(GTK_BOX(project->clients_button_box),
project->close_button, FALSE, TRUE, 6);
/* Save button */
project->save_button = gtk_button_new_with_label("Save Project");
gtk_button_set_image(GTK_BUTTON(project->save_button),
gtk_image_new_from_stock(GTK_STOCK_SAVE, GTK_ICON_SIZE_BUTTON));
gtk_widget_show(project->save_button);
g_signal_connect(G_OBJECT(project->save_button), "clicked",
G_CALLBACK(save_cb), project);
gtk_box_pack_start(GTK_BOX(project->clients_button_box),
project->save_button, FALSE, TRUE, 6);
/* Client list */
project->clients = gtk_list_store_new(CLIENT_NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING);
project->clients_list =
gtk_tree_view_new_with_model(GTK_TREE_MODEL(project->clients));
gtk_widget_show(project->clients_list);
gtk_container_add(GTK_CONTAINER(project->clients_list_scroll),
project->clients_list);
/* Name column */
project->clients_renderer = gtk_cell_renderer_text_new();
project->name_column =
gtk_tree_view_column_new_with_attributes("Name",
project->clients_renderer,
"text", CLIENT_NAME_COLUMN,
NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(project->clients_list),
project->name_column);
/* ID column */
project->id_column =
gtk_tree_view_column_new_with_attributes("ID",
project->clients_renderer,
"text", CLIENT_ID_COLUMN,
NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(project->clients_list),
project->id_column);
/* Set name (field and tab label) */
project_set_name(project, name);
return project;
}
void
project_destroy(project_t * project)
{
assert(project != NULL);
free(project->name);
/* FIXME: getting warnings/segfault here
* gtk_widget_destroy(project->box);
* gtk_widget_destroy(project->tab_label);
*
* gtk_widget_destroy(project->clients_label);
* gtk_widget_destroy(project->clients_align_box);
* gtk_widget_destroy(project->clients_align_label);
* gtk_widget_destroy(project->clients_list);
* gtk_widget_destroy(project->clients_list_scroll);
* gtk_object_destroy(GTK_OBJECT(project->clients_renderer));
* gtk_object_destroy(GTK_OBJECT(project->name_column));
* gtk_object_destroy(GTK_OBJECT(project->id_column));
* gtk_widget_destroy(project->clients_button_box);
* gtk_widget_destroy(project->save_button);
* gtk_widget_destroy(project->close_button); */
free(project);
}
void
project_set_name(project_t * project, const char *const name)
{
assert(project != NULL);
assert(name != NULL);
free(project->name);
project->name = calloc(strlen(name) + 1, sizeof(char));
strncpy(project->name, name, strlen(name) + 1);
gtk_label_set_text(GTK_LABEL(project->tab_label), project->name);
gtk_entry_set_text(GTK_ENTRY(project->name_entry), project->name);
}
void
project_set_dir(project_t * project, const char *const dir)
{
assert(project != NULL);
free(project->dir);
project->dir = calloc(strlen(dir) + 1, sizeof(char));
strncpy(project->dir, dir, strlen(dir) + 1);
gtk_entry_set_text(GTK_ENTRY(project->dir_entry), project->dir);
}