mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-05 03:15:07 -04:00
making priorities work better
This commit is contained in:
parent
6ff72bf4af
commit
be7c5c62d8
@ -21,12 +21,20 @@ void GuiBackground::set_priority(GuiLabel* l, const GuiItem::Priority p) {
|
|||||||
GuiBackground::GuiBackground(const string& name, GuiItem* item)
|
GuiBackground::GuiBackground(const string& name, GuiItem* item)
|
||||||
: GuiItem(name), _item(item) {
|
: GuiItem(name), _item(item) {
|
||||||
_bg = GuiLabel::make_simple_card_label();
|
_bg = GuiLabel::make_simple_card_label();
|
||||||
|
_bg->set_width(_item->get_width());
|
||||||
|
_bg->set_height(_item->get_height());
|
||||||
|
_bg->set_pos(LVector3f::rfu((_item->get_left() + _item->get_right())*0.5, 0.,
|
||||||
|
(_item->get_bottom() + _item->get_top())*0.5));
|
||||||
item->set_priority(_bg, P_High);
|
item->set_priority(_bg, P_High);
|
||||||
}
|
}
|
||||||
|
|
||||||
GuiBackground::GuiBackground(const string& name, GuiItem* item, Texture* tex)
|
GuiBackground::GuiBackground(const string& name, GuiItem* item, Texture* tex)
|
||||||
: GuiItem(name), _item(item) {
|
: GuiItem(name), _item(item) {
|
||||||
_bg = GuiLabel::make_simple_texture_label(tex);
|
_bg = GuiLabel::make_simple_texture_label(tex);
|
||||||
|
_bg->set_width(_item->get_width());
|
||||||
|
_bg->set_height(_item->get_height());
|
||||||
|
_bg->set_pos(LVector3f::rfu((_item->get_left() + _item->get_right())*0.5, 0.,
|
||||||
|
(_item->get_bottom() + _item->get_top())*0.5));
|
||||||
item->set_priority(_bg, P_High);
|
item->set_priority(_bg, P_High);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -38,10 +46,6 @@ void GuiBackground::manage(GuiManager* mgr, EventHandler& eh) {
|
|||||||
if (!_added_hooks)
|
if (!_added_hooks)
|
||||||
_added_hooks = true;
|
_added_hooks = true;
|
||||||
if (_mgr == (GuiManager*)0L) {
|
if (_mgr == (GuiManager*)0L) {
|
||||||
_bg->freeze();
|
|
||||||
_bg->set_width(_item->get_width());
|
|
||||||
_bg->set_height(_item->get_height());
|
|
||||||
_bg->thaw();
|
|
||||||
mgr->add_label(_bg);
|
mgr->add_label(_bg);
|
||||||
_item->manage(mgr, eh);
|
_item->manage(mgr, eh);
|
||||||
GuiItem::manage(mgr, eh);
|
GuiItem::manage(mgr, eh);
|
||||||
|
@ -23,9 +23,50 @@ void GuiChooser::ChooseFunctor::doit(GuiBehavior* b) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void GuiChooser::recompute_frame(void) {
|
void GuiChooser::recompute_frame(void) {
|
||||||
|
float r, l, t, b;
|
||||||
|
|
||||||
|
r = t = -1.;
|
||||||
|
l = b = 1.;
|
||||||
|
for (ItemVector::iterator i=_items.begin(); i!=_items.end(); ++i) {
|
||||||
|
if (r < (*i)->get_right())
|
||||||
|
r = (*i)->get_right();
|
||||||
|
if (l > (*i)->get_left())
|
||||||
|
l = (*i)->get_left();
|
||||||
|
if (b > (*i)->get_bottom())
|
||||||
|
b = (*i)->get_bottom();
|
||||||
|
if (t < (*i)->get_top())
|
||||||
|
t = (*i)->get_top();
|
||||||
|
}
|
||||||
|
if (r < _prev_button->get_right())
|
||||||
|
r = _prev_button->get_right();
|
||||||
|
if (l > _prev_button->get_left())
|
||||||
|
l = _prev_button->get_left();
|
||||||
|
if (b > _prev_button->get_bottom())
|
||||||
|
b = _prev_button->get_bottom();
|
||||||
|
if (t < _prev_button->get_top())
|
||||||
|
t = _prev_button->get_top();
|
||||||
|
if (r < _next_button->get_right())
|
||||||
|
r = _next_button->get_right();
|
||||||
|
if (l > _next_button->get_left())
|
||||||
|
l = _next_button->get_left();
|
||||||
|
if (b > _next_button->get_bottom())
|
||||||
|
b = _next_button->get_bottom();
|
||||||
|
if (t < _next_button->get_top())
|
||||||
|
t = _next_button->get_top();
|
||||||
|
|
||||||
|
_left = l;
|
||||||
|
_right = r;
|
||||||
|
_bottom = b;
|
||||||
|
_top = t;
|
||||||
|
|
||||||
|
GuiBehavior::recompute_frame();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GuiChooser::set_priority(GuiLabel*, GuiItem::Priority) {
|
void GuiChooser::set_priority(GuiLabel* l, GuiItem::Priority p) {
|
||||||
|
for (ItemVector::iterator i=_items.begin(); i!=_items.end(); ++i)
|
||||||
|
(*i)->set_priority(l, p);
|
||||||
|
_prev_button->set_priority(l, p);
|
||||||
|
_next_button->set_priority(l, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
GuiChooser::GuiChooser(const string& name, GuiButton* prev, GuiButton* next)
|
GuiChooser::GuiChooser(const string& name, GuiButton* prev, GuiButton* next)
|
||||||
@ -72,6 +113,8 @@ void GuiChooser::move_prev(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
_curr = tmp;
|
_curr = tmp;
|
||||||
|
if (_mgr != (GuiManager*)0L)
|
||||||
|
_mgr->recompute_priorities();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GuiChooser::move_next(void) {
|
void GuiChooser::move_next(void) {
|
||||||
@ -109,12 +152,15 @@ void GuiChooser::move_next(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
_curr = tmp;
|
_curr = tmp;
|
||||||
|
if (_mgr != (GuiManager*)0L)
|
||||||
|
_mgr->recompute_priorities();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GuiChooser::add_item(GuiItem* item) {
|
void GuiChooser::add_item(GuiItem* item) {
|
||||||
_items.push_back(item);
|
_items.push_back(item);
|
||||||
if (_curr == -1)
|
if (_curr == -1)
|
||||||
_curr = 0;
|
_curr = 0;
|
||||||
|
this->recompute_frame();
|
||||||
}
|
}
|
||||||
|
|
||||||
int GuiChooser::freeze(void) {
|
int GuiChooser::freeze(void) {
|
||||||
|
@ -210,7 +210,13 @@ void GuiFrame::recompute_frame(void) {
|
|||||||
thaw();
|
thaw();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GuiFrame::set_priority(GuiLabel*, const GuiItem::Priority) {
|
void GuiFrame::set_priority(GuiLabel* l, const GuiItem::Priority p) {
|
||||||
|
Boxes::iterator i;
|
||||||
|
|
||||||
|
for (i=_items.begin(); i!=_items.end(); ++i) {
|
||||||
|
GuiItem* here = (*i).get_item();
|
||||||
|
here->set_priority(l, p);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GuiFrame::GuiFrame(const string& name) : GuiItem(name), _align_to_left(false),
|
GuiFrame::GuiFrame(const string& name) : GuiItem(name), _align_to_left(false),
|
||||||
|
@ -376,6 +376,8 @@ void GuiLabel::set_text(const string& val) {
|
|||||||
bool GuiLabel::operator<(const GuiLabel& c) const {
|
bool GuiLabel::operator<(const GuiLabel& c) const {
|
||||||
if (_highest_pri)
|
if (_highest_pri)
|
||||||
return false;
|
return false;
|
||||||
|
if (c._highest_pri)
|
||||||
|
return true;
|
||||||
PriorityMap::const_iterator pi;
|
PriorityMap::const_iterator pi;
|
||||||
pi = _priorities.find((GuiLabel*)(&c));
|
pi = _priorities.find((GuiLabel*)(&c));
|
||||||
if (pi != _priorities.end()) {
|
if (pi != _priorities.end()) {
|
||||||
@ -384,5 +386,41 @@ bool GuiLabel::operator<(const GuiLabel& c) const {
|
|||||||
else
|
else
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
pi = c._priorities.find((GuiLabel*)this);
|
||||||
|
if (pi != c._priorities.end()) {
|
||||||
|
if ((*pi).second == P_LOWER)
|
||||||
|
return false;
|
||||||
|
else
|
||||||
|
return true;
|
||||||
|
}
|
||||||
return ((void*)this) < ((void*)&c);
|
return ((void*)this) < ((void*)&c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#include <geomBinTransition.h>
|
||||||
|
|
||||||
|
int GuiLabel::set_draw_order(int order) {
|
||||||
|
int ret = order+1;
|
||||||
|
this->freeze();
|
||||||
|
_hard_pri = order;
|
||||||
|
switch (_type) {
|
||||||
|
case SIMPLE_TEXT:
|
||||||
|
{
|
||||||
|
TextNode* n = DCAST(TextNode, _geom);
|
||||||
|
n->set_bin("fixed");
|
||||||
|
n->set_draw_order(order);
|
||||||
|
ret += 2;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SIMPLE_TEXTURE:
|
||||||
|
_arc->set_transition(new GeomBinTransition("fixed", order));
|
||||||
|
break;
|
||||||
|
case SIMPLE_CARD:
|
||||||
|
_arc->set_transition(new GeomBinTransition("fixed", order));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
gui_cat->warning() << "trying to set draw order on an unknown label type ("
|
||||||
|
<< (int)_type << ")" << endl;
|
||||||
|
}
|
||||||
|
this->thaw();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
@ -101,6 +101,7 @@ PUBLISHED:
|
|||||||
// used for the priority system
|
// used for the priority system
|
||||||
bool operator<(const GuiLabel&) const;
|
bool operator<(const GuiLabel&) const;
|
||||||
INLINE void set_priority(GuiLabel*, const PriorityType);
|
INLINE void set_priority(GuiLabel*, const PriorityType);
|
||||||
|
int set_draw_order(int);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// type interface
|
// type interface
|
||||||
|
@ -126,6 +126,32 @@ void GuiListBox::visible_patching(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void GuiListBox::set_priority(GuiLabel* l, const GuiItem::Priority p) {
|
void GuiListBox::set_priority(GuiLabel* l, const GuiItem::Priority p) {
|
||||||
|
ItemVector::iterator i;
|
||||||
|
ItemDeque::iterator j;
|
||||||
|
|
||||||
|
for (i=_top_stack.begin(); i!=_top_stack.end(); ++i) {
|
||||||
|
if (*i == _up_arrow)
|
||||||
|
continue;
|
||||||
|
if (*i == _down_arrow)
|
||||||
|
continue;
|
||||||
|
(*i)->set_priority(l, p);
|
||||||
|
}
|
||||||
|
for (i=_visible.begin(); i!=_visible.end(); ++i) {
|
||||||
|
if (*i == _up_arrow)
|
||||||
|
continue;
|
||||||
|
if (*i == _down_arrow)
|
||||||
|
continue;
|
||||||
|
(*i)->set_priority(l, p);
|
||||||
|
}
|
||||||
|
for (j=_bottom_stack.begin(); j!=_bottom_stack.end(); ++j) {
|
||||||
|
if (*j == _up_arrow)
|
||||||
|
continue;
|
||||||
|
if (*j == _down_arrow)
|
||||||
|
continue;
|
||||||
|
(*j)->set_priority(l, p);
|
||||||
|
}
|
||||||
|
_up_arrow->set_priority(l, p);
|
||||||
|
_down_arrow->set_priority(l, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
GuiListBox::GuiListBox(const string& name, int N, GuiItem* up, GuiItem* down)
|
GuiListBox::GuiListBox(const string& name, int N, GuiItem* up, GuiItem* down)
|
||||||
@ -170,6 +196,8 @@ void GuiListBox::scroll_down(void) {
|
|||||||
visible_patching();
|
visible_patching();
|
||||||
// finally recompute all the possitions
|
// finally recompute all the possitions
|
||||||
this->recompute_frame();
|
this->recompute_frame();
|
||||||
|
if (_mgr != (GuiManager*)0L)
|
||||||
|
_mgr->recompute_priorities();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GuiListBox::scroll_up(void) {
|
void GuiListBox::scroll_up(void) {
|
||||||
@ -198,6 +226,8 @@ void GuiListBox::scroll_up(void) {
|
|||||||
visible_patching();
|
visible_patching();
|
||||||
// finally recompute all the possitions
|
// finally recompute all the possitions
|
||||||
this->recompute_frame();
|
this->recompute_frame();
|
||||||
|
if (_mgr != (GuiManager*)0L)
|
||||||
|
_mgr->recompute_priorities();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GuiListBox::add_item(GuiItem* item) {
|
void GuiListBox::add_item(GuiItem* item) {
|
||||||
|
@ -177,15 +177,12 @@ void GuiManager::remove_label(GuiLabel* label) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#include <geomBinTransition.h>
|
|
||||||
|
|
||||||
void GuiManager::recompute_priorities(void) {
|
void GuiManager::recompute_priorities(void) {
|
||||||
_sorts.clear();
|
_sorts.clear();
|
||||||
for (LabelSet::iterator i=_labels.begin(); i!=_labels.end(); ++i)
|
for (LabelSet::iterator i=_labels.begin(); i!=_labels.end(); ++i)
|
||||||
_sorts.insert(*i);
|
_sorts.insert(*i);
|
||||||
int p=0;
|
int p=0;
|
||||||
for (SortSet::iterator j=_sorts.begin(); j!=_sorts.end(); ++j, ++p) {
|
for (SortSet::iterator j=_sorts.begin(); j!=_sorts.end(); ++j) {
|
||||||
(*j)->_hard_pri = p;
|
p = (*j)->set_draw_order(p);
|
||||||
(*j)->get_arc()->set_transition(new GeomBinTransition("fixed", p));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -953,6 +953,7 @@ static void test16(GuiManager* mgr, Node* font) {
|
|||||||
bg->set_color(1., 0., 1., 1.);
|
bg->set_color(1., 0., 1., 1.);
|
||||||
bg->thaw();
|
bg->thaw();
|
||||||
bg->manage(mgr, event_handler);
|
bg->manage(mgr, event_handler);
|
||||||
|
mgr->recompute_priorities();
|
||||||
ch1->start_behavior();
|
ch1->start_behavior();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user