Article View: comp.windows.interviews
Article #449popup menu
From: Michael Hines
Date: Tue, 15 Sep 1992 20:59
Date: Tue, 15 Sep 1992 20:59
66 lines
1603 bytes
1603 bytes
It turned out to be not too difficult to implement the openlook type of
mouse menu button behavior. I am not sure, though, if it is important to
keep track of whether the events are grabbed.
-----------------------------
class PopupMenu : public Handler {
public:
PopupMenu();
virtual ~PopupMenu();
virtual boolean event(Event&);
void append_item(MenuItem*);
private:
Menu* menu_;
PopupWindow* w_;
boolean grabbed_;
};
--------------------------------------
PopupMenu::PopupMenu() {
menu_ = WidgetKit::instance()->pulldown();
w_ = nil;
grabbed_ = false;
}
PopupMenu::~PopupMenu() {
Resource::unref(menu_);
if (w_) {
delete w_;
}
}
boolean PopupMenu::event(Event& e) {
if (!w_) {
w_ = new PopupWindow(menu_);
}
switch (e.type()) {
case Event::down:
w_->place(e.pointer_root_x(), e.pointer_root_y());
w_->align(.2,.9);
w_->map();
e.grab(this);
grabbed_ = true;
menu_->press(e);
break;
case Event::motion:
if (grabbed_) {
menu_->drag(e);
}
break;
case Event::up:
if (grabbed_) {
menu_->release(e);
w_->unmap();
e.ungrab(this);
grabbed_ = false;
}
break;
}
return true;
}
void PopupMenu::append_item(MenuItem* mi) {
menu_->append_item(mi);
}
Technical Details
Message-ID:
<5350@news.duke.edu>Path:
arc1-ca.pugleaf.net!sparky!uunet!gatech!concert!duke!news.duke.edu!neuro.duke.edu!hinesShow Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!sparky!uunet!gatech!concert!duke!news.duke.edu!neuro.duke.edu!hines From: hines@neuro.duke.edu (Michael Hines) Newsgroups: comp.windows.interviews Subject: popup menu Message-ID: <5350@news.duke.edu> Date: 15 Sep 92 20:59:32 GMT Sender: news@news.duke.edu Lines: 66 Nntp-Posting-Host: timshel.neuro.duke.edu