Changeset 18201


Ignore:
Timestamp:
01/17/22 13:25:15 (7 months ago)
Author:
pfleck
Message:

#3040 Improved handling of "None" Enum flags.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/3040_VectorBasedGP/HeuristicLab.Data.Views/3.3/EnumValueView.cs

    r17180 r18201  
    8585      } else {
    8686        valueComboBox.SelectedItem = Content.Value;
     87        var value = (Enum)(object)Content.Value;
     88
     89        var zeroValue = Enum.ToObject(value.GetType(), Convert.ChangeType(0, value.GetTypeCode()));
     90        var hasZeroValue = Enum.IsDefined(value.GetType(), zeroValue);
     91
    8792        foreach (ListViewItem item in flagsListView.Items) {
    8893          var flag = (Enum)item.Tag;
    89           item.Checked = ((Enum)(object)Content.Value).HasFlag(flag);
     94          if (hasZeroValue && flag.Equals(zeroValue)) { // only show the zero-value if the whole value is zero, otherwise the zero-value would always be checked
     95            item.Checked = value.Equals(zeroValue);
     96          } else {
     97            item.Checked = value.HasFlag(flag);
     98          }
    9099        }
    91100      }
     
    108117      else {
    109118        valueComboBox.SelectedItem = Content.Value;
     119        var value = (Enum)(object)Content.Value;
     120
     121        var zeroValue = value.GetZeroValue<T>();
     122        var hasZeroValue = Enum.IsDefined(value.GetType(), zeroValue);
     123
    110124        foreach (ListViewItem item in flagsListView.Items) {
    111125          var flag = (Enum)item.Tag;
    112           item.Checked = ((Enum)(object)Content.Value).HasFlag(flag);
     126          if (hasZeroValue && flag.Equals(zeroValue)) { // only show the zero-value if the whole value is zero, otherwise the zero-value would always be checked
     127            item.Checked = value.Equals(zeroValue);
     128          } else {
     129            item.Checked = value.HasFlag(flag);
     130          }
    113131        }
    114132      }
     
    116134
    117135    private void valueComboBox_SelectedIndexChanged(object sender, EventArgs e) {
    118       if ((Content != null) && !Content.ReadOnly)
     136      if (Content != null && !Content.ReadOnly)
    119137        Content.Value = (T)valueComboBox.SelectedItem;
    120138    }
     
    122140    private void flagsListView_ItemChecked(object sender, ItemCheckedEventArgs e) {
    123141      var flag = (T)e.Item.Tag;
    124       if ((Content != null) && !Content.ReadOnly)
    125         Content.Value = ((Enum)(object)Content.Value).SetFlag(flag, e.Item.Checked);
     142      if (Content != null && !Content.ReadOnly) {
     143        var value = (Enum)(object)Content.Value;
     144
     145        var zeroValue = value.GetZeroValue<T>();
     146        var hasZeroValue = Enum.IsDefined(value.GetType(), zeroValue);
     147
     148        if (hasZeroValue && flag.Equals(zeroValue)) {
     149          if (e.Item.Checked) { // Checking zero-value => set zero-value
     150            Content.Value = value.GetZeroValue<T>();
     151          } else if (value.Equals(zeroValue)) { // Un-checking zero-value => set all-value
     152            Content.Value = value.GetAllValue<T>();
     153          }
     154        } else {
     155          Content.Value = value.SetFlag(flag, e.Item.Checked);
     156        }
     157      }
    126158    }
    127159  }
     
    139171      return (T)valueAsBase;
    140172    }
     173
     174    public static T GetZeroValue<T>(this Enum value) {
     175      return (T)Enum.ToObject(value.GetType(), Convert.ChangeType(0, value.GetTypeCode()));
     176    }
     177
     178    public static T GetAllValue<T>(this Enum value) {
     179      var allValues = (Enum)(object)value.GetZeroValue<T>();
     180      foreach (T fl in Enum.GetValues(value.GetType()))
     181        allValues = (Enum)(object)allValues.SetFlag(fl, true);
     182      return (T)(object)allValues;
     183    }
    141184  }
    142185}
Note: See TracChangeset for help on using the changeset viewer.