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