Hey Christophe,<div><br></div><div>i've just had a look at your repo and you put PMC States libraries in a different directory called states. The error you encounter is just because you don't link against that new library. You can just add mediacenterstates to the TARGET_LINK_LIBRARIES macro of the CMakeLists.txt of the MediaContainment but I'd prefer you put the States stuff still under libs/mediacenter because it is part of the MediaCenter API. So, please, move the States API under libs/mediacenter and your code should compile fine.<br>
<br><div class="gmail_quote">2010/4/3 Christophe Olinger <span dir="ltr"><<a href="mailto:olingerc@binarylooks.com">olingerc@binarylooks.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Hey guys,<div><br></div><div>I think I am doing a stupid C++ mistake here: I get the follwing error:</div><div><br></div><div>mediacontainment.cpp:76: undefined reference to 'MediaCenter::MediaCenter::State::MediaCenterState(QState*)</div>
<div><br></div><div>The last line of this mail causes the error.</div><div><br></div><div><br></div><div>Here is mediacenterstate.h</div><div><br></div><div><div>#ifndef MEDIACENTERSTATE_H</div><div>#define MEDIACENTERSTATE_H</div>
<div><br></div><div>#include "libs/mediacenter/mediacenter.h"</div><div>#include "libs/mediacenter/mediacenter_export.h"</div><div><br></div><div>#include <QtCore/qabstractstate.h></div><div>#include <QGraphicsWidget></div>
<div><br></div><div>#include <Plasma/IconWidget></div><div><br></div><div>namespace MediaCenter {</div><div>  </div><div>enum State {</div><div>    PictureMode,</div><div>    MusicMode,</div><div>    VideoMode,</div>
<div>    Home</div><div>};</div><div><br></div><div>enum MainSubComponent {</div><div>    JumpToVideoState,</div><div>    JumpToMusicState,</div><div>    JumpToPictureState,</div><div>    JumpToHome,</div><div>    ToggleControlBarAutohide,</div>
<div>    ToggleInfoBarAutohide</div><div>};</div><div>  </div><div>class MEDIACENTER_EXPORT MediaCenterState : public QAbstractState</div><div>{</div><div>    Q_OBJECT</div><div>public:</div><div>    MediaCenterState(QState *parent = 0);</div>
<div>    virtual ~MediaCenterState();</div><div><br></div><div>    QGraphicsWidget *subComponent(MainSubComponent c);</div><div><br></div><div>protected:</div><div>    void onExit(QEvent* event);</div><div>    void onEntry(QEvent* event);</div>
<div><br></div><div>    Plasma::IconWidget *m_jumpToHome;</div><div>};</div><div><br></div><div>} //namespace MediaCenter</div><div>#endif // MEDIACENTERSTATE_H</div><div><br><div class="gmail_quote">here is mediacenterstate.cpp</div>
<div class="gmail_quote"><br></div><div class="gmail_quote"><div class="gmail_quote">#include "mediacenterstate.h"</div><div class="gmail_quote"><br></div><div class="gmail_quote">using namespace MediaCenter;</div>
<div class="gmail_quote"><br></div><div class="gmail_quote">MediaCenterState::MediaCenterState (QState *parent) : QAbstractState(parent),</div><div class="gmail_quote">    m_jumpToHome(new Plasma::IconWidget())</div><div class="gmail_quote">
{</div><div class="gmail_quote">}</div><div class="gmail_quote"><br></div><div class="gmail_quote">MediaCenterState::~MediaCenterState()</div><div class="gmail_quote">{</div><div class="gmail_quote">}</div><div class="gmail_quote">
<br></div><div class="gmail_quote">void MediaCenterState::onExit(QEvent *event)</div><div class="gmail_quote">{</div><div class="gmail_quote">    Q_UNUSED(event);</div><div class="gmail_quote">}</div><div class="gmail_quote">
<br></div><div class="gmail_quote">void MediaCenterState::onEntry(QEvent *event)</div><div class="gmail_quote">{</div><div class="gmail_quote">    Q_UNUSED(event);</div><div class="gmail_quote">}</div><div class="gmail_quote">
<br></div><div class="gmail_quote">QGraphicsWidget *MediaCenterState::subComponent(MediaCenter::MainSubComponent c)</div><div class="gmail_quote">{</div><div class="gmail_quote">    if (c == MediaCenter::JumpToHome) {</div>
<div class="gmail_quote">        m_jumpToHome->setIcon("User-Folder");</div><div class="gmail_quote">        return m_jumpToHome;</div><div class="gmail_quote">    }</div><div class="gmail_quote">}</div><div>
<br></div><div><br></div><div>here is mediacontainment.h</div><div><br></div><div><div>#ifndef MEDIACONTAINMENT_H</div><div>#define MEDIACONTAINMENT_H</div><div><br></div><div>#include "mediacenter/mediacenter.h"</div>
<div>#include "states/mediacenterstate.h"</div><div><br></div><div>#include <Plasma/Containment></div><div>#include <QList></div><div><br></div><div>class QAction;</div><div>class QPointF;</div><div>
namespace MediaCenter {</div><div>    class Browser;</div><div>    class PlaybackControl;</div><div>    class Playlist;</div><div>    class Player;</div><div>    class PictureState;</div><div>    class VideoState;</div><div>
}</div><div><br></div><div>class MediaLayout;</div><div><br></div><div>class MediaContainment : public Plasma::Containment</div><div>{</div><div>    Q_OBJECT</div><div>public:</div><div>    MediaContainment(QObject *parent, const QVariantList &args);</div>
<div>    ~MediaContainment();</div><div><br></div><div>    QList<QAction*> contextualActions();</div><div><br></div><div>    MediaCenter::State currentState();</div><div>    void setCurrentState(MediaCenter::State);</div>
<div><br></div><div>    QList<QGraphicsWidget*> currentMainComponents();</div><div>    void addCurrentMainComponent(QGraphicsWidget*);</div><div><br></div><div>    QList<QGraphicsWidget*> currentSubComponents();</div>
<div>    void addCurrentSubComponent(QGraphicsWidget*);</div><div><br></div><div>protected:</div><div>    void constraintsEvent(Plasma::Constraints constraints);</div><div><br></div><div>private slots:</div><div>    void slotAppletAdded(Plasma::Applet *applet, const QPointF &pos);</div>
<div>    void slotAppletRemoved(Plasma::Applet *applet);</div><div>    void switchState(MediaCenter::State);</div><div><br></div><div>    void switchToPictureState();</div><div>    void switchToVideoState();</div><div>    void switchToMusicState();</div>
<div><br></div><div>private:</div><div>    MediaCenter::Browser *m_browser;</div><div>    MediaCenter::PlaybackControl *m_control;</div><div>    MediaCenter::Playlist *m_playlist;</div><div>    MediaCenter::Player *m_player;</div>
<div><br></div><div>    MediaCenter::State m_currentState;</div><div>    MediaCenter::State m_previousState;</div><div><br></div><div>    MediaCenter::MediaCenterState *m_mediaCenterState;</div><div>    MediaCenter::VideoState *m_videoState;</div>
<div>    MediaCenter::PictureState *m_pictureState;</div><div><br></div><div>    QList<QGraphicsWidget*> m_currentMainComponents;</div><div>    QList<QGraphicsWidget*> m_currentSubComponents;</div><div><br></div>
<div>    bool m_musicIsPlaying;</div><div><br></div><div>    MediaLayout *m_layout;</div><div><br></div><div>    void addMediaApplet(Plasma::Applet *);</div><div><br></div><div>    void initControls();</div><div>    void connectControls(MediaCenter::State);</div>
<div><br></div><div>    //we need these to give full control to the containment and avoid cycling signals with the controller</div><div>    //the controller's buttons are connected to these</div><div>    void controlBarToPictureState();</div>
<div>    void controlBarToVideoState();</div><div>    void controlBarToMusicState();</div><div><br></div><div>    void startStateMachine();</div><div>};</div><div><br></div><div><br></div><div>and here the relevant part of mediacontainment.cpp</div>
<div><br></div><div><div>#include "mediacontainment.h"</div><div>#include "medianotificationwidget.h"</div><div>#include "medialayout.h"</div><div>#include "mediatoolbox.h"</div><div>
<br></div><div>#include <mediacenter/browser.h></div><div>#include <mediacenter/playbackcontrol.h></div><div>#include <mediacenter/playlist.h></div><div>#include <mediacenter/player.h></div><div><br>
</div><div>#include <states/videostate.h></div><div>#include <states/picturestate.h></div><div><br></div><div>// Qt</div><div>#include <QAction></div><div>#include <QStateMachine></div><div><br></div>
<div>// KDE</div><div>#include <KDebug></div><div>#include <KNotification></div><div>#include <KLocale></div><div><br></div><div>static const int BROWSER_WIDTH = 300;</div><div>static const int BROWSER_HEIGHT = 100;</div>
<div><br></div><div><br></div><div>K_EXPORT_PLASMA_APPLET(mediacontainment, MediaContainment)</div><div><br></div><div>MediaContainment::MediaContainment(QObject *parent, const QVariantList &args) : Plasma::Containment(parent, args),</div>
<div>m_browser(0),</div><div>m_control(0),</div><div>m_playlist(0),</div><div>m_player(0),</div><div>m_pictureState(0),</div><div>m_currentState(MediaCenter::PictureMode),</div><div>m_previousState(MediaCenter::PictureMode),</div>
<div>m_musicIsPlaying(false),</div><div>m_layout(new MediaLayout(this))</div><div>{</div><div>    setContainmentType(Plasma::Containment::CustomContainment);</div><div>    setHasConfigurationInterface(true);</div><div>    setAcceptHoverEvents(true);</div>
<div>    setToolBox(new MediaToolBox(this));</div><div><br></div><div>    connect (toolBox(), SIGNAL(toggled()), m_layout, SLOT(toggleShowAllMediaApplets()));</div><div>}</div><div><br></div><div>MediaContainment::~MediaContainment()</div>
<div>{}</div><div><br></div><div>void MediaContainment::startStateMachine()</div><div>{</div><div>    //Prepare StateMachine</div><div>    QStateMachine machine; //this is not a pointer</div><div class="im"><div><br></div>
<div>    //Set up all possible states</div>
</div><div>    m_mediaCenterState = new MediaCenter::MediaCenterState(); //these are pointers</div></div></div></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div><div><br>
</div></div></blockquote></div><br></div></div>
<br>_______________________________________________<br>
Plasma-devel mailing list<br>
<a href="mailto:Plasma-devel@kde.org">Plasma-devel@kde.org</a><br>
<a href="https://mail.kde.org/mailman/listinfo/plasma-devel" target="_blank">https://mail.kde.org/mailman/listinfo/plasma-devel</a><br>
<br></blockquote></div><br><br clear="all"><br>-- <br>Alessandro Diaferia<br>KDE Developer<br>KDE e.V. member<br><br>
</div>