summaryrefslogtreecommitdiff
path: root/utils/wpseditor/gui/src/qwpsdrawer.cpp
diff options
context:
space:
mode:
authorFrank Gevaerts <frank@gevaerts.be>2008-08-29 21:08:38 +0000
committerFrank Gevaerts <frank@gevaerts.be>2008-08-29 21:08:38 +0000
commit5d22e3cbdd251819a4d2d07b9a12994d5aef778d (patch)
tree4c6a81187ccf065a5f296a903b9f7da88503e403 /utils/wpseditor/gui/src/qwpsdrawer.cpp
parentcc31b1fbdae455f975b69dd6bffc23d8bd021566 (diff)
downloadrockbox-5d22e3cbdd251819a4d2d07b9a12994d5aef778d.zip
rockbox-5d22e3cbdd251819a4d2d07b9a12994d5aef778d.tar.gz
rockbox-5d22e3cbdd251819a4d2d07b9a12994d5aef778d.tar.bz2
rockbox-5d22e3cbdd251819a4d2d07b9a12994d5aef778d.tar.xz
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
Diffstat (limited to 'utils/wpseditor/gui/src/qwpsdrawer.cpp')
-rw-r--r--utils/wpseditor/gui/src/qwpsdrawer.cpp200
1 files changed, 200 insertions, 0 deletions
diff --git a/utils/wpseditor/gui/src/qwpsdrawer.cpp b/utils/wpseditor/gui/src/qwpsdrawer.cpp
new file mode 100644
index 0000000..ab8a4b3
--- /dev/null
+++ b/utils/wpseditor/gui/src/qwpsdrawer.cpp
@@ -0,0 +1,200 @@
+#include "qwpsdrawer.h"
+#include "slider.h"
+#include "utils.h"
+#include <QtGui>
+#include <QLibrary>
+#include <stdarg.h>
+//
+
+
+QPointer<QWpsDrawer> 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.5<avp.width ;i++) {
+ g.drawLine(int(i*avp.fontheight/1.5), 0, int(i*avp.fontheight/1.5), avp.height);
+ }
+ for (int j=0;j*avp.fontheight<avp.height; j++) {
+ g.drawLine(0,j*avp.fontheight,avp.width,j*avp.fontheight);
+ }
+ }
+
+ p.drawPixmap((rect.width()-pix->width())/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();
+}