diff --git a/doomsday/client/data/defaultstyle.pack/fonts.dei b/doomsday/client/data/defaultstyle.pack/fonts.dei index 3954c3a0cd..e8f9722fd1 100644 --- a/doomsday/client/data/defaultstyle.pack/fonts.dei +++ b/doomsday/client/data/defaultstyle.pack/fonts.dei @@ -65,3 +65,13 @@ group editor { weight: light } } + +group separator { + font empty inherits default { + size $: gui.scale(__this__.size, 0.5) + } + font label inherits default { + size $: gui.scale(__this__.size, 0.75) + weight: bold + } +} diff --git a/doomsday/client/data/defaultstyle.pack/rules.dei b/doomsday/client/data/defaultstyle.pack/rules.dei index cf426a6fa4..a0da6a79cd 100644 --- a/doomsday/client/data/defaultstyle.pack/rules.dei +++ b/doomsday/client/data/defaultstyle.pack/rules.dei @@ -4,8 +4,9 @@ script { UNIT = 4.0 } -rule unit { constant $= UNIT } -rule gap { constant $= UNIT * 3 } +rule unit { constant $= UNIT } +rule halfunit { constant $= UNIT / 2 } +rule gap { constant $= UNIT * 3 } group console { rule width { constant = 500 } diff --git a/doomsday/client/include/ui/widgets/menuwidget.h b/doomsday/client/include/ui/widgets/menuwidget.h index ecec3e446e..4754dda475 100644 --- a/doomsday/client/include/ui/widgets/menuwidget.h +++ b/doomsday/client/include/ui/widgets/menuwidget.h @@ -61,6 +61,8 @@ class MenuWidget : public ScrollAreaWidget ButtonWidget *addItem(de::Image const &image, de::String const &styledText, de::Action *action = 0); + GuiWidget *addSeparator(de::String const &labelText = ""); + void removeItem(GuiWidget *child); /** diff --git a/doomsday/client/include/ui/widgets/popupmenuwidget.h b/doomsday/client/include/ui/widgets/popupmenuwidget.h index 6839157bac..1a7451c916 100644 --- a/doomsday/client/include/ui/widgets/popupmenuwidget.h +++ b/doomsday/client/include/ui/widgets/popupmenuwidget.h @@ -32,7 +32,10 @@ class PopupMenuWidget : public PopupWidget MenuWidget &menu() const; - ButtonWidget *addItem(de::String const &styledText, de::Action *action = 0); + ButtonWidget *addItem(de::String const &styledText, de::Action *action = 0, + bool dismissOnTriggered = true); + + GuiWidget *addSeparator(de::String const &optionalLabel = ""); protected: void glMakeGeometry(DefaultVertexBuf::Builder &verts); diff --git a/doomsday/client/src/ui/widgets/menuwidget.cpp b/doomsday/client/src/ui/widgets/menuwidget.cpp index 8bc77db53f..e22074eb9d 100644 --- a/doomsday/client/src/ui/widgets/menuwidget.cpp +++ b/doomsday/client/src/ui/widgets/menuwidget.cpp @@ -254,6 +254,18 @@ ButtonWidget *MenuWidget::addItem(Image const &image, String const &styledText, return b; } +GuiWidget *MenuWidget::addSeparator(String const &labelText) +{ + LabelWidget *lab = new LabelWidget; + lab->setText(labelText); + lab->setAlignment(ui::AlignLeft); + lab->setTextLineAlignment(ui::AlignLeft); + lab->setSizePolicy(ui::Expand, ui::Expand); + add(lab); + d->needLayout = true; + return lab; +} + void MenuWidget::removeItem(GuiWidget *child) { d->needLayout = true; diff --git a/doomsday/client/src/ui/widgets/popupmenuwidget.cpp b/doomsday/client/src/ui/widgets/popupmenuwidget.cpp index 61b26fd673..0c4405cc55 100644 --- a/doomsday/client/src/ui/widgets/popupmenuwidget.cpp +++ b/doomsday/client/src/ui/widgets/popupmenuwidget.cpp @@ -85,10 +85,6 @@ PopupMenuWidget::PopupMenuWidget(String const &name) setContent(new MenuWidget(name.isEmpty()? "" : name + "-content")); menu().setGridSize(1, ui::Expand, 0, ui::Expand); - - //addItem("First "_E(b)"Menu"_E(.)" Item"); - //addItem("2nd Menu Item"); - //addItem("3nd Item"); } MenuWidget &PopupMenuWidget::menu() const @@ -96,15 +92,18 @@ MenuWidget &PopupMenuWidget::menu() const return static_cast(content()); } -ButtonWidget *PopupMenuWidget::addItem(String const &styledText, Action *action) +ButtonWidget *PopupMenuWidget::addItem(String const &styledText, Action *action, bool dismissOnTriggered) { ButtonWidget *b = menu().addItem(styledText, action); b->setSizePolicy(ui::Expand, ui::Expand); b->setMargin("unit"); - b->set(Background(/*Vector4f(1, 0, 0, .5f)*/)); + b->set(Background()); b->audienceForStateChange += d; - b->audienceForTriggered += d; + if(dismissOnTriggered) + { + b->audienceForTriggered += d; + } // We want items to be hittable throughtout the width of the menu. b->hitRule() @@ -114,6 +113,24 @@ ButtonWidget *PopupMenuWidget::addItem(String const &styledText, Action *action) return b; } +GuiWidget *PopupMenuWidget::addSeparator(String const &optionalLabel) +{ + GuiWidget *sep = menu().addSeparator(optionalLabel); + if(optionalLabel.isEmpty()) + { + sep->setMargin(""); + sep->setFont("separator.empty"); + } + else + { + sep->setMargin("halfunit"); + sep->setFont("separator.label"); + } + sep->setTextColor("label.accent"); + sep->set(Background()); + return sep; +} + void PopupMenuWidget::glMakeGeometry(DefaultVertexBuf::Builder &verts) { PopupWidget::glMakeGeometry(verts);