Merge branch 'hotfixes' of https://github.com/qPCR4vir/nana into qPCR4vir-hotfixes

This commit is contained in:
Jinhao 2015-04-23 23:21:26 +08:00
commit 83ce805d4f
4 changed files with 607 additions and 346 deletions

View File

@ -112,7 +112,8 @@ namespace nana
std::size_t pos_{0};
};
struct index_pair
/// usefull for both absolute and display (sorted) positions
struct index_pair
{
size_type cat; //The pos of category
size_type item; //the pos of item in a category.
@ -169,7 +170,8 @@ namespace nana
class drawer_header_impl;
class drawer_lister_impl;
class trigger: public drawer_trigger
/// mostly works on display positions
class trigger: public drawer_trigger
{
public:
trigger();
@ -198,13 +200,22 @@ namespace nana
drawer_lister_impl *drawer_lister_;
};//end class trigger
class item_proxy
/// operate with absolute positions and contain only the position but montain pointers to parts of the real items
/// item_proxy self, it references and iterators are not invalidated by sort()
class item_proxy
: public std::iterator<std::input_iterator_tag, item_proxy>
{
public:
item_proxy(essence_t*);
item_proxy(essence_t*, const index_pair&);
/// the main porpose of this it to make obvious that item_proxy operate with absolute positions, and dont get moved during sort()
static item_proxy from_display(essence_t *ess, const index_pair &relative) ;
item_proxy from_display(const index_pair &relative) const;
/// posible use: last_selected_display = last_selected.to_display().item; use with caution, it get invalidated after a sort()
index_pair to_display() const;
bool empty() const;
item_proxy & check(bool ck);
@ -318,8 +329,8 @@ namespace nana
essence_t * _m_ess() const;
private:
std::vector<cell> & _m_cells() const;
nana::any * _m_value(bool alloc_if_empty);
const nana::any * _m_value() const;
nana::any * _m_value(bool alloc_if_empty);
const nana::any * _m_value() const;
private:
essence_t * ess_;
category_t* cat_{nullptr};
@ -334,7 +345,7 @@ namespace nana
cat_proxy(essence_t*, size_type pos);
cat_proxy(essence_t*, category_t*);
/// Append an item at end of the category, set_value determines whether assign T object to the value of item.
/// Append an item at abs end of the category, set_value determines whether assign T object to the value of item.
template<typename T>
item_proxy append(T&& t, bool set_value = false)
{
@ -367,13 +378,18 @@ namespace nana
item_proxy cbegin() const;
item_proxy cend() const;
item_proxy at(size_type pos) const;
item_proxy at(size_type pos_abs) const;
item_proxy back() const;
/// Returns the index of a item by its display pos, the index of the item isn't changed after sorting.
/// Returns the absolute index of a item by its display pos, the index of the item isn't changed after sorting.
/// convert from display order to absolute (find the real item in that display pos) but without check from current active sorting, in fact using just the last sorting !!!
size_type index_by_display_order(size_type disp_order) const;
size_type display_order(size_type pos) const;
size_type position() const;
/// find display order for the real item but without check from current active sorting, in fact using just the last sorting !!!
size_type display_order(size_type pos) const;
/// this cat position
size_type position() const;
/// Returns the number of items
size_type size() const;
@ -410,7 +426,7 @@ namespace nana
private:
essence_t* ess_{nullptr};
category_t* cat_{nullptr};
size_type pos_{0};
size_type pos_{0}; ///< Absolute position, not relative to display, and dont change during sort()
};
}
}//end namespace drawerbase
@ -446,12 +462,12 @@ namespace nana
}
}//end namespace drawerbase
/*! \brief A rectangle containing a list of strings from which the user can select. This widget contain a list of \a categories, with in turn contain \a items.
/*! \brief A rectangle containing a list of strings from which the user can select. This widget contain a list of \a categories, with in turn contain a list of \a items.
A category is a text with can be \a selected, \a checked and \a expanded to show the items.
An item is formed by \a column-fields, each corresponding to one of the \a headers.
An item can be \a selected and \a checked.
The user can \a drag the header to \a reisize it or to \a reorganize it.
By \a clicking on a header the list get \a reordered, first up, and then down alternatively,
By \a clicking on a header the list get \a reordered, first up, and then down alternatively.
*/
class listbox
: public widget_object<category::widget_tag, drawerbase::listbox::trigger, drawerbase::listbox::listbox_events, drawerbase::listbox::scheme>,
@ -474,6 +490,8 @@ By \a clicking on a header the list get \a reordered, first up, and then down al
void auto_draw(bool); ///<Set state: Redraw automatically after an operation?
void append_header(nana::string, unsigned width = 120);///<Appends a new column with a header text and the specified width at the end
listbox& header_width(size_type pos, unsigned pixels);
unsigned header_width(size_type pos) const;
cat_proxy append(nana::string); ///<Appends a new category at the end
void append(std::initializer_list<nana::string>); ///<Appends categories at the end
@ -505,7 +523,7 @@ By \a clicking on a header the list get \a reordered, first up, and then down al
return cat_proxy(&_m_ess(), _m_at_key(p));
}
item_proxy at(const index_pair&) const;
item_proxy at(const index_pair &abs_pos) const;
void insert(const index_pair&, nana::string); ///<Insert a new item with a text in the first column.
@ -534,20 +552,23 @@ By \a clicking on a header the list get \a reordered, first up, and then down al
_m_ease_key(&key);
}
///Sets a strick weak ordering comparer for a column
///Sets a strict weak ordering comparer for a column
void set_sort_compare(size_type col, std::function<bool(const nana::string&, nana::any*,
const nana::string&, nana::any*, bool reverse)> strick_ordering);
void sort_col(size_type col, bool reverse = false);
/// sort() and ivalidate any existing reference from display position to absolute item, that is: after sort() display offset point to different items
void sort_col(size_type col, bool reverse = false);
size_type sort_col() const;
void unsort();
/// potencially ivalidate any existing reference from display position to absolute item, that is: after sort() display offset point to different items
void unsort();
bool freeze_sort(bool freeze);
selection selected() const; ///<Get the indexs of all the selected items
selection selected() const; ///<Get the absolute indexs of all the selected items
void show_header(bool);
bool visible_header() const;
void move_select(bool upwards); ///<Selects an item besides the current selected item.
void move_select(bool upwards); ///<Selects an item besides the current selected item in the display.
size_type size_categ() const; ///<Get the number of categories
size_type size_item() const; ///<The number of items in the default category

View File

@ -49,17 +49,17 @@ namespace nana
struct metrics_type
{
typedef std::size_t size_type;
using size_type = std::size_t ;
size_type peak;
size_type range;
size_type step;
size_type value;
size_type peak; ///< the whole total
size_type range; ///< how many is shonw on a page, that is, How many to scroll after click on first or second
size_type step; ///< how many to scroll by click in forward or backward
size_type value; ///< current offset calculated from the very beginnig
buttons what;
bool pressed;
size_type scroll_length;
int scroll_pos;
size_type scroll_length; ///< the lenght in pixels of the central button show how many of the total (peak) is shonw (range)
int scroll_pos; ///< in pixels, and correspond to the offsset from the very beginning (value)
int scroll_mouse_offset;
metrics_type();
@ -74,7 +74,7 @@ namespace nana
};
typedef nana::paint::graphics& graph_reference;
const static unsigned fixedsize = 16;
const static unsigned fixedsize = 16; // make it part of a new "metric" in the widget_scheme
drawer(metrics_type& m);
void set_vertical(bool);
@ -333,7 +333,7 @@ namespace nana
/// Provides a way to display an object which is larger than the window's client area.
template<bool Vertical>
class scroll
class scroll // add a widget scheme?
: public widget_object<category::widget_tag, drawerbase::scroll::trigger<Vertical>, drawerbase::scroll::scroll_events<Vertical>>
{
typedef widget_object<category::widget_tag, drawerbase::scroll::trigger<Vertical> > base_type;
@ -345,29 +345,29 @@ namespace nana
/// \brief The construct that creates a widget.
/// @param wd A handle to the parent window of the widget being created.
/// @param visible specifying the visible after creating.
/// @param visible specify the visibility after creation.
scroll(window wd, bool visible)
{
this->create(wd, rectangle(), visible);
this->create(wd, rectangle(), visible); // add a widget scheme? and take some colors from these wd?
}
/// \brief The construct that creates a widget.
/// @param wd A handle to the parent window of the widget being created.
/// @param r the size and position of the widget in its parent window coordinate.
/// @param visible specifying the visible after creating.
/// @param visible specify the visibility after creation.
scroll(window wd, const rectangle& r, bool visible = true)
{
this->create(wd, r, visible);
}
/// \brief Determines whether it is scrollable.
/// @param for_less whether it can be scrolled for a less value.
/// @param for_less whether it can be scrolled for a less value (backward or "up" if true, forward or "down" if false).
bool scrollable(bool for_less) const
{
auto & m = this->get_drawer_trigger().metrics();
return (for_less ? (0 != m.value) : (m.value < m.peak - m.range));
}
/// the whole total (peak)
size_type amount() const
{
return this->get_drawer_trigger().metrics().peak;
@ -378,7 +378,7 @@ namespace nana
return this->get_drawer_trigger().peak(Max);
}
/// Get the range of the widget.
/// Get the range of the widget (how many is shonw on a page, that is, How many to scroll after click on first or second)
size_type range() const
{
return this->get_drawer_trigger().metrics().range;
@ -390,7 +390,7 @@ namespace nana
return this->get_drawer_trigger().range(r);
}
/// \brief Get the value.
/// \brief Get the value (current offset calculated from the very beginnig)
/// @return the value.
size_type value() const
{
@ -419,12 +419,12 @@ namespace nana
return this->get_drawer_trigger().step(s);
}
/// \brief Increase/decrease values by a step.
/// \brief Increase/decrease values by a step (alternativelly by some number of steps).
/// @param forward it determines whether increase or decrease.
/// @return true if the value is changed.
bool make_step(bool forward)
bool make_step(bool forward, unsigned steps=1)
{
if(this->get_drawer_trigger().make_step(forward, 1))
if(this->get_drawer_trigger().make_step(forward, steps))
{
API::refresh_window(this->handle());
return true;
@ -437,13 +437,27 @@ namespace nana
/// @return true if the vlaue is changed.
bool make_scroll(bool forward)
{
if(this->get_drawer_trigger().make_step(forward, 3))
if(this->get_drawer_trigger().make_step(forward, 3)) // set this 3 in the metrics of the widget scheme ?
{
API::refresh_window(this->handle());
return true;
}
return false;
}
/// \brief Increase/decrease values by a page as if it is scrolled page up.
/// @param forward it determines whether increase or decrease.
/// @return true if the vlaue is changed.
bool make_page_scroll(bool forward)
{
if(this->get_drawer_trigger().make_step(forward, range()-1))
{
API::refresh_window(this->handle());
return true;
}
return false;
}
};//end class scroll
}//end namespace nana
#endif

File diff suppressed because it is too large Load Diff

View File

@ -122,14 +122,14 @@ namespace nana
if(metrics_.value <= metrics_.range)
metrics_.value = 0;
else
metrics_.value -= metrics_.range;
metrics_.value -= (metrics_.range-1);
}
else if(buttons::backward == metrics_.what)
{
if(metrics_.peak - metrics_.range - metrics_.value <= metrics_.range)
metrics_.value = metrics_.peak - metrics_.range;
else
metrics_.value += metrics_.range;
metrics_.value += (metrics_.range-1);
}
}
}