Mercurial > hg > svgui
comparison widgets/PropertyBox.cpp @ 285:9dd432665059
* Add a colour database, and Add New Colour function to the colour combo
in property box. The colour property is only correctly handled in the
waveform layer so far.
* Add en_GB translation, to translate those annoying Color texts in the
Qt colour picker dialog.
| author | Chris Cannam |
|---|---|
| date | Wed, 11 Jul 2007 17:21:37 +0000 |
| parents | 3c402c6052f6 |
| children | cd2492c5fe45 |
comparison
equal
deleted
inserted
replaced
| 284:1284955856ab | 285:9dd432665059 |
|---|---|
| 18 | 18 |
| 19 #include "base/PropertyContainer.h" | 19 #include "base/PropertyContainer.h" |
| 20 #include "base/PlayParameters.h" | 20 #include "base/PlayParameters.h" |
| 21 #include "layer/Layer.h" | 21 #include "layer/Layer.h" |
| 22 #include "base/UnitDatabase.h" | 22 #include "base/UnitDatabase.h" |
| 23 #include "base/ColourDatabase.h" | |
| 23 #include "base/RangeMapper.h" | 24 #include "base/RangeMapper.h" |
| 24 | 25 |
| 25 #include "plugin/RealTimePluginFactory.h" | 26 #include "plugin/RealTimePluginFactory.h" |
| 26 #include "plugin/RealTimePluginInstance.h" | 27 #include "plugin/RealTimePluginInstance.h" |
| 27 #include "plugin/PluginXml.h" | 28 #include "plugin/PluginXml.h" |
| 29 #include "AudioDial.h" | 30 #include "AudioDial.h" |
| 30 #include "LEDButton.h" | 31 #include "LEDButton.h" |
| 31 | 32 |
| 32 #include "NotifyingCheckBox.h" | 33 #include "NotifyingCheckBox.h" |
| 33 #include "NotifyingComboBox.h" | 34 #include "NotifyingComboBox.h" |
| 35 #include "ColourNameDialog.h" | |
| 34 | 36 |
| 35 #include <QGridLayout> | 37 #include <QGridLayout> |
| 36 #include <QHBoxLayout> | 38 #include <QHBoxLayout> |
| 37 #include <QVBoxLayout> | 39 #include <QVBoxLayout> |
| 38 #include <QPushButton> | 40 #include <QPushButton> |
| 39 #include <QLabel> | 41 #include <QLabel> |
| 40 #include <QFrame> | 42 #include <QFrame> |
| 41 #include <QApplication> | 43 #include <QApplication> |
| 44 #include <QColorDialog> | |
| 45 #include <QInputDialog> | |
| 42 | 46 |
| 43 #include <cassert> | 47 #include <cassert> |
| 44 #include <iostream> | 48 #include <iostream> |
| 45 #include <cmath> | 49 #include <cmath> |
| 46 | 50 |
| 47 //#define DEBUG_PROPERTY_BOX 1 | 51 #define DEBUG_PROPERTY_BOX 1 |
| 48 | 52 |
| 49 PropertyBox::PropertyBox(PropertyContainer *container) : | 53 PropertyBox::PropertyBox(PropertyContainer *container) : |
| 50 m_container(container), | 54 m_container(container), |
| 51 m_showButton(0), | 55 m_showButton(0), |
| 52 m_playButton(0) | 56 m_playButton(0) |
| 88 | 92 |
| 89 m_layout->setRowStretch(m_layout->rowCount(), 10); | 93 m_layout->setRowStretch(m_layout->rowCount(), 10); |
| 90 | 94 |
| 91 connect(UnitDatabase::getInstance(), SIGNAL(unitDatabaseChanged()), | 95 connect(UnitDatabase::getInstance(), SIGNAL(unitDatabaseChanged()), |
| 92 this, SLOT(unitDatabaseChanged())); | 96 this, SLOT(unitDatabaseChanged())); |
| 97 | |
| 98 connect(ColourDatabase::getInstance(), SIGNAL(colourDatabaseChanged()), | |
| 99 this, SLOT(colourDatabaseChanged())); | |
| 93 | 100 |
| 94 #ifdef DEBUG_PROPERTY_BOX | 101 #ifdef DEBUG_PROPERTY_BOX |
| 95 std::cerr << "PropertyBox[" << this << "]::PropertyBox returning" << std::endl; | 102 std::cerr << "PropertyBox[" << this << "]::PropertyBox returning" << std::endl; |
| 96 #endif | 103 #endif |
| 97 } | 104 } |
| 395 break; | 402 break; |
| 396 } | 403 } |
| 397 | 404 |
| 398 case PropertyContainer::ValueProperty: | 405 case PropertyContainer::ValueProperty: |
| 399 case PropertyContainer::UnitsProperty: | 406 case PropertyContainer::UnitsProperty: |
| 407 case PropertyContainer::ColourProperty: | |
| 400 { | 408 { |
| 401 NotifyingComboBox *cb; | 409 NotifyingComboBox *cb; |
| 402 | 410 |
| 403 if (have) { | 411 if (have) { |
| 404 cb = dynamic_cast<NotifyingComboBox *>(m_propertyControllers[name]); | 412 cb = dynamic_cast<NotifyingComboBox *>(m_propertyControllers[name]); |
| 412 cb->setObjectName(name); | 420 cb->setObjectName(name); |
| 413 cb->setDuplicatesEnabled(false); | 421 cb->setDuplicatesEnabled(false); |
| 414 } | 422 } |
| 415 | 423 |
| 416 if (!have || rangeChanged) { | 424 if (!have || rangeChanged) { |
| 425 | |
| 417 cb->blockSignals(true); | 426 cb->blockSignals(true); |
| 418 cb->clear(); | 427 cb->clear(); |
| 428 cb->setEditable(false); | |
| 429 | |
| 419 if (type == PropertyContainer::ValueProperty) { | 430 if (type == PropertyContainer::ValueProperty) { |
| 431 | |
| 420 for (int i = min; i <= max; ++i) { | 432 for (int i = min; i <= max; ++i) { |
| 421 cb->addItem(m_container->getPropertyValueLabel(name, i)); | 433 cb->addItem(m_container->getPropertyValueLabel(name, i)); |
| 422 } | 434 } |
| 423 cb->setEditable(false); | 435 |
| 424 } else { | 436 } else if (type == PropertyContainer::UnitsProperty) { |
| 437 | |
| 425 QStringList units = UnitDatabase::getInstance()->getKnownUnits(); | 438 QStringList units = UnitDatabase::getInstance()->getKnownUnits(); |
| 426 for (int i = 0; i < units.size(); ++i) { | 439 for (int i = 0; i < units.size(); ++i) { |
| 427 cb->addItem(units[i]); | 440 cb->addItem(units[i]); |
| 428 } | 441 } |
| 442 | |
| 429 cb->setEditable(true); | 443 cb->setEditable(true); |
| 430 } | 444 |
| 445 } else { // ColourProperty | |
| 446 | |
| 447 ColourDatabase *db = ColourDatabase::getInstance(); | |
| 448 for (size_t i = 0; i < db->getColourCount(); ++i) { | |
| 449 QString name = db->getColourName(i); | |
| 450 QColor colour = db->getColour(i); | |
| 451 QPixmap pmap(12, 12); | |
| 452 pmap.fill(colour); | |
| 453 cb->addItem(pmap, name); | |
| 454 } | |
| 455 cb->addItem(tr("Add New Colour...")); | |
| 456 } | |
| 457 | |
| 431 cb->blockSignals(false); | 458 cb->blockSignals(false); |
| 432 if (cb->count() < 20 && cb->count() > cb->maxVisibleItems()) { | 459 if (cb->count() < 20 && cb->count() > cb->maxVisibleItems()) { |
| 433 cb->setMaxVisibleItems(cb->count()); | 460 cb->setMaxVisibleItems(cb->count()); |
| 434 } | 461 } |
| 435 } | 462 } |
| 450 } | 477 } |
| 451 m_propertyControllers[name] = cb; | 478 m_propertyControllers[name] = cb; |
| 452 } | 479 } |
| 453 | 480 |
| 454 cb->blockSignals(true); | 481 cb->blockSignals(true); |
| 455 if (type == PropertyContainer::ValueProperty) { | 482 if (type == PropertyContainer::ValueProperty || |
| 483 type == PropertyContainer::ColourProperty) { | |
| 456 if (cb->currentIndex() != value) { | 484 if (cb->currentIndex() != value) { |
| 457 cb->setCurrentIndex(value); | 485 cb->setCurrentIndex(value); |
| 458 } | 486 } |
| 459 } else { | 487 } else { |
| 460 QString unit = UnitDatabase::getInstance()->getUnitById(value); | 488 QString unit = UnitDatabase::getInstance()->getUnitById(value); |
| 521 { | 549 { |
| 522 blockSignals(true); | 550 blockSignals(true); |
| 523 | 551 |
| 524 PropertyContainer::PropertyList properties = m_container->getProperties(); | 552 PropertyContainer::PropertyList properties = m_container->getProperties(); |
| 525 for (size_t i = 0; i < properties.size(); ++i) { | 553 for (size_t i = 0; i < properties.size(); ++i) { |
| 526 updatePropertyEditor(properties[i]); | 554 if (m_container->getPropertyType(properties[i]) == |
| 555 PropertyContainer::UnitsProperty) { | |
| 556 updatePropertyEditor(properties[i]); | |
| 557 } | |
| 527 } | 558 } |
| 528 | 559 |
| 529 blockSignals(false); | 560 blockSignals(false); |
| 530 } | 561 } |
| 531 | 562 |
| 532 void | 563 void |
| 564 PropertyBox::colourDatabaseChanged() | |
| 565 { | |
| 566 blockSignals(true); | |
| 567 | |
| 568 PropertyContainer::PropertyList properties = m_container->getProperties(); | |
| 569 for (size_t i = 0; i < properties.size(); ++i) { | |
| 570 if (m_container->getPropertyType(properties[i]) == | |
| 571 PropertyContainer::ColourProperty) { | |
| 572 updatePropertyEditor(properties[i], true); | |
| 573 } | |
| 574 } | |
| 575 | |
| 576 blockSignals(false); | |
| 577 } | |
| 578 | |
| 579 void | |
| 533 PropertyBox::propertyControllerChanged(int value) | 580 PropertyBox::propertyControllerChanged(int value) |
| 534 { | 581 { |
| 535 QObject *obj = sender(); | 582 QObject *obj = sender(); |
| 536 QString name = obj->objectName(); | 583 QString name = obj->objectName(); |
| 537 | 584 |
| 541 #endif | 588 #endif |
| 542 | 589 |
| 543 PropertyContainer::PropertyType type = m_container->getPropertyType(name); | 590 PropertyContainer::PropertyType type = m_container->getPropertyType(name); |
| 544 | 591 |
| 545 if (type == PropertyContainer::UnitsProperty) { | 592 if (type == PropertyContainer::UnitsProperty) { |
| 593 | |
| 546 NotifyingComboBox *cb = dynamic_cast<NotifyingComboBox *>(obj); | 594 NotifyingComboBox *cb = dynamic_cast<NotifyingComboBox *>(obj); |
| 547 if (cb) { | 595 if (cb) { |
| 548 QString unit = cb->currentText(); | 596 QString unit = cb->currentText(); |
| 549 m_container->setPropertyWithCommand | 597 m_container->setPropertyWithCommand |
| 550 (name, UnitDatabase::getInstance()->getUnitId(unit)); | 598 (name, UnitDatabase::getInstance()->getUnitId(unit)); |
| 551 } | 599 } |
| 600 | |
| 601 } else if (type == PropertyContainer::ColourProperty) { | |
| 602 | |
| 603 if (value == int(ColourDatabase::getInstance()->getColourCount())) { | |
| 604 addNewColour(); | |
| 605 if (value == int(ColourDatabase::getInstance()->getColourCount())) { | |
| 606 propertyContainerPropertyChanged(m_container); | |
| 607 return; | |
| 608 } | |
| 609 } | |
| 610 m_container->setPropertyWithCommand(name, value); | |
| 611 | |
| 552 } else if (type != PropertyContainer::InvalidProperty) { | 612 } else if (type != PropertyContainer::InvalidProperty) { |
| 613 | |
| 553 m_container->setPropertyWithCommand(name, value); | 614 m_container->setPropertyWithCommand(name, value); |
| 554 } | 615 } |
| 555 | 616 |
| 556 updateContextHelp(obj); | 617 updateContextHelp(obj); |
| 618 } | |
| 619 | |
| 620 void | |
| 621 PropertyBox::addNewColour() | |
| 622 { | |
| 623 QColor newColour = QColorDialog::getColor(); | |
| 624 if (!newColour.isValid()) return; | |
| 625 | |
| 626 ColourNameDialog dialog(tr("Name New Colour"), | |
| 627 tr("Enter name for the new colour:"), | |
| 628 newColour, "", this); | |
| 629 dialog.showDarkBackgroundCheckbox(tr("Prefer black background for this colour")); | |
| 630 if (dialog.exec() == QDialog::Accepted) { | |
| 631 //!!! command | |
| 632 ColourDatabase *db = ColourDatabase::getInstance(); | |
| 633 int index = db->addColour(newColour, dialog.getColourName()); | |
| 634 db->setUseDarkBackground(index, dialog.isDarkBackgroundChecked()); | |
| 635 } | |
| 557 } | 636 } |
| 558 | 637 |
| 559 void | 638 void |
| 560 PropertyBox::playGainChanged(float gain) | 639 PropertyBox::playGainChanged(float gain) |
| 561 { | 640 { |
