wxruby3-shapes 0.9.0.pre.beta.3 → 0.9.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/INSTALL.md +5 -7
 - data/README.md +38 -6
 - data/assets/logo.svg +339 -0
 - data/assets/logo.xpm +60 -0
 - data/assets/screenshot.png +0 -0
 - data/assets/social.png +0 -0
 - data/bin/wx-shapes +1 -1
 - data/lib/wx/shapes/arrow_base.rb +4 -11
 - data/lib/wx/shapes/arrows/circle_arrow.rb +22 -11
 - data/lib/wx/shapes/arrows/circle_prong_arrow.rb +48 -0
 - data/lib/wx/shapes/arrows/cross_bar_arrow.rb +57 -0
 - data/lib/wx/shapes/arrows/cross_bar_circle_arrow.rb +56 -0
 - data/lib/wx/shapes/arrows/cross_bar_prong_arrow.rb +49 -0
 - data/lib/wx/shapes/arrows/crossed_circle.rb +46 -0
 - data/lib/wx/shapes/arrows/cup_arrow.rb +65 -0
 - data/lib/wx/shapes/arrows/diamond_arrow.rb +8 -13
 - data/lib/wx/shapes/arrows/double_cross_bar_arrow.rb +27 -0
 - data/lib/wx/shapes/arrows/filled_arrow.rb +60 -0
 - data/lib/wx/shapes/arrows/line_arrow.rb +67 -0
 - data/lib/wx/shapes/arrows/open_arrow.rb +22 -23
 - data/lib/wx/shapes/arrows/prong_arrow.rb +42 -0
 - data/lib/wx/shapes/arrows/solid_arrow.rb +21 -35
 - data/lib/wx/shapes/arrows/square_arrow.rb +37 -0
 - data/lib/wx/shapes/auto_layout.rb +2 -2
 - data/lib/wx/shapes/base.rb +1 -1
 - data/lib/wx/shapes/canvas_history.rb +20 -0
 - data/lib/wx/shapes/connection_point.rb +10 -6
 - data/lib/wx/shapes/diagram.rb +98 -78
 - data/lib/wx/shapes/events.rb +8 -8
 - data/lib/wx/shapes/printout.rb +3 -16
 - data/lib/wx/shapes/serializable.rb +2 -436
 - data/lib/wx/shapes/serialize/wx.rb +30 -18
 - data/lib/wx/shapes/shape.rb +211 -168
 - data/lib/wx/shapes/shape_canvas.rb +728 -267
 - data/lib/wx/shapes/shape_data_object.rb +99 -18
 - data/lib/wx/shapes/shape_handle.rb +18 -11
 - data/lib/wx/shapes/shape_list.rb +34 -67
 - data/lib/wx/shapes/shapes/bitmap_shape.rb +23 -24
 - data/lib/wx/shapes/shapes/box_shape.rb +389 -0
 - data/lib/wx/shapes/shapes/circle_shape.rb +19 -22
 - data/lib/wx/shapes/shapes/control_shape.rb +77 -41
 - data/lib/wx/shapes/shapes/curve_shape.rb +38 -31
 - data/lib/wx/shapes/shapes/diamond_shape.rb +7 -17
 - data/lib/wx/shapes/shapes/edit_text_shape.rb +6 -9
 - data/lib/wx/shapes/shapes/ellipse_shape.rb +12 -15
 - data/lib/wx/shapes/shapes/flex_grid_shape.rb +58 -33
 - data/lib/wx/shapes/shapes/grid_shape.rb +259 -161
 - data/lib/wx/shapes/shapes/line_shape.rb +155 -161
 - data/lib/wx/shapes/shapes/manager_shape.rb +77 -0
 - data/lib/wx/shapes/shapes/multi_sel_rect.rb +8 -8
 - data/lib/wx/shapes/shapes/ortho_shape.rb +31 -36
 - data/lib/wx/shapes/shapes/polygon_shape.rb +23 -29
 - data/lib/wx/shapes/shapes/rect_shape.rb +95 -53
 - data/lib/wx/shapes/shapes/round_ortho_shape.rb +6 -8
 - data/lib/wx/shapes/shapes/round_rect_shape.rb +20 -24
 - data/lib/wx/shapes/shapes/square_shape.rb +14 -17
 - data/lib/wx/shapes/shapes/text_shape.rb +95 -53
 - data/lib/wx/shapes/version.rb +1 -1
 - data/lib/wx/shapes/wx.rb +16 -7
 - data/lib/wx/wx-shapes/cmd/test.rb +1 -1
 - data/samples/demo/arrows.json +1 -0
 - data/samples/demo/arrows.yaml +793 -0
 - data/samples/demo/art/HBox.xpm +22 -0
 - data/samples/demo/art/VBox.xpm +22 -0
 - data/samples/demo/art/logo.xpm +60 -0
 - data/samples/demo/class.json +1 -0
 - data/samples/demo/class.yaml +5631 -0
 - data/samples/demo/demo.rb +301 -91
 - data/samples/demo/dialogs.rb +1405 -0
 - data/samples/demo/erd.json +1 -0
 - data/samples/demo/erd.yaml +4072 -0
 - data/samples/demo/frame_canvas.rb +409 -33
 - data/samples/sample1/art/logo.xpm +60 -0
 - data/samples/sample1/sample.rb +11 -11
 - data/samples/sample2/art/logo.xpm +60 -0
 - data/samples/sample2/sample.rb +2 -2
 - data/samples/sample2/sample_shape.rb +15 -15
 - data/samples/sample3/art/logo.xpm +60 -0
 - data/samples/sample3/sample.rb +3 -3
 - data/samples/sample4/art/logo.xpm +60 -0
 - data/samples/sample4/sample.rb +2 -2
 - data/tests/lib/wxapp_runner.rb +4 -0
 - data/tests/serializer_tests.rb +8 -441
 - data/tests/test_grid_shapes.rb +2 -2
 - data/tests/test_serialize_xml.rb +17 -0
 - data/tests/test_serialize_yaml.rb +2 -2
 - metadata +78 -28
 - data/lib/wx/shapes/serialize/core.rb +0 -40
 - data/lib/wx/shapes/serialize/id.rb +0 -82
 - data/lib/wx/shapes/serializer/json.rb +0 -258
 - data/lib/wx/shapes/serializer/yaml.rb +0 -125
 - data/samples/demo/art/sample.xpm +0 -251
 - data/samples/sample1/art/sample.xpm +0 -251
 - data/samples/sample2/art/sample.xpm +0 -251
 - data/samples/sample3/art/sample.xpm +0 -251
 - data/samples/sample4/art/sample.xpm +0 -251
 
| 
         @@ -4,9 +4,9 @@ 
     | 
|
| 
       4 
4 
     | 
    
         
             
            module Wx::SF
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         
             
              # Class encapsulating data object used during clipboard operations with shapes.
         
     | 
| 
       7 
     | 
    
         
            -
              class ShapeDataObject < Wx:: 
     | 
| 
      
 7 
     | 
    
         
            +
              class ShapeDataObject < Wx::DataObject
         
     | 
| 
       8 
8 
     | 
    
         | 
| 
       9 
     | 
    
         
            -
                DataFormatID = 'ShapeFrameWorkDataFormat1_0'
         
     | 
| 
      
 9 
     | 
    
         
            +
                DataFormatID = Wx::DataFormat.new('ShapeFrameWorkDataFormat1_0')
         
     | 
| 
       10 
10 
     | 
    
         | 
| 
       11 
11 
     | 
    
         
             
                # @overload initialize()
         
     | 
| 
       12 
12 
     | 
    
         
             
                #   Default constructor
         
     | 
| 
         @@ -14,30 +14,111 @@ module Wx::SF 
     | 
|
| 
       14 
14 
     | 
    
         
             
                #   User constructor
         
     | 
| 
       15 
15 
     | 
    
         
             
                #   @param [Array<Wx::SF::Shape>] selection List of shapes which should be stored in the data object
         
     | 
| 
       16 
16 
     | 
    
         
             
                def initialize(selection = nil)
         
     | 
| 
       17 
     | 
    
         
            -
                   
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
      
 17 
     | 
    
         
            +
                  unless selection.nil? || (selection.is_a?(Array) && selection.all? { |e| e.is_a?(Shape) })
         
     | 
| 
      
 18 
     | 
    
         
            +
                    raise SFException, 'Expected nil or Array<Wx::SF::Shape>'
         
     | 
| 
      
 19 
     | 
    
         
            +
                  end
         
     | 
| 
      
 20 
     | 
    
         
            +
                  super()
         
     | 
| 
      
 21 
     | 
    
         
            +
                  @shapes = selection
         
     | 
| 
      
 22 
     | 
    
         
            +
                  @data = nil
         
     | 
| 
      
 23 
     | 
    
         
            +
                  @format = DataFormatID.get_type
         
     | 
| 
       19 
24 
     | 
    
         
             
                end
         
     | 
| 
       20 
25 
     | 
    
         | 
| 
       21 
     | 
    
         
            -
                 
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
                   
     | 
| 
      
 26 
     | 
    
         
            +
                def get_as_text
         
     | 
| 
      
 27 
     | 
    
         
            +
                  if  @format == DataFormatID.get_type
         
     | 
| 
      
 28 
     | 
    
         
            +
                    @data ||= (@shapes ? @shapes.serialize(format: :yaml) : nil)
         
     | 
| 
      
 29 
     | 
    
         
            +
                  end
         
     | 
| 
      
 30 
     | 
    
         
            +
                  @data || ''
         
     | 
| 
       25 
31 
     | 
    
         
             
                end
         
     | 
| 
       26 
32 
     | 
    
         | 
| 
       27 
     | 
    
         
            -
                 
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
                   
     | 
| 
      
 33 
     | 
    
         
            +
                def get_as_shapes
         
     | 
| 
      
 34 
     | 
    
         
            +
                  if @format == Wx::DataFormatId::DF_TEXT || @format == Wx::DataFormatId::DF_UNICODETEXT
         
     | 
| 
      
 35 
     | 
    
         
            +
                    @shapes ||= (@data && @data.size>0 ? FIRM.deserialize(@data, format: :yaml) : nil)
         
     | 
| 
      
 36 
     | 
    
         
            +
                  end
         
     | 
| 
      
 37 
     | 
    
         
            +
                  @shapes || []
         
     | 
| 
       31 
38 
     | 
    
         
             
                end
         
     | 
| 
       32 
39 
     | 
    
         | 
| 
       33 
     | 
    
         
            -
                #  
     | 
| 
       34 
     | 
    
         
            -
                #  
     | 
| 
       35 
     | 
    
         
            -
                #  
     | 
| 
       36 
     | 
    
         
            -
                def  
     | 
| 
       37 
     | 
    
         
            -
                   
     | 
| 
       38 
     | 
    
         
            -
                  true
         
     | 
| 
      
 40 
     | 
    
         
            +
                # List all the formats that we support. By default, the first is
         
     | 
| 
      
 41 
     | 
    
         
            +
                # treated as the 'preferred' format; this can be overridden by
         
     | 
| 
      
 42 
     | 
    
         
            +
                # providing a get_preferred format.
         
     | 
| 
      
 43 
     | 
    
         
            +
                def get_all_formats(direction)
         
     | 
| 
      
 44 
     | 
    
         
            +
                  [ DataFormatID, Wx::DF_TEXT, Wx::DF_UNICODETEXT ]
         
     | 
| 
       39 
45 
     | 
    
         
             
                end
         
     | 
| 
       40 
46 
     | 
    
         | 
| 
      
 47 
     | 
    
         
            +
                # Do setting the data
         
     | 
| 
      
 48 
     | 
    
         
            +
                def set_data(format, the_data)
         
     | 
| 
      
 49 
     | 
    
         
            +
                  case format.get_type
         
     | 
| 
      
 50 
     | 
    
         
            +
                  when DataFormatID.get_type
         
     | 
| 
      
 51 
     | 
    
         
            +
                    @shapes = if the_data.size > 0
         
     | 
| 
      
 52 
     | 
    
         
            +
                                begin
         
     | 
| 
      
 53 
     | 
    
         
            +
                                  FIRM.deserialize(the_data, format: :yaml)
         
     | 
| 
      
 54 
     | 
    
         
            +
                                rescue Exception
         
     | 
| 
      
 55 
     | 
    
         
            +
                                  $stderr.puts "#{$!}\n#{$!.backtrace.join("\n")}"
         
     | 
| 
      
 56 
     | 
    
         
            +
                                  return false
         
     | 
| 
      
 57 
     | 
    
         
            +
                                end
         
     | 
| 
      
 58 
     | 
    
         
            +
                              else
         
     | 
| 
      
 59 
     | 
    
         
            +
                                nil
         
     | 
| 
      
 60 
     | 
    
         
            +
                              end
         
     | 
| 
      
 61 
     | 
    
         
            +
                    @data = nil
         
     | 
| 
      
 62 
     | 
    
         
            +
                    @format = format.get_type
         
     | 
| 
      
 63 
     | 
    
         
            +
                    true
         
     | 
| 
      
 64 
     | 
    
         
            +
                  when Wx::DataFormatId::DF_TEXT, Wx::DataFormatId::DF_UNICODETEXT
         
     | 
| 
      
 65 
     | 
    
         
            +
                    @data = the_data
         
     | 
| 
      
 66 
     | 
    
         
            +
                    @shapes = nil
         
     | 
| 
      
 67 
     | 
    
         
            +
                    @format = format.get_type
         
     | 
| 
      
 68 
     | 
    
         
            +
                    true
         
     | 
| 
      
 69 
     | 
    
         
            +
                  else
         
     | 
| 
      
 70 
     | 
    
         
            +
                    false
         
     | 
| 
      
 71 
     | 
    
         
            +
                  end
         
     | 
| 
      
 72 
     | 
    
         
            +
                end
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
                def get_data_size(format)
         
     | 
| 
      
 75 
     | 
    
         
            +
                  case format.get_type
         
     | 
| 
      
 76 
     | 
    
         
            +
                  when Wx::DataFormatId::DF_TEXT, Wx::DataFormatId::DF_UNICODETEXT
         
     | 
| 
      
 77 
     | 
    
         
            +
                    @data ? @data.size : 0
         
     | 
| 
      
 78 
     | 
    
         
            +
                  when DataFormatID.get_type
         
     | 
| 
      
 79 
     | 
    
         
            +
                    get_as_text.bytesize
         
     | 
| 
      
 80 
     | 
    
         
            +
                  else
         
     | 
| 
      
 81 
     | 
    
         
            +
                    0
         
     | 
| 
      
 82 
     | 
    
         
            +
                  end
         
     | 
| 
      
 83 
     | 
    
         
            +
                end
         
     | 
| 
      
 84 
     | 
    
         
            +
             
     | 
| 
      
 85 
     | 
    
         
            +
                # Do getting the data
         
     | 
| 
      
 86 
     | 
    
         
            +
                def get_data_here(format)
         
     | 
| 
      
 87 
     | 
    
         
            +
                  case format.get_type
         
     | 
| 
      
 88 
     | 
    
         
            +
                  when Wx::DataFormatId::DF_TEXT, Wx::DataFormatId::DF_UNICODETEXT
         
     | 
| 
      
 89 
     | 
    
         
            +
                    @data
         
     | 
| 
      
 90 
     | 
    
         
            +
                  when DataFormatID.get_type
         
     | 
| 
      
 91 
     | 
    
         
            +
                    begin
         
     | 
| 
      
 92 
     | 
    
         
            +
                      get_as_text
         
     | 
| 
      
 93 
     | 
    
         
            +
                    rescue Exception
         
     | 
| 
      
 94 
     | 
    
         
            +
                      $stderr.puts "#{$!}\n#{$!.backtrace.join("\n")}"
         
     | 
| 
      
 95 
     | 
    
         
            +
                      nil
         
     | 
| 
      
 96 
     | 
    
         
            +
                    end
         
     | 
| 
      
 97 
     | 
    
         
            +
                  else
         
     | 
| 
      
 98 
     | 
    
         
            +
                    nil
         
     | 
| 
      
 99 
     | 
    
         
            +
                  end
         
     | 
| 
      
 100 
     | 
    
         
            +
                end
         
     | 
| 
      
 101 
     | 
    
         
            +
             
     | 
| 
      
 102 
     | 
    
         
            +
                # # Returns size of the data object
         
     | 
| 
      
 103 
     | 
    
         
            +
                # # @return [Integer]
         
     | 
| 
      
 104 
     | 
    
         
            +
                # def _get_data_size
         
     | 
| 
      
 105 
     | 
    
         
            +
                #   @data.bytesize
         
     | 
| 
      
 106 
     | 
    
         
            +
                # end
         
     | 
| 
      
 107 
     | 
    
         
            +
                #
         
     | 
| 
      
 108 
     | 
    
         
            +
                # # Exports data from data object.
         
     | 
| 
      
 109 
     | 
    
         
            +
                # # @return [Boolean] true on success, otherwise false
         
     | 
| 
      
 110 
     | 
    
         
            +
                # def _get_data
         
     | 
| 
      
 111 
     | 
    
         
            +
                #   @data
         
     | 
| 
      
 112 
     | 
    
         
            +
                # end
         
     | 
| 
      
 113 
     | 
    
         
            +
                #
         
     | 
| 
      
 114 
     | 
    
         
            +
                # # Function should inport data from data object from given buffer.
         
     | 
| 
      
 115 
     | 
    
         
            +
                # # @param [String] buf External input data buffer
         
     | 
| 
      
 116 
     | 
    
         
            +
                # # @return [Boolean] true on success, otherwise false
         
     | 
| 
      
 117 
     | 
    
         
            +
                # def _set_data(buf)
         
     | 
| 
      
 118 
     | 
    
         
            +
                #   @data = buf ? buf : ''
         
     | 
| 
      
 119 
     | 
    
         
            +
                #   true
         
     | 
| 
      
 120 
     | 
    
         
            +
                # end
         
     | 
| 
      
 121 
     | 
    
         
            +
             
     | 
| 
       41 
122 
     | 
    
         
             
              end
         
     | 
| 
       42 
123 
     | 
    
         | 
| 
       43 
124 
     | 
    
         
             
            end
         
     | 
| 
         @@ -26,6 +26,16 @@ module Wx::SF 
     | 
|
| 
       26 
26 
     | 
    
         
             
                    UNDEF = self.new(11)
         
     | 
| 
       27 
27 
     | 
    
         
             
                  end
         
     | 
| 
       28 
28 
     | 
    
         | 
| 
      
 29 
     | 
    
         
            +
                  class << self
         
     | 
| 
      
 30 
     | 
    
         
            +
                    def handle_brush
         
     | 
| 
      
 31 
     | 
    
         
            +
                      if ShapeCanvas.gc_enabled?
         
     | 
| 
      
 32 
     | 
    
         
            +
                        @gc_brush ||= Wx::Brush.new(Wx::Colour.new(0, 0, 0, 128))
         
     | 
| 
      
 33 
     | 
    
         
            +
                      else
         
     | 
| 
      
 34 
     | 
    
         
            +
                        @dc_brush ||= Wx::BLACK_BRUSH.dup
         
     | 
| 
      
 35 
     | 
    
         
            +
                      end
         
     | 
| 
      
 36 
     | 
    
         
            +
                    end
         
     | 
| 
      
 37 
     | 
    
         
            +
                  end
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
       29 
39 
     | 
    
         
             
                  # Constructor
         
     | 
| 
       30 
40 
     | 
    
         
             
                  # @param [Wx::Shape] parent Parent shape
         
     | 
| 
       31 
41 
     | 
    
         
             
                  # @param [TYPE] type Handle type
         
     | 
| 
         @@ -131,17 +141,14 @@ module Wx::SF 
     | 
|
| 
       131 
141 
     | 
    
         
             
                  # @param [Wx::DC] dc Device context where the handle will be drawn
         
     | 
| 
       132 
142 
     | 
    
         
             
                  def draw_normal(dc)
         
     | 
| 
       133 
143 
     | 
    
         
             
                    dc.with_pen(Wx::PLATFORM == 'WXGTK' ? Wx::TRANSPARENT_PEN : Wx::BLACK_PEN) do
         
     | 
| 
       134 
     | 
    
         
            -
                       
     | 
| 
       135 
     | 
    
         
            -
                         
     | 
| 
       136 
     | 
    
         
            -
             
     | 
| 
       137 
     | 
    
         
            -
                         
     | 
| 
       138 
     | 
    
         
            -
                        # dc.logical_function = Wx::RasterOperationMode::INVERT
         
     | 
| 
       139 
     | 
    
         
            -
                      end
         
     | 
| 
      
 144 
     | 
    
         
            +
                      dc.with_brush(Handle.handle_brush) do
         
     | 
| 
      
 145 
     | 
    
         
            +
                        # unless ShapeCanvas::gc_enabled?
         
     | 
| 
      
 146 
     | 
    
         
            +
                        #   dc.logical_function = Wx::RasterOperationMode::INVERT
         
     | 
| 
      
 147 
     | 
    
         
            +
                        # end
         
     | 
| 
       140 
148 
     | 
    
         | 
| 
       141 
     | 
    
         
            -
             
     | 
| 
       142 
     | 
    
         
            -
             
     | 
| 
       143 
     | 
    
         
            -
             
     | 
| 
       144 
     | 
    
         
            -
                      dc.brush = Wx::NULL_BRUSH
         
     | 
| 
      
 149 
     | 
    
         
            +
                        dc.draw_rectangle(handle_rect)
         
     | 
| 
      
 150 
     | 
    
         
            +
                        # dc.logical_function = Wx::RasterOperationMode::COPY
         
     | 
| 
      
 151 
     | 
    
         
            +
                      end
         
     | 
| 
       145 
152 
     | 
    
         
             
                    end
         
     | 
| 
       146 
153 
     | 
    
         
             
                  end
         
     | 
| 
       147 
154 
     | 
    
         | 
| 
         @@ -161,7 +168,7 @@ module Wx::SF 
     | 
|
| 
       161 
168 
     | 
    
         | 
| 
       162 
169 
     | 
    
         
             
                  # Set parent shape.
         
     | 
| 
       163 
170 
     | 
    
         
             
                  # @param [Wx::Shape] parent parent shape to set
         
     | 
| 
       164 
     | 
    
         
            -
                  def  
     | 
| 
      
 171 
     | 
    
         
            +
                  def set_parent_shape(parent)
         
     | 
| 
       165 
172 
     | 
    
         
             
                    @parent_shape = parent
         
     | 
| 
       166 
173 
     | 
    
         
             
                  end
         
     | 
| 
       167 
174 
     | 
    
         | 
    
        data/lib/wx/shapes/shape_list.rb
    CHANGED
    
    | 
         @@ -2,13 +2,14 @@ 
     | 
|
| 
       2 
2 
     | 
    
         
             
            # Copyright (c) M.J.N. Corino, The Netherlands
         
     | 
| 
       3 
3 
     | 
    
         | 
| 
       4 
4 
     | 
    
         
             
            require 'wx/shapes/serializable'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require 'set'
         
     | 
| 
       5 
6 
     | 
    
         | 
| 
       6 
7 
     | 
    
         
             
            module Wx::SF
         
     | 
| 
       7 
8 
     | 
    
         | 
| 
       8 
9 
     | 
    
         
             
              # This class implements an indexed container for unique, non-nil, shapes (no duplicates).
         
     | 
| 
       9 
10 
     | 
    
         
             
              class ShapeList
         
     | 
| 
       10 
11 
     | 
    
         | 
| 
       11 
     | 
    
         
            -
                include Serializable
         
     | 
| 
      
 12 
     | 
    
         
            +
                include FIRM::Serializable
         
     | 
| 
       12 
13 
     | 
    
         
             
                include ::Enumerable
         
     | 
| 
       13 
14 
     | 
    
         | 
| 
       14 
15 
     | 
    
         
             
                property :list
         
     | 
| 
         @@ -19,19 +20,15 @@ module Wx::SF 
     | 
|
| 
       19 
20 
     | 
    
         
             
                  if enum
         
     | 
| 
       20 
21 
     | 
    
         
             
                    if enum.is_a?(ShapeList)
         
     | 
| 
       21 
22 
     | 
    
         
             
                      @list = enum.instance_variable_get('@list').dup
         
     | 
| 
       22 
     | 
    
         
            -
                      @index = enum.instance_variable_get('@index').dup
         
     | 
| 
       23 
23 
     | 
    
         
             
                    elsif enum.is_a?(::Enumerable)
         
     | 
| 
       24 
     | 
    
         
            -
                      @list =  
     | 
| 
       25 
     | 
    
         
            -
                      @index = {}
         
     | 
| 
      
 24 
     | 
    
         
            +
                      @list = ::Set.new
         
     | 
| 
       26 
25 
     | 
    
         
             
                      enum.each { |elem| self << elem }
         
     | 
| 
       27 
26 
     | 
    
         
             
                    else
         
     | 
| 
       28 
     | 
    
         
            -
                      @list =  
     | 
| 
       29 
     | 
    
         
            -
                      @index = {}
         
     | 
| 
      
 27 
     | 
    
         
            +
                      @list = ::Set.new
         
     | 
| 
       30 
28 
     | 
    
         
             
                      self << enum
         
     | 
| 
       31 
29 
     | 
    
         
             
                    end
         
     | 
| 
       32 
30 
     | 
    
         
             
                  else
         
     | 
| 
       33 
     | 
    
         
            -
                    @list =  
     | 
| 
       34 
     | 
    
         
            -
                    @index = {}
         
     | 
| 
      
 31 
     | 
    
         
            +
                    @list = ::Set.new
         
     | 
| 
       35 
32 
     | 
    
         
             
                  end
         
     | 
| 
       36 
33 
     | 
    
         
             
                end
         
     | 
| 
       37 
34 
     | 
    
         | 
| 
         @@ -42,17 +39,21 @@ module Wx::SF 
     | 
|
| 
       42 
39 
     | 
    
         
             
                # @yieldparam [Shape] shape
         
     | 
| 
       43 
40 
     | 
    
         
             
                # @return [self]
         
     | 
| 
       44 
41 
     | 
    
         
             
                def each(&block)
         
     | 
| 
       45 
     | 
    
         
            -
                   
     | 
| 
       46 
     | 
    
         
            -
             
     | 
| 
      
 42 
     | 
    
         
            +
                  if block_given?
         
     | 
| 
      
 43 
     | 
    
         
            +
                    @list.each(&block)
         
     | 
| 
      
 44 
     | 
    
         
            +
                    self
         
     | 
| 
      
 45 
     | 
    
         
            +
                  else
         
     | 
| 
      
 46 
     | 
    
         
            +
                    @list.each
         
     | 
| 
      
 47 
     | 
    
         
            +
                  end
         
     | 
| 
       47 
48 
     | 
    
         
             
                end
         
     | 
| 
       48 
49 
     | 
    
         | 
| 
       49 
50 
     | 
    
         
             
                # Recursively collects shapes and returns collection.
         
     | 
| 
       50 
51 
     | 
    
         
             
                # @param [Array<Shape>] collection container to return collected shapes in
         
     | 
| 
       51 
52 
     | 
    
         
             
                def all(collection = [])
         
     | 
| 
       52 
     | 
    
         
            -
                  @list.inject(collection) { |list, shape| shape.instance_variable_get('@child_shapes').all(list 
     | 
| 
      
 53 
     | 
    
         
            +
                  @list.inject(collection.concat(@list.to_a)) { |list, shape| shape.instance_variable_get('@child_shapes').all(list) }
         
     | 
| 
       53 
54 
     | 
    
         
             
                end
         
     | 
| 
       54 
55 
     | 
    
         | 
| 
       55 
     | 
    
         
            -
                # Returns true if  
     | 
| 
      
 56 
     | 
    
         
            +
                # Returns true if no shapes are contained, false otherwise.
         
     | 
| 
       56 
57 
     | 
    
         
             
                # @return [Boolean]
         
     | 
| 
       57 
58 
     | 
    
         
             
                def empty?
         
     | 
| 
       58 
59 
     | 
    
         
             
                  @list.empty?
         
     | 
| 
         @@ -62,97 +63,63 @@ module Wx::SF 
     | 
|
| 
       62 
63 
     | 
    
         
             
                # @return [self]
         
     | 
| 
       63 
64 
     | 
    
         
             
                def clear
         
     | 
| 
       64 
65 
     | 
    
         
             
                  @list.clear
         
     | 
| 
       65 
     | 
    
         
            -
                  @index.clear
         
     | 
| 
       66 
66 
     | 
    
         
             
                  self
         
     | 
| 
       67 
67 
     | 
    
         
             
                end
         
     | 
| 
       68 
68 
     | 
    
         | 
| 
       69 
69 
     | 
    
         
             
                # Appends a new shape to the list if not yet in list.
         
     | 
| 
      
 70 
     | 
    
         
            +
                # Does *not* perform a recursive check.
         
     | 
| 
       70 
71 
     | 
    
         
             
                # @param [Shape] shape shape to add
         
     | 
| 
       71 
72 
     | 
    
         
             
                # @return [self]
         
     | 
| 
       72 
73 
     | 
    
         
             
                def append(shape)
         
     | 
| 
       73 
     | 
    
         
            -
                  unless @ 
     | 
| 
      
 74 
     | 
    
         
            +
                  unless @list.include?(check_elem(shape))
         
     | 
| 
       74 
75 
     | 
    
         
             
                    @list << shape
         
     | 
| 
       75 
     | 
    
         
            -
                    @index[shape.id] = shape
         
     | 
| 
       76 
76 
     | 
    
         
             
                  end
         
     | 
| 
       77 
77 
     | 
    
         
             
                  self
         
     | 
| 
       78 
78 
     | 
    
         
             
                end
         
     | 
| 
       79 
79 
     | 
    
         
             
                alias :push :append
         
     | 
| 
       80 
80 
     | 
    
         
             
                alias :<< :append
         
     | 
| 
       81 
81 
     | 
    
         | 
| 
       82 
     | 
    
         
            -
                # Removes the  
     | 
| 
       83 
     | 
    
         
            -
                # @ 
     | 
| 
       84 
     | 
    
         
            -
                def shift
         
     | 
| 
       85 
     | 
    
         
            -
                  return nil if @list.empty?
         
     | 
| 
       86 
     | 
    
         
            -
                  @index.delete(@list.shift.id)
         
     | 
| 
       87 
     | 
    
         
            -
                end
         
     | 
| 
       88 
     | 
    
         
            -
             
     | 
| 
       89 
     | 
    
         
            -
                # Removes the last shape from the list (if any) and returns that.
         
     | 
| 
       90 
     | 
    
         
            -
                # @return [Shape,nil] removed shape or nil if list empty
         
     | 
| 
       91 
     | 
    
         
            -
                def pop
         
     | 
| 
       92 
     | 
    
         
            -
                  return nil if @list.empty?
         
     | 
| 
       93 
     | 
    
         
            -
                  @index.delete(@list.pop.id)
         
     | 
| 
       94 
     | 
    
         
            -
                end
         
     | 
| 
       95 
     | 
    
         
            -
             
     | 
| 
       96 
     | 
    
         
            -
                # Removes a shape matching the key given from the list and returns that.
         
     | 
| 
       97 
     | 
    
         
            -
                # @param [Shape,Serializable::ID] key shape or shape ID to match
         
     | 
| 
      
 82 
     | 
    
         
            +
                # Removes the given shape from the list and returns that.
         
     | 
| 
      
 83 
     | 
    
         
            +
                # @param [Shape] shape shape to match
         
     | 
| 
       98 
84 
     | 
    
         
             
                # @return [Shape,nil] removed shape or nil if none matched
         
     | 
| 
       99 
     | 
    
         
            -
                def delete( 
     | 
| 
       100 
     | 
    
         
            -
                  if  
     | 
| 
       101 
     | 
    
         
            -
                     
     | 
| 
       102 
     | 
    
         
            -
             
     | 
| 
       103 
     | 
    
         
            -
             
     | 
| 
      
 85 
     | 
    
         
            +
                def delete(shape)
         
     | 
| 
      
 86 
     | 
    
         
            +
                  if @list.include?(check_elem(shape))
         
     | 
| 
      
 87 
     | 
    
         
            +
                    @list.delete(shape)
         
     | 
| 
      
 88 
     | 
    
         
            +
                    shape
         
     | 
| 
      
 89 
     | 
    
         
            +
                  else
         
     | 
| 
      
 90 
     | 
    
         
            +
                    nil
         
     | 
| 
       104 
91 
     | 
    
         
             
                  end
         
     | 
| 
       105 
     | 
    
         
            -
                  nil
         
     | 
| 
       106 
92 
     | 
    
         
             
                end
         
     | 
| 
       107 
93 
     | 
    
         | 
| 
       108 
     | 
    
         
            -
                # Returns true if  
     | 
| 
       109 
     | 
    
         
            -
                #  
     | 
| 
      
 94 
     | 
    
         
            +
                # Returns true if the given shape is included in the list.
         
     | 
| 
      
 95 
     | 
    
         
            +
                # Performs a recursive search in case :recursive is true.
         
     | 
| 
      
 96 
     | 
    
         
            +
                # @param [Shape] shape shape to match
         
     | 
| 
       110 
97 
     | 
    
         
             
                # @param [Boolean] recursive pass true to search recursively, false for non-recursive
         
     | 
| 
       111 
98 
     | 
    
         
             
                # @return [Boolean]
         
     | 
| 
       112 
     | 
    
         
            -
                def include?( 
     | 
| 
       113 
     | 
    
         
            -
                  found =  
     | 
| 
       114 
     | 
    
         
            -
             
     | 
| 
       115 
     | 
    
         
            -
                          else
         
     | 
| 
       116 
     | 
    
         
            -
                            @list.include?(key)
         
     | 
| 
       117 
     | 
    
         
            -
                          end
         
     | 
| 
       118 
     | 
    
         
            -
                  found || (recursive && @list.any? { |child| child.instance_variable_get('@child_shapes').include?(key, recursive) })
         
     | 
| 
       119 
     | 
    
         
            -
                end
         
     | 
| 
       120 
     | 
    
         
            -
             
     | 
| 
       121 
     | 
    
         
            -
                # Returns the shape matching the given key or nil if no shape matches.
         
     | 
| 
       122 
     | 
    
         
            -
                # Does not modify the list.
         
     | 
| 
       123 
     | 
    
         
            -
                # @param [Integer,Serializable::ID] key shape list index or shape ID to match
         
     | 
| 
       124 
     | 
    
         
            -
                # @param [Boolean] recursive pass true to search recursively, false for non-recursive
         
     | 
| 
       125 
     | 
    
         
            -
                # @return [Shape,nil] matched shape or nil if none matched
         
     | 
| 
       126 
     | 
    
         
            -
                def get(key, recursive = false)
         
     | 
| 
       127 
     | 
    
         
            -
                  shape = if key.is_a?(Serializable::ID)
         
     | 
| 
       128 
     | 
    
         
            -
                            @index[key]
         
     | 
| 
       129 
     | 
    
         
            -
                          else
         
     | 
| 
       130 
     | 
    
         
            -
                            @list.at(key.to_i)
         
     | 
| 
       131 
     | 
    
         
            -
                          end
         
     | 
| 
       132 
     | 
    
         
            -
                  shape || (recursive && @list.find { |child| child.get(key, recursive) })
         
     | 
| 
      
 99 
     | 
    
         
            +
                def include?(shape, recursive = false)
         
     | 
| 
      
 100 
     | 
    
         
            +
                  found = @list.include?(check_elem(shape))
         
     | 
| 
      
 101 
     | 
    
         
            +
                  found || (recursive && @list.any? { |child| child.include_child_shape?(shape, recursive) })
         
     | 
| 
       133 
102 
     | 
    
         
             
                end
         
     | 
| 
       134 
     | 
    
         
            -
                alias :[] :get
         
     | 
| 
       135 
103 
     | 
    
         | 
| 
       136 
104 
     | 
    
         
             
                private
         
     | 
| 
       137 
105 
     | 
    
         | 
| 
       138 
     | 
    
         
            -
                # Get shape  
     | 
| 
       139 
     | 
    
         
            -
                # @return [ 
     | 
| 
      
 106 
     | 
    
         
            +
                # Get shape set. Serialization only.
         
     | 
| 
      
 107 
     | 
    
         
            +
                # @return [Set<Shape>]
         
     | 
| 
       140 
108 
     | 
    
         
             
                def get_list
         
     | 
| 
       141 
109 
     | 
    
         
             
                  @list
         
     | 
| 
       142 
110 
     | 
    
         
             
                end
         
     | 
| 
       143 
111 
     | 
    
         | 
| 
       144 
     | 
    
         
            -
                # Set shape  
     | 
| 
       145 
     | 
    
         
            -
                # @param [ 
     | 
| 
      
 112 
     | 
    
         
            +
                # Set shape set from deserialization.
         
     | 
| 
      
 113 
     | 
    
         
            +
                # @param [Set<Shape>] list
         
     | 
| 
       146 
114 
     | 
    
         
             
                def set_list(list)
         
     | 
| 
       147 
115 
     | 
    
         
             
                  @list = list
         
     | 
| 
       148 
     | 
    
         
            -
                  @list.each { |shape| @index[shape.id] = shape }
         
     | 
| 
       149 
116 
     | 
    
         
             
                end
         
     | 
| 
       150 
117 
     | 
    
         | 
| 
       151 
118 
     | 
    
         
             
                # Check intended list item
         
     | 
| 
       152 
119 
     | 
    
         
             
                # @param [Shape] shape intended list item
         
     | 
| 
       153 
120 
     | 
    
         
             
                # @return [Shape] checked shape
         
     | 
| 
       154 
121 
     | 
    
         
             
                def check_elem(shape)
         
     | 
| 
       155 
     | 
    
         
            -
                  ::Kernel.raise TypeError,  
     | 
| 
      
 122 
     | 
    
         
            +
                  ::Kernel.raise TypeError, "Expected a Wx::SF::Shape, got #{shape}" unless shape.is_a?(Wx::SF::Shape)
         
     | 
| 
       156 
123 
     | 
    
         
             
                  shape
         
     | 
| 
       157 
124 
     | 
    
         
             
                end
         
     | 
| 
       158 
125 
     | 
    
         | 
| 
         @@ -13,32 +13,22 @@ module Wx::SF 
     | 
|
| 
       13 
13 
     | 
    
         | 
| 
       14 
14 
     | 
    
         
             
                property :can_scale, :bitmap
         
     | 
| 
       15 
15 
     | 
    
         | 
| 
       16 
     | 
    
         
            -
                #  
     | 
| 
       17 
     | 
    
         
            -
                # 
     | 
| 
       18 
     | 
    
         
            -
                # @ 
     | 
| 
       19 
     | 
    
         
            -
                # 
     | 
| 
       20 
     | 
    
         
            -
                 
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
                #   @param [Wx::SF::Diagram] diagram parent diagram
         
     | 
| 
       23 
     | 
    
         
            -
                def initialize(*args)
         
     | 
| 
      
 16 
     | 
    
         
            +
                # Constructor.
         
     | 
| 
      
 17 
     | 
    
         
            +
                # @param [Wx::RealPoint,Wx::Point] pos Initial position
         
     | 
| 
      
 18 
     | 
    
         
            +
                # @param [String] bmp_path Bitmap path
         
     | 
| 
      
 19 
     | 
    
         
            +
                # @param [Wx::SF::Diagram] diagram parent diagram
         
     | 
| 
      
 20 
     | 
    
         
            +
                def initialize(pos = Shape::DEFAULT::POSITION, bmp_path = nil, diagram: nil)
         
     | 
| 
      
 21 
     | 
    
         
            +
                  super(pos, diagram: diagram)
         
     | 
| 
       24 
22 
     | 
    
         
             
                  @bitmap = Wx::NULL_BITMAP
         
     | 
| 
       25 
23 
     | 
    
         
             
                  @art_path = @art_section = nil
         
     | 
| 
       26 
     | 
    
         
            -
                   
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
                    @bitmap_path = nil
         
     | 
| 
       29 
     | 
    
         
            -
                    @original_bitmap = @bitmap = nil
         
     | 
| 
       30 
     | 
    
         
            -
                    @bitmap_type = nil
         
     | 
| 
       31 
     | 
    
         
            -
                  else
         
     | 
| 
       32 
     | 
    
         
            -
                    pos, bmp_path, diagram = args
         
     | 
| 
       33 
     | 
    
         
            -
                    super(pos, RectShape::DEFAULT::SIZE.dup, diagram)
         
     | 
| 
       34 
     | 
    
         
            -
                    create_from_file(bmp_path)
         
     | 
| 
       35 
     | 
    
         
            -
                  end
         
     | 
| 
      
 24 
     | 
    
         
            +
                  @bitmap_path = bmp_path
         
     | 
| 
      
 25 
     | 
    
         
            +
                  create_from_file(bmp_path) if bmp_path
         
     | 
| 
       36 
26 
     | 
    
         
             
                  @rescale_in_progress = false
         
     | 
| 
       37 
27 
     | 
    
         
             
                  @can_scale = true
         
     | 
| 
       38 
28 
     | 
    
         
             
                end
         
     | 
| 
       39 
29 
     | 
    
         | 
| 
       40 
     | 
    
         
            -
            	  # Get full name of a source BMP file.
         
     | 
| 
       41 
     | 
    
         
            -
            	  # @return [String] String containing full file name
         
     | 
| 
      
 30 
     | 
    
         
            +
            	  # Get full name of a source BMP file (if set).
         
     | 
| 
      
 31 
     | 
    
         
            +
            	  # @return [String,nil] String containing full file name
         
     | 
| 
       42 
32 
     | 
    
         
             
                def get_bitmap_path
         
     | 
| 
       43 
33 
     | 
    
         
             
                  @bitmap_path
         
     | 
| 
       44 
34 
     | 
    
         
             
                end
         
     | 
| 
         @@ -80,7 +70,16 @@ module Wx::SF 
     | 
|
| 
       80 
70 
     | 
    
         
             
                      success = @bitmap.load_file(path, type ? type : Wx::BITMAP_TYPE_ANY)
         
     | 
| 
       81 
71 
     | 
    
         
             
                      if success
         
     | 
| 
       82 
72 
     | 
    
         
             
                        p = Pathname.new(art_path)
         
     | 
| 
       83 
     | 
    
         
            -
                         
     | 
| 
      
 73 
     | 
    
         
            +
                        if Wx::PLATFORM == 'WXMSW'
         
     | 
| 
      
 74 
     | 
    
         
            +
                          # take possibility of different drive into account
         
     | 
| 
      
 75 
     | 
    
         
            +
                          @art_path = if p.relative? || art_path[0] != Dir.getwd[0]
         
     | 
| 
      
 76 
     | 
    
         
            +
                                        art_path
         
     | 
| 
      
 77 
     | 
    
         
            +
                                      else
         
     | 
| 
      
 78 
     | 
    
         
            +
                                        p.relative_path_from(Dir.getwd).to_s
         
     | 
| 
      
 79 
     | 
    
         
            +
                                      end
         
     | 
| 
      
 80 
     | 
    
         
            +
                        else
         
     | 
| 
      
 81 
     | 
    
         
            +
                          @art_path = p.relative? ? art_path : p.relative_path_from(Dir.getwd).to_s
         
     | 
| 
      
 82 
     | 
    
         
            +
                        end
         
     | 
| 
       84 
83 
     | 
    
         
             
                        @art_section = art_section
         
     | 
| 
       85 
84 
     | 
    
         
             
                      end
         
     | 
| 
       86 
85 
     | 
    
         
             
                    else
         
     | 
| 
         @@ -143,7 +142,7 @@ module Wx::SF 
     | 
|
| 
       143 
142 
     | 
    
         
             
                def do_begin_handle
         
     | 
| 
       144 
143 
     | 
    
         
             
                  if @can_scale
         
     | 
| 
       145 
144 
     | 
    
         
             
                    @rescale_in_progress = true
         
     | 
| 
       146 
     | 
    
         
            -
                    @prev_pos = get_absolute_position
         
     | 
| 
      
 145 
     | 
    
         
            +
                    @prev_pos = get_absolute_position.dup
         
     | 
| 
       147 
146 
     | 
    
         
             
                  end
         
     | 
| 
       148 
147 
     | 
    
         
             
                end
         
     | 
| 
       149 
148 
     | 
    
         | 
| 
         @@ -197,7 +196,7 @@ module Wx::SF 
     | 
|
| 
       197 
196 
     | 
    
         
             
                  _draw_bitmap(dc, get_absolute_position.to_point)
         
     | 
| 
       198 
197 
     | 
    
         | 
| 
       199 
198 
     | 
    
         
             
                  dc.with_brush(Wx::TRANSPARENT_BRUSH) do
         
     | 
| 
       200 
     | 
    
         
            -
                    dc.with_pen(Wx::Pen.new( 
     | 
| 
      
 199 
     | 
    
         
            +
                    dc.with_pen(Wx::Pen.new(hover_colour, 1)) do
         
     | 
| 
       201 
200 
     | 
    
         
             
                      dc.draw_rectangle(get_absolute_position.to_point, @rect_size.to_size)
         
     | 
| 
       202 
201 
     | 
    
         
             
                    end
         
     | 
| 
       203 
202 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -210,7 +209,7 @@ module Wx::SF 
     | 
|
| 
       210 
209 
     | 
    
         
             
                  _draw_bitmap(dc, get_absolute_position.to_point)
         
     | 
| 
       211 
210 
     | 
    
         | 
| 
       212 
211 
     | 
    
         
             
                  dc.with_brush(Wx::TRANSPARENT_BRUSH) do
         
     | 
| 
       213 
     | 
    
         
            -
                    dc.with_pen(Wx::Pen.new( 
     | 
| 
      
 212 
     | 
    
         
            +
                    dc.with_pen(Wx::Pen.new(hover_colour, 2)) do
         
     | 
| 
       214 
213 
     | 
    
         
             
                      dc.draw_rectangle(get_absolute_position.to_point, @rect_size.to_size)
         
     | 
| 
       215 
214 
     | 
    
         
             
                    end
         
     | 
| 
       216 
215 
     | 
    
         
             
                  end
         
     |