diff --git a/src/Makefile b/src/Makefile index acba34a..251b774 100644 --- a/src/Makefile +++ b/src/Makefile @@ -18,7 +18,7 @@ all: $(TARGETS) todo_OBJS = todo.o callbacks.o main.o todo_CFLAGS = $(CPPFLAGSF) $(CPPFLAGS) $(CFLAGSF) $(CFLAGS) -todo_LDFLAGS = $(LDFLAGSF) $(LDFLAGS) -L $(PREFIX)/lib -Wl,-rpath,$(PREFIX)/lib -lSystem +todo_LDFLAGS = $(LDFLAGSF) $(LDFLAGS) -L $(PREFIX)/lib -Wl,-rpath,$(PREFIX)/lib -lSystem -lDesktop todo: $(todo_OBJS) diff --git a/src/callbacks.c b/src/callbacks.c index 29884a1..a076e5f 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -20,3 +20,49 @@ /* callbacks */ +/* on_closex */ +gboolean on_closex(gpointer data) +{ + Todo * todo = data; + + gtk_main_quit(); + return FALSE; +} + + +/* file menu */ +/* on_file_close */ +void on_file_close(gpointer data) +{ + Todo * todo = data; + + on_closex(todo); +} + + +/* edit menu */ +/* on_edit_delete */ +void on_edit_delete(gpointer data) +{ + Todo * todo = data; + + todo_delete_selection(todo); +} + + +/* on_edit_select_all */ +void on_edit_select_all(gpointer data) +{ + Todo * todo = data; + + todo_select_all(todo); +} + + +/* help menu */ +void on_help_about(gpointer data) +{ + Todo * todo = data; + + /* FIXME implement */ +} diff --git a/src/callbacks.h b/src/callbacks.h index 4709931..e17bdd6 100644 --- a/src/callbacks.h +++ b/src/callbacks.h @@ -18,7 +18,20 @@ #ifndef TODO_CALLBACKS_H # define TODO_CALLBACKS_H +# include + /* callbacks */ +gboolean on_closex(gpointer data); + +/* file menu */ +void on_file_close(gpointer data); + +/* edit menu */ +void on_edit_select_all(gpointer data); +void on_edit_delete(gpointer data); + +/* help menu */ +void on_help_about(gpointer data); #endif /* !TODO_CALLBACKS_H */ diff --git a/src/project.conf b/src/project.conf index a4852ba..7a3ac46 100644 --- a/src/project.conf +++ b/src/project.conf @@ -7,7 +7,7 @@ dist=Makefile,todo.h,callbacks.h [todo] type=binary -ldflags=-L $(PREFIX)/lib -Wl,-rpath,$(PREFIX)/lib -lSystem +ldflags=-L $(PREFIX)/lib -Wl,-rpath,$(PREFIX)/lib -lSystem -lDesktop sources=todo.c,callbacks.c,main.c install=$(BINDIR) diff --git a/src/todo.c b/src/todo.c index 20f8e50..55648d8 100644 --- a/src/todo.c +++ b/src/todo.c @@ -16,7 +16,13 @@ #include +#include +#include #include +#include +#include +#include +#include "callbacks.h" #include "todo.h" @@ -26,26 +32,124 @@ struct _Todo { GtkWidget * window; + GtkWidget * scrolled; + GtkListStore * store; + GtkWidget * view; + GtkWidget * statusbar; +}; + + +/* constants */ +enum { TD_COL_DONE, TD_COL_TITLE }; +#define TD_COL_LAST TD_COL_TITLE +#define TD_NUM_COLS (TD_COL_LAST + 1) + + +/* variables */ +static DesktopMenu _file_menu[] = +{ + { "_Close", G_CALLBACK(on_file_close), GTK_STOCK_CLOSE, GDK_W }, + { NULL, NULL, NULL, 0 } +}; +static DesktopMenu _edit_menu[] = +{ + { "_Delete", G_CALLBACK(on_edit_delete), GTK_STOCK_DELETE, 0 }, + { "", NULL, NULL, 0 }, +#if GTK_CHECK_VERSION(2, 10, 0) + { "_Select all", G_CALLBACK(on_edit_select_all), GTK_STOCK_SELECT_ALL, +#else + { "_Select all", G_CALLBACK(on_edit_select_all), "edit-select-all", +#endif + GDK_A }, + { NULL, NULL, NULL, 0 } +}; +static DesktopMenu _help_menu[] = +{ +#if GTK_CHECK_VERSION(2, 6, 0) + { "_About", G_CALLBACK(on_help_about), GTK_STOCK_ABOUT, 0 }, +#else + { "_About", G_CALLBACK(on_help_about), NULL, 0 }, +#endif + { NULL, NULL, NULL, 0 } +}; +static DesktopMenubar _menubar[] = +{ + { "_File", _file_menu }, + { "_Edit", _edit_menu }, + { "_Help", _help_menu }, + { NULL, NULL }, }; /* public */ /* functions */ /* todo_new */ +static void _new_view(Todo * todo); + Todo * todo_new(void) { Todo * todo; + GtkWidget * vbox; + GtkWidget * widget; if((todo = malloc(sizeof(*todo))) == NULL) + { + error_set_code(1, "%s", strerror(errno)); return NULL; + } + /* main window */ todo->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_default_size(GTK_WINDOW(todo->window), 300, 400); + gtk_window_set_icon_name(GTK_WINDOW(todo->window), "stock_todo"); + gtk_window_set_title(GTK_WINDOW(todo->window), "Todo"); + g_signal_connect_swapped(G_OBJECT(todo->window), "delete-event", + G_CALLBACK(on_closex), todo); + vbox = gtk_vbox_new(FALSE, 0); + /* menubar */ + widget = desktop_menubar_create(_menubar, todo, NULL); + gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, TRUE, 0); + /* toolbar */ + /* view */ + todo->scrolled = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(todo->scrolled), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + _new_view(todo); + gtk_box_pack_start(GTK_BOX(vbox), todo->scrolled, TRUE, TRUE, 0); + /* statusbar */ + todo->statusbar = gtk_statusbar_new(); + gtk_box_pack_start(GTK_BOX(vbox), todo->statusbar, FALSE, TRUE, 0); + gtk_container_add(GTK_CONTAINER(todo->window), vbox); gtk_widget_show_all(todo->window); return todo; } +static void _new_view(Todo * todo) +{ + todo->store = gtk_list_store_new(TD_NUM_COLS, G_TYPE_BOOLEAN, + G_TYPE_STRING); + todo->view = gtk_tree_view_new_with_model(GTK_TREE_MODEL( + todo->store)); + gtk_container_add(GTK_CONTAINER(todo->scrolled), todo->view); +} + /* todo_delete */ void todo_delete(Todo * todo) { free(todo); } + + +/* useful */ +/* todo_delete_selection */ +void todo_delete_selection(Todo * todo) +{ + /* FIXME implement */ +} + + +/* todo_select_all */ +void todo_select_all(Todo * todo) +{ + /* FIXME implement */ +} diff --git a/src/todo.h b/src/todo.h index 3054540..d7b3875 100644 --- a/src/todo.h +++ b/src/todo.h @@ -28,4 +28,8 @@ typedef struct _Todo Todo; Todo * todo_new(void); void todo_delete(Todo * todo); +/* useful */ +void todo_delete_selection(Todo * todo); +void todo_select_all(Todo * todo); + #endif /* !TODO_TODO_H */