From 5d22e3cbdd251819a4d2d07b9a12994d5aef778d Mon Sep 17 00:00:00 2001 From: Frank Gevaerts Date: Fri, 29 Aug 2008 21:08:38 +0000 Subject: Add wpseditor, the Google Summer of Code 2008 project of Rostislav Chekan. Closes FS#9327 git-svn-id: svn://svn.rockbox.org/rockbox/trunk@18362 a1c6a512-1295-4272-9138-f99709370657 --- utils/wpseditor/gui/src/qwpsdrawer.cpp | 200 +++++++++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 utils/wpseditor/gui/src/qwpsdrawer.cpp (limited to 'utils/wpseditor/gui/src/qwpsdrawer.cpp') diff --git a/utils/wpseditor/gui/src/qwpsdrawer.cpp b/utils/wpseditor/gui/src/qwpsdrawer.cpp new file mode 100644 index 0000000000..ab8a4b32d6 --- /dev/null +++ b/utils/wpseditor/gui/src/qwpsdrawer.cpp @@ -0,0 +1,200 @@ +#include "qwpsdrawer.h" +#include "slider.h" +#include "utils.h" +#include +#include +#include +// + + +QPointer drawer; +QPixmap *QWpsDrawer::pix = NULL; +QString QWpsDrawer::mTmpWpsString; +QImage QWpsDrawer::backdrop; +proxy_api QWpsDrawer::api; + +QWpsDrawer::QWpsDrawer( QWpsState *ws,QTrackState *ms, QWidget *parent ) + : QWidget(parent),wpsState(ws),trackState(ms),showGrid(false),mTargetLibName("libwps") { + + tryResolve(); + memset(&api,0,sizeof(struct proxy_api)); + + api.verbose = 2; + api.putsxy = &QWpsDrawer::putsxy; + api.transparent_bitmap_part = &QWpsDrawer::transparent_bitmap_part; + api.bitmap_part = &QWpsDrawer::bitmap_part; + api.drawpixel = &QWpsDrawer::drawpixel; + api.fillrect = &QWpsDrawer::fillrect; + api.hline = &QWpsDrawer::hline; + api.vline = &QWpsDrawer::vline; + api.clear_viewport = &QWpsDrawer::clear_viewport; + api.load_wps_backdrop = &QWpsDrawer::load_wps_backdrop; + api.read_bmp_file = &QWpsDrawer::read_bmp_file; + api.debugf = &qlogger; + newTempWps(); +} + +bool QWpsDrawer::tryResolve() { + QLibrary lib(qApp->applicationDirPath()+"/"+mTargetLibName); + wps_init = (pfwps_init)lib.resolve("wps_init"); + wps_display = (pfwps_display)lib.resolve("wps_display"); + wps_refresh = (pfwps_refresh)lib.resolve("wps_refresh"); + mResolved = wps_init && wps_display && wps_refresh; + if (!mResolved) + DEBUGF1(tr("ERR: Failed to resolve funcs!")); + return mResolved; +} +QWpsDrawer::~QWpsDrawer() { + qDebug()<<"QWpsDrawer::~QWpsDrawer()"; + cleanTemp(); +} + +void QWpsDrawer::mouseReleaseEvent ( QMouseEvent * event ) { + Q_UNUSED(event); + /*int x = event->x() - (this->width()-pix->width())/2, + y = event->y() - (this->height()-pix->height())/2; + DEBUGF1("x=%d,y=%d",x,y);*/ +} +void QWpsDrawer::newTempWps() { + QTemporaryFile tmpWps; + tmpWps.setAutoRemove(false); + tmpWps.setFileTemplate(QDir::tempPath()+"/XXXXXXXXXX.wps"); + if (tmpWps.open()) { + QString tmpDir = tmpWps.fileName().left(tmpWps.fileName().length()-4); + if (QDir::temp().mkpath(tmpDir)) { + mTmpWpsString = tmpDir; + DEBUGF1(mTmpWpsString); + } + } +} + +void QWpsDrawer::WpsInit(QString buffer, bool isFile) { + + if (!mResolved) + if (!tryResolve()) + return; + if (isFile) { + cleanTemp(); + DEBUGF1( tr("Loading %1").arg(buffer)); + QFile file(buffer); + if (file.open(QIODevice::ReadOnly | QIODevice::Text)) + mWpsString = file.readAll(); + newTempWps(); + } else + mWpsString = buffer; + { + QFile tfile(mTmpWpsString+".wps"); + if (tfile.open(QIODevice::WriteOnly | QIODevice::Text)) + tfile.write(mWpsString.toAscii(),mWpsString.length()); + } + + if (isFile) + wps_init(buffer.toAscii(), &api, isFile); + else + wps_init(QString(mTmpWpsString+".wps").toAscii(), &api, true); + pix = new QPixmap(api.getwidth(),api.getheight()); + + drawBackdrop(); + + setMinimumWidth(api.getwidth()); + setMinimumHeight(api.getheight()); + + update(); +} + +void QWpsDrawer::paintEvent(QPaintEvent * event) { + if (!mResolved) + return; + if (pix==NULL) + return; + QPainter p(this); + QRect rect = event->rect(); + + drawBackdrop(); + wps_refresh(); + + if (showGrid) { + QPainter g(pix); + viewport_api avp; + api.get_current_vp(&avp); + + g.setPen(Qt::green); + + for (int i=0;i*avp.fontheight/1.5width())/2,(rect.height()-pix->height())/2,*pix); + +} + +void QWpsDrawer::clear_viewport(int x,int y,int w,int h, int color) { + DEBUGF2("clear_viewport(int x=%d,int y=%d,int w=%d,int h=%d, int color)",x,y,w,h); + QPainter p(pix); + //p.setOpacity(0.1); + //QImage img = backdrop.copy(x,y,w,h); + //p.drawImage(x,y,img); +} + +void QWpsDrawer::slotSetVolume() { + Slider *slider = new Slider(this, tr("Volume"),-74,10); + slider->show(); + connect(slider, SIGNAL(valueChanged(int)), wpsState, SLOT(setVolume(int))); + connect(this, SIGNAL(destroyed()),slider, SLOT(close())); +} + +void QWpsDrawer::slotSetProgress() { + Slider *slider = new Slider(this,tr("Progress"),0,100); + slider->show(); + connect(slider, SIGNAL(valueChanged(int)), trackState, SLOT(setElapsed(int))); + connect(this, SIGNAL(destroyed()),slider, SLOT(close())); +} + +void QWpsDrawer::slotWpsStateChanged(wpsstate ws_) { + if (api.set_wpsstate) + api.set_wpsstate(ws_); + update(); +} + +void QWpsDrawer::slotTrackStateChanged(trackstate ms_) { + if (api.set_wpsstate) + api.set_trackstate(ms_); + update(); +} + +void QWpsDrawer::slotShowGrid(bool show) { + showGrid = show; + update(); +} + +void QWpsDrawer::drawBackdrop() { + QPainter b(pix); + QImage pink = backdrop.createMaskFromColor(qRgb(255,0,255),Qt::MaskOutColor); + backdrop.setAlphaChannel(pink); + b.drawImage(0,0,backdrop); +} + +void QWpsDrawer::slotSetAudioStatus(int status) { + api.set_audio_status(status); + update(); +} + +void QWpsDrawer::cleanTemp(bool fileToo) { + if (fileToo) + QFile::remove(mTmpWpsString+".wps"); + QDirIterator it(mTmpWpsString, QDirIterator::Subdirectories); + while (it.hasNext()) { + QFile::remove(it.next()); + } + QDir(mTmpWpsString).rmdir(mTmpWpsString); +} + +void QWpsDrawer::closeEvent(QCloseEvent *event) { + qDebug()<<"QWpsDrawer::closeEvent()"; + cleanTemp(); + event->accept(); +} -- cgit v1.2.3