Mercurial > octave
diff libgui/src/dw-main-window.cc @ 25411:ad3d018e595f
provide shortcuts for switching between widgets in var. editor (bug #53002)
* dw-main-window.cc (dw_main_window): add new actions for switching to
next/previous widget, collect all actions that are required in floating
widgets in a list;
(notice_settings): set the shortcuts for the new actions;
(request_close_file, request_close_other_files, request_close_all_files):
renamed, dropping term file, and using the new class variable storing
the list of current dock widgets;
(request_switch_left, request_switch_right): new slots for the new actions;
(request_switch): function with common part for switching widgets;
(event): re-implementation of the event method, updating the list of all
dock widgets when widget was added or removed, and adding actions to
floating widgets when floating status has changed.
* dw_main-window.h: re-implemented event, new actions wit new slots for
switching between widgets, new class variables for widget list and list
of actions for floating widgets
author | Torsten <mttl@mailbox.org> |
---|---|
date | Sat, 26 May 2018 20:50:46 +0200 |
parents | a78e5b8d5ee7 |
children | 00f796120a6d |
line wrap: on
line diff
--- a/libgui/src/dw-main-window.cc Thu May 24 18:42:52 2018 -0700 +++ b/libgui/src/dw-main-window.cc Sat May 26 20:50:46 2018 +0200 @@ -47,19 +47,34 @@ = add_action (nullptr, resource_manager::icon ("window-close",false), tr ("&Close"), - SLOT (request_close_file ()), this); + SLOT (request_close ()), this); m_close_all_action = add_action (nullptr, resource_manager::icon ("window-close",false), tr ("Close &All"), - SLOT (request_close_all_files ()), this); + SLOT (request_close_all ()), this); m_close_others_action = add_action (nullptr, resource_manager::icon ("window-close",false), tr ("Close &Other"), - SLOT (request_close_other_files ()), this); + SLOT (request_close_other ()), this); + + m_switch_left_action + = add_action (nullptr, QIcon (), tr ("Switch to &Left Widget"), + SLOT (request_switch_left ()), this); + + m_switch_right_action + = add_action (nullptr, QIcon (), tr ("Switch to &Right Widget"), + SLOT (request_switch_right ()), this); + + // The list of actions for floating widgets + m_actions_list << m_close_action; + m_actions_list << m_close_others_action; + m_actions_list << m_close_all_action; + m_actions_list << m_switch_left_action; + m_actions_list << m_switch_right_action; notice_settings (resource_manager::get_settings ()); } @@ -120,49 +135,118 @@ shortcut_manager::set_shortcut (m_close_action, "editor_file:close"); shortcut_manager::set_shortcut (m_close_all_action, "editor_file:close_all"); shortcut_manager::set_shortcut (m_close_others_action, "editor_file:close_other"); + + shortcut_manager::set_shortcut (m_switch_left_action, "editor_tabs:switch_left_tab"); + shortcut_manager::set_shortcut (m_switch_right_action, "editor_tabs:switch_right_tab"); } // Slots for handling actions // Close current widget - void dw_main_window::request_close_file () + void dw_main_window::request_close () { - QList<QDockWidget *> list = findChildren<QDockWidget *>(); - - for (int i = 0; i < list.length (); i++) + for (int i = 0; i < m_dw_list.length (); i++) { - if (list.at (i)->hasFocus ()) + if (m_dw_list.at (i)->hasFocus ()) { - list.at (i)->close (); + m_dw_list.at (i)->close (); if (i > 0) - list.at (i-1)->setFocus (); + m_dw_list.at (i-1)->setFocus (); break; } } } // Close other widgets - void dw_main_window::request_close_other_files () + void dw_main_window::request_close_other () { - QList<QDockWidget *> list = findChildren<QDockWidget *>(); - - for (int i = list.length () - 1; i >= 0; i--) + for (int i = m_dw_list.length () - 1; i >= 0; i--) { - if (! list.at (i)->hasFocus ()) - list.at (i)->close (); + if (! m_dw_list.at (i)->hasFocus ()) + m_dw_list.at (i)->close (); } } // Close all widgets - void dw_main_window::request_close_all_files () + void dw_main_window::request_close_all () + { + for (int i = m_dw_list.length () - 1; i >= 0; i--) + m_dw_list.at (i)->close (); + } + + // Switch to left widget + void dw_main_window::request_switch_left () + { + request_switch (-1); + } + + // Switch to right widget + void dw_main_window::request_switch_right () + { + request_switch (1); + } + + // Switch to left/right widget + void dw_main_window::request_switch (int direction) { - QList<QDockWidget *> list = findChildren<QDockWidget *>(); + int active = -1, next; + + for (int i = m_dw_list.length () - 1; i >= 0; i--) + { + if (m_dw_list.at (i)->hasFocus ()) + { + active = i; + break; + } + } + + if (active == -1) + return; + + if (direction == -1 && active == 0) + next = m_dw_list.length () - 1; + else if (direction == 1 && active == m_dw_list.length () - 1) + next = 0; + else + next = active + direction; + + m_dw_list.at (next)->raise (); + m_dw_list.at (next)->activateWindow (); + m_dw_list.at (next)->setFocus (); + } + - for (int i = list.length () - 1; i >= 0; i--) - list.at (i)->close (); + // Reimplemented Event + bool dw_main_window::event (QEvent *ev) + { + if (ev->type () == QEvent::ChildAdded || + ev->type () == QEvent::ChildRemoved) + { + // Adding or Removing a child indicates that a dock widget was + // created or removed. + // In all cases, the list of dock widgets has to be updated. + m_dw_list = findChildren<QDockWidget *>(); + } + + if (ev->type () == QEvent::StyleChange) + { + // This might indicate un- or re-docking a widget: Make sure + // floating widget get a copy of our actions + for (int i = m_dw_list.length () - 1; i >= 0; i--) + { + // First remove possibly existing actions + for (int j = m_actions_list.length () - 1; j >0; j--) + m_dw_list.at (i)->removeAction (m_actions_list.at (j)); + + // Then add our actions for floating widgets + if (m_dw_list.at (i)->isFloating ()) + m_dw_list.at (i)->addActions (m_actions_list); + } + } + + return QMainWindow::event (ev); } } -