D21971: Replace ToolAction by ToggleActionMenu

Simone Gaiarin noreply at phabricator.kde.org
Wed Nov 6 07:59:48 GMT 2019


simgunz added a comment.


  I have tried to analyze all the possible cases regarding `ToggleActionMenu` placed in a toolbar.
  
  From what I understand:
  
  - `DefaultLogic` means, the developer needs to manage everything manually calling/connecting `setDefaultAction`.
  - `ImplicitDefaultAction` instead allows to set the default action automatically when an action is triggered
  
  Case 1
  ------
  
  `QToolButton::MenuButtonPopup` or `QToolButton::DelayedPopup` and `m_menuLogic == DefaultLogic`
  
  If I do not call `suggestDefaultAction` and no action is selected:
  
  1. the `ToggleActionMenu` icon is shown
  2. Clicking on the toolbar button nothing happens [weird, but maybe ok]
  3. Checking an action has no effect on the toolbar button
  4. The toolbar button is never shown as checked [weird]
  
  If I do call `suggestDefaultAction` and no action is selected:
  
  1. the toolbar button icon is set to the one of the suggested default action
  2. Clicking on the toolbarbutton always activates the suggested default action
  3. Checking a different action has no effect on points 1 and 2 [weird]
  
  Case 2
  ------
  
  `QToolButton::MenuButtonPopup` or `QToolButton::DelayedPopup` and `m_menuLogic == ImplicitDefaultAction`
  If I do call `suggestDefaultAction` and no action is selected everything works as expected.
  If I do not call `suggestDefaultAction` and no action is selected:
  
  1. the `ToggleActionMenu` icon is shown
  2. Clicking on the toolbar button nothing happens [weird, but I think it is how QToolButton is supposed to work]
  3. Checking an action makes it the default [ok]
  4. The toolbar button is shown as checked when an action is selected [ok]
  
  Case 3
  ------
  
  `QToolButton::InstantPopup` and `m_menuLogic == DefaultLogic`
  If I do not call `suggestDefaultAction` everything works as expected
  If I do call `suggestDefaultAction`: **(should raise an exception)**
  
  - The button icon is set to that of the suggested action and stays as so forever [weird]
  
  Case 4
  ------
  
  `QToolButton::InstantPopup` and `m_menuLogic == ImplicitDefaultAction` **(should raise an exception)**
  If I do not call `suggestDefaultAction`:
  
  - The button icon is set to that of the checked action [weird]
  
  If I do call `suggestDefaultAction`:
  
  - The button icon is set to that of the suggested action [weird]
  - The button icon is set to that of the checked action [weird]
  
  
  
  ---
  
  I suggest to change `ToggleActionMenu::defaultAction` to:
  
    QAction * ToggleActionMenu::defaultAction()
    {
        if ( ( m_menuLogic & ImplicitDefaultAction ) )
        {
            QAction * aChecked = checkedAction( menu() );
            if ( aChecked )
            {
                return aChecked;
            }
        }
        return m_defaultAction;
    }
  
  and get rid of `ToggleActionMenu::suggestDefaultAction`.
  
  In this way we simplify the things and in `ImplicitDefaultAction` mode it is enough to check the action after the `ToggleActionMenu` has been created to make it the default action automatically.
  
  In `PageView::setupActions` we should have the following:
  
    d->aMouseModeMenu = new ToggleActionMenu( QIcon(),QString(), this,
                                                  QToolButton::MenuButtonPopup,
                                                  ToggleActionMenu::ImplicitDefaultAction );
    d->aMouseModeMenu->addAction( d->aMouseSelect );
    d->aMouseModeMenu->addAction( d->aMouseTextSelect );
    d->aMouseModeMenu->addAction( d->aMouseTableSelect );
    d->aMouseModeMenu->setDefaultAction( d->aMouseTextSelect );
    
    ...
    
    d->aMouseSelect->setChecked( Okular::Settings::mouseMode() == Okular::Settings::EnumMouseMode::RectSelect );
    d->aMouseTextSelect->setChecked( Okular::Settings::mouseMode() == Okular::Settings::EnumMouseMode::TextSelect );
    d->aMouseTableSelect->setChecked( Okular::Settings::mouseMode() == Okular::Settings::EnumMouseMode::TableSelect );
  
  what do you think?
  
  I suggest this change and adding an exception for case 4 in the constructor.
  
  I have not yet tested what happens if you place `ToggleActionMenu` in a menu and if my suggested change breaks the things.

REPOSITORY
  R223 Okular

REVISION DETAIL
  https://phabricator.kde.org/D21971

To: davidhurka
Cc: ngraham, simgunz, okular-devel, johnzh, andisa, siddharthmanthan, maguirre, fbampaloukas, joaonetto, kezik, tfella, darcyshen, aacid
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.kde.org/pipermail/okular-devel/attachments/20191106/603c4e14/attachment-0001.html>


More information about the Okular-devel mailing list