mirror of
https://github.com/UberGames/GtkRadiant.git
synced 2025-04-25 00:15:09 +00:00
- Changed ETB tag toolbar to a notebook with tag/texture pages (Shaderman)
- Added a context menu (add/delete/rename tag) to the ETB tag tree view (Shaderman) - Added new win32 installer HOWTO (Shaderman/Topsun) git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/trunk@110 8a3a26a2-13c4-0310-b231-cf6edde360e5
This commit is contained in:
parent
495d93b083
commit
04dca548d1
4 changed files with 371 additions and 302 deletions
6
CHANGES
6
CHANGES
|
@ -1,6 +1,12 @@
|
||||||
This is the changelog for developers, != changelog for the end user
|
This is the changelog for developers, != changelog for the end user
|
||||||
that we distribute with the binaries. (see changelog)
|
that we distribute with the binaries. (see changelog)
|
||||||
|
|
||||||
|
03/10/2006
|
||||||
|
namespace
|
||||||
|
- Changed ETB tag toolbar to a notebook with tag/texture pages (Shaderman)
|
||||||
|
- Added a context menu (add/delete/rename tag) to the ETB tag tree view (Shaderman)
|
||||||
|
- Added new win32 installer HOWTO (Shaderman/Topsun)
|
||||||
|
|
||||||
01/10/2006
|
01/10/2006
|
||||||
namespace
|
namespace
|
||||||
- Added missing xml files for win32 installer
|
- Added missing xml files for win32 installer
|
||||||
|
|
|
@ -231,6 +231,8 @@ public:
|
||||||
GtkWidget* m_available_tree;
|
GtkWidget* m_available_tree;
|
||||||
GtkWidget* m_scr_win_tree;
|
GtkWidget* m_scr_win_tree;
|
||||||
GtkWidget* m_scr_win_tags;
|
GtkWidget* m_scr_win_tags;
|
||||||
|
GtkWidget* m_tag_notebook;
|
||||||
|
GtkWidget* m_search_button;
|
||||||
GtkWidget* m_shader_info_item;
|
GtkWidget* m_shader_info_item;
|
||||||
|
|
||||||
std::set<CopiedString> m_all_tags;
|
std::set<CopiedString> m_all_tags;
|
||||||
|
@ -265,7 +267,6 @@ public:
|
||||||
bool m_rmbSelected;
|
bool m_rmbSelected;
|
||||||
bool m_searchedTags;
|
bool m_searchedTags;
|
||||||
bool m_tags;
|
bool m_tags;
|
||||||
bool m_showTags;
|
|
||||||
|
|
||||||
TextureBrowser() :
|
TextureBrowser() :
|
||||||
m_texture_scroll(0),
|
m_texture_scroll(0),
|
||||||
|
@ -284,8 +285,7 @@ public:
|
||||||
m_hideUnused(false),
|
m_hideUnused(false),
|
||||||
m_rmbSelected(false),
|
m_rmbSelected(false),
|
||||||
m_searchedTags(false),
|
m_searchedTags(false),
|
||||||
m_tags(false),
|
m_tags(false)
|
||||||
m_showTags(false)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -1530,11 +1530,60 @@ void TextureBrowser_createTreeViewTree()
|
||||||
TextureBrowser_constructTreeStore();
|
TextureBrowser_constructTreeStore();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TextureBrowser_addTag();
|
||||||
|
void TextureBrowser_renameTag();
|
||||||
|
void TextureBrowser_deleteTag();
|
||||||
|
|
||||||
|
void TextureBrowser_createContextMenu(GtkWidget *treeview, GdkEventButton *event)
|
||||||
|
{
|
||||||
|
GtkWidget* menu = gtk_menu_new();
|
||||||
|
|
||||||
|
GtkWidget* menuitem = gtk_menu_item_new_with_label("Add tag");
|
||||||
|
g_signal_connect(menuitem, "activate", (GCallback)TextureBrowser_addTag, treeview);
|
||||||
|
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
|
||||||
|
|
||||||
|
menuitem = gtk_menu_item_new_with_label("Rename tag");
|
||||||
|
g_signal_connect(menuitem, "activate", (GCallback)TextureBrowser_renameTag, treeview);
|
||||||
|
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
|
||||||
|
|
||||||
|
menuitem = gtk_menu_item_new_with_label("Delete tag");
|
||||||
|
g_signal_connect(menuitem, "activate", (GCallback)TextureBrowser_deleteTag, treeview);
|
||||||
|
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
|
||||||
|
|
||||||
|
gtk_widget_show_all(menu);
|
||||||
|
|
||||||
|
gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL,
|
||||||
|
(event != NULL) ? event->button : 0,
|
||||||
|
gdk_event_get_time((GdkEvent*)event));
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean TreeViewTags_onButtonPressed(GtkWidget *treeview, GdkEventButton *event)
|
||||||
|
{
|
||||||
|
if (event->type == GDK_BUTTON_PRESS && event->button == 3)
|
||||||
|
{
|
||||||
|
GtkTreePath *path;
|
||||||
|
GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
|
||||||
|
|
||||||
|
if(gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(treeview), event->x, event->y, &path, NULL, NULL, NULL))
|
||||||
|
{
|
||||||
|
gtk_tree_selection_unselect_all(selection);
|
||||||
|
gtk_tree_selection_select_path(selection, path);
|
||||||
|
gtk_tree_path_free(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
TextureBrowser_createContextMenu(treeview, event);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
void TextureBrowser_createTreeViewTags()
|
void TextureBrowser_createTreeViewTags()
|
||||||
{
|
{
|
||||||
GtkCellRenderer* renderer;
|
GtkCellRenderer* renderer;
|
||||||
g_TextureBrowser.m_treeViewTags = GTK_WIDGET(gtk_tree_view_new());
|
g_TextureBrowser.m_treeViewTags = GTK_WIDGET(gtk_tree_view_new());
|
||||||
|
|
||||||
|
g_signal_connect(GTK_TREE_VIEW(g_TextureBrowser.m_treeViewTags), "button-press-event", (GCallback)TreeViewTags_onButtonPressed, NULL);
|
||||||
|
|
||||||
gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(g_TextureBrowser.m_treeViewTags), FALSE);
|
gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(g_TextureBrowser.m_treeViewTags), FALSE);
|
||||||
|
|
||||||
renderer = gtk_cell_renderer_text_new();
|
renderer = gtk_cell_renderer_text_new();
|
||||||
|
@ -1730,19 +1779,6 @@ void TextureBrowser_buildTagList()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void toggle_tags_textures()
|
|
||||||
{
|
|
||||||
if(g_TextureBrowser.m_showTags)
|
|
||||||
{
|
|
||||||
gtk_widget_hide(GTK_WIDGET(g_TextureBrowser.m_scr_win_tags));
|
|
||||||
gtk_widget_show(GTK_WIDGET(g_TextureBrowser.m_scr_win_tree));
|
|
||||||
} else {
|
|
||||||
gtk_widget_hide(GTK_WIDGET(g_TextureBrowser.m_scr_win_tree));
|
|
||||||
gtk_widget_show(GTK_WIDGET(g_TextureBrowser.m_scr_win_tags));
|
|
||||||
}
|
|
||||||
g_TextureBrowser.m_showTags ^= 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void TextureBrowser_searchTags()
|
void TextureBrowser_searchTags()
|
||||||
{
|
{
|
||||||
GSList* selected = NULL;
|
GSList* selected = NULL;
|
||||||
|
@ -1820,29 +1856,42 @@ void TextureBrowser_searchTags()
|
||||||
g_slist_free(selected);
|
g_slist_free(selected);
|
||||||
}
|
}
|
||||||
|
|
||||||
GtkWidget* TextureBrowser_constructTagToolbar()
|
void TextureBrowser_toggleSearchButton()
|
||||||
{
|
{
|
||||||
GtkWidget* toolbar = gtk_toolbar_new();
|
gint page = gtk_notebook_get_current_page(GTK_NOTEBOOK(g_TextureBrowser.m_tag_notebook));
|
||||||
GtkTooltips* toolbar_tips = gtk_tooltips_new();
|
|
||||||
|
|
||||||
GtkWidget* image = gtk_image_new_from_stock(GTK_STOCK_FIND, GTK_ICON_SIZE_SMALL_TOOLBAR);
|
if(page == 0) // tag page
|
||||||
GtkWidget* button = gtk_button_new();
|
{
|
||||||
g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(TextureBrowser_searchTags), NULL);
|
gtk_widget_show_all(g_TextureBrowser.m_search_button);
|
||||||
gtk_tooltips_set_tip(GTK_TOOLTIPS(toolbar_tips), button, "Search with selected tags", "Search with selected tags");
|
} else {
|
||||||
gtk_container_add(GTK_CONTAINER(button), image);
|
gtk_widget_hide_all(g_TextureBrowser.m_search_button);
|
||||||
gtk_container_add(GTK_CONTAINER(toolbar), button);
|
}
|
||||||
gtk_widget_show_all(button);
|
|
||||||
|
|
||||||
image = gtk_image_new_from_stock(GTK_STOCK_INDEX, GTK_ICON_SIZE_SMALL_TOOLBAR);
|
|
||||||
button = gtk_toggle_button_new();
|
|
||||||
g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(toggle_tags_textures), NULL);
|
|
||||||
gtk_tooltips_set_tip(GTK_TOOLTIPS(toolbar_tips), button, "Toggle tag/texture view", "Toggle tag/texture view");
|
|
||||||
gtk_container_add(GTK_CONTAINER(button), image);
|
|
||||||
gtk_container_add(GTK_CONTAINER(toolbar), button);
|
|
||||||
gtk_widget_show_all(button);
|
|
||||||
return toolbar;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TextureBrowser_constructTagNotebook()
|
||||||
|
{
|
||||||
|
g_TextureBrowser.m_tag_notebook = gtk_notebook_new();
|
||||||
|
GtkWidget* labelTags = gtk_label_new("Tags");
|
||||||
|
GtkWidget* labelTextures = gtk_label_new("Textures");
|
||||||
|
|
||||||
|
gtk_notebook_append_page(GTK_NOTEBOOK(g_TextureBrowser.m_tag_notebook), g_TextureBrowser.m_scr_win_tree, labelTextures);
|
||||||
|
gtk_notebook_append_page(GTK_NOTEBOOK(g_TextureBrowser.m_tag_notebook), g_TextureBrowser.m_scr_win_tags, labelTags);
|
||||||
|
|
||||||
|
g_signal_connect(G_OBJECT(g_TextureBrowser.m_tag_notebook), "switch-page", G_CALLBACK(TextureBrowser_toggleSearchButton), NULL);
|
||||||
|
|
||||||
|
gtk_widget_show_all(g_TextureBrowser.m_tag_notebook);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TextureBrowser_constructSearchButton()
|
||||||
|
{
|
||||||
|
GtkTooltips* tooltips = gtk_tooltips_new();
|
||||||
|
|
||||||
|
GtkWidget* image = gtk_image_new_from_stock(GTK_STOCK_FIND, GTK_ICON_SIZE_SMALL_TOOLBAR);
|
||||||
|
g_TextureBrowser.m_search_button = gtk_button_new();
|
||||||
|
g_signal_connect(G_OBJECT(g_TextureBrowser.m_search_button), "clicked", G_CALLBACK(TextureBrowser_searchTags), NULL);
|
||||||
|
gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), g_TextureBrowser.m_search_button, "Search with selected tags", "Search with selected tags");
|
||||||
|
gtk_container_add(GTK_CONTAINER(g_TextureBrowser.m_search_button), image);
|
||||||
|
}
|
||||||
|
|
||||||
void TextureBrowser_checkTagFile()
|
void TextureBrowser_checkTagFile()
|
||||||
{
|
{
|
||||||
|
@ -1896,16 +1945,6 @@ GtkWidget* TextureBrowser_constructWindow(GtkWindow* toplevel)
|
||||||
|
|
||||||
TextureBrowser_checkTagFile();
|
TextureBrowser_checkTagFile();
|
||||||
|
|
||||||
if(g_TextureBrowser.m_tags)
|
|
||||||
{
|
|
||||||
g_TextureBrowser.m_all_tags_list = gtk_list_store_new(N_COLUMNS, G_TYPE_STRING);
|
|
||||||
GtkTreeSortable* sortable = GTK_TREE_SORTABLE(g_TextureBrowser.m_all_tags_list);
|
|
||||||
gtk_tree_sortable_set_sort_column_id(sortable, TAG_COLUMN, GTK_SORT_ASCENDING);
|
|
||||||
|
|
||||||
TagBuilder.GetAllTags(g_TextureBrowser.m_all_tags);
|
|
||||||
TextureBrowser_buildTagList();
|
|
||||||
}
|
|
||||||
|
|
||||||
GlobalShaderSystem().setActiveShadersChangedNotify(ReferenceCaller<TextureBrowser, TextureBrowser_activeShadersChanged>(g_TextureBrowser));
|
GlobalShaderSystem().setActiveShadersChangedNotify(ReferenceCaller<TextureBrowser, TextureBrowser_activeShadersChanged>(g_TextureBrowser));
|
||||||
|
|
||||||
g_TextureBrowser.m_parent = toplevel;
|
g_TextureBrowser.m_parent = toplevel;
|
||||||
|
@ -1916,8 +1955,10 @@ GtkWidget* TextureBrowser_constructWindow(GtkWindow* toplevel)
|
||||||
gtk_table_attach(GTK_TABLE(table), vbox, 0, 1, 1, 3, GTK_FILL, GTK_FILL, 0, 0);
|
gtk_table_attach(GTK_TABLE(table), vbox, 0, 1, 1, 3, GTK_FILL, GTK_FILL, 0, 0);
|
||||||
gtk_widget_show(vbox);
|
gtk_widget_show(vbox);
|
||||||
|
|
||||||
|
GtkWidget* menu_bar;
|
||||||
|
|
||||||
{ // menu bar
|
{ // menu bar
|
||||||
GtkWidget* menu_bar = gtk_menu_bar_new();
|
menu_bar = gtk_menu_bar_new();
|
||||||
GtkWidget* menu_view = gtk_menu_new();
|
GtkWidget* menu_view = gtk_menu_new();
|
||||||
GtkWidget* view_item = (GtkWidget*)TextureBrowser_constructViewMenu(GTK_MENU(menu_view));
|
GtkWidget* view_item = (GtkWidget*)TextureBrowser_constructViewMenu(GTK_MENU(menu_view));
|
||||||
gtk_menu_item_set_submenu(GTK_MENU_ITEM(view_item), menu_view);
|
gtk_menu_item_set_submenu(GTK_MENU_ITEM(view_item), menu_view);
|
||||||
|
@ -1928,25 +1969,22 @@ GtkWidget* TextureBrowser_constructWindow(GtkWindow* toplevel)
|
||||||
gtk_menu_item_set_submenu(GTK_MENU_ITEM(tools_item), menu_tools);
|
gtk_menu_item_set_submenu(GTK_MENU_ITEM(tools_item), menu_tools);
|
||||||
gtk_menu_bar_append(GTK_MENU_BAR(menu_bar), tools_item);
|
gtk_menu_bar_append(GTK_MENU_BAR(menu_bar), tools_item);
|
||||||
|
|
||||||
if(g_TextureBrowser.m_tags)
|
|
||||||
{
|
|
||||||
GtkWidget* menu_tags = gtk_menu_new();
|
|
||||||
GtkWidget* tags_item = (GtkWidget*)TextureBrowser_constructTagsMenu(GTK_MENU(menu_tags));
|
|
||||||
gtk_menu_item_set_submenu(GTK_MENU_ITEM(tags_item), menu_tags);
|
|
||||||
gtk_menu_bar_append(GTK_MENU_BAR(menu_bar), tags_item);
|
|
||||||
}
|
|
||||||
|
|
||||||
gtk_table_attach(GTK_TABLE (table), menu_bar, 0, 3, 0, 1, GTK_FILL, GTK_SHRINK, 0, 0);
|
gtk_table_attach(GTK_TABLE (table), menu_bar, 0, 3, 0, 1, GTK_FILL, GTK_SHRINK, 0, 0);
|
||||||
gtk_widget_show(menu_bar);
|
gtk_widget_show(menu_bar);
|
||||||
}
|
}
|
||||||
{ // tag tool bar
|
{ // Texture TreeView
|
||||||
if(g_TextureBrowser.m_tags)
|
g_TextureBrowser.m_scr_win_tree = gtk_scrolled_window_new(NULL, NULL);
|
||||||
{
|
gtk_container_set_border_width(GTK_CONTAINER(g_TextureBrowser.m_scr_win_tree), 0);
|
||||||
GtkWidget* toolbar = TextureBrowser_constructTagToolbar();
|
|
||||||
|
|
||||||
gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0);
|
// vertical only scrolling for treeview
|
||||||
gtk_widget_show(toolbar);
|
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(g_TextureBrowser.m_scr_win_tree), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
|
||||||
}
|
|
||||||
|
gtk_widget_show(g_TextureBrowser.m_scr_win_tree);
|
||||||
|
|
||||||
|
TextureBrowser_createTreeViewTree();
|
||||||
|
|
||||||
|
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(g_TextureBrowser.m_scr_win_tree), GTK_WIDGET(g_TextureBrowser.m_treeViewTree));
|
||||||
|
gtk_widget_show(GTK_WIDGET(g_TextureBrowser.m_treeViewTree));
|
||||||
}
|
}
|
||||||
{ // gl_widget scrollbar
|
{ // gl_widget scrollbar
|
||||||
GtkWidget* w = gtk_vscrollbar_new(GTK_ADJUSTMENT(gtk_adjustment_new (0,0,0,1,1,1)));
|
GtkWidget* w = gtk_vscrollbar_new(GTK_ADJUSTMENT(gtk_adjustment_new (0,0,0,1,1,1)));
|
||||||
|
@ -1959,41 +1997,6 @@ GtkWidget* TextureBrowser_constructWindow(GtkWindow* toplevel)
|
||||||
|
|
||||||
widget_set_visible(g_TextureBrowser.m_texture_scroll, g_TextureBrowser.m_showTextureScrollbar);
|
widget_set_visible(g_TextureBrowser.m_texture_scroll, g_TextureBrowser.m_showTextureScrollbar);
|
||||||
}
|
}
|
||||||
{ // TreeView
|
|
||||||
g_TextureBrowser.m_scr_win_tree = gtk_scrolled_window_new(NULL, NULL);
|
|
||||||
gtk_container_set_border_width(GTK_CONTAINER(g_TextureBrowser.m_scr_win_tree), 0);
|
|
||||||
|
|
||||||
// vertical only scrolling for treeview
|
|
||||||
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(g_TextureBrowser.m_scr_win_tree), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
|
|
||||||
|
|
||||||
gtk_box_pack_end(GTK_BOX(vbox), g_TextureBrowser.m_scr_win_tree, TRUE, TRUE, 0);
|
|
||||||
gtk_widget_show(g_TextureBrowser.m_scr_win_tree);
|
|
||||||
|
|
||||||
TextureBrowser_createTreeViewTree();
|
|
||||||
|
|
||||||
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(g_TextureBrowser.m_scr_win_tree), GTK_WIDGET(g_TextureBrowser.m_treeViewTree));
|
|
||||||
gtk_widget_show(GTK_WIDGET(g_TextureBrowser.m_treeViewTree));
|
|
||||||
}
|
|
||||||
{ // TreeView for tags
|
|
||||||
if(g_TextureBrowser.m_tags)
|
|
||||||
{
|
|
||||||
g_TextureBrowser.m_scr_win_tags = gtk_scrolled_window_new(NULL, NULL);
|
|
||||||
gtk_container_set_border_width(GTK_CONTAINER(g_TextureBrowser.m_scr_win_tags), 0);
|
|
||||||
|
|
||||||
// vertical only scrolling for treeview
|
|
||||||
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(g_TextureBrowser.m_scr_win_tags), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
|
|
||||||
|
|
||||||
gtk_box_pack_end(GTK_BOX(vbox), g_TextureBrowser.m_scr_win_tags, TRUE, TRUE, 0);
|
|
||||||
|
|
||||||
TextureBrowser_createTreeViewTags();
|
|
||||||
|
|
||||||
GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(g_TextureBrowser.m_treeViewTags));
|
|
||||||
gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE);
|
|
||||||
|
|
||||||
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW (g_TextureBrowser.m_scr_win_tags), GTK_WIDGET (g_TextureBrowser.m_treeViewTags));
|
|
||||||
gtk_widget_show(GTK_WIDGET(g_TextureBrowser.m_treeViewTags));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
{ // gl_widget
|
{ // gl_widget
|
||||||
g_TextureBrowser.m_gl_widget = glwidget_new(FALSE);
|
g_TextureBrowser.m_gl_widget = glwidget_new(FALSE);
|
||||||
gtk_widget_ref(g_TextureBrowser.m_gl_widget);
|
gtk_widget_ref(g_TextureBrowser.m_gl_widget);
|
||||||
|
@ -2012,9 +2015,48 @@ GtkWidget* TextureBrowser_constructWindow(GtkWindow* toplevel)
|
||||||
g_signal_connect(G_OBJECT(g_TextureBrowser.m_gl_widget), "motion_notify_event", G_CALLBACK(TextureBrowser_motion), &g_TextureBrowser);
|
g_signal_connect(G_OBJECT(g_TextureBrowser.m_gl_widget), "motion_notify_event", G_CALLBACK(TextureBrowser_motion), &g_TextureBrowser);
|
||||||
g_signal_connect(G_OBJECT(g_TextureBrowser.m_gl_widget), "scroll_event", G_CALLBACK(TextureBrowser_scroll), &g_TextureBrowser);
|
g_signal_connect(G_OBJECT(g_TextureBrowser.m_gl_widget), "scroll_event", G_CALLBACK(TextureBrowser_scroll), &g_TextureBrowser);
|
||||||
}
|
}
|
||||||
{ // tag frame
|
|
||||||
if(g_TextureBrowser.m_tags)
|
// tag stuff
|
||||||
{
|
if(g_TextureBrowser.m_tags)
|
||||||
|
{
|
||||||
|
{ // fill tag GtkListStore
|
||||||
|
g_TextureBrowser.m_all_tags_list = gtk_list_store_new(N_COLUMNS, G_TYPE_STRING);
|
||||||
|
GtkTreeSortable* sortable = GTK_TREE_SORTABLE(g_TextureBrowser.m_all_tags_list);
|
||||||
|
gtk_tree_sortable_set_sort_column_id(sortable, TAG_COLUMN, GTK_SORT_ASCENDING);
|
||||||
|
|
||||||
|
TagBuilder.GetAllTags(g_TextureBrowser.m_all_tags);
|
||||||
|
TextureBrowser_buildTagList();
|
||||||
|
}
|
||||||
|
{ // tag menu bar
|
||||||
|
GtkWidget* menu_tags = gtk_menu_new();
|
||||||
|
GtkWidget* tags_item = (GtkWidget*)TextureBrowser_constructTagsMenu(GTK_MENU(menu_tags));
|
||||||
|
gtk_menu_item_set_submenu(GTK_MENU_ITEM(tags_item), menu_tags);
|
||||||
|
gtk_menu_bar_append(GTK_MENU_BAR(menu_bar), tags_item);
|
||||||
|
}
|
||||||
|
{ // Tag TreeView
|
||||||
|
g_TextureBrowser.m_scr_win_tags = gtk_scrolled_window_new(NULL, NULL);
|
||||||
|
gtk_container_set_border_width(GTK_CONTAINER(g_TextureBrowser.m_scr_win_tags), 0);
|
||||||
|
|
||||||
|
// vertical only scrolling for treeview
|
||||||
|
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(g_TextureBrowser.m_scr_win_tags), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
|
||||||
|
|
||||||
|
TextureBrowser_createTreeViewTags();
|
||||||
|
|
||||||
|
GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(g_TextureBrowser.m_treeViewTags));
|
||||||
|
gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE);
|
||||||
|
|
||||||
|
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW (g_TextureBrowser.m_scr_win_tags), GTK_WIDGET (g_TextureBrowser.m_treeViewTags));
|
||||||
|
gtk_widget_show(GTK_WIDGET(g_TextureBrowser.m_treeViewTags));
|
||||||
|
}
|
||||||
|
{ // Texture/Tag notebook
|
||||||
|
TextureBrowser_constructTagNotebook();
|
||||||
|
gtk_box_pack_start(GTK_BOX(vbox), g_TextureBrowser.m_tag_notebook, TRUE, TRUE, 0);
|
||||||
|
}
|
||||||
|
{ // Tag search button
|
||||||
|
TextureBrowser_constructSearchButton();
|
||||||
|
gtk_box_pack_end(GTK_BOX(vbox), g_TextureBrowser.m_search_button, FALSE, FALSE, 0);
|
||||||
|
}
|
||||||
|
{ // Tag frame
|
||||||
frame_table = gtk_table_new(3, 3, FALSE);
|
frame_table = gtk_table_new(3, 3, FALSE);
|
||||||
|
|
||||||
g_TextureBrowser.m_tag_frame = gtk_frame_new("Tag assignment");
|
g_TextureBrowser.m_tag_frame = gtk_frame_new("Tag assignment");
|
||||||
|
@ -2023,15 +2065,11 @@ GtkWidget* TextureBrowser_constructWindow(GtkWindow* toplevel)
|
||||||
|
|
||||||
gtk_table_attach(GTK_TABLE(table), g_TextureBrowser.m_tag_frame, 1, 3, 2, 3, GTK_FILL, GTK_SHRINK, 0, 0);
|
gtk_table_attach(GTK_TABLE(table), g_TextureBrowser.m_tag_frame, 1, 3, 2, 3, GTK_FILL, GTK_SHRINK, 0, 0);
|
||||||
|
|
||||||
// set the size of the tag frame
|
|
||||||
gtk_widget_show(frame_table);
|
gtk_widget_show(frame_table);
|
||||||
|
|
||||||
gtk_container_add (GTK_CONTAINER(g_TextureBrowser.m_tag_frame), frame_table);
|
gtk_container_add (GTK_CONTAINER(g_TextureBrowser.m_tag_frame), frame_table);
|
||||||
}
|
}
|
||||||
}
|
{ // assigned tag list
|
||||||
{ // assigned tag list
|
|
||||||
if(g_TextureBrowser.m_tags)
|
|
||||||
{
|
|
||||||
GtkWidget* scrolled_win = gtk_scrolled_window_new(NULL, NULL);
|
GtkWidget* scrolled_win = gtk_scrolled_window_new(NULL, NULL);
|
||||||
gtk_container_set_border_width(GTK_CONTAINER (scrolled_win), 0);
|
gtk_container_set_border_width(GTK_CONTAINER (scrolled_win), 0);
|
||||||
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (scrolled_win), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
|
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (scrolled_win), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
|
||||||
|
@ -2060,10 +2098,7 @@ GtkWidget* TextureBrowser_constructWindow(GtkWindow* toplevel)
|
||||||
|
|
||||||
gtk_table_attach(GTK_TABLE(frame_table), scrolled_win, 0, 1, 1, 3, GTK_FILL, GTK_FILL, 0, 0);
|
gtk_table_attach(GTK_TABLE(frame_table), scrolled_win, 0, 1, 1, 3, GTK_FILL, GTK_FILL, 0, 0);
|
||||||
}
|
}
|
||||||
}
|
{ // available tag list
|
||||||
{ // available tag list
|
|
||||||
if(g_TextureBrowser.m_tags)
|
|
||||||
{
|
|
||||||
GtkWidget* scrolled_win = gtk_scrolled_window_new (NULL, NULL);
|
GtkWidget* scrolled_win = gtk_scrolled_window_new (NULL, NULL);
|
||||||
gtk_container_set_border_width (GTK_CONTAINER (scrolled_win), 0);
|
gtk_container_set_border_width (GTK_CONTAINER (scrolled_win), 0);
|
||||||
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
|
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
|
||||||
|
@ -2091,10 +2126,7 @@ GtkWidget* TextureBrowser_constructWindow(GtkWindow* toplevel)
|
||||||
|
|
||||||
gtk_table_attach (GTK_TABLE (frame_table), scrolled_win, 2, 3, 1, 3, GTK_FILL, GTK_FILL, 0, 0);
|
gtk_table_attach (GTK_TABLE (frame_table), scrolled_win, 2, 3, 1, 3, GTK_FILL, GTK_FILL, 0, 0);
|
||||||
}
|
}
|
||||||
}
|
{ // tag arrow buttons
|
||||||
{ // arrow buttons
|
|
||||||
if(g_TextureBrowser.m_tags)
|
|
||||||
{
|
|
||||||
GtkWidget* m_btn_left = gtk_button_new();
|
GtkWidget* m_btn_left = gtk_button_new();
|
||||||
GtkWidget* m_btn_right = gtk_button_new();
|
GtkWidget* m_btn_right = gtk_button_new();
|
||||||
GtkWidget* m_arrow_left = gtk_arrow_new(GTK_ARROW_LEFT, GTK_SHADOW_OUT);
|
GtkWidget* m_arrow_left = gtk_arrow_new(GTK_ARROW_LEFT, GTK_SHADOW_OUT);
|
||||||
|
@ -2117,10 +2149,7 @@ GtkWidget* TextureBrowser_constructWindow(GtkWindow* toplevel)
|
||||||
gtk_widget_show(m_arrow_left);
|
gtk_widget_show(m_arrow_left);
|
||||||
gtk_widget_show(m_arrow_right);
|
gtk_widget_show(m_arrow_right);
|
||||||
}
|
}
|
||||||
}
|
{ // tag fram labels
|
||||||
{ // tag frame labels
|
|
||||||
if(g_TextureBrowser.m_tags)
|
|
||||||
{
|
|
||||||
GtkWidget* m_lbl_assigned = gtk_label_new ("Assigned");
|
GtkWidget* m_lbl_assigned = gtk_label_new ("Assigned");
|
||||||
GtkWidget* m_lbl_unassigned = gtk_label_new ("Available");
|
GtkWidget* m_lbl_unassigned = gtk_label_new ("Available");
|
||||||
|
|
||||||
|
@ -2130,6 +2159,8 @@ GtkWidget* TextureBrowser_constructWindow(GtkWindow* toplevel)
|
||||||
gtk_widget_show (m_lbl_assigned);
|
gtk_widget_show (m_lbl_assigned);
|
||||||
gtk_widget_show (m_lbl_unassigned);
|
gtk_widget_show (m_lbl_unassigned);
|
||||||
}
|
}
|
||||||
|
} else { // no tag support, show the texture tree only
|
||||||
|
gtk_box_pack_start(GTK_BOX(vbox), g_TextureBrowser.m_scr_win_tree, TRUE, TRUE, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO do we need this?
|
// TODO do we need this?
|
||||||
|
|
|
@ -1,195 +1,32 @@
|
||||||
Howto add new game packs to the InstallShield setup
|
msi installer HOWTO for Radiant 1.5
|
||||||
---------------------------------------------------
|
-----------------------------------
|
||||||
|
|
||||||
Background Info
|
Requirements:
|
||||||
---------------
|
|
||||||
The files that IS uses are pretty much all text files, in the template/ directory
|
|
||||||
we have a special copy of these files that make up the IS project.
|
|
||||||
|
|
||||||
The copy in the template/ directory has files which contain string like
|
- all game packs from https://zerowing.idsoftware.com/svn/radiant.gamepacks/*Pack/trunk/ must be present in the ./games/ folder
|
||||||
<<GTK_DIR>> which are replaced with actual values whenever the setup.pl script
|
- the Radiant manual from https://zerowing.idsoftware.com/svn/radiant.gamepacks/Q3Rad_Manual/trunk/ in ./docs/manual/
|
||||||
is used.
|
- msitools from http://zerowing.idsoftware.com/files/radiant/developer/1.5/msitools.zip.
|
||||||
|
|
||||||
|
|
||||||
TTimo
|
Building a new installer .msi file:
|
||||||
8/5/2002
|
|
||||||
|
|
||||||
Disclaimer: I'm writing that as I am building the RTCW game pack. It is possible
|
- Unzip msitools.zip to ./setup/win32/ and run MsiVal2.Msi (it automatically installes to C:\Program files\MsiVal2).
|
||||||
that it is fairly outdated when you read it, but my guess is it can be a useful
|
- Copy all files from C:\Program files\MsiVal2 to the ./setup/win32/ folder.
|
||||||
reference document.
|
- You might have to edit the .xml files in ./setup/win32/components/
|
||||||
Update: using this for JKII support, made sure everything is still valid
|
- Create a file "aboutmsg.default" in ./include containing a single line:
|
||||||
|
Official qeradiant.com build by <insert your name here>
|
||||||
Hydra
|
- Open a command-prompt in ./ and run "makeversion.py"
|
||||||
5/6/2002
|
- Build the GtkRadiant solution in 'Release' configuration.
|
||||||
- Updating for Halflife build, added a bit more info in places.
|
- If you want to create a .msi installer for GtkRadiant, go on with the next step. To create a game pack
|
||||||
|
.msi installer you have to modify the file "build.py".
|
||||||
NOTE: you need cygwin installed (http://www.cygwin.com) to run setup.pl tools
|
- Open a command-prompt in ./setup/win32/ and run "build.py". This will create the installer
|
||||||
(Base installation + perl)
|
file GtkRadiant-1.5.0-[YYYY]-[MM]-[DD].msi
|
||||||
|
|
||||||
You also need UUIDGEN.exe in your path. It's normally in the
|
|
||||||
"Visual Studio .NET\Common7\Tools" directory
|
|
||||||
|
|
||||||
Some experience with IS and our particular way of handling it is expected.
|
|
||||||
The following information is DENSE, read everything
|
|
||||||
|
|
||||||
- select a base name for the pack (which we will use in various variables):
|
|
||||||
WOLF
|
|
||||||
- make a RELEASE build of GtkRadiant.
|
|
||||||
- run setup.pl to generate the IS directories
|
|
||||||
e.g. ./setup.pl 'c:\\my documents\\Source\\GtkRadiant' q3.cf
|
|
||||||
(the directory contains GtkRadiant, Src, etc..)
|
|
||||||
- start WorkDir/GtkRadiant.ipr, this is an half-templated setup we can
|
|
||||||
easily work on to add new stuff
|
|
||||||
|
|
||||||
- go to file groups and start adding new groups:
|
|
||||||
Wolf Executable Files
|
|
||||||
will hold the editor modules and binaries (map compiler, bspc)
|
|
||||||
Wolf Media Files
|
|
||||||
will hold sample files and editor files:
|
|
||||||
maps, models, additional textures, shader scripts, entities.def, project template
|
|
||||||
set the destination directory for those files:
|
|
||||||
Wolf Executable Files
|
|
||||||
goes in the game pack directory: DIR_GAMETOOLS_WOLF
|
|
||||||
Wolf Media Files
|
|
||||||
goes straight into the Wolf path: DIR_GAME_WOLF
|
|
||||||
|
|
||||||
- start feeding stuff in those file groups
|
|
||||||
make sure all those files start from the prefix we are working with
|
|
||||||
(C:\home\Id in my case)
|
|
||||||
|
|
||||||
- add a component:
|
|
||||||
Wolf (Wolf Executable Files)
|
|
||||||
-- Wolf editing media (Wolf Media Files)
|
|
||||||
NOTE: make sure that you put the file groups in those components you created!
|
|
||||||
|
|
||||||
- go to add the pack to setup.rul:
|
|
||||||
add new globals
|
|
||||||
// Wolf
|
|
||||||
NUMBER DO_GAME_WOLF_BOOL;
|
|
||||||
STRING szDIR_GAME_WOLF, szDIR_GAMETOOLS_WOLF;
|
|
||||||
|
|
||||||
- in OnFirstUIBefore
|
|
||||||
define any strings you use, e.g. szJKII and DEFAULTJKIIDIR;
|
|
||||||
add template for wolf pack inclusion
|
|
||||||
DO_GAME_WOLF_BOOL = <<DO_GAME_WOLF_BOOL>>;
|
|
||||||
|
|
||||||
- copy 'game pack #1' code and paste is as a 'game pack #2'
|
|
||||||
start renaming the code and updating it
|
|
||||||
(use the registry key for default path lookup if possible)
|
|
||||||
Wolf setup doesn't leave an install path, we will hardcode to
|
|
||||||
C:\\Program Files\\Return To Castle Wolfenstein
|
|
||||||
and look for the binary
|
|
||||||
(note, this is by far the part with the most things to do,
|
|
||||||
read carefully the game pack code, replace everywhere it's needed,
|
|
||||||
put the right 'BACK' code etc.)
|
|
||||||
|
|
||||||
NOTE: the 'if (nResult = BACK) then' code gets more complicated as new packs are added
|
|
||||||
sadly, it's not possible to store labels into variables for jumps
|
|
||||||
the next 'nResult = BACK' in non-gamepack code needs to be updated too
|
|
||||||
|
|
||||||
- in Dlg_SdStartCopy, add summary for Wolf operations
|
|
||||||
if (DO_GAME_WOLF_BOOL == 1) then
|
|
||||||
ListAddString(listStartCopy,"Return To Castle Wolfenstein folder:",AFTER);
|
|
||||||
ListAddString(listStartCopy," " + szDIR_GAME_WOLF,AFTER);
|
|
||||||
ListAddString(listStartCopy,"Return To Castle Wolfenstein mapping package folder:",AFTER);
|
|
||||||
ListAddString(listStartCopy," " + szDIR_GAMETOOLS_WOLF,AFTER);
|
|
||||||
endif;
|
|
||||||
|
|
||||||
- in OnMoved, add generation of the game file for Wolf
|
|
||||||
if (DO_GAME_WOLF_BOOL == 1) then
|
|
||||||
if (CreateDir(TARGETDIR ^ "games")< 0) then
|
|
||||||
// Report the error; then abort.
|
|
||||||
MessageBox ("Unable to create directory " + TARGETDIR ^ "games", SEVERE);
|
|
||||||
abort;
|
|
||||||
endif;
|
|
||||||
if (CreateFile(nvFileHandle, TARGETDIR ^ "games", "wolf.game")< 0) then
|
|
||||||
// Report the error.
|
|
||||||
MessageBox ("CreateFile " + TARGETDIR ^ "games" + "\\wolf.game failed.", SEVERE);
|
|
||||||
abort;
|
|
||||||
endif;
|
|
||||||
WriteLine(nvFileHandle, "<?xml version=\"1.0\" encoding=\"iso-8859-1\" standalone=\"yes\"?>");
|
|
||||||
WriteLine(nvFileHandle, "<!-- generated by Radiant setup, modify at your own risks -->");
|
|
||||||
WriteLine(nvFileHandle, "<game name=\"Return To Castle Wolfenstein\" gametools=\"" + szDIR_GAMETOOLS_WOLF + "/\"/>");
|
|
||||||
WriteLine(nvFileHandle, " gamename=\"wolf\"");
|
|
||||||
WriteLine(nvFileHandle, " enginename=\"quake3\"");
|
|
||||||
CloseFile(nvFileHandle);
|
|
||||||
endif;
|
|
||||||
|
|
||||||
- configure the setup so that the new components are installed by default:
|
|
||||||
in 'Setup Types' tab, check the new components
|
|
||||||
NOTE: do that in BOTH types, specially Custom
|
|
||||||
|
|
||||||
- once all those changes are done, we are gonna validate the update..
|
|
||||||
save and exit IS
|
|
||||||
make a backup copy of setup/win32/WorkDir ($ cp -R WorkDir/ WorkDir-backup)
|
|
||||||
|
|
||||||
- templatize WorkDir/ with the setup.pl
|
|
||||||
$ ./setup.pl 'c:\\home\\Id' -template template-gen
|
|
||||||
Configured for base GtkRadiant directory: 'C:\\home\\Id'
|
|
||||||
Building a template version of WorkDir into template-gen/
|
|
||||||
Copy files...
|
|
||||||
Templating UUID...
|
|
||||||
Processing 'C:\\home\\Id' into '<<GTKRAD_DIR>>'
|
|
||||||
|
|
||||||
- check with a recursive diff that it's all good (Araxis Merge!)
|
|
||||||
Files template/Component Definitions/Default.cdf and template-gen/Component Definitions/Default.cdf differ
|
|
||||||
Files template/Component Definitions/Default.fgl and template-gen/Component Definitions/Default.fgl differ
|
|
||||||
Files template/File Groups/Default.fdf and template-gen/File Groups/Default.fdf differ
|
|
||||||
Files template/Script Files/Setup.rul and template-gen/Script Files/Setup.rul differ
|
|
||||||
Files template/Text Substitutions/Setup.tsb and template-gen/Text Substitutions/Setup.tsb differ
|
|
||||||
|
|
||||||
newly added, the file groups files
|
|
||||||
|
|
||||||
- copy over template-gen/ into template/
|
|
||||||
$ cp -R template-gen/* template/
|
|
||||||
|
|
||||||
- cvs update in the template dir, add new files etc.
|
|
||||||
|
|
||||||
|
|
||||||
|
Additional information:
|
||||||
|
|
||||||
- edit template/Component Definitions/Default.cdf in a text editor to configure the 'include in build' templates
|
If you want to build the msi-Installer wiht Python 2.4 you have to modify msiquery.vcproj ('Release' configuration)
|
||||||
search for [Wolf] and change the line:
|
located in ./setup/win32/msi/ (include paths and linker libraries) and rebuild it
|
||||||
INCLUDEINBUILD=NO
|
|
||||||
to:
|
|
||||||
INCLUDEINBUILD=<<DO_GAME_WOLF_BOOL_YESNO>>
|
|
||||||
|
|
||||||
search for [Wolf\Wolf Editing Media] and change the line:
|
|
||||||
INCLUDEINBUILD=NO
|
|
||||||
to:
|
|
||||||
INCLUDEINBUILD=<<DO_GAME_WOLF_BOOL_FULL_YESNO>>
|
|
||||||
|
|
||||||
that is, main is always installed, and the editing media only in full
|
|
||||||
NOTE: IS 6.0 has the nasty habit of changing order in Default.cdf on each save .. makes things harder
|
|
||||||
|
|
||||||
- edit 'sub configure_tree' in setup/win32/setup.pl:
|
|
||||||
copy from an existing game pack code and adapt
|
|
||||||
there's a general boolean, and a full setup boolean
|
|
||||||
(search and replace affects Setup.rul and Default.cdf)
|
|
||||||
|
|
||||||
add the corresponding items to
|
|
||||||
# set default config
|
|
||||||
|
|
||||||
add a corresponding output string under
|
|
||||||
print " DO_CORE : $DO_CORE\n";
|
|
||||||
|
|
||||||
- search for '# set default config' and add the new default entry (default to 0)
|
|
||||||
as well as the verbosity below
|
|
||||||
|
|
||||||
- create a new .cf file
|
|
||||||
|
|
||||||
# ET setup
|
|
||||||
|
|
||||||
# output dir name
|
|
||||||
$SETUP_DIR = 'Setup-ET';
|
|
||||||
|
|
||||||
$DO_CORE = 1;
|
|
||||||
$DO_GAME_ET = 1;
|
|
||||||
|
|
||||||
|
|
||||||
- build a new setup using a .cf file.
|
Written by Shaderman and Topsun in Sept 2006
|
||||||
|
|
||||||
e.g.
|
|
||||||
|
|
||||||
./setup.pl 'C:\\home\\Id' wolf.cf
|
|
||||||
|
|
||||||
- load up Setup-Wolf/GtkRadiant.ipl into IS and build it!
|
|
195
setup/win32/HOWTO_outdated
Normal file
195
setup/win32/HOWTO_outdated
Normal file
|
@ -0,0 +1,195 @@
|
||||||
|
Howto add new game packs to the InstallShield setup
|
||||||
|
---------------------------------------------------
|
||||||
|
|
||||||
|
Background Info
|
||||||
|
---------------
|
||||||
|
The files that IS uses are pretty much all text files, in the template/ directory
|
||||||
|
we have a special copy of these files that make up the IS project.
|
||||||
|
|
||||||
|
The copy in the template/ directory has files which contain string like
|
||||||
|
<<GTK_DIR>> which are replaced with actual values whenever the setup.pl script
|
||||||
|
is used.
|
||||||
|
|
||||||
|
|
||||||
|
TTimo
|
||||||
|
8/5/2002
|
||||||
|
|
||||||
|
Disclaimer: I'm writing that as I am building the RTCW game pack. It is possible
|
||||||
|
that it is fairly outdated when you read it, but my guess is it can be a useful
|
||||||
|
reference document.
|
||||||
|
Update: using this for JKII support, made sure everything is still valid
|
||||||
|
|
||||||
|
Hydra
|
||||||
|
5/6/2002
|
||||||
|
- Updating for Halflife build, added a bit more info in places.
|
||||||
|
|
||||||
|
NOTE: you need cygwin installed (http://www.cygwin.com) to run setup.pl tools
|
||||||
|
(Base installation + perl)
|
||||||
|
|
||||||
|
You also need UUIDGEN.exe in your path. It's normally in the
|
||||||
|
"Visual Studio .NET\Common7\Tools" directory
|
||||||
|
|
||||||
|
Some experience with IS and our particular way of handling it is expected.
|
||||||
|
The following information is DENSE, read everything
|
||||||
|
|
||||||
|
- select a base name for the pack (which we will use in various variables):
|
||||||
|
WOLF
|
||||||
|
- make a RELEASE build of GtkRadiant.
|
||||||
|
- run setup.pl to generate the IS directories
|
||||||
|
e.g. ./setup.pl 'c:\\my documents\\Source\\GtkRadiant' q3.cf
|
||||||
|
(the directory contains GtkRadiant, Src, etc..)
|
||||||
|
- start WorkDir/GtkRadiant.ipr, this is an half-templated setup we can
|
||||||
|
easily work on to add new stuff
|
||||||
|
|
||||||
|
- go to file groups and start adding new groups:
|
||||||
|
Wolf Executable Files
|
||||||
|
will hold the editor modules and binaries (map compiler, bspc)
|
||||||
|
Wolf Media Files
|
||||||
|
will hold sample files and editor files:
|
||||||
|
maps, models, additional textures, shader scripts, entities.def, project template
|
||||||
|
set the destination directory for those files:
|
||||||
|
Wolf Executable Files
|
||||||
|
goes in the game pack directory: DIR_GAMETOOLS_WOLF
|
||||||
|
Wolf Media Files
|
||||||
|
goes straight into the Wolf path: DIR_GAME_WOLF
|
||||||
|
|
||||||
|
- start feeding stuff in those file groups
|
||||||
|
make sure all those files start from the prefix we are working with
|
||||||
|
(C:\home\Id in my case)
|
||||||
|
|
||||||
|
- add a component:
|
||||||
|
Wolf (Wolf Executable Files)
|
||||||
|
-- Wolf editing media (Wolf Media Files)
|
||||||
|
NOTE: make sure that you put the file groups in those components you created!
|
||||||
|
|
||||||
|
- go to add the pack to setup.rul:
|
||||||
|
add new globals
|
||||||
|
// Wolf
|
||||||
|
NUMBER DO_GAME_WOLF_BOOL;
|
||||||
|
STRING szDIR_GAME_WOLF, szDIR_GAMETOOLS_WOLF;
|
||||||
|
|
||||||
|
- in OnFirstUIBefore
|
||||||
|
define any strings you use, e.g. szJKII and DEFAULTJKIIDIR;
|
||||||
|
add template for wolf pack inclusion
|
||||||
|
DO_GAME_WOLF_BOOL = <<DO_GAME_WOLF_BOOL>>;
|
||||||
|
|
||||||
|
- copy 'game pack #1' code and paste is as a 'game pack #2'
|
||||||
|
start renaming the code and updating it
|
||||||
|
(use the registry key for default path lookup if possible)
|
||||||
|
Wolf setup doesn't leave an install path, we will hardcode to
|
||||||
|
C:\\Program Files\\Return To Castle Wolfenstein
|
||||||
|
and look for the binary
|
||||||
|
(note, this is by far the part with the most things to do,
|
||||||
|
read carefully the game pack code, replace everywhere it's needed,
|
||||||
|
put the right 'BACK' code etc.)
|
||||||
|
|
||||||
|
NOTE: the 'if (nResult = BACK) then' code gets more complicated as new packs are added
|
||||||
|
sadly, it's not possible to store labels into variables for jumps
|
||||||
|
the next 'nResult = BACK' in non-gamepack code needs to be updated too
|
||||||
|
|
||||||
|
- in Dlg_SdStartCopy, add summary for Wolf operations
|
||||||
|
if (DO_GAME_WOLF_BOOL == 1) then
|
||||||
|
ListAddString(listStartCopy,"Return To Castle Wolfenstein folder:",AFTER);
|
||||||
|
ListAddString(listStartCopy," " + szDIR_GAME_WOLF,AFTER);
|
||||||
|
ListAddString(listStartCopy,"Return To Castle Wolfenstein mapping package folder:",AFTER);
|
||||||
|
ListAddString(listStartCopy," " + szDIR_GAMETOOLS_WOLF,AFTER);
|
||||||
|
endif;
|
||||||
|
|
||||||
|
- in OnMoved, add generation of the game file for Wolf
|
||||||
|
if (DO_GAME_WOLF_BOOL == 1) then
|
||||||
|
if (CreateDir(TARGETDIR ^ "games")< 0) then
|
||||||
|
// Report the error; then abort.
|
||||||
|
MessageBox ("Unable to create directory " + TARGETDIR ^ "games", SEVERE);
|
||||||
|
abort;
|
||||||
|
endif;
|
||||||
|
if (CreateFile(nvFileHandle, TARGETDIR ^ "games", "wolf.game")< 0) then
|
||||||
|
// Report the error.
|
||||||
|
MessageBox ("CreateFile " + TARGETDIR ^ "games" + "\\wolf.game failed.", SEVERE);
|
||||||
|
abort;
|
||||||
|
endif;
|
||||||
|
WriteLine(nvFileHandle, "<?xml version=\"1.0\" encoding=\"iso-8859-1\" standalone=\"yes\"?>");
|
||||||
|
WriteLine(nvFileHandle, "<!-- generated by Radiant setup, modify at your own risks -->");
|
||||||
|
WriteLine(nvFileHandle, "<game name=\"Return To Castle Wolfenstein\" gametools=\"" + szDIR_GAMETOOLS_WOLF + "/\"/>");
|
||||||
|
WriteLine(nvFileHandle, " gamename=\"wolf\"");
|
||||||
|
WriteLine(nvFileHandle, " enginename=\"quake3\"");
|
||||||
|
CloseFile(nvFileHandle);
|
||||||
|
endif;
|
||||||
|
|
||||||
|
- configure the setup so that the new components are installed by default:
|
||||||
|
in 'Setup Types' tab, check the new components
|
||||||
|
NOTE: do that in BOTH types, specially Custom
|
||||||
|
|
||||||
|
- once all those changes are done, we are gonna validate the update..
|
||||||
|
save and exit IS
|
||||||
|
make a backup copy of setup/win32/WorkDir ($ cp -R WorkDir/ WorkDir-backup)
|
||||||
|
|
||||||
|
- templatize WorkDir/ with the setup.pl
|
||||||
|
$ ./setup.pl 'c:\\home\\Id' -template template-gen
|
||||||
|
Configured for base GtkRadiant directory: 'C:\\home\\Id'
|
||||||
|
Building a template version of WorkDir into template-gen/
|
||||||
|
Copy files...
|
||||||
|
Templating UUID...
|
||||||
|
Processing 'C:\\home\\Id' into '<<GTKRAD_DIR>>'
|
||||||
|
|
||||||
|
- check with a recursive diff that it's all good (Araxis Merge!)
|
||||||
|
Files template/Component Definitions/Default.cdf and template-gen/Component Definitions/Default.cdf differ
|
||||||
|
Files template/Component Definitions/Default.fgl and template-gen/Component Definitions/Default.fgl differ
|
||||||
|
Files template/File Groups/Default.fdf and template-gen/File Groups/Default.fdf differ
|
||||||
|
Files template/Script Files/Setup.rul and template-gen/Script Files/Setup.rul differ
|
||||||
|
Files template/Text Substitutions/Setup.tsb and template-gen/Text Substitutions/Setup.tsb differ
|
||||||
|
|
||||||
|
newly added, the file groups files
|
||||||
|
|
||||||
|
- copy over template-gen/ into template/
|
||||||
|
$ cp -R template-gen/* template/
|
||||||
|
|
||||||
|
- cvs update in the template dir, add new files etc.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
- edit template/Component Definitions/Default.cdf in a text editor to configure the 'include in build' templates
|
||||||
|
search for [Wolf] and change the line:
|
||||||
|
INCLUDEINBUILD=NO
|
||||||
|
to:
|
||||||
|
INCLUDEINBUILD=<<DO_GAME_WOLF_BOOL_YESNO>>
|
||||||
|
|
||||||
|
search for [Wolf\Wolf Editing Media] and change the line:
|
||||||
|
INCLUDEINBUILD=NO
|
||||||
|
to:
|
||||||
|
INCLUDEINBUILD=<<DO_GAME_WOLF_BOOL_FULL_YESNO>>
|
||||||
|
|
||||||
|
that is, main is always installed, and the editing media only in full
|
||||||
|
NOTE: IS 6.0 has the nasty habit of changing order in Default.cdf on each save .. makes things harder
|
||||||
|
|
||||||
|
- edit 'sub configure_tree' in setup/win32/setup.pl:
|
||||||
|
copy from an existing game pack code and adapt
|
||||||
|
there's a general boolean, and a full setup boolean
|
||||||
|
(search and replace affects Setup.rul and Default.cdf)
|
||||||
|
|
||||||
|
add the corresponding items to
|
||||||
|
# set default config
|
||||||
|
|
||||||
|
add a corresponding output string under
|
||||||
|
print " DO_CORE : $DO_CORE\n";
|
||||||
|
|
||||||
|
- search for '# set default config' and add the new default entry (default to 0)
|
||||||
|
as well as the verbosity below
|
||||||
|
|
||||||
|
- create a new .cf file
|
||||||
|
|
||||||
|
# ET setup
|
||||||
|
|
||||||
|
# output dir name
|
||||||
|
$SETUP_DIR = 'Setup-ET';
|
||||||
|
|
||||||
|
$DO_CORE = 1;
|
||||||
|
$DO_GAME_ET = 1;
|
||||||
|
|
||||||
|
|
||||||
|
- build a new setup using a .cf file.
|
||||||
|
|
||||||
|
e.g.
|
||||||
|
|
||||||
|
./setup.pl 'C:\\home\\Id' wolf.cf
|
||||||
|
|
||||||
|
- load up Setup-Wolf/GtkRadiant.ipl into IS and build it!
|
Loading…
Reference in a new issue