From: namespace Date: Tue, 3 Oct 2006 16:23:28 +0000 (+0000) Subject: - Changed ETB tag toolbar to a notebook with tag/texture pages (Shaderman) X-Git-Tag: xonotic-v0.7.0~16^2~12^2~184 X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fnetradiant.git;a=commitdiff_plain;h=04dca548d104e4cbf7b46d2e11710ef8963d756c - 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 --- diff --git a/CHANGES b/CHANGES index da0a779d..97a0c58f 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,12 @@ This is the changelog for developers, != changelog for the end user 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 namespace - Added missing xml files for win32 installer diff --git a/radiant/texwindow.cpp b/radiant/texwindow.cpp index e3b73513..254a7214 100644 --- a/radiant/texwindow.cpp +++ b/radiant/texwindow.cpp @@ -231,6 +231,8 @@ public: GtkWidget* m_available_tree; GtkWidget* m_scr_win_tree; GtkWidget* m_scr_win_tags; + GtkWidget* m_tag_notebook; + GtkWidget* m_search_button; GtkWidget* m_shader_info_item; std::set m_all_tags; @@ -265,7 +267,6 @@ public: bool m_rmbSelected; bool m_searchedTags; bool m_tags; - bool m_showTags; TextureBrowser() : m_texture_scroll(0), @@ -284,8 +285,7 @@ public: m_hideUnused(false), m_rmbSelected(false), m_searchedTags(false), - m_tags(false), - m_showTags(false) + m_tags(false) { } }; @@ -1530,11 +1530,60 @@ void TextureBrowser_createTreeViewTree() 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() { GtkCellRenderer* renderer; 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); 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() { GSList* selected = NULL; @@ -1820,29 +1856,42 @@ void TextureBrowser_searchTags() g_slist_free(selected); } -GtkWidget* TextureBrowser_constructTagToolbar() +void TextureBrowser_toggleSearchButton() { - GtkWidget* toolbar = gtk_toolbar_new(); - GtkTooltips* toolbar_tips = gtk_tooltips_new(); + gint page = gtk_notebook_get_current_page(GTK_NOTEBOOK(g_TextureBrowser.m_tag_notebook)); - GtkWidget* image = gtk_image_new_from_stock(GTK_STOCK_FIND, GTK_ICON_SIZE_SMALL_TOOLBAR); - GtkWidget* button = gtk_button_new(); - g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(TextureBrowser_searchTags), NULL); - gtk_tooltips_set_tip(GTK_TOOLTIPS(toolbar_tips), button, "Search with selected tags", "Search with selected tags"); - gtk_container_add(GTK_CONTAINER(button), image); - gtk_container_add(GTK_CONTAINER(toolbar), button); - gtk_widget_show_all(button); + if(page == 0) // tag page + { + gtk_widget_show_all(g_TextureBrowser.m_search_button); + } else { + gtk_widget_hide_all(g_TextureBrowser.m_search_button); + } +} + +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); - 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; + 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() { @@ -1896,16 +1945,6 @@ GtkWidget* TextureBrowser_constructWindow(GtkWindow* toplevel) 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(g_TextureBrowser)); 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_widget_show(vbox); + GtkWidget* menu_bar; + { // menu bar - GtkWidget* menu_bar = gtk_menu_bar_new(); + menu_bar = gtk_menu_bar_new(); GtkWidget* menu_view = gtk_menu_new(); GtkWidget* view_item = (GtkWidget*)TextureBrowser_constructViewMenu(GTK_MENU(menu_view)); gtk_menu_item_set_submenu(GTK_MENU_ITEM(view_item), menu_view); @@ -1928,45 +1969,16 @@ GtkWidget* TextureBrowser_constructWindow(GtkWindow* toplevel) gtk_menu_item_set_submenu(GTK_MENU_ITEM(tools_item), menu_tools); 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_widget_show(menu_bar); } - { // tag tool bar - if(g_TextureBrowser.m_tags) - { - GtkWidget* toolbar = TextureBrowser_constructTagToolbar(); - - gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0); - gtk_widget_show(toolbar); - } - } - { // gl_widget scrollbar - GtkWidget* w = gtk_vscrollbar_new(GTK_ADJUSTMENT(gtk_adjustment_new (0,0,0,1,1,1))); - gtk_table_attach(GTK_TABLE (table), w, 2, 3, 1, 2, GTK_SHRINK, GTK_FILL, 0, 0); - gtk_widget_show(w); - g_TextureBrowser.m_texture_scroll = w; - - GtkAdjustment *vadjustment = gtk_range_get_adjustment (GTK_RANGE (g_TextureBrowser.m_texture_scroll)); - g_signal_connect(G_OBJECT(vadjustment), "value_changed", G_CALLBACK(TextureBrowser_verticalScroll), &g_TextureBrowser); - - widget_set_visible(g_TextureBrowser.m_texture_scroll, g_TextureBrowser.m_showTextureScrollbar); - } - { // TreeView + { // Texture 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(); @@ -1974,25 +1986,16 @@ GtkWidget* TextureBrowser_constructWindow(GtkWindow* toplevel) 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(); + { // gl_widget scrollbar + GtkWidget* w = gtk_vscrollbar_new(GTK_ADJUSTMENT(gtk_adjustment_new (0,0,0,1,1,1))); + gtk_table_attach(GTK_TABLE (table), w, 2, 3, 1, 2, GTK_SHRINK, GTK_FILL, 0, 0); + gtk_widget_show(w); + g_TextureBrowser.m_texture_scroll = w; - GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(g_TextureBrowser.m_treeViewTags)); - gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); + GtkAdjustment *vadjustment = gtk_range_get_adjustment (GTK_RANGE (g_TextureBrowser.m_texture_scroll)); + g_signal_connect(G_OBJECT(vadjustment), "value_changed", G_CALLBACK(TextureBrowser_verticalScroll), &g_TextureBrowser); - 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)); - } + widget_set_visible(g_TextureBrowser.m_texture_scroll, g_TextureBrowser.m_showTextureScrollbar); } { // gl_widget g_TextureBrowser.m_gl_widget = glwidget_new(FALSE); @@ -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), "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); 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); - // set the size of the tag frame gtk_widget_show(frame_table); gtk_container_add (GTK_CONTAINER(g_TextureBrowser.m_tag_frame), frame_table); - } - } - { // assigned tag list - if(g_TextureBrowser.m_tags) - { + } + { // assigned tag list GtkWidget* scrolled_win = gtk_scrolled_window_new(NULL, NULL); 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); @@ -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); } - } - { // available tag list - if(g_TextureBrowser.m_tags) - { + { // available tag list GtkWidget* scrolled_win = gtk_scrolled_window_new (NULL, NULL); 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); @@ -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); } - } - { // arrow buttons - if(g_TextureBrowser.m_tags) - { + { // tag arrow buttons GtkWidget* m_btn_left = gtk_button_new(); GtkWidget* m_btn_right = gtk_button_new(); 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_right); } - } - { // tag frame labels - if(g_TextureBrowser.m_tags) - { + { // tag fram labels GtkWidget* m_lbl_assigned = gtk_label_new ("Assigned"); 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_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? diff --git a/setup/win32/HOWTO b/setup/win32/HOWTO index 775887a8..af0ddb64 100644 --- a/setup/win32/HOWTO +++ b/setup/win32/HOWTO @@ -1,195 +1,32 @@ -Howto add new game packs to the InstallShield setup ---------------------------------------------------- +msi installer HOWTO for Radiant 1.5 +----------------------------------- -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. +Requirements: -The copy in the template/ directory has files which contain string like -<> which are replaced with actual values whenever the setup.pl script -is used. +- all game packs from https://zerowing.idsoftware.com/svn/radiant.gamepacks/*Pack/trunk/ must be present in the ./games/ folder +- the Radiant manual from https://zerowing.idsoftware.com/svn/radiant.gamepacks/Q3Rad_Manual/trunk/ in ./docs/manual/ +- msitools from http://zerowing.idsoftware.com/files/radiant/developer/1.5/msitools.zip. -TTimo -8/5/2002 +Building a new installer .msi file: -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 +- Unzip msitools.zip to ./setup/win32/ and run MsiVal2.Msi (it automatically installes to C:\Program files\MsiVal2). +- Copy all files from C:\Program files\MsiVal2 to the ./setup/win32/ folder. +- You might have to edit the .xml files in ./setup/win32/components/ +- Create a file "aboutmsg.default" in ./include containing a single line: + Official qeradiant.com build by +- Open a command-prompt in ./ and run "makeversion.py" +- Build the GtkRadiant solution in 'Release' configuration. +- 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". +- Open a command-prompt in ./setup/win32/ and run "build.py". This will create the installer + file GtkRadiant-1.5.0-[YYYY]-[MM]-[DD].msi -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) +Additional information: -You also need UUIDGEN.exe in your path. It's normally in the -"Visual Studio .NET\Common7\Tools" directory +If you want to build the msi-Installer wiht Python 2.4 you have to modify msiquery.vcproj ('Release' configuration) +located in ./setup/win32/msi/ (include paths and linker libraries) and rebuild it -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 = <>; - -- 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, ""); - WriteLine(nvFileHandle, ""); - WriteLine(nvFileHandle, ""); - 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 '<>' - -- 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=<> - - search for [Wolf\Wolf Editing Media] and change the line: - INCLUDEINBUILD=NO - to: - INCLUDEINBUILD=<> - - 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! +Written by Shaderman and Topsun in Sept 2006 \ No newline at end of file diff --git a/setup/win32/HOWTO_outdated b/setup/win32/HOWTO_outdated new file mode 100644 index 00000000..775887a8 --- /dev/null +++ b/setup/win32/HOWTO_outdated @@ -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 +<> 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 = <>; + +- 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, ""); + WriteLine(nvFileHandle, ""); + WriteLine(nvFileHandle, ""); + 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 '<>' + +- 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=<> + + search for [Wolf\Wolf Editing Media] and change the line: + INCLUDEINBUILD=NO + to: + INCLUDEINBUILD=<> + + 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!