diff options
| author | 2011-04-28 16:21:09 +0000 | |
|---|---|---|
| committer | 2011-04-28 16:21:09 +0000 | |
| commit | 6ef086201df1e347590198f843c87ce320453176 (patch) | |
| tree | 0846f136ec43f7ef5b91b3734e94462a60afa989 /src/modules | |
| parent | Added alpha component in color options (diff) | |
| download | KVIrc-6ef086201df1e347590198f843c87ce320453176.tar.gz KVIrc-6ef086201df1e347590198f843c87ce320453176.tar.bz2 KVIrc-6ef086201df1e347590198f843c87ce320453176.zip | |
Code improvements in kvs classes
git-svn-id: https://svn.kvirc.de/svn/trunk/kvirc@5805 17fca916-40b9-46aa-a4ea-0a15b648b75c
Diffstat (limited to 'src/modules')
| -rw-r--r-- | src/modules/objects/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/modules/objects/KvsObject_checkBox.cpp | 1 | ||||
| -rw-r--r-- | src/modules/objects/KvsObject_colorDialog.cpp | 236 | ||||
| -rw-r--r-- | src/modules/objects/KvsObject_colorDialog.h | 52 | ||||
| -rw-r--r-- | src/modules/objects/KvsObject_dialog.cpp | 7 | ||||
| -rw-r--r-- | src/modules/objects/KvsObject_painter.cpp | 234 | ||||
| -rw-r--r-- | src/modules/objects/KvsObject_painter.h | 3 | ||||
| -rw-r--r-- | src/modules/objects/KvsObject_pixmap.cpp | 414 | ||||
| -rw-r--r-- | src/modules/objects/KvsObject_pixmap.h | 44 | ||||
| -rw-r--r-- | src/modules/objects/KvsObject_treeWidget.h | 2 | ||||
| -rw-r--r-- | src/modules/objects/KvsObject_treeWidgeteItem.cpp | 1 | ||||
| -rw-r--r-- | src/modules/objects/KvsObject_webView.cpp | 10 | ||||
| -rw-r--r-- | src/modules/objects/KvsObject_webView.h | 4 | ||||
| -rw-r--r-- | src/modules/objects/KvsObject_widget.cpp | 49 | ||||
| -rw-r--r-- | src/modules/objects/KvsObject_widget.h | 5 | ||||
| -rw-r--r-- | src/modules/objects/libkviobjects.cpp | 20 |
16 files changed, 990 insertions, 94 deletions
diff --git a/src/modules/objects/CMakeLists.txt b/src/modules/objects/CMakeLists.txt index b7d9e5e09..28be4c984 100644 --- a/src/modules/objects/CMakeLists.txt +++ b/src/modules/objects/CMakeLists.txt @@ -11,6 +11,7 @@ SET(kviobjects_MOC_HDRS KvsObject_button.h KvsObject_checkBox.h KvsObject_comboBox.h + KvsObject_colorDialog.h KvsObject_dateTimeEdit.h KvsObject_dockWindow.h KvsObject_ftp.h @@ -46,6 +47,7 @@ SET(kviobjects_SRCS KvsObject_comboBox.cpp KvsObject_dateTimeEdit.cpp KvsObject_dialog.cpp + KvsObject_colorDialog.cpp KvsObject_dockWindow.cpp KvsObject_file.cpp KvsObject_ftp.cpp diff --git a/src/modules/objects/KvsObject_checkBox.cpp b/src/modules/objects/KvsObject_checkBox.cpp index 53f11fda7..17daa7113 100644 --- a/src/modules/objects/KvsObject_checkBox.cpp +++ b/src/modules/objects/KvsObject_checkBox.cpp @@ -29,6 +29,7 @@ #include "KviLocale.h" #include "KvsObject_checkBox.h" + #include <QCheckBox> /* diff --git a/src/modules/objects/KvsObject_colorDialog.cpp b/src/modules/objects/KvsObject_colorDialog.cpp new file mode 100644 index 000000000..cd80b224b --- /dev/null +++ b/src/modules/objects/KvsObject_colorDialog.cpp @@ -0,0 +1,236 @@ +//============================================================================= +// +// File : KvsObject_colorDialog.cpp +// Creation date : Wed 27 Apr 2011 15:42:05 CEST by Alessandro Carbone +// +// This file is part of the KVIrc irc client distribution +// Copyright (C) 2011 Alessandro Carbone (elfonol at gmail dot com) +// Copyright (C) 2000-2010 Szymon Stefanek (pragma at kvirc dot net) +// +// 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 opinion) 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, write to the Free Software Foundation, +// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// +//============================================================================= + + +#include "KviError.h" +#include "kvi_debug.h" +#include "KviLocale.h" +#include "KvsObject_colorDialog.h" + + +#include <QColorDialog> + +const char * const option_tbl[] = { + "ShowAlphaChannel", + "NoButtons", + "DontUseNativeDialog" +}; + +const int option_cod[] = { + QColorDialog::ShowAlphaChannel, + QColorDialog::NoButtons, + QColorDialog::DontUseNativeDialog +}; + +#define option_num (sizeof(option_tbl) / sizeof(option_tbl[0])) + +/* + @doc: colordialog + @title: + colordialog class + @type: + class + @short: + Check box with a text description + @inherits: + [class]object[/class] + [class]button[/class] + @description: + This widget provides a check box - it is a kind of a toggle + button. It can have two states: on (checked) and off + (unchecked). + @functions: + !fn: <bool> $isChecked() + Returns '1' if the check box is checked, '0' otherwise.[br] + See also [classfnc]$setChecked[/classfnc](). + !fn: $setChecked([<bChecked:bool>]) + Sets the check box 'checked state' to <bool>. + See also [classfnc]$isChecked[/classfnc](). + !fn: $setText([<text:string>]) + Sets the label text associated with the colorDialog to <text>.[br] + !fn: $toggleEvent(<bToggled:bool>) + Called by KVIrc when the colorDialog state is toggled. + The default implementation emits the toggled(<bool>) signal. +*/ + +//--------------------------------------------------------------------------------- + +KVSO_BEGIN_REGISTERCLASS(KvsObject_colorDialog,"colorDialog","dialog") + KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_colorDialog,setCurrentColor) + KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_colorDialog,setOptions) + KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_colorDialog,colorSelectedEvent) + KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_colorDialog,currentColorChangedEvent) +KVSO_END_REGISTERCLASS(KvsObject_colorDialog) + +KVSO_BEGIN_CONSTRUCTOR(KvsObject_colorDialog,KvsObject_dialog) + +KVSO_END_CONSTRUCTOR(KvsObject_colorDialog) + + +KVSO_BEGIN_DESTRUCTOR(KvsObject_colorDialog) + +KVSO_END_CONSTRUCTOR(KvsObject_colorDialog) + +bool KvsObject_colorDialog::init(KviKvsRunTimeContext *,KviKvsVariantList *) +{ + QColorDialog * d = new QColorDialog(parentScriptWidget()); + d->setObjectName(getName().toUtf8().data()); + setObject(d, true); + connect(d,SIGNAL(colorSelected(const QColor &)),this,SLOT(slotColorSelected(const QColor &))); + connect(d,SIGNAL(currentColorChanged(const QColor &)),this,SLOT(slotCurrentColorChanged(const QColor &))); + return true; +} + +KVSO_CLASS_FUNCTION(colorDialog,setCurrentColor) +{ + CHECK_INTERNAL_POINTER(widget()) + kvs_int_t iCol1,iCol2,iCol3,iOpacity; + QString szColorMode,szColor; + KviKvsVariant *var1,*var2,*var3; + KVSO_PARAMETERS_BEGIN(c) + KVSO_PARAMETER("Color_1_Or_Colorname",KVS_PT_VARIANT,0,var1) + KVSO_PARAMETER("Color_2",KVS_PT_VARIANT,KVS_PF_OPTIONAL,var2) + KVSO_PARAMETER("Colo3_3",KVS_PT_VARIANT,KVS_PF_OPTIONAL,var3) + KVSO_PARAMETER("opacity",KVS_PT_INT,KVS_PF_OPTIONAL,iOpacity) + KVSO_PARAMETER("color_mode",KVS_PT_STRING,KVS_PF_OPTIONAL,szColorMode) + KVSO_PARAMETERS_END(c) + QColor col; + if (!var1->asInteger(iCol1)) + { + var1->asString(szColor); + if (c->paramCount()<2) iOpacity=255; + else + { + if (!var2->asInteger(iOpacity)) + { + c->warning(__tr2qs_ctx("The opacity parameter didn't evaluate to integer","objects")); + return true; + } + } + col.setNamedColor(szColor); + col.setAlpha(iOpacity); + } + else + { + if(c->paramCount()<3) + { + c->error(__tr2qs_ctx("Color name or triplette rgb/hsv value required","objects")); + return true; + } + if (!var2->asInteger(iCol2)||!var3->asInteger(iCol3)) + { + c->error(__tr2qs_ctx("One of the triplette parameters didn't evaluate to an integer","objects"));\ + return true; + } + if (c->paramCount()<4) iOpacity=255; + else + { + if (c->paramCount()>4) + { + if(KviQString::equalCI(szColorMode, "HSV")) + col.setHsv(iCol1,iCol2,iCol3,iOpacity); + else + col.setRgb(iCol1,iCol2,iCol3,iOpacity); + } + } + col.setAlpha(iOpacity); + } + ((QColorDialog *)widget())->setCurrentColor(col); + return true; +} + +KVSO_CLASS_FUNCTION(colorDialog,setOptions) +{ + CHECK_INTERNAL_POINTER(widget()) + QStringList szOptions; + KVSO_PARAMETERS_BEGIN(c) + KVSO_PARAMETER("szOptions",KVS_PT_STRINGLIST,KVS_PF_OPTIONAL,szOptions) + KVSO_PARAMETERS_END(c) + if (!widget()) return true; + int colorDialogOption,sum = 0; + for ( QStringList::Iterator it = szOptions.begin(); it != szOptions.end(); ++it ) + { + colorDialogOption = 0; + for(unsigned int j = 0; j < option_num; j++) + { + if(KviQString::equalCI((*it), option_tbl[j])) + { + colorDialogOption=option_cod[j]; + break; + } + } + if(colorDialogOption) + sum = sum | colorDialogOption; + else + c->warning(__tr2qs_ctx("Unknown szOptions '%Q'","objects"),&(*it)); + + } + ((QColorDialog *)widget())->setOptions(QColorDialog::ColorDialogOptions(sum)); + return true; +} + + + +KVSO_CLASS_FUNCTION(colorDialog,currentColorChangedEvent) +{ + emitSignal("currentColorChanged",c,c->params()); + return true; +} + + +KVSO_CLASS_FUNCTION(colorDialog,colorSelectedEvent) +{ + emitSignal("colorSelected",c,c->params()); + return true; +} + +//slots +void KvsObject_colorDialog::slotCurrentColorChanged(const QColor &col) +{ + KviKvsHash *pHash = new KviKvsHash(); + KviKvsVariant *pColName = new KviKvsVariant(col.name()); + KviKvsVariant *pColAlpha = new KviKvsVariant((kvs_int_t)col.alpha()); + pHash->set("color",pColName); + pHash->set("opacity",pColAlpha); + KviKvsVariantList params(new KviKvsVariant(pHash)); + callFunction(this,"currentColorChangedEvent",¶ms); +} + +void KvsObject_colorDialog::slotColorSelected(const QColor &col) +{ + KviKvsHash *pHash = new KviKvsHash(); + KviKvsVariant *pColName = new KviKvsVariant(col.name()); + KviKvsVariant *pColAlpha = new KviKvsVariant((kvs_int_t)col.alpha()); + pHash->set("color",pColName); + pHash->set("alpha",pColAlpha); + KviKvsVariantList params(new KviKvsVariant(pHash)); + callFunction(this,"colorSelectedEvent",¶ms); +} + + +#ifndef COMPILE_USE_STANDALONE_MOC_SOURCES +#include "m_KvsObject_colorDialog.moc" +#endif //!COMPILE_USE_STANDALONE_MOC_SOURCES + diff --git a/src/modules/objects/KvsObject_colorDialog.h b/src/modules/objects/KvsObject_colorDialog.h new file mode 100644 index 000000000..1ad507e40 --- /dev/null +++ b/src/modules/objects/KvsObject_colorDialog.h @@ -0,0 +1,52 @@ +#ifndef _CLASS_COLORDIALOG_H_ +#define _CLASS_COLORDIALOG_H_ + +//============================================================================= +// +// File : KvsObject_colorDialog.h +// Creation date : Wed 27 Apr 2011 15:42:05 CEST by Alessandro Carbone +// +// This file is part of the KVIrc irc client distribution +// Copyright (C) 2011 Alessandro Carbone (elfonol at gmail dot com) +// Copyright (C) 2000-2010 Szymon Stefanek (pragma at kvirc dot net) +// +// 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 opinion) 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, write to the Free Software Foundation, +// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// +//============================================================================= + + + +#include "KvsObject_dialog.h" +#include "object_macros.h" + +class KvsObject_colorDialog : public KvsObject_dialog +{ + Q_OBJECT +public: + KVSO_DECLARE_OBJECT(KvsObject_colorDialog) +public: + QWidget * widget() { return (QWidget *)object(); } +protected: + virtual bool init(KviKvsRunTimeContext * pContext,KviKvsVariantList *pParams); + bool setCurrentColor(KviKvsObjectFunctionCall *c); + bool currentColorChangedEvent(KviKvsObjectFunctionCall *c); + bool colorSelectedEvent(KviKvsObjectFunctionCall *c); + bool setOptions(KviKvsObjectFunctionCall *c); +protected slots: + void slotCurrentColorChanged(const QColor &col); + void slotColorSelected(const QColor &col); + +}; +#endif // !_CLASS_COLORDIALOG_H_ diff --git a/src/modules/objects/KvsObject_dialog.cpp b/src/modules/objects/KvsObject_dialog.cpp index f3feb53ff..73e41ae17 100644 --- a/src/modules/objects/KvsObject_dialog.cpp +++ b/src/modules/objects/KvsObject_dialog.cpp @@ -30,7 +30,7 @@ #include "KviApplication.h" #include <QDialog> - +#include <QGraphicsDropShadowEffect> /* @doc: dialog @@ -72,6 +72,11 @@ bool KvsObject_dialog::init(KviKvsRunTimeContext *,KviKvsVariantList *) QWidget * w = g_pApp->activeModalWidget(); if(!w)w = g_pMainWindow; QDialog * d = new QDialog(parentScriptWidget() ? parentScriptWidget() : w); + QGraphicsDropShadowEffect *effect = new QGraphicsDropShadowEffect(widget()); + effect->setColor(QColor(0, 0, 0, 255)); + effect->setBlurRadius(20); + d->setGraphicsEffect(effect); + d->setObjectName(getName()); //d->setModal(true); setObject(d); diff --git a/src/modules/objects/KvsObject_painter.cpp b/src/modules/objects/KvsObject_painter.cpp index a73d7924e..fa37a8072 100644 --- a/src/modules/objects/KvsObject_painter.cpp +++ b/src/modules/objects/KvsObject_painter.cpp @@ -76,8 +76,63 @@ const char * const penstyles_tbl[] = { "dashDotDotLine" }; +const QPainter::CompositionMode composition_cod[] = { + QPainter::CompositionMode_SourceOver, + QPainter::CompositionMode_DestinationOver, + QPainter::CompositionMode_Clear, + QPainter::CompositionMode_Source, + QPainter::CompositionMode_Destination, + QPainter::CompositionMode_SourceIn, + QPainter::CompositionMode_DestinationIn, + QPainter::CompositionMode_SourceOut, + QPainter::CompositionMode_DestinationOut, + QPainter::CompositionMode_SourceAtop, + QPainter::CompositionMode_DestinationAtop, + QPainter::CompositionMode_Xor, + QPainter::CompositionMode_Plus, + QPainter::CompositionMode_Multiply, + QPainter::CompositionMode_Screen, + QPainter::CompositionMode_Overlay, + QPainter::CompositionMode_Darken, + QPainter::CompositionMode_Lighten, + QPainter::CompositionMode_ColorDodge, + QPainter::CompositionMode_ColorBurn, + QPainter::CompositionMode_HardLight, + QPainter::CompositionMode_SoftLight, + QPainter::CompositionMode_Difference, + QPainter::CompositionMode_Exclusion, +}; +const char * const composition_tbl[] = { + "SourceOver", + "DestinationOver", + "Clear", + "Source", + "Destination", + "SourceIn", + "DestinationIn", + "SourceOut", + "DestinationOut", + "SourceAtop", + "DestinationAtop", + "Xor", + "Plus", + "Multiply", + "Screen", + "Overlay", + "Darken", + "Lighten", + "ColorDodge", + "ColorBurn", + "HardLight", + "SoftLight", + "Difference", + "Exclusion" +}; + #define penstyles_num (sizeof(penstyles_tbl) / sizeof(penstyles_tbl[0])) +#define composition_num (sizeof(composition_tbl) / sizeof(composition_tbl[0])) + const Qt::BrushStyle brushstyles_cod[] = { Qt::NoBrush, Qt::SolidPattern, @@ -471,7 +526,7 @@ KVSO_BEGIN_REGISTERCLASS(KvsObject_painter,"painter","object") KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_painter,setAntialiasing) KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_painter,setSmoothPixmapTransform) KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_painter,setBackGroundMode) - + KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_painter,setCompositionMode) // QPainterPath stuff @@ -514,6 +569,7 @@ KVSO_BEGIN_REGISTERCLASS(KvsObject_painter,"painter","object") // extra KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_painter,beginPdf) + KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_painter,drawPixmapWithEffect); KVSO_END_REGISTERCLASS(KvsObject_painter) @@ -522,7 +578,7 @@ KVSO_END_REGISTERCLASS(KvsObject_painter) KVSO_BEGIN_CONSTRUCTOR(KvsObject_painter,KviKvsObject) m_pPainter = new QPainter(); - bDonotdeleteinternalqpainter=false; + bDonotdeleteinternalqpainter=false; m_pPrinter = 0 ; m_pDeviceObject=0; m_pPainterPath=0; @@ -846,7 +902,7 @@ KVSO_CLASS_FUNCTION(painter,setBrush) return true; } if(pObject->inheritsClass("pixmap")) - m_pPainter->setBrush(*((KvsObject_pixmap *)pObject)->getPixmap()); + m_pPainter->setBrush(*((KvsObject_pixmap *)pObject)->getImage()); else c->warning(__tr2qs_ctx("Object Pixmap required!","objects")); return true; } @@ -1083,7 +1139,7 @@ KVSO_CLASS_FUNCTION(painter,begin) c->warning(__tr2qs_ctx("Pixmap or Widget parameter is not an object","objects")); return true; } - if(pObject->inheritsClass("pixmap"))pd=((KvsObject_pixmap *)pObject)->getPixmap(); + if(pObject->inheritsClass("pixmap"))pd=((KvsObject_pixmap *)pObject)->getImage(); else if (pObject->inheritsClass("widget")) pd=((KvsObject_widget *)pObject)->widget(); else { @@ -1108,7 +1164,7 @@ void KvsObject_painter::attachDevice(KviKvsObject * o,QPaintDevice * p) // KvsObject_pixmap and KvsObject_widget object have this signal // it is emitted BEFORE the real QPaintDevice is deleted, so we can eventually // call m_pPainter->end() in time - + qDebug("Begin painter"); QObject::connect(m_pDeviceObject,SIGNAL(aboutToDie()),this,SLOT(detachDevice())); m_pPainter->begin(p); } @@ -1161,13 +1217,14 @@ KVSO_CLASS_FUNCTION(painter,drawText) { CHECK_INTERNAL_POINTER(m_pPainter) QString szText,szMode; - kvs_int_t iX,iY,iN=-1; + kvs_int_t iX,iY,iN=-1,iW,iH; KVSO_PARAMETERS_BEGIN(c) KVSO_PARAMETER("x",KVS_PT_INT,0,iX) KVSO_PARAMETER("y",KVS_PT_INT,0,iY) + KVSO_PARAMETER("w",KVS_PT_INT,0,iW) + KVSO_PARAMETER("h",KVS_PT_INT,0,iH) KVSO_PARAMETER("text",KVS_PT_STRING,0,szText) - KVSO_PARAMETER("num_chars",KVS_PT_INT,KVS_PF_OPTIONAL,iN) - KVSO_PARAMETER("mode",KVS_PT_STRING,KVS_PF_OPTIONAL,szMode) + KVSO_PARAMETERS_END(c) if (!szMode.isEmpty() && !KviQString::equalCI(szMode,"Auto")) { @@ -1179,7 +1236,14 @@ KVSO_CLASS_FUNCTION(painter,drawText) return true; } } - m_pPainter->drawText(iX,iY,szText.left(iN)); + //if(!iN) iN = szText.length(); + QRect rect; + rect.setX(iX); + rect.setY(iY); + rect.setWidth(iW); + rect.setHeight(iH); + + m_pPainter->drawText(rect,szText); return true; } @@ -1212,11 +1276,92 @@ KVSO_CLASS_FUNCTION(painter,drawPixmap) c->warning(__tr2qs_ctx("Pixmap object required","objects")); return true; } - - m_pPainter->drawPixmap(QPointF(iX,iY),*((KvsObject_pixmap *)obj)->getPixmap(),QRect(iStartx,iStarty,iEndx,iEndy)); + QImage *pImage=((KvsObject_pixmap *)obj)->getImage(); + qDebug("image "); + m_pPainter->drawImage(QPointF(iX,iY),*pImage,QRect(iStartx,iStarty,iEndx,iEndy)); return true; } +KVSO_CLASS_FUNCTION(painter,drawPixmapWithEffect) +{ + CHECK_INTERNAL_POINTER(m_pPainter) + QString szEffect; + kvs_real_t iX,iY,factor; + kvs_int_t r,g,b; + KviKvsObject *obj; + kvs_hobject_t hObject; + KVSO_PARAMETERS_BEGIN(c) + KVSO_PARAMETER("string_effect",KVS_PT_STRING,0,szEffect) + KVSO_PARAMETER("x",KVS_PT_REAL,0,iX) + KVSO_PARAMETER("y",KVS_PT_REAL,0,iY) + KVSO_PARAMETER("pixmap",KVS_PT_HOBJECT,0,hObject) + KVSO_PARAMETER("red",KVS_PT_INTEGER,0,r) + KVSO_PARAMETER("green",KVS_PT_INTEGER,0,g) + KVSO_PARAMETER("blue",KVS_PT_INTEGER,0,b) + KVSO_PARAMETERS_END(c) + obj=KviKvsKernel::instance()->objectController()->lookupObject(hObject); + if (!obj) + { + c->warning(__tr2qs_ctx("Pixmap parameter is not an object","objects")); + return true; + } + if (!obj->inheritsClass("pixmap")) + { + c->warning(__tr2qs_ctx("Pixmap object required","objects")); + return true; + } + QImage *pImage=((KvsObject_pixmap *)obj)->getImage(); + QImage pDest(pImage->width(),pImage->height(),QImage::Format_ARGB32); + QRgb col ; + QRgb *dataSource; + QRgb *dataDest; + int w=pImage->width(); + int h=pImage->height(); + if(KviQString::equalCI(szEffect,"add")) + { + int sumR, sumG, sumB; + for(int y=0; y<h; y++) + { + dataSource = (QRgb *) pImage->scanLine(y); + dataDest = (QRgb *) pDest.scanLine(y); + for (int x=0; x<w; x++) + { + col = *dataSource; + sumR=qRed(col)+r; + sumG=qGreen(col)+g; + sumB=qBlue(col)+b; + *dataDest++ = qRgba(sumR<255 ?sumR : 255, + sumG<255 ?sumG : 255, + sumB<255 ?sumB : 255, + qAlpha(col)); + dataSource++; + } + } + } + else if(KviQString::equalCI(szEffect,"sub")) + { + int subR, subG, subB; + for(int y=0; y<h; y++) + { + dataSource = (QRgb *) pImage->scanLine(y); + dataDest = (QRgb *) pDest.scanLine(y); + for (int x=0; x<w; x++) + { + col = *dataSource; + subR=qRed(col)-r; + subG=qGreen(col)-g; + subB=qBlue(col)-b; + *dataDest++ = qRgba(subR>0 ? subR : 0, + subG>0 ? subG : 0, + subB>0 ? subB : 0, + qAlpha(col)); + dataSource++; + } + } + } + m_pPainter->drawImage(QPointF(iX,iY),pDest); + return true; +} KVSO_CLASS_FUNCTION(painter,rotate) { CHECK_INTERNAL_POINTER(m_pPainter) @@ -1619,24 +1764,54 @@ KVSO_CLASS_FUNCTION(painter,fillRect) CHECK_INTERNAL_POINTER(m_pPainter) kvs_int_t iX,iY,iW,iH; kvs_int_t iCol1,iCol2,iCol3,iOpacity; - QString szColorMode; + QString szColorMode,szColor; + KviKvsVariant *var1,*var2,*var3; KVSO_PARAMETERS_BEGIN(c) KVSO_PARAMETER("x",KVS_PT_INT,0,iX) KVSO_PARAMETER("y",KVS_PT_INT,0,iY) KVSO_PARAMETER("w",KVS_PT_INT,0,iW) KVSO_PARAMETER("h",KVS_PT_INT,0,iH) - KVSO_PARAMETER("Color_1",KVS_PT_INT,0,iCol1) - KVSO_PARAMETER("Color_2",KVS_PT_INT,0,iCol2) - KVSO_PARAMETER("Colo3_3",KVS_PT_INT,0,iCol3) + KVSO_PARAMETER("Color_1_Or_Colorname",KVS_PT_VARIANT,0,var1) + KVSO_PARAMETER("Color_2",KVS_PT_VARIANT,KVS_PF_OPTIONAL,var2) + KVSO_PARAMETER("Colo3_3",KVS_PT_VARIANT,KVS_PF_OPTIONAL,var3) KVSO_PARAMETER("opacity",KVS_PT_INT,KVS_PF_OPTIONAL,iOpacity) KVSO_PARAMETER("color_mode",KVS_PT_STRING,KVS_PF_OPTIONAL,szColorMode) KVSO_PARAMETERS_END(c) - if (c->paramCount()<8) iOpacity=255; QColor col; - if(KviQString::equalCI(szColorMode, "HSV")) - col.setHsv(iCol1,iCol2,iCol3,iOpacity); + if (!var1->asInteger(iCol1)) + { + var1->asString(szColor); + if (c->paramCount()<6) iOpacity=255; + else + { + if (!var2->asInteger(iOpacity)) + { + c->warning(__tr2qs_ctx("The opacity parameter didn't evaluate to integer","objects")); + return true; + } + } + col.setNamedColor(szColor); + col.setAlpha(iOpacity); + } else + { + if(c->paramCount()<7) + { + c->error(__tr2qs_ctx("Color name or triplette rgb/hsv value required","objects")); + return true; + } + if (!var2->asInteger(iCol2)||!var3->asInteger(iCol3)) + { + c->error(__tr2qs_ctx("One of the triplette parameters didn't evaluate to an integer","objects"));\ + return true; + } + if (c->paramCount()<5) iOpacity=255; + QColor col; + if(KviQString::equalCI(szColorMode, "HSV")) + col.setHsv(iCol1,iCol2,iCol3,iOpacity); + else col.setRgb(iCol1,iCol2,iCol3,iOpacity); + } m_pPainter->fillRect(iX,iY,iW,iH,col); return true; } @@ -1718,6 +1893,29 @@ KVSO_CLASS_FUNCTION(painter,drawPath) return true; } +KVSO_CLASS_FUNCTION(painter,setCompositionMode) +{ + CHECK_INTERNAL_POINTER(m_pPainter) + QString szComposition; + KVSO_PARAMETERS_BEGIN(c) + KVSO_PARAMETER("style",KVS_PT_STRING,0,szComposition) + KVSO_PARAMETERS_END(c) + bool found=false; + unsigned int j = 0; + for(; j < composition_num; j++) + { + if(KviQString::equalCI(szComposition,composition_tbl[j])) + { + found=true; + break; + } + } + if (found){ + m_pPainter->setCompositionMode(composition_cod[j]); + } + else c->warning(__tr2qs_ctx("Unknown composition mode '%Q'","objects"),&szComposition); + return true; +} KVSO_CLASS_FUNCTION(painter,resetPath) { Q_UNUSED(c); diff --git a/src/modules/objects/KvsObject_painter.h b/src/modules/objects/KvsObject_painter.h index e8529dfb0..7f9508a94 100644 --- a/src/modules/objects/KvsObject_painter.h +++ b/src/modules/objects/KvsObject_painter.h @@ -86,6 +86,7 @@ public: bool translate(KviKvsObjectFunctionCall *c); bool setPenStyle(KviKvsObjectFunctionCall *c); bool setBrushStyle(KviKvsObjectFunctionCall *c); + bool setCompositionMode(KviKvsObjectFunctionCall *c); // QT4 bool setOpacity(KviKvsObjectFunctionCall *c); @@ -113,7 +114,7 @@ public: bool resetPath(KviKvsObjectFunctionCall *c); bool beginPdf(KviKvsObjectFunctionCall *c); - +bool drawPixmapWithEffect(KviKvsObjectFunctionCall *c); bool painterDeviceWidth(KviKvsObjectFunctionCall *c); bool painterDeviceHeight(KviKvsObjectFunctionCall *c); diff --git a/src/modules/objects/KvsObject_pixmap.cpp b/src/modules/objects/KvsObject_pixmap.cpp index a84798f3f..02e8110b7 100644 --- a/src/modules/objects/KvsObject_pixmap.cpp +++ b/src/modules/objects/KvsObject_pixmap.cpp @@ -50,9 +50,8 @@ @description: The pixmap class is an off-screen, pixel-based paint device. @functions: - !fn: $fill(<widget:object>,<x_offset:integer>,<y:offset>) - Fills the pixmap with the widget's background color or pixmap.[br] - Note that x_offset, y_offest are offsets in the widget. + !fn: $fill(<colorname, rgb or hsv array value or [<red>,<green>,<blue>][<hue>,<saturation>,<value>],[opacity],[system color:RGB or HSV]) + Fills the pixmap with color and opacity.[br] !fn: $resize(<width:integer>,<height:integer>) Resizes the pixmap to w width and h height. Set wh or hg to 0, to have a null pixmap. !fn: $scale(<width:integer>,<height:integer>,[<aspect_ratio:string>]) @@ -98,6 +97,11 @@ KVSO_BEGIN_REGISTERCLASS(KvsObject_pixmap,"pixmap","object") KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_pixmap,loadFromMemoryBuffer) KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_pixmap,height) KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_pixmap,width) + KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_pixmap,rotate) + + KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_pixmap,mirrored) + KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_pixmap,setPixel) + KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_pixmap,toGrayScale) KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_pixmap,grabWidget) KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_pixmap,frameChangedEvent) @@ -106,7 +110,9 @@ KVSO_END_REGISTERCLASS(KvsObject_pixmap) KVSO_BEGIN_CONSTRUCTOR(KvsObject_pixmap,KviKvsObject) m_pAnimatedPixmap = 0; + m_currentType = Image; m_pPixmap = 0; + m_pImage = 0; KVSO_END_CONSTRUCTOR(KvsObject_pixmap) @@ -114,44 +120,297 @@ KVSO_BEGIN_DESTRUCTOR(KvsObject_pixmap) emit aboutToDie(); if (m_pPixmap)delete m_pPixmap; if (m_pAnimatedPixmap) delete m_pAnimatedPixmap; + if (m_pImage) delete m_pImage; KVSO_END_CONSTRUCTOR(KvsObject_pixmap) KVSO_CLASS_FUNCTION(pixmap,fill) { - KviKvsObject *pObject; - kvs_int_t iXoffset,iYoffset; - kvs_hobject_t hObject; + kvs_int_t iCol1,iCol2,iCol3,iOpacity; + QString szColorMode,szColor; + KviKvsVariant *var1,*var2,*var3; + KVSO_PARAMETERS_BEGIN(c) + KVSO_PARAMETER("Color_1_Or_Colorname",KVS_PT_VARIANT,0,var1) + KVSO_PARAMETER("Color_2",KVS_PT_VARIANT,KVS_PF_OPTIONAL,var2) + KVSO_PARAMETER("Colo3_3",KVS_PT_VARIANT,KVS_PF_OPTIONAL,var3) + KVSO_PARAMETER("color_mode",KVS_PT_STRING,KVS_PF_OPTIONAL,szColorMode) + KVSO_PARAMETER("opacity",KVS_PT_INT,KVS_PF_OPTIONAL,iOpacity) + KVSO_PARAMETERS_END(c) + QColor col; + if (!var1->asInteger(iCol1)) + { + var1->asString(szColor); + if (c->paramCount()<2) iOpacity=255; + else + { + if (!var2->asInteger(iOpacity)) + { + c->warning(__tr2qs_ctx("The opacity parameter didn't evaluate to integer","objects")); + return true; + } + } + col.setNamedColor(szColor); + col.setAlpha(iOpacity); + } + else + { + if(c->paramCount()<3) + { + c->error(__tr2qs_ctx("Color name or triplette rgb/hsv value required","objects")); + return true; + } + if (!var2->asInteger(iCol2)||!var3->asInteger(iCol3)) + { + c->error(__tr2qs_ctx("One of the triplette parameters didn't evaluate to an integer","objects"));\ + return true; + } + if (c->paramCount()<5) iOpacity=255; + if(KviQString::equalCI(szColorMode, "HSV")) + col.setHsv(iCol1,iCol2,iCol3,iOpacity); + else + col.setRgb(iCol1,iCol2,iCol3,iOpacity); + } + if(m_currentType==Image) + { + if(m_pImage) + { + if(!m_pPixmap) m_pPixmap = new QPixmap(); + *m_pPixmap = QPixmap::fromImage(*m_pImage); + delete m_pImage; + m_pImage = 0; + } + else m_pPixmap = 0; + } + else if(m_currentType==AnimatedPixmap) + { + delete m_pAnimatedPixmap; + m_pAnimatedPixmap=0; + } + m_currentType = Pixmap; + if(!m_pPixmap) m_pPixmap=new QPixmap(); + m_pPixmap->fill(col); + return true; +} + +KVSO_CLASS_FUNCTION(pixmap,resize) +{ + kvs_int_t iWidth,iHeight; KVSO_PARAMETERS_BEGIN(c) - KVSO_PARAMETER("widget",KVS_PT_HOBJECT,0,hObject) - KVSO_PARAMETER("x_offset",KVS_PT_INT,0,iXoffset) - KVSO_PARAMETER("y_offset",KVS_PT_INT,0,iYoffset) + KVSO_PARAMETER("width",KVS_PT_INTEGER,0,iWidth) + KVSO_PARAMETER("height",KVS_PT_INTEGER,0,iHeight) KVSO_PARAMETERS_END(c) + if(m_currentType==Image) + { + if(m_pImage) + delete m_pImage; + m_pImage = 0; + } + else if(m_currentType==AnimatedPixmap) + { + if (m_pAnimatedPixmap) + delete m_pAnimatedPixmap; + m_pAnimatedPixmap=0; + } + else if(m_pPixmap) + { + delete m_pPixmap; + } + m_currentType = Image; + m_pImage=new QImage(iWidth,iHeight,QImage::Format_ARGB32_Premultiplied); + m_pImage->fill(Qt::transparent); + return true; +} - pObject=KviKvsKernel::instance()->objectController()->lookupObject(hObject); - CHECK_HOBJECT_IS_WIDGET(pObject) - if (m_pAnimatedPixmap) +KVSO_CLASS_FUNCTION(pixmap,setPixel) +{ + kvs_int_t iCol1,iCol2,iCol3,iOpacity,iX,iY; + QString szColorMode,szColor; + KviKvsVariant *var1,*var2,*var3; + KVSO_PARAMETERS_BEGIN(c) + KVSO_PARAMETER("x",KVS_PT_INTEGER,0,iX) + KVSO_PARAMETER("y",KVS_PT_INTEGER,0,iY) + KVSO_PARAMETER("Color_1_Or_Colorname",KVS_PT_VARIANT,0,var1) + KVSO_PARAMETER("Color_2",KVS_PT_VARIANT,KVS_PF_OPTIONAL,var2) + KVSO_PARAMETER("Colo3_3",KVS_PT_VARIANT,KVS_PF_OPTIONAL,var3) + KVSO_PARAMETER("color_mode",KVS_PT_STRING,KVS_PF_OPTIONAL,szColorMode) + KVSO_PARAMETER("opacity",KVS_PT_INT,KVS_PF_OPTIONAL,iOpacity) + KVSO_PARAMETERS_END(c) + QColor col; + if (!var1->asInteger(iCol1)) + { + var1->asString(szColor); + if (c->paramCount()<4) iOpacity=255; + else + { + if (!var2->asInteger(iOpacity)) + { + c->warning(__tr2qs_ctx("The opacity parameter didn't evaluate to integer","objects")); + return true; + } + } + col.setNamedColor(szColor); + col.setAlpha(iOpacity); + } + else + { + if(c->paramCount()<5) + { + c->error(__tr2qs_ctx("Color name or triplette rgb/hsv value required","objects")); + return true; + } + if (!var2->asInteger(iCol2)||!var3->asInteger(iCol3)) + { + c->error(__tr2qs_ctx("One of the triplette parameters didn't evaluate to an integer","objects"));\ + return true; + } + if (c->paramCount()<7) iOpacity=255; + if(KviQString::equalCI(szColorMode, "HSV")) + col.setHsv(iCol1,iCol2,iCol3,iOpacity); + else + col.setRgb(iCol1,iCol2,iCol3,iOpacity); + } + + + if(m_currentType==AnimatedPixmap) { - delete m_pAnimatedPixmap; - m_pAnimatedPixmap=0; + c->warning(__tr2qs_ctx("AnimatedPixmap not supported","objects")); + return true; } - if(!m_pPixmap) m_pPixmap=new QPixmap(); - m_pPixmap->fill(((QWidget *)(pObject->object())),iXoffset,iYoffset); + else if((m_currentType==Image && !m_pImage) || (m_currentType==Pixmap && !m_pPixmap)) + { + c->error(__tr2qs_ctx("The pixmap is null","objects")); + return false; + } + else if(m_currentType==Pixmap) + { + if(m_pImage) delete m_pImage; + *m_pImage = m_pPixmap->toImage(); + delete m_pPixmap; + } + m_currentType = Image; + m_pImage->setPixel(iX,iY,col.rgba()); return true; } -KVSO_CLASS_FUNCTION(pixmap,resize) + +KVSO_CLASS_FUNCTION(pixmap,rotate) { - kvs_int_t iWidth,iHeight; + kvs_real_t dAngle; + QString szAxis; KVSO_PARAMETERS_BEGIN(c) - KVSO_PARAMETER("width",KVS_PT_INTEGER,0,iWidth) - KVSO_PARAMETER("height",KVS_PT_INTEGER,0,iHeight) + KVSO_PARAMETER("angle",KVS_PT_DOUBLE,0,dAngle) + KVSO_PARAMETER("axis",KVS_PT_STRING,KVS_PF_OPTIONAL,szAxis) KVSO_PARAMETERS_END(c) - if(m_pPixmap) delete m_pPixmap; - if (m_pAnimatedPixmap){ - delete m_pAnimatedPixmap; - m_pAnimatedPixmap=0; + Qt::Axis axis = Qt::ZAxis; + if(!szAxis.isEmpty()) + { + if (KviQString::equalCI(szAxis,"XAxis"))axis=Qt::XAxis; + else if (KviQString::equalCI(szAxis,"YAxis")) axis=Qt::YAxis; + else if (KviQString::equalCI(szAxis,"ZAxis")) axis=Qt::ZAxis; + else c->warning(__tr2qs_ctx("Unknown axis '%Q' switching to default ZAxis","objects"),&szAxis); + } + if(m_currentType==Pixmap) + { + if(m_pPixmap){ + if(!m_pImage) m_pImage = new QImage(); + *m_pImage = m_pPixmap->toImage(); + } + else{ + c->error(__tr2qs_ctx("The pixmap is null","objects")); + return false; + } + } + else if(m_currentType==AnimatedPixmap) + { + c->warning(__tr2qs_ctx("AnimatedPixmap not supported","objects")); + return true; + } + if(!m_pImage) + { + c->error(__tr2qs_ctx("The pixmap is null","objects")); + return false; + } + m_currentType = Image; + QTransform transform; + transform.rotate(dAngle,axis); + *m_pImage=m_pImage->transformed(transform); + return true; +} + + +KVSO_CLASS_FUNCTION(pixmap,mirrored) +{ + kvs_real_t dAngle; + bool bHorizontal,bVertical; + KVSO_PARAMETERS_BEGIN(c) + KVSO_PARAMETER("bHorizontal",KVS_PT_BOOLEAN,0,bHorizontal) + KVSO_PARAMETER("bvertical",KVS_PT_BOOLEAN,0,bVertical) + + KVSO_PARAMETERS_END(c) + if(m_currentType==Pixmap) + { + if(m_pPixmap){ + if(!m_pImage) m_pImage = new QImage(); + *m_pImage = m_pPixmap->toImage(); + } + else{ + c->error(__tr2qs_ctx("The pixmap is null","objects")); + return false; + } + } + else if(m_currentType==AnimatedPixmap) + { + c->warning(__tr2qs_ctx("AnimatedPixmap not supported","objects")); + return true; + } + if(!m_pImage) + { + c->error(__tr2qs_ctx("The pixmap is null","objects")); + return false; + } + m_currentType = Image; + *m_pImage=m_pImage->mirrored(bHorizontal,bVertical); + return true; +} + + +KVSO_CLASS_FUNCTION(pixmap,toGrayScale) +{ + if(m_currentType==Pixmap) + { + if(m_pPixmap){ + if(!m_pImage) m_pImage = new QImage(); + *m_pImage = m_pPixmap->toImage(); + } + else{ + c->error(__tr2qs_ctx("The pixmap is null","objects")); + return false; + } + } + else if(m_currentType==AnimatedPixmap) + { + c->warning(__tr2qs_ctx("AnimatedPixmap not supported","objects")); + return true; + } + if(!m_pImage) + { + c->error(__tr2qs_ctx("The pixmap is null","objects")); + return false; + } + m_currentType = Image; + QRgb col; + int w=m_pImage->width(); + int h=m_pImage->height(); + int res; + for(int y=0; y<h; y++) + { + QRgb *data = (QRgb *) m_pImage->scanLine(y); + for (int x=0; x<w; x++) + { + col = *data; + res = (qRed(col)+qGreen(col)+qBlue(col))/3; + *data++ = qRgba(res, res, res,qAlpha(col)); + } } - m_pPixmap=new QPixmap(iWidth,iHeight); return true; } KVSO_CLASS_FUNCTION(pixmap,scale) @@ -164,7 +423,6 @@ KVSO_CLASS_FUNCTION(pixmap,scale) KVSO_PARAMETER("aspect_ratio",KVS_PT_STRING,KVS_PF_OPTIONAL,szAspectRatio) KVSO_PARAMETERS_END(c) Qt::AspectRatioMode ratio=Qt::KeepAspectRatio; - if(!m_pPixmap || m_pAnimatedPixmap) return true; if(!szAspectRatio.isEmpty()) { if(KviQString::equalCI(szAspectRatio,"IgnoreAspectRatio")) ratio=Qt::IgnoreAspectRatio; @@ -172,8 +430,23 @@ KVSO_CLASS_FUNCTION(pixmap,scale) else if (KviQString::equalCI(szAspectRatio,"KeepAspectRatioByExpanding")) ratio=Qt::KeepAspectRatioByExpanding; else c->warning(__tr2qs_ctx("Unknown aspect ratio %Q - Switching to KeepAspectRatio ratio","objects"),&szAspectRatio); } - if (m_pAnimatedPixmap) m_pAnimatedPixmap->resize(QSize(iWidth,iHeight),ratio); - else *m_pPixmap=m_pPixmap->scaled(iWidth,iHeight,ratio,Qt::SmoothTransformation); + if(m_currentType==Pixmap) + { + if(m_pPixmap) + *m_pPixmap=m_pPixmap->scaled(iWidth,iHeight,ratio,Qt::SmoothTransformation); + else{ + c->error(__tr2qs_ctx("The pixmap is null","objects")); + return false; + } + } + else if (m_currentType==AnimatedPixmap) + m_pAnimatedPixmap->resize(QSize(iWidth,iHeight),ratio); + else if(m_pImage) + *m_pImage=m_pImage->scaled(iWidth,iHeight,ratio,Qt::SmoothTransformation); + else{ + c->error(__tr2qs_ctx("The pixmap is null","objects")); + return false; + } return true; } KVSO_CLASS_FUNCTION(pixmap,loadAnimation) @@ -185,14 +458,17 @@ KVSO_CLASS_FUNCTION(pixmap,loadAnimation) KVSO_PARAMETERS_END(c) if(!QFile::exists(szFile)) { - c->warning(__tr2qs_ctx("I can't find the specified file '%Q'.","objects"),&szFile); - return true; + c->warning(__tr2qs_ctx("I can't find the specified file '%Q'.","objects"),&szFile); + return true; + } + if (m_pAnimatedPixmap){ + delete m_pAnimatedPixmap; + m_pAnimatedPixmap = 0; } - if (m_pAnimatedPixmap) delete m_pAnimatedPixmap; if (m_pPixmap) { - delete m_pPixmap; - m_pPixmap=0; + delete m_pPixmap; + m_pPixmap=0; } m_pAnimatedPixmap= new KviAnimatedPixmap(szFile); connect(m_pAnimatedPixmap,SIGNAL(frameChanged()),this,SLOT(frameChanged())); @@ -221,12 +497,21 @@ KVSO_CLASS_FUNCTION(pixmap,load) KVSO_PARAMETERS_END(c) if(!QFile::exists(szFile)) { - c->warning(__tr2qs_ctx("I can't find the specified file '%Q'.","objects"),&szFile); - return true; + c->warning(__tr2qs_ctx("I can't find the specified file '%Q'.","objects"),&szFile); + return true; } - if (m_pAnimatedPixmap) delete m_pAnimatedPixmap; + if(!m_pImage) m_pImage=new QImage(); + + m_pImage->load(szFile); + return true; + if (m_currentType==Image && m_pImage) + delete m_pImage; + else if (m_currentType==AnimatedPixmap && m_pAnimatedPixmap) + delete m_pAnimatedPixmap; if(!m_pPixmap) m_pPixmap=new QPixmap(); + m_currentType=Pixmap; m_pPixmap->load(szFile); + qDebug("alpha %i",m_pPixmap->hasAlpha()); return true; } KVSO_CLASS_FUNCTION(pixmap,save) @@ -235,15 +520,41 @@ KVSO_CLASS_FUNCTION(pixmap,save) KVSO_PARAMETERS_BEGIN(c) KVSO_PARAMETER("file",KVS_PT_STRING,0,szFile) KVSO_PARAMETERS_END(c) - if (m_pAnimatedPixmap) m_pAnimatedPixmap->pixmap()->save(szFile); - else if(m_pPixmap) m_pPixmap->save(szFile); + if(m_currentType==Pixmap) + { + if(m_pPixmap) + m_pPixmap->save(szFile); + else{ + c->error(__tr2qs_ctx("The pixmap is null","objects")); + return false; + } + } + else if(m_currentType==Image) + { + if(m_pImage) + m_pImage->save(szFile); + else{ + c->error(__tr2qs_ctx("The pixmap is null","objects")); + return false; + } + } + else m_pAnimatedPixmap->pixmap()->save(szFile); return true; } void KvsObject_pixmap::setInternalPixmap(QPixmap *pPixmap) { - delete m_pPixmap; - m_pPixmap=pPixmap; + if(m_currentType==Image && m_pImage) delete m_pImage; + else if(m_currentType==Pixmap && m_pPixmap) delete m_pPixmap; + m_currentType=Pixmap; + m_pPixmap=pPixmap; +} +void KvsObject_pixmap::setInternalImage(QImage *pImage) +{ + if(m_currentType==Image && m_pImage) delete m_pImage; + else if(m_currentType==Pixmap && m_pPixmap) delete m_pPixmap; + m_currentType=Image; + m_pImage=pImage; } KVSO_CLASS_FUNCTION(pixmap,loadFromMemoryBuffer) { @@ -307,25 +618,30 @@ KVSO_CLASS_FUNCTION(pixmap,grabWidget) } KVSO_CLASS_FUNCTION(pixmap,height) { - if(!m_pAnimatedPixmap && !m_pPixmap) c->returnValue()->setInteger(0); - else if(m_pAnimatedPixmap) c->returnValue()->setInteger(m_pAnimatedPixmap->size().height()); - else c->returnValue()->setInteger(m_pPixmap->height()); + if (m_currentType==Image && m_pImage) c->returnValue()->setInteger(m_pImage->height()); + else if(m_currentType==Pixmap && m_pPixmap) c->returnValue()->setInteger(m_pPixmap->height()); + else c->returnValue()->setInteger(0); + //else if(m_pAnimatedPixmap) c->returnValue()->setInteger(m_pAnimatedPixmap->size().height()); + //else c->returnValue()->setInteger(m_pPixmap->height()); return true; } KVSO_CLASS_FUNCTION(pixmap,width) { - if(!m_pAnimatedPixmap && !m_pPixmap) c->returnValue()->setInteger(0); - else if(m_pAnimatedPixmap) c->returnValue()->setInteger(m_pAnimatedPixmap->size().width()); - else c->returnValue()->setInteger(m_pPixmap->width()); - return true; + + if (m_currentType==Image && m_pImage) c->returnValue()->setInteger(m_pImage->width()); + else if(m_currentType==Pixmap && m_pPixmap) c->returnValue()->setInteger(m_pPixmap->width()); + else c->returnValue()->setInteger(0); + //else if(m_pAnimatedPixmap) c->returnValue()->setInteger(m_pAnimatedPixmap->size().height()); + //else c->returnValue()->setInteger(m_pPixmap->height()); + return true; } -QPixmap * KvsObject_pixmap::getPixmap() +/*QPixmap * KvsObject_pixmap::getPixmap() { if (!m_pAnimatedPixmap && !m_pPixmap) return new QPixmap(); else if(m_pAnimatedPixmap) return m_pAnimatedPixmap->pixmap(); else return m_pPixmap; -} +}*/ KVSO_CLASS_FUNCTION(pixmap,frameChangedEvent) { emitSignal("frameChanged",c); diff --git a/src/modules/objects/KvsObject_pixmap.h b/src/modules/objects/KvsObject_pixmap.h index 154713872..e0845224c 100644 --- a/src/modules/objects/KvsObject_pixmap.h +++ b/src/modules/objects/KvsObject_pixmap.h @@ -43,12 +43,45 @@ class KvsObject_pixmap : public KviKvsObject // Q_PROPERTY(QPixmap pixmap READ getPixmap) public: KVSO_DECLARE_OBJECT(KvsObject_pixmap) - QPixmap * getPixmap(); - void setInternalPixmap(QPixmap *p); - //QPixmap * pixmap(){ return m_pPixmap; } + enum Type { Pixmap, AnimatedPixmap, Image }; + Type m_currentType; + void setInternalPixmap(QPixmap *pPixmap); + void setInternalImage(QImage *pImage); + + QImage * getImage() + { + if(!m_pImage) m_pImage = new QImage(); + if(m_currentType==Pixmap) + { + if(m_pPixmap){ + *m_pImage = m_pPixmap->toImage(); + delete m_pPixmap; + m_pPixmap = 0; + } + } + m_currentType = Image; + return m_pImage; + } + + QPixmap * getPixmap() + { + if(!m_pPixmap) m_pPixmap = new QPixmap(); + if(m_currentType==Image) + { + if(m_pImage){ + *m_pPixmap = m_pPixmap->fromImage(*m_pImage); + delete m_pImage; + m_pImage = 0; + } + } + m_currentType = Pixmap; + return m_pPixmap; + } + protected: KviAnimatedPixmap * m_pAnimatedPixmap; QPixmap * m_pPixmap; + QImage * m_pImage; signals: void aboutToDie(); protected: @@ -65,8 +98,11 @@ protected: bool height(KviKvsObjectFunctionCall *c); bool width(KviKvsObjectFunctionCall *c); bool grabWidget(KviKvsObjectFunctionCall *c); -// bool setOpacity(KviKvsObjectFunctionCall *c); bool loadFromMemoryBuffer(KviKvsObjectFunctionCall *c); + bool rotate(KviKvsObjectFunctionCall *c); + bool toGrayScale(KviKvsObjectFunctionCall *c); + bool mirrored(KviKvsObjectFunctionCall *c); + bool setPixel(KviKvsObjectFunctionCall *c); bool frameChangedEvent(KviKvsObjectFunctionCall *c); diff --git a/src/modules/objects/KvsObject_treeWidget.h b/src/modules/objects/KvsObject_treeWidget.h index 05fb3f4cc..aabbafdf7 100644 --- a/src/modules/objects/KvsObject_treeWidget.h +++ b/src/modules/objects/KvsObject_treeWidget.h @@ -43,6 +43,8 @@ public: protected: virtual bool init(KviKvsRunTimeContext * pContext,KviKvsVariantList *pParams); + + bool setBackgroundImage(KviKvsObjectFunctionCall *c); bool addColumn(KviKvsObjectFunctionCall *c); bool setColumnText(KviKvsObjectFunctionCall *c); bool takeItem(KviKvsObjectFunctionCall *c); diff --git a/src/modules/objects/KvsObject_treeWidgeteItem.cpp b/src/modules/objects/KvsObject_treeWidgeteItem.cpp index da7422687..8e7903227 100644 --- a/src/modules/objects/KvsObject_treeWidgeteItem.cpp +++ b/src/modules/objects/KvsObject_treeWidgeteItem.cpp @@ -192,6 +192,7 @@ bool KvsObject_treeWidgetItem::init(KviKvsRunTimeContext * pContext,KviKvsVarian return false; } } + return true; } diff --git a/src/modules/objects/KvsObject_webView.cpp b/src/modules/objects/KvsObject_webView.cpp index 6e3b5e9b9..f164835f0 100644 --- a/src/modules/objects/KvsObject_webView.cpp +++ b/src/modules/objects/KvsObject_webView.cpp @@ -32,7 +32,7 @@ #include "KviLocale.h" #if defined(COMPILE_WEBKIT_SUPPORT) -#include <QtWebKit/QWebView> +#include <QWebView> #include <QWebSettings> #include <QWebElement> #include <QNetworkRequest> @@ -260,9 +260,9 @@ KVSO_CLASS_FUNCTION(webView,makePreview) { CHECK_INTERNAL_POINTER(widget()) QSize size=((QWebView *)widget())->page()->mainFrame()->contentsSize(); - QImage image(212,142, QImage::Format_RGB32); + QImage *pImage=new QImage(212,142, QImage::Format_RGB32); QWebFrame *pFrame=((QWebView *)widget())->page()->mainFrame(); - QPainter painter(&image); + QPainter painter(pImage); painter.setRenderHint(QPainter::Antialiasing, true); painter.setRenderHint(QPainter::TextAntialiasing, true); painter.setRenderHint(QPainter::SmoothPixmapTransform, true); @@ -279,12 +279,10 @@ KVSO_CLASS_FUNCTION(webView,makePreview) painter.scale(dWScale,dHScale); pFrame->documentElement().render(&painter); painter.end(); - QPixmap *pPixmap=new QPixmap(); - *pPixmap=pPixmap->fromImage(image); KviKvsObjectClass * pClass = KviKvsKernel::instance()->objectController()->lookupClass("pixmap"); KviKvsVariantList params; KviKvsObject * pObject = pClass->allocateInstance(0,"internalpixmap",c->context(),¶ms); - ((KvsObject_pixmap *)pObject)->setInternalPixmap(pPixmap); + ((KvsObject_pixmap *)pObject)->setInternalImage(pImage); c->returnValue()->setHObject(pObject->handle()); return true; } diff --git a/src/modules/objects/KvsObject_webView.h b/src/modules/objects/KvsObject_webView.h index 3e16c0ed0..f9b76875e 100644 --- a/src/modules/objects/KvsObject_webView.h +++ b/src/modules/objects/KvsObject_webView.h @@ -30,8 +30,8 @@ #include "object_macros.h" #include <QFile> #include <QNetworkAccessManager> -#include <QtWebKit/QWebView> -#include <QtWebKit/QWebFrame> +#include <QWebView> +#include <QWebFrame> #include <QWebElement> class KvsObject_webView : public KviKvsObject diff --git a/src/modules/objects/KvsObject_widget.cpp b/src/modules/objects/KvsObject_widget.cpp index 0d1550e9e..2a2cfe588 100644 --- a/src/modules/objects/KvsObject_widget.cpp +++ b/src/modules/objects/KvsObject_widget.cpp @@ -37,6 +37,7 @@ #include "KviStatusBar.h" #include "KvsObject_painter.h" + #include <QKeyEvent> #include <QDesktopWidget> #include <QWidget> @@ -683,7 +684,7 @@ KVSO_BEGIN_REGISTERCLASS(KvsObject_widget,"widget","object") KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_widget,colorPalette) KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_widget,setStyleSheet) KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_widget,setKeyShortcut) - +KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_widget,grab) // statusbar KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_widget,insertIntoStatusBar) KVSO_REGISTER_HANDLER_BY_NAME(KvsObject_widget,removeFromStatusBar) @@ -720,7 +721,15 @@ KVSO_END_CONSTRUCTOR(KvsObject_widget) bool KvsObject_widget::init(KviKvsRunTimeContext *c,KviKvsVariantList *) { setObject(new KviKvsWidget(this,parentScriptWidget())); - m_pContext=c; + //qDebug("abc"); + /*QGraphicsDropShadowEffect *effect = new QGraphicsDropShadowEffect(widget()); + effect->setColor(QColor(0, 0, 0, 255)); + effect->setBlurRadius(20); + widget()->setGraphicsEffect(effect); + if (!widget()->graphicsEffect()) qDebug("non settato"); + else qDebug("settato"); + */ + m_pContext=c; widget()->setObjectName(getName()); return true; } @@ -1990,8 +1999,7 @@ KVSO_CLASS_FUNCTION(widget,setKeyShortcut) KVSO_CLASS_FUNCTION(widget,insertIntoStatusBar) { CHECK_INTERNAL_POINTER(widget()) - qDebug("instertinto"); - if (g_pMainWindow->mainStatusBar()) + if (g_pMainWindow->mainStatusBar()) g_pMainWindow->mainStatusBar()->insertPermanentWidgetAtTheEnd(widget(),0); return true; } @@ -2002,6 +2010,39 @@ KVSO_CLASS_FUNCTION(widget,removeFromStatusBar) g_pMainWindow->statusBar()->removeWidget(widget()); return true; } +KVSO_CLASS_FUNCTION(widget,grab) +{ + qDebug("Grab"); + CHECK_INTERNAL_POINTER(widget()) + KviKvsObject *ob; + kvs_hobject_t hObject; + KVSO_PARAMETERS_BEGIN(c) + KVSO_PARAMETER("widget",KVS_PT_HOBJECT,0,hObject) + KVSO_PARAMETERS_END(c) + qDebug("Get widget"); + ob=KviKvsKernel::instance()->objectController()->lookupObject(hObject); + if (!ob) + { + c->warning(__tr2qs_ctx("Widget parameter is not an object","objects")); + return true; + } + qDebug("check widgetype"); + if(!ob->object()->isWidgetType()) + { + c->warning(__tr2qs_ctx("Widget object required","objects")); + return true; + } + + QPixmap *pPixmap=new QPixmap(); + qDebug("grabbing"); + *pPixmap=QPixmap::grabWidget(((QWidget *)(ob->object()))); + KviKvsObjectClass * pClass = KviKvsKernel::instance()->objectController()->lookupClass("pixmap"); + KviKvsVariantList params; + KviKvsObject * pObject = pClass->allocateInstance(0,"internalpixmap",c->context(),¶ms); + ((KvsObject_pixmap *)pObject)->setInternalPixmap(pPixmap); + c->returnValue()->setHObject(pObject->handle()); + return true; +} #ifndef COMPILE_USE_STANDALONE_MOC_SOURCES diff --git a/src/modules/objects/KvsObject_widget.h b/src/modules/objects/KvsObject_widget.h index cc2610ff0..200492e85 100644 --- a/src/modules/objects/KvsObject_widget.h +++ b/src/modules/objects/KvsObject_widget.h @@ -30,6 +30,8 @@ #include "KviTalToolTip.h" #include "object_macros.h" +#include <QGraphicsEffect> + #ifdef COMPILE_WEBKIT_SUPPORT #include <QtWebKit/QWebView> #endif @@ -51,6 +53,7 @@ protected: #endif virtual bool eventFilter(QObject *o,QEvent *e); KviKvsRunTimeContext *m_pContext; + QGraphicsDropShadowEffect *pGraphicsEffect; // ok, it is clear that we're messing with the naming conventions for the // object classes :D // let's try to use this one: @@ -120,6 +123,8 @@ protected: bool windowTitle(KviKvsObjectFunctionCall *c); bool x(KviKvsObjectFunctionCall *); bool y(KviKvsObjectFunctionCall *); + + bool grab(KviKvsObjectFunctionCall *); #ifdef COMPILE_WEBKIT_SUPPORT bool setWebView(KviKvsObjectFunctionCall *c); #endif diff --git a/src/modules/objects/libkviobjects.cpp b/src/modules/objects/libkviobjects.cpp index 69461fe5e..c3ef16822 100644 --- a/src/modules/objects/libkviobjects.cpp +++ b/src/modules/objects/libkviobjects.cpp @@ -28,6 +28,8 @@ #include "KvsObject_checkBox.h" #include "KvsObject_comboBox.h" #include "KvsObject_dialog.h" +#include "KvsObject_colorDialog.h" + #include "KvsObject_dockWindow.h" #include "KvsObject_file.h" #include "KvsObject_ftp.h" @@ -102,9 +104,9 @@ static bool objects_module_cleanup(KviModule *) #if defined(COMPILE_WEBKIT_SUPPORT) KvsObject_webView::unregisterSelf(); #endif - KvsObject_memoryBuffer::unregisterSelf(); + KvsObject_memoryBuffer::unregisterSelf(); KvsObject_process::unregisterSelf(); - KvsObject_trayIcon::unregisterSelf(); + KvsObject_trayIcon::unregisterSelf(); KvsObject_ftp::unregisterSelf(); KvsObject_http::unregisterSelf(); KvsObject_socket::unregisterSelf(); @@ -138,18 +140,18 @@ static bool objects_module_cleanup(KviModule *) KvsObject_vBox::unregisterSelf(); KvsObject_label::unregisterSelf(); KvsObject_groupBox::unregisterSelf(); + KvsObject_colorDialog::unregisterSelf(); KvsObject_dialog::unregisterSelf(); KvsObject_checkBox::unregisterSelf(); KvsObject_textBrowser::unregisterSelf(); KvsObject_textedit::unregisterSelf(); KvsObject_button::unregisterSelf(); - KvsObject_dateTimeEdit::unregisterSelf(); - KvsObject_tableWidget::unregisterSelf(); - KvsObject_widget::unregisterSelf(); + KvsObject_dateTimeEdit::unregisterSelf(); + KvsObject_tableWidget::unregisterSelf(); + KvsObject_widget::unregisterSelf(); KvsObject_list::unregisterSelf(); - KvsObject_sql::unregisterSelf(); + KvsObject_sql::unregisterSelf(); KvsObject_buttonGroup::unregisterSelf(); - return true; } @@ -760,7 +762,6 @@ static bool objects_module_init(KviModule * m) // Derived classes must be registered after the base ones. KvsObject_buttonGroup::registerSelf(); - KvsObject_sql::registerSelf(); KvsObject_list::registerSelf(); KvsObject_widget::registerSelf(); @@ -771,6 +772,7 @@ static bool objects_module_init(KviModule * m) KvsObject_textBrowser::registerSelf(); KvsObject_checkBox::registerSelf(); KvsObject_dialog::registerSelf(); + KvsObject_colorDialog::registerSelf(); KvsObject_groupBox::registerSelf(); KvsObject_label::registerSelf(); KvsObject_vBox::registerSelf(); @@ -804,7 +806,7 @@ static bool objects_module_init(KviModule * m) KvsObject_socket::registerSelf(); KvsObject_http::registerSelf(); KvsObject_ftp::registerSelf(); - KvsObject_trayIcon::registerSelf(); + KvsObject_trayIcon::registerSelf(); KvsObject_process::registerSelf(); KvsObject_memoryBuffer::registerSelf(); #if defined(COMPILE_WEBKIT_SUPPORT) |
