diff --git a/effects/desktopgrid.cpp b/effects/desktopgrid.cpp index a468dc563f..f53798f20f 100644 --- a/effects/desktopgrid.cpp +++ b/effects/desktopgrid.cpp @@ -71,7 +71,7 @@ DesktopGridEffect::DesktopGridEffect() border = conf.readEntry( "BorderWidth", 10 ); desktopNameAlignment = Qt::Alignment( conf.readEntry( "DesktopNameAlignment", 0 )); - customLayout = conf.readEntry( "CustomLayout", 0 ) ? true : false; + layoutMode = conf.readEntry( "LayoutMode", int( LayoutPager )); customLayoutRows = conf.readEntry( "CustomLayoutRows", 2 ); } @@ -602,11 +602,28 @@ void DesktopGridEffect::setup() hoverTimeline[effects->currentDesktop() - 1].setProgress( 1.0 ); // We need these variables for every paint so lets cache them - effects->calcDesktopLayout( &gridSize.rwidth(), &gridSize.rheight(), &orientation ); - if( customLayout ) + int x, y; + int numDesktops = effects->numberOfDesktops(); + switch( layoutMode ) { - gridSize.setWidth( ceil( effects->numberOfDesktops() / double( customLayoutRows ))); - gridSize.setHeight( customLayoutRows ); + default: + case LayoutPager: + effects->calcDesktopLayout( &gridSize.rwidth(), &gridSize.rheight(), &orientation ); + break; + case LayoutAutomatic: + y = sqrt( numDesktops ) + 0.5; + x = float( numDesktops ) / float( y ) + 0.5; + if( x * y < numDesktops ) + x++; + orientation = Qt::Horizontal; + gridSize.setWidth( x ); + gridSize.setHeight( y ); + break; + case LayoutCustom: + effects->calcDesktopLayout( &gridSize.rwidth(), &gridSize.rheight(), &orientation ); + gridSize.setWidth( ceil( effects->numberOfDesktops() / double( customLayoutRows ))); + gridSize.setHeight( customLayoutRows ); + break; } setCurrentDesktop( effects->currentDesktop() ); scale.clear(); diff --git a/effects/desktopgrid.h b/effects/desktopgrid.h index 945755f741..215bf82ae1 100644 --- a/effects/desktopgrid.h +++ b/effects/desktopgrid.h @@ -44,8 +44,12 @@ class DesktopGridEffect virtual void windowInputMouseEvent( Window w, QEvent* e ); virtual void grabbedKeyboardEvent( QKeyEvent* e ); virtual bool borderActivated( ElectricBorder border ); + + enum { LayoutPager, LayoutAutomatic, LayoutCustom }; // Layout modes + private slots: void toggle(); + private: QPointF scalePos( const QPoint& pos, int desktop, int screen = -1 ) const; QPoint unscalePos( const QPoint& pos, int* desktop = NULL ) const; @@ -61,7 +65,7 @@ class DesktopGridEffect int zoomDuration; int border; Qt::Alignment desktopNameAlignment; - bool customLayout; + int layoutMode; int customLayoutRows; bool activated; diff --git a/effects/desktopgrid_config.cpp b/effects/desktopgrid_config.cpp index c04b96941f..8663910950 100644 --- a/effects/desktopgrid_config.cpp +++ b/effects/desktopgrid_config.cpp @@ -95,8 +95,8 @@ DesktopGridEffectConfig::DesktopGridEffectConfig(QWidget* parent, const QVariant connect( m_ui->zoomDurationSpin, SIGNAL( valueChanged( int )), this, SLOT( changed() )); connect( m_ui->borderWidthSpin, SIGNAL( valueChanged( int )), this, SLOT( changed() )); connect( m_ui->desktopNameAlignmentCombo, SIGNAL( currentIndexChanged( int )), this, SLOT( changed() )); - connect( m_ui->layoutBox, SIGNAL( stateChanged( int )), this, SLOT( changed() )); - connect( m_ui->layoutBox, SIGNAL( stateChanged( int )), this, SLOT( layoutSelectionChanged() )); + connect( m_ui->layoutCombo, SIGNAL( currentIndexChanged( int )), this, SLOT( changed() )); + connect( m_ui->layoutCombo, SIGNAL( currentIndexChanged( int )), this, SLOT( layoutSelectionChanged() )); connect( m_ui->layoutRowsSpin, SIGNAL( valueChanged( int )), this, SLOT( changed() )); connect( m_ui->shortcutEditor, SIGNAL( keyChange() ), this, SLOT( changed() )); @@ -126,10 +126,8 @@ void DesktopGridEffectConfig::load() Qt::Alignment alignment = Qt::Alignment( conf.readEntry( "DesktopNameAlignment", 0 )); m_ui->desktopNameAlignmentCombo->setCurrentIndex( m_alignmentItems.indexOf( alignment )); - if( conf.readEntry( "CustomLayout", false )) - m_ui->layoutBox->setCheckState( Qt::Checked ); - else - m_ui->layoutBox->setCheckState( Qt::Unchecked ); + int layoutMode = conf.readEntry( "LayoutMode", int( DesktopGridEffect::LayoutPager )); + m_ui->layoutCombo->setCurrentIndex( layoutMode ); layoutSelectionChanged(); m_ui->layoutRowsSpin->setValue( conf.readEntry( "CustomLayoutRows", 2 )); @@ -155,7 +153,9 @@ void DesktopGridEffectConfig::save() alignment = int( m_alignmentItems[alignment] ); conf.writeEntry( "DesktopNameAlignment", alignment ); - conf.writeEntry( "CustomLayout", m_ui->layoutBox->checkState() == Qt::Checked ? 1 : 0 ); + int layoutMode = m_ui->layoutCombo->currentIndex(); + conf.writeEntry( "LayoutMode", layoutMode ); + conf.writeEntry( "CustomLayoutRows", m_ui->layoutRowsSpin->value() ); m_ui->shortcutEditor->save(); @@ -172,7 +172,7 @@ void DesktopGridEffectConfig::defaults() m_ui->zoomDurationSpin->setValue( 0 ); m_ui->borderWidthSpin->setValue( 10 ); m_ui->desktopNameAlignmentCombo->setCurrentIndex( 0 ); - m_ui->layoutBox->setCheckState( Qt::Unchecked ); + m_ui->layoutCombo->setCurrentIndex( int( DesktopGridEffect::LayoutPager )); m_ui->layoutRowsSpin->setValue( 2 ); m_ui->shortcutEditor->allDefault(); emit changed(true); @@ -180,7 +180,7 @@ void DesktopGridEffectConfig::defaults() void DesktopGridEffectConfig::layoutSelectionChanged() { - if( m_ui->layoutBox->checkState() == Qt::Checked ) + if( m_ui->layoutCombo->currentIndex() == DesktopGridEffect::LayoutCustom ) { m_ui->layoutRowsLabel->setEnabled( true ); m_ui->layoutRowsSpin->setEnabled( true ); diff --git a/effects/desktopgrid_config.h b/effects/desktopgrid_config.h index 938fd208dd..457ab31dce 100644 --- a/effects/desktopgrid_config.h +++ b/effects/desktopgrid_config.h @@ -25,6 +25,7 @@ along with this program. If not, see . #include #include "ui_desktopgrid_config.h" +#include "desktopgrid.h" namespace KWin { diff --git a/effects/desktopgrid_config.ui b/effects/desktopgrid_config.ui index 7d986c5e90..415dac76ce 100644 --- a/effects/desktopgrid_config.ui +++ b/effects/desktopgrid_config.ui @@ -79,10 +79,32 @@ - + - Custom grid &layout + &Layout mode: + + desktopNameAlignmentCombo + + + + + + + + Pager + + + + + Automatic + + + + + Custom + + @@ -173,8 +195,9 @@ zoomDurationSpin borderWidthSpin desktopNameAlignmentCombo - layoutBox + layoutCombo layoutRowsSpin + screenEdgeCombo