format.html {
@scroll = @item
if @operators.author
- @new_panel_items = assist_items('panel', 'private_list')
+ @new_panel_items = assist_items('panel', 'private')
#@new_panel_filer = assist_filer 'panel', @new_panel_items
end
}
def show_html_format format
format.html {
if @operators.author
- @new_panel_items = assist_items('panel', 'private_list')
+ @new_panel_items = assist_items('panel', 'private')
#new_panel_filer = assist_filer 'panel', @new_panel_items
- @new_story_items = assist_items('story', 'private_list')
+ @new_story_items = assist_items('story', 'private')
#new_story_filer = assist_filer 'story', @new_story_items
- @fresh_story_items = assist_items('story_sheet', 'private_list').map {|ss| ss.story}
+ @fresh_story_items = assist_items('story_sheet', 'private').map {|ss| ss.story}
#@fresh_story_filer = assist_filer 'story', @fresh_story_items
end
}
def show_html_format format
format.html {
if @operators.author
- @new_sheet_items = assist_items('sheet', 'private_list')
+ @new_sheet_items = assist_items('sheet', 'private')
#@new_sheet_filer = assist_filer 'sheet', @new_sheet_items
end
}
{:include => {:speech_balloon => {:include => {:panel => {:include => {:author => {} }}, :speech => {}, :speech_balloon_template => {} }}}}
end
+ def style
+ {
+ 'width' => self.width.to_s + 'px','height' => self.height.to_s + 'px',
+ 'top' => self.y.to_s + 'px','left' => self.x.to_s + 'px'
+ }
+ end
+
def copy_attributes
r = self.attributes
r.delete 'id'
-class GroundColor < Peta::Content
+class GroundColor < Peta::Element
load_manifest
- include Peta::Element
include ElementInspire
belongs_to :panel
belongs_to :color
-class GroundPicture < Peta::Content
+class GroundPicture < Peta::Element
load_manifest
- include Peta::Element
include ElementInspire
belongs_to :panel
belongs_to :picture
-class PanelPicture < Peta::Content
+class PanelPicture < Peta::Element
load_manifest
- include Peta::Element
include ElementInspire
belongs_to :panel
belongs_to :picture
def opt_img_tag spot = nil, opacity = 20
o = (spot and spot != self) ? "opacity: #{opacity.to_f/100}; filter:alpha(opacity=#{opacity});" : ''
- {:id => self.tag_id(:img), :panel_id => self.tag_panel_id, :element_id => self.tag_element_id, :element_type => self.tag_element_type,
- :class => "panel-picture", :vPicture => self.id,
- :src => self.url, :width => self.width.abs, :height => self.height.abs, :picture_id => self.picture_id, :ext => self.picture.ext, :alt => self.caption,
- :style => "#{o}"}
+ self.tag_attributes(:img, {
+ :class => "panel-picture", :vPicture => self.id,
+ :src => self.url, :width => self.width.abs, :height => self.height.abs, :picture_id => self.picture_id, :ext => self.picture.ext, :alt => self.caption,
+ :style => "#{o}"
+ })
end
def tmb_opt_img_tag
-class ScrollPanel < Peta::Content
+class ScrollPanel < Peta::Element
load_manifest
belongs_to :author
belongs_to :panel
-class SheetPanel < Peta::Content
+class SheetPanel < Peta::Element
load_manifest
belongs_to :author
belongs_to :panel
'speech'
end
+ def outer_style
+ {
+ 'top' => self.y, 'left' => self.x,
+ 'width' => self.width, 'height' => self.height
+ }
+ end
+
+ def inner_style
+ {
+ 'font-size' => self.font_size.to_s + 'em',
+ 'text-align' => self.text_align_text,
+ 'color' => '#' + format("%06x", self.fore_color)
+ }
+ end
+
def text_align_text
@@text_align_texts[self.text_align]
end
-class SpeechBalloon < Peta::Content
+class SpeechBalloon < Peta::Element
load_manifest
- include Peta::Element
include ElementInspire
has_one :balloon, :dependent => :destroy
has_one :speech, :dependent => :destroy
-class StorySheet < Peta::Content
+class StorySheet < Peta::Element
load_manifest
belongs_to :author
belongs_to :story
-<div <%= raw elm.any_tag_attr() -%> class="pettanr-comic-ground-color" style="<%= elm.opt_div_style(spot) -%>">
+<%= content_tag :div, element.tag_attributes(:div, {'class' => "pettanr-comic-ground-color", 'style' => element.opt_div_style(spot)}) do %>
-</div>
+<% end %>
-<div <%= raw elm.any_tag_attr() -%> class="pettanr-comic-ground-picture" style="<%= elm.opt_div_style(full_url(elm.picture.url), spot) -%>">
+<%= content_tag :div, element.tag_attributes(:div, {'class' => "pettanr-comic-ground-picture", 'style' => element.opt_div_style(full_url(element.picture.url), spot)}) do %>
-</div>
+<% end %>
-<%= content_tag :div, elm.tag_attributes do %>
-<div <%= raw elm.any_tag_attr(:div) -%> class="pettanr-panel-picture-wrapper" style="<%= elm.opt_div_style() -%>">
- <%= link_to_unless(elm.link.blank?, tag(:img, elm.opt_img_tag(spot)), elm.link) %>
+<%= content_tag :div, element.tag_attributes(:div, {'class' => "pettanr-panel-picture-wrapper", 'style' => element.opt_div_style()}) do %>
+ <%= link_to_unless(element.link.blank?, tag(:img, element.opt_img_tag(spot)), element.link) %>
<% end %>
<% end %>
<%= content_tag :div, :id => panel.tag_id, :panel_id => panel.tag_panel_id, :class => "pettanr-comic-panel", :style => "width: #{panel.width}px; height: #{panel.height}px; border-style: solid; border-width: #{panel.border}px; border-color: black; background-color: white;" do %>
<% if panel.visible? operators -%>
- <% panel.panel_elements.each do |elm| %>
- <%= render elm.class.to_s.tableize + '/element', :elm => elm, :spot => spot %>
+ <% panel.panel_elements.each do |element| %>
+ <%= render element.path_name + '/element', :element => element, :spot => spot %>
<% end %>
<% else %>
<h2><%= t('panels.hidden') %></h2>
-<div <%= raw elm.any_tag_attr() -%> balloon_id="<%= elm.balloon.tag_element_part_id -%>" speech_id="<%= elm.speech.tag_element_part_id -%>" class="pettanr-comic-balloon" style="width:<%= elm.balloon.width -%>px; height:<%= elm.balloon.height -%>px; top:<%= elm.balloon.y -%>px; left:<%= elm.balloon.x -%>px; z-index:<%= elm.z -%>; ">
- <img <%= raw elm.balloon.tag_attr -%> class="pettanr-balloon" src="<%= elm.balloon.system_picture.url -%>" alt="<%= elm.caption -%>">
- <div class="pettanr-comic-speech" style="top:<%= elm.speech.y -%>%; left:<%= elm.speech.x -%>%;width:<%= elm.speech.width -%>%; height:<%= elm.speech.height -%>%;">
- <div class="pettanr-comic-speech-inner" <%= raw elm.speech.tag_attr -%> style="font-size:<%= elm.speech.font_size -%>em; text-align:<%= elm.speech.text_align_text -%>; color:#<%= format("%06x", elm.speech.fore_color) -%>;">
- <%= raw elm.speech.writing_format.engine_model.render(elm.speech.content) -%>
- </div>
- </div>
-</div>
+<%= content_tag :div, element.tag_attributes(:div, {'class' => "pettanr-comic-balloon", 'style' => raw(element.balloon.style.merge({'z-index' => element.z}).to_style)}) do %>
+ <%= tag :img, element.balloon.tag_attributes(nil, {'class' => "pettanr-balloon", 'src' => element.balloon.system_picture.url, 'alt' => element.caption}) %>
+ <%= content_tag :div, {'class' => "pettanr-comic-speech", 'style' => raw(element.speech.outer_style.to_style)} do %>
+ <%= content_tag :div, element.speech.tag_attributes(nil, {'class' => "pettanr-comic-speech-inner", 'style' => raw(element.speech.inner_style.to_style)}) do %>
+ <%= raw element.speech.writing_format.engine_model.render(element.speech.content) -%>
+ <% end %>
+ <% end %>
+<% end %>
def to_attr
self.map {|k, n| "#{k}=\"#{n}\"" }.join(' ')
end
+
+ def to_style
+ self.map {|k, n| "#{k}: #{n}" }.join('; ')
+ end
+
end
class Editor
include EditorModule
-
+ cattr_accessor :eid
+ @@eid = 0
class Generator
def initialize editor
@editor = editor
attr_accessor :root_item, :dock, :generator, :operators
def initialize root_item, operators
+ @@eid += 1
@root_item = root_item
@operators = operators
@dock = self.new_dock
- @pool = Pool.new @root_item
+ @pool = Pool.new self, @root_item
@generator = Generator.new self
+ @@eid = 0 if @@eid > 0x7fffff
end
#InstanceMethods
+ def name
+ 'owner'
+ end
+
+ def eid
+ @@eid
+ end
+
def new_dock
Dock.new self
end
self.template_dir + self.template_file_name
end
+ def register
+ @root_item.editor = self
+ @root_item.each_elements(self.name) do |element|
+ element.editor = self
+ element.parent = @root_item
+ end
+ end
+
+ def eid
+ 'editor-' + @@eid.to_s
+ end
+
def dom_id
'editor-' + @root_item.id.to_s
end
require_dependency "editor/panel_dock/panel_dock"
module Editor
class PanelEditor < Editor
+ def name
+ 'panel'
+ end
+
def new_dock
PanelDock.new self
end
module Editor
module EditorModule
class Pool
- attr_accessor :root_item, :tabs
- def initialize root_item
+ attr_accessor :editor, :root_item, :pool, :index
+ def initialize editor, root_item
+ @editor = editor
@root_item = root_item
- @root_item.each_elements('panel') do |element|
- element.pool = self
+ @pool = {}
+ @index = 1
+ self.editize
+ end
+
+ # regist stored element
+ def editize
+ self.register @root_item
+ @root_item.each_elements(self.name) do |element|
+ self.register element
+ end
+ end
+
+ def register item
+ @item.editor = @editor
+ parent_model = item.parent_model(@editor.name)
+ if parent_model
+ item.parent = find
+ end
+ if item.new_record?
+ if parent_model
+ # element
+ item.parent__send__ "build_#{parent_model.child_element_name(item.item_name)}"
+ else
+ # root
+
+ end
+ item.pool_id = @index
+ @index += 1
+ else
+ item.pool_id = item.id
end
+ @pool[item.item_name] ||= {'stored' => {}, 'new' => {}}
+ @pool[item.item_name][item.dom_pool_type] ||= {}
+ @pool[item.item_name][item.dom_pool_type][item.pool_id] = item
+ end
+
+ def unregister item
+
end
end
::Manifest.item_name_to_model @model_name
end
+ def table_name
+ self.classify.table_name
+ end
+
def valid_encode_columns
r = []
@attributes.each {|attribute_name, attribute|
false
end
+ def each_child_model_manifest tree_name
+ ::Manifest.models.each {|child_model_name, child_model_manifest|
+ next unless child_model_manifest.tree[tree_name]
+ next unless child_model_manifest.tree[tree_name].parent_model_name == @model_name
+ yield child_model_manifest
+ }
+ end
+
+ def child_models tree_name
+ r = []
+ self.each_child_model_manifest(tree_name) {|child_model_manifest|
+ r << child_model_manifest.classify
+ }
+ r
+ end
+
+ def child_element_names tree_name
+ r = []
+ self.each_child_model_manifest(tree_name) {|child_model_manifest|
+ # has_one ?
+ r << self.associations.child_element_name(child_model_manifest.model_name)
+ }
+ r
+ end
+
end
end
@model.model_manifest
end
+ def child_element_name child_item_name
+ if @has_one[child_item_name]
+ child_model_manifest.model_name
+ else
+ child_model_manifest.table_name
+ end
+ end
+
end
end
class Content < Item
self.abstract_class = true
- # Dynamic ClassMethods
+ # Dynamic Methods
def self._content?
self.my_manifest.content_model
def self.load_manifest
super
+ # Class Methods
f = self._content?
define_singleton_method("content?") do
f
define_singleton_method("owner_column") do
o
end
+ define_singleton_method("child_models") do |tree_name|
+ self.my_manifest.child_models tree_name
+ end
+ # Instance Methods
+ define_method("parent_model") do |tree_name|
+ self.__send__ self.class.parent_model(tree_name).item_name
+ end
+ define_method("elements") do |tree_name|
+ self.my_manifest.child_element_names(tree_name).map {|element_name|
+ self.__send__ element_name
+ }
+ end
end
- # ClassMethods
+ # Class Methods
def self.operator operators
return nil unless self.owner_type
raise ActiveRecord::Forbidden unless content.own?(operators)
content
end
- #InstanceMethods
+ # Instance Methods
def owner_model
self.class.owner_model ? self.__send__(self.class.owner_model.item_name) : self
module Peta
- module Element
- def self.included(base)
- base.extend(ClassMethods)
- base.__send__ :include, InstanceMethods
+ class Element < Content
+ self.abstract_class = true
+
+ # Dynamic ClassMethods
+
+
+ def self.list_opt_for_panel
+ {}
+ end
+
+ def self.show_opt_for_panel
+ {}
+ end
+
+ def self.json_opt_for_panel
+ {}
+ end
+
+ def has_picture?
+ false
+ end
+
+ def has_part?
+ false
+ end
+
+ def parts
+ @parts ||= []
+ end
+
+ def extend_column
+ nil
+ end
+
+ def extend_element_name
+ self.extend_column ? self.attributes[extend_column] : self.element_name
+ end
+
+ def parent
+ @parent
+ end
+
+ def parent= content
+ @parent = content
end
- module ClassMethods
- def colum_structures
- raise
- end
-
- def list_opt_for_panel
- {}
- end
-
- def show_opt_for_panel
- {}
- end
-
- def json_opt_for_panel
- {}
- end
-
- def path_name with_engine = false
- self.to_s.tableize
- end
-
+ def scenario_template with_engine = false
+ self.path_name(with_engine) + '/scenario'
end
- module InstanceMethods
- private
-
- public
-
- def has_picture?
- false
- end
-
- def has_part?
- false
- end
-
- def parts
- @parts ||= []
- end
-
- def has_helper? column_name
- self.class.colum_structures[column_name] and self.class.colum_structures[column_name][:helper]
- end
-
- def element_name
- self.class.to_s.underscore
- end
-
- def extend_column
- nil
- end
-
- def extend_element_name
- self.extend_column ? self.attributes[extend_column] : self.element_name
- end
-
- def find_configurations hash, key
- if hash[key].is_a? String
- self.find_configurations hash, hash[key]
- else
- return hash[key]
- end
- end
-
- def element_index
- @element_index ||= self.t
- end
-
- def parent
- @parent ||= self.panel
- end
-
- def parent= content
- @parent = content
- end
-
- def new_index
- @new_index
- end
-
- def new_index= v
- @new_index = v
- end
-
- def new_panel
- @new_panel
- end
-
- def new_panel= v
- @new_panel = v
- end
-
- def get_panel
- self.panel || @new_panel
- end
-
- def tag_id c = nil
- 'panel' + self.tag_panel_id + self.tag_element_type + self.tag_element_id + c.to_s
- end
-
- def field_tag_id f
- self.tag_id + f.to_s
- end
-
- def tag_panel_id
- self.get_panel.new_record? ? '0' : self.get_panel.id.to_s
- end
-
- def tag_element_id
- self.new_record? ? '0' : self.id.to_s
- end
-
- def tag_element_type
- raise
- end
-
- def tag_new_index
- self.new_index.to_s
- end
-
- def path_name with_engine = false
- self.class.path_name(with_engine)
- end
-
- def form_template with_engine = false
- self.path_name(with_engine) + '/form'
- end
-
- def scenario_template with_engine = false
- self.path_name(with_engine) + '/scenario'
- end
-
- def element_face_template with_engine = false
- self.path_name(with_engine) + '/element_face'
- end
-
- def form_helper_template(colum_name)
- self.class.colum_structures[colum_name][:helper]
- end
-
- def tag_attributes column = nil, opt = {}
- {
- :id => self.field_tag_id(column), :panel_id => self.tag_panel_id,
- :element_id => self.tag_element_id, :element_type => self.tag_element_type
- }.merge(opt)
- end
-
- def field_tag_attributes column, no_attr, opt = {}
- self.tag_attributes(column).merge(
- {:column => column, :new_index => self.tag_new_index, :no_attr => no_attr}
- ).merge(opt)
- end
-
- #render element by body
- def any_tag_attributes name = nil, opt = {}
- r = self.tag_attributes(name)
- r.merge!(
- {:new_index => self.tag_new_index}
- ) if self.new_index
- r.merge(opt)
- end
-
- def select_tag_attributes(selected, column, no_attr)
- [
- :last, :first,
- {:html => {:selected => selected}},
- self.field_tag_attributes(column, no_attr)
- ]
- end
-
- def tag_attr column = nil, opt = {}
- self.tag_attributes(column, opt).to_attr
- end
-
- def field_tag_attr column, no_attr, opt = {}
- self.field_tag_attributes(column, no_attr, opt).to_attr
- end
-
- def any_tag_attr name = nil, opt = {}
- self.any_tag_attributes(name, opt).to_attr
- end
-
+ def element_face_template with_engine = false
+ self.path_name(with_engine) + '/element_face'
end
+
+ def tag_attributes column = nil, opt = {}
+ r = super
+ r.merge({'data-parent_dom_id' => self.parent.dom_item_id}) if self.editor
+ r
+ end
+
end
end
{}
end
- def self.visible_count
- self.count self.visible_count_options
- end
-
- def self.visible_count_options
- []
- end
-
#InstanceMethods
def item_name
true
end
- def pool
- @pool
+ def editor
+ @editor
+ end
+
+ def editor=(e)
+ @editor = e
+ end
+
+ def pool_id
+ @pool_id || self.id
+ end
+
+ def pool_id=(i)
+ @pool_id = i
end
def dom_id
- self.new_record? ? '1' : self.id.to_s
+ self.pool_id.to_s
end
def dom_pool_type
self.new_record? ? 'stored' : 'new'
end
- def dom_item_id column_name = nil
- r = self.dom_pool_type + '-' + self.item_name + '-' + self.dom_id
- r += '-' + column_name.to_s if column_name
- r
+ def dom_item_id name = nil
+ r = [self.editor.eid, self.dom_pool_type, self.item_name, self.dom_id]
+ r += name.to_s if column_name
+ r.join '-'
end
- def tag_attributes column_name = nil, opt = {}
+ def tag_attributes name = nil, opt = {}
r = {
'data-pool_type' => self.dom_pool_type, 'data-id' => self.dom_id,
'data-item_name' => self.item_name
}
- r.merge!({'id' => self.dom_item_id(column_name)}) if self.pool
- # 'data-parent_dom_id' => self.parent.dom_item_id
+ r.merge!({'id' => self.dom_item_id(name)}) if self.editor
r.merge!(opt)
r
end
)
end
- #render element by body
- def any_tag_attributes name = nil, opt = {}
- r = self.tag_attributes(name)
- r.merge!(
- {:new_index => self.tag_new_index}
- ) if self.new_index
- r.merge(opt)
- end
-
end
end