🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: comp.windows.interviews
Article #449

popup menu

#449
From: Michael Hines
Date: Tue, 15 Sep 1992 20:59
66 lines
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!hines

Show 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