-rw-r--r-- | noncore/settings/appearance2/appearance.cpp | 461 | ||||
-rw-r--r-- | noncore/settings/appearance2/appearance.h | 30 | ||||
-rw-r--r-- | noncore/settings/appearance2/exceptlistitem.h | 199 |
3 files changed, 521 insertions, 169 deletions
diff --git a/noncore/settings/appearance2/appearance.cpp b/noncore/settings/appearance2/appearance.cpp index 303e0b9..22b12b4 100644 --- a/noncore/settings/appearance2/appearance.cpp +++ b/noncore/settings/appearance2/appearance.cpp @@ -1,497 +1,535 @@ /* � � � � � � � � This file is part of the OPIE Project Copyright (c) 2002 Trolltech AS <info@trolltech.com> =. Copyright (c) 2002 Dan Williams <williamsdr@acm.org> � � � � � � �.=l. Copyright (c) 2002 Robert Griebl <sandman@handhelds.org> � � � � � �.>+-= �_;:, � � .> � �:=|. This file is free software; you can .> <`_, � > �. � <= redistribute it and/or modify it under :`=1 )Y*s>-.-- � : the terms of the GNU General Public .="- .-=="i, � � .._ License as published by the Free Software �- . � .-<_> � � .<> Foundation; either version 2 of the License, � � �._= =} � � � : or (at your option) any later version. � � .%`+i> � � � _;_. � � .i_,=:_. � � �-<s. This file is distributed in the hope that � � �+ �. �-:. � � � = it will be useful, but WITHOUT ANY WARRANTY; � � : .. � �.:, � � . . . without even the implied warranty of � � =_ � � � �+ � � =;=|` MERCHANTABILITY or FITNESS FOR A � _.=:. � � � : � �:=>`: PARTICULAR PURPOSE. See the GNU General ..}^=.= � � � = � � � ; Public License for more details. ++= � -. � � .` � � .: �: � � = �...= . :.=- You should have received a copy of the GNU �-. � .:....=;==+<; General Public License along with this file; � -_. . . � )=. �= see the file COPYING. If not, write to the � � -- � � � �:-=` Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#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 +#endif +#include <qtoolbutton.h> #include <qwindowsstyle.h> +#include <qlistview.h> +#include <qheader.h> +#include <qvbox.h> + +#include <qpe/config.h> +#include <qpe/global.h> +#include <qpe/resource.h> +#include <qpe/qpeapplication.h> +#include <qpe/qcopenvelope_qws.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 <opie/ofontselector.h> +#include <opie/odevice.h> +#include <opie/ofiledialog.h> +#include <opie/otabwidget.h> + +#include "appearance.h" +#include "editScheme.h" #include "stylelistitem.h" #include "decolistitem.h" #include "colorlistitem.h" - +#include "exceptlistitem.h" #include "sample.h" -#include <opie/ofontselector.h> + +using namespace Opie; 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; }; -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 ) && iface ) - list-> insertItem ( new StyleListItem ( lib, iface )); - else - delete lib; - } - } -#endif -} - -void Appearance::loadDecos ( QListBox *list ) +QWidget *Appearance::createStyleTab ( QWidget *parent, Config &cfg ) { - list-> insertItem ( new DecoListItem ( "QPE" )); - - { - 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; - } - } -} - -void Appearance::loadColors ( QListBox *list ) -{ - list-> clear ( ); - { - Config config ( "qpe" ); - config. setGroup ( "Appearance" ); - - 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, config )); - } -} - - -QWidget *Appearance::createStyleTab ( QWidget *parent ) -{ - Config config ( "qpe" ); - config. setGroup ( "Appearance" ); - QWidget* tab = new QWidget( parent, "StyleTab" ); - QVBoxLayout* vertLayout = new QVBoxLayout( tab, 4, 4 ); + QVBoxLayout* vertLayout = new QVBoxLayout( tab, 3, 3 ); 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 = cfg. readEntry ( "Style", "Light" ); + + +#if QT_VERSION >= 300 + m_style_list->insertStringList(QStyleFactory::styles()); +#else + m_style_list-> insertItem ( new StyleListItem ( "Windows", new QWindowsStyle ( ))); + m_style_list-> insertItem ( new StyleListItem ( "Light", new LightStyle ( ))); + m_style_list-> insertItem ( new StyleListItem ( "QPE", new QPEStyle ( ))); +#endif + { + 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; - QString s = config. readEntry ( "Style", "Light" ); + if (( lib-> queryInterface ( IID_Style, (QUnknownInterface **) &iface ) == QS_OK ) && iface ) { + StyleListItem *slit = new StyleListItem ( lib, iface ); + m_style_list-> insertItem ( slit ); - for ( uint i = 0; i < m_style_list-> count ( ); i++ ) { - if (((StyleListItem *) m_style_list-> item ( i ))-> key ( ) == s ) { - m_style_list-> setCurrentItem ( i ); - break; + if ( slit-> key ( ) == s ) + m_style_list-> setCurrentItem ( slit ); + } + else + delete lib; } } 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 ) +QWidget *Appearance::createDecoTab ( QWidget *parent, Config &cfg ) { - Config config ( "qpe" ); - config. setGroup ( "Appearance" ); - QWidget* tab = new QWidget( parent, "DecoTab" ); - QVBoxLayout* vertLayout = new QVBoxLayout( tab, 4, 4 ); + QVBoxLayout* vertLayout = new QVBoxLayout( tab, 3, 3 ); m_deco_list = new QListBox( tab, "m_deco_list" ); vertLayout->addWidget( m_deco_list ); - loadDecos ( m_deco_list ); + QString s = cfg. readEntry ( "Decoration" ); - QString s = config. readEntry ( "Decoration" ); + m_deco_list-> insertItem ( new DecoListItem ( "QPE" )); - for ( uint i = 0; i < m_deco_list-> count ( ); i++ ) { - if (((DecoListItem *) m_deco_list-> item ( i ))-> key ( ) == s ) { - m_deco_list-> setCurrentItem ( i ); - break; + { + 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 ) { + DecoListItem *dlit = new DecoListItem ( lib, iface ); + m_deco_list-> insertItem ( dlit ); + + if ( dlit-> key ( ) == s ) + m_deco_list-> setCurrentItem ( dlit ); + } + else + delete lib; } } 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 ) +QWidget *Appearance::createFontTab ( QWidget *parent, Config &cfg ) { - Config config ( "qpe" ); - config. setGroup ( "Appearance" ); - - QString familyStr = config.readEntry( "FontFamily", "Helvetica" ); - QString styleStr = config.readEntry( "FontStyle", "Regular" ); - int size = config.readNumEntry( "FontSize", 10 ); + QString familyStr = cfg. readEntry ( "FontFamily", "Helvetica" ); + QString styleStr = cfg. readEntry ( "FontStyle", "Regular" ); + int size = cfg. readNumEntry ( "FontSize", 10 ); m_fontselect = new OFontSelector ( false, parent, "FontTab" ); m_fontselect-> setSelectedFont ( familyStr, styleStr, size ); connect( m_fontselect, SIGNAL( fontSelected ( const QFont & )), this, SLOT( fontClicked ( const QFont & ))); return m_fontselect; } -QWidget *Appearance::createColorTab ( QWidget *parent ) +QWidget *Appearance::createColorTab ( QWidget *parent, Config &cfg ) { - Config config ( "qpe" ); - config. setGroup ( "Appearance" ); - - QWidget *tab = new QWidget( parent, "ColorTab" ); - QGridLayout *gridLayout = new QGridLayout( tab, 0, 0, 4, 4 ); + QGridLayout *gridLayout = new QGridLayout( tab, 0, 0, 3, 3 ); 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-> insertItem ( new ColorListItem ( tr( "Current scheme" ), cfg )); + + 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" ); + + m_color_list-> insertItem ( new ColorListItem ( name, config )); + } + 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 ) +QWidget *Appearance::createAdvancedTab ( QWidget *parent, Config &cfg ) { - Config config ( "qpe" ); - config. setGroup ( "Appearance" ); + QWidget *tab = new QWidget ( parent ); + QVBoxLayout *vertLayout = new QVBoxLayout( tab, 3, 3 ); + + QGridLayout *lay = new QGridLayout ( vertLayout, 0, 0, 3, 0 ); + + m_force = new QCheckBox ( tr( "Force styling for all applications." ), tab ); + m_force-> setChecked ( cfg. readBoolEntry ( "ForceStyle" )); + lay-> addMultiCellWidget ( m_force, 0, 0, 0, 1 ); + + QLabel *l = new QLabel ( tab ); + l-> setText ( QString ( "<p>%1</p>" ). arg ( tr( "Disable styling for these applications ( <b>*</b> can be used as a wildcard):" ))); + lay-> addMultiCellWidget ( l, 1, 1, 0, 1 ); + + m_except = new QListView ( tab ); + m_except-> addColumn ( Resource::loadIconSet ( "appearance/style.png" ), "", 24 ); + m_except-> addColumn ( Resource::loadIconSet ( "appearance/font.png" ), "", 24 ); + m_except-> addColumn ( Resource::loadIconSet ( "appearance/deco.png" ), "", 24 ); + m_except-> addColumn ( tr( "Binary file(s)" )); + m_except-> setColumnAlignment ( 0, AlignCenter ); + m_except-> setColumnAlignment ( 1, AlignCenter ); + m_except-> setColumnAlignment ( 2, AlignCenter ); + m_except-> setAllColumnsShowFocus ( true ); + m_except-> setMinimumHeight ( 30 ); + m_except-> header ( )-> setClickEnabled ( false ); + m_except-> header ( )-> setResizeEnabled ( false ); + m_except-> header ( )-> setMovingEnabled ( false ); + lay-> addMultiCellWidget ( m_except, 2, 6, 0, 0 ); + + connect ( m_except, SIGNAL( clicked ( QListViewItem *, const QPoint &, int )), this, SLOT( clickedExcept ( QListViewItem *, const QPoint &, int ))); + + QToolButton *tb = new QToolButton ( tab ); + tb-> setIconSet ( Resource::loadIconSet ( "appearance/add" )); + tb-> setFocusPolicy ( QWidget::StrongFocus ); + lay-> addWidget ( tb, 2, 1 ); + connect ( tb, SIGNAL( clicked ( )), this, SLOT( addExcept ( ))); + + tb = new QToolButton ( tab ); + tb-> setIconSet ( Resource::loadIconSet ( "editdelete" )); + tb-> setFocusPolicy ( QWidget::StrongFocus ); + lay-> addWidget ( tb, 3, 1 ); + connect ( tb, SIGNAL( clicked ( )), this, SLOT( delExcept ( ))); + + tb = new QToolButton ( tab ); + tb-> setIconSet ( Resource::loadIconSet ( "up" )); + tb-> setFocusPolicy ( QWidget::StrongFocus ); + lay-> addWidget ( tb, 4, 1 ); + connect ( tb, SIGNAL( clicked ( )), this, SLOT( upExcept ( ))); + + tb = new QToolButton ( tab ); + tb-> setIconSet ( Resource::loadIconSet ( "down" )); + tb-> setFocusPolicy ( QWidget::StrongFocus ); + lay-> addWidget ( tb, 5, 1 ); + connect ( tb, SIGNAL( clicked ( )), this, SLOT( downExcept ( ))); + + lay-> setRowStretch ( 6, 10 ); + lay-> setColStretch ( 0, 10 ); + + QStringList sl = cfg. readListEntry ( "NoStyle", ';' ); + for ( QStringList::Iterator it = sl. begin ( ); it != sl. end ( ); ++it ) { + int fl = ( *it ). left ( 1 ). toInt ( 0, 32 ); + + new ExceptListItem ( m_except, ( *it ). mid ( 1 ), fl & 0x01, fl & 0x02, fl & 0x04 ); + } + + + vertLayout-> addSpacing ( 3 ); + QFrame *f = new QFrame ( tab ); + f-> setFrameStyle ( QFrame::HLine | QFrame::Sunken ); + vertLayout-> addWidget ( f ); + vertLayout-> addSpacing ( 3 ); - QWidget *tab = new QWidget( parent, "AdvancedTab" ); - QVBoxLayout *vertLayout = new QVBoxLayout( tab, 4, 4 ); - QGridLayout* gridLayout = new QGridLayout ( vertLayout ); + QGridLayout* gridLayout = new QGridLayout ( vertLayout, 0, 0, 3, 0 ); - int style = config. readNumEntry ( "TabStyle", 2 ) - 1; - bool tabtop = ( config. readEntry ( "TabPosition", "Top" ) == "Top" ); + int style = cfg. readNumEntry ( "TabStyle", 2 ) - 1; + bool tabtop = ( cfg. readEntry ( "TabPosition", "Top" ) == "Top" ); 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 ); 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_bottom ); gridLayout-> addWidget( m_tabstyle_bottom, 1, 2 ); m_tabstyle_top-> setChecked ( tabtop ); m_tabstyle_bottom-> setChecked ( !tabtop ); m_original_tabstyle = style; m_original_tabpos = tabtop; 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 ); + QVBoxLayout *top = new QVBoxLayout ( this, 3, 3 ); 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/decotabicon.png", tr( "Windows" ) ); - tw-> addTab ( createGuiTab ( tw ), "appearance/advancedtabicon.png", tr( "Gui" ) ); + tw-> addTab ( styletab = createStyleTab ( tw, config ), "appearance/style.png", tr( "Style" )); + tw-> addTab ( createFontTab ( tw, config ), "appearance/font.png", tr( "Font" )); + tw-> addTab ( createColorTab ( tw, config ), "appearance/color.png", tr( "Colors" ) ); + tw-> addTab ( createDecoTab ( tw, config ), "appearance/deco.png", tr( "Windows" ) ); + tw-> addTab ( m_advtab = createAdvancedTab ( tw, config ), "appearance/advanced.png", tr( "Advanced" ) ); top-> addWidget ( tw, 10 ); top-> addWidget ( m_sample, 1 ); tw-> setCurrentTab ( styletab ); + connect ( tw, SIGNAL( currentChanged ( QWidget * )), this, SLOT( tabChanged ( QWidget * ))); m_style_changed = m_font_changed = m_color_changed = m_deco_changed = false; } Appearance::~Appearance() { } +void Appearance::tabChanged ( QWidget *w ) +{ + if ( w == m_advtab ) { + m_sample-> hide ( ); + updateGeometry ( ); // shouldn't be necessary ... + } + else + m_sample-> show ( ); +} + void Appearance::accept ( ) { bool newtabpos = m_tabstyle_top-> isChecked ( ); int newtabstyle = m_tabstyle_list-> currentItem ( ); Config config ( "qpe" ); config. setGroup ( "Appearance" ); if ( m_style_changed ) { StyleListItem *item = (StyleListItem *) m_style_list-> item ( m_style_list-> currentItem ( )); if ( item ) config.writeEntry( "Style", item-> key ( )); } if ( m_deco_changed ) { DecoListItem *item = (DecoListItem *) m_deco_list-> item ( m_deco_list-> currentItem ( )); if ( item ) config.writeEntry( "Decoration", item-> key ( )); } if (( newtabstyle != m_original_tabstyle ) || ( newtabpos != m_original_tabpos )) { config. writeEntry ( "TabStyle", newtabstyle + 1 ); config. writeEntry ( "TabPosition", newtabpos ? "Top" : "Bottom" ); } if ( m_font_changed ) { config. writeEntry ( "FontFamily", m_fontselect-> fontFamily ( )); config. writeEntry ( "FontStyle", m_fontselect-> fontStyle ( )); config. writeEntry ( "FontSize", m_fontselect-> fontSize ( )); } if ( m_color_changed ) { ColorListItem *item = (ColorListItem *) m_color_list-> item ( m_color_list-> currentItem ( )); if ( item ) item-> save ( config ); } + + QStringList sl; + for ( ExceptListItem *it = (ExceptListItem *) m_except-> firstChild ( ); it; it = (ExceptListItem *) it-> nextSibling ( )) { + int fl = 0; + fl |= ( it-> noStyle ( ) ? 0x01 : 0 ); + fl |= ( it-> noFont ( ) ? 0x02 : 0 ); + fl |= ( it-> noDeco ( ) ? 0x04 : 0 ); + sl << ( QString::number ( fl, 32 ) + it-> pattern ( )); + } + config. writeEntry ( "NoStyle", sl, ';' ); + config. writeEntry ( "ForceStyle", m_force-> isChecked ( )); + 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 ) { + if ( QMessageBox::warning ( this, tr( "Restart" ), tr( "Do you want to restart %1 now?" ). arg ( ODevice::inst ( )-> system ( ) == System_Zaurus ? "Qtopia" : "Opie" ), 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 ); + QVBoxLayout *vbox = new QVBoxLayout ( d, 3, 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_sample-> repaint ( ); } m_deco_changed |= ( index != m_original_deco ); } @@ -533,79 +571,184 @@ void Appearance::editSchemeClicked ( ) EditScheme* editdlg = new EditScheme( cnt, labels, colors, this, "editScheme", true ); 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, colors [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 ); + QLineEdit *ed = new QLineEdit ( d ); + ( new QVBoxLayout ( d, 3, 3 ))-> addWidget ( ed ); + ed-> setFocus ( ); 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" ); item-> save ( config ); config. write ( ); // need to flush the config info first - loadColors ( m_color_list ); + + m_color_list-> insertItem ( new ColorListItem ( schemename, config )); } 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 ); + delete item; } } else { QMessageBox::information( this, tr( "Delete scheme" ), tr( "Unable to delete current scheme." )); } } + +void Appearance::addExcept ( ) +{ + ExceptListItem *it = new ExceptListItem ( m_except, tr( "<new>" ), true, true, true ); + m_except-> ensureItemVisible ( it ); + m_except-> setSelected ( it, true ); +} + +void Appearance::delExcept ( ) +{ + if ( m_except-> selectedItem ( )) { + m_except-> setFocus ( ); + delete m_except-> selectedItem ( ); + } +} + +void Appearance::upExcept ( ) +{ + ExceptListItem *it = (ExceptListItem *) m_except-> selectedItem ( ); + + if ( it && it-> itemAbove ( )) + it-> itemAbove ( )-> moveItem ( it ); +} + +void Appearance::downExcept ( ) +{ + ExceptListItem *it = (ExceptListItem *) m_except-> selectedItem ( ); + + if ( it && it-> itemBelow ( )) + it-> moveItem ( it-> itemBelow ( )); +} + +class ExEdit : public QLineEdit { +public: + ExEdit ( ExceptListItem *item ) + : QLineEdit ( item-> listView ( )-> viewport ( ), "exedit" ), it ( item ) + { + setFrame ( false ); + + QRect r = it-> listView ( )-> itemRect ( it ); + + int x = it-> listView ( )-> header ( )-> cellPos ( 3 ) - 1; + int y = r. y ( ); + int w = it-> listView ( )-> viewport ( )-> width ( ) - x; + int h = r. height ( ); // + 2; + + setText ( it-> pattern ( )); + setGeometry ( x, y, w, h ); + + qDebug ( "ExEdit: [%s] at %d,%d %d,%d", it->text(2).latin1(),x,y,w,h); + + m_out = true; + + show ( ); + setFocus ( ); + selectAll ( ); + end ( true ); + } + + virtual void focusOutEvent ( QFocusEvent * ) + { + hide ( ); + if ( m_out ) + it-> setPattern ( text ( )); + delete this; + } + + virtual void keyPressEvent ( QKeyEvent *e ) + { + if ( e-> key ( ) == Key_Return ) + it-> listView ( )-> setFocus ( ); + else if ( e-> key ( ) == Key_Escape ) { + m_out = false; + it-> listView ( )-> setFocus ( ); + } + else + QLineEdit::keyPressEvent ( e ); + } + +private: + ExceptListItem *it; + bool m_out; +}; + +void Appearance::clickedExcept ( QListViewItem *item, const QPoint &, int c ) +{ + if ( !item || c < 0 || c > 3 ) + return; + + ExceptListItem *it = (ExceptListItem *) item; + + if ( c == 0 ) + it-> setNoStyle ( !it-> noStyle ( )); + else if ( c == 1 ) + it-> setNoFont ( !it-> noFont ( )); + else if ( c == 2 ) + it-> setNoDeco ( !it-> noDeco ( )); + else if ( c == 3 ) { + m_except-> ensureItemVisible ( it ); + new ExEdit ( it ); + } +} + diff --git a/noncore/settings/appearance2/appearance.h b/noncore/settings/appearance2/appearance.h index a392aa7..065dfb7 100644 --- a/noncore/settings/appearance2/appearance.h +++ b/noncore/settings/appearance2/appearance.h @@ -2,112 +2,122 @@ � � � � � � � � This file is part of the OPIE Project =. Copyright (c) 2002 Dan Williams <williamsdr@acm.org> � � � � � � �.=l. Copyright (c) 2002 Robert Griebl <sandman@handhelds.org> � � � � � �.>+-= �_;:, � � .> � �:=|. This file is free software; you can .> <`_, � > �. � <= redistribute it and/or modify it under :`=1 )Y*s>-.-- � : the terms of the GNU General Public .="- .-=="i, � � .._ License as published by the Free Software �- . � .-<_> � � .<> Foundation; either version 2 of the License, � � �._= =} � � � : or (at your option) any later version. � � .%`+i> � � � _;_. � � .i_,=:_. � � �-<s. This file is distributed in the hope that � � �+ �. �-:. � � � = it will be useful, but WITHOUT ANY WARRANTY; � � : .. � �.:, � � . . . without even the implied warranty of � � =_ � � � �+ � � =;=|` MERCHANTABILITY or FITNESS FOR A � _.=:. � � � : � �:=>`: PARTICULAR PURPOSE. See the GNU General ..}^=.= � � � = � � � ; Public License for more details. ++= � -. � � .` � � .: �: � � = �...= . :.=- You should have received a copy of the GNU �-. � .:....=;==+<; General Public License along with this file; � -_. . . � )=. �= see the file COPYING. If not, write to the � � -- � � � �:-=` Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef APPEARANCESETTINGS_H #define APPEARANCESETTINGS_H #include <qpe/fontdatabase.h> -#include <qmainwindow.h> #include <qdialog.h> class QCheckBox; class QComboBox; class QLabel; class QLineEdit; class QListBox; class QMultiLineEdit; class QPushButton; class QRadioButton; class QToolButton; class SampleWindow; class OFontSelector; +class QListView; +class QListViewItem; +class Config; class Appearance : public QDialog { Q_OBJECT public: Appearance( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); ~Appearance(); protected: virtual void accept ( ); virtual void done ( int r ); protected slots: void styleClicked ( int ); void styleSettingsClicked ( ); void decoClicked ( int ); void fontClicked ( const QFont & ); void colorClicked ( int ); void editSchemeClicked(); void saveSchemeClicked(); void deleteSchemeClicked(); -private: - void loadStyles ( QListBox * ); - void loadDecos ( QListBox * ); - void loadColors ( QListBox * ); + void tabChanged ( QWidget * ); + + void addExcept ( ); + void delExcept ( ); + void upExcept ( ); + void downExcept ( ); + void clickedExcept ( QListViewItem *, const QPoint &, int ); +private: void changeText(); - QWidget *createStyleTab ( QWidget *parent ); - QWidget *createDecoTab ( QWidget *parent ); - QWidget *createFontTab ( QWidget *parent ); - QWidget *createColorTab ( QWidget *parent ); - QWidget *createGuiTab ( QWidget *parent ); + QWidget *createStyleTab ( QWidget *parent, Config &cfg ); + QWidget *createDecoTab ( QWidget *parent, Config &cfg ); + QWidget *createFontTab ( QWidget *parent, Config &cfg ); + QWidget *createColorTab ( QWidget *parent, Config &cfg ); + QWidget *createAdvancedTab ( QWidget *parent, Config &cfg ); private: bool m_style_changed; bool m_font_changed; bool m_scheme_changed; bool m_deco_changed; bool m_color_changed; int m_original_style; int m_original_deco; int m_original_tabstyle; bool m_original_tabpos; QListBox * m_style_list; QPushButton * m_style_settings; QListBox * m_deco_list; QListBox * m_color_list; OFontSelector *m_fontselect; SampleWindow *m_sample; QComboBox * m_tabstyle_list; QRadioButton *m_tabstyle_top; QRadioButton *m_tabstyle_bottom; + + QWidget * m_advtab; + QListView * m_except; + QCheckBox * m_force; }; #endif diff --git a/noncore/settings/appearance2/exceptlistitem.h b/noncore/settings/appearance2/exceptlistitem.h new file mode 100644 index 0000000..5eda79c --- a/dev/null +++ b/noncore/settings/appearance2/exceptlistitem.h @@ -0,0 +1,199 @@ +/* +� � � � � � � �=. This file is part of the OPIE Project +� � � � � � �.=l. Copyright (c) 2002 Robert Griebl <sandman@handhelds.org> +� � � � � �.>+-= +�_;:, � � .> � �:=|. This file is free software; you can +.> <`_, � > �. � <= redistribute it and/or modify it under +:`=1 )Y*s>-.-- � : the terms of the GNU General Public +.="- .-=="i, � � .._ License as published by the Free Software +�- . � .-<_> � � .<> Foundation; either version 2 of the License, +� � �._= =} � � � : or (at your option) any later version. +� � .%`+i> � � � _;_. +� � .i_,=:_. � � �-<s. This file is distributed in the hope that +� � �+ �. �-:. � � � = it will be useful, but WITHOUT ANY WARRANTY; +� � : .. � �.:, � � . . . without even the implied warranty of +� � =_ � � � �+ � � =;=|` MERCHANTABILITY or FITNESS FOR A +� _.=:. � � � : � �:=>`: PARTICULAR PURPOSE. See the GNU General +..}^=.= � � � = � � � ; Public License for more details. +++= � -. � � .` � � .: +�: � � = �...= . :.=- You should have received a copy of the GNU +�-. � .:....=;==+<; General Public License along with this file; +� -_. . . � )=. �= see the file COPYING. If not, write to the +� � -- � � � �:-=` Free Software Foundation, Inc., + 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#ifndef EXCEPTLISTITEM_H +#define EXCEPTLISTITEM_H + +#include <qlistview.h> +#include <qpixmap.h> +#include <qimage.h> +#include <qpainter.h> + +class ExceptListItem : public QListViewItem { +public: + ExceptListItem ( QListView *lv, const QString &t, bool nostyle = true, bool nofont = true, bool nodeco = true ) : QListViewItem ( lv ) + { + m_text = t; + + m_nofont = nofont; + m_nostyle = nostyle; + m_nodeco = nodeco; + + init ( ); + } + + virtual ~ExceptListItem ( ) + { + } + + static void overlay ( QImage &img, const QImage &ovl ) + { + if (( img. size ( ) != ovl. size ( )) || + ( img. depth ( ) != ovl. depth ( ))) + return; + + for ( int y = 0; y != img. height ( ); y++ ) { + QRgb *iline = (QRgb *) img. scanLine ( y ); + QRgb *oline = (QRgb *) ovl. scanLine ( y ); + + for ( int x = 0; x != img. width ( ); x++ ) { + QRgb i = *iline; + QRgb o = *oline; + + *iline = qRgba (( qRed ( i ) + qRed ( o )) / 2, + ( qGreen ( i ) + qGreen ( o )) / 2, + ( qBlue ( i ) + qBlue ( o )) / 2, + ( qAlpha ( i ) + qAlpha ( o )) / 2 ); + iline++; + oline++; + } + } + } + + static void init ( ) + { + static bool init = false; + + if ( init ) + return; + + QImage noimg = Resource::loadImage ( "appearance/no.png" ); + QImage fontimg = Resource::loadImage ( "appearance/font.png" ); + QImage styleimg = Resource::loadImage ( "appearance/style.png" ); + QImage decoimg = Resource::loadImage ( "appearance/deco.png" ); + + s_fontpix [0] = new QPixmap ( ); + s_fontpix [0]-> convertFromImage ( fontimg ); + overlay ( fontimg, noimg ); + s_fontpix [1] = new QPixmap ( ); + s_fontpix [1]-> convertFromImage ( fontimg ); + + s_stylepix [0] = new QPixmap ( ); + s_stylepix [0]-> convertFromImage ( styleimg ); + overlay ( styleimg, noimg ); + s_stylepix [1] = new QPixmap ( ); + s_stylepix [1]-> convertFromImage ( styleimg ); + + s_decopix [0] = new QPixmap ( ); + s_decopix [0]-> convertFromImage ( decoimg ); + overlay ( decoimg, noimg ); + s_decopix [1] = new QPixmap ( ); + s_decopix [1]-> convertFromImage ( decoimg ); + + init = true; + } + + bool noFont ( ) const + { + return m_nofont; + } + + bool noStyle ( ) const + { + return m_nostyle; + } + + bool noDeco ( ) const + { + return m_nodeco; + } + + void setNoDeco ( bool b ) + { + if ( b != m_nodeco ) { + m_nodeco = b; + repaint ( ); + } + } + + void setNoStyle ( bool b ) + { + if ( b != m_nostyle ) { + m_nostyle = b; + repaint ( ); + } + } + + void setNoFont ( bool b ) + { + if ( b != m_nofont ) { + m_nofont = b; + repaint ( ); + } + } + + QString pattern ( ) const + { + return m_text; + } + + void setPattern ( const QString &s ) + { + if ( s != m_text ) { + m_text = s; + widthChanged ( 3 ); + repaint ( ); + } + } + + QString text ( int i ) const + { + if ( i == 3 ) + return m_text; + else + return QString::null; + + } + + const QPixmap *pixmap ( int i ) const + { + if ( i == 0 ) + return (const QPixmap *) s_stylepix [m_nostyle ? 1 : 0]; + else if ( i == 1 ) + return (const QPixmap *) s_fontpix [m_nofont ? 1 : 0]; + else if ( i == 2 ) + return (const QPixmap *) s_decopix [m_nodeco ? 1 : 0]; + else + return 0; + } + +private: + QString m_text; + bool m_nofont; + bool m_nostyle; + bool m_nodeco; + + static QPixmap *s_stylepix [2]; + static QPixmap *s_fontpix [2]; + static QPixmap *s_decopix [2]; +}; + +QPixmap *ExceptListItem::s_stylepix [2] = { 0, 0 }; +QPixmap *ExceptListItem::s_fontpix [2] = { 0, 0 }; +QPixmap *ExceptListItem::s_decopix [2] = { 0, 0 }; + +#endif |