Plasma Media Center and state machines

Christophe Olinger olingerc at binarylooks.com
Sat Apr 3 19:37:50 CEST 2010


Hey guys,

I think I am doing a stupid C++ mistake here: I get the follwing error:

mediacontainment.cpp:76: undefined reference to
'MediaCenter::MediaCenter::State::MediaCenterState(QState*)

The last line of this mail causes the error.


Here is mediacenterstate.h

#ifndef MEDIACENTERSTATE_H
#define MEDIACENTERSTATE_H

#include "libs/mediacenter/mediacenter.h"
#include "libs/mediacenter/mediacenter_export.h"

#include <QtCore/qabstractstate.h>
#include <QGraphicsWidget>

#include <Plasma/IconWidget>

namespace MediaCenter {

enum State {
    PictureMode,
    MusicMode,
    VideoMode,
    Home
};

enum MainSubComponent {
    JumpToVideoState,
    JumpToMusicState,
    JumpToPictureState,
    JumpToHome,
    ToggleControlBarAutohide,
    ToggleInfoBarAutohide
};

class MEDIACENTER_EXPORT MediaCenterState : public QAbstractState
{
    Q_OBJECT
public:
    MediaCenterState(QState *parent = 0);
    virtual ~MediaCenterState();

    QGraphicsWidget *subComponent(MainSubComponent c);

protected:
    void onExit(QEvent* event);
    void onEntry(QEvent* event);

    Plasma::IconWidget *m_jumpToHome;
};

} //namespace MediaCenter
#endif // MEDIACENTERSTATE_H

here is mediacenterstate.cpp

#include "mediacenterstate.h"

using namespace MediaCenter;

MediaCenterState::MediaCenterState (QState *parent) :
QAbstractState(parent),
    m_jumpToHome(new Plasma::IconWidget())
{
}

MediaCenterState::~MediaCenterState()
{
}

void MediaCenterState::onExit(QEvent *event)
{
    Q_UNUSED(event);
}

void MediaCenterState::onEntry(QEvent *event)
{
    Q_UNUSED(event);
}

QGraphicsWidget
*MediaCenterState::subComponent(MediaCenter::MainSubComponent c)
{
    if (c == MediaCenter::JumpToHome) {
        m_jumpToHome->setIcon("User-Folder");
        return m_jumpToHome;
    }
}


here is mediacontainment.h

#ifndef MEDIACONTAINMENT_H
#define MEDIACONTAINMENT_H

#include "mediacenter/mediacenter.h"
#include "states/mediacenterstate.h"

#include <Plasma/Containment>
#include <QList>

class QAction;
class QPointF;
namespace MediaCenter {
    class Browser;
    class PlaybackControl;
    class Playlist;
    class Player;
    class PictureState;
    class VideoState;
}

class MediaLayout;

class MediaContainment : public Plasma::Containment
{
    Q_OBJECT
public:
    MediaContainment(QObject *parent, const QVariantList &args);
    ~MediaContainment();

    QList<QAction*> contextualActions();

    MediaCenter::State currentState();
    void setCurrentState(MediaCenter::State);

    QList<QGraphicsWidget*> currentMainComponents();
    void addCurrentMainComponent(QGraphicsWidget*);

    QList<QGraphicsWidget*> currentSubComponents();
    void addCurrentSubComponent(QGraphicsWidget*);

protected:
    void constraintsEvent(Plasma::Constraints constraints);

private slots:
    void slotAppletAdded(Plasma::Applet *applet, const QPointF &pos);
    void slotAppletRemoved(Plasma::Applet *applet);
    void switchState(MediaCenter::State);

    void switchToPictureState();
    void switchToVideoState();
    void switchToMusicState();

private:
    MediaCenter::Browser *m_browser;
    MediaCenter::PlaybackControl *m_control;
    MediaCenter::Playlist *m_playlist;
    MediaCenter::Player *m_player;

    MediaCenter::State m_currentState;
    MediaCenter::State m_previousState;

    MediaCenter::MediaCenterState *m_mediaCenterState;
    MediaCenter::VideoState *m_videoState;
    MediaCenter::PictureState *m_pictureState;

    QList<QGraphicsWidget*> m_currentMainComponents;
    QList<QGraphicsWidget*> m_currentSubComponents;

    bool m_musicIsPlaying;

    MediaLayout *m_layout;

    void addMediaApplet(Plasma::Applet *);

    void initControls();
    void connectControls(MediaCenter::State);

    //we need these to give full control to the containment and avoid
cycling signals with the controller
    //the controller's buttons are connected to these
    void controlBarToPictureState();
    void controlBarToVideoState();
    void controlBarToMusicState();

    void startStateMachine();
};


and here the relevant part of mediacontainment.cpp

#include "mediacontainment.h"
#include "medianotificationwidget.h"
#include "medialayout.h"
#include "mediatoolbox.h"

#include <mediacenter/browser.h>
#include <mediacenter/playbackcontrol.h>
#include <mediacenter/playlist.h>
#include <mediacenter/player.h>

#include <states/videostate.h>
#include <states/picturestate.h>

// Qt
#include <QAction>
#include <QStateMachine>

// KDE
#include <KDebug>
#include <KNotification>
#include <KLocale>

static const int BROWSER_WIDTH = 300;
static const int BROWSER_HEIGHT = 100;


K_EXPORT_PLASMA_APPLET(mediacontainment, MediaContainment)

MediaContainment::MediaContainment(QObject *parent, const QVariantList
&args) : Plasma::Containment(parent, args),
m_browser(0),
m_control(0),
m_playlist(0),
m_player(0),
m_pictureState(0),
m_currentState(MediaCenter::PictureMode),
m_previousState(MediaCenter::PictureMode),
m_musicIsPlaying(false),
m_layout(new MediaLayout(this))
{
    setContainmentType(Plasma::Containment::CustomContainment);
    setHasConfigurationInterface(true);
    setAcceptHoverEvents(true);
    setToolBox(new MediaToolBox(this));

    connect (toolBox(), SIGNAL(toggled()), m_layout,
SLOT(toggleShowAllMediaApplets()));
}

MediaContainment::~MediaContainment()
{}

void MediaContainment::startStateMachine()
{
    //Prepare StateMachine
    QStateMachine machine; //this is not a pointer

    //Set up all possible states
    m_mediaCenterState = new MediaCenter::MediaCenterState(); //these are
pointers

>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.kde.org/pipermail/plasma-devel/attachments/20100403/9926e29c/attachment-0001.htm 


More information about the Plasma-devel mailing list