Skip to content

Commit

Permalink
libshell: Added MenuWidget
Browse files Browse the repository at this point in the history
  • Loading branch information
skyjake committed Jan 30, 2013
1 parent 8809644 commit 031dc97
Show file tree
Hide file tree
Showing 6 changed files with 391 additions and 3 deletions.
1 change: 1 addition & 0 deletions doomsday/libshell/include/de/shell/MenuWidget
@@ -0,0 +1 @@
#include "menuwidget.h"
6 changes: 6 additions & 0 deletions doomsday/libshell/include/de/shell/action.h
Expand Up @@ -34,8 +34,13 @@ class Action : public QObject

public:
Action(KeyEvent const &event, QObject *target = 0, char const *slot = 0);

Action(String const &label, KeyEvent const &event, QObject *target = 0, char const *slot = 0);

~Action();

String label() const;

/**
* Triggers the action if the event matches the action's condition.
*
Expand All @@ -50,6 +55,7 @@ class Action : public QObject

private:
KeyEvent _event;
String _label;
};

} // namespace shell
Expand Down
83 changes: 83 additions & 0 deletions doomsday/libshell/include/de/shell/menuwidget.h
@@ -0,0 +1,83 @@
/** @file menuwidget.h Menu with shortcuts.
*
* @authors Copyright © 2013 Jaakko Keränen <jaakko.keranen@iki.fi>
*
* @par License
* GPL: http://www.gnu.org/licenses/gpl.html
*
* <small>This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. This program is distributed in the hope that it
* will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
* Public License for more details. You should have received a copy of the GNU
* General Public License along with this program; if not, see:
* http://www.gnu.org/licenses</small>
*/

#ifndef LIBSHELL_MENUWIDGET_H
#define LIBSHELL_MENUWIDGET_H

#include "TextWidget"
#include "Action"
#include "TextCanvas"

namespace de {
namespace shell {

/**
* Menu with Action instances as items.
*
* The width of the widget is automatically determined based on how much space
* is needed for the items and their possible shortcut labels. The height of
* the widget depends on the number of items in the menu.
*/
class MenuWidget : public TextWidget
{
public:
MenuWidget(String const &name = "");

~MenuWidget();

int itemCount() const;

void appendItem(Action *action, String const &shortcutLabel = "");

void appendSeparator();

void insertItem(int pos, Action *action, String const &shortcutLabel = "");

void insertSeparator(int pos);

void clear();

void removeItem(int pos);

Action &itemAction(int pos) const;

void setCursor(int pos);

int cursor() const;

void setSelectionAttribs(TextCanvas::Char::Attribs const &attribs);

void setBackgroundAttribs(TextCanvas::Char::Attribs const &attribs);

void setBorderAttribs(TextCanvas::Char::Attribs const &attribs);

Vector2i cursorPosition() const;

// Events.
void draw();
bool handleEvent(Event const *);

private:
struct Instance;
Instance *d;
};

} // namespace shell
} // namespace de

#endif // LIBSHELL_MENUWIDGET_H
6 changes: 4 additions & 2 deletions doomsday/libshell/libshell.pro
Expand Up @@ -43,7 +43,8 @@ HEADERS += \
include/de/shell/protocol.h \
include/de/shell/textcanvas.h \
include/de/shell/textrootwidget.h \
include/de/shell/textwidget.h
include/de/shell/textwidget.h \
include/de/shell/menuwidget.h

# Sources and private headers.
SOURCES += \
Expand All @@ -55,7 +56,8 @@ SOURCES += \
src/protocol.cpp \
src/textcanvas.cpp \
src/textrootwidget.cpp \
src/textwidget.cpp
src/textwidget.cpp \
src/menuwidget.cpp

# Installation ---------------------------------------------------------------

Expand Down
15 changes: 14 additions & 1 deletion doomsday/libshell/src/action.cpp
Expand Up @@ -21,7 +21,7 @@
namespace de {
namespace shell {

Action::Action(KeyEvent const &event, QObject *target, const char *slot)
Action::Action(KeyEvent const &event, QObject *target, char const *slot)
: _event(event)
{
if(target && slot)
Expand All @@ -30,8 +30,21 @@ Action::Action(KeyEvent const &event, QObject *target, const char *slot)
}
}

Action::Action(String const &label, KeyEvent const &event, QObject *target, char const *slot)
: _event(event), _label(label)
{
if(target && slot)
{
connect(this, SIGNAL(triggered()), target, slot);
}
}

Action::~Action()
{}

String Action::label() const
{
return _label;
}

bool Action::tryTrigger(KeyEvent const &ev)
Expand Down

0 comments on commit 031dc97

Please sign in to comment.