Merge branch 'hotfix-1.5.6' into develop-c++17
This commit is contained in:
commit
211433afdd
@ -329,6 +329,8 @@ namespace API
|
|||||||
void window_size(window, const size&);
|
void window_size(window, const size&);
|
||||||
size window_outline_size(window);
|
size window_outline_size(window);
|
||||||
void window_outline_size(window, const size&);
|
void window_outline_size(window, const size&);
|
||||||
|
|
||||||
|
nana::optional<rectangle> window_rectangle(window);
|
||||||
bool get_window_rectangle(window, rectangle&);
|
bool get_window_rectangle(window, rectangle&);
|
||||||
bool track_window_size(window, const size&, bool true_for_max); ///< Sets the minimum or maximum tracking size of a window.
|
bool track_window_size(window, const size&, bool true_for_max); ///< Sets the minimum or maximum tracking size of a window.
|
||||||
void window_enabled(window, bool);
|
void window_enabled(window, bool);
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* A List Box Implementation
|
* A List Box Implementation
|
||||||
* Nana C++ Library(http://www.nanapro.org)
|
* Nana C++ Library(http://www.nanapro.org)
|
||||||
* Copyright(C) 2003-2017 Jinhao(cnjinhao@hotmail.com)
|
* Copyright(C) 2003-2018 Jinhao(cnjinhao@hotmail.com)
|
||||||
*
|
*
|
||||||
* Distributed under the Boost Software License, Version 1.0.
|
* Distributed under the Boost Software License, Version 1.0.
|
||||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
|||||||
@ -398,7 +398,7 @@ namespace nana
|
|||||||
/// \brief The construct that creates a widget.
|
/// \brief The construct that creates a widget.
|
||||||
/// @param wd A handle to the parent window of the widget being created.
|
/// @param wd A handle to the parent window of the widget being created.
|
||||||
/// @param visible specify the visibility after creation.
|
/// @param visible specify the visibility after creation.
|
||||||
scroll(window wd, bool visible)
|
scroll(window wd, bool visible = true)
|
||||||
{
|
{
|
||||||
this->create(wd, rectangle(), visible); // add a widget scheme? and take some colors from these wd?
|
this->create(wd, rectangle(), visible); // add a widget scheme? and take some colors from these wd?
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* A Tabbar implementation
|
* A Tabbar implementation
|
||||||
* Nana C++ Library(http://www.nanapro.org)
|
* Nana C++ Library(http://www.nanapro.org)
|
||||||
* Copyright(C) 2003-2016 Jinhao(cnjinhao@hotmail.com)
|
* Copyright(C) 2003-2018 Jinhao(cnjinhao@hotmail.com)
|
||||||
*
|
*
|
||||||
* Distributed under the Boost Software License, Version 1.0.
|
* Distributed under the Boost Software License, Version 1.0.
|
||||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
@ -42,9 +42,8 @@ namespace nana
|
|||||||
: arg_tabbar<T>({wdg, v})
|
: arg_tabbar<T>({wdg, v})
|
||||||
{}
|
{}
|
||||||
|
|
||||||
bool remove = true; ///< determines whether to remove the item
|
mutable bool remove = true; ///< determines whether to remove the item
|
||||||
bool close_attach_window = true; ///< determines whether to close the attached window. It is ignored if remove is false
|
mutable bool close_attach_window = true; ///< determines whether to close the attached window. It is ignored if remove is false
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace drawerbase
|
namespace drawerbase
|
||||||
@ -293,7 +292,7 @@ namespace nana
|
|||||||
if (pos > length())
|
if (pos > length())
|
||||||
throw std::out_of_range("tabbar::insert invalid position");
|
throw std::out_of_range("tabbar::insert invalid position");
|
||||||
|
|
||||||
this->get_drawer_trigger().insert(pos, to_nstring(text), std::move(value));
|
this->get_drawer_trigger().insert(pos, to_nstring(std::move(text)), std::move(value));
|
||||||
API::update_window(*this);
|
API::update_window(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Window Layout Implementation
|
* Window Layout Implementation
|
||||||
* Nana C++ Library(http://www.nanapro.org)
|
* Nana C++ Library(http://www.nanapro.org)
|
||||||
* Copyright(C) 2003-2017 Jinhao(cnjinhao@hotmail.com)
|
* Copyright(C) 2003-2018 Jinhao(cnjinhao@hotmail.com)
|
||||||
*
|
*
|
||||||
* Distributed under the Boost Software License, Version 1.0.
|
* Distributed under the Boost Software License, Version 1.0.
|
||||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
@ -106,43 +106,46 @@ namespace nana
|
|||||||
|
|
||||||
visual = rectangle{ wd->pos_root, wd->dimension };
|
visual = rectangle{ wd->pos_root, wd->dimension };
|
||||||
|
|
||||||
if (wd->root_widget != wd)
|
if (category::flags::root != wd->other.category)
|
||||||
{
|
{
|
||||||
//Test if the root widget is overlapped the specified widget
|
//Test if the root widget is overlapped the specified widget
|
||||||
//the pos of root widget is (0, 0)
|
//the pos of root widget is (0, 0)
|
||||||
if (overlapped(visual, rectangle{ wd->root_widget->pos_owner, wd->root_widget->dimension }) == false)
|
if (overlapped(visual, rectangle{ wd->root_widget->pos_owner, wd->root_widget->dimension }) == false)
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
for (auto parent = wd->parent; parent; parent = parent->parent)
|
for (auto parent = wd->parent; parent; parent = parent->parent)
|
||||||
{
|
{
|
||||||
if (category::flags::root == parent->other.category)
|
if (category::flags::root == parent->other.category)
|
||||||
{
|
{
|
||||||
//visual rectangle of wd's parent
|
wd = parent;
|
||||||
rectangle vrt_parent{parent->pos_root, parent->dimension};
|
break;
|
||||||
|
|
||||||
point pos_root;
|
|
||||||
while (parent->parent)
|
|
||||||
{
|
|
||||||
pos_root -= native_interface::window_position(parent->root);
|
|
||||||
|
|
||||||
if (!overlap(rectangle{ pos_root, parent->parent->root_widget->dimension }, vrt_parent, vrt_parent))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
parent = parent->parent->root_widget;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!overlap(vrt_parent, visual, visual))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!overlap(rectangle{ parent->pos_root, parent->dimension }, visual, visual))
|
if (!overlap(rectangle{ parent->pos_root, parent->dimension }, visual, visual))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Now, wd actually is the root widget of original parameter wd
|
||||||
|
if (nullptr == wd->parent)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
auto parent_rw = wd->parent->root_widget;
|
||||||
|
//visual rectangle of wd's parent
|
||||||
|
rectangle vrt_parent{ parent_rw->pos_root, parent_rw->dimension };
|
||||||
|
|
||||||
|
point pos_root;
|
||||||
|
while (parent_rw->parent)
|
||||||
|
{
|
||||||
|
pos_root -= native_interface::window_position(parent_rw->root);
|
||||||
|
|
||||||
|
if (!overlap(rectangle{ pos_root, parent_rw->parent->root_widget->dimension }, vrt_parent, vrt_parent))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
parent_rw = parent_rw->parent->root_widget;
|
||||||
|
}
|
||||||
|
|
||||||
|
return overlap(vrt_parent, visual, visual);
|
||||||
}
|
}
|
||||||
|
|
||||||
//read_overlaps
|
//read_overlaps
|
||||||
@ -386,6 +389,13 @@ namespace nana
|
|||||||
nana::rectangle r_of_sigwd(sigwd->pos_root, sigwd->dimension);
|
nana::rectangle r_of_sigwd(sigwd->pos_root, sigwd->dimension);
|
||||||
for (auto wd : data_sect.effects_bground_windows)
|
for (auto wd : data_sect.effects_bground_windows)
|
||||||
{
|
{
|
||||||
|
//Don't notify the window if both native root windows are not same(e.g. wd and sigwd have
|
||||||
|
//a some parent). Otherwise, _m_paint_glass_window() recursively paints sigwd to make stack overflow.
|
||||||
|
//On the other hand, a nested root window is always floating on its parent's child widgets, it's unnecessary to
|
||||||
|
//notify the wd if they haven't a same native root window.
|
||||||
|
if (sigwd->root != wd->root)
|
||||||
|
continue;
|
||||||
|
|
||||||
if (wd == sigwd || !wd->displayed() ||
|
if (wd == sigwd || !wd->displayed() ||
|
||||||
(false == overlapped(nana::rectangle{ wd->pos_root, wd->dimension }, r_of_sigwd)))
|
(false == overlapped(nana::rectangle{ wd->pos_root, wd->dimension }, r_of_sigwd)))
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
@ -821,6 +821,15 @@ namespace API
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nana::optional<rectangle> window_rectangle(window wd)
|
||||||
|
{
|
||||||
|
auto iwd = reinterpret_cast<basic_window*>(wd);
|
||||||
|
internal_scope_guard lock;
|
||||||
|
if (restrict::wd_manager().available(iwd))
|
||||||
|
return rectangle(iwd->pos_owner, iwd->dimension);
|
||||||
|
return{};
|
||||||
|
}
|
||||||
|
|
||||||
bool get_window_rectangle(window wd, rectangle& r)
|
bool get_window_rectangle(window wd, rectangle& r)
|
||||||
{
|
{
|
||||||
auto iwd = reinterpret_cast<basic_window*>(wd);
|
auto iwd = reinterpret_cast<basic_window*>(wd);
|
||||||
|
|||||||
@ -208,8 +208,8 @@ namespace nana{
|
|||||||
outter[field_title] << impl_->caption;
|
outter[field_title] << impl_->caption;
|
||||||
outter.collocate();
|
outter.collocate();
|
||||||
|
|
||||||
|
impl_->caption.transparent(true);
|
||||||
color pbg = API::bgcolor(this->parent());
|
color pbg = API::bgcolor(this->parent());
|
||||||
|
|
||||||
impl_->caption.bgcolor(pbg.blend(colors::black, 0.025));
|
impl_->caption.bgcolor(pbg.blend(colors::black, 0.025));
|
||||||
|
|
||||||
this->bgcolor(pbg.blend(colors::black, 0.05));
|
this->bgcolor(pbg.blend(colors::black, 0.05));
|
||||||
@ -222,10 +222,27 @@ namespace nana{
|
|||||||
auto gap_px = impl_->gap - 1;
|
auto gap_px = impl_->gap - 1;
|
||||||
|
|
||||||
graph.rectangle(true, API::bgcolor(this->parent()));
|
graph.rectangle(true, API::bgcolor(this->parent()));
|
||||||
graph.round_rectangle(rectangle(point(gap_px, impl_->caption_dimension.height / 2),
|
|
||||||
nana::size(graph.width() - 2 * gap_px, graph.height() - impl_->caption_dimension.height / 2 - gap_px)
|
auto const top_round_line = static_cast<int>(impl_->caption_dimension.height) / 2;
|
||||||
|
|
||||||
|
graph.round_rectangle(rectangle(point(gap_px, top_round_line),
|
||||||
|
nana::size(graph.width() - 2 * gap_px, graph.height() - top_round_line - gap_px)
|
||||||
),
|
),
|
||||||
3, 3, colors::gray_border, true, this->bgcolor());
|
3, 3, colors::gray_border, true, this->bgcolor());
|
||||||
|
|
||||||
|
auto opt_r = API::window_rectangle(impl_->caption);
|
||||||
|
if (opt_r)
|
||||||
|
{
|
||||||
|
rectangle grad_r{ opt_r->position(), nana::size{ opt_r->width, static_cast<unsigned>(top_round_line - opt_r->y) } };
|
||||||
|
|
||||||
|
grad_r.y += top_round_line*2 / 3;
|
||||||
|
grad_r.x -= 2;
|
||||||
|
grad_r.width += 4;
|
||||||
|
|
||||||
|
graph.gradual_rectangle(grad_r,
|
||||||
|
API::bgcolor(this->parent()), this->bgcolor(), true
|
||||||
|
);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* A List Box Implementation
|
* A List Box Implementation
|
||||||
* Nana C++ Library(http://www.nanapro.org)
|
* Nana C++ Library(http://www.nanapro.org)
|
||||||
* Copyright(C) 2003-2017 Jinhao(cnjinhao@hotmail.com)
|
* Copyright(C) 2003-2018 Jinhao(cnjinhao@hotmail.com)
|
||||||
*
|
*
|
||||||
* Distributed under the Boost Software License, Version 1.0.
|
* Distributed under the Boost Software License, Version 1.0.
|
||||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
@ -1586,7 +1586,7 @@ namespace nana
|
|||||||
return pairs;
|
return pairs;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool select_for_all(bool sel, const index_pair& except = index_pair{npos, npos})
|
bool select_for_all(bool sel, const index_pair& except_abs = index_pair{npos, npos})
|
||||||
{
|
{
|
||||||
bool changed = false;
|
bool changed = false;
|
||||||
index_pair pos;
|
index_pair pos;
|
||||||
@ -1595,7 +1595,7 @@ namespace nana
|
|||||||
pos.item = 0;
|
pos.item = 0;
|
||||||
for(auto & m : cat.items)
|
for(auto & m : cat.items)
|
||||||
{
|
{
|
||||||
if (except != pos)
|
if (except_abs != pos)
|
||||||
{
|
{
|
||||||
if (m.flags.selected != sel)
|
if (m.flags.selected != sel)
|
||||||
{
|
{
|
||||||
@ -4150,12 +4150,12 @@ namespace nana
|
|||||||
//Unselects all selected items if the current item is not selected before selecting.
|
//Unselects all selected items if the current item is not selected before selecting.
|
||||||
auto selected = lister.pick_items(true);
|
auto selected = lister.pick_items(true);
|
||||||
if (selected.cend() == std::find(selected.cbegin(), selected.cend(), item_pos))
|
if (selected.cend() == std::find(selected.cbegin(), selected.cend(), item_pos))
|
||||||
lister.select_for_all(false, item_pos);
|
lister.select_for_all(false, abs_item_pos);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//Unselects all selected items except current item if right button clicked.
|
//Unselects all selected items except current item if right button clicked.
|
||||||
lister.select_for_all(false, item_pos); //cancel all selections
|
lister.select_for_all(false, abs_item_pos); //cancel all selections
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4662,12 +4662,12 @@ namespace nana
|
|||||||
|
|
||||||
bool item_proxy::operator==(const std::string& s) const
|
bool item_proxy::operator==(const std::string& s) const
|
||||||
{
|
{
|
||||||
return (text(pos_.item) == s);
|
return (text(0) == s);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool item_proxy::operator==(const std::wstring& s) const
|
bool item_proxy::operator==(const std::wstring& s) const
|
||||||
{
|
{
|
||||||
return (text(pos_.item) == to_utf8(s));
|
return (text(0) == to_utf8(s));
|
||||||
}
|
}
|
||||||
|
|
||||||
item_proxy & item_proxy::operator=(const item_proxy& rhs)
|
item_proxy & item_proxy::operator=(const item_proxy& rhs)
|
||||||
@ -5158,7 +5158,8 @@ namespace nana
|
|||||||
cat_->make_sort_order();
|
cat_->make_sort_order();
|
||||||
ess_->lister.sort();
|
ess_->lister.sort();
|
||||||
|
|
||||||
ess_->update(true);
|
//Don't ignore the auto-draw flag for performance enhancement.
|
||||||
|
ess_->update();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//end class cat_proxy
|
//end class cat_proxy
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* A Progress Indicator Implementation
|
* A Progress Indicator Implementation
|
||||||
* Copyright(C) 2003-2017 Jinhao(cnjinhao@hotmail.com)
|
* Copyright(C) 2003-2018 Jinhao(cnjinhao@hotmail.com)
|
||||||
*
|
*
|
||||||
* Distributed under the Boost Software License, Version 1.0.
|
* Distributed under the Boost Software License, Version 1.0.
|
||||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
@ -96,7 +96,11 @@ namespace nana
|
|||||||
{
|
{
|
||||||
if (widget_)
|
if (widget_)
|
||||||
{
|
{
|
||||||
auto value_px = (widget_->size().width - border_px * 2) * value_ / max_;
|
auto value_px = (widget_->size().width - border_px * 2);
|
||||||
|
|
||||||
|
//avoid overflow
|
||||||
|
if (value_ < max_)
|
||||||
|
value_px = static_cast<unsigned>(value_px * (double(value_) / double(max_)));
|
||||||
|
|
||||||
if (value_px != value_px_)
|
if (value_px != value_px_)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -91,7 +91,7 @@ namespace nana
|
|||||||
{
|
{
|
||||||
::jpeg_create_decompress(&jdstru);
|
::jpeg_create_decompress(&jdstru);
|
||||||
|
|
||||||
::jpeg_mem_src(&jdstru, const_cast<unsigned char*>(reinterpret_cast<const unsigned char*>(data)), bytes);
|
::jpeg_mem_src(&jdstru, const_cast<unsigned char*>(reinterpret_cast<const unsigned char*>(data)), static_cast<unsigned long>(bytes));
|
||||||
_m_read_jpg(jdstru);
|
_m_read_jpg(jdstru);
|
||||||
|
|
||||||
jpeg_finish_decompress(&jdstru);
|
jpeg_finish_decompress(&jdstru);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user