mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-11-04 00:26:39 +00:00 
			
		
		
		
	Save selected color in a model when picking is finished
This commit is contained in:
		
							parent
							
								
									4096d2851c
								
							
						
					
					
						commit
						eb5180ba86
					
				
					 6 changed files with 45 additions and 59 deletions
				
			
		| 
						 | 
				
			
			@ -9,12 +9,9 @@
 | 
			
		|||
 | 
			
		||||
#include "colorpickerpopup.hpp"
 | 
			
		||||
 | 
			
		||||
CSVWidget::ColorEditor::ColorEditor(const QColor &color,
 | 
			
		||||
                                    const QSize &coloredRectSize,
 | 
			
		||||
                                    QWidget *parent)
 | 
			
		||||
CSVWidget::ColorEditor::ColorEditor(const QColor &color, QWidget *parent)
 | 
			
		||||
    : QPushButton(parent),
 | 
			
		||||
      mColor(color),
 | 
			
		||||
      mColoredRectSize(coloredRectSize),
 | 
			
		||||
      mColorPicker(new ColorPickerPopup(this))
 | 
			
		||||
{
 | 
			
		||||
    setCheckable(true);
 | 
			
		||||
| 
						 | 
				
			
			@ -28,10 +25,10 @@ void CSVWidget::ColorEditor::paintEvent(QPaintEvent *event)
 | 
			
		|||
    QPushButton::paintEvent(event);
 | 
			
		||||
 | 
			
		||||
    QRect buttonRect = rect();
 | 
			
		||||
    QRect coloredRect(buttonRect.x() + (buttonRect.width() - mColoredRectSize.width()) / 2,
 | 
			
		||||
                      buttonRect.y() + (buttonRect.height() - mColoredRectSize.height()) / 2,
 | 
			
		||||
                      mColoredRectSize.width(),
 | 
			
		||||
                      mColoredRectSize.height());
 | 
			
		||||
    QRect coloredRect(qRound(buttonRect.x() + buttonRect.width() / 4.0),
 | 
			
		||||
                      qRound(buttonRect.y() + buttonRect.height() / 4.0),
 | 
			
		||||
                      qRound(buttonRect.width() / 2.0),
 | 
			
		||||
                      qRound(buttonRect.height() / 2.0));
 | 
			
		||||
    QPainter painter(this);
 | 
			
		||||
    painter.fillRect(coloredRect, mColor);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -46,11 +43,6 @@ void CSVWidget::ColorEditor::setColor(const QColor &color)
 | 
			
		|||
    mColor = color;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CSVWidget::ColorEditor::setColoredRectSize(const QSize &size)
 | 
			
		||||
{
 | 
			
		||||
    mColoredRectSize = size;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CSVWidget::ColorEditor::showPicker()
 | 
			
		||||
{
 | 
			
		||||
    if (isChecked())
 | 
			
		||||
| 
						 | 
				
			
			@ -73,6 +65,7 @@ void CSVWidget::ColorEditor::pickerHid()
 | 
			
		|||
    {
 | 
			
		||||
        setChecked(false);
 | 
			
		||||
    }
 | 
			
		||||
    emit pickingFinished();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CSVWidget::ColorEditor::pickerColorChanged(const QColor &color)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,19 +16,15 @@ namespace CSVWidget
 | 
			
		|||
            Q_OBJECT
 | 
			
		||||
 | 
			
		||||
            QColor mColor;
 | 
			
		||||
            QSize mColoredRectSize;
 | 
			
		||||
            ColorPickerPopup *mColorPicker;
 | 
			
		||||
 | 
			
		||||
            QPoint calculatePopupPosition();
 | 
			
		||||
 | 
			
		||||
        public:
 | 
			
		||||
            ColorEditor(const QColor &color,
 | 
			
		||||
                        const QSize &coloredRectSize,
 | 
			
		||||
                        QWidget *parent = 0);
 | 
			
		||||
            ColorEditor(const QColor &color, QWidget *parent = 0);
 | 
			
		||||
 | 
			
		||||
            QColor color() const;
 | 
			
		||||
            void setColor(const QColor &color);
 | 
			
		||||
            void setColoredRectSize(const QSize &size);
 | 
			
		||||
 | 
			
		||||
        protected:
 | 
			
		||||
            void paintEvent(QPaintEvent *event);
 | 
			
		||||
| 
						 | 
				
			
			@ -37,6 +33,9 @@ namespace CSVWidget
 | 
			
		|||
            void showPicker();
 | 
			
		||||
            void pickerHid();
 | 
			
		||||
            void pickerColorChanged(const QColor &color);
 | 
			
		||||
 | 
			
		||||
        signals:
 | 
			
		||||
            void pickingFinished();
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,41 +11,20 @@ CSVWorld::ColorPickerDelegate::ColorPickerDelegate(CSMWorld::CommandDispatcher *
 | 
			
		|||
    : CommandDelegate(dispatcher, document, parent)
 | 
			
		||||
{}
 | 
			
		||||
 | 
			
		||||
QWidget *CSVWorld::ColorPickerDelegate::createEditor(QWidget *parent,
 | 
			
		||||
                                                     const QStyleOptionViewItem &option,
 | 
			
		||||
                                                     const QModelIndex &index) const
 | 
			
		||||
{
 | 
			
		||||
    return createEditor(parent, option, index, getDisplayTypeFromIndex(index));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QWidget *CSVWorld::ColorPickerDelegate::createEditor(QWidget *parent,
 | 
			
		||||
                                                     const QStyleOptionViewItem &option,
 | 
			
		||||
                                                     const QModelIndex &index,
 | 
			
		||||
                                                     CSMWorld::ColumnBase::Display display) const
 | 
			
		||||
{
 | 
			
		||||
    if (display != CSMWorld::ColumnBase::Display_Colour)
 | 
			
		||||
    {
 | 
			
		||||
        throw std::logic_error("Wrong column for ColorPickerDelegate");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return new CSVWidget::ColorEditor(index.data().value<QColor>(), 
 | 
			
		||||
                                      getColoredRect(option).size(),
 | 
			
		||||
                                      parent);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CSVWorld::ColorPickerDelegate::paint(QPainter *painter, 
 | 
			
		||||
                                          const QStyleOptionViewItem &option,
 | 
			
		||||
                                          const QModelIndex &index) const
 | 
			
		||||
{
 | 
			
		||||
    painter->fillRect(getColoredRect(option), index.data().value<QColor>());
 | 
			
		||||
    QRect coloredRect = getColoredRect(option);
 | 
			
		||||
    painter->fillRect(coloredRect, index.data().value<QColor>());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QRect CSVWorld::ColorPickerDelegate::getColoredRect(const QStyleOptionViewItem &option) const
 | 
			
		||||
{
 | 
			
		||||
    return QRect(option.rect.x() + option.rect.width() / 4,
 | 
			
		||||
                 option.rect.y() + option.rect.height() / 4,
 | 
			
		||||
                 option.rect.width() / 2,
 | 
			
		||||
                 option.rect.height() / 2);
 | 
			
		||||
    return QRect(qRound(option.rect.x() + option.rect.width() / 4.0),
 | 
			
		||||
                 qRound(option.rect.y() + option.rect.height() / 4.0),
 | 
			
		||||
                 qRound(option.rect.width() / 2.0),
 | 
			
		||||
                 qRound(option.rect.height() / 2.0));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CSVWorld::CommandDelegate *CSVWorld::ColorPickerDelegateFactory::makeDelegate(CSMWorld::CommandDispatcher *dispatcher, 
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,15 +21,6 @@ namespace CSVWorld
 | 
			
		|||
                                CSMDoc::Document& document, 
 | 
			
		||||
                                QObject *parent);
 | 
			
		||||
 | 
			
		||||
            virtual QWidget *createEditor(QWidget *parent,
 | 
			
		||||
                                          const QStyleOptionViewItem &option,
 | 
			
		||||
                                          const QModelIndex &index) const;
 | 
			
		||||
 | 
			
		||||
            virtual QWidget *createEditor(QWidget *parent,
 | 
			
		||||
                                          const QStyleOptionViewItem &option,
 | 
			
		||||
                                          const QModelIndex &index,
 | 
			
		||||
                                          CSMWorld::ColumnBase::Display display) const;
 | 
			
		||||
 | 
			
		||||
            virtual void paint(QPainter *painter, 
 | 
			
		||||
                               const QStyleOptionViewItem &option,
 | 
			
		||||
                               const QModelIndex &index) const;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -33,6 +33,8 @@
 | 
			
		|||
#include "../../model/world/commands.hpp"
 | 
			
		||||
#include "../../model/doc/document.hpp"
 | 
			
		||||
 | 
			
		||||
#include "../widget/coloreditor.hpp"
 | 
			
		||||
 | 
			
		||||
#include "recordstatusdelegate.hpp"
 | 
			
		||||
#include "util.hpp"
 | 
			
		||||
#include "tablebottombox.hpp"
 | 
			
		||||
| 
						 | 
				
			
			@ -331,6 +333,10 @@ QWidget* CSVWorld::DialogueDelegateDispatcher::makeEditor(CSMWorld::ColumnBase::
 | 
			
		|||
        {
 | 
			
		||||
            connect(editor, SIGNAL(editingFinished()), proxy, SLOT(editorDataCommited()));
 | 
			
		||||
        }
 | 
			
		||||
        else if (qobject_cast<CSVWidget::ColorEditor *>(editor))
 | 
			
		||||
        {
 | 
			
		||||
            connect(editor, SIGNAL(pickingFinished()), proxy, SLOT(editorDataCommited()));
 | 
			
		||||
        }
 | 
			
		||||
        else // throw an exception because this is a coding error
 | 
			
		||||
            throw std::logic_error ("Dialogue editor type missing");
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,6 +17,7 @@
 | 
			
		|||
#include "../../model/world/commands.hpp"
 | 
			
		||||
#include "../../model/world/tablemimedata.hpp"
 | 
			
		||||
#include "../../model/world/commanddispatcher.hpp"
 | 
			
		||||
#include "../widget/coloreditor.hpp"
 | 
			
		||||
#include "dialoguespinbox.hpp"
 | 
			
		||||
#include "scriptedit.hpp"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -123,10 +124,19 @@ void CSVWorld::CommandDelegate::setModelDataImp (QWidget *editor, QAbstractItemM
 | 
			
		|||
    if (!mCommandDispatcher)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    NastyTableModelHack hack (*model);
 | 
			
		||||
    QStyledItemDelegate::setModelData (editor, &hack, index);
 | 
			
		||||
 | 
			
		||||
    QVariant new_ = hack.getData();
 | 
			
		||||
    QVariant new_;
 | 
			
		||||
    // Color columns use a custom editor, so we need explicitly extract a data from it
 | 
			
		||||
    CSVWidget::ColorEditor *colorEditor = qobject_cast<CSVWidget::ColorEditor *>(editor);
 | 
			
		||||
    if (colorEditor != NULL)
 | 
			
		||||
    {
 | 
			
		||||
        new_ = colorEditor->color();
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        NastyTableModelHack hack (*model);
 | 
			
		||||
        QStyledItemDelegate::setModelData (editor, &hack, index);
 | 
			
		||||
        new_ = hack.getData();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ((model->data (index)!=new_) && (model->flags(index) & Qt::ItemIsEditable))
 | 
			
		||||
        mCommandDispatcher->executeModify (model, index, new_);
 | 
			
		||||
| 
						 | 
				
			
			@ -184,7 +194,7 @@ QWidget *CSVWorld::CommandDelegate::createEditor (QWidget *parent, const QStyleO
 | 
			
		|||
    {
 | 
			
		||||
        case CSMWorld::ColumnBase::Display_Colour:
 | 
			
		||||
 | 
			
		||||
            return new QLineEdit(parent);
 | 
			
		||||
            return new CSVWidget::ColorEditor(index.data().value<QColor>(), parent);
 | 
			
		||||
 | 
			
		||||
        case CSMWorld::ColumnBase::Display_Integer:
 | 
			
		||||
        {
 | 
			
		||||
| 
						 | 
				
			
			@ -284,6 +294,14 @@ void CSVWorld::CommandDelegate::setEditorData (QWidget *editor, const QModelInde
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Color columns use a custom editor, so we need explicitly set a data for it
 | 
			
		||||
    CSVWidget::ColorEditor *colorEditor = qobject_cast<CSVWidget::ColorEditor *>(editor);
 | 
			
		||||
    if (colorEditor != NULL)
 | 
			
		||||
    {
 | 
			
		||||
        colorEditor->setColor(index.data().value<QColor>());
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    QByteArray n = editor->metaObject()->userProperty().name();
 | 
			
		||||
 | 
			
		||||
    if (n == "dateTime") {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue