using namespace std;
#include <qlayout.h>
#include <qpainter.h>
+#ifdef QT3_SUPPORT
+#include <q3filedialog.h>
+#else
#include <qfiledialog.h>
+#endif
#include <qmessagebox.h>
#include <qregexp.h>
#include <qimage.h>
+#include <qevent.h>
+#include <qwidgetaction.h>
#include <Music/Music.h>
using namespace Music;
void MScale::load_scala(const QString& file_name)
{
- ifstream file(file_name.latin1());
+ ifstream file(file_name.toAscii().constData());
if(!file.is_open())
throw MicrotonalView::tr("Unkown filename: '")+file_name+"'";
m_name = QString(buff);
m_name = m_name.remove("\r");
m_name = m_name.remove("\n");
- m_name = m_name.simplifyWhiteSpace();
+ m_name = m_name.simplified();
lines_red++;
}
else if(lines_red==1)
// ---------------------- QRoot button -------------------------
QRoot::QRoot(MicrotonalView* view, int ht)
-: QPushButton(view, "QRoot:"+QString::number(ht))
+: QPushButton(view)
, m_ht(ht)
{
// cerr << "QRoot::QRoot " << m_ht << endl;
connect(this, SIGNAL(clicked()), this, SLOT(clicked2()));
connect(this, SIGNAL(rootClicked(int)), view, SLOT(selectRoot(int)));
setFlat(true);
- setText(h2n(ht, GetNotesName(), GetTonality(), false));
- setToggleButton(true);
+ setText(QString::fromStdString(h2n(ht, GetNotesName(), GetTonality(), false)));
+ setCheckable(true);
setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
setFixedWidth(35); // TODO
- setFocusPolicy(QPushButton::NoFocus);
+ setFocusPolicy(Qt::NoFocus);
}
void QRoot::clicked2()
{
// --------------------------- MicrotonalView ----------------------------
MicrotonalView::MicrotonalView(QWidget* parent)
-: QFrame(parent, "MicrotonalView")
-, View("Microtonal", this)
-, ui_scale_menu(this)
+: QFrame(parent)
+, View(tr("Microtonal"), this)
+, ui_scale_menu(tr("Used scale"), this)
{
setting_selectedRoot = -1000;
m_AFreq = 440.0f;
m_selected_jivalue = NULL;
m_tuningFreq = 0.0;
+ setting_selectedScale = NULL;
// settings
- QImage img;
+ QPixmap img;
img.loadFromData(g_icon_ji, sizeof(g_icon_ji), "PNG");
- setting_show->setIconSet(QIconSet(QImage(img)));
- setting_show->setOn(false);
+ setting_show->setIcon(QIcon(img));
+ setting_show->setChecked(false);
hide();
- m_popup_menu.insertItem(new Title(tr("Root's octave"), &m_popup_menu));
- setting_octave = new QSpinBox(-3, 8, 1, &m_popup_menu);
- QToolTip::add(setting_octave, tr("Root's octave"));
+ QHBoxLayout* octaveActionLayout = new QHBoxLayout(&m_popup_menu);
+
+ QLabel* octaveActionTitle = new QLabel(tr("Root's octave"), &m_popup_menu);
+ octaveActionLayout->addWidget(octaveActionTitle);
+
+ setting_octave = new QSpinBox(&m_popup_menu);
+ setting_octave->setMinimum(-3);
+ setting_octave->setMaximum(8);
+ setting_octave->setSingleStep(1);
+ setting_octave->setToolTip(tr("Root's octave"));
setting_octave->setValue(3);
// m_old_octave = setting_octave->value();
// connect(setting_octave, SIGNAL(valueChanged(int)), this, SLOT(octaveChanged(int)));
connect(setting_octave, SIGNAL(valueChanged(int)), this, SLOT(emitTuningFreqChanged()));
- m_popup_menu.insertItem(setting_octave);
+ octaveActionLayout->addWidget(setting_octave);
+
+ QWidget* octaveActionWidget = new QWidget(&m_popup_menu);
+ octaveActionWidget->setLayout(octaveActionLayout);
+
+ QWidgetAction* octaveAction = new QWidgetAction(&m_popup_menu);
+ octaveAction->setDefaultWidget(octaveActionWidget);
+ m_popup_menu.addAction(octaveAction);
- setting_keepRootToLeft = new QAction(this);
- setting_keepRootToLeft->setMenuText(tr("Keep root to left side"));
- setting_keepRootToLeft->setToggleAction(true);
+ setting_keepRootToLeft = new QAction(tr("Keep root to left side"), this);
+ setting_keepRootToLeft->setCheckable(true);
connect(setting_keepRootToLeft, SIGNAL(toggled(bool)), this, SLOT(keepRootToLeft(bool)));
- setting_keepRootToLeft->addTo(&m_popup_menu);
+ m_popup_menu.addAction(setting_keepRootToLeft);
- setting_loadScale = new QAction(this);
- setting_loadScale->setMenuText(tr("Load Scala file ..."));
- setting_loadScale->addTo(&m_popup_menu);
+ setting_loadScale = new QAction(tr("Load Scala file ..."), this);
+ m_popup_menu.addAction(setting_loadScale);
connect(setting_loadScale, SIGNAL(activated()), this, SLOT(loadScale()));
- ui_scale_menu.setCheckable(true);
- m_popup_menu.insertItem(tr("used scale"), &ui_scale_menu);
- QVBoxLayout* layout = new QVBoxLayout(this, 0, 0, "MicrotonalView:layout");
- QHBoxLayout* roots_layout = new QHBoxLayout(layout, 0, "MicrotonalView:roots_layout");
+ m_popup_menu.addMenu(&ui_scale_menu);
+
+ QVBoxLayout* layout = new QVBoxLayout(this);
+ layout->setMargin(0);
+ layout->setSpacing(0);
+ QHBoxLayout* roots_layout = new QHBoxLayout();
+ roots_layout->setSpacing(0);
+ layout->addLayout(roots_layout);
for(int i=0; i<13; i++)
{
m_roots.push_back(new QRoot(this, i+3));
}
void MicrotonalView::save()
{
- s_settings->writeEntry("octave", setting_octave->value());
- s_settings->writeEntry("keepRootToLeft", setting_keepRootToLeft->isOn());
+ s_settings->setValue("octave", setting_octave->value());
+ s_settings->setValue("keepRootToLeft", setting_keepRootToLeft->isChecked());
QStringList scale_list;
for(size_t i=0; i<setting_scales.size(); i++)
if(!setting_scales[i]->getPath().isEmpty())
scale_list.push_back(setting_scales[i]->getPath());
- s_settings->writeEntry("scales", scale_list);
- s_settings->writeEntry("selectedScale", setting_selectedScale->getName());
- s_settings->writeEntry("lastScalesDirectory", setting_lastScalesDirectory);
- s_settings->writeEntry("selectedRoot", setting_selectedRoot);
+ s_settings->setValue("scales", scale_list);
+ s_settings->setValue("selectedScale", setting_selectedScale->getName());
+ s_settings->setValue("lastScalesDirectory", setting_lastScalesDirectory);
+ s_settings->setValue("selectedRoot", setting_selectedRoot);
}
void MicrotonalView::load()
{
- setting_octave->setValue(s_settings->readNumEntry("octave", setting_octave->value()));
- setting_keepRootToLeft->setOn(s_settings->readBoolEntry("keepRootToLeft", setting_keepRootToLeft->isOn()));
- QStringList scale_list = s_settings->readListEntry("scales");
+ setting_octave->setValue(s_settings->value("octave", setting_octave->value()).toInt());
+ setting_keepRootToLeft->setChecked(s_settings->value("keepRootToLeft", setting_keepRootToLeft->isChecked()).toBool());
+ QStringList scale_list = s_settings->value("scales").toStringList();
for(QStringList::iterator it=scale_list.begin(); it!=scale_list.end(); ++it)
{
try
MScale* scale = new MScale(*it, MScale::SCALA);
setting_scales.push_back(scale);
}
- catch(QString error){cerr << "MicrotonalView::load " << error << endl;}
+ catch(QString error){cerr << "MicrotonalView::load " << error.toStdString() << endl;}
}
refreshScaleList();
- selectScale(s_settings->readEntry("selectedScale", "default"));
- setting_lastScalesDirectory = s_settings->readEntry("lastScalesDirectory", ".");
- selectRoot(s_settings->readNumEntry("selectedRoot", m_roots[0]->m_ht));
+ selectScale(s_settings->value("selectedScale", "default").toString());
+ setting_lastScalesDirectory = s_settings->value("lastScalesDirectory", ".").toString();
+ selectRoot(s_settings->value("selectedRoot", m_roots[0]->m_ht).toInt());
}
void MicrotonalView::clearSettings()
{
- s_settings->removeEntry("octave");
- s_settings->removeEntry("keepRootToLeft");
- s_settings->removeEntry("scales");
- s_settings->removeEntry("selectedScale");
- s_settings->removeEntry("lastScalesDirectory");
- s_settings->removeEntry("selectedRoot");
+ s_settings->remove("octave");
+ s_settings->remove("keepRootToLeft");
+ s_settings->remove("scales");
+ s_settings->remove("selectedScale");
+ s_settings->remove("lastScalesDirectory");
+ s_settings->remove("selectedRoot");
}
/*void MicrotonalView::octaveChanged(int value)
if(hasTuningFreqSelected())
{
if(m_selected_jivalue->is_ratio)
- return QString(h2n(setting_selectedRoot+getOctaveShift()))+":"+QString::number(m_selected_jivalue->num)+"/"+QString::number(m_selected_jivalue->den);
+ return QString::fromStdString(h2n(setting_selectedRoot+getOctaveShift()))+":"+QString::number(m_selected_jivalue->num)+"/"+QString::number(m_selected_jivalue->den);
else
- return QString(h2n(setting_selectedRoot+getOctaveShift()))+":"+QString::number(m_selected_jivalue->cents);
+ return QString::fromStdString(h2n(setting_selectedRoot+getOctaveShift()))+":"+QString::number(m_selected_jivalue->cents);
}
return "no tuning note selected";
}
+void MicrotonalView::scaleActionToggled(bool checked)
+{
+ if (checked)
+ selectScale(((QAction*)sender())->data().toInt());
+}
+
void MicrotonalView::selectScale(int index)
{
assert(index>=0 && index<int(setting_scales.size()));
setting_selectedScale = setting_scales[index];
- for(size_t i=0; i<setting_scales.size(); i++)
- ui_scale_menu.setItemChecked(i, false);
- ui_scale_menu.setItemChecked(index, true);
+ QList<QAction*> scaleActions = ui_scale_menu.actions();
+
+ for (int i = 0; i < scaleActions.size(); i++)
+ {
+ if (i == index)
+ scaleActions[i]->setChecked(true);
+ else
+ scaleActions[i]->setChecked(false);
+ }
ui_ratios->repaint();
}
if(index==-1)
{
- cerr << "MicrotonalView::selectScale unknown scale '" << name << "'" << endl;
+ cerr << "MicrotonalView::selectScale unknown scale '" << name.toStdString() << "'" << endl;
return;
}
- for(size_t i=0; i<setting_scales.size(); i++)
- ui_scale_menu.setItemChecked(i, false);
- ui_scale_menu.setItemChecked(index, true);
+ QList<QAction*> scaleActions = ui_scale_menu.actions();
+
+ for (int i = 0; i < scaleActions.size(); i++)
+ {
+ if (i == index)
+ scaleActions[i]->setChecked(true);
+ else
+ scaleActions[i]->setChecked(false);
+ }
ui_ratios->repaint();
}
void MicrotonalView::notesNameChanged()
{
for(int i=0; i<13; i++)
- m_roots[i]->setText(h2n(m_roots[i]->m_ht, GetNotesName(), GetTonality(), false));
+ m_roots[i]->setText(QString::fromStdString(h2n(m_roots[i]->m_ht, GetNotesName(), GetTonality(), false)));
}
void MicrotonalView::keepRootToLeft(bool keep)
if(ht==setting_selectedRoot)
{
for(int i=0; i<13; i++)
- m_roots[i]->setOn(m_roots[i]->m_ht==ht);
+ m_roots[i]->setChecked(m_roots[i]->m_ht==ht);
}
else
{
- if(setting_keepRootToLeft->isOn())
+ if(setting_keepRootToLeft->isChecked())
{
for(int i=0; i<13; i++)
m_roots[i]->m_ht = (ht+i)%12;
}
for(int i=0; i<13; i++)
- m_roots[i]->setOn(m_roots[i]->m_ht==ht);
+ m_roots[i]->setChecked(m_roots[i]->m_ht==ht);
setting_selectedRoot = ht;
}
MicrotonalView::QScaleLabel::QScaleLabel(MicrotonalView* view)
-: QLabel(view, "QScaleLabel")
+: QLabel(view)
, ui_view(view)
{
setMaximumHeight(15);
m_htf = -1000.0f;
}
-void MicrotonalView::QScaleLabel::drawContents(QPainter* p)
+void MicrotonalView::QScaleLabel::paintEvent(QPaintEvent* event)
{
+ QLabel::paintEvent(event);
+
+ QPainter* p = new QPainter(this);
+
int left = ui_view->m_roots[0]->x() + ui_view->m_roots[0]->width()/2;
int right = ui_view->m_roots[12]->x() + ui_view->m_roots[12]->width()/2;
int w = right - left;
int x = int(left+htw);
p->setPen(QColor(0,0,255));
p->setBrush(QColor(191,191,255));
- QPointArray arr;
- arr.resize(3);
- arr.setPoint(0, x-5, 0);
- arr.setPoint(1, x+5, 0);
- arr.setPoint(2, x, 2*height()/3);
- p->drawConvexPolygon(arr);
+ QPolygon polygon(3);
+ polygon.setPoint(0, x-5, 0);
+ polygon.setPoint(1, x+5, 0);
+ polygon.setPoint(2, x, 2*height()/3);
+ p->drawConvexPolygon(polygon);
p->drawLine(x, 2*height()/3, x, height());
if(htw<(w/12.0f)/4.0f || -(htw-w)<(w/12.0f)/4.0f)
{
if(htw<(w/12.0f)/4.0f) x += w;
else x -= w;
- arr.setPoint(0, x-5, 0);
- arr.setPoint(1, x+5, 0);
- arr.setPoint(2, x, 2*height()/3);
- p->drawConvexPolygon(arr);
+ polygon.setPoint(0, x-5, 0);
+ polygon.setPoint(1, x+5, 0);
+ polygon.setPoint(2, x, 2*height()/3);
+ p->drawConvexPolygon(polygon);
p->drawLine(x, 2*height()/3, x, height());
}
}
+
+ delete p;
}
MicrotonalView::QRatiosLabel::QRatiosLabel(MicrotonalView* view)
-: QLabel(view, "QRatiosLabel")
+: QLabel(view)
, ui_view(view)
{
setMaximumHeight(12+3*(2*fontMetrics().height()+10));
p->drawLine(x, 0, x, h);
}
}
-void MicrotonalView::QRatiosLabel::drawContents(QPainter* p)
+void MicrotonalView::QRatiosLabel::paintEvent(QPaintEvent* event)
{
- QLabel::drawContents(p);
+ QLabel::paintEvent(event);
+
+ QPainter* p = new QPainter(this);
+
// p->eraseRect(rect());
int left = ui_view->m_roots[0]->x() + ui_view->m_roots[0]->width()/2;
int dec_h2 = (height()-tick_height-p->fontMetrics().height()+2)/3;
dec_h = min(dec_h, dec_h2);
int ht = ui_view->setting_selectedRoot - ui_view->m_roots[0]->m_ht;
- if(ui_view->setting_keepRootToLeft->isOn()) ht = 0;
+ if(ui_view->setting_keepRootToLeft->isChecked()) ht = 0;
for(list<MScale::MValue>::iterator it=ui_view->setting_selectedScale->values.begin(); it!=ui_view->setting_selectedScale->values.end(); ++it)
{
float htw = 0.0f;
if((*it).is_ratio)
{
QRect num_rect = fontMetrics().boundingRect(QString::number((*it).num));
- num_rect.moveBy(x+1, y+p->fontMetrics().height());
+ num_rect.translate(x+1, y+p->fontMetrics().height());
QRect den_rect = fontMetrics().boundingRect(QString::number((*it).den));
- den_rect.moveBy(x+1, y+2*p->fontMetrics().height());
+ den_rect.translate(x+1, y+2*p->fontMetrics().height());
(*it).bounding_rect = num_rect;
(*it).bounding_rect |= den_rect;
}
else
{
QRect cents_rect = fontMetrics().boundingRect(QString::number((*it).cents));
- cents_rect.moveBy(x+1, y+2*p->fontMetrics().height());
+ cents_rect.translate(x+1, y+2*p->fontMetrics().height());
(*it).bounding_rect = cents_rect;
}
- (*it).bounding_rect.rLeft() = x;
- (*it).bounding_rect.rRight() += 2;
- (*it).bounding_rect.rTop() -= 2;
- (*it).bounding_rect.rBottom() = y+dec_h;
+ (*it).bounding_rect.setLeft(x);
+ (*it).bounding_rect.setRight((*it).bounding_rect.right() + 2);
+ (*it).bounding_rect.setTop((*it).bounding_rect.top() - 2);
+ (*it).bounding_rect.setBottom(y+dec_h);
if(ui_view->m_selected_jivalue==&(*it))
{
drawTicks(p, 0.5f, tick_height/2);
drawTicks(p, 0.25f, tick_height/3);
drawTicks(p, 0.125f, tick_height/4);
+
+ delete p;
}
void MicrotonalView::mouseReleaseEvent(QMouseEvent* e)
{
- if(e->button()==LeftButton)
+ if(e->button()==Qt::LeftButton)
{
MScale::MValue* selected_jivalue_old = m_selected_jivalue;
m_selected_jivalue = NULL;
void MicrotonalView::refreshScaleList()
{
ui_scale_menu.clear();
+
+ QActionGroup* scaleGroup = new QActionGroup(this);
+
for(size_t i=0; i<setting_scales.size(); i++)
{
- ui_scale_menu.insertItem(setting_scales[i]->getName(), i);
- ui_scale_menu.connectItem(i, this, SLOT(selectScale(int)));
+ QAction* scaleAction = ui_scale_menu.addAction(setting_scales[i]->getName());
+ scaleAction->setCheckable(true);
+ scaleAction->setData((int)i);
+ scaleGroup->addAction(scaleAction);
+
if(setting_selectedScale==setting_scales[i])
- ui_scale_menu.setItemChecked(i, true);
+ scaleAction->setChecked(true);
+
+ connect(scaleAction, SIGNAL(toggled(bool)), this, SLOT(scaleActionToggled(bool)));
}
}
void MicrotonalView::loadScale()
{
- QFileDialog dlg_file(setting_lastScalesDirectory, "Scala files (*.scl *.SCL)", this, "open file dialog", true);
+#ifdef QT3_SUPPORT
+ Q3FileDialog dlg_file(setting_lastScalesDirectory, "Scala files (*.scl *.SCL)", this, "open file dialog", true);
dlg_file.setCaption(tr("Open scale file"));
- dlg_file.setMode(QFileDialog::ExistingFile);
+ dlg_file.setMode(Q3FileDialog::ExistingFile);
dlg_file.setInfoPreviewEnabled(true);
ScalePreview p(&dlg_file);
dlg_file.setInfoPreview(&p,&p);
- dlg_file.setPreviewMode(QFileDialog::Info);
+ dlg_file.setPreviewMode(Q3FileDialog::Info);
+#else
+ QFileDialog dlg_file(this, tr("Open scale file"), setting_lastScalesDirectory, "Scala files (*.scl *.SCL)");
+ dlg_file.setFileMode(QFileDialog::ExistingFile);
+#endif
dlg_file.exec();
if(dlg_file.result()==QDialog::Accepted)
{
+#ifdef QT3_SUPPORT
setting_lastScalesDirectory = dlg_file.dirPath();
- s_settings->writeEntry("MicrotonalView_lastScalesDirectory", setting_lastScalesDirectory);
+#else
+ setting_lastScalesDirectory = dlg_file.directory().path();
+#endif
+ s_settings->setValue("MicrotonalView_lastScalesDirectory", setting_lastScalesDirectory);
// cerr << "setting_lastScalesDirectory=" << setting_lastScalesDirectory << endl;
try
{
+#ifdef QT3_SUPPORT
MScale* scale = new MScale(dlg_file.selectedFile(), MScale::SCALA);
+#else
+ MScale* scale = new MScale(dlg_file.selectedFiles()[0], MScale::SCALA);
+#endif
bool new_one = true;
for(size_t i=0; new_one && i<setting_scales.size(); i++)
new_one = *scale != *(setting_scales[i]);
}
// ------------------ MicrotonalView::ScalePreview --------------------
+#ifdef QT3_SUPPORT
MicrotonalView::ScalePreview::ScalePreview(QWidget* parent)
: QLabel(parent)
{
- setAlignment(QLabel::WordBreak|QLabel::AlignVCenter);
+ setAlignment(Qt::AlignVCenter);
+ setWordWrap(true);
setMinimumWidth(100);
}
-void MicrotonalView::ScalePreview::previewUrl(const QUrl& url)
+void MicrotonalView::ScalePreview::previewUrl(const Q3Url& url)
{
if(url.path().contains(QRegExp("\\.scl$"))==0 && url.path().contains(QRegExp("\\.SCL$"))==0)
{
}
}
}
-
+#endif