创新实训项目分析(八)

本文档详细解析了一个名为Article的类,该类作为Plugin的一部分,涉及文章元素的创建、更新、移除等操作。内容包括构造器、初始化方法、序列化与反序列化、合并操作以及注册的相关工具和处理器。此外,还介绍了与PolygonGroup类的交互以及在图形渲染中的应用。
摘要由CSDN通过智能技术生成

2021SC@SDUSC

在敲定了XML格式与基本样例后,开始对之前看的代码进行解析

首先是对Plugin类进行解析

首先是Article

构造器:


Article.prototype = Object.create(PolygonGroup.prototype);
Article.prototype.constructor = Article;

初始化及基本操作方法:

Article.prototype.initialize = function(id, pages){
  PolygonGroup.prototype.initialize.call(this, id, pages);
};
// --------------------------------------------------------------------------------
// * New Element
// --------------------------------------------------------------------------------
Article.prototype.newElement = function(){
  return new Article('', []);
};
// --------------------------------------------------------------------------------
// * Add
// --------------------------------------------------------------------------------
Article.prototype.onAwake = function(){
  PolygonGroup.prototype.onAwake.call(this);
};
// --------------------------------------------------------------------------------
// * Update
// --------------------------------------------------------------------------------
Article.prototype.onUpdate = function(){
  PolygonGroup.prototype.onUpdate.call(this);
};
// --------------------------------------------------------------------------------
// * Remove
// --------------------------------------------------------------------------------
Article.prototype.onRemove = function(){
  PolygonGroup.prototype.onRemove.call(this);
};

json的序列化与反序列化操作

Article.prototype.loadJson = function(json_object){
  PolygonGroup.prototype.loadJson.call(this, json_object);
};
Article.prototype.saveJson = function(){
  return PolygonGroup.prototype.saveJson.call(this);
};
Article.prototype.exportJson = function(){
  return PolygonGroup.prototype.exportJson.call(this);
};

merge操作:

Article.prototype.getMergePoints = function(){
  let points = {};
  for(let i = 0; i < this._pages.length; i++){
    points[this._pages[i]] = [];
  }
  for(let i = 0; i < this._children.length; i++){
    let paragraph_object = ElementManager.getElement(Paragraph.TAG, this._children[i]);
    if(paragraph_object){
      for(let page in paragraph_object.points){
        points[page] = points[page].concat(paragraph_object.points[page]);
      }
    }
  }
  return points;
};

Article.prototype.getMergePages = function(){
  let pages = [];
  for(let i = 0; i < this._children.length; i++){
    let paragraph_object = ElementManager.getElement(Paragraph.TAG, this._children[i]);
    if(paragraph_object){
      pages.push(paragraph_object.pages);
    }
  }
  return pages;
};

注册插件:

ToolManager.addTool(new Tool('article', 'plugin-tooltip-article', 'mdi-file-document-outline', Tool.Slot.PLUGIN, {
  on_click: function(){
    ToolManager.setCurrentPlugin(this._id);
    Engine.setCurrentTodo('plugin-todo-article');
  }
}));
// --------------------------------------------------------------------------------
ToolManager.addHandler(new Handler('article.onMouseLeftClick', 'left_click', false, Engine,
  function(event){
    if(DocumentManager.getCurrentPage() <= 0) return;
    let collide_list = CollideManager.getCollideList(Polygon2D.TAG, 1);
    if(collide_list.length > 0){
      let character = ElementManager.getFilteredElement(Polygon2D.TAG, collide_list[0]).character;
      if(character){
        let word = ElementManager.getFilteredElement(Character.TAG, character).father;
        if(word){
          let sentence = ElementManager.getFilteredElement(Word.TAG, word).father;
          if(sentence){
            let paragraph = ElementManager.getFilteredElement(Sentence.TAG, sentence).father;
            if(paragraph){
              let paragraph_object = ElementManager.getFilteredElement(Paragraph.TAG, paragraph);
              if(paragraph_object.father){
                SelectManager.selectId(paragraph_object.father);
              }else{
                if(SelectManager.isSelectedType(Article.TAG)){
                  let article_object = SelectManager.getSelectedObject();
                  article_object.append(paragraph_object);
                  /* History */
                }else{
                  let article_object = ElementManager.makeElement(Article.TAG, []);
                  article_object.append(paragraph_object);
                  SelectManager.selectObject(article_object);
                  DocumentManager.addElementWithUpdate(Article.TAG, article_object);
                  return;
                }
              }
            }
          }
        }
      }
    }
    Graphics.refresh();
  })
);
ToolManager.addHandler(new Handler('article.onMouseRightClick', 'right_click', false, Engine,
  function(event){
    if(DocumentManager.getCurrentPage() <= 0) return;
    let collide_list = CollideManager.getCollideList(Polygon2D.TAG, 1);
    if(collide_list.length > 0){
      let character = ElementManager.getFilteredElement(Polygon2D.TAG, collide_list[0]).character;
      if(character){
        let word = ElementManager.getFilteredElement(Character.TAG, character).father;
        if(word){
          let sentence = ElementManager.getFilteredElement(Word.TAG, word).father;
          if(sentence){
            let paragraph = ElementManager.getFilteredElement(Sentence.TAG, sentence).father;
            if(paragraph){
              let paragraph_object = ElementManager.getFilteredElement(Paragraph.TAG, paragraph);
              let article = paragraph_object.father;
              if(article){
                if(!SelectManager.isSelectedType(Article.TAG) || article === SelectManager.getSelectedId()){
                  let article_object = ElementManager.getFilteredElement(Article.TAG, article);
                  article_object.remove(paragraph_object);
                  if(article_object.isEmpty()){
                    SelectManager.unSelect();
                    DocumentManager.removeElementWithUpdate(Article.TAG, article);
                  }else{
                    SelectManager.selectId(article);
                    Graphics.refresh();
                    /* History */
                  }
                  return;
                }
              }
            }
          }
        }
      }
    }
    SelectManager.unSelect();
    Graphics.refresh();
  })
);
ToolManager.addHandler(new Handler('article.onMouseMove', 'mousemove', false, Engine,
  function(event){
    Graphics.refresh();
  })
);
ToolManager.addHandler(new Handler('article.onMouseOut', 'mouseout', false, Engine,
  function(event){
    Graphics.refresh();
  })
);
// ================================================================================

// ================================================================================
// * Register Renderer
// --------------------------------------------------------------------------------
Graphics.renderArticleObjectNormal = function(article_object){
  let line_scale = 5;
  let line_color = ColorManager.RGBToHex(0, 255, 255);
  let polygons = article_object.getPolyGonList();
  for(let i = 0; i < polygons.length; i++){
    Graphics.strokePolygon(Graphics.getRenderPolygon(polygons[i]).getScaledPolygon(line_scale),
      2, line_color, 0.8);
  }
};
// --------------------------------------------------------------------------------
RenderManager.addRenderer(new Renderer('article.doc.normal', '', 30, function(ctx){
  if(DocumentManager.getCurrentPage() <= 0) return;
  let word_objects = ElementManager.getFilteredElements(Word.TAG);
  for(let key in word_objects){
    Graphics.renderWordObjectNormal(word_objects[key]);
  }
  let sentence_objects = ElementManager.getFilteredElements(Sentence.TAG);
  for(let key in sentence_objects){
    Graphics.renderSentenceObjectNormal(sentence_objects[key]);
  }
  let paragraph_objects = ElementManager.getFilteredElements(Paragraph.TAG);
  for(let key in paragraph_objects){
    Graphics.renderParagraphObjectNormal(paragraph_objects[key]);
  }
  let article_objects = ElementManager.getFilteredElements(Article.TAG);
  for(let key in article_objects){
    Graphics.renderArticleObjectNormal(article_objects[key]);
  }
  let book_objects = ElementManager.getFilteredElements(Book.TAG);
  for(let key in book_objects){
    Graphics.renderBookObjectNormal(book_objects[key]);
  }
}));
RenderManager.addRenderer(new Renderer('article.polygon.collide', '', 21, function(ctx){
  if(DocumentManager.getCurrentPage() <= 0) return;

  let collide_list = CollideManager.getCollideList(Polygon2D.TAG, 1);
  if(collide_list.length > 0){
    let polygon_object = ElementManager.getElement(Polygon2D.TAG, collide_list[0]);
    Graphics.renderPolygonCollide(Graphics.getRenderPolygon(polygon_object.getPolygon()));
  }
}));
// ================================================================================

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值