File indexing completed on 2025-02-16 04:01:38

0001 /*
0002  * SPDX-FileCopyrightText: 2019-2023 Mattia Basaglia <dev@dragon.best>
0003  *
0004  * SPDX-License-Identifier: GPL-3.0-or-later
0005  */
0006 
0007 #include "widget_palette_editor.hpp"
0008 #include "ui_widget_palette_editor.h"
0009 
0010 #include <QApplication>
0011 #include <QEvent>
0012 #include <QInputDialog>
0013 #include <QStyleFactory>
0014 
0015 #ifndef WITHOUT_QT_COLOR_WIDGETS
0016 #include <QtColorWidgets/ColorDelegate>
0017 #endif
0018 
0019 #include "app/settings/palette_settings.hpp"
0020 
0021 class WidgetPaletteEditor::Private
0022 {
0023 public:
0024     enum Roles
0025     {
0026         ColorRole = Qt::UserRole,
0027         ColorGroup
0028     };
0029 
0030     void refresh_custom()
0031     {
0032         ui.palette_view->blockSignals(true);
0033         ui.palette_view->clearContents();
0034 
0035         int i = 0;
0036         for ( const auto& p : app::settings::PaletteSettings::roles() )
0037         {
0038             ui.palette_view->setItem(i, 0, color_item(edited, p.second, QPalette::Active));
0039             ui.palette_view->setItem(i, 1, color_item(edited, p.second, QPalette::Disabled));
0040 
0041             ++i;
0042         }
0043         ui.palette_view->blockSignals(false);
0044     }
0045 
0046     QTableWidgetItem* color_item(const QPalette& palette, QPalette::ColorRole role, QPalette::ColorGroup group)
0047     {
0048         auto item = new QTableWidgetItem();
0049         QColor color = palette.color(group, role);
0050         item->setData(Qt::DisplayRole, color);
0051         item->setData(Qt::EditRole, color);
0052         item->setData(ColorRole, role);
0053         item->setData(ColorGroup, group);
0054         return item;
0055     }
0056 
0057     void setup_view()
0058     {
0059         ui.palette_view->blockSignals(true);
0060         ui.palette_view->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
0061 #ifndef WITHOUT_QT_COLOR_WIDGETS
0062         ui.palette_view->setItemDelegateForColumn(0, &delegate);
0063         ui.palette_view->setItemDelegateForColumn(1, &delegate);
0064 #endif
0065         int i = 0;
0066         for ( const auto& p : app::settings::PaletteSettings::roles() )
0067         {
0068             ui.palette_view->setRowCount(i+1);
0069             ui.palette_view->setVerticalHeaderItem(i, new QTableWidgetItem(p.first));
0070 
0071             ui.palette_view->setItem(i, 0, color_item(settings->default_palette, p.second, QPalette::Active));
0072             ui.palette_view->setItem(i, 1, color_item(settings->default_palette, p.second, QPalette::Disabled));
0073 
0074             ++i;
0075         }
0076         ui.palette_view->blockSignals(false);
0077     }
0078 
0079     void add_palette(QString name_hint)
0080     {
0081         if ( name_hint.isEmpty() )
0082             name_hint = tr("Custom");
0083 
0084         QString name = name_hint;
0085         for ( int i = 1; settings->palettes.contains(name); i++ )
0086             name = tr("%1 %2").arg(name_hint).arg(i);
0087 
0088         settings->palettes[name] = edited;
0089         ui.combo_saved->addItem(name);
0090         ui.combo_saved->setCurrentText(name);
0091     }
0092 
0093     bool use_default()
0094     {
0095         return ui.combo_saved->currentIndex() == 0;
0096     }
0097 
0098     bool use_built_in()
0099     {
0100         return ui.combo_saved->currentData().toBool();
0101     }
0102 
0103     void apply_style(QStyle* style)
0104     {
0105         ui.preview_widget->setStyle(style);
0106         for ( auto wid : ui.preview_widget->findChildren<QWidget*>() )
0107             wid->setStyle(style);
0108     }
0109 
0110     app::settings::PaletteSettings* settings;
0111 
0112     Ui::WidgetPaletteEditor ui;
0113 #ifndef WITHOUT_QT_COLOR_WIDGETS
0114     color_widgets::ColorDelegate delegate;
0115 #endif
0116     QPalette edited;
0117     QStyle* style = nullptr;
0118 };
0119 
0120 WidgetPaletteEditor::WidgetPaletteEditor ( app::settings::PaletteSettings* settings, QWidget* parent )
0121     : QWidget ( parent ), d ( std::make_unique<Private>() )
0122 {
0123     d->settings = settings;
0124     d->ui.setupUi ( this );
0125     d->setup_view();
0126     d->edited = settings->default_palette;
0127 
0128     d->ui.combo_saved->setItemData(0, true);
0129     for ( auto name : settings->palettes.keys() )
0130     {
0131         d->ui.combo_saved->addItem(name, settings->palettes[name].built_in);
0132     }
0133 
0134     if ( settings->palettes.find(settings->selected) != settings->palettes.end() )
0135         d->ui.combo_saved->setCurrentText(settings->selected);
0136 
0137     for ( const auto& style : QStyleFactory::keys() )
0138         d->ui.combo_style->addItem(style);
0139 
0140     if ( !d->settings->style.isEmpty() )
0141         d->ui.combo_style->setCurrentText(d->settings->style);
0142 
0143     connect(d->ui.combo_style, &QComboBox::currentTextChanged, this, [this](const QString& name){
0144         auto old_style = d->style;
0145         d->style = QStyleFactory::create(name);
0146         d->apply_style(d->style);
0147         if ( old_style )
0148             delete old_style;
0149     });
0150 
0151 }
0152 
0153 WidgetPaletteEditor::~WidgetPaletteEditor()
0154 {
0155     if ( d->style )
0156         delete d->style;
0157 }
0158 
0159 void WidgetPaletteEditor::changeEvent ( QEvent* e )
0160 {
0161     QWidget::changeEvent ( e );
0162 
0163     if ( e->type() == QEvent::LanguageChange ) {
0164         d->ui.retranslateUi ( this );
0165     }
0166 }
0167 
0168 void WidgetPaletteEditor::update_color ( int row, int column )
0169 {
0170     auto item = d->ui.palette_view->item(row, column);
0171     if ( !item )
0172         return;
0173 
0174     auto group = item->data(Private::ColorGroup).value<QPalette::ColorGroup>();
0175     auto role = item->data(Private::ColorRole).value<QPalette::ColorRole>();
0176     auto color = item->data(Qt::DisplayRole).value<QColor>();
0177 
0178     d->edited.setColor(group, role, color);
0179 
0180     if ( group == QPalette::Active )
0181         d->edited.setColor(QPalette::Inactive, role, color);
0182 
0183     d->ui.preview_widget->setPalette(d->edited);
0184 
0185     if ( d->use_built_in() )
0186         d->add_palette({});
0187 }
0188 
0189 void WidgetPaletteEditor::select_palette(const QString& name)
0190 {
0191     if ( d->use_default() )
0192         d->edited = d->settings->default_palette;
0193     else
0194         d->edited = d->settings->palettes[name];
0195 
0196     d->refresh_custom();
0197     d->ui.preview_widget->setPalette(d->edited);
0198 }
0199 
0200 void WidgetPaletteEditor::add_palette()
0201 {
0202     bool ok = false;
0203     QString default_name = d->ui.combo_saved->currentText();
0204     if ( d->use_default() )
0205         default_name = tr("Custom");
0206 
0207     QString name_hint = QInputDialog::getText(
0208         this,
0209         tr("Add Theme"),
0210         tr("Name"),
0211         QLineEdit::Normal,
0212         default_name.isEmpty() ? tr("Custom") : default_name,
0213         &ok
0214     );
0215 
0216     if ( !ok )
0217         return;
0218 
0219     d->add_palette(name_hint);
0220 }
0221 
0222 void WidgetPaletteEditor::apply_palette()
0223 {
0224     if ( d->use_default() )
0225     {
0226         d->settings->set_selected("");
0227     }
0228     else
0229     {
0230         QString name = d->ui.combo_saved->currentText();
0231         d->settings->palettes[name] = d->edited;
0232         d->settings->set_selected(name);
0233     }
0234 
0235     d->settings->set_style(d->ui.combo_style->currentText());
0236 }
0237 
0238 void WidgetPaletteEditor::remove_palette()
0239 {
0240     if ( !d->use_built_in() )
0241     {
0242         d->settings->palettes.remove(d->ui.combo_saved->currentText());
0243         d->ui.combo_saved->removeItem(d->ui.combo_saved->currentIndex());
0244     }
0245 }
0246