public override void DrawContent() { if (m_pages == null) { m_pages = new Dictionary <int, List <ILinePresenter> >(); Rebuild(); } DrawHeader(); var line = HeaderTakesLine; var bottomString = new List <string> { "[PgUp/PgDown] листать", "[z|Esc] - " + EALConst.EXIT.GetString() }; if ((m_behavior & ESelectItemDialogBehavior.SELECT_MULTIPLE) == ESelectItemDialogBehavior.SELECT_MULTIPLE) { bottomString.Insert(1, "[Enter] выбрать"); } if (m_pages.Count > 0) { var page = m_pages[m_currentPage]; foreach (var presenter in page) { if (presenter is EssenceCategoryPresenter) { var category = ((EssenceCategoryPresenter)presenter).Category; var attribute = EssenceCategoryAttribute.GetAttribute(category); m_filters[new Tuple <ConsoleKey, EKeyModifiers>(attribute.Key, attribute.Modifiers)] = category; } presenter.DrawLine(line++, this); } if ((m_behavior & ESelectItemDialogBehavior.ALLOW_CHANGE_FILTER) == ESelectItemDialogBehavior.ALLOW_CHANGE_FILTER) { var filters = "*" + string.Join("", m_filters.Values.Select( _category => EssenceCategoryAttribute.GetAttribute(_category).C.ToString())); bottomString.Insert(0, "[" + filters + "] фильтровать"); } } else { DrawLine("(ничего нет)", FColor.White, line, 0, EAlignment.CENTER); } DrawLine(JoinCommandCaptions(bottomString), ForeColor, TextLinesMax - 2, 0, EAlignment.CENTER); }
public EssenceCategoryPresenter(EItemCategory _category) { Category = _category; m_attribute = EssenceCategoryAttribute.GetAttribute(_category); }
protected void Rebuild() { var key = ConsoleKey.A; var linesPerPage = TextLinesMax - HeaderTakesLine; var currentCategory = ""; var done = new List <Noun>(); List <ILinePresenter> page = null; m_pages.Clear(); var categories = m_descriptors.Select(_descriptor => _descriptor.Essence).OfType <Item>().Select(_item => _item.Category).Distinct().OrderBy(_category => _category); if (AllowedCategories.Any()) { categories = categories.Intersect(AllowedCategories).OrderBy(_category => _category); } foreach (var cat in categories) { var attribute = EssenceCategoryAttribute.GetAttribute(cat); if (m_currentFilter != '*' && attribute.C != m_currentFilter) { continue; } foreach (EssenceDescriptor descriptor in m_descriptors) { var item = descriptor.Essence as Item; var nm = descriptor.Essence.GetName(World.TheWorld.Avatar); if (item == null) { continue; } if (done.Contains(nm)) { continue; } done.Add(nm); if (page == null) { page = new List <ILinePresenter>(); m_pages.Add(m_pages.Count, page); currentCategory = ""; key = ConsoleKey.A; } var name = EALSentence.GENERAL.GetString(cat.AsNoun()); if (name != currentCategory) { page.Add(new EssenceCategoryPresenter(cat)); currentCategory = name; } page.Add(new EssencePresenter(key, descriptor, m_descriptors)); key++; if (page.Count == linesPerPage - 1) { page = null; } } } }
public override void KeysPressed(ConsoleKey _key, EKeyModifiers _modifiers) { if ((m_behavior & ESelectItemDialogBehavior.ALLOW_CHANGE_FILTER) == ESelectItemDialogBehavior.ALLOW_CHANGE_FILTER) { if (_key == ConsoleKey.Multiply || (_key == ConsoleKey.D8 && _modifiers == EKeyModifiers.SHIFT)) { m_currentFilter = '*'; Rebuild(); return; } foreach (var pair in m_filters) { if (pair.Key.Item1 == _key && pair.Key.Item2 == _modifiers) { m_currentFilter = EssenceCategoryAttribute.GetAttribute(pair.Value).C; Rebuild(); return; } } } if (_modifiers != EKeyModifiers.NONE) { return; } switch (_key) { case ConsoleKey.Z: case ConsoleKey.Escape: CloseTopBlock(); return; case ConsoleKey.PageUp: m_currentPage = Math.Max(0, m_currentPage - 1); break; case ConsoleKey.PageDown: m_currentPage = Math.Min(m_pages.Count - 1, m_currentPage + 1); break; case ConsoleKey.Enter: if ((m_behavior & ESelectItemDialogBehavior.SELECT_MULTIPLE) == ESelectItemDialogBehavior.SELECT_MULTIPLE) { CloseTopBlock(_key); } return; } if (m_pages.Count > 0) { foreach (var presenter in m_pages[m_currentPage].OfType <EssencePresenter>()) { if (presenter.Key == _key) { presenter.IsChecked = !presenter.IsChecked; if ((m_behavior & ESelectItemDialogBehavior.SELECT_ONE) == ESelectItemDialogBehavior.SELECT_ONE) { CloseTopBlock(ConsoleKey.Enter); return; } } } } }