summaryrefslogtreecommitdiff
path: root/attic/muse2-oom/muse2/muse/widgets/sigedit.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'attic/muse2-oom/muse2/muse/widgets/sigedit.cpp')
-rw-r--r--attic/muse2-oom/muse2/muse/widgets/sigedit.cpp739
1 files changed, 0 insertions, 739 deletions
diff --git a/attic/muse2-oom/muse2/muse/widgets/sigedit.cpp b/attic/muse2-oom/muse2/muse/widgets/sigedit.cpp
deleted file mode 100644
index d4c210e4..00000000
--- a/attic/muse2-oom/muse2/muse/widgets/sigedit.cpp
+++ /dev/null
@@ -1,739 +0,0 @@
-//=========================================================
-// MusE
-// Linux Music Editor
-// $Id: sigedit.cpp,v 1.1.1.1.2.1 2004/12/28 23:23:51 lunar_shuttle Exp $
-// (C) Copyright 2001 Werner Schweer (ws@seh.de)
-//=========================================================
-
-#include <stdio.h>
-#include <values.h>
-
-#include <QEvent>
-#include <QKeyEvent>
-#include <QList>
-#include <QMouseEvent>
-#include <QPainter>
-#include <QPaintEvent>
-#include <QPixmap>
-#include <QResizeEvent>
-#include <QString>
-#include <QStyle>
-#include <QTimerEvent>
-
-///#include "sig.h"
-#include "al/sig.h"
-#include "sigedit.h"
-#include "spinbox.h"
-
-extern int mtcType;
-
-bool Sig::isValid() const
-{
- if((z < 1) || (z > 63))
- return false;
-
- switch(n)
- {
- case 1:
- case 2:
- case 3:
- case 4:
- case 8:
- case 16:
- case 32:
- case 64:
- case 128:
- return true;
- default:
- return false;
- }
-}
-
-
-//---------------------------------------------------------
-// NumberSection
-//---------------------------------------------------------
-
-class NumberSection
- {
- int selstart;
- int selend;
-
- public:
- NumberSection(int selStart = 0, int selEnd = 0)
- : selstart(selStart), selend(selEnd ) {}
- int selectionStart() const { return selstart; }
- void setSelectionStart(int s) { selstart = s; }
- int selectionEnd() const { return selend; }
- void setSelectionEnd( int s ) { selend = s; }
- int width() const { return selend - selstart; }
- };
-
-//---------------------------------------------------------
-// SigEditor
-//---------------------------------------------------------
-
-class SigEditor : public QLineEdit
- {
- SigEdit* cw;
- bool frm;
- QPixmap *pm;
- int focusSec;
- QList<NumberSection> sections;
- int offset;
-
- int section(const QPoint&);
-
- protected:
- void init();
- bool event(QEvent *e);
- void resizeEvent(QResizeEvent*);
- void paintEvent(QPaintEvent*);
- void mousePressEvent(QMouseEvent *e);
- void keyPressEvent(QKeyEvent * event );
- void applyFocusSelection() {}
-
- public:
- SigEditor(SigEdit* parent, const char* name);
- ~SigEditor();
-
- void setControlWidget(SigEdit * widget);
- SigEdit* controlWidget() const;
-
- int focusSection() const { return focusSec; }
-
- bool setFocusSection(int s);
- void appendSection(const NumberSection& sec);
- void clearSections();
- void setSectionSelection(int sec, int selstart, int selend);
- };
-
-//---------------------------------------------------------
-// section
-//---------------------------------------------------------
-
-int SigEditor::section(const QPoint& pt)
- {
- if (pm->isNull())
- return -1;
- QPainter p(pm);
- int fw = frm ? style()->pixelMetric(QStyle::PM_DefaultFrameWidth) : 0;
- int x = 2 + fw;
- int y = 0;
- int w = width();
- int h = height();
- for (int i = 0; i < sections.count(); ++i) {
- QString s = cw->sectionFormattedText(i);
- QRect bb = p.boundingRect(x, y, w, h, Qt::AlignVCenter|Qt::AlignLeft, s);
- int nx = bb.x() + bb.width();
- if (pt.x() >= x && pt.x() < nx)
- return i;
- x = nx;
- if (i < sections.count()-1) {
- QString s("/");
- p.drawText(x, y, w, h, Qt::AlignVCenter|Qt::AlignLeft, s, -1, &bb);
- x = bb.x() + bb.width();
- }
- }
- return -1;
- }
-
-//---------------------------------------------------------
-// SigEditor
-//---------------------------------------------------------
-
-SigEditor::SigEditor(SigEdit* parent, const char* name)
- : QLineEdit(parent)
- {
- setObjectName(name);
- cw = parent;
- frm = true;
- focusSec = 0;
- pm = new QPixmap;
- offset = 0;
- init();
- }
-
-//---------------------------------------------------------
-// ~SigEditor
-//---------------------------------------------------------
-
-SigEditor::~SigEditor()
- {
- delete pm;
- }
-
-//---------------------------------------------------------
-// init
-//---------------------------------------------------------
-
-void SigEditor::init()
- {
- setBackgroundMode(Qt::PaletteBase);
- setFocusSection(-1);
- setKeyCompression(true);
- setFocusPolicy(Qt::WheelFocus);
- }
-
-//---------------------------------------------------------
-// event
-//---------------------------------------------------------
-
-bool SigEditor::event(QEvent *e)
- {
- if (e->type() == QEvent::FocusIn || e->type() == QEvent::FocusOut) {
- repaint( rect(), false);
- }
- else if (e->type() == QEvent::ShortcutOverride) {
- QKeyEvent* ke = (QKeyEvent*) e;
- switch (ke->key()) {
- case Qt::Key_Delete:
- case Qt::Key_Backspace:
- case Qt::Key_Up:
- case Qt::Key_Down:
- case Qt::Key_Left:
- case Qt::Key_Right:
- ke->accept();
- default:
- break;
- }
- }
- return QLineEdit::event(e);
- }
-
-void SigEditor::resizeEvent(QResizeEvent *e)
- {
- pm->resize(e->size());
- QLineEdit::resizeEvent(e);
- }
-
-//---------------------------------------------------------
-// paintEvent
-//---------------------------------------------------------
-
-void SigEditor::paintEvent(QPaintEvent *)
- {
- if (pm->isNull())
- return;
-
- const QColorGroup & cg = colorGroup();
- QPainter p(pm);
- p.setPen(colorGroup().text());
- QBrush bg = cg.brush(QColorGroup::Base);
-
- int fw = frm ? style()->pixelMetric(QStyle::PM_DefaultFrameWidth) : 0;
- int x = 2 + fw;
- int y = 0;
- int w = width();
- int h = height();
- p.fillRect(0, 0, w, h, bg);
-
- for (int i = 0; i < sections.count(); ++i) {
- QRect bb;
- QString s = cw->sectionFormattedText(i);
-
- if (hasFocus() && (int(i) == focusSec)) {
- QBrush bg = cg.brush(QColorGroup::Highlight);
- QRect r = p.boundingRect(x, y, w, h, Qt::AlignVCenter|Qt::AlignLeft, s, -1);
- p.setPen(colorGroup().highlightedText());
- p.fillRect(r, bg);
- }
- else
- p.setPen(colorGroup().text());
- p.drawText(x, y, w, h, Qt::AlignVCenter|Qt::AlignLeft, s, -1, &bb);
- x = bb.x() + bb.width();
- if (i < sections.count()-1) {
- QString s("/");
- p.drawText(x, y, w, h, Qt::AlignVCenter|Qt::AlignLeft, s, -1, &bb);
- x = bb.x() + bb.width();
- }
- }
- p.end();
- bitBlt(this, 0, 0, pm);
- }
-
-//---------------------------------------------------------
-// mousePressEvent
-//---------------------------------------------------------
-
-void SigEditor::mousePressEvent(QMouseEvent *e)
- {
- QPoint p(e->pos().x(), 0);
- int sec = section(p);
- if (sec != -1) {
- cw->setFocusSection(sec);
- repaint(rect(), false);
- }
- }
-
-//---------------------------------------------------------
-// keyPressEvent
-//---------------------------------------------------------
-
-void SigEditor::keyPressEvent(QKeyEvent * e )
- {
- switch (e->key()) {
- case Qt::Key_Right:
- if (unsigned(focusSec) <= sections.count()) {
- if (cw->setFocusSection(focusSec+1))
- repaint(rect(), false);
- }
- case Qt::Key_Left:
- if (focusSec > 0 ) {
- if (cw->setFocusSection(focusSec-1))
- repaint(rect(), false);
- }
- case Qt::Key_Up:
- cw->stepUp();
- case Qt::Key_Down:
- cw->stepDown();
- case Qt::Key_Backspace:
- case Qt::Key_Delete:
- cw->removeLastNumber(focusSec);
- case Qt::Key_Enter:
- case Qt::Key_Return:
- cw->enterPressed();
- default:
- QString txt = e->text();
- if (!txt.isEmpty() && txt[0] == '/') {
- // do the same thing as KEY_RIGHT when the user presses the separator key
- if (focusSec < (signed)(sections.count())) {
- if (cw->setFocusSection(focusSec+1))
- repaint(rect(), false);
- }
- }
- int num = txt[0].digitValue();
-
- //printf("SigEditor::keyPressEvent num:%d\n", num);
-
- if (num != -1) {
- cw->addNumber(focusSec, num);
- }
- }
- }
-
-void SigEditor::appendSection(const NumberSection& sec)
- {
- sections.append(sec);
- }
-void SigEditor::clearSections()
- {
- sections.clear();
- }
-
-//---------------------------------------------------------
-// setSectionSelection
-//---------------------------------------------------------
-
-void SigEditor::setSectionSelection(int secNo, int selstart, int selend)
- {
- if (secNo < 0 || secNo > (int)sections.count())
- return;
- sections[secNo].setSelectionStart(selstart);
- sections[secNo].setSelectionEnd(selend);
- }
-
-//---------------------------------------------------------
-// setFocusSection
-//---------------------------------------------------------
-
-bool SigEditor::setFocusSection(int idx)
- {
- if (idx > (int)sections.count()-1 || idx < 0)
- return false;
- if (idx != focusSec) {
- focusSec = idx;
- applyFocusSelection();
- return true;
- }
- return false;
- }
-
-//---------------------------------------------------------
-// SigEdit
-//---------------------------------------------------------
-
-SigEdit::SigEdit(QWidget* parent, const char* name)
- : QWidget(parent)
- {
- setObjectName(name);
- init();
- updateButtons();
- }
-
-SigEdit::~SigEdit()
- {
- }
-
-//---------------------------------------------------------
-// init
-//---------------------------------------------------------
-
-void SigEdit::init()
- {
- ed = new SigEditor(this, "pos editor");
- controls = new SpinBox(this);
- controls->setEditor(ed);
- setFocusProxy(ed);
- connect(controls, SIGNAL(stepUpPressed()), SLOT(stepUp()));
- connect(controls, SIGNAL(stepDownPressed()), SLOT(stepDown()));
- connect(this, SIGNAL(valueChanged(int,int)),SLOT(updateButtons()));
-
- overwrite = false;
- timerId = 0;
- typing = false;
- changed = false;
- adv = false;
-
- sec[0].offset = 0;
- sec[0].len = 2;
- sec[0].val = 4;
- sec[0].voff = 0;
- sec[1].offset = 3;
- sec[1].len = 3;
- sec[1].val = 4;
- sec[1].voff = 0;
- ed->clearSections();
- ed->appendSection(NumberSection(0,0));
- ed->appendSection(NumberSection(0,0));
- setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed));
- }
-
-//---------------------------------------------------------
-// setValue
-//---------------------------------------------------------
-
-void SigEdit::setValue(const Sig& sig)
- {
- sec[0].val = sig.z;
- sec[1].val = sig.n;
- changed = false;
- ed->repaint(ed->rect(), false);
- }
-
-void SigEdit::setValue(const QString& s)
- {
- int z, n;
- sscanf(s.toLatin1(), "%d/%d", &z, &n);
- Sig sig(z, n);
- setValue(sig);
- }
-
-Sig SigEdit::sig() const
- {
- Sig sig(sec[0].val, sec[1].val);
- return sig;
- }
-
-bool SigEdit::event(QEvent *e)
- {
- if (e->type() == QEvent::FocusOut) {
- typing = false;
- if (changed) {
- emit valueChanged(sig().z, sig().n);
- changed = false;
- }
- }
- return QWidget::event(e);
- }
-
-void SigEdit::timerEvent(QTimerEvent *)
- {
- overwrite = true;
- }
-
-//---------------------------------------------------------
-// stepUp
-//---------------------------------------------------------
-
-void SigEdit::stepUp()
- {
- bool accepted = false;
- int secNo = ed->focusSection();
- int val = sec[secNo].val;
- if (secNo == 0) {
- if (val < 63) {
- ++val;
- accepted = true;
- }
- }
- else {
- accepted = true;
- switch(val) {
- case 1: val = 2; break;
- case 2: val = 3; break;
- case 3: val = 4; break;
- case 4: val = 8; break;
- case 8: val = 16; break;
- case 16: val = 32; break;
- case 32: val = 64; break;
- case 64: val = 128; break;
- case 128: accepted = false; break;
- }
- }
- if (accepted) {
- setSec(secNo, val);
- changed = true;
- emit valueChanged(sec[0].val, sec[1].val);
- }
- ed->repaint(ed->rect(), false);
- }
-
-//---------------------------------------------------------
-// stepDown
-//---------------------------------------------------------
-
-void SigEdit::stepDown()
- {
- bool accepted = false;
- int secNo = ed->focusSection();
- int val = sec[secNo].val;
- if (secNo == 0) {
- if (val > 1) {
- --val;
- accepted = true;
- }
- }
- else {
- accepted = true;
- switch(val) {
- case 1: accepted = false; break;
- case 2: val = 1; break;
- case 3: val = 2; break;
- case 4: val = 3; break;
- case 8: val = 4; break;
- case 16: val = 8; break;
- case 32: val = 16; break;
- case 64: val = 32; break;
- case 128: val = 64; break;
- }
- }
- if (accepted) {
- setSec(secNo, val);
- changed = true;
- emit valueChanged(sec[0].val, sec[1].val);
- }
- ed->repaint(ed->rect(), false);
- }
-
-//---------------------------------------------------------
-// sectionFormattedText
-// Returns the formatted number for section sec.
-//---------------------------------------------------------
-
-QString SigEdit::sectionFormattedText(int secNo)
- {
- QString txt = sectionText(secNo);
-
- int so = sec[secNo].offset;
- int len = sec[secNo].len;
- int eo = so + len;
-
- if (typing && secNo == ed->focusSection())
- ed->setSectionSelection(secNo, eo - txt.length(), eo);
- else
- ed->setSectionSelection(secNo, so, eo);
- if (secNo == 0)
- txt = txt.rightJustify(len, ' ');
-// else
-// txt = txt.leftJustify(len, ' ');
- return txt;
- }
-
-//---------------------------------------------------------
-// setFocusSection
-//---------------------------------------------------------
-
-bool SigEdit::setFocusSection(int s)
- {
- if (s != ed->focusSection()) {
- killTimer(timerId);
- overwrite = true;
- typing = false;
- int so = sec[s].offset;
- int eo = so + sec[s].len;
- ed->setSectionSelection(s, so, eo);
- if (changed) {
- emit valueChanged(sig().z, sig().n);
- changed = false;
- }
- }
- return ed->setFocusSection(s);
- }
-
-//---------------------------------------------------------
-// setSec
-//---------------------------------------------------------
-
-void SigEdit::setSec(int secNo, int val)
- {
- sec[secNo].val = val;
- }
-
-//---------------------------------------------------------
-// sectionText
-// Returns the text of section \a sec.
-//---------------------------------------------------------
-
-QString SigEdit::sectionText(int secNo)
- {
- return QString::number(sec[secNo].val + sec[secNo].voff);
- }
-
-//---------------------------------------------------------
-// outOfRange
-// return true if out of range
-//---------------------------------------------------------
-
-bool SigEdit::outOfRange(int secNo, int val) const
- {
- if (secNo == 0)
- return ((val < 1) || (val > 63));
- switch (val) {
- case 1:
- case 2:
- case 3:
- case 4:
- case 8:
- case 16:
- case 32:
- case 64:
- case 128:
- // Changed p3.3.43
- //return true;
- return false;
- default:
- // Changed p3.3.43
- //return false;
- return true;
- }
- }
-
-//---------------------------------------------------------
-// addNumber
-//---------------------------------------------------------
-
-void SigEdit::addNumber(int secNo, int num)
- {
- if (secNo == -1)
- return;
- killTimer(timerId);
- bool accepted = false;
- typing = true;
- int voff = sec[secNo].voff;
-
- QString txt = sectionText(secNo);
-
- //printf("SigEdit::addNumber secNo:%d num:%d voff:%d txt:%s\n", secNo, num, voff, txt.toLatin1());
-
- if ((unsigned) txt.length() == sec[secNo].len) {
- //printf("SigEdit::addNumber txt.length() == sec[secNo].len (%d)\n", sec[secNo].len);
-
- if (!outOfRange(secNo, num - voff)) {
- //printf("SigEdit::addNumber accepted\n");
-
- accepted = true;
- sec[secNo].val = num - voff;
- }
- }
- else {
- //printf("SigEdit::addNumber txt.length() != sec[secNo].len (%d)\n", sec[secNo].len);
-
- txt += QString::number(num);
- int temp = txt.toInt() - voff;
- if (outOfRange(secNo, temp))
- {
- //printf("SigEdit::addNumber not accepted secNo:%d txt:%s temp:%d\n", secNo, txt.toLatin1(), temp);
-
- txt = sectionText(secNo);
- }
- else {
- //printf("SigEdit::addNumber accepted\n");
-
- accepted = true;
- sec[secNo].val = temp;
- }
- if (adv && ((unsigned) txt.length() == sec[secNo].len)) {
- setFocusSection(ed->focusSection() + 1);
- }
- }
- changed = accepted;
- if (accepted)
- emit valueChanged(sig().z, sig().n);
- timerId = startTimer(qApp->doubleClickInterval()*4);
- ed->repaint(ed->rect(), false);
- }
-
-//---------------------------------------------------------
-// removeLastNumber
-//---------------------------------------------------------
-
-void SigEdit::removeLastNumber(int secNo)
- {
- if (secNo == -1)
- return;
- QString txt = QString::number(sec[secNo].val);
- txt = txt.mid(0, txt.length() - 1);
- sec[secNo].val = txt.toInt() - sec[secNo].voff;
- ed->repaint(ed->rect(), false);
- }
-
-//---------------------------------------------------------
-// resizeEvent
-//---------------------------------------------------------
-
-void SigEdit::resizeEvent(QResizeEvent *)
- {
- controls->resize(width(), height());
- }
-
-//---------------------------------------------------------
-// sizeHint
-//---------------------------------------------------------
-
-QSize SigEdit::sizeHint() const
- {
- QFontMetrics fm(font());
- int fw = style()->pixelMetric(QStyle::PM_DefaultFrameWidth, 0, this); // ddskrjo
- int h = fm.height() + fw * 2;
-
- int w = 2 + controls->arrowWidth() + fw * 4;
- w += fm.width('9') * 5 + fm.width('/');
- return QSize(w, h).expandedTo(QApplication::globalStrut());
- }
-
-//---------------------------------------------------------
-// updateButtons
-//---------------------------------------------------------
-
-void SigEdit::updateButtons()
- {
- int secNo = ed->focusSection();
- int val = sec[secNo].val;
-
- bool upEnabled;
- bool downEnabled;
-
- if (secNo == 0) {
- upEnabled = val < 63;
- downEnabled = val > 1;
- }
- else {
- upEnabled = true;
- downEnabled = true;
- switch (val) {
- case 1: downEnabled = false; break;
- case 128: upEnabled = false; break;
- }
- }
- controls->setStepEnabled(isEnabled() & upEnabled, isEnabled() & downEnabled);
- }
-
-//---------------------------------------------------------
-// enterPressed
-//! emit returnPressed
-//---------------------------------------------------------
-void SigEdit::enterPressed()
- {
- emit returnPressed();
- }