PopupWidget layout improved

This commit is contained in:
thrust26 2017-12-17 18:00:06 +01:00
parent 7fcbb8f401
commit 6629393e65
3 changed files with 23 additions and 14 deletions

View File

@ -26,7 +26,7 @@
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ContextMenu::ContextMenu(GuiObject* boss, const GUI::Font& font, ContextMenu::ContextMenu(GuiObject* boss, const GUI::Font& font,
const VariantList& items, int cmd) const VariantList& items, int cmd, int width)
: Dialog(boss->instance(), boss->parent()), : Dialog(boss->instance(), boss->parent()),
CommandSender(boss), CommandSender(boss),
_rowHeight(font.getLineHeight()), _rowHeight(font.getLineHeight()),
@ -41,7 +41,8 @@ ContextMenu::ContextMenu(GuiObject* boss, const GUI::Font& font,
_font(font), _font(font),
_cmd(cmd), _cmd(cmd),
_xorig(0), _xorig(0),
_yorig(0) _yorig(0),
_maxWidth(width)
{ {
addItems(items); addItems(items);
} }
@ -53,15 +54,15 @@ void ContextMenu::addItems(const VariantList& items)
_entries = items; _entries = items;
// Resize to largest string // Resize to largest string
int maxwidth = 0; int maxwidth = _maxWidth;
for(const auto& e: _entries) for(const auto& e: _entries)
maxwidth = std::max(maxwidth, _font.getStringWidth(e.first)); maxwidth = std::max(maxwidth, _font.getStringWidth(e.first));
_x = _y = 0; _x = _y = 0;
#ifndef FLAT_UI #ifndef FLAT_UI
_w = maxwidth + 10; _w = maxwidth + 15;
#else #else
_w = maxwidth + 10 + 5; _w = maxwidth + 23;
#endif #endif
_h = 1; // recalculate this in ::recalc() _h = 1; // recalculate this in ::recalc()
@ -553,10 +554,17 @@ void ContextMenu::drawDialog()
{ {
// Draw menu border and background // Draw menu border and background
s.fillRect(_x+1, _y+1, _w-2, _h-2, kWidColor); s.fillRect(_x+1, _y+1, _w-2, _h-2, kWidColor);
#ifndef FLAT_UI
s.box(_x, _y, _w, _h, kColor, kShadowColor); s.box(_x, _y, _w, _h, kColor, kShadowColor);
// Draw the entries, taking scroll buttons into account // Draw the entries, taking scroll buttons into account
int x = _x + 2, y = _y + 2, w = _w - 4; int x = _x + 2, y = _y + 2, w = _w - 4;
#else
s.frameRect(_x, _y, _w, _h, kTextColor);
// Draw the entries, taking scroll buttons into account
int x = _x + 1, y = _y + 1, w = _w - 2;
#endif
// Show top scroll area // Show top scroll area
int offset = _selectedOffset; int offset = _selectedOffset;

View File

@ -42,7 +42,7 @@ class ContextMenu : public Dialog, public CommandSender
public: public:
ContextMenu(GuiObject* boss, const GUI::Font& font, ContextMenu(GuiObject* boss, const GUI::Font& font,
const VariantList& items, int cmd = 0); const VariantList& items, int cmd = 0, int width = 0);
virtual ~ContextMenu() = default; virtual ~ContextMenu() = default;
/** Add the given items to the widget. */ /** Add the given items to the widget. */
@ -124,6 +124,7 @@ class ContextMenu : public Dialog, public CommandSender
int _cmd; int _cmd;
uInt32 _xorig, _yorig; uInt32 _xorig, _yorig;
uInt32 _maxWidth;
private: private:
// Following constructors and assignment operators not supported // Following constructors and assignment operators not supported

View File

@ -59,9 +59,9 @@ PopUpWidget::PopUpWidget(GuiObject* boss, const GUI::Font& font,
{ {
_flags = WIDGET_ENABLED | WIDGET_CLEARBG | WIDGET_RETAIN_FOCUS; _flags = WIDGET_ENABLED | WIDGET_CLEARBG | WIDGET_RETAIN_FOCUS;
_bgcolor = kDlgColor; _bgcolor = kDlgColor;
_bgcolorhi = kWidColor; _bgcolorhi = kDlgColor; // do not highlight the label
_textcolor = kTextColor; _textcolor = kTextColor;
_textcolorhi = kTextColor; _textcolorhi = kTextColor; // do not highlight the label
if(!_label.empty() && _labelWidth == 0) if(!_label.empty() && _labelWidth == 0)
_labelWidth = _font.getStringWidth(_label); _labelWidth = _font.getStringWidth(_label);
@ -76,7 +76,7 @@ PopUpWidget::PopUpWidget(GuiObject* boss, const GUI::Font& font,
myTextY = (_h - _font.getFontHeight()) / 2; myTextY = (_h - _font.getFontHeight()) / 2;
myArrowsY = (_h - 8) / 2; myArrowsY = (_h - 8) / 2;
myMenu = make_unique<ContextMenu>(this, font, list, cmd); myMenu = make_unique<ContextMenu>(this, font, list, cmd, w);
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -230,8 +230,8 @@ void PopUpWidget::drawWidget(bool hilite)
s.vLine(x, _y, _y+_h-1, kColor); s.vLine(x, _y, _y+_h-1, kColor);
s.vLine(x + w - 1, _y, _y +_h - 1, kShadowColor); s.vLine(x + w - 1, _y, _y +_h - 1, kShadowColor);
#else #else
s.frameRect(x, _y, w - 16, _h, kColor); s.frameRect(x, _y, w, _h, kColor);
s.frameRect(x + w - 17, _y, 17, _h, hilite ? kTextColorHi : kColor); s.frameRect(x + w - 16, _y + 1, 15, _h - 2, hilite ? kTextColorHi : kBGColorLo);
#endif // !FLAT_UI #endif // !FLAT_UI
#ifndef FLAT_UI #ifndef FLAT_UI
@ -242,12 +242,12 @@ void PopUpWidget::drawWidget(bool hilite)
!isEnabled() ? kColor : hilite ? kTextColorHi : kTextColor); !isEnabled() ? kColor : hilite ? kTextColorHi : kTextColor);
#else #else
// Fill the background // Fill the background
s.fillRect(x + 1, _y + 1, w - 2 - 16, _h - 2, kWidColor); s.fillRect(x + 1, _y + 1, w - 17, _h - 2, kWidColor);
s.fillRect(x + w - 15 - 1, _y + 1, 15, _h - 2, kBGColorHi); s.fillRect(x + w - 15, _y + 2, 13, _h - 4, kBGColorHi);
//s.vLine(x + w - 17, _y, _y + _h - 1, kShadowColor); //s.vLine(x + w - 17, _y, _y + _h - 1, kShadowColor);
// Draw an arrow pointing down at the right end to signal this is a dropdown/popup // Draw an arrow pointing down at the right end to signal this is a dropdown/popup
s.drawBitmap(down_arrow, x + w - 13, _y + myArrowsY + 1, s.drawBitmap(down_arrow, x + w - 13, _y + myArrowsY + 1,
!isEnabled() ? kCheckColor : kTextColor, 9u, 8u); !isEnabled() ? kColor : kTextColor, 9u, 8u);
#endif #endif
// Draw the selected entry, if any // Draw the selected entry, if any