/******************************************************************** KWin - the KDE window manager This file is part of the KDE project. Copyright (C) 2009 Nikhil Marathe This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program 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 program. If not, see . *********************************************************************/ #include "tilinglayoutfactory.h" #include #include #include #include #include "notifications.h" #include "tile.h" #include "client.h" #include "tilinglayouts/spiral/spiral.h" #include "tilinglayouts/columns/columns.h" #include "tilinglayouts/floating/floating.h" // w is the workspace pointer #define ADD_LAYOUT( lay, ctxt_name ) \ case lay##Layout:\ kDebug(1212) << #lay;\ layout = new lay( w );\ layout->setLayoutType( lay##Layout );\ Notify::raise( Notify::TilingLayoutChanged, \ i18n( "Layout changed to %1", i18nc( ctxt_name ) ) ); \ break namespace KWin { TilingLayout* TilingLayoutFactory::createLayout( int type, Workspace *w ) { Q_ASSERT( type != FirstLayout && type != LastLayout ); TilingLayout *layout; /* For new layouts, make a case entry here */ switch( type ) { case DefaultLayout: // NOTE: fall through makes first layout default layout = createLayout( indexToLayoutIndex( options->tilingLayout ), w ); break; ADD_LAYOUT( Spiral, I18N_NOOP2_NOSTRIP( "Spiral tiling layout", "Spiral" ) ); ADD_LAYOUT( Columns, I18N_NOOP2_NOSTRIP( "Two-column horizontal tiling layout", "Columns" ) ); ADD_LAYOUT( Floating, I18N_NOOP2_NOSTRIP( "Floating layout, windows aren't tiled at all", "Floating" ) ); default: kDebug(1212) << "INVALID LAYOUT!"; return NULL; } return layout; } // if next, goes next, otherwise previous TilingLayout* TilingLayoutFactory::cycleLayout( TilingLayout *curr, bool next ) { int type = curr->layoutType(); if( next ) { type++; if( type >= LastLayout ) type = FirstLayout + 1; } else { type--; if( type <= FirstLayout ) type = LastLayout - 1; } QList tiles = curr->tiles(); TilingLayout *l = createLayout( type, curr->workspace() ); foreach( Tile *t, tiles ) { curr->removeTileNoArrange( t ); } if( tiles.length() == 0 ) return l; // so that we don't rearrange after every call Tile *last = tiles.takeLast(); foreach( Tile *t, tiles ) { l->addTileNoArrange( t ); } l->addTile( last ); return l; } /** * Returns the appropriate layout enum item * Meant to be used with a combo box. * This function handles the issues of DefaultL and First and Last layouts */ int TilingLayoutFactory::indexToLayoutIndex( int index ) { int layout = DefaultLayout + index + 1; if( layout >= LastLayout ) layout = DefaultLayout + 1; if( layout <= FirstLayout ) layout = LastLayout - 1; return layout; } } // end namespace