summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/apps/opie-console/emulation_widget.cpp208
-rw-r--r--noncore/apps/opie-console/emulation_widget.h38
2 files changed, 239 insertions, 7 deletions
diff --git a/noncore/apps/opie-console/emulation_widget.cpp b/noncore/apps/opie-console/emulation_widget.cpp
index a45db8c..5c3b2d2 100644
--- a/noncore/apps/opie-console/emulation_widget.cpp
+++ b/noncore/apps/opie-console/emulation_widget.cpp
@@ -7,39 +7,239 @@
// qt includes
#include <qwidget.h>
#include <qarray.h>
#include <qstring.h>
#include <qpainter.h>
#include <qrect.h>
+#include <qscrollbar.h>
+#define rimX 0 // left/right rim width
+#define rimY 0 // top/bottom rim high
+
+#define SCRWIDTH 16 // width of scrollbar
EmulationWidget::EmulationWidget( const Profile& config, QWidget *parent, const char* name ) : WidgetLayer( config, parent, name )
{
+ // initialize font attributes
+ QFontMetrics fm( font() );
+ f_height = fm.height();
+ f_width = fm.maxWidth();
+ f_ascent = fm.ascent();
+
+ // initialize scrollbar related vars
+ m_scrollbar = new QScrollBar( this );
+ m_scrollbar->setCursor( arrowCursor );
+
+ // load config
+ reloadConfig( config );
+
+ m_resizing = false;
+}
+
+void EmulationWidget::reloadConfig( const Profile& config )
+{
+
+ // nothing yet
}
EmulationWidget::~EmulationWidget()
{
+ //clean up
}
+static QChar vt100extended(QChar c)
+{
+ switch (c.unicode())
+ {
+ case 0x25c6 : return 1;
+ case 0x2592 : return 2;
+ case 0x2409 : return 3;
+ case 0x240c : return 4;
+ case 0x240d : return 5;
+ case 0x240a : return 6;
+ case 0x00b0 : return 7;
+ case 0x00b1 : return 8;
+ case 0x2424 : return 9;
+ case 0x240b : return 10;
+ case 0x2518 : return 11;
+ case 0x2510 : return 12;
+ case 0x250c : return 13;
+ case 0x2514 : return 14;
+ case 0x253c : return 15;
+ case 0xf800 : return 16;
+ case 0xf801 : return 17;
+ case 0x2500 : return 18;
+ case 0xf803 : return 19;
+ case 0xf804 : return 20;
+ case 0x251c : return 21;
+ case 0x2524 : return 22;
+ case 0x2534 : return 23;
+ case 0x252c : return 24;
+ case 0x2502 : return 25;
+ case 0x2264 : return 26;
+ case 0x2265 : return 27;
+ case 0x03c0 : return 28;
+ case 0x2260 : return 29;
+ case 0x00a3 : return 30;
+ case 0x00b7 : return 31;
+ }
+ return c;
+}
-void setImage( QArray<Character> const newimg, int lines, int columns )
+
+
+void EmulationWidget::setImage( QArray<Character> const newimg, int lines, int columns )
{
-}
+ const QPixmap* pm = backgroundPixmap();
+ QPainter paint;
+
+ // dont allow updates, while drawing
+ setUpdatesEnabled( false );
+
+ paint.begin( this );
+
+ QPoint tL = contentsRect().topLeft();
+ int tLx = tL.x();
+ int tLy = tL.y();
+// hasBlinker = false;
+
+ int cf = -1;
+ int cb = -1;
+ int cr = -1;
+
+ int lins = QMIN( m_lines, QMAX( 0, lines ) );
+ int cols = QMIN( m_columns, QMAX( 0, columns ) );
+ QArray<QChar> disstrU = QArray<QChar>( cols );
-void drawAttrString( QString& string, QPainter &paint, QRect rect, Character attr, bool usePixmap, bool clear )
+ for ( int y = 0; y < lins; ++y )
+ { int len;
+ const Character* lcl = &m_image[y * m_columns];
+ const Character* ext = &newimg[y * columns];
+ if ( ! m_resizing )
+ for ( int x = 0; x < cols; ++x )
+ {
+ // disable, till widget works, WITHOUT blinking
+ //hasBlinker |= ( ext[x].r & RE_BLINK );
+
+ if ( ext[x] != lcl[x] )
+ {
+ cr = ext[x].r;
+ cb = ext[x].b;
+ if ( ext[x].f != cf ) cf = ext[x].f;
+ int lln = cols - x;
+ disstrU[0] = vt100extended( ext[x+0].c );
+ for ( len = 1; len < lln; ++len )
+ {
+ if ( ext[x+len].f != cf || ext[x+len].b != cb || ext[x+len].r != cr || ext[x+len] == lcl[x+len] )
+ break;
+ disstrU[len] = vt100extended( ext[x+len].c );
+ }
+ QString unistr( disstrU, len );
+ drawAttrString( unistr, paint, QRect( m_blX+tLx+f_width*x, m_bY+tLy+f_height*y, f_width*len, f_height ), ext[x], pm != NULL, true );
+ x += len -1;
+ }
+ }
+ // make image become newimg
+ memcpy( (void*) lcl, (const void*) ext, cols*sizeof( Character ) );
+ }
+ drawFrame( &paint );
+ paint.end();
+ setUpdatesEnabled( true );
+
+ /*if ( hasBlinker && !blinkT->isActive() )
+ blinkT->start(1000); //ms
+ if ( ! hasBlinker && blinkT->isActive() )
+ {
+ blinkT->stop();
+ blinking = false;
+ }*/
+
+ delete [] disstrU;
+}
+
+void EmulationWidget::calcGeometry()
{
+ m_scrollbar->resize(QApplication::style().scrollBarExtent().width(), contentsRect().height() );
+
+ switch( scrollLoc )
+ {
+ case SCRNONE :
+ m_columns = ( contentsRect().width() -2 * rimX ) / f_width;
+ m_blX = ( contentsRect().width() - ( m_columns*f_width ) ) / 2;
+ m_brX = m_blX;
+ m_scrollbar->hide();
+ break;
+ case SCRLEFT :
+ m_columns = ( contentsRect().width() - 2 * rimX - m_scrollbar->width() ) / f_width;
+ m_brX = ( contentsRect().width() - ( m_columns*f_width ) - m_scrollbar->width() ) / 2;
+ m_blX = m_brX + m_scrollbar->width();
+ m_scrollbar->move( contentsRect().topLeft() );
+ m_scrollbar->show();
+ break;
+ case SCRIGHT:
+ m_columns = ( contentsRect().width() - 2 * rimX - m_scrollbar->width() ) / f_width;
+ m_blX = ( contentsRect().width() - ( m_columns*f_width ) - m_scrollbar->width() ) / 2;
+ m_brX = m_blX;
+ m_scrollbar->move( contentsRect().topRight() - QPoint (m_scrollbar->width()-1,0 ) );
+ m_scrollbar->show();
+ break;
+ }
+
+ m_lines = ( contentsRect().height() - 2 * rimY ) / f_height;
+ m_bY = ( contentsRect().height() - (m_lines * f_height ) ) / 2;
+}
+void EmulationWidget::drawAttrString( QString& string, QPainter &painter, QRect rect, Character attr, bool usePixmap, bool clear )
+{
+ if ( usePixmap && color_table[attr.b].transparent )
+ {
+ painter.setBackgroundMode( TransparentMode );
+ if ( clear )
+ erase( rect );
+ }
+ else
+ {
+ if ( blinking )
+ painter.fillRect( rect, color_table[attr.b].color );
+ else
+ {
+ painter.setBackgroundMode( OpaqueMode );
+ painter.setBackgroundColor( color_table[attr.b].color );
+ }
+ }
+ if ( color_table[attr.f].bold )
+ painter.setPen( QColor( 0x8F, 0x00, 0x00 ) );
+ else
+ painter.setPen( color_table[attr.f].color );
+ painter.drawText( rect.x(), rect.y() + f_ascent, string );
}
-
+
+
///////////////////////
// scrollbar
// ////////////////////
void EmulationWidget::scroll( int value )
{
}
void EmulationWidget::setScroll( int cursor, int slines )
{
}
+
+
+static const ColorEntry color_table[TABLE_COLORS] =
+{
+ ColorEntry(QColor(0x00,0x00,0x00), 0, 0 ), ColorEntry( QColor(0xB2,0xB2,0xB2), 1, 0 ), // Dfore, Dback
+ ColorEntry(QColor(0x00,0x00,0x00), 0, 0 ), ColorEntry( QColor(0xB2,0x18,0x18), 0, 0 ), // Black, Red
+ ColorEntry(QColor(0x18,0xB2,0x18), 0, 0 ), ColorEntry( QColor(0xB2,0x68,0x18), 0, 0 ), // Green, Yellow
+ ColorEntry(QColor(0x18,0x18,0xB2), 0, 0 ), ColorEntry( QColor(0xB2,0x18,0xB2), 0, 0 ), // Blue, Magenta
+ ColorEntry(QColor(0x18,0xB2,0xB2), 0, 0 ), ColorEntry( QColor(0xB2,0xB2,0xB2), 0, 0 ), // Cyan, White
+ // intensiv
+ ColorEntry(QColor(0x00,0x00,0x00), 0, 1 ), ColorEntry( QColor(0xFF,0xFF,0xFF), 1, 0 ),
+ ColorEntry(QColor(0x68,0x68,0x68), 0, 0 ), ColorEntry( QColor(0xFF,0x54,0x54), 0, 0 ),
+ ColorEntry(QColor(0x54,0xFF,0x54), 0, 0 ), ColorEntry( QColor(0xFF,0xFF,0x54), 0, 0 ),
+ ColorEntry(QColor(0x54,0x54,0xFF), 0, 0 ), ColorEntry( QColor(0xB2,0x18,0xB2), 0, 0 ),
+ ColorEntry(QColor(0x54,0xFF,0xFF), 0, 0 ), ColorEntry( QColor(0xFF,0xFF,0xFF), 0, 0 )
+};
diff --git a/noncore/apps/opie-console/emulation_widget.h b/noncore/apps/opie-console/emulation_widget.h
index 56ea15f..e185534 100644
--- a/noncore/apps/opie-console/emulation_widget.h
+++ b/noncore/apps/opie-console/emulation_widget.h
@@ -8,12 +8,13 @@
#include <qpainter.h>
#include <qstring.h>
#include <qarray.h>
#include <qrect.h>
+
/**
* EmulationWidget
* simple implementation of EmulationLayer
* (doesn't support scrollbar, history, etc, yet)
*/
class EmulationWidget : public WidgetLayer
@@ -37,19 +38,19 @@ public:
/**
* sets the image
* @param QArray<Character> const newimg, the new image
* @param int lines, lines of the new image
* @param int columns, columns of the new image
*/
- virtual void setImage( QArray<Character> const newimg, int columns, int lines ) {};
+ virtual void setImage( QArray<Character> const newimg, int columns, int lines );
/**
* reloads configuration
* @param const Profile& config, configuration
*/
- virtual void reloadConfig( const Profile& config ) {};
+ virtual void reloadConfig( const Profile& config );
/**
* sets the scrollbar (not yet implemented)
*/
virtual void setScroll( int cursor, int slines );
@@ -61,20 +62,51 @@ public:
protected:
/**
* calculates current image bounds
*/
- virtual void calcGeometry() {};
+ virtual void calcGeometry();
+
+
+ /**
+ * @param const ColorEntry* table, the new color table
+ */
+ void setColorTable( const ColorEntry table[] );
/**
* draws a String
* @param QString& string, string to be drawn
* @param QPainter& painter, painter, that should draw
* @param QRect rect, rect to be drawn into
* @param Character attr, attributes of Characters
* @param bool usePixmap, if to use the background pixmap (currently not supported)
* @param bool clear, if rect should be cleared
*/
void drawAttrString( QString& string, QPainter& painter, QRect rect, Character attr, bool pm, bool clear );
+protected:
+
+ enum ScrollLocation
+ {
+ SCRNONE,
+ SCRLEFT,
+ SCRIGHT
+ };
+
+ int f_height;
+ int f_width;
+ int f_ascent;
+ int m_blX;
+ int m_blY;
+ int m_brX;
+
+ int m_bY;
+ int m_bX;
+ QScrollBar* m_scrollbar;
+
+ ScrollLocation scrollLoc;
+
+ ColorEntry* color_table;
+
+ bool blinking;
};