Ejemplo n.º 1
0
        private void pbDrawing_MouseMove(object sender, MouseEventArgs e)
        {
            if (CurrentAct != Acts.AddNode)
            {
                var list = VisualModel.Nodes.QueueVisList;

                if (isChangedImage)
                {
                    pictureBox1.Image = new Bitmap(pbDrawing.Width, pbDrawing.Height); //прозрачный типа
                    isChangedImage    = false;
                }

                for (var i = list.Count - 1; i >= 0; i--)
                {
                    if (list[index: i].GraphPath.IsVisible(point: e.Location))
                    {
//нашли самую верхнюю, что туда входит
                        if (list[index: i] != VisualModel.Nodes.SelectedNode)
                        {
                            var currVisNode = list[index : i];
                            isChangedImage = true;

                            using (var g = Graphics.FromImage(pictureBox1.Image))
                            {
                                g.FillPath(brush: Brushes.Orange, path: currVisNode.GraphPath);
                                g.DrawPath(pen: Pens.LimeGreen, path: currVisNode.GraphPath);


                                var text = VisualModel.Nodes.NodesList.Keys[
                                    index : VisualModel.Nodes.NodesList.IndexOfValue(value : currVisNode)];
                                var widthFont = SystemFonts.DefaultFont.Size; //возвращает ширину, надо же
                                var shiftLeft = widthFont * text.Length / 2;
                                g.DrawString(s: text, font: SystemFonts.DefaultFont, brush: Brushes.Red,
                                             x: currVisNode.Center.X - shiftLeft, y: currVisNode.Center.Y - 3);
                                pictureBox1.Update();
                            }
                            pointedNode = currVisNode;
                        }
                        break;
                    }
                }
                pointedNode = null;
            }

            if (CurrentAct == Acts.MoveNode)
            {//реализую перемещение
            }
        }
Ejemplo n.º 2
0
        private void pbDrawing_MouseClick(object sender, MouseEventArgs e)
        {
            switch (CurrentAct)
            {
            case Acts.AddNode:
                var key = (DataModel.Nodes.Count + 1).ToString();
                DataModel.Nodes.Add(
                    key: key, value: new DataModel.Node(key: key));     //+1 - чтобы шло с единицы, а не с нуля
                //1.2 VisualModel
                var visNode =
                    new VisualModel.Node(
                        centerPoint: e.Location);     //так, ну это Location относительно угла pictureBox
                VisualModel.Nodes.Add(key: key, value: visNode);
                VisualModel.Nodes.DrawTo(pbDrawing);
                break;


            case Acts.ConnectNodes:

                //Так, ну прежде всего надо разобраться с кликом. Хотя бы на уровне выделения вершин.
                //Ну что это такое, серьезно, после добавления стрелки клик как будто нажимается еще раз,
                //но уже для вершины, которая за этой??? Непорядок.
                for (var i = VisualModel.Nodes.QueueVisList.Count - 1;
                     i >= 0;
                     i--)    //типа иду с конца, т.к. добавляю я новую вершину в конец, и мне надо найти самую "верхнюю вершину" с подходящим graphpath
                {
                    if (VisualModel.Nodes.QueueVisList[index: i].GraphPath.IsVisible(point: e.Location)
                        ) //нашли-таки эту вершину
                    {
                        var itemNode = VisualModel.Nodes.QueueVisList[index : i];
                        //VisualModel.Nodes.ToTop(item: itemNode);//Хм, а зачем это? и так будет видно выглядывающий кусок желтизны.
                        if (VisualModel.Nodes.SelectedNode != null)
                        {
                            if (VisualModel.Nodes.SelectedNode != itemNode)
                            {
                                //добавляем стрелку
                                VisualModel.Arrows.Add(fromNode: VisualModel.Nodes.SelectedNode, toNode: itemNode);

                                //а еще связать вершины в DataModel...
                                var list      = VisualModel.Nodes.NodesList;
                                var listKeys  = list.Keys;
                                var firstKey  = listKeys[list.IndexOfValue(VisualModel.Nodes.SelectedNode)];
                                var secondKey = listKeys[list.IndexOfValue(itemNode)];

                                DataModel.Nodes.TryConnect(firstKey, secondKey);

                                VisualModel.Nodes.ClearSelection();     //все, выделения больше нет.
                            }
                        }
                        else
                        {
                            VisualModel.Nodes.SelectedNode = itemNode;
                        }

                        break;
                    }
                }
                //Вызов прорисовки
                VisualModel.CommonVisual.DrawTo(pbDrawing);

                /*if (VisualModel.Nodes.SelectedNode != null)
                 * {
                 *  //ну вот зачем я это делаю здесь, не пойму? Я ж так не могу добавить стрелку! Каждый клик - Selected==null.
                 *  VisualModel.Nodes.ClearSelection(); //в конце события все равно все обновится
                 * }*/
                break;


            case Acts.Delete:     //Ураа, это тоже рабочее
                for (var i = VisualModel.Nodes.QueueVisList.Count - 1;
                     i >= 0;
                     i--)    //типа иду с конца, т.к. добавляю я новую вершину в конец, и мне надо найти самую "верхнюю вершину" с подходящим graphpath
                {
                    if (VisualModel.Nodes.QueueVisList[index: i].GraphPath.IsVisible(point: e.Location)
                        ) //нашли-таки эту вершину
                    {
                        var itemNode = VisualModel.Nodes.QueueVisList[index : i];
                        if (VisualModel.Nodes.SelectedNode != null)
                        {
                            if (VisualModel.Nodes.SelectedNode != itemNode)
                            {
                                //удаляем стрелку
                                VisualModel.Arrows.Remove(fromNode: VisualModel.Nodes.SelectedNode,
                                                          toNode: itemNode);

                                //а еще удалить из DataModel...
                                var list      = VisualModel.Nodes.NodesList;
                                var listKeys  = list.Keys;
                                var firstKey  = listKeys[list.IndexOfValue(VisualModel.Nodes.SelectedNode)];
                                var secondKey = listKeys[list.IndexOfValue(itemNode)];

                                DataModel.Nodes.TryDisconnect(firstKey, secondKey);

                                VisualModel.Nodes.ClearSelection();     //все, выделения больше нет.
                            }
                        }
                        else
                        {
                            VisualModel.Nodes.SelectedNode = itemNode;
                        }
                        //Вызов прорисовки
                        VisualModel.CommonVisual.DrawTo(pbDrawing);
                        break;
                    }
                }


                break;
            }
        }
Ejemplo n.º 3
0
        private void pbDrawing_MouseClick(object sender, MouseEventArgs e)
        {
            switch (CurrentAct)
            {
            case Acts.AddNode:
                var key = (DataModel.Nodes.Count + 1).ToString();
                DataModel.Nodes.Add(
                    key: key, value: new DataModel.Node(key: key));     //+1 - чтобы шло с единицы, а не с нуля
                //1.2 VisualModel
                var visNode =
                    new VisualModel.Node(
                        centerPoint: e.Location);     //так, ну это Location относительно угла pictureBox
                VisualModel.Nodes.Add(key: key, value: visNode);
                VisualModel.Nodes.DrawTo(picBox: pbDrawing);
                break;


            case Acts.ConnectNodes:

                for (var i = VisualModel.Nodes.QueueVisList.Count - 1;
                     i >= 0;
                     i--)
                {
                    if (VisualModel.Nodes.QueueVisList[index: i].GraphPath.IsVisible(point: e.Location)
                        ) //нашли-таки эту вершину
                    {
                        var itemNode = VisualModel.Nodes.QueueVisList[index : i];
                        //VisualModel.Nodes.ToTop(item: itemNode);//Хм, а зачем это? и так будет видно выглядывающий кусок желтизны.
                        if (VisualModel.Nodes.SelectedNode != null)
                        {
                            if (VisualModel.Nodes.SelectedNode != itemNode)
                            {
                                //добавляем стрелку
                                VisualModel.Arrows.Add(fromNode: VisualModel.Nodes.SelectedNode, toNode: itemNode);

                                if (!VisualModel.Arrows.Directed)
                                {
                                    VisualModel.Arrows.Add(fromNode: itemNode,
                                                           toNode: VisualModel.Nodes.SelectedNode);
                                }

                                //а еще связать вершины в DataModel...
                                var list     = VisualModel.Nodes.NodesList;
                                var listKeys = list.Keys;
                                var firstKey =
                                    listKeys[index : list.IndexOfValue(value : VisualModel.Nodes.SelectedNode)];
                                var secondKey = listKeys[index : list.IndexOfValue(value : itemNode)];

                                DataModel.Nodes.TryConnect(first: firstKey, second: secondKey);
                                if (!VisualModel.Arrows.Directed)
                                {
                                    DataModel.Nodes.TryConnect(first: secondKey, second: firstKey);
                                }

                                VisualModel.Nodes.ClearSelection();     //все, выделения больше нет.
                            }
                        }
                        else
                        {
                            VisualModel.Nodes.SelectedNode = itemNode;
                        }

                        break;
                    }
                }
                //Вызов прорисовки
                VisualModel.CommonVisual.DrawTo(picBox: pbDrawing);

                break;


            case Acts.Delete:     //Ураа, это тоже рабочее
                for (var i = VisualModel.Nodes.QueueVisList.Count - 1;
                     i >= 0;
                     i--)    //типа иду с конца, т.к. добавляю я новую вершину в конец, и мне надо найти самую "верхнюю вершину" с подходящим graphpath
                {
                    if (VisualModel.Nodes.QueueVisList[index: i].GraphPath.IsVisible(point: e.Location)
                        ) //нашли-таки эту вершину
                    {
                        var itemNode = VisualModel.Nodes.QueueVisList[index : i];
                        if (VisualModel.Nodes.SelectedNode != null)
                        {
                            if (VisualModel.Nodes.SelectedNode != itemNode)
                            {
                                //удаляем стрелку
                                VisualModel.Arrows.Remove(fromNode: VisualModel.Nodes.SelectedNode,
                                                          toNode: itemNode);
                                if (!VisualModel.Arrows.Directed)
                                {
                                    VisualModel.Arrows.Remove(fromNode: itemNode,
                                                              toNode: VisualModel.Nodes.SelectedNode);
                                }

                                //а еще удалить из DataModel...
                                var list     = VisualModel.Nodes.NodesList;
                                var listKeys = list.Keys;
                                var firstKey =
                                    listKeys[index : list.IndexOfValue(value : VisualModel.Nodes.SelectedNode)];
                                var secondKey = listKeys[index : list.IndexOfValue(value : itemNode)];

                                DataModel.Nodes.TryDisconnect(first: firstKey, second: secondKey);
                                if (!VisualModel.Arrows.Directed)
                                {
                                    DataModel.Nodes.TryDisconnect(first: secondKey, second: firstKey);
                                }
                                VisualModel.Nodes.ClearSelection();     //все, выделения больше нет.
                            }
                        }
                        else
                        {
                            VisualModel.Nodes.SelectedNode = itemNode;
                        }
                        //Вызов прорисовки
                        VisualModel.CommonVisual.DrawTo(picBox: pbDrawing);
                        break;
                    }
                }


                break;
            }
        }