@@ -1642,20 +1642,24 @@ class MenuItem
16421642
16431643class MenuWindow : ChildWindow
16441644{
1645+ const int CURRENT_NONE = -1;
16451646 var menu;
16461647 var width;
16471648 var height;
16481649 var hbase;
16491650 var hitem;
1651+ var fgcolor;
1652+ var bgcolor;
16501653 var enter;
16511654 var inside;
1655+ var current;
16521656 function MenuWindow(parent, int x, int y, menu)
16531657 {
16541658 self.menu = menu;
16551659 var items = menu.items;
16561660 int nitems = elements(items);
1657- int hitem = menu.font.getHeight() + 4 ;
1658- int hbase = menu.font.getAscent();
1661+ int hitem = menu.font.getHeight();
1662+ int hbase = menu.font.getAscent() + 1 ;
16591663 int height = hitem * nitems + 2;
16601664 int width = menu.font.getTextWidth(menu.display, menu.items[0].name);
16611665 self.height = height;
@@ -1664,30 +1668,77 @@ class MenuWindow : ChildWindow
16641668 self.hbase = hbase;
16651669 self.enter = false;
16661670 self.inside = false;
1667- var bgcolor = parent.display.ParseColor("grey");
1671+ var bgcolor = parent.display.ParseColor("grey");
1672+ var fgcolor = parent.display.ParseColor("black");
1673+ self.fgcolor = fgcolor;
1674+ self.bgcolor = bgcolor;
1675+ self.current = CURRENT_NONE;
16681676 self.ChildWindow(parent, x + 1, y + 1, width, height,
1669- { "background-color" : parent.display.ParseColor("grey") } );
1670- self.SetForeground("black");
1677+ { "background-color" : bgcolor } );
1678+ self.SetForeground(fgcolor);
1679+ self.SetBackground(bgcolor);
16711680 self.OnExpose += function (event) { self.onexpose(event); };
16721681 self.OnEnter += function (event) { self.onenter(event); };
16731682 self.OnLeave += function (event) { self.onleave(event); };
16741683 self.OnButtonPress += function (event) { self.onbuttonpress(event); };
16751684 self.OnButtonRelease += function (event) { self.onbuttonrelease(event); };
1685+ self.OnMotion += function (event) { self.onmotion(event); };
16761686 }
1677- function onexpose(event )
1687+ function drawitem(int nitem, fgcolor, bgcolor )
16781688 {
16791689 var items = self.menu.items;
16801690 int hitem = self.hitem;
16811691 int hbase = self.hbase;
1692+ int width = self.width;
1693+ self.SetForeground(bgcolor);
1694+ self.FillRectangle(1, nitem * hitem, width - 2, hitem);
1695+ self.SetForeground(fgcolor);
1696+ self.SetBackground(bgcolor);
1697+ self.DrawString(1, hbase + nitem * hitem, items[nitem].name);
1698+ }
1699+ function changecurrent(int newcurrent)
1700+ {
1701+ int current = self.current;
1702+ if (current == newcurrent)
1703+ return;
1704+ var items = self.menu.items;
1705+ int hitem = self.hitem;
1706+ int hbase = self.hbase;
1707+ int width = self.width;
1708+ var fgcolor = self.fgcolor;
1709+ var bgcolor = self.bgcolor;
1710+ if (current != CURRENT_NONE)
1711+ self.drawitem(current, fgcolor, bgcolor);
1712+ if (newcurrent != CURRENT_NONE)
1713+ self.drawitem(newcurrent, bgcolor, fgcolor);
1714+ self.current =: newcurrent;
1715+ }
1716+ function setcurrent(int x, int y)
1717+ {
1718+ var items = self.menu.items;
1719+ int nitem = y / self.hitem;
1720+ if (x < 0 || x > self.width || nitem < 0 || nitem >= elements(items))
1721+ nitem = CURRENT_NONE;
1722+ self.changecurrent(nitem);
1723+ }
1724+ function onexpose(event)
1725+ {
1726+ var items = self.menu.items;
1727+ int current = self.current;
1728+ var fgcolor = self.fgcolor;
1729+ var bgcolor = self.bgcolor;
16821730 self.DrawRectangle(0, 0, self.width - 1, self.height - 1);
1683- for (int i = 0, n = elements(items); i < n; ++i) {
1684- self.DrawString(0, hbase + i * hitem, items[i].name);
1685- }
1731+ for (int i = 0, n = elements(items); i < n; ++i)
1732+ if (i == current)
1733+ self.drawitem(i, bgcolor, fgcolor);
1734+ else
1735+ self.drawitem(i, fgcolor, bgcolor);
16861736 }
16871737 function onenter(event)
16881738 {
16891739 self.enter =: true;
16901740 self.inside =: true;
1741+ self.setcurrent(event.x(), event.y());
16911742 }
16921743 function onleave(event)
16931744 {
@@ -1700,11 +1751,15 @@ class MenuWindow : ChildWindow
17001751 self.Destroy();
17011752 }
17021753 }
1754+ function onmotion(event)
1755+ {
1756+ self.setcurrent(event.x(), event.y());
1757+ }
17031758 function onbuttonrelease(event)
17041759 {
1705- int x = event.x( );
1706- int y = event.y() ;
1707- if (x < 0 || y < 0 || x >= self.width || y >= self.height ) {
1760+ self.setcurrent(event.x(), event.y() );
1761+ int current = self.current ;
1762+ if (current == CURRENT_NONE ) {
17081763 if (self.enter) {
17091764 self.UngrabPointer(event.time());
17101765 self.Destroy();
@@ -1713,12 +1768,8 @@ class MenuWindow : ChildWindow
17131768 else {
17141769 self.UngrabPointer(event.time());
17151770 self.Destroy();
1716- var items = self.menu.items;
1717- int nitem = y / self.hitem;
1718- if (nitem >= 0 && nitem < elements(items)) {
1719- var action = items[nitem].action;
1720- action();
1721- }
1771+ var action = self.menu.items[current].action;
1772+ action();
17221773 }
17231774 }
17241775}
0 commit comments