viewsplit.cpp 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734
  1. #include "viewsplit.h"
  2. #include <QHBoxLayout>
  3. #include <QToolButton>
  4. #include <QAction>
  5. #include <QDragEnterEvent>
  6. #include <QDropEvent>
  7. #include <QMenu>
  8. #include <QTabBar>
  9. #include <QMimeData>
  10. #include <QFileInfo>
  11. #include <QShortcut>
  12. #include "viewwindow.h"
  13. #include "viewarea.h"
  14. #include <core/vnotex.h>
  15. #include <core/thememgr.h>
  16. #include <utils/iconutils.h>
  17. #include <utils/pathutils.h>
  18. #include "widgetsfactory.h"
  19. #include <utils/widgetutils.h>
  20. #include <utils/urldragdroputils.h>
  21. #include <utils/clipboardutils.h>
  22. #include <core/configmgr.h>
  23. #include <core/coreconfig.h>
  24. #include "propertydefs.h"
  25. #include "fileopenparameters.h"
  26. using namespace vnotex;
  27. QIcon ViewSplit::s_windowListIcon;
  28. QIcon ViewSplit::s_windowListActiveIcon;
  29. QIcon ViewSplit::s_menuIcon;
  30. QIcon ViewSplit::s_menuActiveIcon;
  31. const QString ViewSplit::c_activeActionButtonForegroundName = "widgets#viewsplit#action_button#active#fg";
  32. const QString ViewSplit::c_actionButtonForegroundName = "widgets#viewsplit#action_button#fg";
  33. ViewSplit::ViewSplit(const QVector<QSharedPointer<ViewWorkspace>> &p_allWorkspaces,
  34. const QSharedPointer<ViewWorkspace> &p_workspace,
  35. QWidget *p_parent)
  36. : QTabWidget(p_parent),
  37. m_allWorkspaces(p_allWorkspaces)
  38. {
  39. setAcceptDrops(true);
  40. setupUI();
  41. setupShortcuts();
  42. setWorkspace(p_workspace);
  43. }
  44. ViewSplit::~ViewSplit()
  45. {
  46. Q_ASSERT(!m_workspace);
  47. }
  48. void ViewSplit::setupUI()
  49. {
  50. // Property of QTabWidget.
  51. setUsesScrollButtons(true);
  52. setElideMode(Qt::ElideRight);
  53. setTabsClosable(true);
  54. setMovable(true);
  55. setDocumentMode(true);
  56. setupCornerWidget();
  57. setupTabBar();
  58. connect(this, &QTabWidget::tabCloseRequested,
  59. this, [this](int p_idx) {
  60. emit focused(this);
  61. closeTab(p_idx);
  62. });
  63. connect(this, &QTabWidget::tabBarDoubleClicked,
  64. this, &ViewSplit::closeTab);
  65. connect(this, &QTabWidget::tabBarClicked,
  66. this, [this](int p_idx) {
  67. Q_UNUSED(p_idx);
  68. focusCurrentViewWindow();
  69. emit focused(this);
  70. });
  71. connect(this, &QTabWidget::currentChanged,
  72. this, [this](int p_idx) {
  73. Q_UNUSED(p_idx);
  74. focusCurrentViewWindow();
  75. emit currentViewWindowChanged(getCurrentViewWindow());
  76. });
  77. }
  78. void ViewSplit::focusCurrentViewWindow()
  79. {
  80. auto win = getCurrentViewWindow();
  81. if (win) {
  82. win->setFocus();
  83. } else {
  84. setFocus();
  85. }
  86. }
  87. void ViewSplit::setupCornerWidget()
  88. {
  89. initIcons();
  90. // Container.
  91. auto widget = new QWidget(this);
  92. auto layout = new QHBoxLayout(widget);
  93. layout->setContentsMargins(0, 0, 0, 0);
  94. // Widnow list button.
  95. {
  96. m_windowListButton = new QToolButton(this);
  97. m_windowListButton->setPopupMode(QToolButton::InstantPopup);
  98. m_windowListButton->setProperty(PropertyDefs::s_actionToolButton, true);
  99. auto act = new QAction(s_windowListIcon, tr("Windows List"), m_windowListButton);
  100. m_windowListButton->setDefaultAction(act);
  101. auto menu = WidgetsFactory::createMenu(m_windowListButton);
  102. connect(menu, &QMenu::aboutToShow,
  103. this, [this, menu]() {
  104. updateWindowList(menu);
  105. });
  106. connect(menu, &QMenu::triggered,
  107. this, [this](QAction *p_act) {
  108. int idx = p_act->data().toInt();
  109. setCurrentViewWindow(getViewWindow(idx));
  110. });
  111. m_windowListButton->setMenu(menu);
  112. layout->addWidget(m_windowListButton);
  113. }
  114. // Menu button.
  115. {
  116. m_menuButton = new QToolButton(this);
  117. m_menuButton->setPopupMode(QToolButton::InstantPopup);
  118. m_menuButton->setProperty(PropertyDefs::s_actionToolButton, true);
  119. auto act = new QAction(s_menuIcon, tr("Workspaces and Splits"), m_menuButton);
  120. m_menuButton->setDefaultAction(act);
  121. auto menu = WidgetsFactory::createMenu(m_menuButton);
  122. connect(menu, &QMenu::aboutToShow,
  123. this, [this, menu]() {
  124. updateMenu(menu);
  125. });
  126. m_menuButton->setMenu(menu);
  127. layout->addWidget(m_menuButton);
  128. }
  129. widget->installEventFilter(this);
  130. setCornerWidget(widget, Qt::TopRightCorner);
  131. }
  132. bool ViewSplit::eventFilter(QObject *p_object, QEvent *p_event)
  133. {
  134. if (p_object == cornerWidget()) {
  135. if (p_event->type() == QEvent::Resize) {
  136. auto resizeEve = static_cast<QResizeEvent *>(p_event);
  137. int height = resizeEve->size().height();
  138. if (height > 0) {
  139. // Make corner widget visible even when there is no tab.
  140. cornerWidget()->setMinimumHeight(height);
  141. }
  142. }
  143. } else if (p_object == tabBar()) {
  144. if (p_event->type() == QEvent::MouseButtonRelease) {
  145. auto mouseEve = static_cast<QMouseEvent *>(p_event);
  146. if (mouseEve->button() == Qt::MiddleButton) {
  147. int idx = tabBar()->tabAt(mouseEve->pos());
  148. closeTab(idx);
  149. }
  150. }
  151. }
  152. return false;
  153. }
  154. void ViewSplit::setupTabBar()
  155. {
  156. auto bar = tabBar();
  157. bar->setContextMenuPolicy(Qt::CustomContextMenu);
  158. // Middle click to close tab.
  159. bar->installEventFilter(this);
  160. connect(bar, &QTabBar::customContextMenuRequested,
  161. this, [this](const QPoint &p_pos) {
  162. int idx = tabBar()->tabAt(p_pos);
  163. if (idx == -1) {
  164. return;
  165. }
  166. QScopedPointer<QMenu> menu(WidgetsFactory::createMenu());
  167. createContextMenuOnTabBar(menu.data(), idx);
  168. if (!menu->isEmpty()) {
  169. menu->exec(tabBar()->mapToGlobal(p_pos));
  170. }
  171. });
  172. }
  173. void ViewSplit::initIcons()
  174. {
  175. if (!s_windowListIcon.isNull()) {
  176. return;
  177. }
  178. const auto &themeMgr = VNoteX::getInst().getThemeMgr();
  179. const QString windowListIconName("split_window_list.svg");
  180. const QString menuIconName("split_menu.svg");
  181. const QString fg = themeMgr.paletteColor(c_actionButtonForegroundName);
  182. const QString activeFg = themeMgr.paletteColor(c_activeActionButtonForegroundName);
  183. s_windowListIcon = IconUtils::fetchIcon(themeMgr.getIconFile(windowListIconName), fg);
  184. s_windowListActiveIcon = IconUtils::fetchIcon(themeMgr.getIconFile(windowListIconName), activeFg);
  185. s_menuIcon = IconUtils::fetchIcon(themeMgr.getIconFile(menuIconName), fg);
  186. s_menuActiveIcon = IconUtils::fetchIcon(themeMgr.getIconFile(menuIconName), activeFg);
  187. }
  188. void ViewSplit::setWorkspace(const QSharedPointer<ViewWorkspace> &p_workspace)
  189. {
  190. if (m_workspace == p_workspace) {
  191. return;
  192. }
  193. updateAndTakeCurrentWorkspace();
  194. m_workspace = p_workspace;
  195. if (m_workspace) {
  196. Q_ASSERT(!m_workspace->m_visible);
  197. for (auto win : m_workspace->m_viewWindows) {
  198. addViewWindow(win);
  199. }
  200. int idx = m_workspace->m_currentViewWindowIndex;
  201. if (idx >= 0 && idx < m_workspace->m_viewWindows.size()) {
  202. setCurrentViewWindow(m_workspace->m_viewWindows[idx]);
  203. }
  204. m_workspace->m_visible = true;
  205. }
  206. }
  207. void ViewSplit::updateAndTakeCurrentWorkspace()
  208. {
  209. if (m_workspace) {
  210. // Store current workspace.
  211. m_workspace->m_currentViewWindowIndex = currentIndex();
  212. // Take all the view windows out.
  213. int cnt = getViewWindowCount();
  214. m_workspace->m_viewWindows.resize(cnt);
  215. for (int i = cnt - 1; i >= 0; --i) {
  216. auto window = getViewWindow(i);
  217. takeViewWindow(window);
  218. m_workspace->m_viewWindows[i] = window;
  219. }
  220. m_workspace->m_visible = false;
  221. m_workspace = nullptr;
  222. } else {
  223. Q_ASSERT(getViewWindowCount() == 0);
  224. }
  225. }
  226. QVector<ViewWindow *> ViewSplit::findBuffer(const Buffer *p_buffer) const
  227. {
  228. QVector<ViewWindow *> wins;
  229. int cnt = getViewWindowCount();
  230. for (int i = 0; i < cnt; ++i) {
  231. auto win = getViewWindow(i);
  232. if (win->getBuffer() == p_buffer) {
  233. wins.push_back(win);
  234. }
  235. }
  236. return wins;
  237. }
  238. ViewWindow *ViewSplit::getViewWindow(int p_idx) const
  239. {
  240. return dynamic_cast<ViewWindow *>(widget(p_idx));
  241. }
  242. int ViewSplit::getViewWindowCount() const
  243. {
  244. return count();
  245. }
  246. void ViewSplit::addViewWindow(ViewWindow *p_win)
  247. {
  248. int idx = addTab(p_win, p_win->getIcon(), p_win->getName());
  249. setTabToolTip(idx, p_win->getTitle());
  250. p_win->setViewSplit(this);
  251. p_win->setVisible(true);
  252. connect(p_win, &ViewWindow::focused,
  253. this, [this]() {
  254. emit focused(this);
  255. });
  256. connect(p_win, &ViewWindow::statusChanged,
  257. this, [this]() {
  258. auto win = dynamic_cast<ViewWindow *>(sender());
  259. int idx = indexOf(win);
  260. Q_ASSERT(idx != -1);
  261. setTabIcon(idx, win->getIcon());
  262. });
  263. connect(p_win, &ViewWindow::nameChanged,
  264. this, [this]() {
  265. auto win = dynamic_cast<ViewWindow *>(sender());
  266. int idx = indexOf(win);
  267. Q_ASSERT(idx != -1);
  268. setTabText(idx, win->getName());
  269. });
  270. }
  271. ViewWindow *ViewSplit::getCurrentViewWindow() const
  272. {
  273. return dynamic_cast<ViewWindow *>(currentWidget());
  274. }
  275. void ViewSplit::setCurrentViewWindow(ViewWindow *p_win)
  276. {
  277. if (!p_win) {
  278. return;
  279. }
  280. Q_ASSERT(p_win->getViewSplit() == this);
  281. setCurrentWidget(p_win);
  282. }
  283. void ViewSplit::takeViewWindow(ViewWindow *p_win)
  284. {
  285. Q_ASSERT(p_win->getViewSplit() == this);
  286. p_win->setViewSplit(nullptr);
  287. int idx = indexOf(p_win);
  288. Q_ASSERT(idx != -1);
  289. removeTab(idx);
  290. disconnect(p_win, 0, this, 0);
  291. p_win->setVisible(false);
  292. p_win->setParent(nullptr);
  293. }
  294. QSharedPointer<ViewWorkspace> ViewSplit::getWorkspace() const
  295. {
  296. return m_workspace;
  297. }
  298. void ViewSplit::setActive(bool p_active)
  299. {
  300. if (p_active) {
  301. m_windowListButton->defaultAction()->setIcon(s_windowListActiveIcon);
  302. m_menuButton->defaultAction()->setIcon(s_menuActiveIcon);
  303. } else {
  304. m_windowListButton->defaultAction()->setIcon(s_windowListIcon);
  305. m_menuButton->defaultAction()->setIcon(s_menuIcon);
  306. }
  307. }
  308. void ViewSplit::updateWindowList(QMenu *p_menu)
  309. {
  310. p_menu->clear();
  311. if (!m_windowListActionGroup) {
  312. m_windowListActionGroup = new QActionGroup(p_menu);
  313. } else {
  314. WidgetUtils::clearActionGroup(m_windowListActionGroup);
  315. }
  316. auto currentViewWindow = getCurrentViewWindow();
  317. int cnt = getViewWindowCount();
  318. if (cnt == 0) {
  319. // Add a dummy entry.
  320. auto act = p_menu->addAction(tr("No window to show here"));
  321. act->setEnabled(false);
  322. return;
  323. }
  324. for (int i = 0; i < cnt; ++i) {
  325. auto window = getViewWindow(i);
  326. auto act = new QAction(window->getIcon(),
  327. window->getName(),
  328. m_windowListActionGroup);
  329. act->setToolTip(window->getTitle());
  330. act->setData(i);
  331. act->setCheckable(true);
  332. p_menu->addAction(act);
  333. if (currentViewWindow == window) {
  334. act->setChecked(true);
  335. }
  336. }
  337. }
  338. void ViewSplit::updateMenu(QMenu *p_menu)
  339. {
  340. const auto &coreConfig = ConfigMgr::getInst().getCoreConfig();
  341. p_menu->clear();
  342. const auto &themeMgr = VNoteX::getInst().getThemeMgr();
  343. // Workspaces.
  344. {
  345. p_menu->addSection(tr("Workspaces"));
  346. if (!m_workspaceActionGroup) {
  347. m_workspaceActionGroup = new QActionGroup(p_menu);
  348. connect(m_workspaceActionGroup, &QActionGroup::triggered,
  349. this, [this](QAction *p_act) {
  350. int idx = p_act->data().toInt();
  351. const auto &newWorkspace = m_allWorkspaces[idx];
  352. if (newWorkspace != m_workspace) {
  353. setWorkspace(newWorkspace);
  354. }
  355. });
  356. } else {
  357. WidgetUtils::clearActionGroup(m_workspaceActionGroup);
  358. }
  359. for (int i = 0; i < m_allWorkspaces.size(); ++i) {
  360. auto act = new QAction(tr("Workspace %1").arg(m_allWorkspaces[i]->c_id),
  361. m_workspaceActionGroup);
  362. act->setData(i);
  363. act->setCheckable(true);
  364. act->setEnabled(!m_allWorkspaces[i]->m_visible);
  365. p_menu->addAction(act);
  366. if (m_allWorkspaces[i] == m_workspace) {
  367. act->setEnabled(true);
  368. act->setChecked(true);
  369. }
  370. }
  371. p_menu->addSeparator();
  372. {
  373. auto act = p_menu->addAction(tr("New Workspace"),
  374. [this]() {
  375. emit newWorkspaceRequested(this);
  376. });
  377. WidgetUtils::addActionShortcutText(act, coreConfig.getShortcut(CoreConfig::NewWorkspace));
  378. }
  379. p_menu->addAction(tr("Remove Workspace"),
  380. [this]() {
  381. emit removeWorkspaceRequested(this);
  382. });
  383. }
  384. // Splits.
  385. {
  386. p_menu->addSection(tr("Split"));
  387. auto icon = themeMgr.getIconFile(QStringLiteral("vertical_split.svg"));
  388. auto act = p_menu->addAction(IconUtils::fetchIconWithDisabledState(icon),
  389. tr("Vertical Split"),
  390. [this]() {
  391. emit verticalSplitRequested(this);
  392. });
  393. WidgetUtils::addActionShortcutText(act, coreConfig.getShortcut(CoreConfig::VerticalSplit));
  394. icon = themeMgr.getIconFile(QStringLiteral("horizontal_split.svg"));
  395. act = p_menu->addAction(IconUtils::fetchIconWithDisabledState(icon),
  396. tr("Horizontal Split"),
  397. [this]() {
  398. emit horizontalSplitRequested(this);
  399. });
  400. WidgetUtils::addActionShortcutText(act, coreConfig.getShortcut(CoreConfig::HorizontalSplit));
  401. act = p_menu->addAction(tr("Maximize Split"),
  402. [this]() {
  403. emit maximizeSplitRequested(this);
  404. });
  405. WidgetUtils::addActionShortcutText(act, coreConfig.getShortcut(CoreConfig::MaximizeSplit));
  406. act = p_menu->addAction(tr("Distribute Splits"),
  407. [this]() {
  408. emit distributeSplitsRequested();
  409. });
  410. WidgetUtils::addActionShortcutText(act, coreConfig.getShortcut(CoreConfig::DistributeSplits));
  411. act = p_menu->addAction(tr("Remove Split"),
  412. [this]() {
  413. emit removeSplitRequested(this);
  414. });
  415. act = p_menu->addAction(tr("Remove Split And Workspace"),
  416. [this]() {
  417. emit removeSplitAndWorkspaceRequested(this);
  418. });
  419. WidgetUtils::addActionShortcutText(act, coreConfig.getShortcut(CoreConfig::RemoveSplitAndWorkspace));
  420. }
  421. }
  422. void ViewSplit::createContextMenuOnTabBar(QMenu *p_menu, int p_tabIdx) const
  423. {
  424. Q_ASSERT(p_tabIdx > -1);
  425. // Close Tab.
  426. auto closeTabAct = p_menu->addAction(tr("Close Tab"),
  427. [this, p_tabIdx]() {
  428. const_cast<ViewSplit *>(this)->closeTab(p_tabIdx);
  429. });
  430. WidgetUtils::addActionShortcutText(closeTabAct,
  431. ConfigMgr::getInst().getCoreConfig().getShortcut(CoreConfig::Shortcut::CloseTab));
  432. // Close Other Tabs.
  433. p_menu->addAction(tr("Close Other Tabs"),
  434. [this, p_tabIdx]() {
  435. QVector<ViewWindow *> windowsNeedToClose;
  436. int cnt = getViewWindowCount();
  437. for (int i = 0; i < cnt; ++i) {
  438. if (i != p_tabIdx) {
  439. windowsNeedToClose.push_back(getViewWindow(i));
  440. }
  441. }
  442. for (auto win : windowsNeedToClose) {
  443. emit const_cast<ViewSplit *>(this)->viewWindowCloseRequested(win);
  444. }
  445. });
  446. // Close Tabs To The Right.
  447. p_menu->addAction(tr("Close Tabs To The Right"),
  448. [this, p_tabIdx]() {
  449. int cnt = getViewWindowCount();
  450. for (int i = cnt - 1; i > p_tabIdx; --i) {
  451. const_cast<ViewSplit *>(this)->closeTab(i);
  452. }
  453. });
  454. p_menu->addSeparator();
  455. // Copy Path.
  456. p_menu->addAction(tr("Copy Path"),
  457. [this, p_tabIdx]() {
  458. auto win = getViewWindow(p_tabIdx);
  459. if (win) {
  460. const auto filePath = win->getBuffer()->getPath();
  461. ClipboardUtils::setTextToClipboard(filePath);
  462. VNoteX::getInst().showStatusMessageShort(tr("Copied path: %1").arg(filePath));
  463. }
  464. });
  465. // Open Location.
  466. p_menu->addAction(tr("Open Location"),
  467. [this, p_tabIdx]() {
  468. auto win = getViewWindow(p_tabIdx);
  469. if (win) {
  470. const auto location = PathUtils::parentDirPath(win->getBuffer()->getPath());
  471. WidgetUtils::openUrlByDesktop(QUrl::fromLocalFile(location));
  472. }
  473. });
  474. // Locate Node.
  475. auto win = getViewWindow(p_tabIdx);
  476. if (win && win->getBuffer()->getNode()) {
  477. auto locateNodeAct = p_menu->addAction(tr("Locate Node"),
  478. [this, p_tabIdx]() {
  479. auto win = getViewWindow(p_tabIdx);
  480. auto node = win->getBuffer()->getNode();
  481. if (node) {
  482. emit VNoteX::getInst().locateNodeRequested(node);
  483. }
  484. });
  485. WidgetUtils::addActionShortcutText(locateNodeAct,
  486. ConfigMgr::getInst().getCoreConfig().getShortcut(CoreConfig::Shortcut::LocateNode));
  487. }
  488. }
  489. void ViewSplit::closeTab(int p_idx)
  490. {
  491. auto win = getViewWindow(p_idx);
  492. if (win) {
  493. emit viewWindowCloseRequested(win);
  494. }
  495. }
  496. void ViewSplit::mousePressEvent(QMouseEvent *p_event)
  497. {
  498. QTabWidget::mousePressEvent(p_event);
  499. // For an empty QTabWidget, we need to focus this split when user press
  500. // the space of widget.
  501. emit focused(this);
  502. }
  503. bool ViewSplit::forEachViewWindow(const ViewWindowSelector &p_func)
  504. {
  505. int cnt = getViewWindowCount();
  506. for (int i = 0; i < cnt; ++i) {
  507. auto win = getViewWindow(i);
  508. if (!p_func(win)) {
  509. return false;
  510. }
  511. }
  512. return true;
  513. }
  514. QVector<ViewSplit::ViewWindowNavigationModeInfo> ViewSplit::getNavigationModeInfo() const
  515. {
  516. QVector<ViewWindowNavigationModeInfo> infos;
  517. auto bar = tabBar();
  518. for (int i = 0; i < bar->count(); ++i) {
  519. QPoint tl = bar->tabRect(i).topLeft();
  520. if (tl.x() < 0 || tl.x() >= bar->width()) {
  521. continue;
  522. }
  523. ViewWindowNavigationModeInfo info;
  524. info.m_topLeft = bar->mapToParent(tl);
  525. info.m_viewWindow = getViewWindow(i);
  526. infos.append(info);
  527. }
  528. return infos;
  529. }
  530. void ViewSplit::dragEnterEvent(QDragEnterEvent *p_event)
  531. {
  532. if (UrlDragDropUtils::handleDragEnterEvent(p_event)) {
  533. return;
  534. }
  535. QTabWidget::dragEnterEvent(p_event);
  536. }
  537. void ViewSplit::dropEvent(QDropEvent *p_event)
  538. {
  539. if (UrlDragDropUtils::handleDropEvent(p_event, [](const QStringList &p_files) {
  540. for (const auto &file : p_files) {
  541. emit VNoteX::getInst().openFileRequested(file, QSharedPointer<FileOpenParameters>::create());
  542. }
  543. })) {
  544. return;
  545. }
  546. QTabWidget::dropEvent(p_event);
  547. }
  548. void ViewSplit::setupShortcuts()
  549. {
  550. const auto &coreConfig = ConfigMgr::getInst().getCoreConfig();
  551. // NewWorkspace.
  552. {
  553. auto shortcut = WidgetUtils::createShortcut(coreConfig.getShortcut(CoreConfig::NewWorkspace), this, Qt::WidgetWithChildrenShortcut);
  554. if (shortcut) {
  555. connect(shortcut, &QShortcut::activated,
  556. this, [this]() {
  557. emit newWorkspaceRequested(this);
  558. });
  559. }
  560. }
  561. // VerticalSplit.
  562. {
  563. auto shortcut = WidgetUtils::createShortcut(coreConfig.getShortcut(CoreConfig::VerticalSplit), this, Qt::WidgetWithChildrenShortcut);
  564. if (shortcut) {
  565. connect(shortcut, &QShortcut::activated,
  566. this, [this]() {
  567. emit verticalSplitRequested(this);
  568. });
  569. }
  570. }
  571. // HorizontalSplit.
  572. {
  573. auto shortcut = WidgetUtils::createShortcut(coreConfig.getShortcut(CoreConfig::HorizontalSplit), this, Qt::WidgetWithChildrenShortcut);
  574. if (shortcut) {
  575. connect(shortcut, &QShortcut::activated,
  576. this, [this]() {
  577. emit horizontalSplitRequested(this);
  578. });
  579. }
  580. }
  581. // MaximizeSplit.
  582. {
  583. auto shortcut = WidgetUtils::createShortcut(coreConfig.getShortcut(CoreConfig::MaximizeSplit), this, Qt::WidgetWithChildrenShortcut);
  584. if (shortcut) {
  585. connect(shortcut, &QShortcut::activated,
  586. this, [this]() {
  587. emit maximizeSplitRequested(this);
  588. });
  589. }
  590. }
  591. // DistributeSplits.
  592. {
  593. auto shortcut = WidgetUtils::createShortcut(coreConfig.getShortcut(CoreConfig::DistributeSplits), this, Qt::WidgetWithChildrenShortcut);
  594. if (shortcut) {
  595. connect(shortcut, &QShortcut::activated,
  596. this, [this]() {
  597. emit distributeSplitsRequested();
  598. });
  599. }
  600. }
  601. // RemoveSplitAndWorkspace.
  602. {
  603. auto shortcut = WidgetUtils::createShortcut(coreConfig.getShortcut(CoreConfig::RemoveSplitAndWorkspace), this, Qt::WidgetWithChildrenShortcut);
  604. if (shortcut) {
  605. connect(shortcut, &QShortcut::activated,
  606. this, [this]() {
  607. emit removeSplitAndWorkspaceRequested(this);
  608. });
  609. }
  610. }
  611. }
  612. void ViewSplit::focus()
  613. {
  614. focusCurrentViewWindow();
  615. }