Added url support, added editor support, removed userlist creation (now in mcp package), added gm_world_view_text_view, added gm_world_view_hpaned
This commit is contained in:
parent
cff2221dcd
commit
2e328471b9
|
@ -5,8 +5,13 @@
|
|||
#include "gm-world-text-view.h"
|
||||
#include "gm-world-input-view.h"
|
||||
#include "gm-text-scroller.h"
|
||||
#include "gm-editor-view.h"
|
||||
#include "../gm-debug.h"
|
||||
#include "../gm-support.h"
|
||||
#include "../gm-color-table.h"
|
||||
#include "../mcp/gm-mcp-package.h"
|
||||
#include "../mcp/gm-mcp-session.h"
|
||||
#include "../gm-editor.h"
|
||||
|
||||
#define GM_WORLD_VIEW_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE((object), \
|
||||
GM_TYPE_WORLD_VIEW, GmWorldViewPrivate))
|
||||
|
@ -16,21 +21,11 @@ struct _GmWorldViewPrivate {
|
|||
|
||||
GtkStatusbar *statusbar;
|
||||
GtkHPaned *hpaned;
|
||||
GtkTreeView *tree_view_userlist;
|
||||
GtkTreeModel *tree_model_userlist;
|
||||
GmWorldTextView *text_view_world;
|
||||
GmWorldInputView *text_view_input;
|
||||
GmTextScroller *text_scroller_world;
|
||||
};
|
||||
|
||||
enum {
|
||||
GM_WORLD_VIEW_USERLIST_ICON,
|
||||
GM_WORLD_VIEW_USERLIST_NAME,
|
||||
GM_WORLD_VIEW_USERLIST_OBJ,
|
||||
GM_WORLD_VIEW_USERLIST_SORT,
|
||||
GM_WORLD_VIEW_USERLIST_N_COLUMNS
|
||||
};
|
||||
|
||||
void on_gm_world_view_world_text_received(GmWorld *world, gchar *text,
|
||||
GmWorldView *view);
|
||||
void on_gm_world_view_world_error(GmWorld *world, gchar *text, gint code,
|
||||
|
@ -41,11 +36,22 @@ void on_gm_world_view_world_state_changing(GmWorld *world, guint state,
|
|||
GmWorldView *view);
|
||||
void on_gm_world_view_world_active_changed(GmWorld *world, gboolean active,
|
||||
GmWorldView *view);
|
||||
void on_gm_world_view_world_status_changed(GmWorld *world, gchar const *text,
|
||||
GmWorldView *view);
|
||||
|
||||
void on_gm_world_view_world_editor_added(GmWorld *world, GmEditor *editor,
|
||||
GmWorldView *view);
|
||||
void on_gm_world_view_world_editor_removed(GmWorld *world, GmEditor *editor,
|
||||
GmWorldView *view);
|
||||
|
||||
void on_gm_world_view_world_mcp_package_created(GmMcpSession *session,
|
||||
GmMcpPackage *package, GmWorldView *view);
|
||||
|
||||
void on_gm_world_view_editor_view_modified_changed(GmEditorView *editor_view,
|
||||
gboolean modified, GmWorldView *view);
|
||||
gboolean on_gm_world_view_world_text_view_scroll_event(GmWorldView *view,
|
||||
GdkEventScroll *event, GmWorldTextView *text);
|
||||
void on_gm_world_view_world_text_view_url_activate(GmWorldView *view,
|
||||
gchar const *url);
|
||||
|
||||
gboolean on_gm_world_view_world_input_view_key_pressed(GtkWidget *widget,
|
||||
GdkEventKey *event, GmWorldView *view);
|
||||
|
||||
|
@ -72,7 +78,13 @@ gm_world_view_finalize(GObject *object) {
|
|||
g_signal_handlers_disconnect_by_func(view->priv->world,
|
||||
G_CALLBACK(on_gm_world_view_world_active_changed), view);
|
||||
g_signal_handlers_disconnect_by_func(view->priv->world,
|
||||
G_CALLBACK(on_gm_world_view_world_status_changed), view);
|
||||
G_CALLBACK(on_gm_world_view_world_editor_added), view);
|
||||
g_signal_handlers_disconnect_by_func(view->priv->world,
|
||||
G_CALLBACK(on_gm_world_view_world_editor_removed), view);
|
||||
|
||||
g_signal_handlers_disconnect_by_func(
|
||||
gm_world_get_mcp_session(view->priv->world),
|
||||
G_CALLBACK(on_gm_world_view_world_mcp_package_created), view);
|
||||
|
||||
g_object_unref(view->priv->world);
|
||||
G_OBJECT_CLASS(gm_world_view_parent_class)->finalize(object);
|
||||
|
@ -87,57 +99,6 @@ gm_world_view_class_init(GmWorldViewClass *klass) {
|
|||
g_type_class_add_private(object_class, sizeof(GmWorldViewPrivate));
|
||||
}
|
||||
|
||||
GtkTreeModel *
|
||||
gm_world_view_userlist_model_new(GmWorldView *view) {
|
||||
GtkListStore *store =
|
||||
gtk_list_store_new(GM_WORLD_VIEW_USERLIST_N_COLUMNS, GDK_TYPE_PIXBUF,
|
||||
G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING);
|
||||
GtkTreeModel *model = gtk_tree_model_sort_new_with_model(
|
||||
GTK_TREE_MODEL(store));
|
||||
|
||||
view->priv->tree_model_userlist = model;
|
||||
return model;
|
||||
}
|
||||
|
||||
GtkWidget *
|
||||
gm_world_view_userlist_new(GmWorldView *view) {
|
||||
GtkWidget *scrolled_window = gtk_scrolled_window_new(NULL, NULL);
|
||||
GtkTreeModel *model = gm_world_view_userlist_model_new(view);
|
||||
GtkWidget *tree_view = gtk_tree_view_new_with_model(model);
|
||||
GtkCellRenderer *renderer;
|
||||
GtkTreeViewColumn *column;
|
||||
|
||||
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
|
||||
GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
|
||||
gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window),
|
||||
GTK_SHADOW_IN);
|
||||
gtk_widget_set_size_request(scrolled_window, 150, -1);
|
||||
gtk_widget_set_size_request(tree_view, 150, -1);
|
||||
|
||||
gtk_container_add(GTK_CONTAINER(scrolled_window), tree_view);
|
||||
|
||||
renderer = gtk_cell_renderer_pixbuf_new();
|
||||
column = gtk_tree_view_column_new_with_attributes(_("I"), renderer, "pixbuf",
|
||||
GM_WORLD_VIEW_USERLIST_ICON, NULL);
|
||||
gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), column);
|
||||
gtk_tree_view_column_set_min_width(column, 30);
|
||||
|
||||
renderer = gtk_cell_renderer_text_new();
|
||||
column = gtk_tree_view_column_new_with_attributes(_("Name"), renderer,
|
||||
"text", GM_WORLD_VIEW_USERLIST_NAME, NULL);
|
||||
gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), column);
|
||||
|
||||
gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(model),
|
||||
GM_WORLD_VIEW_USERLIST_SORT, GTK_SORT_ASCENDING);
|
||||
|
||||
GTK_WIDGET_UNSET_FLAGS(GTK_WIDGET(tree_view), GTK_CAN_FOCUS);
|
||||
gtk_tree_view_columns_autosize(GTK_TREE_VIEW(tree_view));
|
||||
gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree_view), FALSE);
|
||||
view->priv->tree_view_userlist = GTK_TREE_VIEW(tree_view);
|
||||
|
||||
return scrolled_window;
|
||||
}
|
||||
|
||||
GtkWidget *
|
||||
gm_world_view_create_input_text_view(GmWorldView *view) {
|
||||
GtkWidget *scrolled_window = gtk_scrolled_window_new(NULL, NULL);
|
||||
|
@ -178,6 +139,9 @@ gm_world_view_create_world_text_view(GmWorldView *view) {
|
|||
|
||||
g_signal_connect(world_text_view, "scroll_event",
|
||||
G_CALLBACK(on_gm_world_view_world_text_view_scroll_event), view);
|
||||
g_signal_connect(world_text_view, "url_activate",
|
||||
G_CALLBACK(on_gm_world_view_world_text_view_url_activate), view);
|
||||
|
||||
return scrolled_window;
|
||||
}
|
||||
|
||||
|
@ -194,6 +158,38 @@ gm_world_view_update_status(GmWorldView *view, gchar const *status) {
|
|||
}
|
||||
}
|
||||
|
||||
GmEditorView *
|
||||
gm_world_view_editor_page_new(GmWorldView *view, GmEditor *editor) {
|
||||
GmEditorView *editor_view = gm_editor_view_new(view->priv->world, editor);
|
||||
GtkWidget *label;
|
||||
GmLabelInfo info;
|
||||
gchar const *icon;
|
||||
|
||||
if (gm_editor_is_code(editor)) {
|
||||
icon = "editor_verb.xpm";
|
||||
} else {
|
||||
icon = "editor_text.xpm";
|
||||
}
|
||||
|
||||
gtk_widget_show(GTK_WIDGET(editor_view));
|
||||
label = gm_create_tab_label("editor_verb.xpm", gm_editor_name(editor),
|
||||
TRUE, &info);
|
||||
gtk_notebook_append_page(GTK_NOTEBOOK(view), GTK_WIDGET(editor_view),
|
||||
label);
|
||||
gtk_notebook_set_show_tabs(GTK_NOTEBOOK(view), TRUE);
|
||||
gtk_notebook_set_current_page(GTK_NOTEBOOK(view),
|
||||
gtk_notebook_page_num(GTK_NOTEBOOK(view),
|
||||
GTK_WIDGET(editor_view)));
|
||||
|
||||
GM_DEBUG("Connecting modified changed!!!");
|
||||
|
||||
g_signal_connect(editor_view, "modified-changed",
|
||||
G_CALLBACK(on_gm_world_view_editor_view_modified_changed),
|
||||
view);
|
||||
|
||||
return editor_view;
|
||||
}
|
||||
|
||||
GtkWidget *
|
||||
gm_world_view_world_page_new(GmWorldView *view) {
|
||||
GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
|
||||
|
@ -208,8 +204,6 @@ gm_world_view_world_page_new(GmWorldView *view) {
|
|||
|
||||
gtk_container_set_border_width(GTK_CONTAINER(vbox_world), 3);
|
||||
gtk_paned_pack1(GTK_PANED(hpaned), vbox_world, TRUE, TRUE);
|
||||
gtk_paned_pack2(GTK_PANED(hpaned), gm_world_view_userlist_new(view),
|
||||
FALSE, TRUE);
|
||||
|
||||
gtk_statusbar_set_has_resize_grip(GTK_STATUSBAR(status), FALSE);
|
||||
|
||||
|
@ -231,7 +225,7 @@ gm_world_view_init(GmWorldView *view) {
|
|||
|
||||
view->priv = GM_WORLD_VIEW_GET_PRIVATE(view);
|
||||
|
||||
gtk_notebook_set_show_tabs(GTK_NOTEBOOK(view), FALSE);
|
||||
gtk_notebook_set_show_tabs(GTK_NOTEBOOK(view), TRUE);
|
||||
gtk_notebook_set_show_border(GTK_NOTEBOOK(view), FALSE);
|
||||
gtk_notebook_set_tab_pos(GTK_NOTEBOOK(view), GTK_POS_BOTTOM);
|
||||
gtk_notebook_set_scrollable(GTK_NOTEBOOK(view), TRUE);
|
||||
|
@ -277,8 +271,13 @@ gm_world_view_new(GmWorld *world) {
|
|||
G_CALLBACK(on_gm_world_view_world_state_changing), view);
|
||||
g_signal_connect(world, "active_changed",
|
||||
G_CALLBACK(on_gm_world_view_world_active_changed), view);
|
||||
g_signal_connect(world, "status_changed",
|
||||
G_CALLBACK(on_gm_world_view_world_status_changed), view);
|
||||
g_signal_connect(world, "editor_added",
|
||||
G_CALLBACK(on_gm_world_view_world_editor_added), view);
|
||||
g_signal_connect(world, "editor_removed",
|
||||
G_CALLBACK(on_gm_world_view_world_editor_removed), view);
|
||||
|
||||
g_signal_connect(gm_world_get_mcp_session(world), "package_created",
|
||||
G_CALLBACK(on_gm_world_view_world_mcp_package_created), view);
|
||||
|
||||
g_signal_connect(view->priv->text_view_input, "text_activate",
|
||||
G_CALLBACK(on_gm_world_input_view_world_text_activate), view);
|
||||
|
@ -392,14 +391,24 @@ gm_world_view_input(GmWorldView *view) {
|
|||
return view->priv->text_view_input;
|
||||
}
|
||||
|
||||
GmWorldTextView *
|
||||
gm_world_view_text_view(GmWorldView *view) {
|
||||
return view->priv->text_view_world;
|
||||
}
|
||||
|
||||
GtkTextBuffer *
|
||||
gm_world_view_buffer(GmWorldView *view) {
|
||||
return gtk_text_view_get_buffer(GTK_TEXT_VIEW(view->priv->text_view_world));
|
||||
}
|
||||
|
||||
GtkHPaned *
|
||||
gm_world_view_hpaned(GmWorldView *view) {
|
||||
return view->priv->hpaned;
|
||||
}
|
||||
|
||||
void
|
||||
gm_world_view_open_log(GmWorldView *view, const gchar *filename,
|
||||
OpenLogProgress callback, gpointer user_data) {
|
||||
gm_world_view_open_log(GmWorldView *view, const gchar *filename) {
|
||||
// TODO: open log
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -448,6 +457,74 @@ on_gm_world_view_world_text_received(GmWorld *world, gchar *text,
|
|||
g_free(inserted);
|
||||
}
|
||||
|
||||
void
|
||||
on_gm_world_view_editor_save(GmEditor *editor, GmWorldView *view) {
|
||||
gtk_notebook_set_current_page(GTK_NOTEBOOK(view), 0);
|
||||
gtk_widget_grab_focus(GTK_WIDGET(view->priv->text_view_input));
|
||||
}
|
||||
|
||||
void
|
||||
on_gm_world_view_editor_view_modified_changed(GmEditorView *editor_view,
|
||||
gboolean modified, GmWorldView *view) {
|
||||
gint i, n = gtk_notebook_get_n_pages(GTK_NOTEBOOK(view));
|
||||
GtkWidget *page;
|
||||
GtkLabel *label;
|
||||
gchar *str;
|
||||
|
||||
// Find this view then
|
||||
for (i = 1; i < n; ++i) {
|
||||
page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(view), i);
|
||||
|
||||
if (GM_IS_EDITOR_VIEW(page) && GM_EDITOR_VIEW(page) == editor_view) {
|
||||
label = GTK_LABEL(gm_container_item(GTK_CONTAINER(
|
||||
gtk_notebook_get_tab_label(GTK_NOTEBOOK(view), page)),
|
||||
GTK_TYPE_LABEL));
|
||||
|
||||
if (!modified) {
|
||||
gtk_label_set_label(label,
|
||||
gm_editor_name(gm_editor_view_editor(
|
||||
GM_EDITOR_VIEW(page))));
|
||||
} else {
|
||||
str = g_strconcat(gm_editor_name(gm_editor_view_editor(
|
||||
GM_EDITOR_VIEW(page))), "*", NULL);
|
||||
gtk_label_set_label(label, str);
|
||||
g_free(str);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
on_gm_world_view_world_editor_added(GmWorld *world, GmEditor *editor,
|
||||
GmWorldView *view) {
|
||||
gm_world_view_editor_page_new(view, editor);
|
||||
|
||||
g_signal_connect(editor, "save",
|
||||
G_CALLBACK(on_gm_world_view_editor_save), view);
|
||||
}
|
||||
|
||||
void
|
||||
on_gm_world_view_world_editor_removed(GmWorld *world, GmEditor *editor,
|
||||
GmWorldView *view) {
|
||||
gint i, n = gtk_notebook_get_n_pages(GTK_NOTEBOOK(view));
|
||||
GtkWidget *page;
|
||||
|
||||
for (i = 1; i < n; ++i) {
|
||||
page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(view), i);
|
||||
|
||||
if (GM_IS_EDITOR_VIEW(page) && gm_editor_view_editor(
|
||||
GM_EDITOR_VIEW(page)) == editor) {
|
||||
|
||||
g_signal_handlers_disconnect_by_func(editor,
|
||||
on_gm_world_view_editor_save, view);
|
||||
gtk_widget_destroy(page);
|
||||
|
||||
gtk_notebook_set_current_page(GTK_NOTEBOOK(view), 0);
|
||||
gtk_widget_grab_focus(GTK_WIDGET(view->priv->text_view_input));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
on_gm_world_view_world_error(GmWorld *world, gchar *text, gint code,
|
||||
GmWorldView *view) {
|
||||
|
@ -492,6 +569,7 @@ on_gm_world_view_world_state_changing(GmWorld *world, guint state,
|
|||
pstate == GM_NET_STATE_DISCONNECTING) {
|
||||
line = g_strdup(_("# Disconnected"));
|
||||
}
|
||||
gm_world_view_update_status(view, NULL);
|
||||
break;
|
||||
case GM_NET_STATE_DISCONNECTING:
|
||||
line = g_strdup(_("# Disconnecting"));
|
||||
|
@ -514,12 +592,6 @@ on_gm_world_view_world_active_changed(GmWorld *world, gboolean active,
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
on_gm_world_view_world_status_changed(GmWorld *world, gchar const *text,
|
||||
GmWorldView *view) {
|
||||
gm_world_view_update_status(view, text);
|
||||
}
|
||||
|
||||
gboolean on_gm_world_view_world_text_view_scroll_event(GmWorldView *view,
|
||||
GdkEventScroll *event, GmWorldTextView *text) {
|
||||
if (event->state & GDK_CONTROL_MASK) {
|
||||
|
@ -556,8 +628,9 @@ on_gm_world_view_world_input_view_key_pressed(GtkWidget *widget,
|
|||
gm_text_scroller_scroll_begin(
|
||||
view->priv->text_scroller_world);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
return TRUE;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -565,3 +638,15 @@ on_gm_world_view_world_input_view_key_pressed(GtkWidget *widget,
|
|||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void
|
||||
on_gm_world_view_world_mcp_package_created(GmMcpSession *session,
|
||||
GmMcpPackage *package, GmWorldView *view) {
|
||||
gm_mcp_package_create_view(package, G_OBJECT(view));
|
||||
}
|
||||
|
||||
void
|
||||
on_gm_world_view_world_text_view_url_activate(GmWorldView *view,
|
||||
gchar const *url) {
|
||||
gm_open_url(url);
|
||||
}
|
||||
|
|
Reference in New Issue