-rw-r--r-- | noncore/apps/opie-console/opie-console.pro | 6 | ||||
-rw-r--r-- | noncore/apps/opie-console/widget_layer.cpp | 155 | ||||
-rw-r--r-- | noncore/apps/opie-console/widget_layer.h | 104 |
3 files changed, 246 insertions, 19 deletions
diff --git a/noncore/apps/opie-console/opie-console.pro b/noncore/apps/opie-console/opie-console.pro index 831ca34..5c2d04e 100644 --- a/noncore/apps/opie-console/opie-console.pro +++ b/noncore/apps/opie-console/opie-console.pro @@ -22,5 +22,6 @@ HEADERS = io_layer.h io_serial.h \ history.h \ screen.h \ - keytrans.h + keytrans.h \ + widget_layer.h SOURCES = io_layer.cpp io_serial.cpp \ @@ -41,5 +42,6 @@ SOURCES = io_layer.cpp io_serial.cpp \ history.cpp \ screen.cpp \ - keytrans.cpp + keytrans.cpp \ + widget_layer.cpp INTERFACES = configurebase.ui editbase.ui diff --git a/noncore/apps/opie-console/widget_layer.cpp b/noncore/apps/opie-console/widget_layer.cpp new file mode 100644 index 0000000..28227e4 --- a/dev/null +++ b/noncore/apps/opie-console/widget_layer.cpp @@ -0,0 +1,155 @@ +/* ------------------------------------------------------------------------- */ +/* */ +/* widget_layer.cpp Widget Layer */ +/* */ +/* opie developers <opie@handhelds.org> */ +/* */ +/* ------------------------------------------------------------------------- */ + + + +#include "widget_layer.h" + +#include <qclipboard.h> +#include <qregexp.h> +#include <qglobal.h> + +#include <string.h> +//#include < + +#include "common.h" + + +#define loc(X,Y) ((Y)*m_columns+(X)) + + +WidgetLayer::WidgetLayer( QObject *parent, const char *name ) : QObject( parent, name ) +{ + // get the clipboard + m_clipboard = QApplication::clipboard(); + + // when data on clipboard changes, clear selection + QObject::connect( (QObject*) m_clipboard, SIGNAL( dataChanged() ), + (QObject*)this, SLOT( onClearSelection() ) ); + + // initialize vars: + m_lines = 1; + m_columns = 1; + m_resizing = false; + + m_image = QArray<Character>(); +} + +WidgetLayer::~WidgetLayer() +{ + // clean up! +} + +/* --------------------------------- audio ---------------------------------- */ + +void WidgetLayer::bell() +{ + QApplication::beep(); +} + + +/* --------------------------------- screen --------------------------------- */ + + +void WidgetLayer::propagateSize() +{ + QArray<Character> oldimage = m_image; + int oldlines = m_lines; + int oldcolumns = m_columns; + + makeImage(); + + // copy old image, to reduce flicker + if ( oldimage ) + { + //FIXME: is it possible to do this with QArray.dublicate()? + + int lins = QMIN( oldlines, m_lines ); + int cols = QMIN( oldcolumns, m_columns ); + for ( int lin = 0; lin < lins; ++lin ) + { + memcpy( (void*) &m_image[m_columns*lin], + (void*) &oldimage[oldcolumns*lin], + cols*sizeof( Character ) ); + } + //free( oldimage ); + } + else + clearImage(); + + m_resizing = true; + emit imageSizeChanged( m_lines, m_columns ); + m_resizing = false; +} + +void WidgetLayer::makeImage() +{ + calcGeometry(); + m_image = QArray<Character>(); + clearImage(); +} + +void WidgetLayer::clearImage() +{ + //should this belong here?? + for ( int y = 0; y < m_lines; y++ ) + for ( int x = 0; x < m_columns; x++ ) + { + m_image[loc(x,y)].c = 0xff; + m_image[loc(x,y)].f = 0xff; + m_image[loc(x,y)].b = 0xff; + m_image[loc(x,y)].r = 0xff; + } +} + +/* --------------------------------- selection ------------------------------ */ + +void WidgetLayer::pasteClipboard() +{ + insertSelection(); +} + + +void WidgetLayer::insertSelection() +{ + QString text = QApplication::clipboard()->text(); + if ( ! text.isNull() ) + { + text.replace( QRegExp( "\n" ), "\r" ); + insertText( text ); + // selection should be unselected + emit selectionCleared(); + } +} + +void WidgetLayer::insertText( QString text ) +{ + // text is inserted as key event + QKeyEvent e( QEvent::KeyPress, 0, -1, 0, text); + emit keyPressed( &e ); +} + +void WidgetLayer::onClearSelection() +{ + emit selectionCleared(); +} + +void WidgetLayer::setSelection( const QString& text ) +{ + // why get the clipboard, we have it as instance var... + QObject *m_clipboard = QApplication::clipboard(); + + // we know, that cliboard changes, when we change clipboard + QObject::disconnect( (QObject*) m_clipboard, SIGNAL( dataChanged() ), + (QObject*) this, SLOT( selectionCleared() ) ); + + QApplication::clipboard()->setText( text ); + + QObject::connect( (QObject*) m_clipboard, SIGNAL( dataChanged() ), + (QObject*) this, SLOT( selectionCleared() ) ); +} diff --git a/noncore/apps/opie-console/widget_layer.h b/noncore/apps/opie-console/widget_layer.h index cf2a1e5..3cdd6aa 100644 --- a/noncore/apps/opie-console/widget_layer.h +++ b/noncore/apps/opie-console/widget_layer.h @@ -1,3 +1,3 @@ - +/* -------------------------------------------------------------------------- */ /* */ /* [widget_layer.h] Widget Layer */ @@ -11,13 +11,27 @@ // (or say in chat) +#ifndef WIDGET_LAYER_H +#define WIDGET_LAYER_H + +// qt includes +#include <qapplication.h> +#include <qtimer.h> +#include <qkeycode.h> +#include <qclipboard.h> + + +// opie-console includes +#include "session.h" +#include "common.h" class WidgetLayer : public QObject -{ QObject +{ Q_OBJECT public: + /** * constructor */ - WidgetLayer(); + WidgetLayer( QObject *parent=0, const char *name=0 ); /** @@ -26,4 +40,5 @@ public: virtual ~WidgetLayer(); +public: /** * sets the image @@ -44,15 +59,19 @@ public: * return the columns count */ - int columns() { return m_columns } + int columns() { return m_columns; } /** - * copy selection into clipboard, etc + * insert current selection (currently this is only the clipboard) */ - void emitSelection(); + void insertSelection(); /** + * insert text + */ + void insertText( QString text ); + /** * set selection (clipboard) to text */ - void setSelection( QString &text ) + void setSelection( const QString &text ); /** @@ -67,5 +86,5 @@ signals: * key was pressed */ - keyPressed( QKeyEvent *e ); + void keyPressed( QKeyEvent *e ); /** @@ -75,15 +94,15 @@ signals: * // numbering due to layout in old TEWidget */ - mousePressed( int button, int x, int y ); + void mousePressed( int button, int x, int y ); /** * size of image changed */ - imageSizeChanged( int lines, int columns ); + void imageSizeChanged( int lines, int columns ); /** * cursor in history changed */ - historyCursorChanged( int value ); + void historyCursorChanged( int value ); /** @@ -95,9 +114,9 @@ signals: * selection begin */ - void selectionBegin( const int x, const int y ) + void selectionBegin( const int x, const int y ); /** * selection extended - * (from begin s.a. to x, y) + * (from begin (s.a.) to x, y) */ void selectionExtended( const int x, const int y ); @@ -109,10 +128,39 @@ signals: void selectionEnd( const bool lineBreakPreserve ); -slots: + + +// protected methods +protected: + + // image operations + + /** + * changes image, to suit new size + * TODO: find meaningful name! + */ + void propagateSize(); + + /** + * + */ + virtual void calcGeometry(); + + /** + * makes an empty image + */ + void makeImage(); + + /** + * clears the image + */ + void clearImage(); + +protected slots: /** * clear selection */ - onClearSelection(); + void onClearSelection(); + // protected vars @@ -122,9 +170,31 @@ protected: * current Session */ - Session m_session; + Session *m_session; + + /** + * current character image + */ + QArray<Character> m_image; /** - * other misc vars + * lines count */ + int m_lines; + /** + * columns count + */ + int m_columns; + + /** + * clipboard + */ + QClipboard* m_clipboard; + + /** + * whether widget was resized + */ + bool m_resizing; }; + +#endif // WIDGET_LAYER_H |