OSDN Git Service

add binder
authoryasushiito <yas@pen-chan.jp>
Wed, 19 Mar 2014 23:13:04 +0000 (08:13 +0900)
committeryasushiito <yas@pen-chan.jp>
Wed, 19 Mar 2014 23:13:04 +0000 (08:13 +0900)
37 files changed:
app/assets/javascripts/manifest/work/models.js.coffee.erb
app/controllers/application_controller.rb
app/models/balloon.rb
app/models/ground_color.rb
app/models/ground_picture.rb
app/models/license_group.rb
app/models/panel.rb
app/models/panel_picture.rb
app/models/scroll.rb
app/models/scroll_panel.rb
app/models/sheet.rb
app/models/speech.rb
app/models/speech_balloon.rb
app/models/speech_balloon_template.rb
app/models/story.rb
app/models/story_sheet.rb
app/models/writing_format.rb
app/views/panels/show.html.erb
config/environment.rb
config/environments/development.rb
lib/inspire.rb [deleted file]
lib/manifest/local/view/list_group/list/system_resource.rb
lib/manifest/manifest.rb
lib/manifest/model/peta.rb
lib/manifest/model/peta/binder.rb [new file with mode: 0644]
lib/manifest/model/peta/element.rb
lib/manifest/model/peta/leaf.rb [new file with mode: 0644]
lib/peta.rb
lib/peta/binder.rb [new file with mode: 0644]
lib/peta/editize.rb
lib/peta/element.rb
lib/peta/element_nestable_content.rb [new file with mode: 0644]
lib/peta/item.rb
lib/peta/leaf.rb [new file with mode: 0644]
lib/peta/root.rb
lib/peta/system_resource.rb [new file with mode: 0644]
public/manifest.json

index d62deb5..8437e64 100644 (file)
@@ -1,6 +1,12 @@
 #マニフェスト\r
 @models = {\r
   scroll: {\r
 #マニフェスト\r
 @models = {\r
   scroll: {\r
+    peta: {\r
+      type: 'binder',\r
+      args: {\r
+        leaf_tree_name: 'owner',\r
+      },\r
+    },\r
     associations: {\r
       belongs_to: {\r
         author: {\r
     associations: {\r
       belongs_to: {\r
         author: {\r
@@ -52,6 +58,9 @@
     },\r
   },\r
   scroll_panel: {\r
     },\r
   },\r
   scroll_panel: {\r
+    peta: {\r
+      type: 'leaf',\r
+    },\r
     associations: {\r
       belongs_to: {\r
         panel: {\r
     associations: {\r
       belongs_to: {\r
         panel: {\r
     },\r
   },\r
   comic: {\r
     },\r
   },\r
   comic: {\r
+    peta: {\r
+      type: 'binder',\r
+      args: {\r
+        leaf_tree_name: 'owner',\r
+      },\r
+    },\r
     associations: {\r
       belongs_to: {\r
         author: {\r
     associations: {\r
       belongs_to: {\r
         author: {\r
     },\r
   },\r
   story: {\r
     },\r
   },\r
   story: {\r
+    peta: {\r
+      type: 'binder',\r
+      args: {\r
+        leaf_tree_name: 'owner',\r
+      },\r
+    },\r
     associations: {\r
       belongs_to: {\r
         comic: {\r
     associations: {\r
       belongs_to: {\r
         comic: {\r
     },\r
   },\r
   story_sheet: {\r
     },\r
   },\r
   story_sheet: {\r
+    peta: {\r
+      type: 'leaf',\r
+    },\r
     associations: {\r
       belongs_to: {\r
         story: {\r
     associations: {\r
       belongs_to: {\r
         story: {\r
     },\r
   },\r
   sheet: {\r
     },\r
   },\r
   sheet: {\r
+    peta: {\r
+      type: 'root',\r
+      args: {\r
+        element_tree_name: 'owner',\r
+      },\r
+    },\r
     associations: {\r
       belongs_to: {\r
         author: {\r
     associations: {\r
       belongs_to: {\r
         author: {\r
     },\r
   },\r
   sheet_panel: {\r
     },\r
   },\r
   sheet_panel: {\r
+    peta: {\r
+      type: 'element',\r
+      args: {\r
+        element_tree_name: 'owner',\r
+      },\r
+    },\r
     associations: {\r
       belongs_to: {\r
         sheet: {\r
     associations: {\r
       belongs_to: {\r
         sheet: {\r
     },\r
   },\r
   panel_picture: {\r
     },\r
   },\r
   panel_picture: {\r
+    peta: {\r
+      type: 'element',\r
+      args: {\r
+        element_tree_name: 'panel',\r
+      },\r
+    },\r
     associations: {\r
       belongs_to: {\r
         panel: {\r
     associations: {\r
       belongs_to: {\r
         panel: {\r
     },\r
   },\r
   speech_balloon: {\r
     },\r
   },\r
   speech_balloon: {\r
+    peta: {\r
+      type: 'element',\r
+      args: {\r
+        element_tree_name: 'panel',\r
+      },\r
+    },\r
     extend_column_name: 'classname', \r
     associations: {\r
       belongs_to: {\r
     extend_column_name: 'classname', \r
     associations: {\r
       belongs_to: {\r
     },\r
   }, \r
   balloon: {\r
     },\r
   }, \r
   balloon: {\r
+    peta: {\r
+      type: 'element',\r
+      args: {\r
+        element_tree_name: 'panel',\r
+      },\r
+    },\r
     associations: {\r
       belongs_to: {\r
         speech_balloon: {\r
     associations: {\r
       belongs_to: {\r
         speech_balloon: {\r
     },\r
   },\r
   speech: {\r
     },\r
   },\r
   speech: {\r
+    peta: {\r
+      type: 'element',\r
+      args: {\r
+        element_tree_name: 'panel',\r
+      },\r
+    },\r
     associations: {\r
       belongs_to: {\r
         speech_balloon: {\r
     associations: {\r
       belongs_to: {\r
         speech_balloon: {\r
     },\r
   },\r
   ground_picture: {\r
     },\r
   },\r
   ground_picture: {\r
+    peta: {\r
+      type: 'element',\r
+      args: {\r
+        element_tree_name: 'panel',\r
+      },\r
+    },\r
     associations: {\r
       belongs_to: {\r
         panel: {\r
     associations: {\r
       belongs_to: {\r
         panel: {\r
     },\r
   },\r
   ground_color: {\r
     },\r
   },\r
   ground_color: {\r
+    peta: {\r
+      type: 'element',\r
+      args: {\r
+        element_tree_name: 'panel',\r
+      },\r
+    },\r
     associations: {\r
       belongs_to: {\r
         panel: {\r
     associations: {\r
       belongs_to: {\r
         panel: {\r
index 2d4d0d9..620649c 100644 (file)
@@ -217,13 +217,12 @@ class ApplicationController < ActionController::Base
   end
   
   def assist_items item_name, list_name
   end
   
   def assist_items item_name, list_name
-    list = Manifest.manifest.list_groups[item_name].lists[list_name]
+    list = Manifest::View::ListGroup.list item_name, list_name
     list_result = list.open(@operators, {:id => @item.id, :page => 1, :page_size => 5})
     list_result.items
   end
   
   def assist_filer item_name, items
     list_result = list.open(@operators, {:id => @item.id, :page => 1, :page_size => 5})
     list_result.items
   end
   
   def assist_filer item_name, items
-    @filer = Manifest::View::Filer.new @list.item_name, list_result.items, list_result.paginate, @operators
     filer_manager = Pettanr::Application::manifest.filer_managers[item_name]
     filer_manager.open(item_name, items, @operators, nil)
   end
     filer_manager = Pettanr::Application::manifest.filer_managers[item_name]
     filer_manager.open(item_name, items, @operators, nil)
   end
index b6a4bbb..a4c04cb 100644 (file)
@@ -1,4 +1,4 @@
-class Balloon < Peta::Content
+class Balloon < Peta::Element
   load_manifest
   belongs_to :speech_balloon
   belongs_to :system_picture
   load_manifest
   belongs_to :speech_balloon
   belongs_to :system_picture
index f8036bd..581cfa9 100644 (file)
@@ -1,6 +1,5 @@
 class GroundColor < Peta::Element
   load_manifest
 class GroundColor < Peta::Element
   load_manifest
-  include ElementInspire
   belongs_to :panel
   belongs_to :color
   
   belongs_to :panel
   belongs_to :color
   
index fe67caa..eb9f38d 100644 (file)
@@ -1,6 +1,5 @@
 class GroundPicture < Peta::Element
   load_manifest
 class GroundPicture < Peta::Element
   load_manifest
-  include ElementInspire
   belongs_to :panel
   belongs_to :picture
   
   belongs_to :panel
   belongs_to :picture
   
index 638cb36..b8f0ea2 100644 (file)
@@ -1,5 +1,5 @@
 #ライセンスグループ
 #ライセンスグループ
-class LicenseGroup < Peta::Item
+class LicenseGroup < Peta::SystemResource
   load_manifest
   has_many :licenses
   
   load_manifest
   has_many :licenses
   
@@ -22,12 +22,6 @@ class LicenseGroup < Peta::Item
     'license_groups.name asc'
   end
   
     'license_groups.name asc'
   end
   
-  def self.enable_list
-    LicenseGroup.find(:all).delete_if {|lg|
-      lg.enable? == false
-    }
-  end
-  
   def self.list_opt
     {:include => {:licenses => {}}}
   end
   def self.list_opt
     {:include => {:licenses => {}}}
   end
index 4deb49f..606b762 100644 (file)
@@ -206,7 +206,6 @@ class Panel < Peta::Root
     res = false
     Panel.transaction do
       self.panel_elements.each do |elm|
     res = false
     Panel.transaction do
       self.panel_elements.each do |elm|
-        elm.new_panel = self
         elm.boost
       end
 #self.publish = nil
         elm.boost
       end
 #self.publish = nil
@@ -253,23 +252,6 @@ class Panel < Peta::Root
     res
   end
   
     res
   end
   
-  def copy
-    attr = self.copy_attributes
-    self.class.child_models('panel') do |child_model|
-      attr.merge! child_model.panelize(self.element_items(child_model).map {|elm|  elm.copy_attributes})
-    end
-    attr
-  end
-  
-  def copy_attributes
-    r = self.attributes
-    r.delete 'id'
-    r.delete 'author_id'
-    r.delete 'created_at'
-    r.delete 'updated_at'
-    r
-  end
-  
   def self.panelize panel
     attr = panel.attributes
     attr.delete 'id'
   def self.panelize panel
     attr = panel.attributes
     attr.delete 'id'
index e79836a..2943844 100644 (file)
@@ -1,6 +1,5 @@
 class PanelPicture < Peta::Element
   load_manifest
 class PanelPicture < Peta::Element
   load_manifest
-  include ElementInspire
   belongs_to :panel
   belongs_to :picture
   
   belongs_to :panel
   belongs_to :picture
   
index 4c1d21a..10baaef 100644 (file)
@@ -1,4 +1,4 @@
-class Scroll < Peta::Content
+class Scroll < Peta::Binder
   load_manifest
   has_many :scroll_panels
   belongs_to :author
   load_manifest
   has_many :scroll_panels
   belongs_to :author
index ea41ed2..8d9f422 100644 (file)
@@ -1,4 +1,4 @@
-class ScrollPanel < Peta::Element
+class ScrollPanel < Peta::Leaf
   load_manifest
   belongs_to :author
   belongs_to :panel
   load_manifest
   belongs_to :author
   belongs_to :panel
index b36a3b1..ffcb3dd 100644 (file)
@@ -1,4 +1,4 @@
-class Sheet < Peta::Content
+class Sheet < Peta::Root
   load_manifest
   has_many :sheet_panels
   has_many :story_sheets
   load_manifest
   has_many :sheet_panels
   has_many :story_sheets
index fd0dd99..36cae49 100644 (file)
@@ -1,4 +1,4 @@
-class Speech < Peta::Content
+class Speech < Peta::Element
   load_manifest
   belongs_to :speech_balloon
   belongs_to :writing_format
   load_manifest
   belongs_to :speech_balloon
   belongs_to :writing_format
index 4a2ab3c..098e0d0 100644 (file)
@@ -1,6 +1,5 @@
 class SpeechBalloon < Peta::Element
   load_manifest
 class SpeechBalloon < Peta::Element
   load_manifest
-  include ElementInspire
   has_one :balloon, :dependent => :destroy
   has_one :speech, :dependent => :destroy
   belongs_to :speech_balloon_template
   has_one :balloon, :dependent => :destroy
   has_one :speech, :dependent => :destroy
   belongs_to :speech_balloon_template
index a4ad04a..9351b3a 100644 (file)
@@ -1,5 +1,5 @@
 #フキダシテンプレート
 #フキダシテンプレート
-class SpeechBalloonTemplate < Peta::Item
+class SpeechBalloonTemplate < Peta::SystemResource
   load_manifest
   has_many :speech_balloons
   belongs_to :system_picture
   load_manifest
   has_many :speech_balloons
   belongs_to :system_picture
@@ -22,12 +22,6 @@ class SpeechBalloonTemplate < Peta::Item
     self.system_picture.tmb_opt_img_tag
   end
   
     self.system_picture.tmb_opt_img_tag
   end
   
-  def self.enable_list
-    SpeechBalloonTemplate.find(:all).delete_if {|sbt|
-      sbt.enable? == false
-    }
-  end
-  
   def self.list_opt
     {}
   end
   def self.list_opt
     {}
   end
index 2cb5ab4..6d2aaf9 100644 (file)
@@ -1,5 +1,5 @@
 #ストーリー
 #ストーリー
-class Story < Peta::Content
+class Story < Peta::Binder
   load_manifest
   has_many :story_sheets
   belongs_to :comic
   load_manifest
   has_many :story_sheets
   belongs_to :comic
index 140fa75..d1a3961 100644 (file)
@@ -1,4 +1,4 @@
-class StorySheet < Peta::Element
+class StorySheet < Peta::Leaf
   load_manifest
   belongs_to :author
   belongs_to :story
   load_manifest
   belongs_to :author
   belongs_to :story
index 44fe9f0..f55aa7d 100644 (file)
@@ -1,4 +1,4 @@
-class WritingFormat < Peta::Item
+class WritingFormat < Peta::SystemResource
   load_manifest
   has_many :speeches
   belongs_to :system_picture
   load_manifest
   has_many :speeches
   belongs_to :system_picture
@@ -29,12 +29,6 @@ class WritingFormat < Peta::Item
 def self.list
   self.enable_list
 end
 def self.list
   self.enable_list
 end
-  def self.enable_list
-    WritingFormat.find(:all).delete_if {|wf|
-      wf.enable? == false
-    }
-  end
-  
   def self.list_opt
     {}
   end
   def self.list_opt
     {}
   end
index ee95f4e..f6222f0 100644 (file)
@@ -13,7 +13,7 @@
   <h2><%= t('panels.show.copy') -%></h2>
   <%= form_for(Panel.new, :html => {:jqform => 'pettanr-panel-form'}) do |f| %>
 
   <h2><%= t('panels.show.copy') -%></h2>
   <%= form_for(Panel.new, :html => {:jqform => 'pettanr-panel-form'}) do |f| %>
 
-    <%= hidden_field_tag "json", @panel.copy().to_json %>
+    <%= hidden_field_tag "json", @panel.post_attributes(:all).to_json %>
     <div>
       <%= submit_tag t('panels.show.inspire') -%>
     </div>
     <div>
       <%= submit_tag t('panels.show.inspire') -%>
     </div>
index 2da6f44..81c96d0 100644 (file)
@@ -2,7 +2,6 @@
 require File.expand_path('../application', __FILE__)
 require 'RMagick'
 require 'rest_client'
 require File.expand_path('../application', __FILE__)
 require 'RMagick'
 require 'rest_client'
-require 'inspire'
 
 require 'picture_io'
 require 'pettan_imager'
 
 require 'picture_io'
 require 'pettan_imager'
index 4b6668d..650c671 100644 (file)
@@ -2,8 +2,8 @@ Pettanr::Application.configure do
 
   ActiveSupport::Dependencies.autoload_paths << File::join( Rails.root, 'lib')
   ActiveSupport::Dependencies.explicitly_unloadable_constants << 'Editor' 
 
   ActiveSupport::Dependencies.autoload_paths << File::join( Rails.root, 'lib')
   ActiveSupport::Dependencies.explicitly_unloadable_constants << 'Editor' 
-  ActiveSupport::Dependencies.explicitly_unloadable_constants << 'Manifest' 
   ActiveSupport::Dependencies.explicitly_unloadable_constants << 'Peta' 
   ActiveSupport::Dependencies.explicitly_unloadable_constants << 'Peta' 
+  ActiveSupport::Dependencies.explicitly_unloadable_constants << 'Manifest' 
   # Settings specified here will take precedence over those in config/application.rb
 
   # In the development environment your application's code is reloaded on
   # Settings specified here will take precedence over those in config/application.rb
 
   # In the development environment your application's code is reloaded on
diff --git a/lib/inspire.rb b/lib/inspire.rb
deleted file mode 100644 (file)
index ca844ed..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-module ElementInspire
-  def self.included(base)
-    base.extend(ClassMethods)
-    base.__send__ :include, InstanceMethods
-  end
-  
-  module ClassMethods
-    def panelize elements_attributes
-      elements_attributes = [elements_attributes] unless elements_attributes.is_a?(Array)
-      hash = {}
-      index = 0
-      elements_attributes.each do |element_attributes|
-        hash[self.to_s.tableize + '_attributes'] ||= {}
-        n = if element_attributes['id']
-          element_attributes['id'].to_s
-        else
-          index += 1
-          'new' + index.to_s 
-        end
-        hash[self.to_s.tableize + '_attributes'][n] = element_attributes
-      end
-      hash
-    end
-  end
-  
-  module InstanceMethods
-    private
-    
-    public
-    
-    def parts
-      @parts ||= []
-    end
-    
-    def copy_attributes
-      r = self.attributes
-      r.delete 'id'
-      r.delete 'panel_id'
-      r.delete 'created_at'
-      r.delete 'updated_at'
-      self.parts.each do |part|
-        new_part_attr = part ? part.class.panelize(part.copy_attributes) : {}
-        r.merge! new_part_attr
-      end
-      r
-    end
-    
-    def copy to_panel
-      new_element = self.class.new self.copy_attributes
-      new_element.t = to_panel.new_t
-      new_element.z = to_panel.new_z
-      new_attr = new_element.class.panelize new_element.copy_attributes
-      r = {} #Panel.panelize to_panel
-      r.merge! new_attr
-      r
-    end
-    
-    def copy_all index
-      new_element = self.class.new self.copy_attributes
-      new_attr = new_element.class.panelize(new_element.copy_attributes, index)
-      r = {} #Panel.panelize to_panel
-      r.merge! new_attr
-      r
-    end
-    
-  end
-  
-end
-
index a614e28..321746e 100644 (file)
@@ -8,7 +8,10 @@ module Manifest
         end
         
         def items operators, options, offset, page_size
         end
         
         def items operators, options, offset, page_size
-          @model.enable_list
+          # enable_list does not work when configured auto load in development.rb
+          # auto loader undefing MODEL at reload manifest file
+          # @model.enable_list
+          super
         end
         
       end
         end
         
       end
index 12f5c89..866ed0d 100644 (file)
@@ -33,20 +33,6 @@ module Manifest
       end
     end
     
       end
     end
     
-    def add_action
-        return
-      @controllers.each do |controller_name, controller|
-        model_name = controller.model_name
-        next if model_name.blank?
-        controller.actions.each do |action_name, conf|
-          next unless conf['type'] == 'list'
-          list_name = conf['list']['list_name']
-          list = Pettanr::Application::manifest.list_managers[model_name]
-          list.add_action action_name, list_name
-        end
-      end
-    end
-    
   end
   
   module ModuleMethods
   end
   
   module ModuleMethods
index 32b30d0..ec46382 100644 (file)
@@ -4,13 +4,16 @@ require_dependency "manifest/model/peta/owner"
 require_dependency "manifest/model/peta/content"
 require_dependency "manifest/model/peta/root"
 require_dependency "manifest/model/peta/element"
 require_dependency "manifest/model/peta/content"
 require_dependency "manifest/model/peta/root"
 require_dependency "manifest/model/peta/element"
+require_dependency "manifest/model/peta/binder"
+require_dependency "manifest/model/peta/leaf"
 module Manifest
   module ModelModule
     class PetaFactory
       include PetaModule
       @@types = {
         'item' => ItemPeta, 'owner' => OwnerPeta, 'content' => ContentPeta, 
 module Manifest
   module ModelModule
     class PetaFactory
       include PetaModule
       @@types = {
         'item' => ItemPeta, 'owner' => OwnerPeta, 'content' => ContentPeta, 
-        'root' => RootPeta, 'element' => ElementPeta
+        'root' => RootPeta, 'element' => ElementPeta, 
+        'binder' => BinderPeta, 'leaf' => LeafPeta
       }
       def self.factory model, my_manifest
         my_manifest['type'] ||= 'item'
       }
       def self.factory model, my_manifest
         my_manifest['type'] ||= 'item'
diff --git a/lib/manifest/model/peta/binder.rb b/lib/manifest/model/peta/binder.rb
new file mode 100644 (file)
index 0000000..1f85e94
--- /dev/null
@@ -0,0 +1,21 @@
+module Manifest
+  module ModelModule
+    module PetaModule
+      class BinderPeta < BasePeta
+        attr :leaf_tree_name
+        
+        def set_default
+          super
+          raise "undefined leaf_tree_name for models> #{@model.model_name} > peta \n" unless @peta_manifest['args']['leaf_tree_name']
+        end
+        
+        def init
+          super
+          @leaf_tree_name = @args['leaf_tree_name']
+        end
+        
+      end
+      
+    end
+  end
+end
index cf7c541..434094b 100644 (file)
@@ -2,13 +2,16 @@ module Manifest
   module ModelModule
     module PetaModule
       class ElementPeta < BasePeta
   module ModelModule
     module PetaModule
       class ElementPeta < BasePeta
+        attr :element_tree_name
         
         def set_default
           super
         
         def set_default
           super
+          raise "undefined element_tree_name for models> #{@model.model_name} > peta \n" unless @peta_manifest['args']['element_tree_name']
         end
         
         def init
           super
         end
         
         def init
           super
+          @element_tree_name = @args['element_tree_name']
         end
         
       end
         end
         
       end
diff --git a/lib/manifest/model/peta/leaf.rb b/lib/manifest/model/peta/leaf.rb
new file mode 100644 (file)
index 0000000..ad672f3
--- /dev/null
@@ -0,0 +1,18 @@
+module Manifest
+  module ModelModule
+    module PetaModule
+      class LeafPeta < BasePeta
+        
+        def set_default
+          super
+        end
+        
+        def init
+          super
+        end
+        
+      end
+      
+    end
+  end
+end
index bb701f4..7e50b1d 100644 (file)
@@ -2,8 +2,11 @@ module Peta
 end
 require_dependency 'peta/item'
 require_dependency 'peta/owner'
 end
 require_dependency 'peta/item'
 require_dependency 'peta/owner'
+require_dependency 'peta/system_resource'
 require_dependency 'peta/content'
 require_dependency 'peta/content'
-require_dependency 'peta/element'
-require_dependency 'peta/element_part'
+require_dependency 'peta/element_nestable_content'
 require_dependency 'peta/root'
 require_dependency 'peta/root'
+require_dependency 'peta/element'
+require_dependency 'peta/binder'
+require_dependency 'peta/leaf'
 require_dependency 'peta/editize'
 require_dependency 'peta/editize'
diff --git a/lib/peta/binder.rb b/lib/peta/binder.rb
new file mode 100644 (file)
index 0000000..9d0aa6c
--- /dev/null
@@ -0,0 +1,33 @@
+module Peta
+  class Binder < Content
+    self.abstract_class = true
+    
+    # Dynamic Methods
+    
+    def self._leaf_tree_name
+      self.my_manifest.peta.leaf_tree_name
+    end
+    
+    def self.load_manifest
+      super
+      # Class Methods
+      n = self._leaf_tree_name
+      define_singleton_method("leaf_tree_name") do 
+        n
+      end
+      # Instance Methods
+      define_method("leaf_items") do |leaf_model|
+        self.__send__ self.class.my_manifest.associations.child_element_name(leaf_model)
+      end
+      define_method("leafs_items") do 
+        self.class.child_models(self.class.leaf_tree_name).map {|child_model|
+          self.leaf_items child_model
+        }.flatten
+      end
+    end
+    
+    # Class Methods
+    
+  end
+end
+
index ce2be2f..ff8550b 100644 (file)
@@ -46,6 +46,14 @@ module Peta
       super.merge!({'id' => self.dom_item_id(name)})
     end
     
       super.merge!({'id' => self.dom_item_id(name)})
     end
     
+    def post_attribute_key
+      if self.new_record?
+        self.dom_pool_type
+      else
+        super
+      end
+    end
+    
   end
   
 end
   end
   
 end
index 3ce72c2..ccdbbf8 100644 (file)
@@ -1,5 +1,5 @@
 module Peta
 module Peta
-  class Element < Content
+  class Element < ElementNestableContent
     self.abstract_class = true
     
     # Dynamic ClassMethods
     self.abstract_class = true
     
     # Dynamic ClassMethods
@@ -17,6 +17,23 @@ module Peta
       {}
     end
     
       {}
     end
     
+    def self.panelize elements_attributes
+      elements_attributes = [elements_attributes] unless elements_attributes.is_a?(Array)
+      hash = {}
+      index = 0
+      elements_attributes.each do |element_attributes|
+        hash[self.to_s.tableize + '_attributes'] ||= {}
+        n = if element_attributes['id']
+          element_attributes['id'].to_s
+        else
+          index += 1
+          'new' + index.to_s 
+        end
+        hash[self.to_s.tableize + '_attributes'][n] = element_attributes
+      end
+      hash
+    end
+    
     def has_picture?
       false
     end
     def has_picture?
       false
     end
@@ -58,6 +75,17 @@ module Peta
       })
     end
     
       })
     end
     
+    def copy_attributes opt = {}
+      r = self.attributes
+      r.delete 'id'
+    r.delete 'panel_id'
+      r.delete 't' unless opt[:all]
+      r.delete 'z' unless opt[:all]
+      r.delete 'created_at'
+      r.delete 'updated_at'
+      r
+    end
+    
   end
 end
 
   end
 end
 
diff --git a/lib/peta/element_nestable_content.rb b/lib/peta/element_nestable_content.rb
new file mode 100644 (file)
index 0000000..eed0fa1
--- /dev/null
@@ -0,0 +1,51 @@
+module Peta
+  class ElementNestableContent < Content
+    self.abstract_class = true
+    
+    # Dynamic Methods
+    
+    def self._element_tree_name
+      self.my_manifest.peta.element_tree_name
+    end
+    
+    def self.load_manifest
+      super
+      # Class Methods
+      n = self._element_tree_name
+      define_singleton_method("element_tree_name") do 
+        n
+      end
+      c = self.child_models(self.element_tree_name)
+      define_singleton_method("element_models") do 
+        c
+      end
+      # Instance Methods
+      define_method("element_items") do |element_model|
+        self.__send__ self.class.my_manifest.associations.child_element_name(element_model)
+      end
+      define_method("elements_items") do 
+        self.class.element_models.map {|element_model|
+          self.element_items element_model
+        }.flatten
+      end
+    end
+    
+    # Class Methods
+    
+    # Instance Methods
+    def post_attributes opt = {}
+      attr = self.copy_attributes
+      hash = {}
+      self.class.element_models.each do |element_model|
+        name = self.class.my_manifest.associations.child_element_name(element_model) + '_attributes'
+        hash[name] ||= {}
+        self.element_items(element_model).each do |element|
+          hash[name][element.post_attribute_key] = element.post_attributes opt
+        end
+      end
+      attr.merge hash
+    end
+    
+  end
+end
+
index 8346615..b6ac63d 100644 (file)
@@ -226,5 +226,9 @@ module Peta
       )
     end
     
       )
     end
     
+    def post_attribute_key
+      self.dom_id
+    end
+    
   end
 end
   end
 end
diff --git a/lib/peta/leaf.rb b/lib/peta/leaf.rb
new file mode 100644 (file)
index 0000000..8dedbd6
--- /dev/null
@@ -0,0 +1,132 @@
+module Peta
+  class Leaf < Content
+    self.abstract_class = true
+    
+    # Dynamic ClassMethods
+    
+    def self.play_list_where cid
+      ['scroll_panels.scroll_id = ?', cid]
+    end
+    
+    def self.play_list scroll, author, offset = 0, limit = ScrollPanel.default_panel_size
+      ScrollPanel.where(self.play_list_where(scroll.id)).includes(ScrollPanel.list_opt).order('scroll_panels.t').offset(offset).limit(limit)
+    end
+    
+    def self.play_sheet_where sid
+      ['story_sheets.story_id = ?', sid]
+    end
+    
+    def self.play_sheet story, operators, page = 1
+      ss = StorySheet.where(self.play_sheet_where(story.id)).includes(StorySheet.list_opt).order('story_sheets.t').offset(page -1).limit(1).first
+      if ss 
+        if ss.sheet
+          Sheet.show(ss.sheet.id, operators)
+        else
+          nil
+        end
+      else
+        nil
+      end
+    end
+    
+    def self.play_paginate story, page
+      Kaminari.paginate_array(Array.new(StorySheet.where(self.play_sheet_where(story.id)).includes(StorySheet.list_opt).count, nil)).page(page).per(1)
+    end
+    
+    def self.new_t binder_id
+      r = ScrollPanel.max_t(binder_id)
+      r.blank? ? 0 : r.to_i + 1
+    end
+    
+    def self.max_t binder_id
+      self.class..maximum(:t, :conditions => ['scroll_id = ?', binder_id])
+    end
+    
+    def self.find_t binder_id, t
+      self.class.find(:first, :conditions => ['scroll_id = ? and t = ?', binder_id, t])
+    end
+    
+    def self.collect_t scroll_panel
+      r = self.class.find(:all, :conditions => ['scroll_id = ?', scroll_panel.scroll_id], :order => 't')
+      r.map {|sp| sp.t}
+    end
+    
+    def self.top_sheet story, author
+      StorySheet.play_list(story, author).first
+    end
+    
+    def self.collect_t story_sheet
+      r = StorySheet.find(:all, :conditions => ['story_id = ?', story_sheet.story_id], :order => 't')
+      r.map {|sp| sp.t}
+    end
+    
+    def self.serial? ary
+      i = 0
+      ary.compact.sort.each do |t|
+        break false unless t == i
+        i += 1
+      end
+      ary.compact.size == i
+    end
+    
+    def self.validate_t scroll_panel
+      ScrollPanel.serial?(ScrollPanel.collect_t(scroll_panel))
+    end
+    
+    def insert_shift
+      ScrollPanel.update_all('t = t + 1', ['scroll_id = ? and t >= ?', self.scroll_id, self.t])
+    end
+    
+    def lesser_shift old_t
+      self.t = 0 if self.t < 0
+      ScrollPanel.update_all('t = t + 1', ['scroll_id = ? and (t >= ? and t < ?)', self.scroll_id, self.t, old_t])
+    end
+    
+    def higher_shift old_t
+      nf = ScrollPanel.find_t(self.scroll_id, self.t)
+      max_t = ScrollPanel.max_t(self.scroll_id).to_i
+      self.t = max_t if self.t > max_t
+      ScrollPanel.update_all('t = t - 1', ['scroll_id = ? and (t > ? and t <= ?)', self.scroll_id, old_t, self.t])
+    end
+    
+    def update_shift old_t
+      if self.t > old_t
+        higher_shift old_t
+      else
+        lesser_shift old_t
+      end
+    end
+    
+    def rotate old_t = nil
+      if self.new_record?
+        if self.t.blank?
+          self.t = ScrollPanel.new_t self.scroll_id
+        else
+          self.insert_shift
+        end
+      else
+        if self.t.blank?
+        else
+          self.update_shift old_t
+        end
+      end
+    end
+    
+    def allow? operators
+      return nil if self.scroll_id == nil or self.panel_id == nil
+      self.scroll.own?(operators) and self.panel.usable?(operators)
+    end
+    
+    def destroy_and_shorten
+      res = false
+      ScrollPanel.transaction do
+        ScrollPanel.update_all('t = t - 1', ['scroll_id = ? and (t > ?)', self.scroll_id, self.t])
+        raise ActiveRecord::Rollback unless self.destroy
+        res = true
+      end
+      res
+    end
+    
+  end
+end
+
index 0bcfb35..5646504 100644 (file)
@@ -1,33 +1,27 @@
 module Peta
 module Peta
-  class Root < Content
+  class Root < ElementNestableContent
     self.abstract_class = true
     
     # Dynamic Methods
     
     self.abstract_class = true
     
     # Dynamic Methods
     
-    def self._element_tree_name
-      self.my_manifest.peta.element_tree_name
-    end
-    
     def self.load_manifest
       super
       # Class Methods
     def self.load_manifest
       super
       # Class Methods
-      n = self._element_tree_name
-      define_singleton_method("element_tree_name") do 
-        n
-      end
       # Instance Methods
       # Instance Methods
-      define_method("element_items") do |element_model|
-        self.__send__ self.class.my_manifest.associations.child_element_name(element_model)
-      end
-      define_method("elements_items") do 
-        self.class.child_models(self.class.element_tree_name).map {|child_model|
-          self.element_items child_model
-        }.flatten
-      end
     end
     
     # Class Methods
     
     end
     
     # Class Methods
     
+    # Instance Methods
+    def copy_attributes opt = {}
+      r = self.attributes
+      r.delete 'id'
+      r.delete 'author_id'
+      r.delete 'created_at'
+      r.delete 'updated_at'
+      r
+    end
+    
   end
 end
 
   end
 end
 
diff --git a/lib/peta/system_resource.rb b/lib/peta/system_resource.rb
new file mode 100644 (file)
index 0000000..324e632
--- /dev/null
@@ -0,0 +1,16 @@
+module Peta
+  class SystemResource < Item
+    self.abstract_class = true
+    
+    # Dynamic ClassMethods
+    
+    # ClassMethods
+    
+    def self.enable_list
+      self.find(:all).delete_if {|sbt|
+        sbt.enable? == false
+      }
+    end
+    
+  end
+end
index 5bce8b6..370e21c 100644 (file)
   },\r
   "models": {\r
     "scroll": {\r
   },\r
   "models": {\r
     "scroll": {\r
+      "peta": {\r
+        "type": "binder",\r
+        "args": {\r
+          "leaf_tree_name": "owner"\r
+        }\r
+      },\r
       "associations": {\r
         "belongs_to": {\r
           "author": {}\r
       "associations": {\r
         "belongs_to": {\r
           "author": {}\r
       }\r
     },\r
     "scroll_panel": {\r
       }\r
     },\r
     "scroll_panel": {\r
+      "peta": {\r
+        "type": "leaf"\r
+      },\r
       "associations": {\r
         "belongs_to": {\r
           "panel": {},\r
       "associations": {\r
         "belongs_to": {\r
           "panel": {},\r
       }\r
     },\r
     "comic": {\r
       }\r
     },\r
     "comic": {\r
+      "peta": {\r
+        "type": "binder",\r
+        "args": {\r
+          "leaf_tree_name": "owner"\r
+        }\r
+      },\r
       "associations": {\r
         "belongs_to": {\r
           "author": {}\r
       "associations": {\r
         "belongs_to": {\r
           "author": {}\r
       }\r
     },\r
     "story": {\r
       }\r
     },\r
     "story": {\r
+      "peta": {\r
+        "type": "binder",\r
+        "args": {\r
+          "leaf_tree_name": "owner"\r
+        }\r
+      },\r
       "associations": {\r
         "belongs_to": {\r
           "comic": {}\r
       "associations": {\r
         "belongs_to": {\r
           "comic": {}\r
       }\r
     },\r
     "story_sheet": {\r
       }\r
     },\r
     "story_sheet": {\r
+      "peta": {\r
+        "type": "leaf"\r
+      },\r
       "associations": {\r
         "belongs_to": {\r
           "story": {},\r
       "associations": {\r
         "belongs_to": {\r
           "story": {},\r
       }\r
     },\r
     "sheet": {\r
       }\r
     },\r
     "sheet": {\r
+      "peta": {\r
+        "type": "root",\r
+        "args": {\r
+          "element_tree_name": "owner"\r
+        }\r
+      },\r
       "associations": {\r
         "belongs_to": {\r
           "author": {}\r
       "associations": {\r
         "belongs_to": {\r
           "author": {}\r
       }\r
     },\r
     "sheet_panel": {\r
       }\r
     },\r
     "sheet_panel": {\r
+      "peta": {\r
+        "type": "element",\r
+        "args": {\r
+          "element_tree_name": "owner"\r
+        }\r
+      },\r
       "associations": {\r
         "belongs_to": {\r
           "sheet": {},\r
       "associations": {\r
         "belongs_to": {\r
           "sheet": {},\r
       }\r
     },\r
     "panel_picture": {\r
       }\r
     },\r
     "panel_picture": {\r
+      "peta": {\r
+        "type": "element",\r
+        "args": {\r
+          "element_tree_name": "panel"\r
+        }\r
+      },\r
       "associations": {\r
         "belongs_to": {\r
           "panel": {}\r
       "associations": {\r
         "belongs_to": {\r
           "panel": {}\r
       }\r
     },\r
     "speech_balloon": {\r
       }\r
     },\r
     "speech_balloon": {\r
+      "peta": {\r
+        "type": "element",\r
+        "args": {\r
+          "element_tree_name": "panel"\r
+        }\r
+      },\r
       "extend_column_name": "classname",\r
       "associations": {\r
         "belongs_to": {\r
       "extend_column_name": "classname",\r
       "associations": {\r
         "belongs_to": {\r
       }\r
     },\r
     "balloon": {\r
       }\r
     },\r
     "balloon": {\r
+      "peta": {\r
+        "type": "element",\r
+        "args": {\r
+          "element_tree_name": "panel"\r
+        }\r
+      },\r
       "associations": {\r
         "belongs_to": {\r
           "speech_balloon": {},\r
       "associations": {\r
         "belongs_to": {\r
           "speech_balloon": {},\r
       }\r
     },\r
     "speech": {\r
       }\r
     },\r
     "speech": {\r
+      "peta": {\r
+        "type": "element",\r
+        "args": {\r
+          "element_tree_name": "panel"\r
+        }\r
+      },\r
       "associations": {\r
         "belongs_to": {\r
           "speech_balloon": {},\r
       "associations": {\r
         "belongs_to": {\r
           "speech_balloon": {},\r
       }\r
     },\r
     "ground_picture": {\r
       }\r
     },\r
     "ground_picture": {\r
+      "peta": {\r
+        "type": "element",\r
+        "args": {\r
+          "element_tree_name": "panel"\r
+        }\r
+      },\r
       "associations": {\r
         "belongs_to": {\r
           "panel": {}\r
       "associations": {\r
         "belongs_to": {\r
           "panel": {}\r
       }\r
     },\r
     "ground_color": {\r
       }\r
     },\r
     "ground_color": {\r
+      "peta": {\r
+        "type": "element",\r
+        "args": {\r
+          "element_tree_name": "panel"\r
+        }\r
+      },\r
       "associations": {\r
         "belongs_to": {\r
           "panel": {}\r
       "associations": {\r
         "belongs_to": {\r
           "panel": {}\r
           "belongs_to": [\r
             "system_picture"\r
           ],\r
           "belongs_to": [\r
             "system_picture"\r
           ],\r
-          "has_many": [\r
-          ]\r
+          "has_many": []\r
         }\r
       },\r
       "license_group": {\r
         }\r
       },\r
       "license_group": {\r