From 905da9d681fa13f621440e37adf4212ef96df969 Mon Sep 17 00:00:00 2001 From: Andrew Kesterson Date: Sat, 24 May 2014 10:18:35 -0700 Subject: [PATCH] Midstream on #8: Got the 'Load' button working (Save/Load, yay) and renamed the rest of the buttons --- lib/tailor/GUI/TilesetEditor.rb | 36 ++++++++++++++++++++---- lib/tailor/Tileset.rb | 50 +++++++++++++++++++++++++++------ 2 files changed, 71 insertions(+), 15 deletions(-) diff --git a/lib/tailor/GUI/TilesetEditor.rb b/lib/tailor/GUI/TilesetEditor.rb index 5b9883d..31060e6 100644 --- a/lib/tailor/GUI/TilesetEditor.rb +++ b/lib/tailor/GUI/TilesetEditor.rb @@ -23,15 +23,18 @@ module Tailor @tilesetProperties = Tailor::GUI::TilesetProperties.new(@panel, Wx::ID_ANY) evt_tileprops_changed(@tilesetProperties) { |event| on_tilepropsChanged(event) } tmpversizer.add(@tilesetProperties, 0, flag = Wx::EXPAND|Wx::ALL) - @cancelBtn = Wx::Button.new(@panel, Wx::ID_ANY, "Cancel") + @cancelBtn = Wx::Button.new(@panel, Wx::ID_ANY, "Close") evt_button(@cancelBtn.get_id()) { |event| on_CancelClicked(event) } - @importBtn = Wx::Button.new(@panel, Wx::ID_ANY, "Import") + @importBtn = Wx::Button.new(@panel, Wx::ID_ANY, "Import Image") evt_button(@importBtn.get_id()) { |event| on_ImportClicked(event) } - @exportBtn = Wx::Button.new(@panel, Wx::ID_ANY, "Export") + @exportBtn = Wx::Button.new(@panel, Wx::ID_ANY, "Export Images") evt_button(@exportBtn.get_id()) { |event| on_ExportClicked(event) } - @saveBtn = Wx::Button.new(@panel, Wx::ID_ANY, "Save") + @loadBtn = Wx::Button.new(@panel, Wx::ID_ANY, "Load JSON") + evt_button(@loadBtn.get_id()) { |event| on_LoadClicked(event) } + + @saveBtn = Wx::Button.new(@panel, Wx::ID_ANY, "Save JSON") evt_button(@saveBtn.get_id()) { |event| on_SaveClicked(event) } tmpversizer.add_spacer(20) @@ -39,6 +42,8 @@ module Tailor tmpversizer.add_spacer(20) tmpversizer.add(@exportBtn, 0, flag=Wx::EXPAND) tmpversizer.add_spacer(20) + tmpversizer.add(@loadBtn, 0, flag=Wx::EXPAND) + tmpversizer.add_spacer(20) tmpversizer.add(@saveBtn, 0, flag=Wx::EXPAND) tmpversizer.add_spacer(20) tmpversizer.add(@cancelBtn, 0, flag=Wx::EXPAND) @@ -103,8 +108,8 @@ module Tailor :wildcard => wildcards, :style => Wx::FD_FILE_MUST_EXIST | Wx::FD_PREVIEW ) if fd.show_modal == Wx::ID_OK - @tilesetFilename = fd.get_path @tilesetNames = [] + @tilesetImage = Wx::Image.new(fd.get_path) refresh_image (0..(@tilesetSlicer.get_size)).each do |i| @tilesetNames << "Tile #{i}" @@ -148,6 +153,26 @@ module Tailor end + def on_LoadClicked(event) + @tileset = Tailor::Tileset.new + wildcards = "*.json" + fd = Wx::FileDialog.new(self, "Select tileset to load", + :wildcard => wildcards, + :style => Wx::FD_FILE_MUST_EXIST) + if fd.show_modal == Wx::ID_OK + @tileset.from_json(JSON.parse(File.read(fd.get_path))) + # FIXME : This is redundant. + @tileset.tiles.each do |tile| + @tilesetNames << tile['name'] + end + @tilesetImage = @tileset.image + @tileNameCtrl.disable + @tilesetSlicer.tileset = @tileset + @tilesetProperties.set_tileset(@tileset) + refresh_image + end + end + def on_SaveClicked(event) wildcards = "*.json" fd = Wx::FileDialog.new(self, "Select tileset to import", @@ -208,7 +233,6 @@ module Tailor def refresh_image begin - @tilesetImage = Wx::Image.new(@tilesetFilename) if @tilesetImage.is_ok @tilesetSlicer.set_image @tilesetImage # The + 20 here is a hack to make scroll bars go away where we don't want them diff --git a/lib/tailor/Tileset.rb b/lib/tailor/Tileset.rb index 59630d5..ccdf7b8 100644 --- a/lib/tailor/Tileset.rb +++ b/lib/tailor/Tileset.rb @@ -15,6 +15,7 @@ module Tailor attr_accessor :space_y attr_accessor :pad_x attr_accessor :pad_y + attr_accessor :tiles def initialize self.image = nil @@ -27,9 +28,9 @@ module Tailor self.space_y = 0 self.pad_x = 0 self.pad_y = 0 - @tiles = [] + self.tiles = [] end - + def add_tile(name, image) if image.instance_of?(Wx::Bitmap) image = Wx::Image.from_bitmap(image) @@ -37,18 +38,20 @@ module Tailor throw TypeError("Tailor::Tileset::add_tile only accepts Wx::Image or Wx::Bitmap") return end - @tiles << {"name" => name, "image" => image} + self.tiles << {"name" => name, "image" => image} end - + def get_tile(elem) if elem.instance_of?(String) - @tiles.each do + self.tiles.each do if tile['name'] == elem return tile['image'] end end elsif elem.instance_of?(Integer) - return @tiles[elem]['image'] + if elem <= self.tiles.size + return self.tiles[elem]['image'] + end end end @@ -60,6 +63,34 @@ module Tailor io_obj.write(JSON.pretty_generate(obj)) end + def from_json(js) + self.tileset_name = js['name'] + self.license = js['license'] + self.notes = js['notes'] + self.tile_x = js['dimensions']['tile_x'] + self.tile_y = js['dimensions']['tile_y'] + self.space_x = js['dimensions']['space_x'] + self.space_y = js['dimensions']['space_y'] + self.pad_x = js['dimensions']['pad_x'] + self.pad_y = js['dimensions']['pad_y'] + StringIO.open do |iostream| + iostream.write(Base64.decode64(js['image'])) + iostream.rewind + self.image = Wx::Image.read(iostream, Wx::BITMAP_TYPE_PNG) + end + self.tiles = [] + js['tiles'].each do |tile| + StringIO.open do |iostream| + iostream.write(Base64.decode64(tile['image'])) + iostream.rewind + self.tiles << { + 'name' => tile['name'], + 'image' => Wx::Image.read(iostream, Wx::BITMAP_TYPE_PNG) + } + end + end + end + def to_json(callback = nil) obj = { "name" => self.tileset_name, @@ -76,7 +107,7 @@ module Tailor "image" => "", "tiles" => [] } - + StringIO.open do |iostream| if self.image.nil? obj['image']=nil @@ -88,7 +119,7 @@ module Tailor end idx = 0 - @tiles.each do |tile| + self.tiles.each do |tile| StringIO.open do |iostream| if not callback.nil? callback.call("Converting to base64", tile['image'], tile['name'], idx) @@ -103,8 +134,9 @@ module Tailor end idx += 1 end - + obj end + end end