Ignore:
Timestamp:
Dec 11, 2009, 9:35:47 PM (10 years ago)
Author:
sven
Message:
  • Text editing part:

Improved Column counting
80 column line bar

  • Saving with Jones Format works
File:
1 edited

Legend:

Unmodified
Added
Removed
  • punch-card/punch-card-editor/src/app/decktexteditor.cc

    r48 r49  
    7575void TextEditorDock::showTextConverterDialog() {
    7676        qDebug("Text Converter Dialog... PENDING");
     77}
     78
     79DeckTextEditor::DeckTextEditor(EditorWindow* main) : QPlainTextEdit(main), main(main) {
     80        row_area = new NumberArea(this);
     81        col_area = new NumberArea(this);
     82
     83        connect(this->document(), SIGNAL(contentsChange(int,int,int)),
     84                this, SLOT(translateChanges(int, int, int)));
     85
     86        // Codec erstellen
     87        codec = QSharedPointer<const Codec>( CodecFactory::createCodec("o29_code") );
     88        if(!codec) {
     89                qDebug("Got NULL Codec :-(");
     90        }
     91
     92        // Font einstellen
     93        QFont font;
     94        font.setFamily("Courier");
     95        font.setFixedPitch(true);
     96        font.setPointSize(13);
     97        setFont(font);
     98
     99        QFont col_font = font;
     100        col_font.setFamily("Verdana");
     101        col_font.setPointSize(7);
     102        col_area->setFont(col_font);
     103
     104        connect(this, SIGNAL(blockCountChanged(int)), this, SLOT(updateLineNumberAreaWidth(int)));
     105        connect(this, SIGNAL(updateRequest(const QRect &, int)), this, SLOT(updateLineNumberArea(const QRect &, int)));
     106        connect(this, SIGNAL(cursorPositionChanged()), this, SLOT(highlightCurrentCursorPos()));
     107
     108        updateLineNumberAreaWidth(0);
     109        highlightCurrentCursorPos();
    77110}
    78111
     
    95128}
    96129
    97 DeckTextEditor::DeckTextEditor(EditorWindow* main) : QPlainTextEdit(main), main(main) {
    98         row_area = new NumberArea(this);
    99         col_area = new NumberArea(this);
    100 
    101         connect(this->document(), SIGNAL(contentsChange(int,int,int)),
    102                 this, SLOT(translateChanges(int, int, int)));
    103 
    104         // Codec erstellen
    105         codec = QSharedPointer<const Codec>( CodecFactory::createCodec("o29_code") );
    106         if(!codec) {
    107                 qDebug("Got NULL Codec :-(");
    108         }
    109 
    110         // Font einstellen
    111         QFont font;
    112         font.setFamily("Courier");
    113         font.setFixedPitch(true);
    114         font.setPointSize(13);
    115         setFont(font);
    116 
    117         QFont col_font = font;
    118         col_font.setPointSize(8);
    119         col_area->setFont(col_font);
    120 
    121         connect(this, SIGNAL(blockCountChanged(int)), this, SLOT(updateLineNumberAreaWidth(int)));
    122         connect(this, SIGNAL(updateRequest(const QRect &, int)), this, SLOT(updateLineNumberArea(const QRect &, int)));
    123         connect(this, SIGNAL(cursorPositionChanged()), this, SLOT(highlightCurrentCursorPos()));
    124 
    125         updateLineNumberAreaWidth(0);
    126         highlightCurrentCursorPos();
     130// das wird *NICHT* repainten, das muss danach gemacht werden
     131bool DeckTextEditor::checkValidity(int pos) {
     132        QChar c = document()->characterAt(pos);
     133        if(c.isNull()) {
     134                qDebug("checkValidity: %d is not a valid position", pos);
     135                return true;
     136        }
     137        // check character
     138        Q_ASSERT(codec);
     139        if(codec->canEncode(c.toAscii())) {
     140                // everything fine with this character
     141                // just take a look wether it was declared as bad sometime
     142                // ago...
     143                qDebug("Codec says %c can be encoded", c.toAscii());
     144                for(int bads = 0; bads < invalid_characters.length(); bads++) {
     145                        if( pos == invalid_characters[bads].cursor.anchor() ) {
     146                                qDebug("Character at %d is no more bad", pos);
     147                                // dieses Zeichen loeschen und iterieren stoppen
     148                                invalid_characters.removeAt(bads);
     149                                emit invalidCharactersCountChanged( invalid_characters.count() );
     150                                break;
     151                        }
     152                }
     153
     154                return true;
     155        } else {
     156                // this is a bad character that cannot be encoded
     157                // with the current Codec.
     158                qDebug("Codec says %c cannot be encoded", c.toAscii());
     159                // #1: Mark character
     160                QTextEdit::ExtraSelection selection;
     161                selection.cursor = QTextCursor(document());
     162                selection.cursor.setPosition(pos);
     163                selection.cursor.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor);
     164                selection.format.setFontWeight(QFont::Bold);
     165                selection.format.setForeground(Qt::red);
     166                selection.format.setBackground(Qt::yellow);
     167                selection.format.setToolTip(tr("This character cannot be punched on the punch card using the current codec"));
     168                // #2: Toggle anywhere in the superclass that the text
     169                //     contains bad characters
     170                invalid_characters.append(selection);
     171                emit invalidCharactersCountChanged( invalid_characters.count() );
     172                // das emitten auf ein *Zeichen* hin ist ggf. schlecht, wenn die
     173                // Funktion etwa in translateChanges in einer schleife aufgerufen wird
     174                // und ein reciever dann sehr viel zeug hintereinander macht...
     175
     176                // #3: Return that this character is invalid
     177                return false;
     178        }
    127179}
    128180
    129181void DeckTextEditor::translateChanges(int position, int charsRemoved, int charsAdded) {
    130182        // Dieser slot wird durch das QTextDocument aufgerufen, wenn der Benutzer
    131         // den Inhalt geaendert hat. => Uebersetzen ins Kartenmodell und als Signal
    132         // weitergeben.
     183        // den Inhalt geaendert hat.
     184        // 1) Ueberpruefen, ob Text uebersetzbar ist
     185        // 2) Uebersetzen ins Kartenmodell und als Signal weitergeben.
    133186        Q_ASSERT(main != 0);
    134187        Q_ASSERT(main->deck != 0);
     
    145198        DeckIndex end_block_number = main->deck->createIndex( end_block.blockNumber() );
    146199
     200
     201        if(!(end_pos >= start_pos)) { // sonst waers echt bloed.
     202                qDebug("Das momentane END/START-Verhaeltnis ist bloed.");
     203        }
     204
    147205        if(! start_block.isValid()) {
    148206                // keine gute Grundlage.
     
    155213                qDebug() << start_block_number;
    156214                return;
     215        }
     216
     217        // Ueber Buchstaben iterieren und auf Gueltigkeit ueberpruefen,
     218        // wird diese auch textlich auszeichnen
     219        for(int i = start_pos; i < end_pos; i++) {
     220                if(!checkValidity(i)) {
     221                        qDebug("Got invalid character at %d", i);
     222                }
     223                // neue text highlights painten
     224                paintHighlights();
    157225        }
    158226
     
    192260}
    193261
     262/**
     263 * BUG: Text den man direkt danach schreibt, wird auch gelb wie ungueltige Chars.
     264 *   Ursache: Formatierung wird immer auch auf Zeichen direkt danach angewandt.
     265 *   Loesung: Eine weitere Formatierung fuer zeichen  direkt danach anwenden, wenn
     266 *   diese eingegeben werden
     267 *
     268 **/
    194269bool DeckTextEditor::translateBlock(const QTextBlock& block) {
    195270        Q_ASSERT(!codec.isNull());
     
    262337        if (rect.contains(viewport()->rect()))
    263338                updateLineNumberAreaWidth(0);
     339}
     340
     341void DeckTextEditor::paintEvent(QPaintEvent* e) {
     342        QPlainTextEdit::paintEvent(e);
     343        // mal testweise hier den 80 column begrenzungsstrich hinpinseln
     344        // ggf. besser: *unter* den normalen Kram zeichnen, mit ausgegrautem
     345        // Bereich und schoenem Strich. Vgl. Qt Creator Editor-Dingens.
     346        QPainter p( viewport() );
     347        int x_pos = fontMetrics().width('1') * 80 + this->cursorRect(QTextCursor(document())).x();
     348        p.setBrush(Qt::blue);
     349        p.drawLine(QPoint(x_pos, e->rect().top()), QPoint(x_pos, e->rect().bottom()));
    264350 }
    265351
     
    334420                }
    335421        }
     422        {
     423                // Third: Bad Characters list
     424                extra_selections.append(this->invalid_characters);
     425        }
    336426
    337427        setExtraSelections(extra_selections);
     
    370460                painter.setFont(font);*/
    371461
    372                 int font_width = fontMetrics().width('4');
     462                // das holt die Metrik von der Font der
     463                // Textarea, nicht die kleinere!
     464                int font_width = this->fontMetrics().width('1');
     465
     466                int x_offset = this->cursorRect(QTextCursor(document())).x();
    373467
    374468                // ueber alle *zeichen* iterieren.
    375                 for(int i = 0; i < 80; i++) {
    376                         painter.drawText(row_area->width() + i * font_width, 4, font_width, fontMetrics().height(), Qt::AlignCenter,
    377                                 QString::number(i));
     469                for(int i = 1; i <= 80; i++) {
     470                        /*painter.drawLine(
     471                                        QPoint(x_offset + row_area->width() + i * font_width, 4),
     472                                        QPoint(x_offset + row_area->width() + i * font_width, 20)
     473                        );*/
     474
     475                        painter.drawText(x_offset + row_area->width() + i * font_width, 4, font_width, fontMetrics().height(),
     476                                Qt::AlignHCenter,
     477                                QString("%1\n%2").arg(QString::number((int)(i / 10))).arg(QString::number(i%10))
     478                        );
    378479                }
    379480        } else {
Note: See TracChangeset for help on using the changeset viewer.
© 2008 - 2013 technikum29 • Sven Köppel • Some rights reserved
Powered by Trac
Expect where otherwise noted, content on this site is licensed under a Creative Commons 3.0 License