summaryrefslogtreecommitdiff
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
parentcc31b1fbdae455f975b69dd6bffc23d8bd021566 (diff)
downloadrockbox-5d22e3cbdd251819a4d2d07b9a12994d5aef778d.tar.gz
rockbox-5d22e3cbdd251819a4d2d07b9a12994d5aef778d.zip
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
-rw-r--r--apps/gui/wps_debug.c16
-rw-r--r--apps/gui/wps_parser.c17
-rw-r--r--apps/misc.c47
-rw-r--r--apps/settings.h3
-rw-r--r--docs/CREDITS1
-rw-r--r--firmware/font.c6
-rw-r--r--firmware/include/inttypes.h5
-rw-r--r--firmware/include/time.h6
-rw-r--r--firmware/mp3data.c2
-rw-r--r--utils/wpseditor/README21
-rw-r--r--utils/wpseditor/TODO7
-rw-r--r--utils/wpseditor/gui/gui.pro40
-rw-r--r--utils/wpseditor/gui/src/QPropertyEditor/ColorCombo.cpp73
-rw-r--r--utils/wpseditor/gui/src/QPropertyEditor/ColorCombo.h49
-rw-r--r--utils/wpseditor/gui/src/QPropertyEditor/Property.cpp136
-rw-r--r--utils/wpseditor/gui/src/QPropertyEditor/Property.h157
-rw-r--r--utils/wpseditor/gui/src/QPropertyEditor/QPropertyEditor.pro26
-rw-r--r--utils/wpseditor/gui/src/QPropertyEditor/QPropertyEditorWidget.cpp56
-rw-r--r--utils/wpseditor/gui/src/QPropertyEditor/QPropertyEditorWidget.h113
-rw-r--r--utils/wpseditor/gui/src/QPropertyEditor/QPropertyModel.cpp236
-rw-r--r--utils/wpseditor/gui/src/QPropertyEditor/QPropertyModel.h105
-rw-r--r--utils/wpseditor/gui/src/QPropertyEditor/QVariantDelegate.cpp105
-rw-r--r--utils/wpseditor/gui/src/QPropertyEditor/QVariantDelegate.h78
-rw-r--r--utils/wpseditor/gui/src/main.cpp16
-rw-r--r--utils/wpseditor/gui/src/qtrackstate.cpp41
-rw-r--r--utils/wpseditor/gui/src/qtrackstate.h57
-rw-r--r--utils/wpseditor/gui/src/qwpsdrawer.cpp200
-rw-r--r--utils/wpseditor/gui/src/qwpsdrawer.h82
-rw-r--r--utils/wpseditor/gui/src/qwpsdrawer_static.cpp77
-rw-r--r--utils/wpseditor/gui/src/qwpseditorwindow.cpp120
-rw-r--r--utils/wpseditor/gui/src/qwpseditorwindow.h45
-rw-r--r--utils/wpseditor/gui/src/qwpsstate.cpp29
-rw-r--r--utils/wpseditor/gui/src/qwpsstate.h54
-rw-r--r--utils/wpseditor/gui/src/slider.cpp20
-rw-r--r--utils/wpseditor/gui/src/slider.h21
-rw-r--r--utils/wpseditor/gui/src/utils.cpp28
-rw-r--r--utils/wpseditor/gui/src/utils.h12
-rw-r--r--utils/wpseditor/gui/ui/mainwindow.ui290
-rw-r--r--utils/wpseditor/gui/ui/slider.ui43
-rw-r--r--utils/wpseditor/libwps/Makefile100
-rw-r--r--utils/wpseditor/libwps/buildall.sh7
-rw-r--r--utils/wpseditor/libwps/cleanall.sh7
-rw-r--r--utils/wpseditor/libwps/src/api.c268
-rw-r--r--utils/wpseditor/libwps/src/api.h85
-rw-r--r--utils/wpseditor/libwps/src/defs.h41
-rw-r--r--utils/wpseditor/libwps/src/dummies.c363
-rw-r--r--utils/wpseditor/libwps/src/dummies.h44
-rw-r--r--utils/wpseditor/libwps/src/include/lang.h10
-rw-r--r--utils/wpseditor/libwps/src/include/rockboxlogo.h1
-rw-r--r--utils/wpseditor/libwps/src/include/sysfont.h1
-rw-r--r--utils/wpseditor/libwps/src/include/system-target.h1
-rw-r--r--utils/wpseditor/libwps/src/lcd.c150
-rw-r--r--utils/wpseditor/libwps/src/proxy.c132
-rw-r--r--utils/wpseditor/libwps/src/proxy.h25
-rw-r--r--utils/wpseditor/libwps/src/wpsstate.h34
-rw-r--r--utils/wpseditor/libwps/targets.txt33
-rw-r--r--utils/wpseditor/wpseditor.pro2
57 files changed, 3711 insertions, 33 deletions
diff --git a/apps/gui/wps_debug.c b/apps/gui/wps_debug.c
index 4e6af388ac..f843b989a2 100644
--- a/apps/gui/wps_debug.c
+++ b/apps/gui/wps_debug.c
@@ -25,7 +25,11 @@
25#include <string.h> 25#include <string.h>
26#include "gwps.h" 26#include "gwps.h"
27#ifdef __PCTOOL__ 27#ifdef __PCTOOL__
28#ifdef WPSEDITOR
29#include "proxy.h"
30#else
28#define DEBUGF printf 31#define DEBUGF printf
32#endif
29#else 33#else
30#include "debug.h" 34#include "debug.h"
31#endif 35#endif
@@ -589,18 +593,18 @@ void print_debug_info(struct wps_data *data, enum wps_parse_error fail, int line
589 { 593 {
590 char buf[64]; 594 char buf[64];
591 595
592 DEBUGF("Failed parsing on line %d : ", line); 596 DEBUGF("ERR: Failed parsing on line %d : ", line);
593 switch (fail) 597 switch (fail)
594 { 598 {
595 case PARSE_OK: 599 case PARSE_OK:
596 break; 600 break;
597 601
598 case PARSE_FAIL_UNCLOSED_COND: 602 case PARSE_FAIL_UNCLOSED_COND:
599 DEBUGF("Unclosed conditional"); 603 DEBUGF("ERR: Unclosed conditional");
600 break; 604 break;
601 605
602 case PARSE_FAIL_INVALID_CHAR: 606 case PARSE_FAIL_INVALID_CHAR:
603 DEBUGF("unexpected conditional char after token %d: \"%s\"", 607 DEBUGF("ERR: Unexpected conditional char after token %d: \"%s\"",
604 data->num_tokens-1, 608 data->num_tokens-1,
605 get_token_desc(&data->tokens[data->num_tokens-1], data, 609 get_token_desc(&data->tokens[data->num_tokens-1], data,
606 buf, sizeof(buf)) 610 buf, sizeof(buf))
@@ -608,7 +612,7 @@ void print_debug_info(struct wps_data *data, enum wps_parse_error fail, int line
608 break; 612 break;
609 613
610 case PARSE_FAIL_COND_SYNTAX_ERROR: 614 case PARSE_FAIL_COND_SYNTAX_ERROR:
611 DEBUGF("Conditional syntax error after token %d: \"%s\"", 615 DEBUGF("ERR: Conditional syntax error after token %d: \"%s\"",
612 data->num_tokens-1, 616 data->num_tokens-1,
613 get_token_desc(&data->tokens[data->num_tokens-1], data, 617 get_token_desc(&data->tokens[data->num_tokens-1], data,
614 buf, sizeof(buf)) 618 buf, sizeof(buf))
@@ -616,7 +620,7 @@ void print_debug_info(struct wps_data *data, enum wps_parse_error fail, int line
616 break; 620 break;
617 621
618 case PARSE_FAIL_COND_INVALID_PARAM: 622 case PARSE_FAIL_COND_INVALID_PARAM:
619 DEBUGF("Invalid parameter list for token %d: \"%s\"", 623 DEBUGF("ERR: Invalid parameter list for token %d: \"%s\"",
620 data->num_tokens, 624 data->num_tokens,
621 get_token_desc(&data->tokens[data->num_tokens], data, 625 get_token_desc(&data->tokens[data->num_tokens], data,
622 buf, sizeof(buf)) 626 buf, sizeof(buf))
@@ -624,7 +628,7 @@ void print_debug_info(struct wps_data *data, enum wps_parse_error fail, int line
624 break; 628 break;
625 629
626 case PARSE_FAIL_LIMITS_EXCEEDED: 630 case PARSE_FAIL_LIMITS_EXCEEDED:
627 DEBUGF("Limits exceeded"); 631 DEBUGF("ERR: Limits exceeded");
628 break; 632 break;
629 } 633 }
630 DEBUGF("\n"); 634 DEBUGF("\n");
diff --git a/apps/gui/wps_parser.c b/apps/gui/wps_parser.c
index 714c419af1..b2baddd747 100644
--- a/apps/gui/wps_parser.c
+++ b/apps/gui/wps_parser.c
@@ -28,14 +28,25 @@
28#include "plugin.h" 28#include "plugin.h"
29 29
30#ifdef __PCTOOL__ 30#ifdef __PCTOOL__
31#ifdef WPSEDITOR
32#include "proxy.h"
33#include "settings.h"
34#include "sysfont.h"
35#include "gwps.h"
36#include "font.h"
37#include "bmp.h"
38#include "backdrop.h"
39#include "ctype.h"
40#else
41#include "checkwps.h"
42#define SYSFONT_HEIGHT 8
31#define DEBUGF printf 43#define DEBUGF printf
44#endif /*WPSEDITOR*/
32#define FONT_SYSFIXED 0 45#define FONT_SYSFIXED 0
33#define FONT_UI 1 46#define FONT_UI 1
34#define SYSFONT_HEIGHT 8
35#include "checkwps.h"
36#else 47#else
37#include "debug.h" 48#include "debug.h"
38#endif 49#endif /*__PCTOOL__*/
39 50
40#ifndef __PCTOOL__ 51#ifndef __PCTOOL__
41#include <ctype.h> 52#include <ctype.h>
diff --git a/apps/misc.c b/apps/misc.c
index f3a937f76b..cd59dbc40f 100644
--- a/apps/misc.c
+++ b/apps/misc.c
@@ -27,7 +27,10 @@
27#ifdef __PCTOOL__ 27#ifdef __PCTOOL__
28#include <stdint.h> 28#include <stdint.h>
29#include <stdarg.h> 29#include <stdarg.h>
30#include <unistd.h> 30#include <stdio.h>
31#ifdef WPSEDITOR
32#include "string.h"
33#endif
31#else 34#else
32#include "sprintf.h" 35#include "sprintf.h"
33#include "lang.h" 36#include "lang.h"
@@ -196,26 +199,6 @@ char *create_numbered_filename(char *buffer, const char *path,
196 return buffer; 199 return buffer;
197} 200}
198 201
199/* Format time into buf.
200 *
201 * buf - buffer to format to.
202 * buf_size - size of buffer.
203 * t - time to format, in milliseconds.
204 */
205void format_time(char* buf, int buf_size, long t)
206{
207 if ( t < 3600000 )
208 {
209 snprintf(buf, buf_size, "%d:%02d",
210 (int) (t / 60000), (int) (t % 60000 / 1000));
211 }
212 else
213 {
214 snprintf(buf, buf_size, "%d:%02d:%02d",
215 (int) (t / 3600000), (int) (t % 3600000 / 60000),
216 (int) (t % 60000 / 1000));
217 }
218}
219 202
220#if CONFIG_RTC 203#if CONFIG_RTC
221/* Create a filename with a date+time part. 204/* Create a filename with a date+time part.
@@ -1179,6 +1162,28 @@ char *strip_extension(char* buffer, int buffer_size, const char *filename)
1179} 1162}
1180#endif /* !defined(__PCTOOL__) */ 1163#endif /* !defined(__PCTOOL__) */
1181 1164
1165/* Format time into buf.
1166 *
1167 * buf - buffer to format to.
1168 * buf_size - size of buffer.
1169 * t - time to format, in milliseconds.
1170 */
1171void format_time(char* buf, int buf_size, long t)
1172{
1173 if ( t < 3600000 )
1174 {
1175 snprintf(buf, buf_size, "%d:%02d",
1176 (int) (t / 60000), (int) (t % 60000 / 1000));
1177 }
1178 else
1179 {
1180 snprintf(buf, buf_size, "%d:%02d:%02d",
1181 (int) (t / 3600000), (int) (t % 3600000 / 60000),
1182 (int) (t % 60000 / 1000));
1183 }
1184}
1185
1186
1182/** Open a UTF-8 file and set file descriptor to first byte after BOM. 1187/** Open a UTF-8 file and set file descriptor to first byte after BOM.
1183 * If no BOM is present this behaves like open(). 1188 * If no BOM is present this behaves like open().
1184 * If the file is opened for writing and O_TRUNC is set, write a BOM to 1189 * If the file is opened for writing and O_TRUNC is set, write a BOM to
diff --git a/apps/settings.h b/apps/settings.h
index e90b1a83bf..9ef8323276 100644
--- a/apps/settings.h
+++ b/apps/settings.h
@@ -51,6 +51,9 @@ struct opt_items {
51/* name of directory where configuration, fonts and other data 51/* name of directory where configuration, fonts and other data
52 * files are stored */ 52 * files are stored */
53#ifdef __PCTOOL__ 53#ifdef __PCTOOL__
54#undef ROCKBOX_DIR
55#undef ROCKBOX_DIR_LEN
56#undef WPS_DIR
54#define ROCKBOX_DIR "." 57#define ROCKBOX_DIR "."
55#define ROCKBOX_DIR_LEN 1 58#define ROCKBOX_DIR_LEN 1
56#else 59#else
diff --git a/docs/CREDITS b/docs/CREDITS
index f9bacd51d5..2d73b63a4a 100644
--- a/docs/CREDITS
+++ b/docs/CREDITS
@@ -413,6 +413,7 @@ Daniel Weck
413Clément Pit-Claudel 413Clément Pit-Claudel
414Jelle Geerts 414Jelle Geerts
415Tadeusz PyÅ› 415Tadeusz PyÅ›
416Rostislav Chekan
416 417
417The libmad team 418The libmad team
418The wavpack team 419The wavpack team
diff --git a/firmware/font.c b/firmware/font.c
index 03e18919da..465cec269a 100644
--- a/firmware/font.c
+++ b/firmware/font.c
@@ -522,9 +522,11 @@ void glyph_cache_save(void)
522{ 522{
523 523
524 if (fnt_file >= 0) { 524 if (fnt_file >= 0) {
525 525#ifdef WPSEDITOR
526 glyph_file = open(GLYPH_CACHE_FILE, O_WRONLY|O_CREAT|O_TRUNC);
527#else
526 glyph_file = creat(GLYPH_CACHE_FILE); 528 glyph_file = creat(GLYPH_CACHE_FILE);
527 529#endif
528 if (glyph_file < 0) return; 530 if (glyph_file < 0) return;
529 531
530 lru_traverse(&font_cache_ui._lru, glyph_file_write); 532 lru_traverse(&font_cache_ui._lru, glyph_file_write);
diff --git a/firmware/include/inttypes.h b/firmware/include/inttypes.h
index 1697f691d9..f7f5099bd7 100644
--- a/firmware/include/inttypes.h
+++ b/firmware/include/inttypes.h
@@ -22,6 +22,8 @@
22#ifndef __INTTYPES_H__ 22#ifndef __INTTYPES_H__
23#define __INTTYPES_H__ 23#define __INTTYPES_H__
24 24
25#ifndef WPSEDITOR
26
25#include <limits.h> 27#include <limits.h>
26 28
27/* 8 bit */ 29/* 8 bit */
@@ -103,5 +105,8 @@
103#define uint64_t unsigned long long 105#define uint64_t unsigned long long
104 106
105#endif 107#endif
108#else
109#include <stdint.h>
110#endif /* !WPSEDITOR*/
106 111
107#endif /* __INTTYPES_H__ */ 112#endif /* __INTTYPES_H__ */
diff --git a/firmware/include/time.h b/firmware/include/time.h
index 23f72fd93d..9200e82232 100644
--- a/firmware/include/time.h
+++ b/firmware/include/time.h
@@ -7,6 +7,11 @@
7#ifndef _TIME_H_ 7#ifndef _TIME_H_
8#define _TIME_H_ 8#define _TIME_H_
9 9
10#ifdef WPSEDITOR
11#include <sys/types.h>
12#include <time.h>
13#endif
14
10struct tm 15struct tm
11{ 16{
12 int tm_sec; 17 int tm_sec;
@@ -34,3 +39,4 @@ struct tm *localtime(const time_t *timep);
34 39
35#endif /* _TIME_H_ */ 40#endif /* _TIME_H_ */
36 41
42
diff --git a/firmware/mp3data.c b/firmware/mp3data.c
index 25e40f897a..80870cd8cd 100644
--- a/firmware/mp3data.c
+++ b/firmware/mp3data.c
@@ -550,6 +550,7 @@ int get_mp3file_info(int fd, struct mp3info *info)
550 return bytecount; 550 return bytecount;
551} 551}
552 552
553#ifndef __PCTOOL__
553static void long2bytes(unsigned char *buf, long val) 554static void long2bytes(unsigned char *buf, long val)
554{ 555{
555 buf[0] = (val >> 24) & 0xff; 556 buf[0] = (val >> 24) & 0xff;
@@ -558,7 +559,6 @@ static void long2bytes(unsigned char *buf, long val)
558 buf[3] = val & 0xff; 559 buf[3] = val & 0xff;
559} 560}
560 561
561#ifndef __PCTOOL__
562int count_mp3_frames(int fd, int startpos, int filesize, 562int count_mp3_frames(int fd, int startpos, int filesize,
563 void (*progressfunc)(int)) 563 void (*progressfunc)(int))
564{ 564{
diff --git a/utils/wpseditor/README b/utils/wpseditor/README
new file mode 100644
index 0000000000..3a8b87c511
--- /dev/null
+++ b/utils/wpseditor/README
@@ -0,0 +1,21 @@
1 __________ __ ___.
2 Open \______ \ ____ ____ | | _\_ |__ _______ ___
3 Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
4 Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
5 Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
6 \/ \/ \/ \/ \/
7
8Installation
9
10Windows:
11
12 * be sure that you have properly installed mingw, QT > 4.3.*
13 * if you want to debug wpseditor, you'll have to build Qt debug libraries
14 * cd to rockbox/utils/wpseditor/ from Qt command promt and run qmake and then make
15 * >gui\bin\wpseditor.exe
16
17Linux:
18
19 * Make sure you have libqt4-dev installed and you have a working Rockbox environment
20 * cd to utils/wpseditor/ and do 'qmake-qt4 && make'
21 * cd to gui/bin/ and start WPS editor with './wpseditord'
diff --git a/utils/wpseditor/TODO b/utils/wpseditor/TODO
new file mode 100644
index 0000000000..28f559111f
--- /dev/null
+++ b/utils/wpseditor/TODO
@@ -0,0 +1,7 @@
1* Enable ability in gui to load different targets on the fly
2* Enable animation(timers,sliding lines, etc)
3* Test on Mac OS
4* Redesign GUI for more usability
5* Replace checkwps functionality
6* Include 'screenshot utility' functionality
7* Make editing via gui
diff --git a/utils/wpseditor/gui/gui.pro b/utils/wpseditor/gui/gui.pro
new file mode 100644
index 0000000000..db7cfa1343
--- /dev/null
+++ b/utils/wpseditor/gui/gui.pro
@@ -0,0 +1,40 @@
1TEMPLATE = app
2TARGET =
3DEPENDPATH += . build src ui
4INCLUDEPATH += . src/QPropertyEditor ../libwps/src
5DESTDIR = bin
6OBJECTS_DIR = build
7MOC_DIR = build
8UI_DIR = build
9QMAKE_LIBDIR += lib
10QT = gui core
11CONFIG += qt warn_on console debug_and_release
12libwps.commands += $(MAKE) -C ../libwps shared
13QMAKE_EXTRA_TARGETS += libwps
14PRE_TARGETDEPS += libwps
15HEADERS += ../libwps/src/api.h \
16 ../libwps/src/defs.h \
17 src/slider.h \
18 src/qtrackstate.h \
19 src/qwpsstate.h \
20 src/qwpseditorwindow.h \
21 src/utils.h \
22 src/qwpsdrawer.h
23FORMS += ui/mainwindow.ui ui/slider.ui
24SOURCES += src/main.cpp \
25 src/slider.cpp \
26 src/qtrackstate.cpp \
27 src/qwpsstate.cpp \
28 src/qwpseditorwindow.cpp \
29 src/utils.cpp \
30 src/qwpsdrawer.cpp \
31 src/qwpsdrawer_static.cpp
32LIBS += -Lbin
33CONFIG(debug, debug|release) {
34 LIBS += -lQPropertyEditord
35 TARGET = wpseditord
36}
37CONFIG(release, debug|release) {
38 LIBS += -lQPropertyEditor
39 TARGET = wpseditor
40}
diff --git a/utils/wpseditor/gui/src/QPropertyEditor/ColorCombo.cpp b/utils/wpseditor/gui/src/QPropertyEditor/ColorCombo.cpp
new file mode 100644
index 0000000000..f5eeb030dc
--- /dev/null
+++ b/utils/wpseditor/gui/src/QPropertyEditor/ColorCombo.cpp
@@ -0,0 +1,73 @@
1// *************************************************************************************************
2//
3// QPropertyEditor v 0.1
4//
5// --------------------------------------
6// Copyright (C) 2007 Volker Wiendl
7//
8//
9// This library is free software; you can redistribute it and/or
10// modify it under the terms of the GNU Lesser General Public
11// License as published by the Free Software Foundation; either
12// version 2.1 of the License, or any later version.
13//
14// This library is distributed in the hope that it will be useful,
15// but WITHOUT ANY WARRANTY; without even the implied warranty of
16// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17// Lesser General Public License for more details.
18//
19// You should have received a copy of the GNU Lesser General Public
20// License along with this library; if not, write to the Free Software
21// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22//
23//
24// This class is based on the Color Editor Factory Example by Trolltech
25//
26// *************************************************************************************************
27
28#include "ColorCombo.h"
29
30#include <Qt/qcolordialog.h>
31
32ColorCombo::ColorCombo(QWidget* parent /*= 0*/) : QComboBox(parent) {
33 QStringList colorNames = QColor::colorNames();
34 for (int i = 0; i < colorNames.size(); ++i) {
35 QColor color(colorNames[i]);
36 insertItem(i, colorNames[i]);
37 setItemData(i, color, Qt::DecorationRole);
38 }
39 addItem(tr("Custom"), QVariant((int)QVariant::UserType));
40 connect(this, SIGNAL(currentIndexChanged(int)), this, SLOT(currentChanged(int)));
41}
42
43
44ColorCombo::~ColorCombo() {}
45
46
47QColor ColorCombo::color() const {
48 return qVariantValue<QColor>(itemData(currentIndex(), Qt::DecorationRole));
49}
50
51void ColorCombo::setColor(QColor color) {
52 m_init = color;
53 setCurrentIndex(findData(color, int(Qt::DecorationRole)));
54 if (currentIndex() == -1) {
55 addItem(color.name());
56 setItemData(count()-1, color, Qt::DecorationRole);
57 setCurrentIndex(count()-1);
58 }
59}
60
61void ColorCombo::currentChanged(int index) {
62 if (itemData(index).isValid() && itemData(index) == QVariant((int)QVariant::UserType)) {
63 QColor color = QColorDialog::getColor(m_init, this);
64 if (color.isValid()) {
65 if (findData(color, int(Qt::DecorationRole)) == -1) {
66 addItem(color.name());
67 setItemData(count()-1, color, Qt::DecorationRole);
68 }
69 setCurrentIndex(findData(color, int(Qt::DecorationRole)));
70 } else
71 setCurrentIndex(findData(m_init));
72 }
73}
diff --git a/utils/wpseditor/gui/src/QPropertyEditor/ColorCombo.h b/utils/wpseditor/gui/src/QPropertyEditor/ColorCombo.h
new file mode 100644
index 0000000000..530b05bbc5
--- /dev/null
+++ b/utils/wpseditor/gui/src/QPropertyEditor/ColorCombo.h
@@ -0,0 +1,49 @@
1// *************************************************************************************************
2//
3// QPropertyEditor v 0.1
4//
5// --------------------------------------
6// Copyright (C) 2007 Volker Wiendl
7//
8//
9// This library is free software; you can redistribute it and/or
10// modify it under the terms of the GNU Lesser General Public
11// License as published by the Free Software Foundation; either
12// version 2.1 of the License, or any later version.
13//
14// This library is distributed in the hope that it will be useful,
15// but WITHOUT ANY WARRANTY; without even the implied warranty of
16// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17// Lesser General Public License for more details.
18//
19// You should have received a copy of the GNU Lesser General Public
20// License along with this library; if not, write to the Free Software
21// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22//
23//
24// This class is based on the Color Editor Factory Example by Trolltech
25//
26// *************************************************************************************************
27
28#ifndef COLORCOMBO_H_
29#define COLORCOMBO_H_
30
31#include <Qt/qcombobox.h>
32
33class ColorCombo : public QComboBox {
34 Q_OBJECT
35public:
36 ColorCombo(QWidget* parent = 0);
37 virtual ~ColorCombo();
38
39 QColor color() const;
40 void setColor(QColor c);
41
42private slots:
43 void currentChanged(int index);
44
45private:
46 QColor m_init;
47
48};
49#endif
diff --git a/utils/wpseditor/gui/src/QPropertyEditor/Property.cpp b/utils/wpseditor/gui/src/QPropertyEditor/Property.cpp
new file mode 100644
index 0000000000..0746d15140
--- /dev/null
+++ b/utils/wpseditor/gui/src/QPropertyEditor/Property.cpp
@@ -0,0 +1,136 @@
1// ****************************************************************************************
2//
3// QPropertyEditor Library
4// --------------------------------------
5// Copyright (C) 2007 Volker Wiendl
6//
7// This file is part of the Horde3D Scene Editor.
8//
9// The QPropertyEditor Library is free software; you can redistribute it and/or modify
10// it under the terms of the GNU General Public License as published by
11// the Free Software Foundation version 3 of the License
12//
13// The Horde3D Scene Editor is distributed in the hope that it will be useful,
14// but WITHOUT ANY WARRANTY; without even the implied warranty of
15// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16// GNU General Public License for more details.
17//
18// You should have received a copy of the GNU General Public License
19// along with this program. If not, see <http://www.gnu.org/licenses/>.
20//
21// ****************************************************************************************
22
23#include "Property.h"
24#include "ColorCombo.h"
25
26#include <Qt/qmetaobject.h>
27#include <Qt/qspinbox.h>
28
29#include <limits.h>
30
31Property::Property(const QString& name /*= QString()*/, QObject* propertyObject /*= 0*/, QObject* parent /*= 0*/) : QObject(parent),
32 m_propertyObject(propertyObject) {
33 setObjectName(name);
34}
35
36QVariant Property::value(int /*role = Qt::UserRole*/) const {
37 if (m_propertyObject)
38 return m_propertyObject->property(qPrintable(objectName()));
39 else
40 return QVariant();
41}
42
43void Property::setValue(const QVariant &value) {
44 if (m_propertyObject)
45 m_propertyObject->setProperty(qPrintable(objectName()), value);
46}
47
48bool Property::isReadOnly() {
49 if (m_propertyObject && m_propertyObject->metaObject()->property(m_propertyObject->metaObject()->indexOfProperty(qPrintable(objectName()))).isWritable())
50 return false;
51 else
52 return true;
53}
54
55QWidget* Property::createEditor(QWidget *parent, const QStyleOptionViewItem &option) {
56 (void)option;
57 QWidget* editor = 0;
58 switch (value().type()) {
59 case QVariant::Color:
60 editor = new ColorCombo(parent);
61 break;
62 case QVariant::Int:
63 editor = new QSpinBox(parent);
64 editor->setProperty("minimum", -INT_MAX);
65 editor->setProperty("maximum", INT_MAX);
66 connect(editor, SIGNAL(valueChanged(int)), this, SLOT(setValue(int)));
67 break;
68 case QMetaType::Float:
69 case QVariant::Double:
70 editor = new QDoubleSpinBox(parent);
71 editor->setProperty("minimum", -INT_MAX);
72 editor->setProperty("maximum", INT_MAX);
73 connect(editor, SIGNAL(valueChanged(double)), this, SLOT(setValue(double)));
74 break;
75 default:
76 return editor;
77 }
78 return editor;
79}
80
81bool Property::setEditorData(QWidget *editor, const QVariant &data) {
82 switch (value().type()) {
83 case QVariant::Color:
84 static_cast<ColorCombo*>(editor)->setColor(data.value<QColor>());
85 return true;
86 ;
87 case QVariant::Int:
88 editor->blockSignals(true);
89 static_cast<QSpinBox*>(editor)->setValue(data.toInt());
90 editor->blockSignals(false);
91 return true;
92 case QMetaType::Float:
93 case QVariant::Double:
94 editor->blockSignals(true);
95 static_cast<QDoubleSpinBox*>(editor)->setValue(data.toDouble());
96 editor->blockSignals(false);
97 return true;
98 default:
99 return false;
100 }
101 return false;
102}
103
104QVariant Property::editorData(QWidget *editor) {
105 switch (value().type()) {
106 case QVariant::Color:
107 return QVariant::fromValue(static_cast<ColorCombo*>(editor)->color());
108 case QVariant::Int:
109 return QVariant(static_cast<QSpinBox*>(editor)->value());
110 case QMetaType::Float:
111 case QVariant::Double:
112 return QVariant(static_cast<QDoubleSpinBox*>(editor)->value());
113 break;
114 default:
115 return QVariant();
116 }
117}
118
119Property* Property::findPropertyObject(QObject* propertyObject) {
120 if (m_propertyObject == propertyObject)
121 return this;
122 for (int i=0; i<children().size(); ++i) {
123 Property* child = static_cast<Property*>(children()[i])->findPropertyObject(propertyObject);
124 if (child)
125 return child;
126 }
127 return 0;
128}
129
130void Property::setValue(double value) {
131 setValue(QVariant(value));
132}
133
134void Property::setValue(int value) {
135 setValue(QVariant(value));
136}
diff --git a/utils/wpseditor/gui/src/QPropertyEditor/Property.h b/utils/wpseditor/gui/src/QPropertyEditor/Property.h
new file mode 100644
index 0000000000..52d6842987
--- /dev/null
+++ b/utils/wpseditor/gui/src/QPropertyEditor/Property.h
@@ -0,0 +1,157 @@
1// *************************************************************************************************
2//
3// QPropertyEditor v 0.1
4//
5// --------------------------------------
6// Copyright (C) 2007 Volker Wiendl
7//
8//
9// This library is free software; you can redistribute it and/or
10// modify it under the terms of the GNU Lesser General Public
11// License as published by the Free Software Foundation; either
12// version 2.1 of the License, or any later version.
13//
14// This library is distributed in the hope that it will be useful,
15// but WITHOUT ANY WARRANTY; without even the implied warranty of
16// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17// Lesser General Public License for more details.
18//
19// You should have received a copy of the GNU Lesser General Public
20// License along with this library; if not, write to the Free Software
21// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22//
23// *************************************************************************************************
24
25#ifndef PROPERTY_H_
26#define PROPERTY_H_
27
28#include <Qt/qwidget.h>
29#include <Qt/qstyleoption.h>
30#include <Qt/qvariant.h>
31
32/**
33 * The Property class is the base class for all properties in the QPropertyEditor
34 * You can implement custom properties inherited from this class to further enhence the
35 * functionality of the QPropertyEditor
36 */
37class Property : public QObject {
38 Q_OBJECT
39
40public:
41
42 /**
43 * Constructor
44 *
45 * @param name the name of the property within the propertyObject (will be used in the QPropertyEditorWidget view too)
46 * @param propertyObject the object that contains the property
47 * @param parent optional parent object
48 */
49 Property(const QString& name = QString(), QObject* propertyObject = 0, QObject* parent = 0);
50
51 /**
52 * The value stored by this property
53 * @return QVariant the data converted to a QVariant
54 */
55 virtual QVariant value(int role = Qt::UserRole) const;
56 /**
57 * Sets the value stored by this property
58 * @param value the data converted to a QVariant
59 */
60 virtual void setValue(const QVariant& value);
61
62 /**
63 * Returns the QObject which contains the property managed by this instance
64 * @return QObject* pointer to the QObject that contains user defined properties
65 */
66 QObject* propertyObject() {
67 return m_propertyObject;
68 }
69
70 /**
71 * Flag if property is used for indicating a group or really manages a property
72 * @return bool true if this property is only used to display a category in the QPropertyEditorWidget
73 */
74 bool isRoot() {
75 return m_propertyObject == 0;
76 }
77
78 /**
79 * Flag if the property can be set
80 * @return bool true if this property has no set method
81 */
82 bool isReadOnly();
83
84 /**
85 * Returns the row of this instance within the QPropertyModel
86 * @return int row within the QPropertyModel
87 */
88 int row() {
89 return parent()->children().indexOf(this);
90 }
91
92 /**
93 * returns optional settings for the editor widget that is used to manipulate the properties value
94 * @return QString a string that contains property settings for the editor widget (e.g. "minimum=1.0;maximum=10.0;")
95 */
96 QString editorHints() {
97 return m_hints;
98 }
99
100 /**
101 * Sets properties for the editor widget that is used to manipulate the data value managed by this instance
102 * @param hints a string containing property settings for the editor widget that manipulates this property
103 */
104 virtual void setEditorHints(const QString& hints) {
105 m_hints = hints;
106 }
107
108 /**
109 * Creates an editor for the data managed by this instance
110 * @param parent widget the newly created editor widget will be child of
111 * @param option currently not used
112 * @return QWidget* pointer to the editor widget
113 */
114 virtual QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option);
115
116 /**
117 * Returns the data of the editor widget used to manipulate this instance
118 * @return QVariant the data converted to a QVariant
119 */
120 virtual QVariant editorData(QWidget *editor);
121
122 /**
123 * Changes the editor widget's data to a specific value
124 * @param editor the editor widget
125 * @param data the data to set in the editor widget
126 * @return bool true if editor widget was set to the given data successfully, false if the data can not be set in the editor (e.g. wrong datatype)
127 */
128 virtual bool setEditorData(QWidget *editor, const QVariant& data);
129
130 /**
131 * Tries to find the first property that manages the given propertyObject
132 * @param propertyObject
133 * @return Property
134 */
135 Property* findPropertyObject(QObject* propertyObject);
136
137private slots:
138 /**
139 * This slot is used to immediately set the properties when the editor widget's value of a double or float
140 * property has changed
141 * @param value the new value
142 */
143 void setValue(double value);
144 /**
145 * This slot is used to immediately set the properties when the editor widget's value of an integer
146 * property has changed
147 * @param value the new value
148 */
149 void setValue(int value);
150
151private:
152 QObject* m_propertyObject;
153 QString m_hints;
154
155};
156
157#endif
diff --git a/utils/wpseditor/gui/src/QPropertyEditor/QPropertyEditor.pro b/utils/wpseditor/gui/src/QPropertyEditor/QPropertyEditor.pro
new file mode 100644
index 0000000000..85fd29ee2c
--- /dev/null
+++ b/utils/wpseditor/gui/src/QPropertyEditor/QPropertyEditor.pro
@@ -0,0 +1,26 @@
1TEMPLATE = lib
2CONFIG += staticlib debug_and_release
3SOURCES = ColorCombo.cpp \
4 Property.cpp \
5 QPropertyEditorWidget.cpp \
6 QPropertyModel.cpp \
7 QVariantDelegate.cpp
8HEADERS = ColorCombo.h \
9 Property.h \
10 QPropertyEditorWidget.h \
11 QPropertyModel.h \
12 QVariantDelegate.h
13INCLUDEPATH += .
14DESTDIR = ../../lib
15UI_DIR = .
16CONFIG(debug, debug|release) {
17 TARGET = QPropertyEditord
18 OBJECTS_DIR = ../../build/QPropertyEditor/debug
19 MOC_DIR = ../../build/QPropertyEditor/debug
20}
21CONFIG(release, debug|release) {
22 TARGET = QPropertyEditor
23 OBJECTS_DIR = ../../build/QPropertyEditor/release
24 MOC_DIR = ../../build/QPropertyEditor/release
25 DEFINES += QT_NO_DEBUG
26}
diff --git a/utils/wpseditor/gui/src/QPropertyEditor/QPropertyEditorWidget.cpp b/utils/wpseditor/gui/src/QPropertyEditor/QPropertyEditorWidget.cpp
new file mode 100644
index 0000000000..fc4b90c227
--- /dev/null
+++ b/utils/wpseditor/gui/src/QPropertyEditor/QPropertyEditorWidget.cpp
@@ -0,0 +1,56 @@
1// *************************************************************************************************
2//
3// QPropertyEditor v 0.1
4//
5// --------------------------------------
6// Copyright (C) 2007 Volker Wiendl
7//
8//
9// This library is free software; you can redistribute it and/or
10// modify it under the terms of the GNU Lesser General Public
11// License as published by the Free Software Foundation; either
12// version 2.1 of the License, or any later version.
13//
14// This library is distributed in the hope that it will be useful,
15// but WITHOUT ANY WARRANTY; without even the implied warranty of
16// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17// Lesser General Public License for more details.
18//
19// You should have received a copy of the GNU Lesser General Public
20// License along with this library; if not, write to the Free Software
21// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22//
23// *************************************************************************************************
24
25#include "QPropertyEditorWidget.h"
26#include "QPropertyModel.h"
27#include "QVariantDelegate.h"
28#include "Property.h"
29
30QPropertyEditorWidget::QPropertyEditorWidget(QWidget* parent /*= 0*/) : QTreeView(parent) {
31 m_model = new QPropertyModel(this);
32 setModel(m_model);
33 setItemDelegate(new QVariantDelegate(this));
34}
35
36
37QPropertyEditorWidget::~QPropertyEditorWidget() {}
38
39void QPropertyEditorWidget::addObject(QObject* propertyObject) {
40 m_model->addItem(propertyObject);
41 expandToDepth(0);
42}
43
44void QPropertyEditorWidget::setObject(QObject* propertyObject) {
45 m_model->clear();
46 if (propertyObject)
47 addObject(propertyObject);
48}
49
50void QPropertyEditorWidget::updateObject(QObject* propertyObject) {
51 m_model->updateItem(propertyObject);
52}
53
54void QPropertyEditorWidget::setCustomPropertyCB(UserTypeCB callback) {
55 m_model->setCustomPropertyCB(callback);
56}
diff --git a/utils/wpseditor/gui/src/QPropertyEditor/QPropertyEditorWidget.h b/utils/wpseditor/gui/src/QPropertyEditor/QPropertyEditorWidget.h
new file mode 100644
index 0000000000..2dab87722a
--- /dev/null
+++ b/utils/wpseditor/gui/src/QPropertyEditor/QPropertyEditorWidget.h
@@ -0,0 +1,113 @@
1// *************************************************************************************************
2//
3// QPropertyEditor v 0.1
4//
5// --------------------------------------
6// Copyright (C) 2007 Volker Wiendl
7//
8//
9// This library is free software; you can redistribute it and/or
10// modify it under the terms of the GNU Lesser General Public
11// License as published by the Free Software Foundation; either
12// version 2.1 of the License, or any later version.
13//
14// This library is distributed in the hope that it will be useful,
15// but WITHOUT ANY WARRANTY; without even the implied warranty of
16// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17// Lesser General Public License for more details.
18//
19// You should have received a copy of the GNU Lesser General Public
20// License along with this library; if not, write to the Free Software
21// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22//
23// *************************************************************************************************
24
25#ifndef QPROPERTYEDITORWIDGET_H_
26#define QPROPERTYEDITORWIDGET_H_
27
28#include <Qt/qtreeview.h>
29
30class QPropertyModel;
31class Property;
32
33/**
34 * \mainpage QPropertyEditor
35 *
36 * \section intro_sec Introduction
37 *
38 * The main purpose for the QPropertyEditor is the visualization and manipulation of properties defined via the Q_PROPERTY macro in
39 * QObject based classes.
40 */
41
42/**
43 * \brief The QPropertyEditorWidget offers an easy to use mechanism to visualize properties of a class inherited from QObject.
44 *
45 * Qt provides a nice way to define class properties by using the Q_PROPERTY macro. The purpose of the QPropertyEditor
46 * is to visualize these properties in an easy way.
47 *
48 * To use the property editor, all you have to do is to create a class that defines it's properties by using Q_PROPERTY
49 * and to add this class by using the addObject() method of this QPropertyEditorWidget class.
50 * The QPropertyEditorWidget is inherited from QTreeView and will display the properties in a tree with two columns: Name and Value
51 *
52 * For basic data types the build in editor widgets of Qt will be used. The QPropertyEditor itself only defines an additional
53 * editor for QColor (based on the Color Editor Factory Example from Trolltech). But it can easily be extended by yourself
54 * either within the library or for special datatypes also outside of the library in your application.
55 */
56class QPropertyEditorWidget : public QTreeView {
57 Q_OBJECT
58public:
59
60 /**
61 * A typedef for a callback used to create user defined properties for custom datatypes
62 */
63 typedef Property* (*UserTypeCB)(const QString& name, QObject* propertyObject, Property* parent);
64
65 /**
66 * \brief Constructor
67 *
68 * Creates a new editor widget based on QTreeView
69 * @param parent optional parent widget
70 */
71 QPropertyEditorWidget(QWidget* parent = 0);
72
73 /// Destructor
74 virtual ~QPropertyEditorWidget();
75
76 /**
77 * Adds the user properties of the given class to the QPropertyModel associated with this view
78 *
79 * @param propertyObject the class inherited from QObject that contains user properties that should be
80 * managed by the QPropertyModel associated with this view
81 */
82 void addObject(QObject* propertyObject);
83
84 /**
85 * Similar to the addObject() method this method adds the properties of the given class to the QPropertyModel
86 * associated with this view. But in contrast to addObject() it will clear the model before, removing all
87 * previously added objects.
88 *
89 * @param propertyObject the class inherited from QObject that contains user properties that should be
90 * managed by the QPropertyModel associated with this view
91 */
92 void setObject(QObject* propertyObject);
93
94 /**
95 * Updates the view for the given object. This can be usefull if a property was changed programmatically instead
96 * of using the view. In this case the view normally will display the new property values only after the user clicked
97 * on it. To overcome this problem you can call updateObject with the object whose property was changed.
98 */
99 void updateObject(QObject* propertyObject);
100
101 /**
102 * If you define custom datatypes outside of this library the QPropertyModel will check if you
103 * also defined a callback that is responsible to create custom property classes inherited from Property to handle
104 * these datatypes. With this method you can set such a callback that will create custom properties for custom datatypes.
105 */
106 void setCustomPropertyCB(UserTypeCB callback);
107
108private:
109 /// The Model for this view
110 QPropertyModel* m_model;
111
112};
113#endif
diff --git a/utils/wpseditor/gui/src/QPropertyEditor/QPropertyModel.cpp b/utils/wpseditor/gui/src/QPropertyEditor/QPropertyModel.cpp
new file mode 100644
index 0000000000..b147cd089d
--- /dev/null
+++ b/utils/wpseditor/gui/src/QPropertyEditor/QPropertyModel.cpp
@@ -0,0 +1,236 @@
1// *************************************************************************************************
2//
3// QPropertyEditor v 0.1
4//
5// --------------------------------------
6// Copyright (C) 2007 Volker Wiendl
7//
8//
9// This library is free software; you can redistribute it and/or
10// modify it under the terms of the GNU Lesser General Public
11// License as published by the Free Software Foundation; either
12// version 2.1 of the License, or any later version.
13//
14// This library is distributed in the hope that it will be useful,
15// but WITHOUT ANY WARRANTY; without even the implied warranty of
16// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17// Lesser General Public License for more details.
18//
19// You should have received a copy of the GNU Lesser General Public
20// License along with this library; if not, write to the Free Software
21// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22//
23// *************************************************************************************************
24
25#include "QPropertyModel.h"
26
27#include "Property.h"
28
29#include <Qt/qapplication.h>
30#include <Qt/qmetaobject.h>
31#include <Qt/qitemeditorfactory.h>
32
33struct PropertyPair {
34 PropertyPair(const QMetaObject* obj, QMetaProperty property) : Property(property), Object(obj) {}
35
36 QMetaProperty Property;
37 const QMetaObject* Object;
38
39 bool operator==(const PropertyPair& other) const {
40 return QString(other.Property.name()) == QString(Property.name());
41 }
42};
43
44
45QPropertyModel::QPropertyModel(QObject* parent /*= 0*/) : QAbstractItemModel(parent), m_userCallback(0) {
46 m_rootItem = new Property("Root",0, this);
47}
48
49
50QPropertyModel::~QPropertyModel() {}
51
52QModelIndex QPropertyModel::index ( int row, int column, const QModelIndex & parent /*= QModelIndex()*/ ) const {
53 Property *parentItem = m_rootItem;
54 if (parent.isValid())
55 parentItem = static_cast<Property*>(parent.internalPointer());
56 if (row >= parentItem->children().size())
57 return QModelIndex();
58 return createIndex(row, column, parentItem->children().at(row));
59
60}
61
62QModelIndex QPropertyModel::parent ( const QModelIndex & index ) const {
63 if (!index.isValid())
64 return QModelIndex();
65
66 Property *childItem = static_cast<Property*>(index.internalPointer());
67 Property *parentItem = qobject_cast<Property*>(childItem->parent());
68
69 if (!parentItem || parentItem == m_rootItem)
70 return QModelIndex();
71
72 return createIndex(parentItem->row(), 0, parentItem);
73}
74
75int QPropertyModel::rowCount ( const QModelIndex & parent /*= QModelIndex()*/ ) const {
76 Property *parentItem = m_rootItem;
77 if (parent.isValid())
78 parentItem = static_cast<Property*>(parent.internalPointer());
79 return parentItem->children().size();
80}
81
82int QPropertyModel::columnCount ( const QModelIndex & parent /*= QModelIndex()*/ ) const {
83 (void)parent;
84 return 2;
85}
86
87QVariant QPropertyModel::data ( const QModelIndex & index, int role /*= Qt::DisplayRole*/ ) const {
88 if (!index.isValid())
89 return QVariant();
90
91 Property *item = static_cast<Property*>(index.internalPointer());
92 switch (role) {
93 case Qt::ToolTipRole:
94 case Qt::DecorationRole:
95 case Qt::DisplayRole:
96 case Qt::EditRole:
97 if (index.column() == 0)
98 return item->objectName();
99 if (index.column() == 1)
100 return item->value(role);
101 case Qt::BackgroundRole:
102 if (item->isRoot()) return QApplication::palette("QTreeView").brush(QPalette::Normal, QPalette::Button).color();
103 break;
104 };
105 return QVariant();
106}
107
108// edit methods
109bool QPropertyModel::setData ( const QModelIndex & index, const QVariant & value, int role /*= Qt::EditRole*/ ) {
110 if (index.isValid() && role == Qt::EditRole) {
111 Property *item = static_cast<Property*>(index.internalPointer());
112 item->setValue(value);
113 emit dataChanged(index, index);
114 return true;
115 }
116 return false;
117}
118
119Qt::ItemFlags QPropertyModel::flags ( const QModelIndex & index ) const {
120 if (!index.isValid())
121 return Qt::ItemIsEnabled;
122 Property *item = static_cast<Property*>(index.internalPointer());
123 // only allow change of value attribute
124 if (item->isRoot())
125 return Qt::ItemIsEnabled;
126 else if (item->isReadOnly())
127 return Qt::ItemIsDragEnabled | Qt::ItemIsSelectable;
128 else
129 return Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable;
130}
131
132
133QVariant QPropertyModel::headerData ( int section, Qt::Orientation orientation, int role /*= Qt::DisplayRole*/ ) const {
134 if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
135 switch (section) {
136 case 0:
137 return tr("Name");
138 case 1:
139 return tr("Value");
140 }
141 }
142 return QVariant();
143}
144
145QModelIndex QPropertyModel::buddy ( const QModelIndex & index ) const {
146 if (index.isValid() && index.column() == 0)
147 return createIndex(index.row(), 1, index.internalPointer());
148 return index;
149}
150
151void QPropertyModel::addItem(QObject *propertyObject) {
152 // first create property <-> class hierarchy
153 QList<PropertyPair> propertyMap;
154 QList<const QMetaObject*> classList;
155 const QMetaObject* metaObject = propertyObject->metaObject();
156 do {
157 int count = metaObject->propertyCount();
158 for (int i=0; i<count; ++i) {
159 QMetaProperty property = metaObject->property(i);
160 if (property.isUser()) // Hide Qt specific properties
161 {
162 PropertyPair pair(metaObject, property);
163 int index = propertyMap.indexOf(pair);
164 if (index != -1)
165 propertyMap[index] = pair;
166 else
167 propertyMap.push_back(pair);
168 }
169 }
170 classList.push_front(metaObject);
171 } while ((metaObject = metaObject->superClass())!=0);
172
173 QList<const QMetaObject*> finalClassList;
174 // remove empty classes from hierarchy list
175 foreach(const QMetaObject* obj, classList) {
176 bool keep = false;
177 foreach(PropertyPair pair, propertyMap) {
178 if (pair.Object == obj) {
179 keep = true;
180 break;
181 }
182 }
183 if (keep)
184 finalClassList.push_back(obj);
185 }
186
187 // finally insert properties for classes containing them
188 int i=rowCount();
189 beginInsertRows(QModelIndex(), i, i + finalClassList.count());
190 foreach(const QMetaObject* metaObject, finalClassList) {
191 // Set default name of the hierarchy property to the class name
192 QString name = metaObject->className();
193 // Check if there is a special name for the class
194 int index = metaObject->indexOfClassInfo(qPrintable(name));
195 if (index != -1)
196 name = metaObject->classInfo(index).value();
197 // Create Property Item for class node
198 Property* propertyItem = new Property(name, 0, m_rootItem);
199 foreach(PropertyPair pair, propertyMap) {
200 // Check if the property is associated with the current class from the finalClassList
201 if (pair.Object == metaObject) {
202 QMetaProperty property(pair.Property);
203 Property* p = 0;
204 if (property.type() == QVariant::UserType && m_userCallback)
205 p = m_userCallback(property.name(), propertyObject, propertyItem);
206 else
207 p = new Property(property.name(), propertyObject, propertyItem);
208 int index = metaObject->indexOfClassInfo(property.name());
209 if (index != -1)
210 p->setEditorHints(metaObject->classInfo(index).value());
211 }
212 }
213 }
214 endInsertRows();
215}
216
217void QPropertyModel::updateItem ( QObject* propertyObject, const QModelIndex& parent /*= QModelIndex() */ ) {
218 Property *parentItem = m_rootItem;
219 if (parent.isValid())
220 parentItem = static_cast<Property*>(parent.internalPointer());
221 if (parentItem->propertyObject() != propertyObject)
222 parentItem = parentItem->findPropertyObject(propertyObject);
223 if (parentItem) // Indicate view that the data for the indices have changed
224 dataChanged(createIndex(parentItem->row(), 0, static_cast<Property*>(parentItem)), createIndex(parentItem->row(), 1, static_cast<Property*>(parentItem)));
225}
226
227void QPropertyModel::clear() {
228 beginRemoveRows(QModelIndex(), 0, rowCount());
229 delete m_rootItem;
230 m_rootItem = new Property("Root",0, this);
231 endRemoveRows();
232}
233
234void QPropertyModel::setCustomPropertyCB(QPropertyEditorWidget::UserTypeCB callback) {
235 m_userCallback = callback;
236}
diff --git a/utils/wpseditor/gui/src/QPropertyEditor/QPropertyModel.h b/utils/wpseditor/gui/src/QPropertyEditor/QPropertyModel.h
new file mode 100644
index 0000000000..8a52bbe87c
--- /dev/null
+++ b/utils/wpseditor/gui/src/QPropertyEditor/QPropertyModel.h
@@ -0,0 +1,105 @@
1// *************************************************************************************************
2//
3// QPropertyEditor v 0.1
4//
5// --------------------------------------
6// Copyright (C) 2007 Volker Wiendl
7//
8//
9// This library is free software; you can redistribute it and/or
10// modify it under the terms of the GNU Lesser General Public
11// License as published by the Free Software Foundation; either
12// version 2.1 of the License, or any later version.
13//
14// This library is distributed in the hope that it will be useful,
15// but WITHOUT ANY WARRANTY; without even the implied warranty of
16// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17// Lesser General Public License for more details.
18//
19// You should have received a copy of the GNU Lesser General Public
20// License along with this library; if not, write to the Free Software
21// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22//
23// *************************************************************************************************
24#ifndef QPROPERTYMODEL_H_
25#define QPROPERTYMODEL_H_
26
27#include <Qt/qabstractitemmodel.h>
28#include <Qt/qmap.h>
29
30#include "QPropertyEditorWidget.h"
31
32class Property;
33
34/**
35 * The QPropertyModel handles the user defined properties of QObjects
36 */
37class QPropertyModel : public QAbstractItemModel {
38 Q_OBJECT
39public:
40 /**
41 * Constructor
42 * @param parent optional parent object
43 */
44 QPropertyModel(QObject* parent = 0);
45 /// Destructor
46 virtual ~QPropertyModel();
47
48 /// QAbstractItemModel implementation
49 QModelIndex index ( int row, int column, const QModelIndex & parent = QModelIndex() ) const;
50
51 /// QAbstractItemModel implementation
52 QModelIndex parent ( const QModelIndex & index ) const;
53 /// QAbstractItemModel implementation
54 int rowCount ( const QModelIndex & parent = QModelIndex() ) const;
55 /// QAbstractItemModel implementation
56 int columnCount ( const QModelIndex & parent = QModelIndex() ) const;
57 /// QAbstractItemModel implementation
58 QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const;
59
60 /// QAbstractItemModel implementation
61 bool setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole );
62 /// QAbstractItemModel implementation
63 Qt::ItemFlags flags ( const QModelIndex & index ) const;
64
65 /// QAbstractItemModel implementation
66 QVariant headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const;
67
68 /// QAbstractItemModel implementation
69 QModelIndex buddy ( const QModelIndex & index ) const;
70
71 /**
72 * Adds the user properties of the given class to the QPropertyModel instance
73 *
74 * @param propertyObject the class inherited from QObject that contains user properties that should be
75 * managed by this instance
76 */
77 void addItem(QObject* propertyObject);
78
79 /**
80 * Creates a dataChanged signal for the given object
81 * @param propertyObject the instance of a QObject based class that should be updated
82 * @param parent optional model index the propertyObject is child of
83 */
84 void updateItem ( QObject* propertyObject, const QModelIndex& parent = QModelIndex() ) ;
85
86 /**
87 * Removes all objects from the model
88 */
89 void clear();
90
91 /**
92 * Sets custom callback that will be used to create Property instances for custom datatypes
93 */
94 void setCustomPropertyCB(QPropertyEditorWidget::UserTypeCB callback);
95
96private:
97
98 /// The Root Property for all objects
99 Property* m_rootItem;
100
101 /// Custom callback
102 QPropertyEditorWidget::UserTypeCB m_userCallback;
103
104};
105#endif
diff --git a/utils/wpseditor/gui/src/QPropertyEditor/QVariantDelegate.cpp b/utils/wpseditor/gui/src/QPropertyEditor/QVariantDelegate.cpp
new file mode 100644
index 0000000000..ebda9b2c31
--- /dev/null
+++ b/utils/wpseditor/gui/src/QPropertyEditor/QVariantDelegate.cpp
@@ -0,0 +1,105 @@
1// *************************************************************************************************
2//
3// QPropertyEditor v 0.1
4//
5// --------------------------------------
6// Copyright (C) 2007 Volker Wiendl
7//
8//
9// This library is free software; you can redistribute it and/or
10// modify it under the terms of the GNU Lesser General Public
11// License as published by the Free Software Foundation; either
12// version 2.1 of the License, or any later version.
13//
14// This library is distributed in the hope that it will be useful,
15// but WITHOUT ANY WARRANTY; without even the implied warranty of
16// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17// Lesser General Public License for more details.
18//
19// You should have received a copy of the GNU Lesser General Public
20// License along with this library; if not, write to the Free Software
21// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22//
23// *************************************************************************************************
24
25#include "QVariantDelegate.h"
26
27#include "Property.h"
28
29#include <Qt/qabstractitemview.h>
30
31
32QVariantDelegate::QVariantDelegate(QObject* parent) : QItemDelegate(parent) {}
33
34
35QVariantDelegate::~QVariantDelegate() {}
36
37QWidget *QVariantDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem& option , const QModelIndex & index ) const {
38 QWidget* editor = 0;
39 Property* p = static_cast<Property*>(index.internalPointer());
40 switch (p->value().type()) {
41 case QVariant::Color:
42 case QVariant::Int:
43 case QMetaType::Float:
44 case QVariant::Double:
45 case QVariant::UserType:
46 editor = p->createEditor(parent, option);
47 if (editor) break; // if no editor could be created take default case
48 default:
49 editor = QItemDelegate::createEditor(parent, option, index);
50 }
51 parseEditorHints(editor, p->editorHints());
52 return editor;
53}
54
55void QVariantDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const {
56 QVariant data = index.model()->data(index, Qt::EditRole);
57 switch (data.type()) {
58 case QVariant::Color:
59 case QMetaType::Double:
60 case QMetaType::Float:
61 case QVariant::UserType:
62 if (static_cast<Property*>(index.internalPointer())->setEditorData(editor, data)) // if editor couldn't be recognized use default
63 break;
64 default:
65 QItemDelegate::setEditorData(editor, index);
66 break;
67 }
68}
69
70void QVariantDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const {
71 QVariant data = index.model()->data(index, Qt::EditRole);
72 switch (data.type()) {
73 case QVariant::Color:
74 case QMetaType::Double:
75 case QMetaType::Float:
76 case QVariant::UserType: {
77 QVariant data = static_cast<Property*>(index.internalPointer())->editorData(editor);
78 if (data.isValid()) {
79 model->setData(index, data , Qt::EditRole);
80 break;
81 }
82 }
83 default:
84 QItemDelegate::setModelData(editor, model, index);
85 break;
86 }
87}
88
89void QVariantDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex& index ) const {
90 return QItemDelegate::updateEditorGeometry(editor, option, index);
91}
92
93void QVariantDelegate::parseEditorHints(QWidget* editor, const QString& editorHints) const {
94 if (editor && !editorHints.isEmpty()) {
95 // Parse for property values
96 QRegExp rx("(.*)(=\\s*)(.*)(;{1})");
97 rx.setMinimal(true);
98 int pos = 0;
99 while ((pos = rx.indexIn(editorHints, pos)) != -1) {
100 qDebug("Setting %s to %s", qPrintable(rx.cap(1)), qPrintable(rx.cap(3)));
101 editor->setProperty(qPrintable(rx.cap(1).trimmed()), rx.cap(3).trimmed());
102 pos += rx.matchedLength();
103 }
104 }
105}
diff --git a/utils/wpseditor/gui/src/QPropertyEditor/QVariantDelegate.h b/utils/wpseditor/gui/src/QPropertyEditor/QVariantDelegate.h
new file mode 100644
index 0000000000..e06265af82
--- /dev/null
+++ b/utils/wpseditor/gui/src/QPropertyEditor/QVariantDelegate.h
@@ -0,0 +1,78 @@
1// *************************************************************************************************
2//
3// QPropertyEditor v 0.1
4//
5// --------------------------------------
6// Copyright (C) 2007 Volker Wiendl
7//
8//
9// This library is free software; you can redistribute it and/or
10// modify it under the terms of the GNU Lesser General Public
11// License as published by the Free Software Foundation; either
12// version 2.1 of the License, or any later version.
13//
14// This library is distributed in the hope that it will be useful,
15// but WITHOUT ANY WARRANTY; without even the implied warranty of
16// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17// Lesser General Public License for more details.
18//
19// You should have received a copy of the GNU Lesser General Public
20// License along with this library; if not, write to the Free Software
21// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22//
23// *************************************************************************************************
24
25#ifndef COLORSELECTIONBUTTON_H_
26#define COLORSELECTIONBUTTON_H_
27
28#include <Qt/qitemdelegate.h>
29
30
31/**
32 * This class is used to create the editor widgets for datatypes encapsulated in QVariant variables
33 */
34class QVariantDelegate : public QItemDelegate {
35 Q_OBJECT
36
37public:
38 /**
39 * Constructor
40 * @param parent optional parent object
41 */
42 QVariantDelegate(QObject* parent = 0);
43 /// Destructor
44 virtual ~QVariantDelegate();
45
46 /**
47 * Creates an editor widget as child of a given widget for a specific QModelIndex
48 *
49 * @param parent the parent widget for the editor
50 * @param option some style options that the editor should use
51 * @param index the index of the item the editor will be created for
52 * @return QWidget the editor widget
53 */
54 QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
55
56 /**
57 * Tries to set the editor data based on the value stored at a specific QModelIndex
58 * @param editor the editor widget
59 * @param index the model index of the value that should be used in the editor
60 */
61 virtual void setEditorData(QWidget *editor, const QModelIndex &index) const;
62
63 /**
64 * Sets the data of a specific QModelIndex to tha value of the editor widget
65 * @param editor the editor widget that contains the new value
66 * @param model the model that contains the index
67 * @param index the index within the model whose data value should be set to the data value of the editor
68 */
69 virtual void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
70
71 /// QItemDelegate implementation
72 virtual void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;
73
74protected:
75 void parseEditorHints(QWidget* editor, const QString& editorHints) const;
76
77};
78#endif
diff --git a/utils/wpseditor/gui/src/main.cpp b/utils/wpseditor/gui/src/main.cpp
new file mode 100644
index 0000000000..0ba22c9fce
--- /dev/null
+++ b/utils/wpseditor/gui/src/main.cpp
@@ -0,0 +1,16 @@
1#include <QApplication>
2#include "qwpseditorwindow.h"
3#include "utils.h"
4#include <QPointer>
5
6QPointer<QWpsEditorWindow> win;
7
8int main(int argc, char ** argv) {
9 QApplication app( argc, argv );
10
11 win = new QWpsEditorWindow;
12 win->show();
13 app.connect( &app, SIGNAL( lastWindowClosed() ), &app, SLOT( quit() ) );
14
15 return app.exec();
16}
diff --git a/utils/wpseditor/gui/src/qtrackstate.cpp b/utils/wpseditor/gui/src/qtrackstate.cpp
new file mode 100644
index 0000000000..dad2f9a4aa
--- /dev/null
+++ b/utils/wpseditor/gui/src/qtrackstate.cpp
@@ -0,0 +1,41 @@
1#include "qtrackstate.h"
2#include <stdlib.h>
3
4//
5QTrackState::QTrackState( )
6 : QObject() {
7 memset(&state,0,sizeof(state));
8 state.title = (char*)"title";
9 state.artist = (char*)"artist";
10 state.album = (char*)"album";
11 state.length = 100;
12 state.elapsed = 50;
13}
14
15void QTrackState::setTitle(const QString& name) {
16 state.title = new char[name.length()];
17 strcpy(state.title,name.toAscii());
18 emit stateChanged(state);
19}
20
21void QTrackState::setArtist(const QString& name) {
22 state.artist = new char[name.length()];
23 strcpy(state.artist,name.toAscii());
24 emit stateChanged(state);
25}
26
27void QTrackState::setAlbum(const QString& name) {
28 state.album = new char[name.length()];
29 strcpy(state.album,name.toAscii());
30 emit stateChanged(state);
31}
32
33void QTrackState::setLength(int le) {
34 state.length = le;
35 emit stateChanged(state);
36}
37
38void QTrackState::setElapsed(int le) {
39 state.elapsed = le;
40 emit stateChanged(state);
41}
diff --git a/utils/wpseditor/gui/src/qtrackstate.h b/utils/wpseditor/gui/src/qtrackstate.h
new file mode 100644
index 0000000000..b57f7a8376
--- /dev/null
+++ b/utils/wpseditor/gui/src/qtrackstate.h
@@ -0,0 +1,57 @@
1#ifndef __QTRACKSTATE_H__
2#define __QTRACKSTATE_H__
3
4#include "wpsstate.h"
5#include <QObject>
6
7class QWpsState;
8
9class QTrackState : public QObject {
10 Q_OBJECT
11 Q_CLASSINFO ( "QTrackState", "Mp3 State" );
12 Q_PROPERTY ( QString Title READ title WRITE setTitle DESIGNABLE true USER true )
13 Q_PROPERTY ( QString Artist READ artist WRITE setArtist DESIGNABLE true USER true )
14 Q_PROPERTY ( QString Album READ album WRITE setAlbum DESIGNABLE true USER true )
15 Q_PROPERTY ( int Length READ length WRITE setLength DESIGNABLE true USER true )
16 Q_CLASSINFO("Length", "readOnly=true;value=100");
17 Q_PROPERTY ( int Elapsed READ elapsed WRITE setElapsed DESIGNABLE true USER true )
18 Q_CLASSINFO("Elapsed", "minimum=0;maximum=100;value=50");
19
20
21 trackstate state;
22
23public:
24 QTrackState();
25
26public slots:
27 QString title() const {
28 return state.title;
29 }
30 void setTitle ( const QString& name );
31
32 QString artist() const {
33 return state.artist;
34 }
35 void setArtist ( const QString& name );
36
37 QString album() const {
38 return state.album;
39 }
40 void setAlbum ( const QString& name );
41
42 int length() const {
43 return state.length;
44 }
45 void setLength ( int l );
46
47 int elapsed() const {
48 return state.elapsed;
49 }
50 void setElapsed ( int l );
51
52signals:
53 void stateChanged ( trackstate state );
54
55};
56
57#endif // __QTRACKSTATE_H__
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 @@
1#include "qwpsdrawer.h"
2#include "slider.h"
3#include "utils.h"
4#include <QtGui>
5#include <QLibrary>
6#include <stdarg.h>
7//
8
9
10QPointer<QWpsDrawer> drawer;
11QPixmap *QWpsDrawer::pix = NULL;
12QString QWpsDrawer::mTmpWpsString;
13QImage QWpsDrawer::backdrop;
14proxy_api QWpsDrawer::api;
15
16QWpsDrawer::QWpsDrawer( QWpsState *ws,QTrackState *ms, QWidget *parent )
17 : QWidget(parent),wpsState(ws),trackState(ms),showGrid(false),mTargetLibName("libwps") {
18
19 tryResolve();
20 memset(&api,0,sizeof(struct proxy_api));
21
22 api.verbose = 2;
23 api.putsxy = &QWpsDrawer::putsxy;
24 api.transparent_bitmap_part = &QWpsDrawer::transparent_bitmap_part;
25 api.bitmap_part = &QWpsDrawer::bitmap_part;
26 api.drawpixel = &QWpsDrawer::drawpixel;
27 api.fillrect = &QWpsDrawer::fillrect;
28 api.hline = &QWpsDrawer::hline;
29 api.vline = &QWpsDrawer::vline;
30 api.clear_viewport = &QWpsDrawer::clear_viewport;
31 api.load_wps_backdrop = &QWpsDrawer::load_wps_backdrop;
32 api.read_bmp_file = &QWpsDrawer::read_bmp_file;
33 api.debugf = &qlogger;
34 newTempWps();
35}
36
37bool QWpsDrawer::tryResolve() {
38 QLibrary lib(qApp->applicationDirPath()+"/"+mTargetLibName);
39 wps_init = (pfwps_init)lib.resolve("wps_init");
40 wps_display = (pfwps_display)lib.resolve("wps_display");
41 wps_refresh = (pfwps_refresh)lib.resolve("wps_refresh");
42 mResolved = wps_init && wps_display && wps_refresh;
43 if (!mResolved)
44 DEBUGF1(tr("ERR: Failed to resolve funcs!"));
45 return mResolved;
46}
47QWpsDrawer::~QWpsDrawer() {
48 qDebug()<<"QWpsDrawer::~QWpsDrawer()";
49 cleanTemp();
50}
51
52void QWpsDrawer::mouseReleaseEvent ( QMouseEvent * event ) {
53 Q_UNUSED(event);
54 /*int x = event->x() - (this->width()-pix->width())/2,
55 y = event->y() - (this->height()-pix->height())/2;
56 DEBUGF1("x=%d,y=%d",x,y);*/
57}
58void QWpsDrawer::newTempWps() {
59 QTemporaryFile tmpWps;
60 tmpWps.setAutoRemove(false);
61 tmpWps.setFileTemplate(QDir::tempPath()+"/XXXXXXXXXX.wps");
62 if (tmpWps.open()) {
63 QString tmpDir = tmpWps.fileName().left(tmpWps.fileName().length()-4);
64 if (QDir::temp().mkpath(tmpDir)) {
65 mTmpWpsString = tmpDir;
66 DEBUGF1(mTmpWpsString);
67 }
68 }
69}
70
71void QWpsDrawer::WpsInit(QString buffer, bool isFile) {
72
73 if (!mResolved)
74 if (!tryResolve())
75 return;
76 if (isFile) {
77 cleanTemp();
78 DEBUGF1( tr("Loading %1").arg(buffer));
79 QFile file(buffer);
80 if (file.open(QIODevice::ReadOnly | QIODevice::Text))
81 mWpsString = file.readAll();
82 newTempWps();
83 } else
84 mWpsString = buffer;
85 {
86 QFile tfile(mTmpWpsString+".wps");
87 if (tfile.open(QIODevice::WriteOnly | QIODevice::Text))
88 tfile.write(mWpsString.toAscii(),mWpsString.length());
89 }
90
91 if (isFile)
92 wps_init(buffer.toAscii(), &api, isFile);
93 else
94 wps_init(QString(mTmpWpsString+".wps").toAscii(), &api, true);
95 pix = new QPixmap(api.getwidth(),api.getheight());
96
97 drawBackdrop();
98
99 setMinimumWidth(api.getwidth());
100 setMinimumHeight(api.getheight());
101
102 update();
103}
104
105void QWpsDrawer::paintEvent(QPaintEvent * event) {
106 if (!mResolved)
107 return;
108 if (pix==NULL)
109 return;
110 QPainter p(this);
111 QRect rect = event->rect();
112
113 drawBackdrop();
114 wps_refresh();
115
116 if (showGrid) {
117 QPainter g(pix);
118 viewport_api avp;
119 api.get_current_vp(&avp);
120
121 g.setPen(Qt::green);
122
123 for (int i=0;i*avp.fontheight/1.5<avp.width ;i++) {
124 g.drawLine(int(i*avp.fontheight/1.5), 0, int(i*avp.fontheight/1.5), avp.height);
125 }
126 for (int j=0;j*avp.fontheight<avp.height; j++) {
127 g.drawLine(0,j*avp.fontheight,avp.width,j*avp.fontheight);
128 }
129 }
130
131 p.drawPixmap((rect.width()-pix->width())/2,(rect.height()-pix->height())/2,*pix);
132
133}
134
135void QWpsDrawer::clear_viewport(int x,int y,int w,int h, int color) {
136 DEBUGF2("clear_viewport(int x=%d,int y=%d,int w=%d,int h=%d, int color)",x,y,w,h);
137 QPainter p(pix);
138 //p.setOpacity(0.1);
139 //QImage img = backdrop.copy(x,y,w,h);
140 //p.drawImage(x,y,img);
141}
142
143void QWpsDrawer::slotSetVolume() {
144 Slider *slider = new Slider(this, tr("Volume"),-74,10);
145 slider->show();
146 connect(slider, SIGNAL(valueChanged(int)), wpsState, SLOT(setVolume(int)));
147 connect(this, SIGNAL(destroyed()),slider, SLOT(close()));
148}
149
150void QWpsDrawer::slotSetProgress() {
151 Slider *slider = new Slider(this,tr("Progress"),0,100);
152 slider->show();
153 connect(slider, SIGNAL(valueChanged(int)), trackState, SLOT(setElapsed(int)));
154 connect(this, SIGNAL(destroyed()),slider, SLOT(close()));
155}
156
157void QWpsDrawer::slotWpsStateChanged(wpsstate ws_) {
158 if (api.set_wpsstate)
159 api.set_wpsstate(ws_);
160 update();
161}
162
163void QWpsDrawer::slotTrackStateChanged(trackstate ms_) {
164 if (api.set_wpsstate)
165 api.set_trackstate(ms_);
166 update();
167}
168
169void QWpsDrawer::slotShowGrid(bool show) {
170 showGrid = show;
171 update();
172}
173
174void QWpsDrawer::drawBackdrop() {
175 QPainter b(pix);
176 QImage pink = backdrop.createMaskFromColor(qRgb(255,0,255),Qt::MaskOutColor);
177 backdrop.setAlphaChannel(pink);
178 b.drawImage(0,0,backdrop);
179}
180
181void QWpsDrawer::slotSetAudioStatus(int status) {
182 api.set_audio_status(status);
183 update();
184}
185
186void QWpsDrawer::cleanTemp(bool fileToo) {
187 if (fileToo)
188 QFile::remove(mTmpWpsString+".wps");
189 QDirIterator it(mTmpWpsString, QDirIterator::Subdirectories);
190 while (it.hasNext()) {
191 QFile::remove(it.next());
192 }
193 QDir(mTmpWpsString).rmdir(mTmpWpsString);
194}
195
196void QWpsDrawer::closeEvent(QCloseEvent *event) {
197 qDebug()<<"QWpsDrawer::closeEvent()";
198 cleanTemp();
199 event->accept();
200}
diff --git a/utils/wpseditor/gui/src/qwpsdrawer.h b/utils/wpseditor/gui/src/qwpsdrawer.h
new file mode 100644
index 0000000000..d4dfa6c7a2
--- /dev/null
+++ b/utils/wpseditor/gui/src/qwpsdrawer.h
@@ -0,0 +1,82 @@
1#ifndef WPSDRAWER_H
2#define WPSDRAWER_H
3//
4#include <QWidget>
5#include <QPixmap>
6#include <QPointer>
7#include <QTemporaryFile>
8#include "api.h"
9#include "qtrackstate.h"
10#include "qwpsstate.h"
11//
12
13typedef int (*pfwps_init)(const char* buff,struct proxy_api *api, bool isfile);
14typedef int (*pfwps_display)();
15typedef int (*pfwps_refresh)();
16
17class QWpsDrawer : public QWidget {
18 Q_OBJECT
19
20 pfwps_init wps_init;
21 pfwps_display wps_display;
22 pfwps_refresh wps_refresh;
23
24 static QPixmap *pix;
25 static QImage backdrop;
26
27 QWpsState *wpsState;
28 QTrackState *trackState;
29
30 bool showGrid;
31 bool mResolved;
32 QString mWpsString;
33 QString mTargetLibName;
34 static QString mTmpWpsString;
35
36
37protected:
38 virtual void paintEvent(QPaintEvent * event);
39 virtual void closeEvent(QCloseEvent *event);
40 virtual void mouseReleaseEvent ( QMouseEvent * event ) ;
41 void drawBackdrop();
42 void newTempWps();
43 void cleanTemp(bool fileToo=true);
44 bool tryResolve();
45public:
46 QWpsDrawer(QWpsState *ws,QTrackState *ms, QWidget *parent=0);
47 ~QWpsDrawer();
48 void WpsInit(QString buffer, bool isFile = true);
49
50 QString wpsString() const {
51 return mWpsString;
52 };
53 QString tempWps() const {
54 return mTmpWpsString;
55 };
56
57
58 static proxy_api api;
59 /***********Drawing api******************/
60 static void putsxy(int x, int y, const unsigned char *str);
61 static void transparent_bitmap_part(const void *src, int src_x, int src_y,
62 int stride, int x, int y, int width, int height);
63 static void bitmap_part(const void *src, int src_x, int src_y,
64 int stride, int x, int y, int width, int height);
65 static void drawpixel(int x, int y);
66 static void fillrect(int x, int y, int width, int height);
67 static void hline(int x1, int x2, int y);
68 static void vline(int x, int y1, int y2);
69 static void clear_viewport(int x,int y,int w,int h, int color);
70 static bool load_wps_backdrop(char* filename);
71 static int read_bmp_file(const char* filename,int *width, int *height);
72 /****************************************/
73public slots:
74 void slotSetVolume();
75 void slotSetProgress();
76
77 void slotShowGrid(bool);
78 void slotWpsStateChanged(wpsstate);
79 void slotTrackStateChanged(trackstate);
80 void slotSetAudioStatus(int);
81};
82#endif
diff --git a/utils/wpseditor/gui/src/qwpsdrawer_static.cpp b/utils/wpseditor/gui/src/qwpsdrawer_static.cpp
new file mode 100644
index 0000000000..bf94d28a5a
--- /dev/null
+++ b/utils/wpseditor/gui/src/qwpsdrawer_static.cpp
@@ -0,0 +1,77 @@
1#include "qwpsdrawer.h"
2#include <QPainter>
3#include <QFile>
4#include <QFileInfo>
5#include "utils.h"
6
7void QWpsDrawer::putsxy(int x, int y, const unsigned char *str) {
8 QPainter p(pix);
9 viewport_api avp;
10 api.get_current_vp(&avp);
11 p.setPen(Qt::gray);
12
13
14 QFont font("times",avp.fontheight,QFont::Bold);
15 p.setFont(font);
16 p.drawText(x+avp.x,y + avp.fontheight + avp.y,(char*)str);
17}
18void QWpsDrawer::transparent_bitmap_part(const void *src, int src_x, int src_y,
19 int stride, int x, int y, int width, int height) {
20 QImage img;
21 img.load((char*)src);
22 DEBUGF2("transparent_bitmap_part(const void *src=%s, int src_x=%d, int src_y=%d,int stride=%d, int x=%d, int y=%d, int width=%d, int height=%d",(char*)src,src_x, src_y,stride, x, y, width, height);
23 QPainter p(pix);
24 QPoint target(x,y);
25 QRectF source(src_x, src_y, width, height);
26
27 QImage pink = img.createMaskFromColor(qRgb(255,0,255),Qt::MaskOutColor);
28 img.setAlphaChannel(pink);
29
30 p.drawImage(target, img, source);
31}
32void QWpsDrawer::bitmap_part(const void *src, int src_x, int src_y,
33 int stride, int x, int y, int width, int height) {
34 transparent_bitmap_part(src,src_x,src_y,stride,x,y,width,height);
35}
36void QWpsDrawer::drawpixel(int x, int y) {
37 QPainter p(pix);
38 p.setPen(Qt::blue);
39 p.drawPoint(x,y);
40}
41void QWpsDrawer::fillrect(int x, int y, int width, int height) {
42 QPainter p(pix);
43 DEBUGF2("fillrect(int x=%d, int y=%d, int width=%d, int height=%d)\n",x, y, width, height);
44 p.setPen(Qt::green);
45}
46void QWpsDrawer::hline(int x1, int x2, int y) {
47 QPainter p(pix);
48 p.setPen(Qt::black);
49 p.drawLine(x1,y,x2,y);
50}
51void QWpsDrawer::vline(int x, int y1, int y2) {
52 QPainter p(pix);
53 p.setPen(Qt::black);
54 p.drawLine(x,y1,x,y2);
55}
56bool QWpsDrawer::load_wps_backdrop(char* filename) {
57 DEBUGF2("load backdrop: %s", filename);
58 QFile file(filename);
59 QFileInfo info(file);
60 file.copy(mTmpWpsString+"/"+info.fileName());
61 backdrop.load(filename);
62 return true;
63}
64
65int QWpsDrawer::read_bmp_file(const char* filename,int *width, int *height) {
66 QImage img;
67
68 QFile file(filename);
69 QFileInfo info(file);
70 file.copy(mTmpWpsString+"/"+info.fileName());
71
72 img.load(filename);
73 //qDebug()<<"QWpsDrawer::read_bmp_file"<<img.width()<<img.height();
74 *width = img.width();
75 *height = img.height();
76 return 1;
77}
diff --git a/utils/wpseditor/gui/src/qwpseditorwindow.cpp b/utils/wpseditor/gui/src/qwpseditorwindow.cpp
new file mode 100644
index 0000000000..c3090bd027
--- /dev/null
+++ b/utils/wpseditor/gui/src/qwpseditorwindow.cpp
@@ -0,0 +1,120 @@
1#include "qwpseditorwindow.h"
2#include "qwpsdrawer.h"
3#include "utils.h"
4#include <QFileDialog>
5#include <QDebug>
6#include <QInputDialog>
7
8enum api_playmode playmodes[PLAYMODES_NUM] = {
9 API_STATUS_PLAY,
10 API_STATUS_STOP,
11 API_STATUS_PAUSE,
12 API_STATUS_FASTFORWARD,
13 API_STATUS_FASTBACKWARD
14 };
15
16const char *playmodeNames[] = {
17 "Play",
18 "Stop",
19 "Pause",
20 "FastForward",
21 "FastBackward"
22 };
23
24QWpsEditorWindow::QWpsEditorWindow( QWidget * parent, Qt::WFlags f)
25 : QMainWindow(parent, f) {
26 logEdit = 0;
27 setupUi(this);
28 drawer = new QWpsDrawer(&wpsState,&trackState, this);
29 QWpsDrawer::api.verbose = 1;
30 //drawer->WpsInit("iCatcher.wps");
31 setCentralWidget(drawer);
32 connectActions();
33 m_propertyEditor->addObject(&trackState);
34 m_propertyEditor->addObject(&wpsState);
35}
36
37void QWpsEditorWindow::connectActions() {
38 qDebug()<<"connect actions";
39 connect(actOpenWps, SIGNAL(triggered()), this, SLOT(slotOpenWps()));
40 connect(actSetVolume, SIGNAL(triggered()), drawer, SLOT(slotSetVolume()));
41 connect(actSetProgress, SIGNAL(triggered()), drawer, SLOT(slotSetProgress()));
42 connect(actShowGrid, SIGNAL(triggered(bool)), drawer, SLOT(slotShowGrid(bool)));
43
44 connect(actUpdatePlainWps, SIGNAL(triggered()), SLOT(slotUpdatePlainWps()));
45 connect(plainWpsEdit->document(), SIGNAL(modificationChanged(bool)), SLOT(slotPlainDocModChanged(bool)));
46
47 connect(&wpsState, SIGNAL(stateChanged(wpsstate)), drawer, SLOT(slotWpsStateChanged(wpsstate)));
48 connect(&trackState, SIGNAL(stateChanged(trackstate)), drawer, SLOT(slotTrackStateChanged(trackstate)));
49 connect(&wpsState, SIGNAL(stateChanged(wpsstate)), this, SLOT(slotWpsStateChanged(wpsstate)));
50 connect(&trackState, SIGNAL(stateChanged(trackstate)), this, SLOT(slotTrackStateChanged(trackstate)));
51
52 connect(actClearLog, SIGNAL(triggered()), logEdit, SLOT(clear()));
53 connect(actVerboseLevel, SIGNAL(triggered()), SLOT(slotVerboseLevel()));
54
55 actGroupAudios = new QActionGroup(this);
56 signalMapper = new QSignalMapper(this);
57 for (int i=0;i<PLAYMODES_NUM;i++) {
58 QAction *act = new QAction(playmodeNames[i],this);
59 act->setCheckable(true);
60 actGroupAudios->addAction(act);
61 connect(act,SIGNAL(triggered()),signalMapper,SLOT(map()));
62 signalMapper->setMapping(act, i);
63 menuPlay->addAction(act);
64 actAudios[playmodes[i]] = act;
65 }
66 connect(signalMapper, SIGNAL(mapped(int)), SIGNAL(signalAudioStatusChanged(int)));
67 connect(this, SIGNAL(signalAudioStatusChanged(int)), drawer, SLOT(slotSetAudioStatus(int)));
68 actGroupAudios->setEnabled(false);
69}
70
71void QWpsEditorWindow::slotWpsStateChanged(wpsstate) {
72 m_propertyEditor->updateObject(&wpsState);
73 m_propertyEditor->update();
74}
75
76void QWpsEditorWindow::slotTrackStateChanged(trackstate) {
77 m_propertyEditor->updateObject(&trackState);
78 m_propertyEditor->update();
79}
80
81void QWpsEditorWindow::slotOpenWps() {
82 QString wpsfile = QFileDialog::getOpenFileName(this,
83 tr("Open WPS"), "", tr("WPS Files (*.wps);; All Files (*.*)"));
84 if (wpsfile == "") {
85 DEBUGF1(tr("File wasn't chosen"));
86 return;
87 }
88 m_propertyEditor->setEnabled(true);
89 drawer->WpsInit(wpsfile);
90 plainWpsEdit->clear();
91 plainWpsEdit->append(drawer->wpsString());
92 trackState.setAlbum(trackState.album());
93 actGroupAudios->setEnabled(true);
94}
95
96void QWpsEditorWindow::logMsg(QString s) {
97 logEdit->append(s);
98}
99
100void QWpsEditorWindow::slotVerboseLevel() {
101 bool ok;
102 int i = QInputDialog::getInteger(this, tr("Set Verbose Level"),tr("Level:"), QWpsDrawer::api.verbose, 0, 3, 1, &ok);
103 if (ok)
104 QWpsDrawer::api.verbose = i;
105}
106
107void QWpsEditorWindow::slotUpdatePlainWps() {
108 DEBUGF1(tr("Updating WPS"));
109 plainWpsEdit->document()->setModified(false);
110 drawer->WpsInit(plainWpsEdit->toPlainText(),false);
111
112}
113
114void QWpsEditorWindow::slotPlainDocModChanged(bool changed) {
115 if (changed)
116 dockPlainWps->setWindowTitle(tr("PlainWps*"));
117 else
118 dockPlainWps->setWindowTitle(tr("PlainWps"));
119}
120
diff --git a/utils/wpseditor/gui/src/qwpseditorwindow.h b/utils/wpseditor/gui/src/qwpseditorwindow.h
new file mode 100644
index 0000000000..019eb63808
--- /dev/null
+++ b/utils/wpseditor/gui/src/qwpseditorwindow.h
@@ -0,0 +1,45 @@
1#ifndef MAINWINDOWIMPL_H
2#define MAINWINDOWIMPL_H
3//
4#include <QMainWindow>
5#include <QActionGroup>
6#include <QSignalMapper>
7#include "ui_mainwindow.h"
8#include "wpsstate.h"
9#include "qwpsdrawer.h"
10#include "qwpsstate.h"
11#include "qtrackstate.h"
12//
13class QWpsEditorWindow : public QMainWindow, public Ui::MainWindow {
14 Q_OBJECT
15 QWpsState wpsState;
16 QTrackState trackState;
17 QPointer<QWpsDrawer> drawer;
18
19 QHash<int, QAction*> actAudios;
20 QActionGroup *actGroupAudios;
21 QSignalMapper *signalMapper;
22
23protected:
24 void connectActions();
25public:
26 QWpsEditorWindow( QWidget * parent = 0, Qt::WFlags f = 0 );
27 void logMsg(QString s);
28private slots:
29 void slotOpenWps();
30 void slotVerboseLevel();
31 void slotWpsStateChanged(wpsstate);
32 void slotTrackStateChanged(trackstate);
33
34 void slotUpdatePlainWps();
35 void slotPlainDocModChanged(bool m);
36
37signals:
38 void signalAudioStatusChanged(int);
39
40};
41#endif
42
43
44
45
diff --git a/utils/wpseditor/gui/src/qwpsstate.cpp b/utils/wpseditor/gui/src/qwpsstate.cpp
new file mode 100644
index 0000000000..4244bf6293
--- /dev/null
+++ b/utils/wpseditor/gui/src/qwpsstate.cpp
@@ -0,0 +1,29 @@
1#include "qwpsstate.h"
2
3QWpsState::QWpsState(): QObject() {
4 state.fontheight = 8;
5 state.fontwidth = 5;
6 state.volume = -30;
7 state.battery_level = 50;
8
9}
10
11void QWpsState::setFontHeight(int val) {
12 state.fontheight = val;
13 emit stateChanged(state);
14}
15
16void QWpsState::setFontWidth(int val) {
17 state.fontwidth = val;
18 emit stateChanged(state);
19}
20
21void QWpsState::setVolume(int val) {
22 state.volume = val;
23 emit stateChanged(state);
24}
25
26void QWpsState::setBattery(int val) {
27 state.battery_level = val;
28 emit stateChanged(state);
29}
diff --git a/utils/wpseditor/gui/src/qwpsstate.h b/utils/wpseditor/gui/src/qwpsstate.h
new file mode 100644
index 0000000000..eb43531de6
--- /dev/null
+++ b/utils/wpseditor/gui/src/qwpsstate.h
@@ -0,0 +1,54 @@
1#ifndef __WPSSTATE_H__
2#define __WPSSTATE_H__
3
4#include <QObject>
5#include "wpsstate.h"
6
7class QWpsState : public QObject {
8 Q_OBJECT
9
10
11 Q_CLASSINFO("QWpsState", "WPS State");
12 Q_PROPERTY(int FontHeight READ fontHeight WRITE setFontHeight DESIGNABLE true USER true)
13 Q_CLASSINFO("FontHeight", "minimum=6;maximum=20;value=10");
14 Q_PROPERTY(int FontWidth READ fontWidth WRITE setFontWidth DESIGNABLE true USER true)
15 Q_CLASSINFO("FontWidth", "minimum=4;maximum=20;value=8");
16 Q_PROPERTY(int Volume READ volume WRITE setVolume DESIGNABLE true USER true)
17 Q_CLASSINFO("Volume", "minimum=-74;maximum=24;value=-15");
18 Q_PROPERTY(int Battery READ battery WRITE setBattery DESIGNABLE true USER true)
19 Q_CLASSINFO("Battery", "minimum=0;maximum=100;value=50");
20
21 wpsstate state;
22
23public:
24 QWpsState();
25
26 int fontHeight() const {
27 return state.fontheight;
28 }
29 void setFontHeight(int val);
30
31 int fontWidth() const {
32 return state.fontwidth;
33 }
34 void setFontWidth(int val);
35
36 int battery() const {
37 return state.battery_level;
38 }
39 void setBattery(int val);
40
41 int volume() const {
42 return state.volume;
43 }
44public slots:
45 void setVolume(int val);
46
47
48
49
50
51signals:
52 void stateChanged ( wpsstate state );
53};
54#endif // __WPSSTATE_H__
diff --git a/utils/wpseditor/gui/src/slider.cpp b/utils/wpseditor/gui/src/slider.cpp
new file mode 100644
index 0000000000..7e3c9a942c
--- /dev/null
+++ b/utils/wpseditor/gui/src/slider.cpp
@@ -0,0 +1,20 @@
1#include "slider.h"
2#include <QDebug>
3//
4Slider::Slider(QWidget *parent, QString caption, int min, int max ):QDialog(parent) {
5 setupUi ( this );
6 connect(horslider, SIGNAL(valueChanged(int)), this, SIGNAL(valueChanged(int)));
7 connect(this, SIGNAL(valueChanged(int)), this, SLOT(slotValueChanged(int)));
8 setWindowTitle(caption);
9 horslider->setMinimum(min);
10 horslider->setMaximum(max);
11}
12//
13int Slider::value() {
14 return horslider->value();
15}
16void Slider::slotValueChanged(int step) {
17 setWindowTitle(tr("Value =%1 ").arg(step));
18}
19
20
diff --git a/utils/wpseditor/gui/src/slider.h b/utils/wpseditor/gui/src/slider.h
new file mode 100644
index 0000000000..2620731644
--- /dev/null
+++ b/utils/wpseditor/gui/src/slider.h
@@ -0,0 +1,21 @@
1#ifndef SLIDERIMPL_H
2#define SLIDERIMPL_H
3//
4#include <QWidget>
5#include <QDialog>
6#include "ui_slider.h"
7//
8class Slider : public QDialog , Ui::slider {
9 Q_OBJECT
10public slots:
11 void slotValueChanged(int step);
12signals:
13 void valueChanged(int);
14public:
15 Slider(QWidget *parent, QString caption, int min, int max );
16 int value();
17
18
19
20};
21#endif
diff --git a/utils/wpseditor/gui/src/utils.cpp b/utils/wpseditor/gui/src/utils.cpp
new file mode 100644
index 0000000000..f18442555b
--- /dev/null
+++ b/utils/wpseditor/gui/src/utils.cpp
@@ -0,0 +1,28 @@
1#include "utils.h"
2#include <QPointer>
3#include <QtGlobal>
4#include "qwpseditorwindow.h"
5
6extern QPointer<QWpsEditorWindow> win;
7
8int qlogger(const char* fmt,...) {
9 va_list ap;
10 va_start(ap, fmt);
11 QString s;
12 s.vsprintf(fmt,ap);
13 va_end(ap);
14 s.replace("\n","");
15 //qDebug()<<s;
16 if (win==0)
17 qDebug()<<s;
18 if (s.indexOf("ERR")>=0)
19 s = "<font color=red>"+s+"</font>";
20 if (win!=0)
21 win->logMsg(s);
22 va_end(ap);
23 return s.length();
24}
25
26int qlogger(const QString& s) {
27 return qlogger(s.toAscii().data());
28}
diff --git a/utils/wpseditor/gui/src/utils.h b/utils/wpseditor/gui/src/utils.h
new file mode 100644
index 0000000000..ae88d78249
--- /dev/null
+++ b/utils/wpseditor/gui/src/utils.h
@@ -0,0 +1,12 @@
1#ifndef __UTILS_H__
2#define __UTILS_H__
3
4#include <QDebug>
5
6#define DEBUGF1 qlogger
7#define DEBUGF2(...)
8
9extern int qlogger(const char* fmt,...);
10extern int qlogger(const QString& s);
11
12#endif // __UTILS_H__
diff --git a/utils/wpseditor/gui/ui/mainwindow.ui b/utils/wpseditor/gui/ui/mainwindow.ui
new file mode 100644
index 0000000000..cd3f52bd66
--- /dev/null
+++ b/utils/wpseditor/gui/ui/mainwindow.ui
@@ -0,0 +1,290 @@
1<ui version="4.0" >
2 <class>MainWindow</class>
3 <widget class="QMainWindow" name="MainWindow" >
4 <property name="geometry" >
5 <rect>
6 <x>0</x>
7 <y>0</y>
8 <width>882</width>
9 <height>669</height>
10 </rect>
11 </property>
12 <property name="windowTitle" >
13 <string>WPS Editor</string>
14 </property>
15 <widget class="QWidget" name="centralwidget" >
16 <property name="geometry" >
17 <rect>
18 <x>260</x>
19 <y>21</y>
20 <width>344</width>
21 <height>345</height>
22 </rect>
23 </property>
24 </widget>
25 <widget class="QMenuBar" name="menubar" >
26 <property name="geometry" >
27 <rect>
28 <x>0</x>
29 <y>0</y>
30 <width>882</width>
31 <height>21</height>
32 </rect>
33 </property>
34 <widget class="QMenu" name="menuFile" >
35 <property name="title" >
36 <string>File</string>
37 </property>
38 <addaction name="actOpenWps" />
39 <addaction name="actSetVolume" />
40 <addaction name="actSetProgress" />
41 <addaction name="actShowGrid" />
42 <addaction name="actClearLog" />
43 <addaction name="actVerboseLevel" />
44 <addaction name="actQuit" />
45 </widget>
46 <widget class="QMenu" name="menuPlay" >
47 <property name="title" >
48 <string>Play</string>
49 </property>
50 </widget>
51 <addaction name="menuFile" />
52 <addaction name="menuPlay" />
53 </widget>
54 <widget class="QStatusBar" name="statusbar" >
55 <property name="geometry" >
56 <rect>
57 <x>0</x>
58 <y>650</y>
59 <width>882</width>
60 <height>19</height>
61 </rect>
62 </property>
63 </widget>
64 <widget class="QDockWidget" name="dockPlainWps" >
65 <property name="geometry" >
66 <rect>
67 <x>0</x>
68 <y>370</y>
69 <width>882</width>
70 <height>280</height>
71 </rect>
72 </property>
73 <property name="minimumSize" >
74 <size>
75 <width>0</width>
76 <height>30</height>
77 </size>
78 </property>
79 <property name="windowTitle" >
80 <string>PlainWps</string>
81 </property>
82 <attribute name="dockWidgetArea" >
83 <number>8</number>
84 </attribute>
85 <widget class="QWidget" name="dockWidgetContents_3" >
86 <property name="geometry" >
87 <rect>
88 <x>0</x>
89 <y>22</y>
90 <width>882</width>
91 <height>258</height>
92 </rect>
93 </property>
94 <layout class="QGridLayout" name="gridLayout_2" >
95 <item rowspan="2" row="0" column="0" >
96 <widget class="QTextEdit" name="plainWpsEdit" >
97 <property name="autoFillBackground" >
98 <bool>false</bool>
99 </property>
100 <property name="readOnly" >
101 <bool>false</bool>
102 </property>
103 </widget>
104 </item>
105 <item row="0" column="1" >
106 <widget class="QPushButton" name="btnUpdatePlainWps" >
107 <property name="text" >
108 <string>Update WPS</string>
109 </property>
110 </widget>
111 </item>
112 <item row="1" column="1" >
113 <spacer name="verticalSpacer" >
114 <property name="orientation" >
115 <enum>Qt::Vertical</enum>
116 </property>
117 <property name="sizeHint" stdset="0" >
118 <size>
119 <width>20</width>
120 <height>211</height>
121 </size>
122 </property>
123 </spacer>
124 </item>
125 </layout>
126 </widget>
127 </widget>
128 <widget class="QDockWidget" name="m_dockWidget" >
129 <property name="geometry" >
130 <rect>
131 <x>0</x>
132 <y>21</y>
133 <width>256</width>
134 <height>345</height>
135 </rect>
136 </property>
137 <property name="windowTitle" >
138 <string>Property Editor</string>
139 </property>
140 <attribute name="dockWidgetArea" >
141 <number>1</number>
142 </attribute>
143 <widget class="QPropertyEditorWidget" name="m_propertyEditor" >
144 <property name="enabled" >
145 <bool>false</bool>
146 </property>
147 <property name="geometry" >
148 <rect>
149 <x>0</x>
150 <y>22</y>
151 <width>256</width>
152 <height>323</height>
153 </rect>
154 </property>
155 </widget>
156 </widget>
157 <widget class="QDockWidget" name="dockWidget" >
158 <property name="geometry" >
159 <rect>
160 <x>608</x>
161 <y>21</y>
162 <width>274</width>
163 <height>345</height>
164 </rect>
165 </property>
166 <property name="minimumSize" >
167 <size>
168 <width>0</width>
169 <height>30</height>
170 </size>
171 </property>
172 <property name="windowTitle" >
173 <string>Log</string>
174 </property>
175 <attribute name="dockWidgetArea" >
176 <number>2</number>
177 </attribute>
178 <widget class="QWidget" name="dockWidgetContents" >
179 <property name="geometry" >
180 <rect>
181 <x>0</x>
182 <y>22</y>
183 <width>274</width>
184 <height>323</height>
185 </rect>
186 </property>
187 <layout class="QGridLayout" name="gridLayout" >
188 <item row="0" column="0" >
189 <widget class="QTextEdit" name="logEdit" >
190 <property name="autoFillBackground" >
191 <bool>false</bool>
192 </property>
193 <property name="readOnly" >
194 <bool>true</bool>
195 </property>
196 </widget>
197 </item>
198 </layout>
199 </widget>
200 </widget>
201 <action name="actQuit" >
202 <property name="text" >
203 <string>Quit</string>
204 </property>
205 </action>
206 <action name="actOpenWps" >
207 <property name="text" >
208 <string>Open WPS</string>
209 </property>
210 </action>
211 <action name="actSetVolume" >
212 <property name="text" >
213 <string>Set Volume</string>
214 </property>
215 </action>
216 <action name="actSetProgress" >
217 <property name="text" >
218 <string>Set Progress</string>
219 </property>
220 </action>
221 <action name="actShowGrid" >
222 <property name="checkable" >
223 <bool>true</bool>
224 </property>
225 <property name="checked" >
226 <bool>false</bool>
227 </property>
228 <property name="text" >
229 <string>Show Grid</string>
230 </property>
231 </action>
232 <action name="actClearLog" >
233 <property name="text" >
234 <string>Clear Log</string>
235 </property>
236 </action>
237 <action name="actVerboseLevel" >
238 <property name="text" >
239 <string>Verbose Level</string>
240 </property>
241 </action>
242 <action name="actUpdatePlainWps" >
243 <property name="text" >
244 <string>Update WPS</string>
245 </property>
246 </action>
247 </widget>
248 <customwidgets>
249 <customwidget>
250 <class>QPropertyEditorWidget</class>
251 <extends>QTreeView</extends>
252 <header>QPropertyEditorWidget.h</header>
253 </customwidget>
254 </customwidgets>
255 <resources/>
256 <connections>
257 <connection>
258 <sender>btnUpdatePlainWps</sender>
259 <signal>clicked()</signal>
260 <receiver>actUpdatePlainWps</receiver>
261 <slot>trigger()</slot>
262 <hints>
263 <hint type="sourcelabel" >
264 <x>835</x>
265 <y>411</y>
266 </hint>
267 <hint type="destinationlabel" >
268 <x>-1</x>
269 <y>-1</y>
270 </hint>
271 </hints>
272 </connection>
273 <connection>
274 <sender>actQuit</sender>
275 <signal>triggered()</signal>
276 <receiver>MainWindow</receiver>
277 <slot>close()</slot>
278 <hints>
279 <hint type="sourcelabel" >
280 <x>-1</x>
281 <y>-1</y>
282 </hint>
283 <hint type="destinationlabel" >
284 <x>440</x>
285 <y>334</y>
286 </hint>
287 </hints>
288 </connection>
289 </connections>
290</ui>
diff --git a/utils/wpseditor/gui/ui/slider.ui b/utils/wpseditor/gui/ui/slider.ui
new file mode 100644
index 0000000000..24fff0bf23
--- /dev/null
+++ b/utils/wpseditor/gui/ui/slider.ui
@@ -0,0 +1,43 @@
1<ui version="4.0" >
2 <class>slider</class>
3 <widget class="QWidget" name="slider" >
4 <property name="geometry" >
5 <rect>
6 <x>0</x>
7 <y>0</y>
8 <width>295</width>
9 <height>37</height>
10 </rect>
11 </property>
12 <property name="windowTitle" >
13 <string>Value</string>
14 </property>
15 <widget class="QSlider" name="horslider" >
16 <property name="geometry" >
17 <rect>
18 <x>0</x>
19 <y>10</y>
20 <width>291</width>
21 <height>21</height>
22 </rect>
23 </property>
24 <property name="minimum" >
25 <number>-78</number>
26 </property>
27 <property name="maximum" >
28 <number>24</number>
29 </property>
30 <property name="singleStep" >
31 <number>1</number>
32 </property>
33 <property name="value" >
34 <number>-78</number>
35 </property>
36 <property name="orientation" >
37 <enum>Qt::Horizontal</enum>
38 </property>
39 </widget>
40 </widget>
41 <resources/>
42 <connections/>
43</ui>
diff --git a/utils/wpseditor/libwps/Makefile b/utils/wpseditor/libwps/Makefile
new file mode 100644
index 0000000000..3779a9ed30
--- /dev/null
+++ b/utils/wpseditor/libwps/Makefile
@@ -0,0 +1,100 @@
1# __________ __ ___.
2# Open \______ \ ____ ____ | | _\_ |__ _______ ___
3# Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
4# Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
5# Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
6# \/ \/ \/ \/ \/
7# $Id$
8#
9ROOT=../../..
10
11OS = w32
12CC = gcc
13MKDIR = mkdir -p
14
15ifeq ($(findstring MINGW,$(shell uname)),MINGW)
16OS = w32
17CC = mingw32-gcc
18COPY = copy
19RM = rm
20endif
21
22ifeq ($(findstring Linux,$(shell uname)),Linux)
23OS = linux
24CC = gcc
25COPY = cp
26RM = rm -f
27endif
28
29
30
31COMMON= \
32 src/dummies.c \
33 src/api.c \
34 src/lcd.c \
35 $(ROOT)/apps/gui/wps_parser.c \
36 $(ROOT)/apps/gui/wps_debug.c \
37 $(ROOT)/firmware/font.c \
38 $(ROOT)/apps/misc.c \
39 $(ROOT)/apps/gui/gwps-common.c \
40 $(ROOT)/apps/status.c \
41 $(ROOT)/apps/recorder/peakmeter.c \
42 $(ROOT)/apps/recorder/icons.c \
43 $(ROOT)/apps/gui/scrollbar.c \
44 $(ROOT)/firmware/common/timefuncs.c \
45 $(ROOT)/firmware/common/unicode.c \
46 $(ROOT)/firmware/common/ctype.c \
47 $(ROOT)/firmware/id3.c \
48 $(ROOT)/firmware/font_cache.c \
49 $(ROOT)/firmware/lru.c \
50 $(ROOT)/firmware/mp3data.c \
51 $(ROOT)/firmware/replaygain.c
52
53# $(ROOT)/apps/recorder/bmp.c
54# $(ROOT)/apps/abrepeat.c \
55# $(ROOT)/apps/action.c \
56# $(ROOT)/apps/cuesheet.c \
57# $(ROOT)/apps/gui/statusbar.c \
58# $(ROOT)/apps/gui/gwps.c \
59
60INCLUDE=-I src/include \
61 -I $(ROOT)/apps/gui \
62 -I $(ROOT)/firmware/export \
63 -I $(ROOT)/firmware/include \
64 -I $(ROOT)/apps/recorder \
65 -I $(ROOT)/apps \
66 -I src
67
68CFLAGS = -g -Wall -D__PCTOOL__ -DWPSEDITOR -DDEBUG -DROCKBOX_DIR_LEN=1 -DBUTTON_REMOTE
69
70all:
71 @echo To build, run the buildall.sh script
72
73build: build-$(OS)
74
75build-w32: src/proxy.c $(COMMON)
76 @echo CC [$(TARGET)]
77 @$(CC) $(INCLUDE) $(CFLAGS) -D$(TARGET) -DTARGET_MODEL=\"$(MODEL)\" -DBUILD_DLL $(COMMON) -shared src/proxy.c -o libwps_$(MODEL).dll
78
79build-linux: src/proxy.c $(COMMON)
80 @echo CC [$(TARGET)]
81 @$(CC) $(INCLUDE) $(CFLAGS) -D$(TARGET) -DTARGET_MODEL=\"$(MODEL)\" -shared -Wl,-soname,libwps_$(MODEL).so,-olibwps_$(MODEL).so -fPIC $(COMMON) src/proxy.c
82
83clean: clean-$(OS)
84
85clean-w32:
86 $(RM) "libwps_$(MODEL).dll"
87
88clean-linux:
89 $(RM) "libwps_$(MODEL).so.1"
90
91shared: shared-$(OS)
92
93shared-w32: src/proxy.c $(COMMON)
94 @echo CC [IRIVER_H10_5GB]
95 @$(CC) $(INCLUDE) $(CFLAGS) -DIRIVER_H10_5GB -DTARGET_MODEL=\"h10_5gb\" -DBUILD_DLL $(COMMON) -shared src/proxy.c -o ../gui/bin/libwps.dll
96
97shared-linux: src/proxy.c $(COMMON)
98 @echo CC [IRIVER_H10_5GB]
99 @$(CC) $(INCLUDE) $(CFLAGS) -DIRIVER_H10_5GB -DTARGET_MODEL=\"h10_5gb\" -shared -Wl,-soname,libwps.so,-olibwps.so -fPIC $(COMMON) src/proxy.c
100 @$(COPY) libwps.so ../gui/bin/libwps.so
diff --git a/utils/wpseditor/libwps/buildall.sh b/utils/wpseditor/libwps/buildall.sh
new file mode 100644
index 0000000000..60677d22b6
--- /dev/null
+++ b/utils/wpseditor/libwps/buildall.sh
@@ -0,0 +1,7 @@
1#!/bin/sh
2cat targets.txt | (
3 while read target model
4 do
5 make MODEL=$model TARGET=$target build
6 done
7)
diff --git a/utils/wpseditor/libwps/cleanall.sh b/utils/wpseditor/libwps/cleanall.sh
new file mode 100644
index 0000000000..15b733a6a7
--- /dev/null
+++ b/utils/wpseditor/libwps/cleanall.sh
@@ -0,0 +1,7 @@
1#!/bin/sh
2cat targets.txt | (
3 while read target model
4 do
5 make MODEL=$model TARGET=$target clean
6 done
7)
diff --git a/utils/wpseditor/libwps/src/api.c b/utils/wpseditor/libwps/src/api.c
new file mode 100644
index 0000000000..485efa8e00
--- /dev/null
+++ b/utils/wpseditor/libwps/src/api.c
@@ -0,0 +1,268 @@
1#include <stdio.h>
2#include <stdlib.h>
3#include "sound.h"
4#include "api.h"
5#include "proxy.h"
6#include "dummies.h"
7#include "scroll_engine.h"
8#include "wpsstate.h"
9#include <string.h>
10
11struct proxy_api *xapi;
12
13void get_current_vp(struct viewport_api *avp);
14/*************************************************************
15
16*************************************************************/
17#ifdef HAVE_LCD_BITMAP
18void screen_clear_area(struct screen * display, int xstart, int ystart,
19 int width, int height) {
20 display->set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
21 display->fillrect(xstart, ystart, width, height);
22 display->set_drawmode(DRMODE_SOLID);
23}
24#endif
25
26bool load_wps_backdrop(char* filename) {
27 return xapi->load_wps_backdrop(filename);
28}
29
30bool load_remote_wps_backdrop(char* filename) {
31 return xapi->load_remote_wps_backdrop(filename);
32}
33
34int read_bmp_file(const char* filename,struct bitmap *bm, int maxsize,int format) {
35 if (!xapi->read_bmp_file)
36 {
37 DEBUGF1("can't read bmp file! NULL api!\n");
38 return -1;
39 }
40 bm->format = 3;//FORMAT_ANY?
41 bm->data = (unsigned char*)malloc(255);
42 memset(bm->data,0,255);
43 strcpy((char*)bm->data,filename);
44 //bm->data[strlen(filename)] = '\0';
45 xapi->read_bmp_file(filename,&bm->width, &bm->height);
46 return 1;
47}
48
49bool load_wps_backdrop2(char* filename) {
50 DEBUGF1("load_wps_backdrop(char* filename='%s')",filename);
51 return true;
52}
53
54bool load_remote_wps_backdrop2(char* filename) {
55 DEBUGF1("load_remote_wps_backdrop2(char* filename='%s')",filename);
56 return true;
57}
58
59void stop_scroll() {
60 DEBUGF3("stop_scroll\n");
61 return;
62}
63
64void puts_scroll(int x, int y, const unsigned char *string) {
65 DEBUGF2("puts_scroll(int x=%d, int y=%d, const unsigned char *string='%s'\n",x,y,string);
66}
67
68void putsxy(int x, int y, const unsigned char *str) {
69 DEBUGF2("putsxy(int =%d, int y=%d, const unsigned char *str='%s')\n",x,y,str);
70}
71
72void lcd_update() {
73 DEBUGF3("update\n");
74}
75
76void clear_viewport(int x, int y, int w, int h, int color) {
77 DEBUGF3("clear_viewport(int x=%d, int y=%d, int w=%d, int h=%d, int color=%d)\n", x, y, w, h, color);
78};
79
80int getstringsize(const unsigned char *str, int *w, int *h) {
81 //DEBUGF1("getstringsize(const unsigned char *str=\"%s\", int *w=%d, int *h=%d \n",str,*w,*h);
82 *w=strlen((char*)str)*sysfont.maxwidth;
83 *h=sysfont.height;
84 return 1;
85}
86
87void set_wpsstate(struct wpsstate state){
88 sysfont.height = state.fontheight;
89 sysfont.maxwidth = state.fontwidth;
90 global_settings.volume = state.volume;
91 battery_percent = state.battery_level;
92 _audio_status = state.audio_status;
93}
94
95void set_trackstate(struct trackstate state){
96 gui_wps[0].state->id3->title = state.title;
97 gui_wps[0].state->id3->artist = state.artist;
98 gui_wps[0].state->id3->album = state.album;
99 gui_wps[0].state->id3->elapsed = state.elapsed;
100 gui_wps[0].state->id3->length = state.length;
101}
102
103void set_next_trackstate(struct trackstate state)
104{
105 gui_wps[0].state->nid3->title = state.title;
106 gui_wps[0].state->nid3->artist = state.artist;
107 gui_wps[0].state->nid3->album = state.album;
108 gui_wps[0].state->nid3->elapsed = state.elapsed;
109 gui_wps[0].state->nid3->length = state.length;
110}
111
112enum api_playmode playmodes[PLAYMODES_NUM] = {
113 API_STATUS_PLAY,
114 API_STATUS_STOP,
115 API_STATUS_PAUSE,
116 API_STATUS_FASTFORWARD,
117 API_STATUS_FASTBACKWARD
118};
119
120const char *playmodeNames[] = {
121 "Play", "Stop", "Pause", "FastForward", "FastBackward"
122};
123
124
125void set_audio_status(int status){
126 DEBUGF1("%s",playmodeNames[status]);
127 switch(status){
128 case API_STATUS_PLAY:
129 _audio_status = AUDIO_STATUS_PLAY;
130 status_set_ffmode(STATUS_PLAY);
131 break;
132 case API_STATUS_STOP:
133 _audio_status = 0;
134 status_set_ffmode(STATUS_STOP);
135 break;
136 case API_STATUS_PAUSE:
137 _audio_status = AUDIO_STATUS_PAUSE;
138 status_set_ffmode(STATUS_PLAY);
139 break;
140 case API_STATUS_FASTFORWARD:
141 status_set_ffmode(STATUS_FASTFORWARD);
142 break;
143 case API_STATUS_FASTBACKWARD:
144 status_set_ffmode(STATUS_FASTBACKWARD);
145 break;
146 default:
147 DEBUGF1("ERR: Unknown status");
148 }
149}
150
151void test_api(struct proxy_api *api) {
152 if (!api->stop_scroll)
153 api->stop_scroll=stop_scroll;
154 if (!api->set_viewport)
155 api->set_viewport=lcd_set_viewport;
156 if (!api->clear_viewport)
157 api->clear_viewport=clear_viewport;
158 if (!api->getstringsize)
159 api->getstringsize=getstringsize;
160 if (!api->getwidth)
161 api->getwidth=lcd_getwidth;
162 if (!api->getheight)
163 api->getheight=lcd_getheight;
164 if (!api->set_drawmode)
165 api->set_drawmode=lcd_set_drawmode;
166 if (!api->puts_scroll)
167 api->puts_scroll=puts_scroll;
168 if (!api->update)
169 api->update=lcd_update;
170 if (!api->clear_display)
171 api->clear_display=lcd_clear_display;
172 if (!api->getfont)
173 api->getfont=lcd_getfont;
174 if (!api->putsxy)
175 api->putsxy=putsxy;
176
177#if LCD_DEPTH > 1
178 if (!api->get_foreground)
179 api->get_foreground=lcd_get_foreground;
180 if (!api->get_background)
181 api->get_background=lcd_get_background;
182#endif
183 if (!api->load_remote_wps_backdrop)
184 api->load_remote_wps_backdrop = load_remote_wps_backdrop2;
185 if (!api->load_wps_backdrop)
186 api->load_wps_backdrop = load_wps_backdrop2;
187 //dbgf = printf;
188}
189
190/**************************************************************
191
192**************************************************************/
193
194int set_api(struct proxy_api* api) {
195 if (api->debugf)
196 dbgf = api->debugf;
197 screens[0].screen_type=SCREEN_MAIN;
198 screens[0].lcdwidth=LCD_WIDTH;
199 screens[0].lcdheight=LCD_HEIGHT;
200 screens[0].depth=LCD_DEPTH;
201#ifdef HAVE_LCD_COLOR
202 screens[0].is_color=true;
203#else
204 screens[0].is_color=false;
205#endif
206 if (api->getwidth)
207 screens[0].getwidth = api->getwidth;
208 if (api->stop_scroll)
209 screens[0].stop_scroll=api->stop_scroll;
210 screens[0].scroll_stop = lcd_scroll_stop;
211 if (api->set_viewport)
212 screens[0].set_viewport=api->set_viewport;
213 if (api->clear_viewport)
214 screens[0].clear_viewport=lcd_clear_viewport;
215 if (api->getstringsize)
216 screens[0].getstringsize=api->getstringsize;
217 if (api->getwidth)
218 screens[0].getwidth=api->getwidth;
219 if (api->getheight)
220 screens[0].getheight=api->getheight;
221 if (api->set_drawmode)
222 screens[0].set_drawmode=api->set_drawmode;
223 if (api->fillrect)
224 screens[0].fillrect=api->fillrect;
225 if (api->puts_scroll)
226 screens[0].puts_scroll=api->puts_scroll;
227 if (api->transparent_bitmap_part)
228 screens[0].transparent_bitmap_part=api->transparent_bitmap_part;
229 if (api->update)
230 screens[0].update=api->update;
231 if (api->clear_display)
232 screens[0].clear_display=api->clear_display;
233 if (api->getfont)
234 screens[0].getfont=api->getfont;
235 if (api->hline)
236 screens[0].hline=api->hline;
237 if (api->vline)
238 screens[0].vline=api->vline;
239 if (api->drawpixel)
240 screens[0].drawpixel=api->drawpixel;
241 if (api->putsxy)
242 screens[0].putsxy=api->putsxy;
243#if LCD_DEPTH > 1
244 if (api->get_foreground)
245 screens[0].get_foreground=api->get_foreground;
246 if (api->get_background)
247 screens[0].get_background=api->get_background;
248#endif
249
250 screens[0].bitmap_part = api->bitmap_part;
251 /**************************
252 * OUT *
253 **************************/
254 api->get_model_name = get_model_name;
255 api->get_current_vp = get_current_vp;
256 api->set_wpsstate = set_wpsstate;
257 api->set_trackstate = set_trackstate;
258 api->set_next_trackstate= set_next_trackstate;
259 api->set_audio_status= set_audio_status;
260 xapi = api;
261 return 0;
262}
263
264
265
266
267
268
diff --git a/utils/wpseditor/libwps/src/api.h b/utils/wpseditor/libwps/src/api.h
new file mode 100644
index 0000000000..86bb1a6597
--- /dev/null
+++ b/utils/wpseditor/libwps/src/api.h
@@ -0,0 +1,85 @@
1#ifndef API_H_INCLUDED
2#define API_H_INCLUDED
3#include <stdbool.h>
4#include <stddef.h>
5#include "defs.h"
6#include "wpsstate.h"
7#ifdef __PCTOOL__
8#include "dummies.h"
9#endif
10
11struct viewport_api {
12 int x;
13 int y;
14 int width;
15 int height;
16 int font;
17 int drawmode;
18 unsigned fg_pattern;
19 unsigned bg_pattern;
20 unsigned lss_pattern;
21 unsigned lse_pattern;
22 unsigned lst_pattern;
23
24 //TODO: ??
25 int fontheight;
26 int fontwidth;
27};
28
29struct proxy_api
30{
31 bool (*load_remote_wps_backdrop)(char* file_name);
32 bool (*load_wps_backdrop)(char* file_name);
33
34 unsigned (*get_foreground)(void);
35 unsigned (*get_background)(void);
36 int (*getwidth)(void);
37 int (*getheight)(void);
38
39 void (*puts_scroll)(int x, int y, const unsigned char *string);
40 void (*putsxy)(int x, int y, const unsigned char *str);
41 int (*getfont)();
42 int (*getstringsize)(const unsigned char *str, int *w, int *h);
43 void (*stop_scroll)();
44
45 void (*transparent_bitmap_part)(const void *src, int src_x, int src_y,
46 int stride, int x, int y, int width, int height);
47 void (*bitmap_part)(const void *src, int src_x, int src_y,
48 int stride, int x, int y, int width, int height);
49 void (*hline)(int x1, int x2, int y);
50 void (*vline)(int x, int y1, int y2);
51 void (*drawpixel)(int x, int y);
52 void (*set_drawmode)(int mode);
53 void (*fillrect)(int x, int y, int width, int height);
54
55
56 void (*update)();
57 void (*set_viewport)(struct viewport* vp);
58 void (*clear_display)(void);
59 void (*clear_viewport)(int x,int y,int w,int h, int color);
60
61 void* (*plugin_get_buffer)(size_t *buffer_size);
62 int (*read_bmp_file)(const char* filename,int *width, int *height);
63 void (*set_wpsstate)(struct wpsstate state);
64 void (*set_trackstate)(struct trackstate state);
65 void (*set_next_trackstate)(struct trackstate state);
66 void (*set_audio_status)(int status);
67
68 pfdebugf debugf;
69 int verbose;
70
71
72/**************************
73* OUT *
74**************************/
75 const char* (*get_model_name)();
76 void (*get_current_vp)(struct viewport_api *avp);
77
78
79};
80
81extern struct proxy_api *xapi;
82
83EXPORT int set_api(struct proxy_api* api);
84
85#endif // API_H_INCLUDED
diff --git a/utils/wpseditor/libwps/src/defs.h b/utils/wpseditor/libwps/src/defs.h
new file mode 100644
index 0000000000..810c8da238
--- /dev/null
+++ b/utils/wpseditor/libwps/src/defs.h
@@ -0,0 +1,41 @@
1#ifndef DEFS_H_INCLUDED
2#define DEFS_H_INCLUDED
3
4typedef int (*pfdebugf)(const char* fmt,...);
5extern pfdebugf dbgf;
6
7#ifdef BUILD_DLL
8# define EXPORT __declspec(dllexport)
9#else
10# define EXPORT
11#endif
12
13#ifndef MIN
14# define MIN(a, b) (((a)<(b))?(a):(b))
15#endif
16
17#ifndef MAX
18# define MAX(a, b) (((a)>(b))?(a):(b))
19#endif
20
21#define SWAP_16(x) ((typeof(x))(unsigned short)(((unsigned short)(x) >> 8) | \
22 ((unsigned short)(x) << 8)))
23
24#define SWAP_32(x) ((typeof(x))(unsigned long)( ((unsigned long)(x) >> 24) | \
25 (((unsigned long)(x) & 0xff0000ul) >> 8) | \
26 (((unsigned long)(x) & 0xff00ul) << 8) | \
27 ((unsigned long)(x) << 24)))
28
29#define PLAYMODES_NUM 5
30enum api_playmode {
31 API_STATUS_PLAY,
32 API_STATUS_STOP,
33 API_STATUS_PAUSE,
34 API_STATUS_FASTFORWARD,
35 API_STATUS_FASTBACKWARD
36};
37
38extern enum api_playmode playmodes[PLAYMODES_NUM];
39extern const char *playmodeNames[];
40
41#endif // DEFS_H_INCLUDED
diff --git a/utils/wpseditor/libwps/src/dummies.c b/utils/wpseditor/libwps/src/dummies.c
new file mode 100644
index 0000000000..8592610701
--- /dev/null
+++ b/utils/wpseditor/libwps/src/dummies.c
@@ -0,0 +1,363 @@
1#include <string.h>
2#include <stdio.h>
3#include "dummies.h"
4#include "proxy.h"
5
6struct user_settings global_settings;
7
8struct wps_state wps_state;
9struct gui_wps gui_wps[NB_SCREENS];
10struct wps_data wps_datas[NB_SCREENS];
11struct cuesheet *curr_cue;
12struct cuesheet *temp_cue;
13struct system_status global_status;
14struct gui_syncstatusbar statusbars;
15struct playlist_info current_playlist;
16struct font sysfont;
17int battery_percent = 100;
18struct mp3entry current_song, next_song;
19int _audio_status;
20
21charger_input_state_type charger_input_state;
22#if CONFIG_CHARGING >= CHARGING_MONITOR
23charge_state_type charge_state;
24#endif
25
26#if defined(CPU_PP) && defined(BOOTLOADER)
27/* We don't enable interrupts in the iPod bootloader, so we need to fake
28the current_tick variable */
29#define current_tick (signed)(USEC_TIMER/10000)
30#else
31volatile long current_tick;
32#endif
33
34
35void dummies_init(){
36 sysfont.height = 9;
37 sysfont.maxwidth = 6;
38 global_settings.statusbar=true;
39}
40
41int playlist_amount_ex(const struct playlist_info* playlist);
42void sound_set_volume(int value)
43{
44 DEBUGF3("sound_set_volume(int value=%d)",value);
45 global_settings.volume = value;
46}
47int sound_get_pitch(void)
48{
49 return 0;
50}
51int sound_min(int setting)
52{
53 DEBUGF3("sound_min(int setting=%d)",setting);
54 return -78; //audiohw_settings[setting].minval;
55}
56
57void sleep(int hz)
58{
59}
60
61void audio_init(void){}
62void audio_wait_for_init(void){}
63void audio_play(long offset){}
64void audio_stop(void){}
65void audio_pause(void){}
66void audio_resume(void){}
67void audio_next(void){}
68void audio_prev(void){}
69int audio_status(void)
70{
71 return _audio_status;
72}
73
74#if CONFIG_CODEC == SWCODEC
75int audio_track_count(void){return 0;} /* SWCODEC only */
76long audio_filebufused(void){return 0;} /* SWCODEC only */
77void audio_pre_ff_rewind(void){} /* SWCODEC only */
78#endif /* CONFIG_CODEC == SWCODEC */
79void audio_ff_rewind(long newtime){}
80void audio_flush_and_reload_tracks(void){}
81#ifdef HAVE_ALBUMART
82int audio_current_aa_hid(void){return -1;}
83#endif
84struct mp3entry* audio_current_track(void){return 0;}
85struct mp3entry* audio_next_track(void){return 0;}
86bool audio_has_changed_track(void)
87{
88 return false;
89}
90
91int get_sleep_timer(void){return 0;}
92
93
94int battery_level(void){return battery_percent;} /* percent */
95int battery_time(void){return 0;} /* minutes */
96unsigned int battery_adc_voltage(void){return 0;} /* voltage from ADC in millivolts */
97unsigned int battery_voltage(void){return 0;} /* filtered batt. voltage in millivolts */
98int get_radio_status(void){return 0;}
99
100
101/* returns full path of playlist (minus extension) */
102char *playlist_name(const struct playlist_info* playlist, char *buf,
103int buf_size)
104{
105 char *sep;
106
107 if (!playlist)
108 return "no";
109
110 snprintf(buf, buf_size, "%s", playlist->filename+playlist->dirlen);
111
112 if (!buf[0])
113 return NULL;
114
115 /* Remove extension */
116 sep = strrchr(buf, '.');
117 if(sep)
118 *sep = 0;
119
120 return buf;
121}
122int playlist_get_display_index(void)
123{
124 return 1;
125}
126
127void gui_syncsplash(int ticks, const unsigned char *fmt, ...)
128{
129
130}
131
132void splash(int ticks, const unsigned char *fmt, ...)
133{
134
135}
136
137void gui_statusbar_draw(struct gui_statusbar * bar, bool force_redraw){
138 DEBUGF3("gui_statusbar_draw");
139}
140
141void yield(void){}
142
143
144/* returns true if cuesheet support is initialised */
145bool cuesheet_is_enabled(void){return false;}
146
147/* allocates the cuesheet buffer */
148void cuesheet_init(void){}
149
150/* looks if there is a cuesheet file that has a name matching "trackpath" */
151bool look_for_cuesheet_file(const char *trackpath, char *found_cue_path){return false;}
152
153/* parse cuesheet "file" and store the information in "cue" */
154bool parse_cuesheet(char *file, struct cuesheet *cue){return false;}
155
156/* reads a cuesheet to find the audio track associated to it */
157bool get_trackname_from_cuesheet(char *filename, char *buf){return false;}
158
159/* display a cuesheet struct */
160void browse_cuesheet(struct cuesheet *cue){}
161
162/* display a cuesheet file after parsing and loading it to the plugin buffer */
163bool display_cuesheet_content(char* filename){return false;}
164
165/* finds the index of the current track played within a cuesheet */
166int cue_find_current_track(struct cuesheet *cue, unsigned long curpos){return 0;}
167
168/* update the id3 info to that of the currently playing track in the cuesheet */
169void cue_spoof_id3(struct cuesheet *cue, struct mp3entry *id3){}
170
171/* skip to next track in the cuesheet towards "direction" (which is 1 or -1) */
172bool curr_cuesheet_skip(int direction, unsigned long curr_pos){return false;}
173
174#ifdef HAVE_LCD_BITMAP
175/* draw track markers on the progressbar */
176void cue_draw_markers(struct screen *screen, unsigned long tracklen,
177int x1, int x2, int y, int h){}
178#endif
179
180
181void draw_album_art(struct gui_wps *gwps, int handle_id, bool clear)
182{
183 if (!gwps || !gwps->data || !gwps->display || handle_id < 0)
184 return;
185
186 struct wps_data *data = gwps->data;
187
188#ifdef HAVE_REMOTE_LCD
189 /* No album art on RWPS */
190 if (data->remote_wps)
191 return;
192#endif
193
194 struct bitmap *bmp;
195 /* if (bufgetdata(handle_id, 0, (void *)&bmp) <= 0)
196 return;*/
197
198 short x = data->albumart_x;
199 short y = data->albumart_y;
200 short width = bmp->width;
201 short height = bmp->height;
202
203 if (data->albumart_max_width > 0)
204 {
205 /* Crop if the bitmap is too wide */
206 width = MIN(bmp->width, data->albumart_max_width);
207
208 /* Align */
209 if (data->albumart_xalign & WPS_ALBUMART_ALIGN_RIGHT)
210 x += data->albumart_max_width - width;
211 else if (data->albumart_xalign & WPS_ALBUMART_ALIGN_CENTER)
212 x += (data->albumart_max_width - width) / 2;
213 }
214
215 if (data->albumart_max_height > 0)
216 {
217 /* Crop if the bitmap is too high */
218 height = MIN(bmp->height, data->albumart_max_height);
219
220 /* Align */
221 if (data->albumart_yalign & WPS_ALBUMART_ALIGN_BOTTOM)
222 y += data->albumart_max_height - height;
223 else if (data->albumart_yalign & WPS_ALBUMART_ALIGN_CENTER)
224 y += (data->albumart_max_height - height) / 2;
225 }
226
227 if (!clear)
228 {
229 /* Draw the bitmap */
230 gwps->display->set_drawmode(DRMODE_FG);
231 gwps->display->bitmap_part((fb_data*)bmp->data, 0, 0, bmp->width,
232 x, y, width, height);
233 gwps->display->set_drawmode(DRMODE_SOLID);
234 }
235 else
236 {
237 /* Clear the bitmap */
238 gwps->display->set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
239 gwps->display->fillrect(x, y, width, height);
240 gwps->display->set_drawmode(DRMODE_SOLID);
241 }
242}
243
244/* Update the "data" pointer to make the handle's data available to the caller.
245Return the length of the available linear data or < 0 for failure (handle
246not found).
247The caller is blocked until the requested amount of data is available.
248size is the amount of linear data requested. it can be 0 to get as
249much as possible.
250The guard buffer may be used to provide the requested size. This means it's
251unsafe to request more than the size of the guard buffer.
252*/
253size_t bufgetdata(int handle_id, size_t size, void **data)
254{
255
256
257 return size;
258}
259
260
261void gui_syncstatusbar_draw(struct gui_syncstatusbar * bars,
262bool force_redraw)
263{
264#ifdef HAVE_LCD_BITMAP
265 if(!global_settings.statusbar)
266 return;
267#endif /* HAVE_LCD_BITMAP */
268 int i;
269 FOR_NB_SCREENS(i) {
270 gui_statusbar_draw( &(bars->statusbars[i]), force_redraw );
271 }
272}
273void unload_wps_backdrop(void)
274{
275
276}
277
278#if CONFIG_CODEC == SWCODEC
279int get_replaygain_mode(bool have_track_gain, bool have_album_gain)
280{
281 int type;
282
283 bool track = ((global_settings.replaygain_type == REPLAYGAIN_TRACK)
284 || ((global_settings.replaygain_type == REPLAYGAIN_SHUFFLE)
285 && global_settings.playlist_shuffle));
286
287 type = (!track && have_album_gain) ? REPLAYGAIN_ALBUM
288 : have_track_gain ? REPLAYGAIN_TRACK : -1;
289
290 return type;
291}
292#endif
293
294/* Common functions for all targets */
295void rtc_init(void){}
296int rtc_read_datetime(unsigned char* buf){return 0;}
297int rtc_write_datetime(unsigned char* buf){return 0;}
298
299void backlight_on(void){}
300void backlight_off(void){}
301
302
303void debugf(const char *fmt, ...)
304{}
305void panicf( const char *fmt, ...)
306{
307}
308
309off_t filesize(int fd){return 0;}
310
311int playlist_amount(void)
312{
313 return playlist_amount_ex(NULL);
314}
315int playlist_amount_ex(const struct playlist_info* playlist)
316{
317 if (!playlist)
318 playlist = &current_playlist;
319
320 return playlist->amount;
321}
322
323int get_action(int context, int timeout)
324{
325 return 0;
326}
327
328void lcd_mono_bitmap(const unsigned char *src, int x, int y, int width,
329 int height){}
330
331void pcm_calculate_rec_peaks(int *left, int *right)
332{
333}
334void pcm_calculate_peaks(int *left, int *right)
335{
336}
337bool led_read(int delayticks) /* read by status bar update */
338{
339 return false;
340}
341
342#ifndef HAS_BUTTON_HOLD
343bool is_keys_locked(void)
344{
345 return false;
346}
347#endif
348
349long default_event_handler_ex(long event, void (*callback)(void *), void *parameter)
350{
351 return 0;
352}
353
354long default_event_handler(long event)
355{
356 return default_event_handler_ex(event, NULL, NULL);
357}
358
359void ab_draw_markers(struct screen * screen, int capacity,
360 int x0, int x1, int y, int h)
361 {
362 }
363void pcmbuf_beep(unsigned int frequency, size_t duration, int amplitude){}
diff --git a/utils/wpseditor/libwps/src/dummies.h b/utils/wpseditor/libwps/src/dummies.h
new file mode 100644
index 0000000000..2bfce1d53b
--- /dev/null
+++ b/utils/wpseditor/libwps/src/dummies.h
@@ -0,0 +1,44 @@
1#ifndef DUMMIES_H_INCLUDED
2#define DUMMIES_H_INCLUDED
3
4#include <stdio.h>
5
6#include "settings.h"
7#include "gwps.h"
8#include "lang.h"
9#include "powermgmt.h"
10#include "font.h"
11#include "playlist.h"
12
13#include "defs.h"
14
15extern struct font sysfont;
16extern struct user_settings global_settings;
17extern struct wps_state wps_state;
18extern struct gui_wps gui_wps[NB_SCREENS];
19extern struct wps_data wps_datas[NB_SCREENS];
20extern struct cuesheet *curr_cue;
21extern struct cuesheet *temp_cue;
22extern struct system_status global_status;
23extern struct gui_syncstatusbar statusbars;
24extern struct playlist_info current_playlist;
25extern int battery_percent;
26extern struct mp3entry current_song, next_song;
27extern int _audio_status;
28
29charger_input_state_type charger_input_state;
30#if CONFIG_CHARGING >= CHARGING_MONITOR
31extern charge_state_type charge_state;
32#endif
33
34#if defined(CPU_PP) && defined(BOOTLOADER)
35/* We don't enable interrupts in the iPod bootloader, so we need to fake
36the current_tick variable */
37#define current_tick (signed)(USEC_TIMER/10000)
38#else
39extern volatile long current_tick;
40#endif
41
42void dummies_init();
43
44#endif /*DUMMIES_H_INCLUDED*/
diff --git a/utils/wpseditor/libwps/src/include/lang.h b/utils/wpseditor/libwps/src/include/lang.h
new file mode 100644
index 0000000000..3274bdec6c
--- /dev/null
+++ b/utils/wpseditor/libwps/src/include/lang.h
@@ -0,0 +1,10 @@
1#define LANG_END_PLAYLIST (signed char)1
2#define LANG_KEYLOCK_ON (signed char)2
3#define LANG_KEYLOCK_OFF (signed char)3
4#define LANG_WEEKDAY_SUNDAY (signed char)4
5#define LANG_MONTH_JANUARY (signed char)5
6#define VOICE_PAUSE (signed char)6
7#define LANG_BATTERY_TIME (signed char)7
8#define UNIT_PERCENT (signed char)8
9
10#define str(...) "empty"
diff --git a/utils/wpseditor/libwps/src/include/rockboxlogo.h b/utils/wpseditor/libwps/src/include/rockboxlogo.h
new file mode 100644
index 0000000000..8d1c8b69c3
--- /dev/null
+++ b/utils/wpseditor/libwps/src/include/rockboxlogo.h
@@ -0,0 +1 @@
diff --git a/utils/wpseditor/libwps/src/include/sysfont.h b/utils/wpseditor/libwps/src/include/sysfont.h
new file mode 100644
index 0000000000..4ba770347c
--- /dev/null
+++ b/utils/wpseditor/libwps/src/include/sysfont.h
@@ -0,0 +1 @@
#define SYSFONT_HEIGHT 9
diff --git a/utils/wpseditor/libwps/src/include/system-target.h b/utils/wpseditor/libwps/src/include/system-target.h
new file mode 100644
index 0000000000..8d1c8b69c3
--- /dev/null
+++ b/utils/wpseditor/libwps/src/include/system-target.h
@@ -0,0 +1 @@
diff --git a/utils/wpseditor/libwps/src/lcd.c b/utils/wpseditor/libwps/src/lcd.c
new file mode 100644
index 0000000000..1f12332750
--- /dev/null
+++ b/utils/wpseditor/libwps/src/lcd.c
@@ -0,0 +1,150 @@
1#include "font.h"
2#include "screen_access.h"
3//#include <windef.h>
4#include "api.h"
5#include "defs.h"
6#include "proxy.h"
7#include "dummies.h"
8
9static struct viewport default_vp =
10{
11 .x = 0,
12 .y = 0,
13 .width = LCD_WIDTH,
14 .height = LCD_HEIGHT,
15 .font = FONT_SYSFIXED,
16 .drawmode = DRMODE_SOLID,
17 .fg_pattern = LCD_DEFAULT_FG,
18 .bg_pattern = LCD_DEFAULT_BG,
19 .lss_pattern = LCD_DEFAULT_BG,
20 .lse_pattern = LCD_DEFAULT_BG,
21 .lst_pattern = LCD_DEFAULT_BG,
22};
23
24struct viewport* current_vp = &default_vp;
25
26void get_current_vp(struct viewport_api *avp){
27 avp->x = current_vp->x;
28 avp->y = current_vp->y;
29 avp->width = current_vp->width;
30 avp->height = current_vp->height;
31
32 //TODO: font_get(current_vp->font)->height;
33 avp->fontheight = sysfont.height;
34}
35
36void lcd_set_viewport(struct viewport* vp)
37{
38 if (vp == NULL){
39 current_vp = &default_vp;
40 DEBUGF3("lcd_set_viewport(struct viewport* vp= DEFAULT)\n");
41 }
42 else{
43 current_vp = vp;
44 DEBUGF3("lcd_set_viewport(struct viewport* vp=%x,vpx=%d,vpy=%d,vpw=%d,vph=%d)\n",vp,vp->x,vp->y,vp->width,vp->height);
45 }
46}
47
48void lcd_update_viewport(void)
49{
50 //lcd_update_rect(current_vp->x, current_vp->y,current_vp->width, current_vp->height);
51}
52
53void lcd_update_viewport_rect(int x, int y, int width, int height)
54{
55 //lcd_update_rect(current_vp->x + x, current_vp->y + y, width, height);
56}
57/*** parameter handling ***/
58
59void lcd_set_drawmode(int mode)
60{
61 current_vp->drawmode = mode & (DRMODE_SOLID|DRMODE_INVERSEVID);
62}
63
64int lcd_get_drawmode(void)
65{
66 return current_vp->drawmode;
67}
68
69void lcd_set_foreground(unsigned color)
70{
71 current_vp->fg_pattern = color;
72}
73
74unsigned lcd_get_foreground(void)
75{
76 return current_vp->fg_pattern;
77}
78
79void lcd_set_background(unsigned color)
80{
81 current_vp->bg_pattern = color;
82}
83
84unsigned lcd_get_background(void)
85{
86 return current_vp->bg_pattern;
87}
88
89void lcd_set_selector_start(unsigned color)
90{
91 current_vp->lss_pattern = color;
92}
93
94void lcd_set_selector_end(unsigned color)
95{
96 current_vp->lse_pattern = color;
97}
98
99void lcd_set_selector_text(unsigned color)
100{
101 current_vp->lst_pattern = color;
102}
103
104void lcd_set_drawinfo(int mode, unsigned fg_color, unsigned bg_color)
105{
106 //lcd_set_drawmode(mode);
107 current_vp->fg_pattern = fg_color;
108 current_vp->bg_pattern = bg_color;
109}
110
111int lcd_getwidth(void)
112{
113 return current_vp->width;
114}
115
116int lcd_getheight(void)
117{
118 return current_vp->height;
119}
120
121void lcd_setfont(int newfont)
122{
123 current_vp->font = newfont;
124}
125
126int lcd_getfont(void)
127{
128 return current_vp->font;
129}
130
131/* Clear the whole display */
132void lcd_clear_display(void)
133{
134 struct viewport* old_vp = current_vp;
135
136 current_vp = &default_vp;
137
138 lcd_clear_viewport();
139
140 current_vp = old_vp;
141}
142
143void lcd_clear_viewport(){
144 DEBUGF2("lcd_clear_viewport()\n");
145 xapi->clear_viewport(current_vp->x,current_vp->y,current_vp->width,current_vp->height,current_vp->bg_pattern);
146
147}
148void lcd_scroll_stop(struct viewport* vp){
149 DEBUGF3("lcd_scroll_stop(struct viewport* vp=%x)\n",vp);
150}
diff --git a/utils/wpseditor/libwps/src/proxy.c b/utils/wpseditor/libwps/src/proxy.c
new file mode 100644
index 0000000000..3a3b8ce4d9
--- /dev/null
+++ b/utils/wpseditor/libwps/src/proxy.c
@@ -0,0 +1,132 @@
1#include <stdio.h>
2#include <stdlib.h>
3#include "dummies.h"
4#include "proxy.h"
5#include "api.h"
6#include "gwps.h"
7#include "gwps-common.h"
8#include <string.h>
9
10struct screen screens[NB_SCREENS];
11struct wps_data wpsdata;
12struct gui_wps gwps;
13struct mp3entry id3;
14struct mp3entry nid3;
15
16extern void test_api(struct proxy_api *api);
17
18bool debug_wps = true;
19int wps_verbose_level = 0;
20int errno_;
21pfdebugf dbgf = 0;
22
23static char pluginbuf[PLUGIN_BUFFER_SIZE];
24
25const char* get_model_name(){
26#ifdef TARGET_MODEL
27 return TARGET_MODEL;
28#else
29 return "unknown";
30#endif
31}
32
33int read_line(int fd, char* buffer, int buffer_size)
34{
35 int count = 0;
36 int num_read = 0;
37
38 errno_ = 0;
39
40 while (count < buffer_size)
41 {
42 unsigned char c;
43
44 if (1 != read(fd, &c, 1))
45 break;
46
47 num_read++;
48
49 if ( c == '\n' )
50 break;
51
52 if ( c == '\r' )
53 continue;
54
55 buffer[count++] = c;
56 }
57
58 buffer[MIN(count, buffer_size - 1)] = 0;
59
60 return errno_ ? -1 : num_read;
61}
62
63void* plugin_get_buffer(size_t *buffer_size)
64{
65 *buffer_size = PLUGIN_BUFFER_SIZE;
66 return pluginbuf;
67}
68
69int checkwps(const char *filename, int verbose){
70 int res;
71 int fd;
72
73 struct wps_data wps;
74 wps_verbose_level = verbose;
75
76 fd = open(filename, O_RDONLY);
77 if (fd < 0) {
78 DEBUGF1("Failed to open %s\n",filename);
79 return 2;
80 }
81 close(fd);
82
83 res = wps_data_load(&wps, &screens[0], filename, true);
84
85 if (!res) {
86 DEBUGF1("WPS parsing failure\n");
87 return 3;
88 }
89
90 DEBUGF1("WPS parsed OK\n");
91 return 0;
92}
93
94int wps_init(const char* filename,struct proxy_api *api, bool isfile){
95 int res;
96 if (!api)
97 return 4;
98 dummies_init();
99 test_api(api);
100 set_api(api);
101 wps_data_init(&wpsdata);
102 wps_verbose_level = api->verbose;
103 res = wps_data_load(&wpsdata, &screens[0], filename, isfile);
104 if (!res)
105 {
106 DEBUGF1("ERR: WPS parsing failure\n");
107 return 3;
108 }
109 DEBUGF1("WPS parsed OK\n");
110 DEBUGF1("\n-------------------------------------------------\n");
111 wps_state.paused = true;
112 gwps.data = &wpsdata;
113 gwps.display = &screens[0];
114 gwps.state = &wps_state;
115 gwps.state->id3 = &id3;
116 gwps.state->nid3 = &nid3;
117 gui_wps[0] = gwps;
118 return res;
119}
120
121int wps_display(){
122 DEBUGF3("wps_display(): begin\n");
123 int res = gui_wps_display();
124 DEBUGF3("\nWPS %sdisplayed\n", (res ? "" : "not "));
125 return res;
126}
127int wps_refresh(){
128 DEBUGF3("-----------------<wps_refresh(): begin>-----------------\n");
129 int res = gui_wps_refresh(&gwps, 0, WPS_REFRESH_ALL);
130 DEBUGF3("\nWPS %srefreshed\n", (res ? "" : "not "));
131 return res;
132}
diff --git a/utils/wpseditor/libwps/src/proxy.h b/utils/wpseditor/libwps/src/proxy.h
new file mode 100644
index 0000000000..3836ecc6d0
--- /dev/null
+++ b/utils/wpseditor/libwps/src/proxy.h
@@ -0,0 +1,25 @@
1#ifndef PROXY_H
2#define PROXY_h
3
4#include "screen_access.h"
5#include "api.h"
6#include "defs.h"
7
8#define DEBUGF dbgf
9#define DEBUGF1 dbgf
10#define DEBUGF2(...)
11#define DEBUGF3(...)
12
13EXPORT int checkwps(const char *filename, int verbose);
14EXPORT int wps_init(const char* filename,struct proxy_api *api,bool isfile);
15EXPORT int wps_display();
16EXPORT int wps_refresh();
17
18const char* get_model_name();
19
20extern struct screen screens[NB_SCREENS];
21extern bool debug_wps;
22extern int wps_verbose_level;
23
24
25#endif
diff --git a/utils/wpseditor/libwps/src/wpsstate.h b/utils/wpseditor/libwps/src/wpsstate.h
new file mode 100644
index 0000000000..148936a481
--- /dev/null
+++ b/utils/wpseditor/libwps/src/wpsstate.h
@@ -0,0 +1,34 @@
1#ifndef STATES_H
2#define STATES_H
3//
4struct trackstate
5{
6 char* title;
7 char* artist;
8 char* album;
9 char* genre_string;
10 char* disc_string;
11 char* track_string;
12 char* year_string;
13 char* composer;
14 char* comment;
15 char* albumartist;
16 char* grouping;
17 int discnum;
18 int tracknum;
19 int version;
20 int layer;
21 int year;
22
23 int length;
24 int elapsed;
25};
26
27struct wpsstate{
28 int volume;
29 int fontheight;
30 int fontwidth;
31 int battery_level;
32 int audio_status;
33};
34#endif
diff --git a/utils/wpseditor/libwps/targets.txt b/utils/wpseditor/libwps/targets.txt
new file mode 100644
index 0000000000..d2c54378d9
--- /dev/null
+++ b/utils/wpseditor/libwps/targets.txt
@@ -0,0 +1,33 @@
1ARCHOS_RECORDER recorder
2ARCHOS_FMRECORDER fmrecorder
3ARCHOS_RECORDERV2 recorderv2
4ARCHOS_ONDIOSP ondiosp
5ARCHOS_ONDIOFM ondiofm
6IRIVER_H120 h120
7IRIVER_H300 h300
8IRIVER_H100 h100
9IRIVER_IFP7XX ifp7xx
10IRIVER_H10 h10
11IRIVER_H10_5GB h10_5gb
12IPOD_COLOR ipodcolor
13IPOD_NANO ipodnano
14IPOD_VIDEO ipodvideo
15IPOD_3G ipod3g
16IPOD_4G ipod4g
17IPOD_MINI ipodmini
18IPOD_MINI2G ipodmini2g
19IPOD_1G2G ipod1g2g
20IAUDIO_X5 x5
21IAUDIO_M5 m5
22COWON_D2 cowond2
23IAUDIO_M3 m3
24GIGABEAT_F gigabeatf
25GIGABEAT_S gigabeats
26MROBE_500 mrobe500
27MROBE_100 mrobe100
28LOGIK_DAX logikdax
29CREATIVE_ZVM creativezvm
30SANSA_E200 e200
31SANSA_E200 e200r
32SANSA_C200 c200
33ELIO_TPJ1022 tpj1022
diff --git a/utils/wpseditor/wpseditor.pro b/utils/wpseditor/wpseditor.pro
new file mode 100644
index 0000000000..0e9ecbbf51
--- /dev/null
+++ b/utils/wpseditor/wpseditor.pro
@@ -0,0 +1,2 @@
1SUBDIRS =gui/src/QPropertyEditor gui
2TEMPLATE = subdirs