diff options
author | Vsevolod Kukol <sevoku@microsoft.com> | 2019-11-11 13:22:57 +0300 |
---|---|---|
committer | monojenkins <jo.shields+jenkins@xamarin.com> | 2019-11-12 16:17:09 +0300 |
commit | 152982701d66d7174189dcaecb6b773a6e11df4d (patch) | |
tree | 6e7a9acdee2b404dc19791a4ba95c9b183ea39b7 /main/src/addins | |
parent | 2f48e7458e922743c350289e31de594c3cf57c9a (diff) |
[NuGet] Reduce custom rendering in package selection list
* Use regular check box cell view to select packages
* Remove custom background rendering
Diffstat (limited to 'main/src/addins')
4 files changed, 39 insertions, 301 deletions
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/ManagePackagesCellView.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/ManagePackagesCellView.cs index 09611a1daa..42321ab5ce 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/ManagePackagesCellView.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/ManagePackagesCellView.cs @@ -40,12 +40,6 @@ namespace MonoDevelop.PackageManagement { CellWidth = 260; - BackgroundColor = Styles.CellBackgroundColor; - StrongSelectionColor = Styles.CellStrongSelectionColor; - SelectionColor = Styles.CellSelectionColor; - - UseStrongSelectionColor = true; - if (Platform.IsWindows) { packageIdFontSize = 10; packageDescriptionFontSize = 9; @@ -57,19 +51,9 @@ namespace MonoDevelop.PackageManagement public IDataField<ManagePackagesSearchResultViewModel> PackageField { get; set; } public IDataField<Image> ImageField { get; set; } - public IDataField<bool> HasBackgroundColorField { get; set; } - public IDataField<double> CheckBoxAlphaField { get; set; } public double CellWidth { get; set; } - public Color BackgroundColor { get; set; } - public Color StrongSelectionColor { get; set; } - public Color SelectionColor { get; set; } - - public bool UseStrongSelectionColor { get; set; } - - public event EventHandler<ManagePackagesCellViewEventArgs> PackageChecked; - protected override void OnDraw (Context ctx, Rectangle cellArea) { ManagePackagesSearchResultViewModel packageViewModel = GetValue (PackageField); @@ -77,10 +61,8 @@ namespace MonoDevelop.PackageManagement return; } - FillCellBackground (ctx); UpdateTextColor (ctx); - DrawCheckBox (ctx, packageViewModel, cellArea); DrawPackageImage (ctx, cellArea); double packageIdWidth = cellArea.Width - packageDescriptionPadding.HorizontalSpacing - packageDescriptionLeftOffset; @@ -134,108 +116,6 @@ namespace MonoDevelop.PackageManagement } } - void FillCellBackground (Context ctx) - { - if (Selected) { - FillCellBackground (ctx, GetSelectedColor ()); - } else if (IsBackgroundColorFieldSet ()) { - FillCellBackground (ctx, BackgroundColor); - } - } - - Color GetSelectedColor () - { - if (UseStrongSelectionColor) { - return StrongSelectionColor; - } - return SelectionColor; - } - - bool IsBackgroundColorFieldSet () - { - return GetValue (HasBackgroundColorField, false); - } - - void FillCellBackground (Context ctx, Color color) - { - ctx.Rectangle (BackgroundBounds); - ctx.SetColor (color); - ctx.Fill (); - } - - void DrawCheckBox (Context ctx, ManagePackagesSearchResultViewModel packageViewModel, Rectangle cellArea) - { - CreateCheckboxImages (); - - Image image = GetCheckBoxImage (packageViewModel.IsChecked); - double alpha = GetCheckBoxImageAlpha (); - ctx.DrawImage ( - image, - cellArea.Left + checkBoxPadding.Left, - cellArea.Top + ((cellArea.Height - checkBoxImageSize.Height - 2) / 2), - alpha); - } - - void CreateCheckboxImages () - { - if (whiteCheckedCheckBoxImage != null) - return; - - var widget = Toolkit.CurrentEngine.GetNativeWidget (ParentWidget); - var checkbox = new ManagePackagesCellViewCheckBox (ParentWidget.ParentWindow.Screen.ScaleFactor); - checkbox.Container = (Gtk.Widget)widget; - checkbox.Size = (int)checkBoxImageSize.Width + 1; - - // White checkbox. - whiteUncheckedCheckBoxImage = checkbox.CreateImage (); - checkbox.Active = true; - whiteCheckedCheckBoxImage = checkbox.CreateImage (); - - // Odd numbered checkbox. - checkbox.BackgroundColor = BackgroundColor; - checkedCheckBoxWithBackgroundColorImage = checkbox.CreateImage (); - checkbox.Active = false; - uncheckedCheckBoxWithBackgroundColorImage = checkbox.CreateImage (); - - // Grey check box. - checkbox.BackgroundColor = SelectionColor; - greyUncheckedCheckBoxImage = checkbox.CreateImage (); - checkbox.Active = true; - greyCheckedCheckBoxImage = checkbox.CreateImage (); - - // Blue check box. - checkbox.BackgroundColor = StrongSelectionColor; - blueCheckedCheckBoxImage = checkbox.CreateImage (); - checkbox.Active = false; - blueUncheckedCheckBoxImage = checkbox.CreateImage (); - } - - double GetCheckBoxImageAlpha () - { - return GetValue (CheckBoxAlphaField, 1); - } - - Image GetCheckBoxImage (bool checkBoxActive) - { - if (Selected && UseStrongSelectionColor && checkBoxActive) { - return blueCheckedCheckBoxImage; - } else if (Selected && checkBoxActive) { - return greyCheckedCheckBoxImage; - } else if (Selected && UseStrongSelectionColor) { - return blueUncheckedCheckBoxImage; - } else if (Selected) { - return greyUncheckedCheckBoxImage; - } else if (checkBoxActive && IsBackgroundColorFieldSet ()) { - return checkedCheckBoxWithBackgroundColorImage; - } else if (checkBoxActive) { - return whiteCheckedCheckBoxImage; - } else if (IsBackgroundColorFieldSet ()) { - return uncheckedCheckBoxWithBackgroundColorImage; - } else { - return whiteUncheckedCheckBoxImage; - } - } - void DrawPackageImage (Context ctx, Rectangle cellArea) { Image image = GetValue (ImageField); @@ -251,7 +131,7 @@ namespace MonoDevelop.PackageManagement Point imageLocation = GetPackageImageLocation (maxPackageImageSize, cellArea); ctx.DrawImage ( image, - cellArea.Left + packageImagePadding.Left + checkBoxAreaWidth + imageLocation.X, + cellArea.Left + packageImagePadding.Left + imageLocation.X, Math.Round( cellArea.Top + packageImagePadding.Top + imageLocation.Y), maxPackageImageSize.Width, maxPackageImageSize.Height); @@ -259,7 +139,7 @@ namespace MonoDevelop.PackageManagement Point imageLocation = GetPackageImageLocation (image.Size, cellArea); ctx.DrawImage ( image, - cellArea.Left + packageImagePadding.Left + checkBoxAreaWidth + imageLocation.X, + cellArea.Left + packageImagePadding.Left + imageLocation.X, Math.Round (cellArea.Top + packageImagePadding.Top + imageLocation.Y)); } } @@ -285,54 +165,17 @@ namespace MonoDevelop.PackageManagement return new Size (CellWidth, size.Height * linesDisplayedCount + packageDescriptionPaddingHeight + packageDescriptionPadding.VerticalSpacing); } - protected override void OnButtonPressed (ButtonEventArgs args) - { - ManagePackagesSearchResultViewModel packageViewModel = GetValue (PackageField); - if (packageViewModel == null) { - base.OnButtonPressed (args); - return; - } - - double x = args.X - Bounds.X; - double y = args.Y - Bounds.Y; - - if (checkBoxImageClickableRectangle.Contains (x, y)) { - packageViewModel.IsChecked = !packageViewModel.IsChecked; - OnPackageChecked (packageViewModel); - } - } - - void OnPackageChecked (ManagePackagesSearchResultViewModel packageViewModel) - { - if (PackageChecked != null) { - PackageChecked (this, new ManagePackagesCellViewEventArgs (packageViewModel)); - } - } - const int packageDescriptionPaddingHeight = 5; const int packageIdRightHandPaddingWidth = 5; const int linesDisplayedCount = 4; - const int checkBoxAreaWidth = 36; const int packageImageAreaWidth = 54; - const int packageDescriptionLeftOffset = checkBoxAreaWidth + packageImageAreaWidth + 8; + const int packageDescriptionLeftOffset = packageImageAreaWidth + 8; - WidgetSpacing packageDescriptionPadding = new WidgetSpacing (5, 5, 5, 10); - WidgetSpacing packageImagePadding = new WidgetSpacing (0, 0, 0, 5); - WidgetSpacing checkBoxPadding = new WidgetSpacing (10, 0, 0, 10); + WidgetSpacing packageDescriptionPadding = new WidgetSpacing (5, 5, 5, 5); + WidgetSpacing packageImagePadding = new WidgetSpacing (0, 0, 0, 0); Size maxPackageImageSize = new Size (48, 48); - Size checkBoxImageSize = new Size (16, 16); - Rectangle checkBoxImageClickableRectangle = new Rectangle (0, 10, 40, 50); - - Image whiteCheckedCheckBoxImage; - Image whiteUncheckedCheckBoxImage; - Image greyCheckedCheckBoxImage; - Image greyUncheckedCheckBoxImage; - Image blueCheckedCheckBoxImage; - Image blueUncheckedCheckBoxImage; - Image checkedCheckBoxWithBackgroundColorImage; - Image uncheckedCheckBoxWithBackgroundColorImage; static readonly Image defaultPackageImage = Image.FromResource (typeof(ManagePackagesCellView), "package-48.png"); } diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/ManagePackagesCellViewCheckBox.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/ManagePackagesCellViewCheckBox.cs deleted file mode 100644 index c137669b79..0000000000 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/ManagePackagesCellViewCheckBox.cs +++ /dev/null @@ -1,91 +0,0 @@ -// -// ManagePackagesCellViewCheckBox.cs -// -// Author: -// Matt Ward <matt.ward@xamarin.com> -// -// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -using System;
-using MonoDevelop.Components;
-using Gtk;
-
-namespace MonoDevelop.PackageManagement
-{
- internal class ManagePackagesCellViewCheckBox
- {
- static int indicatorSize;
- static int indicatorSpacing;
- double scaleFactor;
-
- static ManagePackagesCellViewCheckBox ()
- {
- var cb = new Gtk.CheckButton ();
- indicatorSize = (int) cb.StyleGetProperty ("indicator-size");
- indicatorSpacing = (int) cb.StyleGetProperty ("indicator-spacing");
- }
-
- public ManagePackagesCellViewCheckBox (double scaleFactor)
- {
- this.scaleFactor = scaleFactor;
- Size = indicatorSize;
- BackgroundColor = Xwt.Drawing.Colors.White;
- }
-
- public int Size { get; set; }
- public bool Active { get; set; }
- public Widget Container { get; set; }
- public Xwt.Drawing.Color BackgroundColor { get; set; }
-
- public Xwt.Drawing.Image CreateImage ()
- {
- var bounds = new Gdk.Rectangle (0, 0, (int)(Size * scaleFactor), (int)(Size * scaleFactor));
- return CreatePixBuf (bounds).ToXwtImage ().WithSize (Size, Size);
- }
-
- Gdk.Pixbuf CreatePixBuf (Gdk.Rectangle bounds)
- {
- using (var pmap = new Gdk.Pixmap (Container.GdkWindow, bounds.Width, bounds.Height)) {
- using (Cairo.Context ctx = Gdk.CairoHelper.Create (pmap)) {
- ctx.Rectangle (0, 0, bounds.Width, bounds.Height);
- ctx.SetSourceRGBA (BackgroundColor.Red, BackgroundColor.Green, BackgroundColor.Blue, BackgroundColor.Alpha);
- ctx.Paint ();
-
- Render (pmap, bounds, Gtk.StateType.Normal);
- return Gdk.Pixbuf.FromDrawable (pmap, pmap.Colormap, 0, 0, 0, 0, bounds.Width, bounds.Height);
- }
- }
- }
-
- void Render (Gdk.Drawable window, Gdk.Rectangle bounds, Gtk.StateType state)
- {
- Gtk.ShadowType sh = (bool) Active ? Gtk.ShadowType.In : Gtk.ShadowType.Out;
- int s = (int)(scaleFactor * Size) - 1;
- if (s > bounds.Height)
- s = bounds.Height;
- if (s > bounds.Width)
- s = bounds.Width;
-
- Gtk.Style.PaintCheck (Container.Style, window, state, sh, bounds, Container, "checkbutton", bounds.X + indicatorSpacing - 1, bounds.Y + (bounds.Height - s)/2, s, s);
- }
- }
-}
-
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/ManagePackagesDialog.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/ManagePackagesDialog.cs index 7a64ec70bd..361becc59e 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/ManagePackagesDialog.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Gui/ManagePackagesDialog.cs @@ -42,13 +42,12 @@ namespace MonoDevelop.PackageManagement IBackgroundPackageActionRunner backgroundActionRunner; ManagePackagesViewModel viewModel; List<SourceRepositoryViewModel> packageSources; - DataField<bool> packageHasBackgroundColorField = new DataField<bool> (); DataField<ManagePackagesSearchResultViewModel> packageViewModelField = new DataField<ManagePackagesSearchResultViewModel> (); DataField<Image> packageImageField = new DataField<Image> (); - DataField<double> packageCheckBoxAlphaField = new DataField<double> (); - const double packageCheckBoxSemiTransarentAlpha = 0.6; + DataField<bool> packageCheckBoxField = new DataField<bool> (); ListStore packageStore; ManagePackagesCellView packageCellView; + CheckBoxCellView packageCheckView; TimeSpan searchDelayTimeSpan = TimeSpan.FromMilliseconds (500); IDisposable searchTimer; SourceRepositoryViewModel dummyPackageSourceRepresentingConfigureSettingsItem = @@ -154,29 +153,45 @@ namespace MonoDevelop.PackageManagement void InitializeListView () { - packageStore = new ListStore (packageHasBackgroundColorField, packageCheckBoxAlphaField, packageImageField, packageViewModelField); + packageStore = new ListStore (packageImageField, packageViewModelField, packageCheckBoxField); packagesListView.DataSource = packageStore; - AddPackageCellViewToListView (); - + AddCellViewsToListView (); + packagesListView.SelectionChanged += PackagesListViewSelectionChanged; packagesListView.RowActivated += PackagesListRowActivated; packagesListView.VerticalScrollControl.ValueChanged += PackagesListViewScrollValueChanged; + + if (Toolkit.CurrentEngine.Type == ToolkitType.Gtk) { + // TODO: unlike Xwt.TreeView, Xwt.ListView has no UseAlternatingRowColors property + var gtkTreeView = packagesListView.Surface.NativeWidget as Gtk.Widget; + if (gtkTreeView is Gtk.ScrolledWindow scroll) + gtkTreeView = scroll.Child; + if (gtkTreeView is Gtk.TreeView tree) + tree.RulesHint = true; + } } - void AddPackageCellViewToListView () + void AddCellViewsToListView () { + var checkColumn = new ListViewColumn (GettextCatalog.GetString ("Add Package")); + + packageCheckView = new CheckBoxCellView (packageCheckBoxField) { Editable = true }; + packageCheckView.Toggled += PackageCheckCellViewPackageChecked; + + // HACK: Xwt has no custom cell padding, so we need to add an empty label for spacing + checkColumn.Views.Add (new TextCellView (" ")); + checkColumn.Views.Add (packageCheckView); + packagesListView.Columns.Add (checkColumn); + packageCellView = new ManagePackagesCellView { PackageField = packageViewModelField, - HasBackgroundColorField = packageHasBackgroundColorField, - CheckBoxAlphaField = packageCheckBoxAlphaField, ImageField = packageImageField, - CellWidth = 467 + CellWidth = 446 }; + var textColumn = new ListViewColumn ("Package", packageCellView); packagesListView.Columns.Add (textColumn); - - packageCellView.PackageChecked += PackageCellViewPackageChecked; } void InitializeProjectsListView () @@ -528,7 +543,6 @@ namespace MonoDevelop.PackageManagement { packageStore.Clear (); ResetPackagesListViewScroll (); - UpdatePackageListViewSelectionColor (); ShowLoadingMessage (); ShrinkImageCache (); DisposePopulatePackageVersionsTimer (); @@ -578,8 +592,6 @@ namespace MonoDevelop.PackageManagement void AppendPackageToListView (ManagePackagesSearchResultViewModel packageViewModel) { int row = packageStore.AddRow (); - packageStore.SetValue (row, packageHasBackgroundColorField, IsOddRow (row)); - packageStore.SetValue (row, packageCheckBoxAlphaField, GetPackageCheckBoxAlpha ()); packageStore.SetValue (row, packageViewModelField, packageViewModel); } @@ -595,14 +607,6 @@ namespace MonoDevelop.PackageManagement return (row % 2) == 0; } - double GetPackageCheckBoxAlpha () - { - if (PackagesCheckedCount == 0) { - return packageCheckBoxSemiTransarentAlpha; - } - return 1; - } - void ImageLoaded (object sender, ImageLoadedEventArgs e) { if (!e.HasError) { @@ -841,11 +845,17 @@ namespace MonoDevelop.PackageManagement return false; } + void PackageCheckCellViewPackageChecked (object sender, WidgetEventArgs e) + { + PackagesListRowActivated (sender, new ListViewRowEventArgs (packagesListView.CurrentEventRow)); + } + void PackagesListRowActivated (object sender, ListViewRowEventArgs e) { ManagePackagesSearchResultViewModel packageViewModel = packageStore.GetValue (e.RowIndex, packageViewModelField); packageViewModel.IsChecked = !packageViewModel.IsChecked; - PackageCellViewPackageChecked (null, null); + packageStore.SetValue (e.RowIndex, packageCheckBoxField, packageViewModel.IsChecked); + UpdateAddPackagesButton (); } void PackagesListViewScrollValueChanged (object sender, EventArgs e) @@ -870,13 +880,6 @@ namespace MonoDevelop.PackageManagement return (currentValue / (maxValue - pageSize)) > 0.7; } - void PackageCellViewPackageChecked (object sender, ManagePackagesCellViewEventArgs e) - { - UpdateAddPackagesButton (); - UpdatePackageListViewSelectionColor (); - UpdatePackageListViewCheckBoxAlpha (); - } - void UpdateAddPackagesButton () { addPackagesButton.Label = GetAddPackagesButtonLabel (); @@ -911,22 +914,6 @@ namespace MonoDevelop.PackageManagement return 1; } - void UpdatePackageListViewSelectionColor () - { - packageCellView.UseStrongSelectionColor = (PackagesCheckedCount == 0); - } - - void UpdatePackageListViewCheckBoxAlpha () - { - if (PackagesCheckedCount > 1) - return; - - double alpha = GetPackageCheckBoxAlpha (); - for (int row = 0; row < packageStore.RowCount; ++row) { - packageStore.SetValue (row, packageCheckBoxAlphaField, alpha); - } - } - bool OlderPackageInstalledThanPackageSelected () { if (PackagesCheckedCount != 0) { diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.csproj b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.csproj index f72ad6522d..4ea333473e 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.csproj +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.csproj @@ -146,7 +146,6 @@ <Compile Include="MonoDevelop.PackageManagement\ImageCache.cs" /> <Compile Include="MonoDevelop.PackageManagement\ProgressMonitorExtensions.cs" /> <Compile Include="MonoDevelop.PackageManagement\PackageListViewTextFormatter.cs" /> - <Compile Include="MonoDevelop.PackageManagement.Gui\ManagePackagesCellViewCheckBox.cs" /> <Compile Include="MonoDevelop.PackageManagement\PackageManagementProgressMonitor.cs" /> <Compile Include="MonoDevelop.PackageManagement\ISolution.cs" /> <Compile Include="MonoDevelop.PackageManagement\IProject.cs" /> |