]> git.sesse.net Git - kdenlive/commitdiff
Color Picker:
authorTill Theato <root@ttill.de>
Sun, 1 Aug 2010 11:35:00 +0000 (11:35 +0000)
committerTill Theato <root@ttill.de>
Sun, 1 Aug 2010 11:35:00 +0000 (11:35 +0000)
- Fix last pixels not being taken care of
- Show progress of requesting the colors for large rects (size > 200px) in status bar

svn path=/trunk/kdenlive/; revision=4677

src/choosecolorwidget.cpp
src/choosecolorwidget.h
src/colorpickerwidget.cpp
src/colorpickerwidget.h
src/effectstackedit.cpp
src/effectstackedit.h
src/effectstackview.cpp
src/effectstackview.h
src/mainwindow.cpp

index f45fc62764d261a8557f078dbea65662e966b1d3..78ef79c1cda86a766ab0a0df2b65a1ce52427acd 100644 (file)
@@ -44,6 +44,7 @@ ChooseColorWidget::ChooseColorWidget(QString text, QColor color, QWidget *parent
     layout->addWidget(picker);
 
     connect(picker, SIGNAL(colorPicked(QColor)), this, SLOT(setColor(QColor)));
+    connect(picker, SIGNAL(displayMessage(const QString&, int)), this, SIGNAL(displayMessage(const QString&, int)));
     connect(m_button, SIGNAL(clicked(bool)), this, SIGNAL(modified()));
 }
 
index a379e5c12b4cd62be9f5d40ba318662749fe029a..deac2b818b9039c06195d1c87517e6694c3e0bc8 100644 (file)
@@ -54,6 +54,7 @@ private slots:
 signals:
     /** @brief Emitted whenever a different color was choosen. */
     void modified();
+    void displayMessage(const QString&, int);
 };
 
 #endif
index a6bafd9387b852288653f32bd3120e93fb73da52..44ae3f0c12658b7893e70efc5cdb4ffe54d877f4 100644 (file)
@@ -96,11 +96,16 @@ QColor ColorPickerWidget::averagePickedColor(const QPoint pos)
     int y0 = qMax(0, pos.y() - size / 2);
     int x1 = qMin(qApp->desktop()->geometry().width(), pos.x() + size / 2);
     int y1 = qMin(qApp->desktop()->geometry().height(), pos.y() + size / 2);
+    int numPixel = (x1 - x0) * (y1 - y0);
 
     int sumR = 0;
     int sumG = 0;
     int sumB = 0;
 
+    // only show message for size > 200 because for smaller values it slows down to much
+    if (size > 200)
+        emit displayMessage(i18n("Requesting color information..."), 0);
+
     /*
      Only getting the image once for the whole rect
      results in a vast speed improvement.
@@ -113,14 +118,18 @@ QColor ColorPickerWidget::averagePickedColor(const QPoint pos)
     m_image = QPixmap::grabWindow(desktop->winId(), x0, y0, x1 - x0, y1 - y0).toImage();
 #endif
 
-    for (int i = x0; i < x1; ++i) {
-        for (int j = y0; j < y1; ++j) {
+    for (int i = x0; i <= x1; ++i) {
+        for (int j = y0; j <= y1; ++j) {
             QColor color;
             color = grabColor(QPoint(i - x0, j - y0), false);
             sumR += color.red();
             sumG += color.green();
             sumB += color.blue();
         }
+
+        // Warning: slows things down, so don't do it for every pixel (the inner for loop)
+        if (size > 200)
+            emit displayMessage(i18n("Requesting color information..."), (int)(((i - x0) * (y1 - y0)) / (qreal)numPixel * 100));
     }
 
 #ifdef Q_WS_X11
@@ -128,7 +137,9 @@ QColor ColorPickerWidget::averagePickedColor(const QPoint pos)
 #endif
     m_image = 0;
 
-    int numPixel = (x1 - x0) * (y1 - y0);
+    if (size > 200)
+        emit displayMessage(i18n("Calculated average color for rectangle."), -1);
+
     return QColor(sumR / numPixel, sumG / numPixel, sumB / numPixel);
 }
 
index dedaa8c3ad5424c4467888e43913abb91e4d6b78..ed2a73c06f9c80b6a763482cdb9bd89937526f23 100644 (file)
@@ -82,6 +82,7 @@ private slots:
 
 signals:
     void colorPicked(QColor);
+    void displayMessage(const QString&, int);
 };
 
 #endif
index c99f45da810bd82f21ba5a84847f8e14f10663fa..3e484e012785359b03704ebfb03cd21e49d65b0e 100644 (file)
@@ -287,6 +287,7 @@ void EffectStackEdit::transferParamDesc(const QDomElement d, int pos, int in, in
             ChooseColorWidget *choosecolor = new ChooseColorWidget(paramName, QColor(value.toUInt(&ok, 16)), this);
             m_vbox->addWidget(choosecolor);
             m_valueItems[paramName] = choosecolor;
+            connect(choosecolor, SIGNAL(displayMessage(const QString&, int)), this, SIGNAL(displayMessage(const QString&, int)));
             connect(choosecolor, SIGNAL(modified()) , this, SLOT(collectAllParameters()));
         } else if (type == "position") {
             int pos = value.toInt();
index 6ca2015966304cd4b0437918b940ef8858d60132..6cba4d9b9c75d7c575c9b3e4876ca7d3238fb38c 100644 (file)
@@ -81,6 +81,7 @@ public slots:
 signals:
     void parameterChanged(const QDomElement, const QDomElement);
     void seekTimeline(int);
+    void displayMessage(const QString&, int);
 };
 
 #endif
index 546c09f0c1c7750446a7ea1a72dd494ca48174b5..6e76a5c0b851b6a790c98339df19783d8b6d63d5 100644 (file)
@@ -81,6 +81,7 @@ EffectStackView::EffectStackView(QWidget *parent) :
     connect(m_ui.checkAll, SIGNAL(stateChanged(int)), this, SLOT(slotCheckAll(int)));
     connect(m_effectedit, SIGNAL(parameterChanged(const QDomElement, const QDomElement)), this , SLOT(slotUpdateEffectParams(const QDomElement, const QDomElement)));
     connect(m_effectedit, SIGNAL(seekTimeline(int)), this , SLOT(slotSeekTimeline(int)));
+    connect(m_effectedit, SIGNAL(displayMessage(const QString&, int)), this, SIGNAL(displayMessage(const QString&, int)));
     m_effectLists["audio"] = &MainWindow::audioEffects;
     m_effectLists["video"] = &MainWindow::videoEffects;
     m_effectLists["custom"] = &MainWindow::customEffects;
index 20d2a2440ad40313b30d5cace3813781fd708e43..68311d9346876f6b652453c7e3bcbd05f55bffb7 100644 (file)
@@ -131,6 +131,7 @@ signals:
     void seekTimeline(int);
     /** The region effect for current effect was changed */
     void updateClipRegion(ClipItem*, int, QString);
+    void displayMessage(const QString&, int);
 };
 
 #endif
index fb8fada7037f6391f4ccf07d3f3ec03a55cb1188..78b22affe28d352b5d1577df6f71f7f3b5d9ab4f 100644 (file)
@@ -2099,6 +2099,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc)   //cha
             disconnect(m_effectStack, SIGNAL(changeEffectPosition(ClipItem*, int, int)), m_activeTimeline->projectView(), SLOT(slotChangeEffectPosition(ClipItem*, int, int)));
             disconnect(m_effectStack, SIGNAL(refreshEffectStack(ClipItem*)), m_activeTimeline->projectView(), SLOT(slotRefreshEffects(ClipItem*)));
             disconnect(m_effectStack, SIGNAL(reloadEffects()), this, SLOT(slotReloadEffects()));
+            disconnect(m_effectStack, SIGNAL(displayMessage(const QString&, int)), this, SLOT(slotGotProgressInfo(const QString&, int)));
             disconnect(m_transitionConfig, SIGNAL(transitionUpdated(Transition *, QDomElement)), m_activeTimeline->projectView() , SLOT(slotTransitionUpdated(Transition *, QDomElement)));
             disconnect(m_transitionConfig, SIGNAL(seekTimeline(int)), m_activeTimeline->projectView() , SLOT(setCursorPos(int)));
             disconnect(m_activeTimeline->projectView(), SIGNAL(activateDocumentMonitor()), m_projectMonitor, SLOT(activateMonitor()));
@@ -2182,6 +2183,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc)   //cha
     connect(m_transitionConfig, SIGNAL(seekTimeline(int)), trackView->projectView() , SLOT(setCursorPos(int)));
     connect(m_effectStack, SIGNAL(seekTimeline(int)), trackView->projectView() , SLOT(setCursorPos(int)));
     connect(m_effectStack, SIGNAL(reloadEffects()), this, SLOT(slotReloadEffects()));
+    connect(m_effectStack, SIGNAL(displayMessage(const QString&, int)), this, SLOT(slotGotProgressInfo(const QString&, int)));
 
     connect(trackView->projectView(), SIGNAL(activateDocumentMonitor()), m_projectMonitor, SLOT(activateMonitor()));
     connect(trackView, SIGNAL(zoneMoved(int, int)), this, SLOT(slotZoneMoved(int, int)));