commit 6145cb798d8744f0813d77231cf40f327c4169c7
Author: Juergen Spitzmueller <[email protected]>
Date:   Sat Dec 22 18:44:58 2018 +0100

    Allow to restore default UI colors in prefs
    
    Patch by Daniel Ramöller (racoon), with slight modifications of mine.
    
    Fixes: #10062
    
    (cherry picked from commit 81e4f8dfb610ae8e6a5cc79a869030b229587b26
    with minor adaptations)
---
 src/frontends/qt4/GuiPrefs.cpp       |  126 +++++++++++++++++++++++++++++++---
 src/frontends/qt4/GuiPrefs.h         |   11 +++
 src/frontends/qt4/ui/PrefColorsUi.ui |   58 ++++++++++------
 status.23x                           |    3 +
 4 files changed, 165 insertions(+), 33 deletions(-)

diff --git a/src/frontends/qt4/GuiPrefs.cpp b/src/frontends/qt4/GuiPrefs.cpp
index 8e4dbcd..58810df 100644
--- a/src/frontends/qt4/GuiPrefs.cpp
+++ b/src/frontends/qt4/GuiPrefs.cpp
@@ -1230,6 +1230,10 @@ PrefColors::PrefColors(GuiPreferences * form)
 
        connect(colorChangePB, SIGNAL(clicked()),
                this, SLOT(changeColor()));
+       connect(colorResetPB, SIGNAL(clicked()),
+               this, SLOT(resetColor()));
+       connect(colorResetAllPB, SIGNAL(clicked()),
+               this, SLOT(resetAllColor()));
        connect(lyxObjectsLW, SIGNAL(itemSelectionChanged()),
                this, SLOT(changeLyxObjectsSelection()));
        connect(lyxObjectsLW, SIGNAL(itemActivated(QListWidgetItem*)),
@@ -1257,15 +1261,17 @@ void PrefColors::applyRC(LyXRC & rc) const
 
 void PrefColors::updateRC(LyXRC const & rc)
 {
-       for (unsigned int i = 0; i < lcolors_.size(); ++i) {
+       for (size_type i = 0; i < lcolors_.size(); ++i) {
                QColor color = QColor(guiApp->colorCache().get(lcolors_[i], 
false));
                QPixmap coloritem(32, 32);
                coloritem.fill(color);
-               lyxObjectsLW->item(i)->setIcon(QIcon(coloritem));
+               lyxObjectsLW->item(int(i))->setIcon(QIcon(coloritem));
                newcolors_[i] = curcolors_[i] = color.name();
        }
        syscolorsCB->setChecked(rc.use_system_colors);
        changeLyxObjectsSelection();
+
+       setDisabledResets();
 }
 
 
@@ -1277,25 +1283,115 @@ void PrefColors::changeColor()
        if (row < 0)
                return;
 
-       QString const color = newcolors_[row];
-       QColor c = QColorDialog::getColor(QColor(color), qApp->focusWidget());
+       QString const color = newcolors_[size_t(row)];
+       QColor const c = QColorDialog::getColor(QColor(color), 
qApp->focusWidget());
 
-       if (c.isValid() && c.name() != color) {
-               newcolors_[row] = c.name();
-               QPixmap coloritem(32, 32);
-               coloritem.fill(c);
-               lyxObjectsLW->currentItem()->setIcon(QIcon(coloritem));
+       if (setColor(row, c, color)) {
+               setDisabledResets();
                // emit signal
                changed();
        }
 }
 
+
+void PrefColors::resetColor()
+{
+       int const row = lyxObjectsLW->currentRow();
+
+       // just to be sure
+       if (row < 0)
+               return;
+
+       QString const color = newcolors_[size_t(row)];
+       QColor const c = getDefaultColorByRow(row);
+
+       if (setColor(row, c, color)) {
+               setDisabledResets();
+               // emit signal
+               changed();
+       }
+}
+
+
+void PrefColors::resetAllColor()
+{
+       bool isChanged = false;
+
+       colorResetAllPB->setDisabled(true);
+
+       for (int irow = 0, count = lyxObjectsLW->count(); irow < count; ++irow) 
{
+               QString const color = newcolors_[size_t(irow)];
+               QColor const c = getDefaultColorByRow(irow);
+
+               if (setColor(irow, c, color))
+                       isChanged = true;
+       }
+
+       if (isChanged) {
+               setDisabledResets();
+               // emit signal
+               changed();
+       }
+}
+
+
+bool PrefColors::setColor(int const row, QColor const new_color,
+                         QString const old_color)
+{
+       if (new_color.isValid() && new_color.name() != old_color) {
+               newcolors_[size_t(row)] = new_color.name();
+               QPixmap coloritem(32, 32);
+               coloritem.fill(new_color);
+               lyxObjectsLW->item(row)->setIcon(QIcon(coloritem));
+               return true;
+       }
+       return false;
+}
+
+
+void PrefColors::setDisabledResets()
+{
+       int const row = lyxObjectsLW->currentRow();
+       // set disable reset buttons ...
+       if (row >= 0)
+               colorResetPB->setDisabled(isDefaultColor(row, 
newcolors_[size_t(row)]));
+
+       colorResetAllPB->setDisabled(true);
+
+       // ... in between process qt events to give quicker visual feedback to 
the user ...
+       guiApp->processEvents();
+
+       // ... set disable Reset All button
+       for (int irow = 0, count = lyxObjectsLW->count(); irow < count; ++irow) 
{
+               if (!isDefaultColor(irow, newcolors_[size_t(irow)])) {
+                       colorResetAllPB->setDisabled(false);
+                       // the break condition might hide performance issues
+                       // if a non-default color is at the top of the list
+                       break;
+               }
+       }
+}
+
+
+bool PrefColors::isDefaultColor(int const row, QString const color)
+{
+       return color == getDefaultColorByRow(row).name();
+}
+
+
+QColor PrefColors::getDefaultColorByRow(int const row)
+{
+       ColorSet const defaultcolor;
+       return defaultcolor.getX11Name(lcolors_[size_t(row)]).c_str();
+}
+
+
 void PrefColors::changeSysColor()
 {
        for (int row = 0 ; row < lyxObjectsLW->count() ; ++row) {
                // skip colors that are taken from system palette
                bool const disable = syscolorsCB->isChecked()
-                       && guiApp->colorCache().isSystem(lcolors_[row]);
+                       && guiApp->colorCache().isSystem(lcolors_[size_t(row)]);
 
                QListWidgetItem * const item = lyxObjectsLW->item(row);
                Qt::ItemFlags const flags = item->flags();
@@ -1307,9 +1403,17 @@ void PrefColors::changeSysColor()
        }
 }
 
+
 void PrefColors::changeLyxObjectsSelection()
 {
-       colorChangePB->setDisabled(lyxObjectsLW->currentRow() < 0);
+       int currentRow = lyxObjectsLW->currentRow();
+       colorChangePB->setDisabled(currentRow < 0);
+
+       if (currentRow < 0)
+               colorResetPB->setDisabled(true);
+       else
+               colorResetPB->setDisabled(
+                       isDefaultColor(currentRow, 
newcolors_[size_t(currentRow)]));
 }
 
 
diff --git a/src/frontends/qt4/GuiPrefs.h b/src/frontends/qt4/GuiPrefs.h
index 8f43a37..b36f2e6 100644
--- a/src/frontends/qt4/GuiPrefs.h
+++ b/src/frontends/qt4/GuiPrefs.h
@@ -259,12 +259,23 @@ public:
 
 private Q_SLOTS:
        void changeColor();
+       void resetColor();
+       void resetAllColor();
        void changeSysColor();
        void changeLyxObjectsSelection();
+       bool setColor(int const row, QColor const new_color,
+                     QString const old_color);
+       bool isDefaultColor(int const row, QString const color);
+       void setDisabledResets();
 
 private:
+       ///
+       QColor getDefaultColorByRow(int const row);
+       ///
        std::vector<ColorCode> lcolors_;
+       ///
        std::vector<QString> curcolors_;
+       ///
        std::vector<QString> newcolors_;
 };
 
diff --git a/src/frontends/qt4/ui/PrefColorsUi.ui 
b/src/frontends/qt4/ui/PrefColorsUi.ui
index e7c89c2..7ce2248 100644
--- a/src/frontends/qt4/ui/PrefColorsUi.ui
+++ b/src/frontends/qt4/ui/PrefColorsUi.ui
@@ -1,3 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
  <class>PrefColorsUi</class>
  <widget class="QWidget" name="PrefColorsUi">
@@ -5,7 +6,7 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>339</width>
+    <width>397</width>
     <height>254</height>
    </rect>
   </property>
@@ -19,9 +20,19 @@
    <string/>
   </property>
   <layout class="QGridLayout" name="gridLayout_2">
+   <item row="1" column="0">
+    <widget class="QCheckBox" name="syscolorsCB">
+     <property name="toolTip">
+      <string>Use the color scheme of your Operating System/Desktop 
Environment</string>
+     </property>
+     <property name="text">
+      <string>&amp;Use system colors</string>
+     </property>
+    </widget>
+   </item>
    <item row="0" column="0" colspan="2">
     <layout class="QGridLayout" name="gridLayout">
-     <item row="0" column="0" rowspan="2">
+     <item row="0" column="0" rowspan="5">
       <widget class="QListWidget" name="lyxObjectsLW">
        <property name="sizePolicy">
         <sizepolicy hsizetype="MinimumExpanding" vsizetype="Expanding">
@@ -42,12 +53,35 @@
          <verstretch>0</verstretch>
         </sizepolicy>
        </property>
+       <property name="toolTip">
+        <string>Change the selected color</string>
+       </property>
        <property name="text">
         <string>A&amp;lter...</string>
        </property>
       </widget>
      </item>
      <item row="1" column="1">
+      <widget class="QPushButton" name="colorResetPB">
+       <property name="toolTip">
+        <string>Reset the selected color to its original value</string>
+       </property>
+       <property name="text">
+        <string>Reset to &amp;Default</string>
+       </property>
+      </widget>
+     </item>
+     <item row="4" column="1">
+      <widget class="QPushButton" name="colorResetAllPB">
+       <property name="toolTip">
+        <string>Reset all colors to their original value</string>
+       </property>
+       <property name="text">
+        <string>Reset A&amp;ll</string>
+       </property>
+      </widget>
+     </item>
+     <item row="3" column="1">
       <spacer>
        <property name="orientation">
         <enum>Qt::Vertical</enum>
@@ -62,26 +96,6 @@
      </item>
     </layout>
    </item>
-   <item row="0" column="2">
-    <spacer name="horizontalSpacer_2">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>40</width>
-       <height>20</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item row="1" column="0">
-    <widget class="QCheckBox" name="syscolorsCB">
-     <property name="text">
-      <string>&amp;Use system colors</string>
-     </property>
-    </widget>
-   </item>
    <item row="1" column="1">
     <spacer name="horizontalSpacer">
      <property name="orientation">
diff --git a/status.23x b/status.23x
index 6ee0c6f..26cb697 100644
--- a/status.23x
+++ b/status.23x
@@ -37,6 +37,9 @@ What's new
 - Add "Reset" and "Reset All Fields" buttons to Text Properties
   dialog (bug 11415).
 
+- Add "Reset to Default" and "Reset All" buttons to Color Preferences
+  (bug 10062).
+
 - Insert new graphics inset on the correct cursor position.
 
 - Fix regression where spaces are disappearing when editing text (bug 11412).

Reply via email to