Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
661ccf80fc | ||
|
|
36212a8cf7 | ||
|
|
d8683151fe |
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()));
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in new issue
Block a user