whee! functionality

This commit is contained in:
Cary Sandvig 2000-11-14 23:24:32 +00:00
parent 8ea95d6633
commit 2c9655669b
13 changed files with 209 additions and 63 deletions

View File

@ -157,3 +157,15 @@ INLINE const string& GuiButton::get_down_rollover_event(void) const {
INLINE const string& GuiButton::get_inactive_event(void) const {
return _inactive_event;
}
INLINE void GuiButton::set_up_rollover(GuiLabel* upr) {
_up_rollover = upr;
if (_up_rollover_event.empty())
_up_rollover_event = this->get_name() + "-up-rollover";
}
INLINE void GuiButton::set_down_rollover(GuiLabel* downr) {
_down_rollover = downr;
if (_down_rollover_event.empty())
_down_rollover_event = this->get_name() + "-down-rollover";
}

View File

@ -159,6 +159,14 @@ void GuiButton::switch_state(GuiButton::States nstate) {
void GuiButton::recompute_frame(void) {
GuiItem::recompute_frame();
_up->recompute();
_down->recompute();
if (_up_rollover != (GuiLabel*)0L)
_up_rollover->recompute();
if (_down_rollover != (GuiLabel*)0L)
_down_rollover->recompute();
if (_inactive != (GuiLabel*)0L)
_inactive->recompute();
GetExtents(_up, _down, _up_rollover, _down_rollover, _inactive, _left,
_right, _bottom, _top);
_rgn->set_region(_left, _right, _bottom, _top);

View File

@ -67,6 +67,9 @@ public:
INLINE const string& get_down_rollover_event(void) const;
INLINE const string& get_inactive_event(void) const;
INLINE void set_up_rollover(GuiLabel*);
INLINE void set_down_rollover(GuiLabel*);
virtual void set_scale(float);
virtual void set_pos(const LVector3f&);

View File

@ -28,9 +28,10 @@ void GuiFrame::recompute_frame(void) {
// and brute-force algorithm. Hopefully it will be replaced with something
// more ellegant later
for (i=_items.begin(); i!=_items.end(); ++i) {
GuiItem* here = (*i).get_item();
here->recompute();
int n = (*i).get_num_links();
if (n > 0) {
GuiItem* here = (*i).get_item();
LVector4f ext_h = here->get_frame();
LVector3f pos_h = here->get_pos();
for (int j=0; j<n; ++j) {
@ -38,12 +39,13 @@ void GuiFrame::recompute_frame(void) {
if (pack == NONE)
continue;
GuiItem* to = (*i).get_nth_to(j);
float gap = (*i).get_nth_gap(j);
LVector4f ext_t = to->get_frame();
switch (pack) {
case ABOVE:
{
// to(top) - here(bottom)
float diff = ext_t[3] - ext_h[2];
float diff = ext_t[3] - ext_h[2] + gap;
LVector3f move = LVector3f::rfu(0., 0., diff);
here->set_pos(pos_h + move);
ext_h = here->get_frame();
@ -53,7 +55,7 @@ void GuiFrame::recompute_frame(void) {
case UNDER:
{
// to(bottom) - here(top)
float diff = ext_t[2] - ext_h[3];
float diff = ext_t[2] - ext_h[3] - gap;
LVector3f move = LVector3f::rfu(0., 0., diff);
here->set_pos(pos_h + move);
ext_h = here->get_frame();
@ -63,7 +65,7 @@ void GuiFrame::recompute_frame(void) {
case LEFT:
{
// to(left) - here(right)
float diff = ext_t[0] - ext_h[1];
float diff = ext_t[0] - ext_h[1] - gap;
LVector3f move = LVector3f::rfu(diff, 0., 0.);
here->set_pos(pos_h + move);
ext_h = here->get_frame();
@ -73,7 +75,47 @@ void GuiFrame::recompute_frame(void) {
case RIGHT:
{
// to(right) - here(left)
float diff = ext_t[1] - ext_h[0];
float diff = ext_t[1] - ext_h[0] + gap;
LVector3f move = LVector3f::rfu(diff, 0., 0.);
here->set_pos(pos_h + move);
ext_h = here->get_frame();
pos_h = here->get_pos();
}
break;
case ALIGN_ABOVE:
{
// to(top) - here(top)
float diff = ext_t[3] - ext_h[3];
LVector3f move = LVector3f::rfu(0., 0., diff);
here->set_pos(pos_h + move);
ext_h = here->get_frame();
pos_h = here->get_pos();
}
break;
case ALIGN_UNDER:
{
// to(bottom) - here(bottom)
float diff = ext_t[2] - ext_h[2];
LVector3f move = LVector3f::rfu(0., 0., diff);
here->set_pos(pos_h + move);
ext_h = here->get_frame();
pos_h = here->get_pos();
}
break;
case ALIGN_LEFT:
{
// to(left) - here(left)
float diff = ext_t[0] - ext_h[0];
LVector3f move = LVector3f::rfu(diff, 0., 0.);
here->set_pos(pos_h + move);
ext_h = here->get_frame();
pos_h = here->get_pos();
}
break;
case ALIGN_RIGHT:
{
// to(right) - here(right)
float diff = ext_t[1] - ext_h[1];
LVector3f move = LVector3f::rfu(diff, 0., 0.);
here->set_pos(pos_h + move);
ext_h = here->get_frame();

View File

@ -12,7 +12,8 @@
class EXPCL_PANDA GuiFrame : public GuiItem {
public:
enum Packing { NONE, ABOVE, UNDER, LEFT, RIGHT };
enum Packing { NONE, ABOVE, UNDER, LEFT, RIGHT, ALIGN_ABOVE, ALIGN_UNDER,
ALIGN_LEFT, ALIGN_RIGHT };
private:
class Connection {
private:
@ -58,6 +59,7 @@ private:
inline int get_num_links(void) const { return _links.size(); }
inline Packing get_nth_packing(int n) const { return _links[n].get_how(); }
inline GuiItem* get_nth_to(int n) const { return _links[n].get_who(); }
inline float get_nth_gap(int n) const { return _links[n].get_gap(); }
inline void erase_nth_link(int n) { _links.erase(_links.begin() + n); }
inline void erase_all_links(void) { _links.clear(); }

View File

@ -34,6 +34,10 @@ INLINE LVector4f GuiItem::get_frame(void) const {
return LVector4f(_left, _right, _bottom, _top);
}
INLINE void GuiItem::recompute(void) {
this->recompute_frame();
}
INLINE ostream& operator<<(ostream& os, GuiItem& item) {
item.output(os);
return os;

View File

@ -37,6 +37,8 @@ public:
INLINE float get_top(void) const;
INLINE LVector4f get_frame(void) const;
INLINE void recompute(void);
virtual void output(ostream&) const = 0;
public:
// type interface

View File

@ -88,3 +88,7 @@ INLINE Colorf GuiLabel::get_foreground_color(void) const {
INLINE Colorf GuiLabel::get_background_color(void) const {
return _background;
}
INLINE void GuiLabel::recompute(void) {
this->recompute_transform();
}

View File

@ -43,8 +43,6 @@ void GuiLabel::set_properties(void) {
n->set_text_color(_foreground);
if (!_have_background) {
n->clear_card();
if (gui_cat->is_debug())
gui_cat->debug() << "cleared card" << endl;
} else {
n->set_card_color(_background);
if (_have_width || _have_height) {
@ -52,35 +50,20 @@ void GuiLabel::set_properties(void) {
float w = v[1] - v[0];
float h = v[3] - v[2];
if (_have_width) {
gui_cat->debug() << "adjusting width: before = " << w;
w = _width - w;
gui_cat->debug(false) << " diff = " << w;
w *= 0.5;
v[1] += w;
v[0] -= w;
gui_cat->debug(false) << " after = " << (v[1] - v[0])
<< " want = " << _width << endl;
}
if (_have_height) {
gui_cat->debug() << "adjusting height: before = " << h;
h = _height - h;
gui_cat->debug(false) << " diff = " << h;
h *= 0.5;
v[3] += h;
v[2] -= h;
gui_cat->debug(false) << " after = " << (v[3] - v[2])
<< " want = " << _height << endl;
}
n->set_card_actual(v[0], v[1], v[2], v[3]);
} else
n->set_card_as_margin(0., 0., 0., 0.);
if (gui_cat->is_debug()) {
gui_cat->debug() << "set card color" << endl;
if (n->has_card())
gui_cat->debug() << ".. and a card was made" << endl;
else
gui_cat->debug() << ".. but there is no card" << endl;
}
}
}
break;
@ -257,11 +240,5 @@ void GuiLabel::set_background_color(const Colorf& color) {
_background = color;
_have_background = (color != zero);
if (gui_cat->is_debug()) {
if (_have_background)
gui_cat->debug() << "setting background" << endl;
else
gui_cat->debug() << "setting no background" << endl;
}
set_properties();
}

View File

@ -74,6 +74,8 @@ public:
INLINE Colorf get_foreground_color(void) const;
INLINE Colorf get_background_color(void) const;
INLINE void recompute(void);
public:
// type interface
static TypeHandle get_class_type(void) {

View File

@ -36,6 +36,8 @@ static void exit_rollover(CPT_Event e) {
void GuiRollover::recompute_frame(void) {
GuiItem::recompute_frame();
_off->recompute();
_on->recompute();
GetExtents(_off, _on, _left, _right, _bottom, _top);
_rgn->set_region(_left, _right, _bottom, _top);
}

View File

@ -10,6 +10,7 @@ TypeHandle GuiSign::_type_handle;
void GuiSign::recompute_frame(void) {
GuiItem::recompute_frame();
_sign->recompute();
_sign->get_extents(_left, _right, _bottom, _top);
}

View File

@ -51,7 +51,7 @@
extern PT(GeomNode) geomnode;
extern RenderRelation* first_arc;
static PT(GuiFrame) global_frame;
// static PT(GuiFrame) global_frame;
static void setup_gui(void) {
GuiManager* mgr = GuiManager::get_ptr(main_win, mak);
@ -165,35 +165,127 @@ static void setup_gui(void) {
// f1->manage(mgr, event_handler);
// cerr << *f1;
// test 5
GuiLabel* l1 = GuiLabel::make_simple_text_label("on", font);
GuiLabel* l2 = GuiLabel::make_simple_text_label("off", font);
GuiLabel* l3 = GuiLabel::make_simple_text_label("over", font);
GuiLabel* l4 = GuiLabel::make_simple_text_label("easy", font);
l1->set_background_color(1., 1., 1., 0.3);
l2->set_background_color(1., 1., 1., 0.3);
l3->set_background_color(1., 1., 1., 0.3);
l4->set_background_color(1., 1., 1., 0.3);
GuiRollover* r1 = new GuiRollover("r1", l1, l2);
GuiRollover* r2 = new GuiRollover("r2", l3, l4);
GuiFrame* f1 = new GuiFrame("test5");
f1->add_item(r1);
f1->add_item(r2);
f1->pack_item(r2, GuiFrame::UNDER, r1);
f1->set_scale(0.1);
f1->manage(mgr, event_handler);
float w1, w2, w3, w4, w;
w1 = l1->get_width();
w2 = l2->get_width();
w3 = l3->get_width();
w4 = l4->get_width();
// GuiLabel* l1 = GuiLabel::make_simple_text_label("on", font);
// GuiLabel* l2 = GuiLabel::make_simple_text_label("off", font);
// GuiLabel* l3 = GuiLabel::make_simple_text_label("over", font);
// GuiLabel* l4 = GuiLabel::make_simple_text_label("easy", font);
// l1->set_background_color(1., 1., 1., 0.3);
// l2->set_background_color(1., 1., 1., 0.3);
// l3->set_background_color(1., 1., 1., 0.3);
// l4->set_background_color(1., 1., 1., 0.3);
// GuiRollover* r1 = new GuiRollover("r1", l1, l2);
// GuiRollover* r2 = new GuiRollover("r2", l3, l4);
// GuiFrame* f1 = new GuiFrame("test5");
// f1->add_item(r1);
// f1->add_item(r2);
// f1->pack_item(r2, GuiFrame::UNDER, r1);
// f1->set_scale(0.1);
// f1->manage(mgr, event_handler);
// float w1, w2, w3, w4, w;
// w1 = l1->get_width();
// w2 = l2->get_width();
// w3 = l3->get_width();
// w4 = l4->get_width();
// w = (w1>w2)?w1:w2;
// w = (w>w3)?w:w3;
// w = (w>w4)?w:w4;
// l1->set_width(w);
// l2->set_width(w);
// l3->set_width(w);
// l4->set_width(w);
// global_frame = f1;
// test 6 (the greg test)
GuiFrame* f1 = new GuiFrame("canids");
GuiLabel* b1l1 = GuiLabel::make_simple_text_label("dingo", font);
b1l1->set_foreground_color(0., 0., 0., 1.);
b1l1->set_background_color(1., 1., 1., 1.);
GuiLabel* b1l2 = GuiLabel::make_simple_text_label("dingo", font);
b1l2->set_foreground_color(0., 0., 0., 1.);
b1l2->set_background_color(1., 1., 0., 1.);
GuiLabel* b1l3 = GuiLabel::make_simple_text_label("dingo", font);
b1l3->set_foreground_color(1., 1., 1., 1.);
b1l3->set_background_color(0., 0., 0., 1.);
GuiButton* b1 = new GuiButton("dingo", b1l1, b1l2, b1l3, b1l3, b1l1);
b1->set_scale(0.1);
f1->add_item(b1);
GuiLabel* b2l1 = GuiLabel::make_simple_text_label("jackel", font);
b2l1->set_foreground_color(0., 0., 0., 1.);
b2l1->set_background_color(1., 1., 1., 1.);
GuiLabel* b2l2 = GuiLabel::make_simple_text_label("jackel", font);
b2l2->set_foreground_color(0., 0., 0., 1.);
b2l2->set_background_color(1., 1., 0., 1.);
GuiLabel* b2l3 = GuiLabel::make_simple_text_label("jackel", font);
b2l3->set_foreground_color(1., 1., 1., 1.);
b2l3->set_background_color(0., 0., 0., 1.);
GuiButton* b2 = new GuiButton("jackel", b2l1, b2l2, b2l3, b2l3, b2l1);
b2->set_scale(0.1);
f1->add_item(b2);
GuiLabel* b3l1 = GuiLabel::make_simple_text_label("hyena", font);
b3l1->set_foreground_color(0., 0., 0., 1.);
b3l1->set_background_color(1., 1., 1., 1.);
GuiLabel* b3l2 = GuiLabel::make_simple_text_label("hyena", font);
b3l2->set_foreground_color(0., 0., 0., 1.);
b3l2->set_background_color(1., 1., 0., 1.);
GuiLabel* b3l3 = GuiLabel::make_simple_text_label("hyena", font);
b3l3->set_foreground_color(1., 1., 1., 1.);
b3l3->set_background_color(0., 0., 0., 1.);
GuiButton* b3 = new GuiButton("hyena", b3l1, b3l2, b3l3, b3l3, b3l1);
b3->set_scale(0.1);
f1->add_item(b3);
GuiLabel* b4l1 = GuiLabel::make_simple_text_label("wolf", font);
b4l1->set_foreground_color(0., 0., 0., 1.);
b4l1->set_background_color(1., 1., 1., 1.);
GuiLabel* b4l2 = GuiLabel::make_simple_text_label("wolf", font);
b4l2->set_foreground_color(0., 0., 0., 1.);
b4l2->set_background_color(1., 1., 0., 1.);
GuiLabel* b4l3 = GuiLabel::make_simple_text_label("wolf", font);
b4l3->set_foreground_color(1., 1., 1., 1.);
b4l3->set_background_color(0., 0., 0., 1.);
GuiButton* b4 = new GuiButton("wolf", b4l1, b4l2, b4l3, b4l3, b4l1);
b4->set_scale(0.1);
f1->add_item(b4);
GuiLabel* b5l1 = GuiLabel::make_simple_text_label("fox", font);
b5l1->set_foreground_color(0., 0., 0., 1.);
b5l1->set_background_color(1., 1., 1., 1.);
GuiLabel* b5l2 = GuiLabel::make_simple_text_label("fox", font);
b5l2->set_foreground_color(0., 0., 0., 1.);
b5l2->set_background_color(1., 1., 0., 1.);
GuiLabel* b5l3 = GuiLabel::make_simple_text_label("fox", font);
b5l3->set_foreground_color(1., 1., 1., 1.);
b5l3->set_background_color(0., 0., 0., 1.);
GuiButton* b5 = new GuiButton("fox", b5l1, b5l2, b5l3, b5l3, b5l1);
b5->set_scale(0.1);
f1->add_item(b5);
f1->pack_item(b2, GuiFrame::UNDER, b1);
f1->pack_item(b3, GuiFrame::UNDER, b2);
f1->pack_item(b4, GuiFrame::UNDER, b3);
f1->pack_item(b5, GuiFrame::UNDER, b4);
float w, w1, w2;
w1 = b1l1->get_width();
w2 = b2l1->get_width();
w = (w1>w2)?w1:w2;
w = (w>w3)?w:w3;
w = (w>w4)?w:w4;
l1->set_width(w);
l2->set_width(w);
l3->set_width(w);
l4->set_width(w);
global_frame = f1;
w2 = b3l1->get_width();
w = (w>w2)?w:w2;
w2 = b4l1->get_width();
w = (w>w2)?w:w2;
w2 = b5l1->get_width();
w = (w>w2)?w:w2;
b1l1->set_width(w);
b1l2->set_width(w);
b1l3->set_width(w);
b2l1->set_width(w);
b2l2->set_width(w);
b2l3->set_width(w);
b3l1->set_width(w);
b3l2->set_width(w);
b3l3->set_width(w);
b4l1->set_width(w);
b4l2->set_width(w);
b4l3->set_width(w);
b5l1->set_width(w);
b5l2->set_width(w);
b5l3->set_width(w);
f1->manage(mgr, event_handler);
}
static void event_2(CPT_Event) {
@ -204,16 +296,11 @@ static void event_2(CPT_Event) {
}
}
static void event_3(CPT_Event) {
global_frame = (GuiFrame*)0L;
}
void demo_keys(EventHandler&) {
new RenderRelation( lights, dlight );
have_dlight = true;
event_handler.add_hook("2", event_2);
event_handler.add_hook("3", event_3);
}
int main(int argc, char *argv[]) {