You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
qt3/examples/demo/frame.cpp

153 lines
4.6 KiB

/****************************************************************************
**
** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
**
** This file is part of an example program for Qt. This example
** program may be used, distributed and modified without limitation.
**
*****************************************************************************/
#include "frame.h"
#include <qapplication.h>
#include <qpopupmenu.h>
#include <qmenubar.h>
#include <qaccel.h>
#include <qtoolbox.h>
#include <qpainter.h>
#include <qwidgetstack.h>
#include <qstylefactory.h>
#include <qaction.h>
#include <qsignalmapper.h>
#include <qdict.h>
#include <qdir.h>
#include <qtextcodec.h>
#include <stdlib.h>
#include <qbuttongroup.h>
#include <qtoolbutton.h>
static QTranslator *translator = 0;
static QTranslator *qt_translator = 0;
Frame::Frame( QWidget *parent, const char *name )
: QMainWindow( parent, name )
{
QMenuBar *mainMenu = menuBar();
QPopupMenu *fileMenu = new QPopupMenu( this, "file" );
fileMenu->insertItem( tr( "&Exit" ), this, SLOT( close() ),
QAccel::stringToKey( tr( "Ctrl+Q" ) ) );
QPopupMenu *styleMenu = new QPopupMenu( this, "style" );
styleMenu->setCheckable( TRUE );
QActionGroup *ag = new QActionGroup( this, 0 );
ag->setExclusive( TRUE );
QSignalMapper *styleMapper = new QSignalMapper( this );
connect( styleMapper, SIGNAL( mapped( const QString& ) ),
this, SLOT( setStyle( const QString& ) ) );
QStringList list = QStyleFactory::keys();
list.sort();
QDict<int> stylesDict( 17, FALSE );
for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) {
QString style = *it;
QString styleAccel = style;
if ( stylesDict[styleAccel.left(1)] ) {
for ( uint i = 0; i < styleAccel.length(); i++ ) {
if ( !stylesDict[styleAccel.mid( i, 1 )] ) {
stylesDict.insert(styleAccel.mid( i, 1 ), (const int *)1);
styleAccel = styleAccel.insert( i, '&' );
break;
}
}
} else {
stylesDict.insert(styleAccel.left(1), (const int *)1);
styleAccel = "&"+styleAccel;
}
QAction *a = new QAction( style, QIconSet(),
styleAccel, 0, ag, 0, ag->isExclusive() );
connect( a, SIGNAL( activated() ), styleMapper, SLOT(map()) );
styleMapper->setMapping( a, a->text() );
}
ag->addTo( styleMenu );
mainMenu->insertItem( tr( "&File" ), fileMenu );
mainMenu->insertItem( tr( "St&yle" ), styleMenu );
stack = new QWidgetStack( this );
setCentralWidget( stack );
}
void Frame::setCategories( const QPtrList<CategoryInterface> &l )
{
categories = l;
QDockWindow *dw = new QDockWindow( QDockWindow::InDock, this );
dw->setResizeEnabled( TRUE );
dw->setVerticalStretchable( TRUE );
addDockWindow( dw, DockLeft );
setDockEnabled( dw, DockTop, FALSE );
setDockEnabled( dw, DockBottom, FALSE );
dw->setCloseMode( QDockWindow::Always );
toolBox = new QToolBox( dw );
dw->setWidget( toolBox );
dw->setCaption( tr( "Demo Categories" ) );
for ( int i = 0; i < categories.count(); ++i )
toolBox->addItem( createCategoryPage( categories.at(i) ),
categories.at(i)->icon(),
categories.at(i)->name() );
categories.first()->setCurrentCategory( 0 );
}
QWidget *Frame::createCategoryPage( CategoryInterface *c )
{
QButtonGroup *g = new QButtonGroup( 1, Horizontal, toolBox );
g->setFrameStyle( QFrame::NoFrame );
g->setEraseColor(green);
g->setBackgroundMode(PaletteBase);
for ( int i = 0; i < c->numCategories(); ++i ) {
QToolButton *b = new QToolButton( g );
b->setBackgroundMode(PaletteBase);
b->setTextLabel( c->categoryName( i ) );
b->setIconSet( c->categoryIcon( i ) );
b->setAutoRaise( TRUE );
b->setTextPosition( QToolButton::Right );
b->setUsesTextLabel( TRUE );
g->insert( b, i + c->categoryOffset() );
connect( g, SIGNAL( clicked( int ) ), c, SLOT( setCurrentCategory( int ) ) );
}
return g;
}
void Frame::setStyle( const QString& style )
{
QStyle *s = QStyleFactory::create( style );
if ( s )
QApplication::setStyle( s );
}
void Frame::updateTranslators()
{
if ( !qt_translator ) {
qt_translator = new QTranslator( qApp );
translator = new QTranslator( qApp );
qApp->installTranslator( qt_translator );
qApp->installTranslator( translator );
}
QString base = QDir("../../translations").absPath();
qt_translator->load( QString( "qt_%1" ).arg( QTextCodec::locale() ), base );
translator->load( QString( "translations/demo_%1" ).arg( QTextCodec::locale() ) );
}
bool Frame::event( QEvent *e )
{
if ( e->type() == QEvent::LocaleChange )
updateTranslators();
return QMainWindow::event( e );
}