- Changed ETB tag toolbar to a notebook with tag/texture pages (Shaderman)
authornamespace <namespace>
Tue, 3 Oct 2006 16:23:28 +0000 (16:23 +0000)
committernamespace <namespace>
Tue, 3 Oct 2006 16:23:28 +0000 (16:23 +0000)
- 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

CHANGES
radiant/texwindow.cpp
setup/win32/HOWTO
setup/win32/HOWTO_outdated [new file with mode: 0644]

diff --git a/CHANGES b/CHANGES
index da0a779..97a0c58 100644 (file)
--- 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
index e3b7351..254a721 100644 (file)
@@ -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<CopiedString> 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<TextureBrowser, TextureBrowser_activeShadersChanged>(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?
index 775887a..af0ddb6 100644 (file)
-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
-<<GTK_DIR>> 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 <insert your name here>
+- 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 = <<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!
+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 (file)
index 0000000..775887a
--- /dev/null
@@ -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!