Esempio n. 1
0
        /// <summary>Repopulate the tree grid of trades</summary>
        private void UpdateGrid(object sender = null, EventArgs args = null)
        {
            // Update the tree grid using differences so that expanded/collapsed nodes are preserved
            using (m_grid.SuspendLayout(true))
            {
                var trades = Trades.Where(x => Bit.AllSet(x.State, Settings.UI.ShowTrades)).ToHashSet();

                // Remove any root level nodes that aren't in the trades list
                m_grid.RootNode.Nodes.RemoveIf(x => !trades.Contains(x.DataBoundItem));

                // Update the trades
                foreach (var trade in Trades.Where(x => Bit.AllSet(x.State, Settings.UI.ShowTrades)))
                {
                    // Get the node for 'trade'. If the trade is not yet in the tree grid, add it
                    var node = m_grid.RootNode.Nodes.FirstOrDefault(x => x.DataBoundItem == trade)
                               ?? m_grid.RootNode.Nodes.Bind(trade);

                    var orders = trade.Orders.Where(x => Bit.AllSet(x.State, Settings.UI.ShowTrades)).ToHashSet();

                    // Remove any orders not in the trade
                    node.Nodes.RemoveIf(x => !orders.Contains(x.DataBoundItem));

                    // Add any orders not yet in the grid
                    orders.RemoveWhere(x => node.Nodes.Any(n => n.DataBoundItem == x));
                    foreach (var order in orders.Where(x => Bit.AllSet(x.State, Settings.UI.ShowTrades)))
                    {
                        node.Nodes.Bind(order);
                    }
                }
            }
            m_grid.Invalidate();
        }
Esempio n. 2
0
        /// <summary>Update UI elements</summary>
        private void UpdateUI(object sender = null, EventArgs args = null)
        {
            m_btn_active_trades.Checked      = Bit.AllSet(Settings.UI.ShowTrades, Trade.EState.ActivePosition);
            m_btn_pending_orders.Checked     = Bit.AllSet(Settings.UI.ShowTrades, Trade.EState.PendingOrder);
            m_btn_visualising_orders.Checked = Bit.AllSet(Settings.UI.ShowTrades, Trade.EState.Visualising);
            m_btn_closed_orders.Checked      = Bit.AllSet(Settings.UI.ShowTrades, Trade.EState.Closed);

            m_grid.Invalidate();
        }
Esempio n. 3
0
 public void OnMouseDblClick(object sender, MouseEventArgs e)
 {
     if (Window == null)
     {
         return;
     }
     if (Bit.AllSet((int)e.Button, (int)MouseButtons.Middle) ||
         Bit.AllSet((int)e.Button, (int)(MouseButtons.Left | MouseButtons.Right)))
     {
         Camera.ResetZoom();
         Invalidate();
     }
 }
Esempio n. 4
0
        [Test] public void HasFlag()
        {
            const NonFlags nf = NonFlags.One;
            const Flags    f  = Flags.One;

            Assert.Throws(typeof(ArgumentException), () => Assert.True(f.HasFlag(nf)));
            Assert.True(f.HasFlag(Flags.One));
            Assert.False(f.HasFlag(Flags.One | Flags.Two));
            Assert.True(Bit.AllSet(f, Flags.One));
            Assert.False(Bit.AllSet(f, Flags.Two));

            var mask = Bit.SetBits(f, Flags.One | Flags.Two | Flags.Three, true);

            Assert.Equal(mask, Flags.One | Flags.Two | Flags.Three);
        }
Esempio n. 5
0
        public ListBoxUI()
        {
            InitializeComponent();

            m_lb.DataSource = new[] { "Item1", "Item2", "Item3", "Item4", "Item5" };
            m_lb.DrawItem  += (s, a) =>
            {
                if (a.Index < 0 || a.Index >= m_lb.Items.Count)
                {
                    return;
                }

                var item = (string)m_lb.Items[a.Index];
                a.Graphics.FillRectangle(Bit.AllSet(a.State, DrawItemState.Selected) ? Brushes.WhiteSmoke : Brushes.White, a.Bounds);
                a.Graphics.DrawString(item, a.Font, Brushes.Blue, a.Bounds.TopLeft());
            };
        }
Esempio n. 6
0
        /// <summary>Called to 'discover' a new element</summary>
        public void DiscoverElement(int atomic_number)
        {
            var element = m_elements[atomic_number - 1];

            Debug.Assert(!Bit.AllSet((int)element.KnownProperties, (int)EElemProp.Existence), "Element already discovered");
            element.KnownProperties |= EElemProp.Existence;
            element.KnownProperties |= EElemProp.Name;

            var e = new Element(atomic_number, m_consts);


            // Update any materials that are based on this element
            foreach (var m in m_compounds.Related(element))
            {
                m.UpdateName();
            }

            // We now know of it's existence, and it's been named
            UpdateKnown();
            RaiseDiscovery(element);
        }
Esempio n. 7
0
 /// <summary>Convert this mouse button flag into an index of first button that is down</summary>
 public static int ButtonIndex(MouseButtons button)
 {
     if (Bit.AllSet(button, MouseButtons.Left))
     {
         return(1);
     }
     if (Bit.AllSet(button, MouseButtons.Right))
     {
         return(2);
     }
     if (Bit.AllSet(button, MouseButtons.Middle))
     {
         return(3);
     }
     if (Bit.AllSet(button, MouseButtons.XButton1))
     {
         return(4);
     }
     if (Bit.AllSet(button, MouseButtons.XButton2))
     {
         return(5);
     }
     return(0);
 }
        /// <summary>Called after 'path' has been added to the collection</summary>
        private void HandlePathAdded(Path path)
        {
            // Look for paths that would include 'path' already
            var p     = new StringBuilder();
            var parts = path.Name.Split(new[] { '\\' }, StringSplitOptions.RemoveEmptyEntries);

            for (int i = 0, iend = parts.Length - 1; i < iend; ++i)
            {
                p.Append(parts[i]).Append("\\");

                // If a parent path is in the collection already, we don't need 'path'
                var idx = Paths.BinarySearch(p.ToString(), Path.Compare);
                if (idx >= 0)
                {
                    idx = Paths.BinarySearch(path, Path.Compare);
                    if (idx >= 0)
                    {
                        Paths.RemoveAt(idx);
                    }
                    return;
                }
            }

            // Remove any paths that are children of 'path'
            {
                var idx = Paths.BinarySearch(path, Path.Compare);
                if (idx < 0)
                {
                    idx = ~idx;
                }
                else
                {
                    ++idx;
                }

                // Find the range of paths to remove
                var count = Paths.Skip(idx).Count(x => x.Name.StartsWith(path.Name));
                Paths.RemoveRange(idx, count);
            }

            // Check the siblings of 'path', if all are in 'Paths' then we can remove
            // all of these child paths and replace it with the parent path
            p.Clear().Append(path.Name);
            for (int i = parts.Length; i-- != 0;)
            {
                p.Length -= parts[i].Length + 1;
                if (p.Length == 0 ||
                    !Path_.EnumFileSystem(p.ToString(), SearchOption.TopDirectoryOnly)
                    .Where(x => Bit.AllSet(x.Attributes, FileAttributes.Directory))
                    .All(x => Paths.BinarySearch(x.FullName, Path.Compare) >= 0))
                {
                    break;                     // Not all child paths of 'p' are in 'Paths'
                }
                // Do this as we go, because the test above needs paths we add here
                using (Paths.SuspendEvents(true))
                {
                    var parent = new Path(path.Text.Substring(0, p.Length));
                    var idx    = Paths.BinarySearch(parent, Path.Compare);
                    if (idx < 0)
                    {
                        idx = ~idx;
                    }
                    else
                    {
                        throw new Exception($"Paths contains {parent} and {Paths[idx]}. {Paths[idx]} should not be in 'Paths' as it's covered by {parent}");
                    }

                    // Remove all children of 'parent'
                    var count = Paths.Skip(idx).Count(x => x.Name.StartsWith(parent.Name));
                    Paths.RemoveRange(idx, count);

                    // Add 'parent'
                    Paths.Insert(idx, parent);
                }
            }

            // Update the check boxes
            UpdateTree();
        }
Esempio n. 9
0
        /// <summary>Set the values in the dialog from the settings</summary>
        private void SetValues()
        {
            // Image files
            m_check_image_files.Checked = Bit.AllSet((int)m_settings.MediaType, (int)EMediaType.Image);
            m_tt.SetToolTip(m_check_image_files, "Include image file formats when searching for media files");

            // Video files
            m_check_video_files.Checked = Bit.AllSet((int)m_settings.MediaType, (int)EMediaType.Video);
            m_tt.SetToolTip(m_check_image_files, "Include video file formats when searching for media files");

            // Audio files
            m_check_audio_files.Checked = Bit.AllSet((int)m_settings.MediaType, (int)EMediaType.Audio);
            m_tt.SetToolTip(m_check_image_files, "Include audio file formats when searching for media files");

            // Image extns
            ExtnStringToList(m_settings.ImageExtensions, m_chklist_image_formats);
            m_tt.SetToolTip(m_chklist_image_formats, "Image file extensions to include when searching for media files");

            // Video extns
            ExtnStringToList(m_settings.VideoExtensions, m_chklist_video_formats);
            m_tt.SetToolTip(m_chklist_video_formats, m_settings.DescAttr("VideoExtensions"));

            // Audio extns
            ExtnStringToList(m_settings.AudioExtensions, m_chklist_audio_formats);
            m_tt.SetToolTip(m_chklist_audio_formats, m_settings.DescAttr("AudioExtensions"));

            // Primary display
            m_combo_primary_display.Items.Clear();
            m_combo_primary_display.Items.Add("Not Set");
            foreach (Screen s in Screen.AllScreens)
            {
                m_combo_primary_display.Items.Add(s.DeviceName.TrimStart(new[] { '\\', '.' }));
            }
            m_combo_primary_display.SelectedIndex = m_settings.PrimaryDisplay;
            m_tt.SetToolTip(m_combo_primary_display, m_settings.DescAttr("PrimaryDisplay"));

            // Always on top
            m_check_always_on_top.Checked = m_settings.AlwaysOnTop;
            m_tt.SetToolTip(m_check_always_on_top, m_settings.DescAttr("AlwaysOnTop"));

            // Startup version check
            m_check_startup_version_check.Checked = m_settings.StartupVersionCheck;
            m_tt.SetToolTip(m_check_startup_version_check, m_settings.DescAttr("StartupVersionCheck"));

            // Allow duplicates
            m_check_allow_duplicates.Checked = m_settings.AllowDuplicates;
            m_tt.SetToolTip(m_check_allow_duplicates, m_settings.DescAttr("AllowDuplicates"));

            // Cache media list
            m_check_cache_media_list.Checked = m_settings.CacheSSMediaList;
            m_tt.SetToolTip(m_check_cache_media_list, m_settings.DescAttr("CacheSSMediaList"));

            // Reset zoom on load
            m_check_reset_zoom_on_load.Checked = m_settings.ResetZoomOnLoad;
            m_tt.SetToolTip(m_check_reset_zoom_on_load, m_settings.DescAttr("ResetZoomOnLoad"));

            // Zoom type
            m_combo_zoom_type.Items.Clear();
            foreach (EZoomType e in Enum.GetValues(typeof(EZoomType)))
            {
                m_combo_zoom_type.Items.Add(e.StrAttr());
            }
            m_combo_zoom_type.SelectedIndex = (int)m_settings.ZoomType;
            m_tt.SetToolTip(m_combo_zoom_type, m_settings.DescAttr("ZoomType"));

            // Slide show rate
            m_edit_slide_show_rate.Text = m_settings.SlideShowRate.ToString();
            m_tt.SetToolTip(m_edit_slide_show_rate, m_settings.DescAttr("SlideShowRate"));

            // Folder sort order
            m_combo_folder_order.Items.Clear();
            foreach (ESortOrder e in Enum.GetValues(typeof(ESortOrder)))
            {
                m_combo_folder_order.Items.Add(e.StrAttr());
            }
            m_combo_folder_order.SelectedIndex = (int)m_settings.FolderOrder;
            m_tt.SetToolTip(m_combo_folder_order, m_settings.DescAttr("FolderOrder"));

            // SS Folder sort order
            m_combo_ss_folder_order.Items.Clear();
            foreach (ESortOrder e in Enum.GetValues(typeof(ESortOrder)))
            {
                m_combo_ss_folder_order.Items.Add(e.StrAttr());
            }
            m_combo_ss_folder_order.SelectedIndex = (int)m_settings.SSFolderOrder;
            m_tt.SetToolTip(m_combo_ss_folder_order, m_settings.DescAttr("SSFolderOrder"));

            // File sort order
            m_combo_file_order.Items.Clear();
            foreach (ESortOrder e in Enum.GetValues(typeof(ESortOrder)))
            {
                m_combo_file_order.Items.Add(e.StrAttr());
            }
            m_combo_file_order.SelectedIndex = (int)m_settings.FilesOrder;
            m_tt.SetToolTip(m_combo_file_order, m_settings.DescAttr("FilesOrder"));

            // SS File sort order
            m_combo_ss_file_order.Items.Clear();
            foreach (ESortOrder e in Enum.GetValues(typeof(ESortOrder)))
            {
                m_combo_ss_file_order.Items.Add(e.StrAttr());
            }
            m_combo_ss_file_order.SelectedIndex = (int)m_settings.SSFilesOrder;
            m_tt.SetToolTip(m_combo_ss_file_order, m_settings.DescAttr("SSFilesOrder"));

            // Show filenames
            m_check_show_filenames.Checked = m_settings.ShowFilenames;
            m_tt.SetToolTip(m_check_show_filenames, m_settings.DescAttr("ShowFilenames"));

            // SS Volume
            m_track_ss_volume.Value = m_settings.SSVolume;
            m_tt.SetToolTip(m_track_ss_volume, m_settings.DescAttr("SSVolume"));

            m_btn_apply.Enabled = false;
        }
Esempio n. 10
0
        protected override void UpdateGfxCore()
        {
            var snr_colour = Settings.Colour.ToArgbU();
            var width      = Settings.GraphicsWidth * Chart.XAxis.Span;
            var attr       = Settings.Attribute;
            var power      = Settings.Power;
            var count      = Levels.Count;

            if (count <= 1)
            {
                Gfx = null;
                return;
            }

            // Create graphics for the support and resistance data
            m_vbuf.Resize(count * 2);
            m_ibuf.Resize(count * 2);
            m_nbuf.Resize(1);

            var values =
                attr == EAttribute.MedianCount ? Levels.Select(x => x.Median).Normalise() :
                attr == EAttribute.TradeVolume ? Levels.Select(x => x.Volume).Normalise() :
                attr == EAttribute.TimeAtLevel ? Levels.Select(x => x.Time).Normalise() :
                null;

            int l = 0, v = 0, i = 0;

            foreach (var value in values)
            {
                var x = (float)(Math.Pow(value, power) * width);
                var y = (float)(Levels[l].Price);
                ++l;

                m_ibuf[i++] = (ushort)v;
                m_vbuf[v++] = new View3d.Vertex(new v4(-x, y, 0, 1));
                m_ibuf[i++] = (ushort)v;
                m_vbuf[v++] = new View3d.Vertex(new v4(0, y, 0, 1));
            }
            m_nbuf[0] = new View3d.Nugget(View3d.EPrim.TriStrip, View3d.EGeom.Vert, 0, (uint)v, 0, (uint)i, !Bit.AllSet(snr_colour, 0xFF000000));

            // Create the graphics
            Gfx = new View3d.Object(Name, snr_colour, m_vbuf.Count, m_ibuf.Count, m_nbuf.Count, m_vbuf.ToArray(), m_ibuf.ToArray(), m_nbuf.ToArray());

            base.UpdateGfxCore();
        }
Esempio n. 11
0
        /// <summary>Set up UI elements</summary>
        private void SetupUI()
        {
            #region Tool bar
            m_btn_active_trades.Checked         = Bit.AllSet(Settings.UI.ShowTrades, Trade.EState.ActivePosition);
            m_btn_active_trades.CheckedChanged += (s, a) =>
            {
                Settings.UI.ShowTrades = Bit.SetBits(Settings.UI.ShowTrades, Trade.EState.ActivePosition, m_btn_active_trades.Checked);
                UpdateGrid();
            };
            m_btn_pending_orders.Checked         = Bit.AllSet(Settings.UI.ShowTrades, Trade.EState.PendingOrder);
            m_btn_pending_orders.CheckedChanged += (s, a) =>
            {
                Settings.UI.ShowTrades = Bit.SetBits(Settings.UI.ShowTrades, Trade.EState.PendingOrder, m_btn_pending_orders.Checked);
                UpdateGrid();
            };
            m_btn_visualising_orders.Checked         = Bit.AllSet(Settings.UI.ShowTrades, Trade.EState.Visualising);
            m_btn_visualising_orders.CheckedChanged += (s, a) =>
            {
                Settings.UI.ShowTrades = Bit.SetBits(Settings.UI.ShowTrades, Trade.EState.Visualising, m_btn_visualising_orders.Checked);
                UpdateGrid();
            };
            m_btn_closed_orders.Checked         = Bit.AllSet(Settings.UI.ShowTrades, Trade.EState.Closed);
            m_btn_closed_orders.CheckedChanged += (s, a) =>
            {
                Settings.UI.ShowTrades = Bit.SetBits(Settings.UI.ShowTrades, Trade.EState.Closed, m_btn_closed_orders.Checked);
                UpdateGrid();
            };
            #endregion

            #region Grid
            m_grid.AutoGenerateColumns = false;
            m_grid.Columns.Add(new TreeGridColumn
            {
                HeaderText       = "Symbol/Order Id",
                DataPropertyName = nameof(Trade.SymbolCode),
            });
            m_grid.Columns.Add(new DataGridViewTextBoxColumn
            {
                HeaderText       = "State",
                DataPropertyName = nameof(IPosition.State),
            });
            m_grid.Columns.Add(new DataGridViewTextBoxColumn
            {
                HeaderText       = "Trade Type",
                DataPropertyName = nameof(IPosition.TradeType),
            });
            m_grid.Columns.Add(new DataGridViewTextBoxColumn
            {
                HeaderText       = "Volume",
                DataPropertyName = nameof(IPosition.Volume),
            });
            m_grid.Columns.Add(new DataGridViewTextBoxColumn
            {
                HeaderText       = "Stop Loss",
                DataPropertyName = nameof(IPosition.StopLossValue),
            });
            m_grid.Columns.Add(new DataGridViewTextBoxColumn
            {
                HeaderText       = "Take Profit",
                DataPropertyName = nameof(IPosition.TakeProfitValue),
            });
            m_grid.Columns.Add(new DataGridViewTextBoxColumn
            {
                HeaderText       = "Entry Time",
                DataPropertyName = nameof(IPosition.EntryTimeUTC),
            });
            m_grid.Columns.Add(new DataGridViewTextBoxColumn
            {
                HeaderText       = "Gross Profit",
                DataPropertyName = nameof(IPosition.GrossProfit),
            });
            m_grid.Columns.Add(new DataGridViewTextBoxColumn
            {
                HeaderText       = "Net Profit",
                DataPropertyName = nameof(IPosition.NetProfit),
            });
            m_grid.CellFormatting       += HandleCellFormatting;
            m_grid.MouseClick           += HandleMouseClick;
            m_grid.CellMouseDoubleClick += HandleCellDoubleClick;
            m_grid.SelectionChanged     += HandleOrderSelectionChanged;
            #endregion
        }
Esempio n. 12
0
        protected override void UpdateGfxCore()
        {
            var line_colour   = (Selected ? Settings.Colour.Lerp(Color.Gray, 0.5f) : Settings.Colour).ToArgbU();
            var region_colour = (Selected ? Settings.RegionColour.Lerp(Color.Gray, 0.5f) : Settings.RegionColour).ToArgbU();
            var region_height = Settings.RegionHeight;
            var width         = (float)Chart.XAxis.Span;

            // Create graphics for the horizontal line
            m_vbuf.Resize(2 + (region_height != 0 ? 4 : 0));
            m_ibuf.Resize(2 + (region_height != 0 ? 6 : 0));
            m_nbuf.Resize(1 + (region_height != 0 ? 1 : 0));

            m_vbuf[0] = new View3d.Vertex(new v4(0, 0, 0, 1), line_colour);
            m_vbuf[1] = new View3d.Vertex(new v4(width, 0, 0, 1), line_colour);
            m_ibuf[0] = 0;
            m_ibuf[1] = 1;
            m_nbuf[0] = new View3d.Nugget(View3d.EPrim.LineList, View3d.EGeom.Vert | View3d.EGeom.Colr, 0, 2, 0, 2);

            if (region_height != 0)
            {
                var half_height = (float)(Instrument.PriceData.PipSize * region_height / 2.0);
                m_vbuf[2] = new View3d.Vertex(new v4(0, -half_height, 0, 1), region_colour);
                m_vbuf[3] = new View3d.Vertex(new v4(width, -half_height, 0, 1), region_colour);
                m_vbuf[4] = new View3d.Vertex(new v4(0, +half_height, 0, 1), region_colour);
                m_vbuf[5] = new View3d.Vertex(new v4(width, +half_height, 0, 1), region_colour);
                m_ibuf[2] = 2;
                m_ibuf[3] = 3;
                m_ibuf[4] = 5;
                m_ibuf[5] = 5;
                m_ibuf[6] = 4;
                m_ibuf[7] = 2;
                m_nbuf[1] = new View3d.Nugget(View3d.EPrim.TriList, View3d.EGeom.Vert | View3d.EGeom.Colr, 2, 6, 2, 8, !Bit.AllSet(region_colour, 0xFF000000));
            }

            // Create the graphics
            Gfx = new View3d.Object(Name, 0xFFFFFFFF, m_vbuf.Count, m_ibuf.Count, m_nbuf.Count, m_vbuf.ToArray(), m_ibuf.ToArray(), m_nbuf.ToArray());

            base.UpdateGfxCore();
        }
Esempio n. 13
0
        /// <summary>Set up UI elements</summary>
        private void SetupUI()
        {
            m_cb_symbols.AutoCompleteMode   = AutoCompleteMode.Suggest;
            m_cb_symbols.AutoCompleteSource = AutoCompleteSource.ListItems;
            m_cb_symbols.DataSource         = Misc.KnownSymbols.Keys.ToArray();
            m_cb_symbols.Format            += (s, a) =>
            {
                var sym = (string)a.ListItem;
                a.Value = "{0} - {1}".Fmt(sym, Misc.KnownSymbols[sym].Desc);
            };

            // Add trading pair
            m_btn_add.Click += (s, a) =>
            {
                Model.AddTransmitter((string)m_cb_symbols.SelectedItem);
            };

            // Show current pairs
            m_lb_symbols.BackColor  = SystemColors.ControlDark;
            m_lb_symbols.DrawMode   = DrawMode.OwnerDrawFixed;
            m_lb_symbols.DataSource = Model.Transmitters;
            m_lb_symbols.ItemHeight = 58;
            m_lb_symbols.DrawItem  += (s, a) =>
            {
                if (Model == null || a.Index < 0 || a.Index >= Model.Transmitters.Count)
                {
                    a.Graphics.FillRectangle(SystemBrushes.ControlLightLight, a.Bounds);
                    return;
                }

                var item = Model.Transmitters[a.Index];
                var bnds = a.Bounds.Inflated(0, 0, -1, -1);
                var col  = Bit.AllSet(a.State, DrawItemState.Selected) ? Brushes.WhiteSmoke : !item.Enabled ? SystemBrushes.ControlLight : SystemBrushes.ControlLightLight;
                var x    = bnds.Left + 2f;
                var y    = bnds.Top + 2f;

                a.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
                a.Graphics.FillRectangle(SystemBrushes.ControlDark, a.Bounds);
                a.Graphics.FillRectangleRounded(col, bnds, 6f);
                a.Graphics.DrawRectangleRounded(Pens.Black, bnds, 6f);

                {                 // Paint the symbol name
                    var str  = "{0} - {1}".Fmt(item.SymbolCode, item.SymbolDescription.Desc);
                    var font = a.Font.Dup(FontStyle.Bold);
                    var sz   = a.Graphics.MeasureString(str, font);
                    a.Graphics.DrawString(str, font, !item.Enabled ? SystemBrushes.ControlDark : Brushes.Black, x, y);
                    y += sz.Height;
                }
                {                // Paint the time frames
                    var tfs = item.Data.Keys.Select(t => t.ToTradeeTimeframe()).OrderBy(t => t).ToArray();
                    var str = "Time Frames: {0}".Fmt(string.Join(" ", tfs.Select(t => t.Desc())));
                    var sz  = a.Graphics.MeasureString(str, a.Font);
                    a.Graphics.DrawString(str, a.Font, !item.Enabled ? SystemBrushes.ControlDark : item.RequestingSeriesData ? Brushes.DarkRed : Brushes.Green, x, y);
                    y += sz.Height;
                }
                {                // Paint the last update time
                    var tss = item.Data.Values.Select(v => v.LastTransmitUTC).ToArray();
                    var ts  = tss.Length != 0 ? tss.MaxBy(t => t) : DateTimeOffset.MinValue;
                    var str = "Last Update: {0}".Fmt(ts != DateTimeOffset.MinValue ? ts.ToString("yyyy/MM/dd HH:mm:ss") : "never");
                    var sz  = a.Graphics.MeasureString(str, a.Font);
                    a.Graphics.DrawString(str, a.Font, !item.Enabled ? SystemBrushes.ControlDark : Brushes.Blue, x, y);
                    y += sz.Height;
                }
                {                // Paint the status
                    var msg = item.StatusMsg;
                    var str = "Status: {0}".Fmt(msg);
                    var sz  = a.Graphics.MeasureString(str, a.Font);
                    a.Graphics.DrawString(str, a.Font, !item.Enabled ? SystemBrushes.ControlDark : SystemBrushes.ControlDarkDark, x, y);
                    y += sz.Height;
                }
            };
            m_lb_symbols.MouseDown += (s, a) =>
            {
                if (a.Button == MouseButtons.Right)
                {
                    ShowContextMenu(a.Location);
                }
            };
        }
Esempio n. 14
0
        protected override void UpdateGfxCore()
        {
            var line_colour   = (Selected ? Settings.Colour.Lerp(Color.Gray, 0.2f) : Settings.Colour).ToArgbU();
            var region_colour = (Selected ? Settings.RegionColour.Lerp(Color.Gray, 0.2f) : Settings.RegionColour).ToArgbU();
            var width         = (float)Chart.XAxis.Span;

            // Create graphics for the horizontal line
            m_vbuf.Resize(2 + (Level.WidthPips != 0 ? 4 : 0));
            m_ibuf.Resize(2 + (Level.WidthPips != 0 ? 6 : 0));
            m_nbuf.Resize(1 + (Level.WidthPips != 0 ? 1 : 0));

            m_vbuf[0] = new View3d.Vertex(new v4(0, 0, 0, 1), line_colour);
            m_vbuf[1] = new View3d.Vertex(new v4(width, 0, 0, 1), line_colour);
            m_ibuf[0] = 0;
            m_ibuf[1] = 1;

            var mat = new View3d.Material(shader: View3d.EShader.ThickLineListGS, shader_data: new int[4] {
                Settings.LineWidth, 0, 0, 0
            });

            m_nbuf[0] = new View3d.Nugget(View3d.EPrim.LineList, View3d.EGeom.Vert | View3d.EGeom.Colr, 0, 2, 0, 2, !Bit.AllSet(line_colour, 0xFF000000), mat);

            if (Level.WidthPips != 0)
            {
                var hh = (float)(Instrument.PriceData.PipSize * Level.WidthPips / 2.0);
                m_vbuf[2] = new View3d.Vertex(new v4(0, -hh, 0, 1), region_colour);
                m_vbuf[3] = new View3d.Vertex(new v4(width, -hh, 0, 1), region_colour);
                m_vbuf[4] = new View3d.Vertex(new v4(0, +hh, 0, 1), region_colour);
                m_vbuf[5] = new View3d.Vertex(new v4(width, +hh, 0, 1), region_colour);
                m_ibuf[2] = 2;
                m_ibuf[3] = 3;
                m_ibuf[4] = 5;
                m_ibuf[5] = 5;
                m_ibuf[6] = 4;
                m_ibuf[7] = 2;

                m_nbuf[1] = new View3d.Nugget(View3d.EPrim.TriList, View3d.EGeom.Vert | View3d.EGeom.Colr, 2, 6, 2, 8, !Bit.AllSet(region_colour, 0xFF000000));
            }

            // Create the graphics
            Gfx = new View3d.Object(Name, 0xFFFFFFFF, m_vbuf.Count, m_ibuf.Count, m_nbuf.Count, m_vbuf.ToArray(), m_ibuf.ToArray(), m_nbuf.ToArray());

            base.UpdateGfxCore();
        }