| Tutorial Series | Programming with the Palapeli API |
| Previous | Introduction to KDE4 programming |
| What's Next | n/a |
| Further Reading | Palapeli::Pattern, Palapeli::PatternConfiguration |
| I'm currently creating this tutorial. You should not edit this page in the mean time. -- Majewsky 18:19, 20 July 2008 (CEST) |
|---|
| Warning to editors |
Contents |
This tutorial shows you how to create a pattern for Palapeli, that is: a plugin for the Palapeli libraries that describes an algorithm to split an image into pieces.
The pattern we will be constructing is quite easy: It splits an image into two equally sized pieces.
A pattern plugin consists of two classes. The first one (derived from Palapeli::PatternConfiguration) tells Palapeli what features this pattern plugin has and which configuration values it needs. The second one (derived from Palapeli::Pattern) does the actual slicing.
class MyPattern : public Palapeli::Pattern { public: MyPattern(); virtual ~MyPattern() {}
virtual int estimatePieceCount() const; protected: virtual void doSlice(const QImage& image); };
class MyPatternConfiguration : public Palapeli::PatternConfiguration { public: MyPatternConfiguration(QObject* parent = 0, const QVariantList& args = QVariantList()); virtual ~MyPatternConfiguration() {} virtual Palapeli::Pattern* createPattern() const; };
As described above, we have declared two classes deriving from the base classes Palapeli::Pattern and Palapeli::PatternConfiguration. For this simple example, we do only reimplement constructors, destructors and some pure virtual functions.
K_PLUGIN_FACTORY(MyPatternFactory, registerPlugin<MyPatternConfiguration>();) K_EXPORT_PLUGIN(MyPatternFactory("mypattern"))
MyPattern::MyPattern() : Palapeli::Pattern() { }
int MyPattern::estimatePieceCount() const {
return 2;
}
void MyPattern::doSlice(const QImage& image) {
//construct pixmaps for the pieces const int pieceWidth = image.width() / 2, pieceHeight = image.height(); QImage leftPiece = image.copy(QRect(0, 0, pieceWidth, pieceHeight)); QImage rightPiece = image.copy(QRect(pieceWidth, 0, pieceWidth, pieceHeight)); //add pieces; define a neighborship relation between them addPiece(leftPiece, QRectF(0, 0, pieceWidth, pieceHeight)); addPiece(rightPiece, QRectF(pieceWidth, 0, pieceWidth, pieceHeight)); addRelation(0, 1, QPointF(pieceWidth, 0)); //0 and 1 are the consecutive indices of the pieces
}
MyPatternConfiguration::MyPatternConfiguration(QObject* parent, const QVariantList& args)
: Palapeli::PatternConfiguration(parent, args)
{
Q_UNUSED(parent) Q_UNUSED(args) setSizeDefinitionMode(Palapeli::PatternConfiguration::CustomSizeDefinition);
}
Palapeli::Pattern* MyPatternConfiguration::createPattern() const {
return new MyPattern;
}
We will start with the MyPatternConfiguration class, because this is the logical entry point. The pattern configuration class is created when Palapeli is started. It i
[Desktop Entry]
X-KDE-Library=mypattern
X-KDE-PluginInfo-Author=The best KDE hacker
X-KDE-PluginInfo-Email=kdehacker@kde-hackers.example.org
X-KDE-PluginInfo-Name=mypattern
X-KDE-PluginInfo-Version=1.0
X-KDE-PluginInfo-Website=http://kde-hackers.example.org/palapelipatterns
X-KDE-PluginInfo-Category=
X-KDE-PluginInfo-Depends=
X-KDE-PluginInfo-License=GPL
X-KDE-PluginInfo-EnabledByDefault=true
X-KDE-ParentApp=libpalapelipattern
X-KDE-ServiceTypes=Palapeli/PatternPlugin
Type=Service
Icon=palapeli-pattern-mypattern
PatternIdentifier=mypattern
Name=My pattern
Name[de]=Mein Schnittmuster
Comment=The best pattern in the world
Comment[de]=Das beste Schnittmuster auf der ganzen Welt
project(mypattern)
find_package(KDE4 REQUIRED) find_package(Palapeli REQUIRED)
add_definitions(${QT_DEFINITIONS} ${KDE4_DEFINITIONS}) include_directories(${KDE4_INCLUDES} ${PALAPELI_INCLUDE_DIR})
set(mypattern_SRCS mypattern.cpp )
kde4_add_plugin(mypattern ${mypattern_SRCS}) target_link_libraries(mypattern ${KDE4_KDEUI_LIBS} palapelipattern)
install(TARGETS mypattern DESTINATION ${PLUGIN_INSTALL_DIR}) install(FILES mypattern.desktop DESTINATION ${SERVICES_INSTALL_DIR})