Commit 758350b5 authored by twanvl's avatar twanvl

Drop down list doens't skip disabled items.

Fixed bug: scripted visibility didn't work.
parent 89de8be2
...@@ -116,7 +116,6 @@ void DropDownList::show(bool in_place, wxPoint pos) { ...@@ -116,7 +116,6 @@ void DropDownList::show(bool in_place, wxPoint pos) {
parent_height = (int)r.height + 6; parent_height = (int)r.height + 6;
} else { } else {
pos = RealPoint(r.x - 1, r.y - 1); pos = RealPoint(r.x - 1, r.y - 1);
size.width = max(size.width, r.width + 2);
parent_height = (int)r.height; parent_height = (int)r.height;
} }
} else if (parent_menu) { } else if (parent_menu) {
...@@ -148,7 +147,7 @@ void DropDownList::hide(bool event) { ...@@ -148,7 +147,7 @@ void DropDownList::hide(bool event) {
} }
root->realHide(); root->realHide();
// send event // send event
if (event && selected_item != NO_SELECTION) select(selected_item); if (event && selected_item != NO_SELECTION && itemEnabled(selected_item)) select(selected_item);
} }
void DropDownList::realHide() { void DropDownList::realHide() {
...@@ -246,8 +245,13 @@ void DropDownList::drawItem(DC& dc, int y, size_t item) { ...@@ -246,8 +245,13 @@ void DropDownList::drawItem(DC& dc, int y, size_t item) {
// draw background // draw background
dc.SetPen(*wxTRANSPARENT_PEN); dc.SetPen(*wxTRANSPARENT_PEN);
if (item == selected_item) { if (item == selected_item) {
if (itemEnabled(item)) {
dc.SetBrush (wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT)); dc.SetBrush (wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT));
dc.SetTextForeground(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT)); dc.SetTextForeground(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT));
} else {
dc.SetBrush (wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT));
dc.SetTextForeground(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT));
}
dc.DrawRectangle(marginW, y, (int)item_size.width, (int)item_size.height); dc.DrawRectangle(marginW, y, (int)item_size.width, (int)item_size.height);
} else if (!itemEnabled(item)) { } else if (!itemEnabled(item)) {
// mix between foreground and background // mix between foreground and background
...@@ -283,6 +287,7 @@ void DropDownList::onLeftDown(wxMouseEvent&) { ...@@ -283,6 +287,7 @@ void DropDownList::onLeftDown(wxMouseEvent&) {
void DropDownList::onLeftUp(wxMouseEvent&) { void DropDownList::onLeftUp(wxMouseEvent&) {
if (mouse_down) { if (mouse_down) {
if (selected_item != NO_SELECTION && !itemEnabled(selected_item)) return; // disabled item
// don't hide if there is a child menu // don't hide if there is a child menu
if (selected_item != NO_SELECTION && submenu(selected_item)) return; if (selected_item != NO_SELECTION && submenu(selected_item)) return;
hide(true); hide(true);
...@@ -299,8 +304,8 @@ void DropDownList::onMotion(wxMouseEvent& ev) { ...@@ -299,8 +304,8 @@ void DropDownList::onMotion(wxMouseEvent& ev) {
for (size_t i = 0 ; i < count ; ++i) { for (size_t i = 0 ; i < count ; ++i) {
int endY = startY + (int)item_size.height; int endY = startY + (int)item_size.height;
if (ev.GetY() >= startY && ev.GetY() < endY) { if (ev.GetY() >= startY && ev.GetY() < endY) {
if (itemEnabled(i)) {
selected_item = i; selected_item = i;
if (itemEnabled(i)) {
showSubMenu(i, startY); showSubMenu(i, startY);
} }
Refresh(false); Refresh(false);
...@@ -327,30 +332,23 @@ bool DropDownList::onCharInParent(wxKeyEvent& ev) { ...@@ -327,30 +332,23 @@ bool DropDownList::onCharInParent(wxKeyEvent& ev) {
// sub menu always takes keys // sub menu always takes keys
return open_sub_menu->onCharInParent(ev); return open_sub_menu->onCharInParent(ev);
} else { } else {
size_t old_sel = selected_item;
switch (k) { switch (k) {
case WXK_UP: case WXK_UP:
while (selected_item > 0) { if (selected_item > 0) {
selected_item -= 1; selected_item -= 1;
if (itemEnabled(selected_item)) {
Refresh(false); Refresh(false);
return true; return true;
} }
}
selected_item = old_sel;
break; break;
case WXK_DOWN: case WXK_DOWN:
while (selected_item + 1 < itemCount()) { if (selected_item + 1 < itemCount()) {
selected_item += 1; selected_item += 1;
if (itemEnabled(selected_item)) {
Refresh(false); Refresh(false);
return true; return true;
} }
}
selected_item = old_sel;
break; break;
case WXK_RETURN: case WXK_RETURN:
if (!showSubMenu()) { if (!showSubMenu() && (selected_item == NO_SELECTION || itemEnabled(selected_item))) {
hide(true); hide(true);
} }
break; break;
......
...@@ -142,9 +142,9 @@ void DataViewer::setStyles(const StyleSheetP& stylesheet, IndexMap<FieldP,StyleP ...@@ -142,9 +142,9 @@ void DataViewer::setStyles(const StyleSheetP& stylesheet, IndexMap<FieldP,StyleP
void DataViewer::addStyles(IndexMap<FieldP,StyleP>& styles) { void DataViewer::addStyles(IndexMap<FieldP,StyleP>& styles) {
FOR_EACH(s, styles) { FOR_EACH(s, styles) {
if ((s->visible || s->visible.isScripted()) && if ((s->visible || s->visible.isScripted()) &&
nativeLook() || ( (nativeLook() || (
(s->width || s->width .isScripted() || s->right || s->right .isScripted()) && (s->width || s->width .isScripted() || s->right || s->right .isScripted()) &&
(s->height || s->height .isScripted() || s->bottom || s->bottom.isScripted()))) { (s->height || s->height .isScripted() || s->bottom || s->bottom.isScripted())))) {
// no need to make a viewer for things that are always invisible // no need to make a viewer for things that are always invisible
ValueViewerP viewer = makeViewer(s); ValueViewerP viewer = makeViewer(s);
if (viewer) viewers.push_back(viewer); if (viewer) viewers.push_back(viewer);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment