Compare commits

...
32 changed files with 135 additions and 110 deletions

No files matched your search

@@ -162,7 +162,7 @@ namespace mbts.spark {
strip_name_filter.load_state(filters.strip_name);
mic_code_filter.load_state(filters.mic_code);
}
rows_view.set_sort_descriptions(s.sorting_criterion, columns);
rows_view.set_sort_descriptions(s.sorting_criteria, columns);
}
}), DataGridFilterHelper.hook_filters(rows_view, _filters),
settings_manager.subscribe_current().OnDispatcher().Subscribe(grid_settings_manager),
@@ -91,9 +91,9 @@ namespace bts.shell {
}
public static GridSettings DefaultGridSettings => GridSettings.Default.with(DefaultColumns.all, DefaultColumns.default_sorting_criterion, enable_background_color: true);
public static GridSettings DefaultGridSettings => GridSettings.Default.with(DefaultColumns.all, DefaultColumns.default_sorting_criteria, enable_background_color: true);
public IReadOnlyList<SortingCriteria> sorting_criterion => _sorting_criteria ?? (_sorting_criteria = DefaultColumns.default_sorting_criterion.ToList());
public IReadOnlyList<SortingCriteria> sorting_criteria => _sorting_criteria ?? (_sorting_criteria = DefaultColumns.default_sorting_criteria.ToList());
public static StartupData Default(SecurityCriteria security_criteria) =>
new StartupData(security_criteria, new FilterStates(), null);
@@ -131,7 +131,7 @@ namespace bts.shell {
public static IEnumerable<SortingCriteria> default_sorting_criterion {
public static IEnumerable<SortingCriteria> default_sorting_criteria {
get {
yield return new SortingCriteria(security.id, true);
}
@@ -13,7 +13,7 @@ namespace bts.shell.time_and_sales {
[ProtoMember(1)]
public readonly SecurityCriteria security_criteria;
[ProtoMember(2)]
List<SortingCriteria> _sorting_criterion;
List<SortingCriteria> _sorting_criteria;
[ProtoMember(3)]
public FilterStates filters;
[ProtoMember(4)]
@@ -28,19 +28,19 @@ namespace bts.shell.time_and_sales {
public TimeAndSalesSettings(SecurityCriteria security_criteria) :
this(security_criteria, new FilterStates(), null, null) { }
public TimeAndSalesSettings(SecurityCriteria security_criteria, FilterStates filters, GridSettings grid = default, List<SortingCriteria> sorting_criterion = null) {
public TimeAndSalesSettings(SecurityCriteria security_criteria, FilterStates filters, GridSettings grid = default, List<SortingCriteria> sorting_criteria = null) {
this.security_criteria = security_criteria;
this.filters = filters;
this.grid = grid;
_sorting_criterion = sorting_criterion;
_sorting_criteria = sorting_criteria;
}
public static GridSettings DefaultGridSettings => GridSettings.Default.with(DefaultColumns.all, DefaultColumns.default_sorting_criterion);
public static GridSettings DefaultGridSettings => GridSettings.Default.with(DefaultColumns.all, DefaultColumns.default_sorting_criteria);
public List<SortingCriteria> sorting_criterion => _sorting_criterion ?? (_sorting_criterion = DefaultColumns.default_sorting_criterion.ToList());
public List<SortingCriteria> sorting_criteria => _sorting_criteria ?? (_sorting_criteria = DefaultColumns.default_sorting_criteria.ToList());
public static TimeAndSalesSettings Default(SecurityCriteria security_criteria) =>
new TimeAndSalesSettings(security_criteria, new FilterStates(), null, DefaultColumns.default_sorting_criterion.ToList());
new TimeAndSalesSettings(security_criteria, new FilterStates(), null, DefaultColumns.default_sorting_criteria.ToList());
public TimeAndSalesSettings with(SecurityCriteria security_criteria) =>
new TimeAndSalesSettings(security_criteria, filters, grid);
@@ -53,7 +53,7 @@ namespace bts.shell.time_and_sales {
public static GridColumnSettings aggressor => new GridColumnSettings(Columns.Aggressor.col_id(), DefaultColumnHeaders.Aggressor, width: DefaultColumnWidths.Aggressor);
public static GridColumnSettings security_key => new GridColumnSettings(Columns.SecurityKey.col_id(), DefaultColumnHeaders.SecurityKey, is_visible: false, width: DefaultColumnWidths.SecurityKey);
public static IEnumerable<SortingCriteria> default_sorting_criterion {
public static IEnumerable<SortingCriteria> default_sorting_criteria {
get {
yield return new SortingCriteria(time.id, false);
}
@@ -159,7 +159,7 @@ namespace bts.shell.time_and_sales {
})),
_menu_display_vm.spark_cmd
};
_vm.load(_state.filters, _state.sorting_criterion, _state.grid);
_vm.load(_state.filters, _state.sorting_criteria, _state.grid);
_vm.request_show_ladder += show_ladder;
var security_criteria_src = _bus.subscribe(update_securities_cmd.tag);
var subs = new List<IDisposable> {
@@ -70,7 +70,7 @@ namespace bts.shell {
grid ?? this.grid,
menu_display ?? this.menu_display);
public static GridSettings DefaultGridSettings => GridSettings.Default.with(DefaultColumns.all, DefaultColumns.default_sorting_criterion);
public static GridSettings DefaultGridSettings => GridSettings.Default.with(DefaultColumns.all, DefaultColumns.default_sorting_criteria);
static class DefaultColumns {
public static GridColumnSettings name => new GridColumnSettings(col_id(Columns.Name), DefaultColumnHeaders.Name, width: DefaultColumnWidths.Security);
@@ -80,7 +80,7 @@ namespace bts.shell {
public static GridColumnSettings security_key => new GridColumnSettings(col_id(Columns.SecurityKey), DefaultColumnHeaders.SecurityKey, is_visible: false, width: DefaultColumnWidths.SecurityKey);
public static GridColumnSettings user => new GridColumnSettings(col_id(Columns.User), DefaultColumnHeaders.User, is_visible: false, width: DefaultColumnWidths.User);
public static IEnumerable<SortingCriteria> default_sorting_criterion {
public static IEnumerable<SortingCriteria> default_sorting_criteria {
get {
yield return new SortingCriteria(name.id, true);
}
@@ -154,7 +154,7 @@ namespace mbts.spark {
TimeTextTuple.FromDateTime(DateTime.Today),
TimeTextTuple.FromDateTime(DateTime.Today.AddDays(1)))
},
settings.sorting_criterion);
settings.sorting_criteria);
// resources/subscriptions
_dispose = new CompositeDisposable(
ObservableAutoWrapper.connect(col_tups, columns, ct => ct.col),
@@ -209,8 +209,8 @@ namespace mbts.spark {
public FillsFilterStates get_filters() =>
_rows_manager.get_filters();
public IEnumerable<SortingCriteria> get_sorting_criterion() =>
_rows_manager.get_sorting_criterion();
public IEnumerable<SortingCriteria> get_sorting_criteria() =>
_rows_manager.get_sorting_criteria();
public void on_sorting(object sender, DIYGridSortingEventArgs e) =>
_rows_manager.on_sorting(e);
@@ -40,7 +40,7 @@ namespace mbts.spark {
public override UIElement Content => _view;
public override IEnumerable<SparkCommand> Commands => _commands;
public override FillsSettings SaveState => _state = new FillsSettings(_state.orders, _vm.get_sorting_criterion().ToList(), _vm.get_filters(), _vm.get_grid_save_state()) {
public override FillsSettings SaveState => _state = new FillsSettings(_state.orders, _vm.get_sorting_criteria().ToList(), _vm.get_filters(), _vm.get_grid_save_state()) {
menu_display = _menu_display_vm.safe_create()
};
@@ -17,7 +17,7 @@ namespace bts.shell {
readonly IBus _bus;
readonly OrdersModel _orders_model;
readonly UserSettingsHub _settings_hub;
/// Fills 'sorting-criterion' settings were compromised a while back (mid-late 2018).
/// Fills 'sorting-criteria' settings were compromised a while back (mid-late 2018).
/// The issue was that, when a column was sorted, its 'sort member path' was assigned to the SortingCriteria.col_name,
/// rather than the <see cref="Columns"/> enum/id string.
/// This dictionary serves as a reverse-lookup so the sort member path can be converted to the enum/id string.
@@ -58,7 +58,7 @@ namespace bts.shell {
_bus.post(SparkTags.ShowWindow, await load(state));
IShellWindow _create(FillsSettings state) {
GridSettingsHelper.normalize_sorting_criterion(state.sorting_criterion, _sort_member_to_id);
GridSettingsHelper.normalize_sorting_criteria(state.sorting_criteria, _sort_member_to_id);
var settings_manager = new WindowSettingsManager<GridSettings>(_settings_hub,
state.grid,
get: us => us.fills_grid,
@@ -34,9 +34,9 @@ namespace bts.shell.fills {
this.grid = grid;
}
public static GridSettings DefaultGridSettings => GridSettings.Default.with(DefaultColumns.all, DefaultColumns.default_sorting_criterion);
public static GridSettings MiniGridSettings => GridSettings.Default.with(DefaultColumns.Mini.all, DefaultColumns.Mini.sorting_criterion);
public IReadOnlyList<SortingCriteria> sorting_criterion => _sorting_criteria ?? (_sorting_criteria = DefaultColumns.default_sorting_criterion.ToList());
public static GridSettings DefaultGridSettings => GridSettings.Default.with(DefaultColumns.all, DefaultColumns.default_sorting_criteria);
public static GridSettings MiniGridSettings => GridSettings.Default.with(DefaultColumns.Mini.all, DefaultColumns.Mini.sorting_criteria);
public IReadOnlyList<SortingCriteria> sorting_criteria => _sorting_criteria ?? (_sorting_criteria = DefaultColumns.default_sorting_criteria.ToList());
public static FillsSettings Default() =>
new FillsSettings(null, null, new FillsFilterStates(), null);
@@ -57,7 +57,7 @@ namespace bts.shell.fills {
public static GridColumnSettings fill_key => new GridColumnSettings(col_id(Columns.FillKey), DefaultColumnHeaders.FillKey, width: DefaultColumnWidths.FillKey);
public static GridColumnSettings order_key => new GridColumnSettings(col_id(Columns.OrderKey), DefaultColumnHeaders.OrderKey, width: DefaultColumnWidths.OrderKey);
public static GridColumnSettings security_key => new GridColumnSettings(col_id(Columns.SecurityKey), DefaultColumnHeaders.SecurityKey, is_visible: false, width: DefaultColumnWidths.SecurityKey);
public static IEnumerable<SortingCriteria> default_sorting_criterion {
public static IEnumerable<SortingCriteria> default_sorting_criteria {
get {
yield return new SortingCriteria(fill_time.id, false);
}
@@ -96,7 +96,7 @@ namespace bts.shell.fills {
};
public static IEnumerable<GridColumnSettings> all => DefaultColumns.all.Select(_convert);
public static IEnumerable<SortingCriteria> sorting_criterion => default_sorting_criterion.Where(c => _try_get_data(c.col_name, out (bool is_visible, double? _) d) && d.is_visible);
public static IEnumerable<SortingCriteria> sorting_criteria => default_sorting_criteria.Where(c => _try_get_data(c.col_name, out (bool is_visible, double? _) d) && d.is_visible);
static bool _try_get_data(string id_str, out (bool is_visible, double? width_override) data) {
if (Enum.TryParse(id_str, out Columns k) && _mini_cols_data.TryGetValue(k, out data))
@@ -635,8 +635,8 @@ namespace mbts.spark {
if (s.mini_ob.value == null)
s.mini_ob = new LadderMiniOrderBookSettings(bts.shell.orderbook.OrderBookStartupData.default_mini_grid.general);
#pragma warning disable CS0612 // Type or member is obsolete
if (s.mini_ob.value.sorting_criterion.Count == 0)
s.mini_ob = new LadderMiniOrderBookSettings(s.mini_ob.value.with(sorting_criterion: bts.shell.orderbook.OrderBookStartupData.default_mini_grid.general.sorting_criterion));
if (s.mini_ob.value.sorting_criteria.Count == 0)
s.mini_ob = new LadderMiniOrderBookSettings(s.mini_ob.value.with(sorting_criteria: bts.shell.orderbook.OrderBookStartupData.default_mini_grid.general.sorting_criteria));
#pragma warning restore CS0612 // Type or member is obsolete
s.row_height = LadderRender.measure_row_height(s);
return s;
@@ -401,7 +401,7 @@ namespace mbts.spark {
clone = SparkUtils.clone_proto(_current);
#pragma warning disable CS0612 // Type or member is obsolete
clone.mini_ob = new LadderMiniOrderBookSettings(_current.mini_ob.value != null ?
mini_ob.create().with(sorting_criterion: _current.mini_ob.value.sorting_criterion) :
mini_ob.create().with(sorting_criteria: _current.mini_ob.value.sorting_criteria) :
mini_ob.create());
#pragma warning restore CS0612 // Type or member is obsolete
}
@@ -8,16 +8,16 @@ namespace bts.shell.manual_fills {
[ProtoContract]
class ManualFillsSettings {
[ProtoMember(1)]
readonly SortingCriteria[] _sorting_criterion;
readonly SortingCriteria[] _sorting_criteria;
public static ManualFillsSettings Default =>
new ManualFillsSettings(new[] { new SortingCriteria(nameof(mbts.ui.spark.ManualFillsView.Columns.Security), true) });
public ManualFillsSettings() { }
public ManualFillsSettings(IEnumerable<SortingCriteria> sorting_criterion) =>
_sorting_criterion = sorting_criterion.ToArray();
public ManualFillsSettings(IEnumerable<SortingCriteria> sorting_criteria) =>
_sorting_criteria = sorting_criteria.ToArray();
public IReadOnlyList<SortingCriteria> sorting_criterion => _sorting_criterion ?? Array.Empty<SortingCriteria>();
public IReadOnlyList<SortingCriteria> sorting_criteria => _sorting_criteria ?? Array.Empty<SortingCriteria>();
}
}
@@ -44,10 +44,10 @@ namespace bts.shell {
var vm = ManualFillsVM.create(_bus, _orders_model);
var view = new ManualFillsView { DataContext = vm };
view.data_grid.Sorting += on_sorting;
IReadOnlyList<SortingCriteria> last_sorting_criterion = Array.Empty<SortingCriteria>();
IReadOnlyList<SortingCriteria> last_sorting_criteria = Array.Empty<SortingCriteria>();
using (apply_sort()) {
var col_sort_tuples =
from sc in settings.sorting_criterion
from sc in settings.sorting_criteria
join col in view.data_grid.Columns on sc.col_name equals _col_id(col)
select (col, sc);
foreach (var (col, sc) in col_sort_tuples) {
@@ -65,8 +65,8 @@ namespace bts.shell {
new SparkCommandCommand("Delete Selected", Icons.Trash, vm.remove_selected_fills_cmd)
};
return (view, cmds, get_settings, Disposable.Create(
vm.rows_view.subscribe_sorting_criterion(sm => view.data_grid.Columns.TryGetFirst(dc => dc.SortMemberPath == sm, out DataGridColumn match) ? _col_id(match) : null)
.Subscribe(sc => last_sorting_criterion = sc),
vm.rows_view.subscribe_sorting_criteria(sm => view.data_grid.Columns.TryGetFirst(dc => dc.SortMemberPath == sm, out DataGridColumn match) ? _col_id(match) : null)
.Subscribe(sc => last_sorting_criteria = sc),
vm));
//
void on_sorting(object sender, DataGridSortingEventArgs e) {
@@ -102,7 +102,7 @@ namespace bts.shell {
});
ManualFillsSettings get_settings() =>
new ManualFillsSettings(last_sorting_criterion);
new ManualFillsSettings(last_sorting_criteria);
}
}
@@ -39,7 +39,7 @@ namespace mbts.spark {
}
class OrderBookSortingData : IEquatable<OrderBookSortingData> {
public readonly IReadOnlyList<SortingCriteria> sorting_criterion;
public readonly IReadOnlyList<SortingCriteria> sorting_criteria;
public readonly IComparer<OrderBookRowVM> comparer;
public readonly string desc;
@@ -52,13 +52,13 @@ namespace mbts.spark {
comp_builder.add(Comparer<OrderBookRowVM>.Create((l, r) => l.order_key.CompareTo(r.order_key)));
}
comparer = comp_builder.to_comparer();
sorting_criterion = column_sorting_hierarchy.Select(col => new SortingCriteria(col.id, col.SortDirection.GetValueOrDefault() == ListSortDirection.Ascending)).ToArray();
desc = string.Join(", ", sorting_criterion);
sorting_criteria = column_sorting_hierarchy.Select(col => new SortingCriteria(col.id, col.SortDirection.GetValueOrDefault() == ListSortDirection.Ascending)).ToArray();
desc = string.Join(", ", sorting_criteria);
}
public bool Equals(OrderBookSortingData other) => other != null && EqualityComparer.safe_sequence_equals(sorting_criterion, other.sorting_criterion);
public bool Equals(OrderBookSortingData other) => other != null && EqualityComparer.safe_sequence_equals(sorting_criteria, other.sorting_criteria);
public override bool Equals(object obj) => base.Equals(obj);
public override int GetHashCode() => EqualityComparer.aggregate_hash(sorting_criterion);
public override int GetHashCode() => EqualityComparer.aggregate_hash(sorting_criteria);
public override string ToString() => desc;
}
@@ -393,7 +393,7 @@ namespace mbts.spark {
};
public (FilterStates filters, IReadOnlyList<SortingCriteria> sorting) create() =>
(create_filter_states(), get_sorting_data().sorting_criterion);
(create_filter_states(), get_sorting_data().sorting_criteria);
public void load_from((FilterStates filters, IReadOnlyList<SortingCriteria> sorting) state) {
if (state.filters is FilterStates fs) {
@@ -606,7 +606,7 @@ namespace mbts.spark {
_columns.filter_changed -= _on_filter_changed;
grid_settings_manager.algo_tree_display_mode_changed -= _on_filter_changed;
#pragma warning disable CS0612 // Type or member is obsolete
_columns.load_from((state.filters, (state.orderbook_grid?.general ?? OrderBookStartupData.DefaultGrid.general).sorting_criterion));
_columns.load_from((state.filters, (state.orderbook_grid?.general ?? OrderBookStartupData.DefaultGrid.general).sorting_criteria));
#pragma warning restore CS0612 // Type or member is obsolete
// resume column filter updates
_columns.filter_changed += _on_filter_changed;
@@ -739,7 +739,7 @@ namespace mbts.spark {
static OrderBookFillsGridSettings _get_fills_settings(FillsVM fills_vm) =>
fills_vm == null ? OrderBookStartupData.DefaultFillsGrid :
new OrderBookFillsGridSettings {
sorting_criterion = fills_vm.get_sorting_criterion().ToList(),
sorting_criteria = fills_vm.get_sorting_criteria().ToList(),
filters = fills_vm.get_filters(),
general = fills_vm.grid_settings_manager.create()
};
@@ -12,9 +12,9 @@ namespace bts.shell.orderbook {
[ProtoMember(2)]
public FillsFilterStates filters { get; set; }
[ProtoMember(3)]
public List<SortingCriteria> sorting_criterion { get; set; }
public List<SortingCriteria> sorting_criteria { get; set; }
public FillsSettings to_startup_data() =>
new FillsSettings(null, sorting_criterion, filters, general);
new FillsSettings(null, sorting_criteria, filters, general);
}
}
@@ -82,9 +82,9 @@ namespace bts.shell.orderbook {
algo_tree_display_mode = gs.algo_tree_display_mode;
}
public OrderBookGridSettings create(IEnumerable<SortingCriteria> sorting_criterion) {
public OrderBookGridSettings create(IEnumerable<SortingCriteria> sorting_criteria) {
var gs = core_manager.create();
gs.general = gs.general.with(sorting_criterion: sorting_criterion);
gs.general = gs.general.with(sorting_criteria: sorting_criteria);
gs.algo_tree_display_mode = _algo_tree_display_mode;
return gs;
}
@@ -133,15 +133,15 @@ namespace bts.shell.orderbook {
get {
var default_fills = FillsSettings.Default();
var rv = new OrderBookFillsGridSettings {
sorting_criterion = default_fills.sorting_criterion.ToList(),
sorting_criteria = default_fills.sorting_criteria.ToList(),
filters = default_fills.filters,
general = FillsSettings.MiniGridSettings
};
return rv;
}
}
static GridSettings _default_general_grid => GridSettings.Default.with(DefaultColumns.standard, DefaultColumns.sorting_criterion);
public static OrderBookGridSettings default_mini_grid => new OrderBookGridSettings(GridSettings.Default.with(DefaultColumns.mini, DefaultColumns.sorting_criterion)) {
static GridSettings _default_general_grid => GridSettings.Default.with(DefaultColumns.standard, DefaultColumns.sorting_criteria);
public static OrderBookGridSettings default_mini_grid => new OrderBookGridSettings(GridSettings.Default.with(DefaultColumns.mini, DefaultColumns.sorting_criteria)) {
algo_tree_display_mode = AlgoTreeDisplayMode.RootAndLeafNodes
};
@@ -179,7 +179,7 @@ namespace bts.shell.orderbook {
public static GridColumnSettings edit_price => new GridColumnSettings(Columns.EditablePrice.ToString(), DIYGrid.DefaultColumnHeaders.Price, width: DIYGrid.DefaultColumnWidths.MiniOrderBook.EditablePrice);
public static GridColumnSettings commit => new GridColumnSettings(Columns.Commit.ToString(), width: DIYGrid.DefaultColumnWidths.MiniOrderBook.Commit);
public static IEnumerable<SortingCriteria> sorting_criterion {
public static IEnumerable<SortingCriteria> sorting_criteria {
get {
yield return new SortingCriteria(time_created.id, false);
}
@@ -64,9 +64,9 @@ namespace bts.shell {
this.grid = grid;
}
public static GridSettings DefaultGridSettings => GridSettings.Default.with(DefaultColumns.all, DefaultColumns.default_sorting_criterion);
public static GridSettings DefaultGridSettings => GridSettings.Default.with(DefaultColumns.all, DefaultColumns.default_sorting_criteria);
public IReadOnlyList<SortingCriteria> sorting_criterion => _sort_criteria ?? (_sort_criteria = DefaultColumns.default_sorting_criterion.ToList());
public IReadOnlyList<SortingCriteria> sorting_criteria => _sort_criteria ?? (_sort_criteria = DefaultColumns.default_sorting_criteria.ToList());
public static PAndLStartupData Default() =>
new PAndLStartupData(null, new FilterStates(), pnl_calc_type.midpoint);
@@ -100,7 +100,7 @@ namespace bts.shell {
public static GridColumnSettings pnl_price => new GridColumnSettings(col_id(Columns.PNLPrice), DefaultColumnHeaders.PnLPrice, width: DefaultColumnWidths.PnL_Generic, horizontal_alignment: System.Windows.HorizontalAlignment.Right);
public static GridColumnSettings has_day_trades => new GridColumnSettings(col_id(Columns.TradedToday), "Traded Today", width: 100, horizontal_alignment: System.Windows.HorizontalAlignment.Center);
public static IEnumerable<SortingCriteria> default_sorting_criterion {
public static IEnumerable<SortingCriteria> default_sorting_criteria {
get {
yield return new SortingCriteria(account.id, true);
yield return new SortingCriteria(exchange.id, true);
@@ -85,14 +85,14 @@ namespace bts.shell {
Func<PNLSaveState> get_save_state = () => {
var cols = cached_columns.ToArray(c => c.create());
var filters = vm.get_filters_states();
var sorting_criterion = vm.sorting_hierarchy.Select(tup => new SortingCriteria(tup.key.ToString(), tup.direction == ListSortDirection.Ascending)).ToArray();
var sorting_criteria = vm.sorting_hierarchy.Select(tup => new SortingCriteria(tup.key.ToString(), tup.direction == ListSortDirection.Ascending)).ToArray();
var calc_type = vm.calculation_type;
var state = settings_manager.instance_settings;
if (state == null) {
// don't use defaults if the user manipulated the window state outside of the settings dialog (e.g., resized column(s) via drag, or changed sort/filter)
var defaults = settings_manager.default_settings;
if (calc_type == defaults.calculation_type &&
defaults.sorting_criterion.SequenceEqual(sorting_criterion) &&
defaults.sorting_criteria.SequenceEqual(sorting_criteria) &&
defaults.grid.columns.SequenceEqual(cols) && defaults.filters.safe_equals(filters)) {
// the user's current state still matches the defaults (i.e., no outside manipulation was performed); return null so this window will use the latest default settings when restored
return new PNLSaveState { use_defaults = true, settings = null };
@@ -101,7 +101,7 @@ namespace bts.shell {
}
// assign latest values, as they may have be modified outside of the settings dialog (in which case the settings manager would be out of date)
state = state.with(
sorting_criterion,
sorting_criteria,
vm.anchors,
filters,
state.grid.with(columns: cols, background: vm.grid_background_color.rgb_color()),
@@ -80,7 +80,7 @@ namespace bts.shell.pnl {
};
[ProtoMember(1)]
SortingCriteria[] _sorting_criterion;
SortingCriteria[] _sorting_criteria;
[ProtoMember(5)]
Columns[] _anchors;
[ProtoMember(7)]
@@ -106,7 +106,7 @@ namespace bts.shell.pnl {
public static PNLSettings Default =>
new PNLSettings {
_sorting_criterion = new[] {
_sorting_criteria = new[] {
new SortingCriteria(nameof(Columns.Account), true),
new SortingCriteria(nameof(Columns.Security), true)
},
@@ -154,7 +154,7 @@ namespace bts.shell.pnl {
public static GridSettings DefaultGridSettings =>
GridSettings.Default.with(
DefaultColumns.all,
DefaultColumns.default_sorting_criterion,
DefaultColumns.default_sorting_criteria,
enable_background_color: true);
public static fills.FillsSettings DefaultAuxiliaryFills {
@@ -289,8 +289,8 @@ namespace bts.shell.pnl {
public PNLCellAppearance header_defaults => header_cell_appearance.to_appearance().merge(grid_defaults);
public IReadOnlyList<PNLAnimationTriggerData> header_row_animations => _header_row_animations ?? (_header_row_animations = default_header_row_animations.ToArray());
//
public IReadOnlyList<SortingCriteria> sorting_criterion =>
_sorting_criterion ?? (_sorting_criterion = DefaultColumns.default_sorting_criterion.ToArray());
public IReadOnlyList<SortingCriteria> sorting_criteria =>
_sorting_criteria ?? (_sorting_criteria = DefaultColumns.default_sorting_criteria.ToArray());
PNLCellAppearanceProto _grid_cell_appearance => _grid_cell_appearance_backing ?? (
_grid_cell_appearance_backing = new PNLCellAppearanceProto {
@@ -305,7 +305,7 @@ namespace bts.shell.pnl {
});
public PNLSettings with(
IEnumerable<SortingCriteria> sorting_criterion = null,
IEnumerable<SortingCriteria> sorting_criteria = null,
IEnumerable<Columns> anchors = null,
FilterStates filters = null,
GridSettings grid = null,
@@ -323,7 +323,7 @@ namespace bts.shell.pnl {
header_row_display = header_row_display ?? this.header_row_display,
// row operators (anchors, sorting, filters)
_anchors = (anchors ?? _anchors.empty_if_null()).ToArray(),
_sorting_criterion = (sorting_criterion ?? _sorting_criterion.empty_if_null()).ToArray(),
_sorting_criteria = (sorting_criteria ?? _sorting_criteria.empty_if_null()).ToArray(),
filters = filters ?? this.filters,
// cell appearance (group/header)
_group_background_colors = _group_background_colors?.ToList(),
@@ -349,7 +349,7 @@ namespace bts.shell.pnl {
data_formatting.safe_equals(other.data_formatting) &&
// row operators (anchors, sorting, filters)
anchors.SequenceEqual(other.anchors) &&
sorting_criterion.SequenceEqual(other.sorting_criterion) &&
sorting_criteria.SequenceEqual(other.sorting_criteria) &&
filters.safe_equals(other.filters) &&
// cell appearance (group/header)
group_background_colors.SequenceEqual(other.group_background_colors) &&
@@ -431,7 +431,7 @@ namespace bts.shell.pnl {
public static GridColumnSettings settlement_price => new GridColumnSettings(nameof(Columns.SettlementPrice), DefaultColumnHeaders.Settlement, false, width: DefaultColumnWidths.Settlement, horizontal_alignment: HorizontalAlignment.Right);
public static GridColumnSettings pnl_price => new GridColumnSettings(nameof(Columns.PNLPrice), DefaultColumnHeaders.PnLPrice, width: DefaultColumnWidths.Price, horizontal_alignment: HorizontalAlignment.Right);
public static IEnumerable<SortingCriteria> default_sorting_criterion {
public static IEnumerable<SortingCriteria> default_sorting_criteria {
get {
yield return new SortingCriteria(account.id, true);
yield return new SortingCriteria(security.id, true);
@@ -118,7 +118,15 @@ namespace bts.shell.pnl {
).FilterWithRaw(filter_src, PNLRowData.key_fn, null)
.OnDispatcher()
.Subscribe(_update),
_symbols_source(pnl_source).OnDispatcher().Subscribe(symbol_filter_items_observer),
// Note: the symbol filter items don't really need to be an IObservable
// (the symbol items used to be extracted from the IObservable pnl_source).
// It is only an IObservable now due to legacy; the filter was designed to observe incremental updates.
// This is can be easily changed if need be.
Observable.Return(
TableUpdate<string, string>.mk_empty(sym => sym).with_added(
SecurityHelper.get_all_display_symbols()))
.OnDispatcher()
.Subscribe(symbol_filter_items_observer),
Disposable.Create(() => {
foreach (var f in _all_filters)
f.filter_changed -= _refresh_filter.execute;
@@ -369,7 +377,7 @@ namespace bts.shell.pnl {
}
anchors.sync_with(settings.anchors);
header_row_display = settings.header_row_display;
sorting_hierarchy = DIYGridSortHelper.convert_sorting_criterion<ColumnKeys>(settings.sorting_criterion).ToList();
sorting_hierarchy = DIYGridSortHelper.convert_sorting_criteria<ColumnKeys>(settings.sorting_criteria).ToList();
// group background colors
_group_background_converter = new AlternationConverter();
_group_background_converter.Values.AddRange(settings.group_background_colors.Select(c => c.argb_color()));
+6 -6
View File
@@ -44,17 +44,17 @@ namespace mbts.spark {
}
static class TradesSource {
public static IEnumerable<Product> aggregate_security_criteria(IEnumerable<SecurityImmutable> securities, IEnumerable<SecurityCriteria> security_criterion) =>
securities.Where(s => security_criterion.Any(sc => ContractPickerModel.security_in_criteria(sc, s)))
public static IEnumerable<Product> aggregate_security_criteria(IEnumerable<SecurityImmutable> securities, IEnumerable<SecurityCriteria> security_criteria) =>
securities.Where(s => security_criteria.Any(sc => ContractPickerModel.security_in_criteria(sc, s)))
.Select(Product.from_security)
.Distinct();
public static IObservable<IReadOnlyList<TradeInfo>> create(MDConsumer consumer, IObservable<IReadOnlyDictionary<uint, SecurityImmutable>> security_map, IObservable<IEnumerable<SecurityCriteria>> security_criterion, TimeSpan poll_interval) =>
security_criterion.CombineLatest(security_map, (criterion, map) => (criterion, map))
public static IObservable<IReadOnlyList<TradeInfo>> create(MDConsumer consumer, IObservable<IReadOnlyDictionary<uint, SecurityImmutable>> security_map, IObservable<IEnumerable<SecurityCriteria>> security_criteria, TimeSpan poll_interval) =>
security_criteria.CombineLatest(security_map, (criterion, map) => (criterion, map))
.Scan((channels: ImmutableDictionary<Product, ChannelConsumer>.Empty, active: new List<ChannelConsumer>(0)), (channel_data, data) => {
var (criterion, map) = data;
var (criteria, map) = data;
var (channels, active) = channel_data;
var products = aggregate_security_criteria(map.Values, criterion);
var products = aggregate_security_criteria(map.Values, criteria);
active = new List<ChannelConsumer>();
foreach (var p in products) {
if (!channels.TryGetValue(p, out var c)) {
@@ -68,8 +68,8 @@ namespace mbts.ui.controls {
.to_comparer();
}
public static IEnumerable<(TKey key, ListSortDirection direction)> convert_sorting_criterion<TKey>(IEnumerable<SortingCriteria> sorting_criterion) where TKey : struct {
foreach (var sc in sorting_criterion) {
public static IEnumerable<(TKey key, ListSortDirection direction)> convert_sorting_criteria<TKey>(IEnumerable<SortingCriteria> sorting_criteria) where TKey : struct {
foreach (var sc in sorting_criteria) {
if (Enum.TryParse(sc.col_name, false, out TKey key))
yield return (key, sc.direction());
}
@@ -76,9 +76,9 @@ namespace mbts.ui.settings {
// columns
[ProtoMember(6)]
List<GridColumnSettings> _columns;
// sorting criterion
// sorting criteria
[ProtoMember(7)]
List<SortingCriteria> _sorting_criterion;
List<SortingCriteria> _sorting_criteria;
// background
[ProtoMember(8)]
[DefaultValue(_default_background)]
@@ -103,7 +103,7 @@ namespace mbts.ui.settings {
uint font_color = _default_font_color,
ColorOpacityProto? selection_highlight = null,
IEnumerable<GridColumnSettings> columns = null,
IEnumerable<SortingCriteria> sorting_criterion = null,
IEnumerable<SortingCriteria> sorting_criteria = null,
uint background = _default_background,
bool enable_background_color = _default_enable_background_color) {
//
@@ -113,7 +113,7 @@ namespace mbts.ui.settings {
_font_weight = (ushort)font_weight.ToOpenTypeWeight();
_selection_highlight = selection_highlight ?? new ColorOpacityProto(0, 1);
_columns = new List<GridColumnSettings>(columns.empty_if_null());
_sorting_criterion = new List<SortingCriteria>(sorting_criterion.empty_if_null());
_sorting_criteria = new List<SortingCriteria>(sorting_criteria.empty_if_null());
_background = background;
_enable_background_color = enable_background_color;
}
@@ -127,15 +127,15 @@ namespace mbts.ui.settings {
public uint background_color => _background;
public bool enable_background_color => _enable_background_color;
public IReadOnlyList<GridColumnSettings> columns => _columns ?? (_columns = new List<GridColumnSettings>(0));
[Obsolete] // TODO: remove sorting_criterion from GridSettings entirely. This should be part of IShellWindow's StartupData, since it is an instance-specific setting, and prob not part of the shared defaults
public IReadOnlyList<SortingCriteria> sorting_criterion => _sorting_criterion ?? (_sorting_criterion = new List<SortingCriteria>(0));
[Obsolete] // TODO: remove sorting_criteria from GridSettings entirely. This should be part of IShellWindow's StartupData, since it is an instance-specific setting, and prob not part of the shared defaults
public IReadOnlyList<SortingCriteria> sorting_criteria => _sorting_criteria ?? (_sorting_criteria = new List<SortingCriteria>(0));
public static GridSettings get_default() =>
new GridSettings(_default_font_family, _default_font_size, FontWeights.Normal, _default_font_color, new ColorOpacityProto(Colors.MediumSlateBlue, 0.4));
public GridSettings with(
IEnumerable<GridColumnSettings> columns = null,
IEnumerable<SortingCriteria> sorting_criterion = null,
IEnumerable<SortingCriteria> sorting_criteria = null,
string font_family = null,
double font_size = double.NaN,
uint? background = null,
@@ -147,7 +147,7 @@ namespace mbts.ui.settings {
_font_color,
_selection_highlight,
columns ?? _columns,
sorting_criterion ?? _sorting_criterion,
sorting_criteria ?? _sorting_criteria,
background ?? _background,
enable_background_color ?? _enable_background_color);
@@ -164,7 +164,7 @@ namespace mbts.ui.settings {
_enable_background_color == other._enable_background_color &&
EqualityComparer.safe_sequence_equals(columns, other.columns) &&
#pragma warning disable CS0612 // Type or member is obsolete
EqualityComparer.safe_sequence_equals(sorting_criterion, other.sorting_criterion);
EqualityComparer.safe_sequence_equals(sorting_criteria, other.sorting_criteria);
#pragma warning restore CS0612 // Type or member is obsolete
public override bool Equals(object obj) =>
@@ -181,7 +181,7 @@ namespace mbts.ui.settings {
_enable_background_color.GetHashCode(),
EqualityComparer.safe_aggregate_hash(columns),
#pragma warning disable CS0612 // Type or member is obsolete
EqualityComparer.safe_aggregate_hash(sorting_criterion));
EqualityComparer.safe_aggregate_hash(sorting_criteria));
#pragma warning restore CS0612 // Type or member is obsolete
}
}
}
@@ -54,14 +54,14 @@ namespace mbts.ui.settings {
public static string fmt_col_id<TColKey>(TColKey key) where TColKey : struct =>
key.ToString();
public static void normalize_sorting_criterion<TColKey>(IEnumerable<SortingCriteria> sorting_criterion, IReadOnlyDictionary<string, TColKey> sort_member_to_id) where TColKey : struct =>
normalize_sorting_criterion(sorting_criterion, new Func<string, TColKey?>[] {
public static void normalize_sorting_criteria<TColKey>(IEnumerable<SortingCriteria> sorting_criteria, IReadOnlyDictionary<string, TColKey> sort_member_to_id) where TColKey : struct =>
normalize_sorting_criteria(sorting_criteria, new Func<string, TColKey?>[] {
parse_col_id<TColKey>,
col_name => sort_member_to_id.TryGetValue(col_name, out var k) ? k : (TColKey?)null
});
public static void normalize_sorting_criterion<TColKey>(IEnumerable<SortingCriteria> sorting_criterion, IEnumerable<Func<string, TColKey?>> conversion_dels) where TColKey : struct {
foreach (var sc in sorting_criterion) {
public static void normalize_sorting_criteria<TColKey>(IEnumerable<SortingCriteria> sorting_criteria, IEnumerable<Func<string, TColKey?>> conversion_dels) where TColKey : struct {
foreach (var sc in sorting_criteria) {
sc.col_name = conversion_dels
.Select(del => del(sc.col_name))
.FirstOrDefault(k => k.HasValue)?.ToString() ?? sc.col_name;
@@ -114,7 +114,7 @@ namespace mbts.ui.controls {
public Func<T, bool> filter { get; private set; }
public TFiltersState get_filters() => _filters.create();
public IEnumerable<SortingCriteria> get_sorting_criterion() => _sorting.create();
public IEnumerable<SortingCriteria> get_sorting_criteria() => _sorting.create();
public void on_sorting(DIYGridSortingEventArgs e) => _sorting.on_sorting(e);
public void on_settings(TFiltersState filters, IEnumerable<SortingCriteria> sorting) {
@@ -54,13 +54,13 @@ namespace mbts.ui.controls {
).to_comparer();
}
public void load_from(IEnumerable<SortingCriteria> sorting_criterion) {
public void load_from(IEnumerable<SortingCriteria> sorting_criteria) {
var sort_member_to_id = _map
.Where(kv => !string.IsNullOrEmpty(kv.Value.col.sort_member_path))
.Distinct()
.ToDictionary(kv => kv.Value.col.sort_member_path, kv => kv.Key);
GridSettingsHelper.normalize_sorting_criterion(sorting_criterion, sort_member_to_id);
_on_settings(sorting_criterion
GridSettingsHelper.normalize_sorting_criteria(sorting_criteria, sort_member_to_id);
_on_settings(sorting_criteria
.Select(sc => (GridSettingsHelper.parse_col_id<TColKey>(sc.col_name), sc.is_ascending ? ListSortDirection.Ascending : ListSortDirection.Descending))
.Where(t => t.Item1.HasValue)
.Select(t => (t.Item1.Value, t.Item2)));
@@ -372,11 +372,11 @@ namespace mbts.ui {
on sd.PropertyName equals col.path
select new SortingCriteria(col.id, sd.Direction == ListSortDirection.Ascending);
public static IEnumerable<SortDescription> get_sort_descriptions(this IEnumerable<SortingCriteria> sorting_criterion, IEnumerable<DataGridColumn> columns) =>
get_sort_descriptions(sorting_criterion, columns.Select(c => (controls.DataGridEx.GetCellKey(c)?.ToString(), c.SortMemberPath)));
public static IEnumerable<SortDescription> get_sort_descriptions(this IEnumerable<SortingCriteria> sorting_criteria, IEnumerable<DataGridColumn> columns) =>
get_sort_descriptions(sorting_criteria, columns.Select(c => (controls.DataGridEx.GetCellKey(c)?.ToString(), c.SortMemberPath)));
public static IEnumerable<SortDescription> get_sort_descriptions(this IEnumerable<SortingCriteria> sorting_criterion, IEnumerable<(string id, string path)> columns) =>
from sc in sorting_criterion
public static IEnumerable<SortDescription> get_sort_descriptions(this IEnumerable<SortingCriteria> sorting_criteria, IEnumerable<(string id, string path)> columns) =>
from sc in sorting_criteria
join col in columns
on sc.col_name equals col.id
select new SortDescription(col.path, sc.direction());
@@ -384,9 +384,9 @@ namespace mbts.ui {
/// <summary>
/// Converts each <see cref="SortingCriteria"/> into a <see cref="SortDescription"/> and assigns the result to <paramref name="collection_view"/>.SortDescriptions.
/// </summary>
public static void set_sort_descriptions(this ICollectionView collection_view, IEnumerable<SortingCriteria> sorting_criterion, ObservableCollection<controls.DIYGrid.ColumnBase> columns) {
public static void set_sort_descriptions(this ICollectionView collection_view, IEnumerable<SortingCriteria> sorting_criteria, ObservableCollection<controls.DIYGrid.ColumnBase> columns) {
using (collection_view.DeferRefresh()) {
collection_view.SortDescriptions.SetItems(sorting_criterion.empty_if_null()
collection_view.SortDescriptions.SetItems(sorting_criteria.empty_if_null()
.Select(sc => new SortDescription(
columns.FirstOrDefault(c => string.Equals(c.id, sc.col_name, StringComparison.CurrentCultureIgnoreCase))?.sort_member_path,
sc.is_ascending ? ListSortDirection.Ascending : ListSortDirection.Descending))
@@ -394,18 +394,18 @@ namespace mbts.ui {
}
}
public static IObservable<IReadOnlyList<SortingCriteria>> subscribe_sorting_criterion(this ICollectionView collection_view, Func<string, string> sort_member_to_id) =>
public static IObservable<IReadOnlyList<SortingCriteria>> subscribe_sorting_criteria(this ICollectionView collection_view, Func<string, string> sort_member_to_id) =>
Observable.Create<IReadOnlyList<SortingCriteria>>(o => {
INotifyCollectionChanged notification_src = collection_view.SortDescriptions;
IList<SortDescription> sort_descriptions = collection_view.SortDescriptions;
var sorting_criterion = sort_descriptions.Select(to_criteria).ToList();
var sorting_criteria = sort_descriptions.Select(to_criteria).ToList();
notification_src.CollectionChanged += on_sort_descriptions_changed;
o.OnNext(sorting_criterion);
o.OnNext(sorting_criteria);
return Disposable.Create(dispose);
// local methods
void on_sort_descriptions_changed(object sender, NotifyCollectionChangedEventArgs e) {
CollectionHelper.reflect_change(sorting_criterion, collection_view.SortDescriptions, to_criteria, null, e);
o.OnNext(sorting_criterion);
CollectionHelper.reflect_change(sorting_criteria, collection_view.SortDescriptions, to_criteria, null, e);
o.OnNext(sorting_criteria);
}
SortingCriteria to_criteria(SortDescription sd) => new SortingCriteria(sort_member_to_id(sd.PropertyName), sd.Direction == ListSortDirection.Ascending);
void dispose() => notification_src.CollectionChanged -= on_sort_descriptions_changed;
+1 -1
View File
@@ -169,7 +169,7 @@ namespace mbts.spark {
}
// restore sort state or supply default value
pnl_view.set_sort_descriptions(startup_data.sorting_criterion, columns);
pnl_view.set_sort_descriptions(startup_data.sorting_criteria, columns);
var col_settings_flags = new Dictionary<string, GridColumnSettingsFeatureFlags> {
{ Columns.StartPNL.ToString(), GridColumnSettingsFeatureFlags.ImmutableFontColor },
@@ -11,5 +11,8 @@ namespace bts.api {
default: return SecurityType.Unset;
}
}
public static string display_symbol(this SecurityImmutable security) =>
SecurityHelper.get_display_symbol(security);
}
}
@@ -1,10 +1,24 @@
using System;
using mbts.co2;
using System;
using System.Collections.Generic;
using System.Linq;
using static bts.api.Security;
namespace bts.api {
internal static class SecurityHelper {
public static IEnumerable<string> get_all_display_symbols() =>
get_all_display_symbols(UserSymbol.get_all().Select(usym => usym.symbol));
public static IEnumerable<string> get_all_display_symbols(IEnumerable<string> system_symbols) {
// todo: actual impl
return system_symbols;
}
public static string get_display_symbol(SecurityImmutable security) {
// todo: actual impl
return security.Symbol;
}
public static IEnumerable<FutureLeg> get_flat_future_legs(SecurityImmutable sec) {
switch (sec.ContractCase) {
case ContractOneofCase.Spread: return _get_flat_future_legs(sec.Spread.Legs, 1);