author | sandman <sandman> | 2002-09-21 01:37:32 (UTC) |
---|---|---|
committer | sandman <sandman> | 2002-09-21 01:37:32 (UTC) |
commit | 4b0a34a494dbea653b79a945b8c59ee0be62ac75 (patch) (side-by-side diff) | |
tree | 7b9e091423487ed7e4c590b340b84b9ad9d81f44 | |
parent | 1a8d7cd34db3b9f443bcb956f85c41336a60e948 (diff) | |
download | opie-4b0a34a494dbea653b79a945b8c59ee0be62ac75.zip opie-4b0a34a494dbea653b79a945b8c59ee0be62ac75.tar.gz opie-4b0a34a494dbea653b79a945b8c59ee0be62ac75.tar.bz2 |
- Improved style and color preview
- color schemes can be editied now
-rw-r--r-- | noncore/settings/appearance2/appearance.cpp | 105 | ||||
-rw-r--r-- | noncore/settings/appearance2/colorlistitem.h | 95 | ||||
-rw-r--r-- | noncore/settings/appearance2/editScheme.cpp | 10 | ||||
-rw-r--r-- | noncore/settings/appearance2/editScheme.h | 8 | ||||
-rw-r--r-- | noncore/settings/appearance2/sample.cpp | 11 |
5 files changed, 152 insertions, 77 deletions
diff --git a/noncore/settings/appearance2/appearance.cpp b/noncore/settings/appearance2/appearance.cpp index 52c7125..cf3069e 100644 --- a/noncore/settings/appearance2/appearance.cpp +++ b/noncore/settings/appearance2/appearance.cpp @@ -1,729 +1,708 @@ /********************************************************************** ** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. ** ** This file is part of the Qtopia Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** *********************************************************************** ** ** Enhancements by: Dan Williams, <williamsdr@acm.org> ** **********************************************************************/ #include "appearance.h" #include "editScheme.h" #include <opie/ofiledialog.h> #include <opie/otabwidget.h> #include <qpe/applnk.h> #include <qpe/config.h> #include <qpe/global.h> #include <qpe/resource.h> #include <qpe/qpeapplication.h> #if defined(Q_WS_QWS) && !defined(QT_NO_COP) #include <qpe/qcopenvelope_qws.h> #endif #include <qaction.h> #include <qbuttongroup.h> #include <qcheckbox.h> #include <qcombobox.h> #include <qdialog.h> #include <qdir.h> #include <qlabel.h> #include <qlayout.h> #include <qlineedit.h> #include <qlistbox.h> #include <qmessagebox.h> #include <qmultilineedit.h> #include <qpopupmenu.h> #include <qpushbutton.h> #include <qradiobutton.h> #if QT_VERSION >= 300 #include <qstylefactory.h> #else #include <qwindowsstyle.h> #include <qpe/qpestyle.h> #include <qpe/lightstyle.h> #include <qpe/qlibrary.h> #include <qpe/styleinterface.h> #endif #include <qtabwidget.h> #include <qtoolbutton.h> #include <qvgroupbox.h> #include <qwidget.h> #include "stylelistitem.h" #include "decolistitem.h" #include "fontlistitem.h" #include "colorlistitem.h" #include "sample.h" static int findItemCB ( QComboBox *box, const QString &str ) { for ( int i = 0; i < box-> count ( ); i++ ) { if ( box-> text ( i ) == str ) return i; } return -1; } class DefaultWindowDecoration : public WindowDecorationInterface { public: DefaultWindowDecoration() : ref(0) {} QString name() const { return "Default"; } QPixmap icon() const { return QPixmap(); } QRESULT queryInterface( const QUuid &uuid, QUnknownInterface **iface ) { *iface = 0; if ( uuid == IID_QUnknown ) *iface = this; else if ( uuid == IID_WindowDecoration ) *iface = this; if ( *iface ) (*iface)->addRef(); return QS_OK; } Q_REFCOUNT private: ulong ref; }; -struct { - QColorGroup::ColorRole role; - const char *key; - const char *def; -} colorLUT [] = { - { QColorGroup::Base, "Base", "#FFFFFF" }, - { QColorGroup::Background, "Background", "#E5E1D5" }, - { QColorGroup::Button, "Button", "#D6CDBB" }, - { QColorGroup::ButtonText, "ButtonText", "#000000" }, - { QColorGroup::Highlight, "Highlight", "#800000" }, - { QColorGroup::HighlightedText, "HighlightedText", "#FFFFFF" }, - { QColorGroup::Text, "Text", "#000000" }, - - { QColorGroup::NColorRoles, 0, 0 } -}; - void Appearance::loadStyles ( QListBox *list ) { #if QT_VERSION >= 300 list->insertStringList(QStyleFactory::styles()); #else list->insertItem( new StyleListItem ( "Windows", new QWindowsStyle ( ))); list->insertItem( new StyleListItem ( "Light", new LightStyle ( ))); #ifndef QT_NO_STYLE_MOTIF list->insertItem( new StyleListItem ( "Motif", new QMotifStyle ( ))); #endif #ifndef QT_NO_STYLE_MOTIFPLUS list->insertItem( new StyleListItem ( "MotifPlus", new QMotifPlusStyle ( ))); #endif #ifndef QT_NO_STYLE_PLATINUM list->insertItem( new StyleListItem ( "Platinum", new QPlatinumStyle ( ))); #endif #endif list->insertItem( new StyleListItem ( "QPE", new QPEStyle ( ))); #if QT_VERSION < 300 { QString path = QPEApplication::qpeDir() + "/plugins/styles/"; QStringList sl = QDir ( path, "lib*.so" ). entryList ( ); for ( QStringList::Iterator it = sl. begin ( ); it != sl. end ( ); ++it ) { QLibrary *lib = new QLibrary ( path + "/" + *it ); StyleInterface *iface; if ( lib-> queryInterface ( IID_Style, (QUnknownInterface **) &iface ) == QS_OK ) list-> insertItem ( new StyleListItem ( lib, iface )); else delete lib; } } #endif } void Appearance::loadDecos ( QListBox *list ) { list-> insertItem ( new DecoListItem ( tr( "Default" ))); { QString path = QPEApplication::qpeDir() + "/plugins/decorations/"; QStringList sl = QDir ( path, "lib*.so" ). entryList ( ); for ( QStringList::Iterator it = sl. begin ( ); it != sl. end ( ); ++it ) { QLibrary *lib = new QLibrary ( path + "/" + *it ); WindowDecorationInterface *iface; if ( lib-> queryInterface ( IID_WindowDecoration, (QUnknownInterface **) &iface ) == QS_OK ) list-> insertItem ( new DecoListItem ( lib, iface )); else delete lib; } } } -static QPalette readColorPalette ( Config &config ) -{ - QColor bgcolor( config. readEntry( "Background", "#E5E1D5" ) ); - QColor btncolor( config. readEntry( "Button", "#D6CDBB" ) ); - QPalette pal( btncolor, bgcolor ); - - QString color = config. readEntry( "Highlight", "#800000" ); - pal.setColor( QColorGroup::Highlight, QColor(color) ); - color = config. readEntry( "HighlightedText", "#FFFFFF" ); - pal.setColor( QColorGroup::HighlightedText, QColor(color) ); - color = config. readEntry( "Text", "#000000" ); - pal.setColor( QColorGroup::Text, QColor(color) ); - color = config. readEntry( "ButtonText", "#000000" ); - pal.setColor( QPalette::Active, QColorGroup::ButtonText, QColor(color) ); - color = config. readEntry( "Base", "#FFFFFF" ); - pal.setColor( QColorGroup::Base, QColor(color) ); - - pal.setColor( QPalette::Disabled, QColorGroup::Text, pal.color(QPalette::Active, QColorGroup::Background).dark() ); - - return pal; -} - void Appearance::loadColors ( QListBox *list ) { list-> clear ( ); { Config config ( "qpe" ); config. setGroup ( "Appearance" ); - list-> insertItem ( new ColorListItem ( tr( "Current scheme" ), readColorPalette ( config ))); + list-> insertItem ( new ColorListItem ( tr( "Current scheme" ), config )); } QString path = QPEApplication::qpeDir ( ) + "/etc/colors/"; QStringList sl = QDir ( path ). entryList ( "*.scheme" ); for ( QStringList::Iterator it = sl. begin ( ); it != sl. end ( ); ++it ) { QString name = (*it). left ((*it). find ( ".scheme" )); Config config ( path + *it, Config::File ); config. setGroup ( "Colors" ); - list-> insertItem ( new ColorListItem ( name, readColorPalette ( config ))); + list-> insertItem ( new ColorListItem ( name, config )); } } void Appearance::loadFonts ( QListBox *list ) { FontDatabase fd; QStringList f = fd. families ( ); for ( QStringList::ConstIterator it = f. begin ( ); it != f. end ( ); ++it ) list-> insertItem ( new FontListItem ( *it, fd. styles ( *it ), fd. pointSizes ( *it ))); } QWidget *Appearance::createStyleTab ( QWidget *parent ) { Config config ( "qpe" ); config. setGroup ( "Appearance" ); QWidget* tab = new QWidget( parent, "StyleTab" ); QVBoxLayout* vertLayout = new QVBoxLayout( tab, 4, 4 ); m_style_list = new QListBox( tab, "m_style_list" ); vertLayout->addWidget( m_style_list ); m_style_settings = new QPushButton ( tr( "Settings..." ), tab ); connect ( m_style_settings, SIGNAL( clicked ( )), this, SLOT( styleSettingsClicked ( ))); vertLayout-> addWidget ( m_style_settings ); loadStyles ( m_style_list ); QString s = config. readEntry ( "Style", "Light" ); m_style_list-> setCurrentItem ( m_style_list-> findItem ( s )); m_original_style = m_style_list-> currentItem ( ); styleClicked ( m_original_style ); connect( m_style_list, SIGNAL( highlighted( int ) ), this, SLOT( styleClicked( int ) ) ); return tab; } QWidget *Appearance::createDecoTab ( QWidget *parent ) { Config config ( "qpe" ); config. setGroup ( "Appearance" ); QWidget* tab = new QWidget( parent, "DecoTab" ); QVBoxLayout* vertLayout = new QVBoxLayout( tab, 4, 4 ); m_deco_list = new QListBox( tab, "m_deco_list" ); vertLayout->addWidget( m_deco_list ); loadDecos ( m_deco_list ); QString s = config. readEntry ( "Decoration" ); m_deco_list-> setCurrentItem ( m_deco_list-> findItem ( s )); m_original_deco = m_deco_list-> currentItem ( ); if ( m_deco_list-> currentItem ( ) < 0 ) m_deco_list-> setCurrentItem ( 0 ); decoClicked ( m_original_deco ); connect( m_deco_list, SIGNAL( highlighted( int ) ), this, SLOT( decoClicked( int ) ) ); return tab; } QWidget *Appearance::createFontTab ( QWidget *parent ) { Config config ( "qpe" ); config. setGroup ( "Appearance" ); QWidget *tab = new QWidget( parent, "FontTab" ); QGridLayout *gridLayout = new QGridLayout ( tab, 0, 0, 4, 4 ); gridLayout->setRowStretch ( 4, 10 ); m_font_family_list = new QListBox( tab, "FontListBox" ); gridLayout->addMultiCellWidget( m_font_family_list, 0, 4, 0, 0 ); connect( m_font_family_list, SIGNAL( highlighted( int ) ), this, SLOT( fontFamilyClicked( int ) ) ); QLabel *label = new QLabel( tr( "Style" ), tab ); gridLayout->addWidget( label, 0, 1 ); m_font_style_list = new QComboBox( tab, "StyleListBox" ); connect( m_font_style_list, SIGNAL( activated( int ) ), this, SLOT( fontStyleClicked( int ) ) ); gridLayout->addWidget( m_font_style_list, 1, 1 ); label = new QLabel( tr( "Size" ), tab ); gridLayout->addWidget( label, 2, 1 ); m_font_size_list = new QComboBox( tab, "SizeListBox" ); connect( m_font_size_list, SIGNAL( activated( int ) ), this, SLOT( fontSizeClicked( int ) ) ); gridLayout->addWidget( m_font_size_list, 3, 1 ); loadFonts ( m_font_family_list ); QString familyStr = config.readEntry( "FontFamily", "Helvetica" ); QString styleStr = config.readEntry( "FontStyle", "Regular" ); QString sizeStr = config.readEntry( "FontSize", "10" ); m_font_family_list-> setCurrentItem ( m_font_family_list-> findItem ( familyStr )); m_original_fontfamily = m_font_family_list-> currentItem ( ); if ( m_font_family_list-> currentItem ( ) < 0 ) m_font_family_list-> setCurrentItem ( 0 ); fontFamilyClicked ( m_original_fontfamily ); m_font_style_list-> setCurrentItem ( findItemCB ( m_font_style_list, styleStr )); m_original_fontstyle = m_font_style_list-> currentItem ( ); fontStyleClicked ( m_original_fontstyle ); m_font_size_list-> setCurrentItem ( findItemCB ( m_font_size_list, sizeStr )); m_original_fontsize = m_font_size_list-> currentItem ( ); fontSizeClicked ( m_original_fontsize ); return tab; } QWidget *Appearance::createColorTab ( QWidget *parent ) { Config config ( "qpe" ); config. setGroup ( "Appearance" ); QWidget *tab = new QWidget( parent, "ColorTab" ); QGridLayout *gridLayout = new QGridLayout( tab, 0, 0, 4, 4 ); gridLayout->setRowStretch ( 3, 10 ); m_color_list = new QListBox ( tab ); gridLayout->addMultiCellWidget ( m_color_list, 0, 3, 0, 0 ); connect( m_color_list, SIGNAL( highlighted( int ) ), this, SLOT( colorClicked( int ) ) ); loadColors ( m_color_list ); m_color_list-> setCurrentItem ( 0 ); QPushButton* tempButton = new QPushButton( tab, "editSchemeButton" ); tempButton->setText( tr( "Edit..." ) ); connect( tempButton, SIGNAL( clicked() ), this, SLOT( editSchemeClicked() ) ); gridLayout->addWidget( tempButton, 0, 1 ); tempButton = new QPushButton( tab, "deleteSchemeButton" ); tempButton->setText( tr( "Delete" ) ); connect( tempButton, SIGNAL( clicked() ), this, SLOT( deleteSchemeClicked() ) ); gridLayout->addWidget( tempButton, 1, 1 ); tempButton = new QPushButton( tab, "saveSchemeButton" ); tempButton->setText( tr( "Save" ) ); connect( tempButton, SIGNAL( clicked() ), this, SLOT( saveSchemeClicked() ) ); gridLayout->addWidget( tempButton, 2, 1 ); return tab; } QWidget *Appearance::createGuiTab ( QWidget *parent ) { Config config ( "qpe" ); config. setGroup ( "Appearance" ); QWidget *tab = new QWidget( parent, "AdvancedTab" ); QVBoxLayout *vertLayout = new QVBoxLayout( tab, 4, 4 ); QGridLayout* gridLayout = new QGridLayout ( vertLayout ); int style = config. readNumEntry ( "TabStyle", 2 ); QLabel* label = new QLabel( tr( "Tab style:" ), tab ); gridLayout-> addWidget ( label, 0, 0 ); QButtonGroup* btngrp = new QButtonGroup( tab, "buttongroup" ); btngrp-> hide ( ); btngrp-> setExclusive ( true ); m_tabstyle_list = new QComboBox ( false, tab, "tabstyle" ); m_tabstyle_list-> insertItem ( tr( "Tabs" )); m_tabstyle_list-> insertItem ( tr( "Tabs w/icons" )); m_tabstyle_list-> insertItem ( tr( "Drop down list" )); m_tabstyle_list-> insertItem ( tr( "Drop down list w/icons" )); m_tabstyle_list-> setCurrentItem ( style & 0xff ); gridLayout-> addMultiCellWidget ( m_tabstyle_list, 0, 0, 1, 2 ); m_tabstyle_top = new QRadioButton( tr( "Top" ), tab, "tabpostop" ); btngrp-> insert ( m_tabstyle_top ); gridLayout-> addWidget( m_tabstyle_top, 1, 1 ); m_tabstyle_bottom = new QRadioButton( tr( "Bottom" ), tab, "tabposbottom" ); btngrp-> insert ( m_tabstyle_top ); gridLayout-> addWidget( m_tabstyle_bottom, 1, 2 ); bool tabtop = ( style & 0xff00 ) == 0; m_tabstyle_top-> setChecked ( tabtop ); m_tabstyle_bottom-> setChecked ( !tabtop ); m_original_tabstyle = style; return tab; } Appearance::Appearance( QWidget* parent, const char* name, WFlags ) : QDialog ( parent, name, true ) { setCaption( tr( "Appearance" ) ); Config config( "qpe" ); config.setGroup( "Appearance" ); QVBoxLayout *top = new QVBoxLayout ( this, 4, 4 ); m_sample = new SampleWindow ( this ); m_sample-> setDecoration ( new DefaultWindowDecoration ( )); OTabWidget* tw = new OTabWidget ( this, "tabwidget", OTabWidget::Global, OTabWidget::Bottom ); QWidget *styletab; tw-> addTab ( styletab = createStyleTab ( tw ), "appearance/styletabicon.png", tr( "Style" )); tw-> addTab ( createFontTab ( tw ), "appearance/fonttabicon.png", tr( "Font" )); tw-> addTab ( createColorTab ( tw ), "appearance/colorstabicon.png", tr( "Colors" ) ); tw-> addTab ( createDecoTab ( tw ), "appearance/styletabicon.png", tr( "Windows" ) ); tw-> addTab ( createGuiTab ( tw ), "appearance/backgroundtabicon.png", tr( "Gui" ) ); top-> addWidget ( tw, 10 ); top-> addWidget ( m_sample, 1 ); tw-> setCurrentTab ( styletab ); } Appearance::~Appearance() { } void Appearance::accept ( ) { Config config("qpe"); config.setGroup( "Appearance" ); int newstyle = m_style_list-> currentItem ( ); int newtabstyle = ( m_tabstyle_list-> currentItem ( ) & 0xff ) | \ ( m_tabstyle_top-> isChecked ( ) ? 0x000 : 0x100 ); int newfontfamily = m_font_family_list-> currentItem ( ); int newfontstyle = m_font_style_list-> currentItem ( ); int newfontsize = m_font_size_list-> currentItem ( ); if ( m_style_changed ) { StyleListItem *item = (StyleListItem *) m_style_list-> item ( newstyle ); if ( item ) config.writeEntry( "Style", item-> key ( )); } if ( newtabstyle != m_original_tabstyle ) { config. writeEntry ( "TabStyle", newtabstyle ); } if ( m_font_changed ) { config.writeEntry( "FontFamily", m_font_family_list-> text ( newfontfamily )); config.writeEntry( "FontStyle", m_font_style_list-> text ( newfontstyle )); config.writeEntry( "FontSize", m_font_size_list-> text ( newfontsize )); } -/* - if ( schemeChanged ) + + if ( m_color_changed ) { - int i; - for ( i = 0; i < MAX_CONTROL; i++ ) - { - config.writeEntry( controlList[i], controlColor[i] ); - } + ColorListItem *item = (ColorListItem *) m_color_list-> item ( m_color_list-> currentItem ( )); + + if ( item ) + item-> save ( config ); } -*/ + config. write ( ); // need to flush the config info first Global::applyStyle ( ); if ( QMessageBox::warning ( this, tr( "Restart" ), tr( "Do you want to restart Opie now?" ), tr( "Yes" ), tr( "No" ), 0, 0, 1 ) == 0 ) { QCopEnvelope e( "QPE/System", "restart()" ); } QDialog::accept ( ); } void Appearance::done ( int r ) { QDialog::done ( r ); close ( ); } void Appearance::styleClicked ( int index ) { StyleListItem *sli = (StyleListItem *) m_style_list-> item ( index ); m_style_settings-> setEnabled ( sli ? sli-> hasSettings ( ) : false ); if ( m_sample && sli && sli-> style ( )) m_sample-> setStyle2 ( sli-> style ( )); m_style_changed |= ( index != m_original_style ); } void Appearance::styleSettingsClicked ( ) { StyleListItem *item = (StyleListItem *) m_style_list-> item ( m_style_list-> currentItem ( )); if ( item && item-> hasSettings ( )) { QDialog *d = new QDialog ( this, "SETTINGS-DLG", true ); QVBoxLayout *vbox = new QVBoxLayout ( d, 4, 0 ); QWidget *w = item-> settings ( d ); if ( w ) { vbox-> addWidget ( w ); d-> setCaption ( w-> caption ( )); d-> showMaximized ( ); bool accepted = ( d-> exec ( ) == QDialog::Accepted ); if ( item-> setSettings ( accepted )) m_style_changed = true; } delete d; } } void Appearance::decoClicked ( int index ) { DecoListItem *dli = (DecoListItem *) m_deco_list-> item ( index ); if ( m_sample ) { if ( dli && dli-> interface ( )) m_sample-> setDecoration ( dli-> interface ( )); else m_sample-> setDecoration ( new DefaultWindowDecoration ( )); } m_deco_changed |= ( index != m_original_deco ); } void Appearance::fontFamilyClicked ( int index ) { QString oldstyle = m_font_style_list-> currentText ( ); QString oldsize = m_font_size_list-> currentText ( ); FontListItem *fli = (FontListItem *) m_font_family_list-> item ( index ); m_font_style_list-> clear ( ); m_font_style_list-> insertStringList ( fli-> styles ( )); m_font_style_list-> setEnabled ( !fli-> styles ( ). isEmpty ( )); int i; i = findItemCB ( m_font_style_list, oldstyle ); if ( i < 0 ) i = findItemCB ( m_font_style_list, "Regular" ); if (( i < 0 ) && ( m_font_style_list-> count ( ) > 0 )) i = 0; if ( i >= 0 ) { m_font_style_list-> setCurrentItem ( i ); fontStyleClicked ( i ); } m_font_size_list-> clear ( ); QValueList<int> sl = fli-> sizes ( ); for ( QValueList<int>::Iterator it = sl. begin ( ); it != sl. end ( ); ++it ) m_font_size_list-> insertItem ( QString::number ( *it )); i = findItemCB ( m_font_size_list, oldsize ); if ( i < 0 ) i = findItemCB ( m_font_size_list, "10" ); if (( i < 0 ) && ( m_font_size_list-> count ( ) > 0 )) i = 0; if ( i >= 0 ) { m_font_size_list-> setCurrentItem ( i ); fontSizeClicked ( i ); } changeText ( ); m_font_changed |= ( index != m_original_fontfamily ); } void Appearance::fontStyleClicked ( int index ) { changeText ( ); m_font_changed |= ( index != m_original_fontstyle ); } void Appearance::fontSizeClicked ( int index ) { changeText ( ); m_font_changed |= ( index != m_original_fontsize ); } void Appearance::changeText ( ) { int ffa = m_font_family_list-> currentItem ( ); int fst = m_font_style_list-> currentItem ( ); int fsi = m_font_size_list-> currentItem ( ); FontListItem *fli = (FontListItem *) m_font_family_list-> item ( ffa ); if ( fli ) { FontDatabase fdb; m_sample-> setFont ( fdb. font ( fli-> family ( ), \ fst >= 0 ? fli-> styles ( ) [fst] : QString::null, \ fsi >= 0 ? fli-> sizes ( ) [fsi] : 10, \ fdb. charSets ( fli-> family ( )) [0] )); } } void Appearance::colorClicked ( int index ) { ColorListItem *item = (ColorListItem *) m_color_list-> item ( index ); if ( item ) m_sample-> setPalette ( item-> palette ( )); m_color_changed |= ( item-> palette ( ) != qApp-> palette ( )); } void Appearance::editSchemeClicked ( ) { ColorListItem *item = (ColorListItem *) m_color_list-> item ( m_color_list-> currentItem ( )); -/* - EditScheme* editdlg = new EditScheme( this, "editScheme", TRUE, 0, - 9, controlLabel, controlColor ); - editdlg->showMaximized(); - if ( editdlg->exec() == QDialog::Accepted ) - { - int i; - for ( i = 0; i < MAX_CONTROL; i++ ) - { - controlColor[i] = editdlg->colorList[i]; + int cnt = 0; + QString controlLabel [QColorGroup::NColorRoles]; + QString controlColor [QColorGroup::NColorRoles]; + + for ( QColorGroup::ColorRole role = (QColorGroup::ColorRole) 0; role != QColorGroup::NColorRoles; ((int) role )++ ) { + QColor col = item-> color ( role ); + + if ( col. isValid ( )) { + controlLabel [cnt] = item-> label ( role ); + controlColor [cnt] = col. name ( ); + + cnt++; + } + } + + EditScheme* editdlg = new EditScheme( this, "editScheme", true, 0, cnt, controlLabel, controlColor ); + editdlg-> showMaximized ( ); + if ( editdlg-> exec ( ) == QDialog::Accepted ) { + ColorListItem *citem = (ColorListItem *) m_color_list-> item ( 0 ); + cnt = 0; + + for ( QColorGroup::ColorRole role = (QColorGroup::ColorRole) 0; role != QColorGroup::NColorRoles; ((int) role )++ ) { + if ( item-> color ( role ). isValid ( )) { + citem-> setColor ( role, QColor ( controlColor [cnt] )); + cnt++; + } } + + m_color_list-> setCurrentItem ( 0 ); + colorClicked ( 0 ); + m_color_changed = true; } delete editdlg; - */ } void Appearance::saveSchemeClicked() { ColorListItem *item = (ColorListItem *) m_color_list-> item ( m_color_list-> currentItem ( )); if ( !item ) return; QDialog *d = new QDialog ( this, 0, true ); d-> setCaption ( tr( "Save Scheme" )); QLineEdit *ed = new QLineEdit ( this ); ( new QVBoxLayout ( d, 4, 4 ))-> addWidget ( ed ); if ( d-> exec ( ) == QDialog::Accepted ) { QString schemename = ed-> text ( ); QFile file ( QPEApplication::qpeDir() + "/etc/colors/" + schemename + ".scheme" ); if ( !file. exists ( )) { QPalette p = item-> palette ( ); Config config ( file.name(), Config::File ); - config.setGroup( "Colors" ); + config. setGroup( "Colors" ); - for ( int i = 0; colorLUT [i]. role != QColorGroup::NColorRoles; i++ ) - config.writeEntry ( colorLUT [i]. key, p. color ( QPalette::Active, colorLUT [i]. role ). name ( )); - + item-> save ( config ); + config. write ( ); // need to flush the config info first loadColors ( m_color_list ); } else { QMessageBox::information ( this, tr( "Save scheme" ), tr( "Scheme does already exist." )); } } delete d; } void Appearance::deleteSchemeClicked() { ColorListItem *item = (ColorListItem *) m_color_list-> item ( m_color_list-> currentItem ( )); if ( !item ) return; if ( m_color_list-> currentItem ( ) > 0 ) { if ( QMessageBox::warning ( this, tr( "Delete scheme" ), tr( "Do you really want to delete\n" ) + item-> text ( ) + "?", tr( "Yes" ), tr( "No" ), 0, 0, 1 ) == 0 ) { QFile::remove ( QPEApplication::qpeDir ( ) + "/etc/colors/" + item-> text ( ) + ".scheme" ); loadColors ( m_color_list ); } } else { QMessageBox::information( this, tr( "Delete scheme" ), tr( "Unable to delete current scheme." )); } } diff --git a/noncore/settings/appearance2/colorlistitem.h b/noncore/settings/appearance2/colorlistitem.h index c7318a6..1ff6ecc 100644 --- a/noncore/settings/appearance2/colorlistitem.h +++ b/noncore/settings/appearance2/colorlistitem.h @@ -1,28 +1,113 @@ #ifndef COLORLISTITEM_H #define COLORLISTITEM_H #include <qlistbox.h> #include <qpalette.h> +#include <qapplication.h> + +#include <qpe/config.h> + +class Appearance; class ColorListItem : public QListBoxText { public: - ColorListItem ( const QString &t, const QPalette &pal ) : QListBoxText ( t ) - { - m_pal = pal; + ColorListItem ( const QString &t, Config &cfg ) : QListBoxText ( t ) + { + m_colors = new QColor [s_colorcount]; + load ( cfg ); } virtual ~ColorListItem ( ) { + delete [] m_colors; } QPalette palette ( ) { - return m_pal; + return m_palette; + } + + bool load ( Config &cfg ) + { + for ( int i = 0; i < s_colorcount; i++ ) + m_colors [i] = QColor ( cfg. readEntry ( s_colorlut [i]. m_key, s_colorlut [i]. m_def )); + + buildPalette ( ); + return true; + } + + void buildPalette ( ) + { + m_palette = QPalette ( m_colors [r2i(QColorGroup::Button)], m_colors [r2i(QColorGroup::Background)] ); + m_palette. setColor ( QColorGroup::Highlight, m_colors [r2i(QColorGroup::Highlight)] ); + m_palette. setColor ( QColorGroup::HighlightedText, m_colors [r2i(QColorGroup::HighlightedText)] ); + m_palette. setColor ( QColorGroup::Text, m_colors [r2i(QColorGroup::Text)] ); + m_palette. setColor ( QPalette::Active, QColorGroup::ButtonText, m_colors [r2i(QColorGroup::ButtonText)] ); + m_palette. setColor ( QColorGroup::Base, m_colors [r2i(QColorGroup::Base)] ); + m_palette. setColor ( QPalette::Disabled, QColorGroup::Text, m_palette. color ( QPalette::Active, QColorGroup::Background ). dark ( )); } + bool save ( Config &cfg ) + { + for ( int i = 0; i < s_colorcount; i++ ) + cfg. writeEntry ( s_colorlut [i]. m_key, m_colors [i]. name ( )); + return true; + } + + QColor color ( QColorGroup::ColorRole role ) + { + int i = r2i ( role ); + return i >= 0 ? m_colors [i] : QColor ( ); + } + + void setColor ( QColorGroup::ColorRole role, QColor c ) + { + int i = r2i ( role ); + if ( i >= 0 ) { + m_colors [i] = c; + buildPalette ( ); + } + } + + QString label ( QColorGroup::ColorRole role ) + { + int i = r2i ( role ); + return i >= 0 ? qApp-> translate ( "Appearance", s_colorlut [i]. m_label ) : QString::null; + } + private: - QPalette m_pal; + QPalette m_palette; + QColor *m_colors; + + static struct colorlut { + QColorGroup::ColorRole m_role; + const char * m_key; + const char * m_def; + const char * m_label; + } const s_colorlut []; + static const int s_colorcount; + + static int r2i ( QColorGroup::ColorRole role ) + { + for ( int i = 0; i < s_colorcount; i++ ) { + if ( s_colorlut [i]. m_role == role ) + return i; + } + return -1; + } }; +const ColorListItem::colorlut ColorListItem::s_colorlut [] = { + { QColorGroup::Base, "Base", "#FFFFFF", QT_TRANSLATE_NOOP( "Appearance", "Base" ) }, + { QColorGroup::Background, "Background", "#E5E1D5", QT_TRANSLATE_NOOP( "Appearance", "Background" ) }, + { QColorGroup::Button, "Button", "#D6CDBB", QT_TRANSLATE_NOOP( "Appearance", "Button" ) }, + { QColorGroup::ButtonText, "ButtonText", "#000000", QT_TRANSLATE_NOOP( "Appearance", "Button Text" ) }, + { QColorGroup::Highlight, "Highlight", "#800000", QT_TRANSLATE_NOOP( "Appearance", "Highlight" ) }, + { QColorGroup::HighlightedText, "HighlightedText", "#FFFFFF", QT_TRANSLATE_NOOP( "Appearance", "Highlighted Text" ) }, + { QColorGroup::Text, "Text", "#000000", QT_TRANSLATE_NOOP( "Appearance", "Text" ) } +}; + +const int ColorListItem::s_colorcount = sizeof( s_colorlut ) / sizeof ( s_colorlut [0] ); + #endif diff --git a/noncore/settings/appearance2/editScheme.cpp b/noncore/settings/appearance2/editScheme.cpp index 2453c7b..4f2ac2c 100644 --- a/noncore/settings/appearance2/editScheme.cpp +++ b/noncore/settings/appearance2/editScheme.cpp @@ -1,83 +1,87 @@ /********************************************************************** ** EditScheme ** ** Dialog for editing color scheme ** ** Copyright (C) 2002, Dan Williams ** williamsdr@acm.org ** http://draknor.net ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** **********************************************************************/ #include "editScheme.h" #include "opie/colorpopupmenu.h" #include <qaction.h> #include <qlabel.h> #include <qlayout.h> #include <qpopupmenu.h> #include <qscrollview.h> #include <qtoolbutton.h> EditScheme::EditScheme( QWidget* parent, const char* name, bool modal, WFlags fl, - int max, QString list[], QString colors[] ) + int max, QString *list, QString *colors ) : QDialog( parent, name, modal, fl ) { setCaption( tr( "Edit scheme" ) ); QGridLayout* layout = new QGridLayout( this ); layout->setSpacing( 4 ); layout->setMargin( 4 ); maxCount = max; + colorList = colors; + surfaceList = list; + colorButtons = new QToolButton * [max]; int i; QLabel* label; ColorPopupMenu* colorPopupMenu; for ( i = 0; i < max; i++ ) { - colorList[i] = colors[i]; - surfaceList[i] = list[i]; +// colorList[i] = colors[i]; +// surfaceList[i] = list[i]; label = new QLabel( tr( surfaceList[i] ), this ); layout->addWidget( label, i, 0 ); colorButtons[i] = new QToolButton( this, list[i] ); colorButtons[i]->setPalette( QPalette( QColor( colors[i] ) ) ); layout->addWidget( colorButtons[i], i, 1 ); colorPopupMenu = new ColorPopupMenu( colors[i], 0, list[i] ); colorButtons[i]->setPopup( colorPopupMenu ); colorButtons[i]->setPopupDelay( 0 ); connect( colorPopupMenu, SIGNAL( colorSelected( const QColor& ) ), this, SLOT( changeColor( const QColor& ) ) ); } } EditScheme::~EditScheme() { + delete [] colorButtons; } void EditScheme::changeColor( const QColor& color ) { QString name( sender()->name() ); int i; for ( i = 0; i < maxCount; i++ ) { if ( name == colorButtons[i]->name() ) { break; } } if ( i < maxCount && name == colorButtons[i]->name() ) { colorList[i] = color.name(); colorButtons[i]->setPalette( QPalette( QColor( colorList[i] ) ) ); } } diff --git a/noncore/settings/appearance2/editScheme.h b/noncore/settings/appearance2/editScheme.h index cf238c6..583050f 100644 --- a/noncore/settings/appearance2/editScheme.h +++ b/noncore/settings/appearance2/editScheme.h @@ -1,48 +1,48 @@ /********************************************************************** ** EditScheme ** ** Dialog for editing color scheme ** ** Copyright (C) 2002, Dan Williams ** williamsdr@acm.org ** http://draknor.net ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** **********************************************************************/ #ifndef EDITSCHEME_H #define EDITSCHEME_H #include <qdialog.h> #include <qtoolbutton.h> class QColor; class EditScheme : public QDialog { Q_OBJECT public: EditScheme( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0, - int = 0, QString[] = 0, QString[] = 0 ); + int = 0, QString * = 0, QString * = 0 ); ~EditScheme(); int maxCount; - QString surfaceList[9]; - QString colorList[9]; + QString * surfaceList; + QString * colorList; - QToolButton* colorButtons[9]; + QToolButton** colorButtons; protected slots: void changeColor( const QColor& ); }; #endif // EDITSCHEME_H diff --git a/noncore/settings/appearance2/sample.cpp b/noncore/settings/appearance2/sample.cpp index ee27d60..e447002 100644 --- a/noncore/settings/appearance2/sample.cpp +++ b/noncore/settings/appearance2/sample.cpp @@ -1,236 +1,243 @@ #include <qvbox.h> #include <qpopupmenu.h> #include <qpainter.h> #include <qmenubar.h> #include <qcheckbox.h> #include <qpushbutton.h> #include <qscrollbar.h> #include <qlayout.h> #include <qwhatsthis.h> #include <qpixmapcache.h> #include <qtimer.h> #include <qobjectlist.h> +#include <qcommonstyle.h> #include "sample.h" class SampleText : public QWidget { public: SampleText( const QString &t, bool h, QWidget *parent ) : QWidget( parent ), hl(h), text(t) { if ( hl ) setBackgroundMode( PaletteHighlight ); else setBackgroundMode( PaletteBase ); } QSize sizeHint() const { QFontMetrics fm(font()); return QSize( fm.width(text)+10, fm.height()+4 ); } void paintEvent( QPaintEvent * ) { QPainter p(this); if ( hl ) p.setPen( colorGroup().highlightedText() ); else p.setPen( colorGroup().text() ); p.drawText( rect(), AlignCenter, text ); } private: bool hl; QString text; }; SampleWindow::SampleWindow( QWidget *parent ) : QWidget(parent), iface(0) { init(); } QSize SampleWindow::sizeHint() const { return container->sizeHint() + QSize( 10, 35 ); } void SampleWindow::setFont( const QFont &f ) { QWidget::setFont( f ); popup->setFont( f ); QTimer::singleShot ( 0, this, SLOT( fixGeometry ( ))); } static void setStyleRecursive ( QWidget *w, QStyle *s ) { + w->setStyle( s ); QObjectList *childObjects=(QObjectList*)w->children(); if ( childObjects ) { QObject * o; for(o=childObjects->first();o!=0;o=childObjects->next()) { if( o->isWidgetType() ) { setStyleRecursive((QWidget *)o,s); } } } - w->setStyle( s ); } void SampleWindow::setStyle2 ( QStyle *sty ) { + typedef void (QStyle::*QDrawMenuBarItemImpl) (QPainter *, int, int, int, int, QMenuItem *, QColorGroup &, bool, bool); + + extern QDrawMenuBarItemImpl qt_set_draw_menu_bar_impl(QDrawMenuBarItemImpl); + QPixmapCache::clear ( ); QPalette p = palette ( ); sty-> polish ( p ); + qt_set_draw_menu_bar_impl ( 0 ); setStyleRecursive ( this, sty ); + setPalette ( p ); QTimer::singleShot ( 0, this, SLOT( fixGeometry ( ))); } void SampleWindow::setDecoration( WindowDecorationInterface *i ) { iface = i; wd.rect = QRect( 0, 0, 150, 75 ); wd.caption = tr("Sample"); wd.palette = palette(); wd.flags = WindowDecorationInterface::WindowData::Dialog | WindowDecorationInterface::WindowData::Active; wd.reserved = 1; th = iface->metric(WindowDecorationInterface::TitleHeight, &wd); tb = iface->metric(WindowDecorationInterface::TopBorder, &wd); lb = iface->metric(WindowDecorationInterface::LeftBorder, &wd); rb = iface->metric(WindowDecorationInterface::RightBorder, &wd); bb = iface->metric(WindowDecorationInterface::BottomBorder, &wd); int yoff = th + tb; int xoff = lb; wd.rect.setX( 0 ); wd.rect.setWidth( width() - lb - rb ); wd.rect.setY( 0 ); wd.rect.setHeight( height() - yoff - bb ); container->setGeometry( xoff, yoff, wd.rect.width(), wd.rect.height() ); setMinimumSize( container->sizeHint().width()+lb+rb, container->sizeHint().height()+tb+th+bb ); } void SampleWindow::paintEvent( QPaintEvent * ) { if ( !iface ) return; QPainter p( this ); p.translate( lb, th+tb ); iface->drawArea(WindowDecorationInterface::Border, &p, &wd); iface->drawArea(WindowDecorationInterface::Title, &p, &wd); p.setPen(palette().active().color(QColorGroup::HighlightedText)); QFont f( font() ); f.setWeight( QFont::Bold ); p.setFont(f); iface->drawArea(WindowDecorationInterface::TitleText, &p, &wd); QRect brect( 0, -th, iface->metric(WindowDecorationInterface::HelpWidth,&wd), th ); iface->drawButton( WindowDecorationInterface::Help, &p, &wd, brect.x(), brect.y(), brect.width(), brect.height(), (QWSButton::State)0 ); brect.moveBy( wd.rect.width() - iface->metric(WindowDecorationInterface::OKWidth,&wd) - iface->metric(WindowDecorationInterface::CloseWidth,&wd), 0 ); iface->drawButton( WindowDecorationInterface::Close, &p, &wd, brect.x(), brect.y(), brect.width(), brect.height(), (QWSButton::State)0 ); brect.moveBy( iface->metric(WindowDecorationInterface::CloseWidth,&wd), 0 ); iface->drawButton( WindowDecorationInterface::OK, &p, &wd, brect.x(), brect.y(), brect.width(), brect.height(), (QWSButton::State)0 ); } void SampleWindow::init() { container = new QVBox( this ); popup = new QPopupMenu( this ); popup->insertItem( tr("Normal Item"), 1 ); popup->insertItem( tr("Disabled Item"), 2 ); popup->setItemEnabled(2, FALSE); QMenuBar *mb = new QMenuBar( container ); mb->insertItem( tr("Menu"), popup ); QHBox *hb = new QHBox( container ); QWidget *w = new QWidget( hb ); (void)new QScrollBar( 0, 0, 0, 0, 0, Vertical, hb ); QGridLayout *gl = new QGridLayout( w, 2, 2, 4 ); SampleText *l = new SampleText( tr("Normal Text"), FALSE, w ); gl->addWidget( l, 0, 0 ); l = new SampleText( tr("Highlighted Text"), TRUE, w ); gl->addWidget( l, 1, 0 ); QPushButton *pb = new QPushButton( tr("Button"), w ); gl->addWidget( pb, 0, 1 ); pb->setFocusPolicy( NoFocus ); QCheckBox *cb = new QCheckBox( tr("Check Box"), w ); gl->addWidget( cb, 1, 1 ); cb->setFocusPolicy( NoFocus ); cb->setChecked( TRUE ); QWhatsThis::add( this, tr("Sample window using the selected settings.") ); } bool SampleWindow::eventFilter( QObject *, QEvent *e ) { switch ( e->type() ) { case QEvent::MouseButtonPress: case QEvent::MouseButtonRelease: case QEvent::MouseButtonDblClick: case QEvent::MouseMove: case QEvent::KeyPress: case QEvent::KeyRelease: return TRUE; default: break; } return FALSE; } void SampleWindow::paletteChange( const QPalette &old ) { QWidget::paletteChange ( old ); wd. palette = palette ( ); popup-> setPalette ( palette ( )); } + void SampleWindow::setPalette ( const QPalette &pal ) { QPixmapCache::clear ( ); QPalette p = pal; style ( ). polish ( p ); - QWidget::setPalette ( p ); } void SampleWindow::resizeEvent( QResizeEvent *re ) { wd.rect = QRect( 0, 0, 150, 75 ); wd.rect.setX( 0 ); wd.rect.setWidth( width() - lb - rb ); wd.rect.setY( 0 ); wd.rect.setHeight( height() - th - tb - bb ); container->setGeometry( lb, th+tb, wd.rect.width(), wd.rect.height() ); QWidget::resizeEvent( re ); } void SampleWindow::fixGeometry() { setMinimumSize( container->sizeHint().width()+lb+rb, container->sizeHint().height()+tb+th+bb ); } |