Git commit 432e41ffb64240d9dd054429b6b952a0af92f290 by Jonathan Marten. Committed on 27/03/2012 at 13:17. Pushed by marten into branch 'master'.
A more compact 2-column layout for the address book. This simply places the collections (address books) and the items (names) panes one above each other instead of side by side. There is a new "View" menu with options for the viewing mode - the original 3-column layout, this, or the original "Simple" layout - and also the barcode option if this is configured. CCBUG:291263 REVIEW:104308 GUI: I18N: M +13 -0 kaddressbook/kaddressbook.kcfg M +5 -2 kaddressbook/kaddressbookui.rc M +126 -58 kaddressbook/mainwidget.cpp M +9 -2 kaddressbook/mainwidget.h http://commits.kde.org/kdepim/432e41ffb64240d9dd054429b6b952a0af92f290 diff --git a/kaddressbook/kaddressbook.kcfg b/kaddressbook/kaddressbook.kcfg index 7120092..086b379 100644 --- a/kaddressbook/kaddressbook.kcfg +++ b/kaddressbook/kaddressbook.kcfg @@ -43,6 +43,19 @@ <tooltip>View columns</tooltip> <whatsthis>Set the number of contact model view columns.</whatsthis> </entry> + + <entry type="Enum" name="ViewMode"> + <choices> + <choice name="Dummy" /> + <choice name="Simple" /> + <choice name="TwoColumn" /> + <choice name="ThreeColumn" /> + </choices> + <default>3</default> + <label>Viewing mode</label> + <tooltip>Viewing mode (number of columns)</tooltip> + <whatsthis>Choose the layout for the main view</whatsthis> + </entry> </group> </kcfg> diff --git a/kaddressbook/kaddressbookui.rc b/kaddressbook/kaddressbookui.rc index 2c1469d..5052523 100644 --- a/kaddressbook/kaddressbookui.rc +++ b/kaddressbook/kaddressbookui.rc @@ -44,8 +44,11 @@ <Action name="akonadi_resource_delete"/> </Menu> - <Menu name="settings"><text>&Settings</text> - <Action name="options_show_simplegui"/> + <Menu name="view" noMerge="1"><text>&View</text> + <Action name="view_mode_simple"/> + <Action name="view_mode_2columns"/> + <Action name="view_mode_3columns"/> + <Separator/> <Action name="options_show_qrcodes"/> <Separator/> <Action name="options_configure_keybinding" group="settings_configure"/> diff --git a/kaddressbook/mainwidget.cpp b/kaddressbook/mainwidget.cpp index b149149f..5d318ff 100644 --- a/kaddressbook/mainwidget.cpp +++ b/kaddressbook/mainwidget.cpp @@ -71,6 +71,7 @@ #include <KCMultiDialog> #include <QtGui/QAction> +#include <QtGui/QActionGroup> #include <QtGui/QHBoxLayout> #include <QtGui/QHeaderView> #include <QtGui/QListView> @@ -268,19 +269,11 @@ void MainWidget::configure() void MainWidget::delayedInit() { - // restore previous state - { - const KConfigGroup group( Settings::self()->config(), "UiState_MainWidgetSplitter" ); - KPIM::UiStateSaver::restoreState( mMainWidgetSplitter, group ); - } - { - const KConfigGroup group( Settings::self()->config(), "UiState_ContactView" ); - KPIM::UiStateSaver::restoreState( mItemView, group ); - } + setViewMode(0); // get default from settings + + const KConfigGroup group( Settings::self()->config(), "UiState_ContactView" ); + KPIM::UiStateSaver::restoreState( mItemView, group ); - mXmlGuiClient-> - actionCollection()-> - action( "options_show_simplegui" )->setChecked( Settings::self()->useSimpleMode() ); #if defined(HAVE_PRISON) mXmlGuiClient-> actionCollection()-> @@ -299,20 +292,10 @@ void MainWidget::delayedInit() MainWidget::~MainWidget() { mModelColumnManager->store(); + saveSplitterStates(); - { - if ( !Settings::self()->useSimpleMode() ) { - // Do not save the splitter values when in simple mode, because we can't - // restore them correctly when switching back to normal mode - - KConfigGroup group( Settings::self()->config(), "UiState_MainWidgetSplitter" ); - KPIM::UiStateSaver::saveState( mMainWidgetSplitter, group ); - } - } - { - KConfigGroup group( Settings::self()->config(), "UiState_ContactView" ); - KPIM::UiStateSaver::saveState( mItemView, group ); - } + KConfigGroup group( Settings::self()->config(), "UiState_ContactView" ); + KPIM::UiStateSaver::saveState( mItemView, group ); saveState(); @@ -390,30 +373,40 @@ void MainWidget::setupGui() QHBoxLayout *layout = new QHBoxLayout( this ); layout->setMargin( 0 ); - // The splitter that contains the three main parts of the gui - // - collection view on the left - // - item view in the middle - // - details pane on the right, that contains - // - details view stack on the top - // - contact switcher at the bottom - mMainWidgetSplitter = new QSplitter; - mMainWidgetSplitter->setObjectName( "MainWidgetSplitter" ); - - layout->addWidget( mMainWidgetSplitter ); + // Splitter 1 contains the two main parts of the GUI: + // - collection and item view splitter 2 on the left (see below) + // - details pane on the right, that contains + // - details view stack on the top + // - contact switcher at the bottom + mMainWidgetSplitter1 = new QSplitter(Qt::Horizontal); + mMainWidgetSplitter1->setObjectName( "MainWidgetSplitter1" ); + layout->addWidget( mMainWidgetSplitter1 ); + + // Splitter 2 contains the remaining parts of the GUI: + // - collection view on either the left or the top + // - item view on either the right or the bottom + // The orientation of this splitter is changed for either + // a three or two column view; in simple mode it is hidden. + mMainWidgetSplitter2 = new QSplitter(Qt::Vertical); + mMainWidgetSplitter2->setObjectName( "MainWidgetSplitter2" ); + mMainWidgetSplitter1->addWidget( mMainWidgetSplitter2 ); // the collection view mCollectionView = new Akonadi::EntityTreeView(); - mMainWidgetSplitter->addWidget( mCollectionView ); + mMainWidgetSplitter2->addWidget( mCollectionView ); // the items view mItemView = new Akonadi::EntityTreeView(); mItemView->setObjectName( "ContactView" ); mItemView->setDefaultPopupMenu( QLatin1String( "akonadi_itemview_contextmenu" ) ); - mMainWidgetSplitter->addWidget( mItemView ); + mMainWidgetSplitter2->addWidget( mItemView ); // the details pane that contains the details view stack and contact switcher mDetailsPane = new QWidget; - mMainWidgetSplitter->addWidget( mDetailsPane ); + mMainWidgetSplitter1->addWidget( mDetailsPane ); + + mMainWidgetSplitter1->setStretchFactor( 1, 9 ); // maximum width for detail + mMainWidgetSplitter2->setStretchFactor( 1, 9 ); // for intuitive resizing QVBoxLayout *detailsPaneLayout = new QVBoxLayout( mDetailsPane ); detailsPaneLayout->setMargin( 0 ); @@ -465,7 +458,6 @@ void MainWidget::setupGui() void MainWidget::setupActions( KActionCollection *collection ) { KAction *action = 0; - KToggleAction *toggleAction = 0; action = KStandardAction::print( this, SLOT(print()), collection ); action->setWhatsThis( @@ -482,11 +474,6 @@ void MainWidget::setupActions( KActionCollection *collection ) action->setWhatsThis( i18n( "Select all contacts in the current address book view." ) ); connect( action, SIGNAL(triggered(bool)), mItemView, SLOT(selectAll()) ); - toggleAction = collection->add<KToggleAction>( "options_show_simplegui" ); - toggleAction->setText( i18n( "Show Simple View" ) ); - toggleAction->setWhatsThis( i18n( "Show a simple mode of the address book view." ) ); - connect( toggleAction, SIGNAL(toggled(bool)), SLOT(setSimpleGuiMode(bool)) ); - #if defined(HAVE_PRISON) KToggleAction *qrtoggleAction; qrtoggleAction = collection->add<KToggleAction>( "options_show_qrcodes" ); @@ -495,6 +482,29 @@ void MainWidget::setupActions( KActionCollection *collection ) connect( qrtoggleAction, SIGNAL(toggled(bool)), SLOT(setQRCodeShow(bool)) ); #endif + mViewModeGroup = new QActionGroup( this ); + + KAction *act = new KAction( i18nc( "@action:inmenu", "Simple (one column)" ), mViewModeGroup ); + act->setCheckable( true ); + act->setData( 1 ); + act->setShortcut( QKeySequence( Qt::CTRL + Qt::Key_1 ) ); + act->setWhatsThis( i18n( "Show a simple mode of the address book view." ) ); + collection->addAction( "view_mode_simple", act ); + + act = new KAction( i18nc( "@action:inmenu", "Two Columns" ), mViewModeGroup ); + act->setCheckable( true ); + act->setData( 2 ); + act->setShortcut( QKeySequence( Qt::CTRL + Qt::Key_2 ) ); + collection->addAction( "view_mode_2columns", act ); + + act = new KAction( i18nc( "@action:inmenu", "Three Columns" ), mViewModeGroup ); + act->setCheckable( true ); + act->setData( 3 ); + act->setShortcut( QKeySequence( Qt::CTRL + Qt::Key_3 ) ); + collection->addAction( "view_mode_3columns", act ); + + connect( mViewModeGroup, SIGNAL(triggered(QAction *)), SLOT(setViewMode(QAction *)) ); + // import actions action = collection->addAction( "file_import_vcard" ); action->setText( i18n( "Import vCard..." ) ); @@ -620,20 +630,6 @@ void MainWidget::selectFirstItem() } } -void MainWidget::setSimpleGuiMode( bool on ) -{ - mCollectionView->setVisible( !on ); - mItemView->setVisible( !on ); - mDetailsPane->setVisible( true ); - mContactSwitcher->setVisible( on ); - - if ( mItemView->model() ) { - mItemView->setCurrentIndex( mItemView->model()->index( 0, 0 ) ); - } - - Settings::self()->setUseSimpleMode( on ); -} - bool MainWidget::showQRCodes() { #if defined(HAVE_PRISON) @@ -687,4 +683,76 @@ QAbstractItemModel *MainWidget::allContactsModel() return mAllContactsModel; } +void MainWidget::setViewMode( QAction *action ) +{ + setViewMode( action->data().toInt() ); +} + +void MainWidget::setViewMode( int mode ) +{ + int currentMode = Settings::self()->viewMode(); + //kDebug() << "cur" << currentMode << "new" << mode; + if ( mode == currentMode ) return; // nothing to do + + if ( mode == 0) + mode = currentMode; // initialisation, no save + else + saveSplitterStates(); // for 2- or 3-column mode + + if ( mode == 1 ) { // simple mode + mMainWidgetSplitter2->setVisible( false ); + mDetailsPane->setVisible( true ); + mContactSwitcher->setVisible( true ); + } + else { + mMainWidgetSplitter2->setVisible( true ); + mContactSwitcher->setVisible( false ); + + if ( mode == 2) { // 2 columns + mMainWidgetSplitter2->setOrientation( Qt::Vertical ); + } + else if ( mode == 3) { // 3 columns + mMainWidgetSplitter2->setOrientation( Qt::Horizontal ); + } + } + + Settings::self()->setViewMode( mode ); // save new mode in settings + restoreSplitterStates(); // restore state for new mode + mViewModeGroup->actions().at( mode-1 )->setChecked( true ); + + if ( mItemView->model() ) { + mItemView->setCurrentIndex( mItemView->model()->index( 0, 0 ) ); + } +} + +void MainWidget::saveSplitterStates() const +{ + // The splitter states are saved separately for each column view mode, + // but only if not in simple mode (1 column). + int currentMode = Settings::self()->viewMode(); + if ( currentMode == 1 ) + return; + + QString groupName = QString( "UiState_MainWidgetSplitter_%1" ).arg( currentMode ); + //kDebug() << "saving to group" << groupName; + KConfigGroup group( Settings::self()->config(), groupName ); + KPIM::UiStateSaver::saveState( mMainWidgetSplitter1, group ); + KPIM::UiStateSaver::saveState( mMainWidgetSplitter2, group ); +} + +void MainWidget::restoreSplitterStates() +{ + // The splitter states are restored as appropriate for the current + // column view mode, but not for simple mode (1 column). + int currentMode = Settings::self()->viewMode(); + if ( currentMode == 1 ) + return; + + QString groupName = QString( "UiState_MainWidgetSplitter_%1" ).arg( currentMode ); + //kDebug() << "restoring from group" << groupName; + KConfigGroup group( Settings::self()->config(), groupName ); + KPIM::UiStateSaver::restoreState( mMainWidgetSplitter1, group ); + KPIM::UiStateSaver::restoreState( mMainWidgetSplitter2, group ); +} + #include "mainwidget.moc" diff --git a/kaddressbook/mainwidget.h b/kaddressbook/mainwidget.h index f83bc62..f53fe9f 100644 --- a/kaddressbook/mainwidget.h +++ b/kaddressbook/mainwidget.h @@ -48,6 +48,7 @@ class QSplitter; class QStackedWidget; class QuickSearchWidget; class XXPortManager; +class QActionGroup; class KADDRESSBOOK_EXPORT MainWidget : public QWidget { @@ -70,7 +71,7 @@ class KADDRESSBOOK_EXPORT MainWidget : public QWidget void itemSelectionChanged( const QModelIndex &, const QModelIndex & ); void selectFirstItem(); - void setSimpleGuiMode( bool on ); + void setViewMode( QAction *action ); void setQRCodeShow( bool on ); void restoreState(); @@ -80,6 +81,9 @@ class KADDRESSBOOK_EXPORT MainWidget : public QWidget void setupGui(); void setupActions( KActionCollection * ); bool showQRCodes(); + void setViewMode( int mode ); + void saveSplitterStates() const; + void restoreSplitterStates(); QAbstractItemModel *allContactsModel(); @@ -102,13 +106,16 @@ class KADDRESSBOOK_EXPORT MainWidget : public QWidget QStackedWidget *mDetailsViewStack; ContactSwitcher *mContactSwitcher; - QSplitter *mMainWidgetSplitter; + QSplitter *mMainWidgetSplitter1; + QSplitter *mMainWidgetSplitter2; Akonadi::ContactViewer *mContactDetails; Akonadi::ContactGroupViewer *mContactGroupDetails; QWidget *mEmptyDetails; Akonadi::StandardContactActionManager *mActionManager; QItemSelectionModel *mCollectionSelectionModel; + QActionGroup *mViewModeGroup; + XXPortManager *mXXPortManager; ModelColumnManager *mModelColumnManager; KXMLGUIClient *mXmlGuiClient;