Skip to content

Commit 9dea5e6

Browse files
committed
highlight selected option in Menu
1 parent d187d6f commit 9dea5e6

File tree

1 file changed

+69
-18
lines changed

1 file changed

+69
-18
lines changed

src/Guitor.winxed

Lines changed: 69 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1642,20 +1642,24 @@ class MenuItem
16421642

16431643
class 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

Comments
 (0)