private InteractiveHeaderedItem MessageToContent(ContentBody content, InteractiveItemsStack item, bool reply) { InteractiveHeaderedItem headerContent = PrepareMessagesHeader(content, item, reply); nodeContents.Add(headerContent); nodeContentNames.Add(headerContent, lineHeaderContent.ToString()); nodeContentsByName.Add(lineHeaderContent.ToString(), headerContent); lineHeaderContent++; return(headerContent); }
// создание заголовка раскрывающихся полей, и кнопки +/- для раскрытия Reply/Option protected InteractiveHeaderedItem PrepareMessagesHeader(ContentBody content, IDrawableRectangle item, bool reply) { #region Prepare Container DrawableItemsStack headerPlus = new DrawableItemsStack(); DrawableItemsStack headerMinus = new DrawableItemsStack(); headerPlus.OrientationAxis = Axis.X; headerMinus.OrientationAxis = Axis.X; #endregion #region Create Header TextSegment titleSegment = new TextSegment(Graphics, (reply) ? @"""" + content.msgText + @"""" : (nodeLowDetails) ? "\u25CF " + content.msgText : content.msgText, content.index, MessagesFont, true, reply); // GroupTitleFont if (!nodeLowDetails) { PlusShape plus = new PlusShape(); plus.Border = 4; plus.ScaleShape = false; plus.Width = plus.ShapeWidth; plus.Height = plus.ShapeHeight; headerPlus.Add(plus); MinusShape minus = new MinusShape(); minus.Border = 4; minus.ScaleShape = false; minus.Width = minus.ShapeWidth; minus.Height = minus.ShapeHeight; headerMinus.Add(minus); } headerPlus.Add(titleSegment); headerMinus.Add(titleSegment); //пиктограмма //if (!reply) { // DrawableItemsStack<VectorShape> image = new DrawableItemsStack<VectorShape>(); // image.OrientationAxis = Axis.X; // image.KeepAspectRatio = true; // image.Border = -3.0f; // image.Add(new OptionsCircleShape()); // headerPlus.Add(image); // headerMinus.Add(image); //} DrawableItemsStack headerCollapsed = new DrawableItemsStack(); DrawableItemsStack headerExpanded = new DrawableItemsStack(); headerCollapsed.OrientationAxis = Axis.Z; headerExpanded.OrientationAxis = Axis.Z; headerCollapsed.Add(new DrawableRectangle((reply) ? ReplyTitlesBackground : OptionTitlesBackground, null, 5, 5, 5, 5)); headerCollapsed.Add(headerPlus); headerExpanded.Add(new DrawableRectangle((reply) ? ReplyTitlesBackground : OptionTitlesBackground, null, 5, 5, 0, 0)); headerExpanded.Add(headerMinus); #endregion InteractiveHeaderedItem tg = new InteractiveHeaderedItem(headerCollapsed, headerExpanded, item); tg.Collapsed = true; // событие, клик мышкой по элементу строки кода tg.HeaderClicked += delegate(object sender, PointF e) { if (Math.Abs(tg.AbsoluteX - e.X) < 20 && Math.Abs(tg.AbsoluteY - e.Y) < 20) { tg.Collapsed = !tg.Collapsed; } else { ContentClick(this, titleSegment); } }; // старый вариант //IMouseInteractable interactive = content as IMouseInteractable; //if (interactive != null) { // tg.ContentClicked += delegate { tgContentClicked(interactive, tg); }; // //оригинальное событие // //tg.ContentClicked += delegate (object sender, PointF pos) { // // interactive.HandleMouseClick(pos); // //}; //} tg.RedrawNeeded += HandleRedraw; return(tg); }
/* * void tgContentClicked(IMouseInteractable interactive, InteractiveHeaderedItem tg) * { * if (ContentClick == null) return; * * foreach (var i in (InteractiveItemsStack)interactive) * { * if (!(i is InteractiveItemsStack)) continue; * foreach (var ts in (InteractiveItemsStack)i) * { * if (ts is TextSegment) * ContentClick(this, (TextSegment)ts); * } * } * } */ protected virtual void PrepareNodeContent() { if (dataNode == null) { return; } InteractiveItemsStack itemReply; InteractiveItemsStack itemOptions; DrawableItemsStack <InteractiveHeaderedItem> tileHeader; foreach (ContentBody content in dataNode.NodeContent) { switch (content.type) { case OpcodeType.Reply: case OpcodeType.Message: itemReply = PrepareMessageContent(content.scrText, true); tileHeader = new DrawableItemsStack <InteractiveHeaderedItem>(); tileHeader.Add(MessageToContent(content, itemReply, true)); items.Add(tileHeader); break; case OpcodeType.Option: case OpcodeType.giq_option: case OpcodeType.gsay_option: itemOptions = PrepareMessageContent(content.scrText, false); tileHeader = new DrawableItemsStack <InteractiveHeaderedItem>(); tileHeader.Add(MessageToContent(content, itemOptions, false)); items.Add(tileHeader); break; case OpcodeType.call: //var callContent = new DrawableItemsStack(); //InteractiveItemsStack(); //callContent.OrientationAxis = Axis.Z; //callContent.Add(new DrawableRectangle(CallTextTitlesBackground, null, 8, 8, 8, 8)); //callContent.Add(new TextSegment(Graphics, content.scrText, GroupTitleFont, true)); /* * Код метода выше вызывает некорректную отрисовку высоты для элемента DrawableRectangle * поэтому был использован нижний способ добавления элементов */ var callText = new DrawableItemsStack(); callText.Add(new TextSegment(Graphics, content.scrText, GroupTitleFont, true)); var background = new DrawableItemsStack(); background.OrientationAxis = Axis.Z; background.Add(new DrawableRectangle(CallTextTitlesBackground, null, 8, 8, 8, 8)); background.Add(callText); var header = new InteractiveHeaderedItem(background, new DrawableItemsStack(), new DrawableItemsStack()); header.Collapsed = true; //header.RedrawNeeded += HandleRedraw; items.Add(header); break; default: items.Add(new TextSegment(Graphics, content.scrText, ScriptFont, true)); break; } } }
// Создание ноды (start) public NodeCanvasItem(INode dataNode, bool nodeLowDetails) { this.dataNode = dataNode; this.nodeLowDetails = nodeLowDetails; // Header gradient Color titleBackground; switch (dataNode.NodeType) { case NodesType.DialogEnd: titleBackground = TitleBackgroundRed; break; case NodesType.DialogStart: titleBackground = TitleBackgroundGreen; break; case NodesType.NoFromLink: titleBackground = TitleBackgroundYellow; break; case NodesType.Unused: titleBackground = TitleBackgroundGray; break; default: titleBackground = TitleBackground; break; } grad = new LinearGradientBrush(new PointF(0, 0), new PointF(1, 0), titleBackground, Color.White); classItemHeaderedContent = new InteractiveHeaderedItem(titlesCollapsed, titlesExpanded, InitContentContainer(InitContent())); classItemContainer.Container = this; classItemContainer.Add(classItemHeaderedContent); Pen outlinePen = GetNodeOutlinePen(); if (RoundedCorners) { int radius = CornerRadius; containingShape = new DrawableRectangle(null, outlinePen, radius, radius, radius, radius); titlesBackgroundCollapsed = new DrawableRectangle(grad, null, radius, radius, radius, radius); titlesBackgroundExpanded = new DrawableRectangle(grad, null, radius, radius, 0, 0); } else { containingShape = new DrawableRectangle(null, outlinePen, 0, 0, 0, 0); titlesBackgroundCollapsed = new DrawableRectangle(grad, null, 0, 0, 0, 0); titlesBackgroundExpanded = new DrawableRectangle(grad, null, 0, 0, 0, 0); } classItemContainer.Add(containingShape); classItemContainer.OrientationAxis = Axis.Z; titles.Border = 5; titlesCollapsed.Add(titlesBackgroundCollapsed); titlesCollapsed.Add(titles); titlesCollapsed.OrientationAxis = Axis.Z; titlesExpanded.Add(titlesBackgroundExpanded); titlesExpanded.Add(titles); titlesExpanded.OrientationAxis = Axis.Z; }