menu: reduce indirection
This commit is contained in:
43
src/menu.h
43
src/menu.h
@@ -37,8 +37,6 @@ namespace NC {
|
||||
/// holding any std::vector compatible values.
|
||||
template <typename ItemT> class Menu : public Window
|
||||
{
|
||||
struct ItemProxy;
|
||||
|
||||
public:
|
||||
struct Item
|
||||
{
|
||||
@@ -82,16 +80,8 @@ public:
|
||||
bool m_is_separator;
|
||||
};
|
||||
|
||||
typedef boost::indirect_iterator<
|
||||
typename std::vector<ItemProxy>::iterator,
|
||||
Item,
|
||||
boost::random_access_traversal_tag
|
||||
> Iterator;
|
||||
typedef boost::indirect_iterator<
|
||||
typename std::vector<ItemProxy>::const_iterator,
|
||||
const Item,
|
||||
boost::random_access_traversal_tag
|
||||
> ConstIterator;
|
||||
typedef typename std::vector<Item>::iterator Iterator;
|
||||
typedef typename std::vector<Item>::const_iterator ConstIterator;
|
||||
typedef std::reverse_iterator<Iterator> ReverseIterator;
|
||||
typedef std::reverse_iterator<ConstIterator> ConstReverseIterator;
|
||||
|
||||
@@ -226,20 +216,20 @@ public:
|
||||
/// @param pos requested position
|
||||
/// @return reference to item at given position
|
||||
/// @throw std::out_of_range if given position is out of range
|
||||
Menu<ItemT>::Item &at(size_t pos) { return *m_items.at(pos); }
|
||||
Menu<ItemT>::Item &at(size_t pos) { return m_items.at(pos); }
|
||||
|
||||
/// @param pos requested position
|
||||
/// @return const reference to item at given position
|
||||
/// @throw std::out_of_range if given position is out of range
|
||||
const Menu<ItemT>::Item &at(size_t pos) const { return *m_items.at(pos); }
|
||||
const Menu<ItemT>::Item &at(size_t pos) const { return m_items.at(pos); }
|
||||
|
||||
/// @param pos requested position
|
||||
/// @return const reference to item at given position
|
||||
const Menu<ItemT>::Item &operator[](size_t pos) const { return *m_items[pos]; }
|
||||
const Menu<ItemT>::Item &operator[](size_t pos) const { return m_items[pos]; }
|
||||
|
||||
/// @param pos requested position
|
||||
/// @return const reference to item at given position
|
||||
Menu<ItemT>::Item &operator[](size_t pos) { return *m_items[pos]; }
|
||||
Menu<ItemT>::Item &operator[](size_t pos) { return m_items[pos]; }
|
||||
|
||||
Iterator current() { return Iterator(m_items.begin() + m_highlight); }
|
||||
ConstIterator current() const { return ConstIterator(m_items.begin() + m_highlight); }
|
||||
@@ -272,31 +262,16 @@ public:
|
||||
ConstReverseValueIterator rendV() const { return ConstReverseValueIterator(beginV()); }
|
||||
|
||||
private:
|
||||
struct ItemProxy
|
||||
{
|
||||
typedef Item element_type;
|
||||
|
||||
ItemProxy() { }
|
||||
ItemProxy(Item item) : m_ptr(std::make_shared<Item>(std::move(item))) { }
|
||||
|
||||
Item &operator*() const { return *m_ptr; }
|
||||
Item *operator->() const { return m_ptr.get(); }
|
||||
|
||||
bool operator==(const ItemProxy &rhs) const { return m_ptr == rhs.m_ptr; }
|
||||
|
||||
private:
|
||||
std::shared_ptr<Item> m_ptr;
|
||||
};
|
||||
|
||||
bool isHighlightable(size_t pos)
|
||||
{
|
||||
return !m_items[pos]->isSeparator()
|
||||
&& !m_items[pos]->isInactive();
|
||||
return !m_items[pos].isSeparator()
|
||||
&& !m_items[pos].isInactive();
|
||||
}
|
||||
|
||||
ItemDisplayer m_item_displayer;
|
||||
|
||||
std::vector<ItemProxy> m_items;
|
||||
std::vector<Item> m_items;
|
||||
|
||||
size_t m_beginning;
|
||||
size_t m_highlight;
|
||||
|
||||
@@ -191,12 +191,12 @@ void Menu<ItemT>::refresh()
|
||||
mvwhline(m_window, line, 0, KEY_SPACE, m_width);
|
||||
break;
|
||||
}
|
||||
if (m_items[i]->isSeparator())
|
||||
if (m_items[i].isSeparator())
|
||||
{
|
||||
mvwhline(m_window, line, 0, 0, m_width);
|
||||
continue;
|
||||
}
|
||||
if (m_items[i]->isBold())
|
||||
if (m_items[i].isBold())
|
||||
*this << Format::Bold;
|
||||
if (m_highlight_enabled && i == m_highlight)
|
||||
{
|
||||
@@ -204,18 +204,18 @@ void Menu<ItemT>::refresh()
|
||||
*this << m_highlight_color;
|
||||
}
|
||||
mvwhline(m_window, line, 0, KEY_SPACE, m_width);
|
||||
if (m_items[i]->isSelected())
|
||||
if (m_items[i].isSelected())
|
||||
*this << m_selected_prefix;
|
||||
if (m_item_displayer)
|
||||
m_item_displayer(*this);
|
||||
if (m_items[i]->isSelected())
|
||||
if (m_items[i].isSelected())
|
||||
*this << m_selected_suffix;
|
||||
if (m_highlight_enabled && i == m_highlight)
|
||||
{
|
||||
*this << Color::End;
|
||||
*this << Format::NoReverse;
|
||||
}
|
||||
if (m_items[i]->isBold())
|
||||
if (m_items[i].isBold())
|
||||
*this << Format::NoBold;
|
||||
}
|
||||
Window::refresh();
|
||||
|
||||
Reference in New Issue
Block a user