Updated addon repository URL and improved debug output on download
[supertux.git] / tools / tilemanager / Application.cs
index a72031c..deaf73b 100644 (file)
@@ -1,17 +1,20 @@
+//  $Id$
 using System;
 using System.IO;
 using System.Collections;
 using Gtk;
 using Gdk;
-using Gnome;
 using Glade;
 
 public class Application {
     [Glade.Widget]
     private Gtk.Window MainWindow;
     [Glade.Widget]
+    private Gtk.CheckMenuItem useNewSyntax;
+    [Glade.Widget]
     private Gtk.DrawingArea DrawingArea;
     [Glade.Widget]
+       //Flags CheckButtons
     private Gtk.CheckButton SolidCheckButton;
     [Glade.Widget]
     private Gtk.CheckButton UniSolidCheckButton;
@@ -20,28 +23,42 @@ public class Application {
     [Glade.Widget]
     private Gtk.CheckButton WaterCheckButton;
     [Glade.Widget]
+    private Gtk.CheckButton HurtsCheckButton;
+    [Glade.Widget]
+    private Gtk.CheckButton FireCheckButton;
+    [Glade.Widget]
+    private Gtk.CheckButton BrickCheckButton;
+    [Glade.Widget]
+    private Gtk.CheckButton CoinCheckButton;
+    [Glade.Widget]
+    private Gtk.CheckButton FullBoxCheckButton;
+    [Glade.Widget]
     private Gtk.CheckButton SlopeCheckButton;
     [Glade.Widget]
+    private Gtk.CheckButton GoalCheckButton;
+    [Glade.Widget]
     private Gtk.CheckButton DontUseCheckButton;
     [Glade.Widget]
     private Gtk.CheckButton HiddenCheckButton;
     [Glade.Widget]
+
     private Gtk.Entry DataEntry;
     [Glade.Widget]
     private Gtk.Entry AnimFpsEntry;
     [Glade.Widget]
     private Gtk.Entry IDEntry;
     [Glade.Widget]
-    private Gnome.AppBar AppBar;
-    [Glade.Widget]
-    private Gtk.VBox MainLayout;
-    [Glade.Widget]
     private Gtk.TreeView TileList;
     [Glade.Widget]
     private Gtk.Combo TileGroupComboBox;
     [Glade.Widget]
     private Gtk.MenuItem AddTileGroupMenu;
 
+    [Glade.Widget]
+    private Gtk.Dialog RemapDialog;
+    [Glade.Widget]
+    private Gtk.SpinButton RD_spinButton;
+
     private string tilesetdir;
     private string tilesetfile;
     private TileSet tileset;
@@ -75,20 +92,13 @@ public class Application {
         Glade.XML gxml = new Glade.XML(null, "tiler.glade", null, null);
         gxml.Autoconnect(this);
 
-        if(MainWindow == null || DrawingArea == null || AppBar == null)
+        if(MainWindow == null || DrawingArea == null || RemapDialog == null)
             throw new Exception("some widgets not found");
 
         DrawingArea.AddEvents((int) Gdk.EventMask.ButtonPressMask);
         DrawingArea.AddEvents((int) Gdk.EventMask.ButtonReleaseMask);
         DrawingArea.AddEvents((int) Gdk.EventMask.ButtonMotionMask);
 
-        // libglade missed interactivity property :-/
-        MainLayout.Remove(AppBar);
-        AppBar = new AppBar(true, true, PreferencesType.Always);
-        AppBar.UserResponse += new EventHandler(OnAppBarUserResponse);
-        MainLayout.PackStart(AppBar, false, false, 0);
-        AppBar.Show();
-
         MainWindow.Show();
     }
 
@@ -100,12 +110,12 @@ public class Application {
        fileChooser.DefaultResponse = Gtk.ResponseType.Ok;
        Gtk.FileFilter filter;
        filter = new Gtk.FileFilter();
-       filter.Name = "Supertux 0.1.x tilesets";
+       filter.Name = "Supertux tilesets";
+       filter.AddPattern("*.strf");
        filter.AddPattern("*.stgt");
        fileChooser.AddFilter( filter );
        filter = new Gtk.FileFilter();
-       filter.Name = "Supertux tilesets";
-       filter.AddPattern("*.strf");
+       filter.Name = "Supertux 0.1.x tilesets";
        filter.AddPattern("*.stgt");
        fileChooser.AddFilter( filter );
        filter = new Gtk.FileFilter();
@@ -139,6 +149,11 @@ public class Application {
         SelectionChanged();
         FillTileGroupComboBox();
         FillTileList();
+
+       useNewSyntax.Active = tileset.IsNew;
+       if (tileset.IsNew)
+               Console.WriteLine("Warning: new syntax of 0.3.x files \"More tiles in one image\" isn't currently supported for WRITING");
+
     }
 
     protected void OnImportImage(object o, EventArgs e) {
@@ -176,7 +191,7 @@ public class Application {
                 tile.ID = startid + i;
                 ImageRegion region = new ImageRegion();
                 region.ImageFile = currentimage;
-                region.Region = new System.Drawing.Rectangle(x*32, y*32, 32, 32);
+                region.Region = new System.Drawing.Rectangle(x*TileSet.TILE_WIDTH, y*TileSet.TILE_HEIGHT, TileSet.TILE_WIDTH, TileSet.TILE_HEIGHT);
                 tile.Images.Add(region);
                 if(Tiles[i] != null) {
                     Console.WriteLine(
@@ -198,15 +213,15 @@ public class Application {
         }
         try {
             pixbuf = new Pixbuf(tilesetdir + "/" + file);
-            if(pixbuf.Width % 32 != 0 || pixbuf.Height % 32 != 0)
+            if(pixbuf.Width % TileSet.TILE_WIDTH != 0 || pixbuf.Height % TileSet.TILE_HEIGHT != 0)
                 Console.WriteLine("Warning: Image Width or Height is not a multiple of 32");
         } catch(Exception e) {
             ShowException(e);
             return;
         }
         currentimage = new FileInfo(file).Name;
-        TilesX = pixbuf.Width / 32;
-        TilesY = pixbuf.Height / 32;
+        TilesX = pixbuf.Width / TileSet.TILE_WIDTH;
+        TilesY = pixbuf.Height / TileSet.TILE_HEIGHT;
         SelectionArray = new bool[TilesX * TilesY];
         Tiles = new Tile[TilesX * TilesY];
 
@@ -218,8 +233,8 @@ public class Application {
                 continue;
             ImageRegion region = (ImageRegion) tile.Images[0];
             if(region.ImageFile == currentimage) {
-                int px = region.Region.X / 32;
-                int py = region.Region.Y / 32;
+                int px = region.Region.X / TileSet.TILE_WIDTH;
+                int py = region.Region.Y / TileSet.TILE_HEIGHT;
                 int i = py*TilesX+px;
                 if(i < 0 || i >= Tiles.Length) {
                     Console.WriteLine("Invalid Imageregion at tile " +
@@ -228,7 +243,7 @@ public class Application {
                 }
                 if(Tiles[i] != null) {
                     Console.WriteLine("Multiple tiles for region " +
-                            px*32 + " , " + py*32);
+                            px*TileSet.TILE_WIDTH + " , " + py*TileSet.TILE_HEIGHT);
                     continue;
                 }
                 Tiles[i] = tile;
@@ -243,11 +258,14 @@ public class Application {
     }
 
     protected void OnSave(object o, EventArgs e) {
-       if (tileset.TooNew)
-               Console.WriteLine(
-               "Sorry, the file you are editing is too new, there will be huge data loss if you save this.");
-       else
+       if (tileset.IsNew && useNewSyntax.Active) {
+               MessageDialog dialog = new MessageDialog(MainWindow, DialogFlags.Modal | DialogFlags.DestroyWithParent, MessageType.Error, ButtonsType.Ok,
+                                                               "Sorry, the file you are editing is too new and 0.3.x syntax is not supported yet.");
+               dialog.Run();
+               dialog.Destroy();
+       } else {
                tileset.Write(tilesetfile);
+       }
     }
 
     protected void OnQuit(object o, EventArgs e) {
@@ -291,35 +309,39 @@ public class Application {
     }
 
     protected void OnRemapTiles(object o, EventArgs e) {
-        AppBar.SetPrompt("Start-ID:", true);
-    }
-
-    protected void OnCreateTileGroup(object o, EventArgs e) {
+       if(Tiles == null)
+               return;
+       RemapDialog.Show();
     }
 
-    protected void OnRenameTileGroup(object o, EventArgs e) {
+    protected void OnRemapDialogCancel(object o, EventArgs e) {
+       RemapDialog.Hide();
     }
 
-    protected void OnAppBarUserResponse(object o, EventArgs e) {
+    protected void OnRemapDialogApply(object o, EventArgs e) {
+       RemapDialog.Hide();
         try {
-            if(AppBar.Response == null || AppBar.Response == ""
-                    || Tiles == null)
-                return;
 
             // remap tiles
             int id;
             try {
-                id = Int32.Parse(AppBar.Response);
+                id = RD_spinButton.ValueAsInt;
             } catch(Exception exception) {
                 ShowException(exception);
                 return;
             }
             RemapTiles(id);
         } finally {
-            AppBar.ClearPrompt();
+            RD_spinButton.Value = 1;
         }
     }
 
+    protected void OnCreateTileGroup(object o, EventArgs e) {
+    }
+
+    protected void OnRenameTileGroup(object o, EventArgs e) {
+    }
+
     protected void RemapTiles(int startID) {
        if(Tiles == null)
                return;
@@ -376,7 +398,7 @@ public class Application {
     }
 
     private void select(int x, int y) {
-        int tile = y/32 * TilesX + x/32;
+        int tile = y/TileSet.TILE_HEIGHT * TilesX + x/TileSet.TILE_WIDTH;
         if(tile < 0 || tile >= SelectionArray.Length)
             return;
 
@@ -399,15 +421,27 @@ public class Application {
             return;
         foreach(Tile tile in Selection) {
             if(sender == SolidCheckButton)
-                tile.Solid = SolidCheckButton.Active;
+                tile.SetAttribute(Attribute.SOLID, SolidCheckButton.Active);
             if(sender == UniSolidCheckButton)
-                tile.UniSolid = UniSolidCheckButton.Active;
+                tile.SetAttribute(Attribute.UNISOLID, UniSolidCheckButton.Active);
             if(sender == IceCheckButton)
-                tile.Ice = IceCheckButton.Active;
+                tile.SetAttribute(Attribute.ICE, IceCheckButton.Active);
             if(sender == WaterCheckButton)
-                tile.Water = WaterCheckButton.Active;
+                tile.SetAttribute(Attribute.WATER, WaterCheckButton.Active);
+            if(sender == HurtsCheckButton)
+                tile.SetAttribute(Attribute.HURTS, HurtsCheckButton.Active);
+            if(sender == FireCheckButton)
+                tile.SetAttribute(Attribute.FIRE, FireCheckButton.Active);
+            if(sender == BrickCheckButton)
+                tile.SetAttribute(Attribute.BRICK, BrickCheckButton.Active);
+            if(sender == CoinCheckButton)
+                tile.SetAttribute(Attribute.COIN, CoinCheckButton.Active);
+            if(sender == FullBoxCheckButton)
+                tile.SetAttribute(Attribute.FULLBOX, FullBoxCheckButton.Active);
             if(sender == SlopeCheckButton)
-                tile.Slope = SlopeCheckButton.Active;
+                tile.SetAttribute(Attribute.SLOPE, SlopeCheckButton.Active);
+            if(sender == GoalCheckButton)
+                tile.SetAttribute(Attribute.GOAL, GoalCheckButton.Active);
             if(sender == HiddenCheckButton)
                 tile.Hidden = HiddenCheckButton.Active;
             if(sender == DontUseCheckButton)
@@ -455,11 +489,17 @@ public class Application {
         string nextimage = "";
         foreach(Tile tile in Selection) {
             if(first) {
-                SolidCheckButton.Active = tile.Solid;
-                UniSolidCheckButton.Active = tile.UniSolid;
-                IceCheckButton.Active = tile.Ice;
-                WaterCheckButton.Active = tile.Water;
-                SlopeCheckButton.Active = tile.Slope;
+                SolidCheckButton.Active = tile.HasAttribute(Attribute.SOLID);
+                UniSolidCheckButton.Active = tile.HasAttribute(Attribute.UNISOLID);
+                IceCheckButton.Active = tile.HasAttribute(Attribute.ICE);
+                WaterCheckButton.Active = tile.HasAttribute(Attribute.WATER);
+                HurtsCheckButton.Active = tile.HasAttribute(Attribute.HURTS);
+                FireCheckButton.Active = tile.HasAttribute(Attribute.FIRE);
+                BrickCheckButton.Active = tile.HasAttribute(Attribute.BRICK);
+                CoinCheckButton.Active = tile.HasAttribute(Attribute.COIN);
+                FullBoxCheckButton.Active = tile.HasAttribute(Attribute.FULLBOX);
+                SlopeCheckButton.Active = tile.HasAttribute(Attribute.SLOPE);
+                GoalCheckButton.Active = tile.HasAttribute(Attribute.GOAL);
                 HiddenCheckButton.Active = tile.Hidden;
                 DontUseCheckButton.Active = tile.ID == -1;
                 DataEntry.Text = tile.Data.ToString();