void IView.UpdateItems(IList <ViewItem> items) { using (new ScopedGuard( () => { dropDownPanel.SuspendLayout(); updateLock = true; }, () => { dropDownPanel.ResumeLayout(); updateLock = false; } )) { UpdateToolStripControls(mainToolStripControls, items.FirstOrDefault()); var existingControls = dropDownPanel.Controls.OfType <ExtendedToolStrip>().ToList(); int idx = 0; foreach (var item in items) { var row = existingControls.LastOrDefault(); if (row != null) { existingControls.RemoveAt(existingControls.Count - 1); } else { row = new ExtendedToolStrip() { GripStyle = ToolStripGripStyle.Hidden, ImageScalingSize = mainToolStrip.ImageScalingSize, Font = mainToolStrip.Font, TabStop = true, }; row.Tag = AddToolStripControls(row); dropDownPanel.Controls.Add(row); dropDownPanel.Controls.SetChildIndex(row, 0); } var ctrls = (ToolStripControls)row.Tag; ctrls.dropdownBtnShowsList = (idx == 0) ? false : new bool?(); UpdateToolStripControls(ctrls, item); ++idx; } existingControls.ForEach(c => c.Dispose()); UpdateToolStripTextSizes(); } }
ToolStripControls AddToolStripControls(ExtendedToolStrip toolstrip) { var ctrls = new ToolStripControls() { toolStrip = toolstrip }; ctrls.dropdownBtn = new ToolStripButton() { DisplayStyle = ToolStripItemDisplayStyle.Image, }; ctrls.visibleCb = new CheckBox() { Padding = new Padding(0, 3, 0, 0), }; ctrls.visibleCbHost = new ToolStripControlHost(ctrls.visibleCb) { Padding = new Padding(3, 0, 3, 0) // todo: check if scaling by DPI is needed }; ctrls.pinnedBtn = new ToolStripButton() { DisplayStyle = ToolStripItemDisplayStyle.Image, }; ctrls.textLabel = new ProgressToolStripLabel() { Padding = new Padding(6, 0, 0, 0), TextAlign = ContentAlignment.MiddleLeft, AutoSize = false, }; toolstrip.Items.AddRange(new ToolStripItem[] { ctrls.dropdownBtn, ctrls.visibleCbHost, ctrls.pinnedBtn, ctrls.textLabel }); toolstrip.ContextMenu = new ContextMenu(new[] { ctrls.visibleMenuItem = new MenuItem("Visible", (s, e) => viewModel.OnMenuItemClicked(ctrls.currentItem, MenuItemId.Visible)), ctrls.pinnedMenuItem = new MenuItem("Pinned", (s, e) => viewModel.OnMenuItemClicked(ctrls.currentItem, MenuItemId.Pinned)), ctrls.visibleOnTimelineMenuItem = new MenuItem("Display on timeline", (s, e) => viewModel.OnMenuItemClicked(ctrls.currentItem, MenuItemId.VisibleOnTimeline)), ctrls.deleteSeparatorMenuItem = new MenuItem("-"), ctrls.deleteMenuItem = new MenuItem("Delete", (s, e) => viewModel.OnMenuItemClicked(ctrls.currentItem, MenuItemId.Delete)), }); return(ctrls); }
void IView.SetViewModel(IViewModel viewModel) { this.viewModel = viewModel; var itemsUpdater = Updaters.Create( () => viewModel.Items, items => { using (new ScopedGuard( () => { dropDownPanel.SuspendLayout(); updateLock = true; }, () => { dropDownPanel.ResumeLayout(); updateLock = false; } )) { UpdateToolStripControls(mainToolStripControls, items.FirstOrDefault()); var existingControls = dropDownPanel.Controls.OfType <ExtendedToolStrip>().ToList(); int idx = 0; foreach (var item in items) { var row = existingControls.LastOrDefault(); if (row != null) { existingControls.RemoveAt(existingControls.Count - 1); } else { row = new ExtendedToolStrip() { GripStyle = ToolStripGripStyle.Hidden, ImageScalingSize = mainToolStrip.ImageScalingSize, Font = mainToolStrip.Font, TabStop = true, }; row.Tag = AddToolStripControls(row); dropDownPanel.Controls.Add(row); dropDownPanel.Controls.SetChildIndex(row, 0); } var ctrls = (ToolStripControls)row.Tag; ctrls.dropdownBtnShowsList = (idx == 0) ? false : new bool?(); UpdateToolStripControls(ctrls, item); ++idx; } existingControls.ForEach(c => c.Dispose()); UpdateToolStripTextSizes(); } } ); var updateVisiblity = Updaters.Create(() => viewModel.IsSearchResultsVisible, value => { if (SearchResultsSplitContainer != null) { SearchResultsSplitContainer.Panel2Collapsed = !value; } }); viewModel.ChangeNotification.CreateSubscription(() => { itemsUpdater(); updateVisiblity(); }); }