summaryrefslogtreecommitdiff
path: root/plugingui/eventhandler.cc
diff options
context:
space:
mode:
authorBent Bisballe Nyeng <deva@aasimon.org>2020-12-29 16:09:43 +0100
committerBent Bisballe Nyeng <deva@aasimon.org>2020-12-29 16:39:54 +0100
commit645250e1cd8ce9bc1faea599df7a1b05836bfeb8 (patch)
treec6311afab3900d2dd2aecbfbe1ac348d0e48c428 /plugingui/eventhandler.cc
parentdce64999d3325c5b55499d6ba657066efa48fbff (diff)
Split UI code into application/plugin UI and UI library.
Diffstat (limited to 'plugingui/eventhandler.cc')
-rw-r--r--plugingui/eventhandler.cc297
1 files changed, 0 insertions, 297 deletions
diff --git a/plugingui/eventhandler.cc b/plugingui/eventhandler.cc
deleted file mode 100644
index fd333b8..0000000
--- a/plugingui/eventhandler.cc
+++ /dev/null
@@ -1,297 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/***************************************************************************
- * eventhandler.cc
- *
- * Sun Oct 9 18:58:29 CEST 2011
- * Copyright 2011 Bent Bisballe Nyeng
- * deva@aasimon.org
- ****************************************************************************/
-
-/*
- * This file is part of DrumGizmo.
- *
- * DrumGizmo is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * DrumGizmo 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 Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with DrumGizmo; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
- */
-#include "eventhandler.h"
-
-#include "window.h"
-#include "painter.h"
-#include "dialog.h"
-
-namespace GUI
-{
-
-EventHandler::EventHandler(NativeWindow& nativeWindow, Window& window)
- : window(window)
- , nativeWindow(nativeWindow)
- , lastWasDoubleClick(false)
-{}
-
-bool EventHandler::hasEvent()
-{
- return !events.empty();
-}
-
-bool EventHandler::queryNextEventType(EventType type)
-{
- return !events.empty() &&
- (events.front()->type() == type);
-}
-
-std::shared_ptr<Event> EventHandler::getNextEvent()
-{
- if(events.empty())
- {
- return nullptr;
- }
-
- auto event = events.front();
- events.pop_front();
- return event;
-}
-
-void EventHandler::processEvents()
-{
- bool block_interaction{false};
- for(auto dialog : dialogs)
- {
- // Check if the dialog nativewindow (not the contained widget) is visible
- if(dialog->native->visible())
- {
- block_interaction |= dialog->isModal();
- dialog->eventHandler()->processEvents();
- }
- }
-
- events = nativeWindow.getEvents();
-
- while(hasEvent())
- {
- auto event = getNextEvent();
-
- if(event == nullptr)
- {
- continue;
- }
-
- switch(event->type()) {
- case EventType::repaint:
- break;
-
- case EventType::move:
- {
- auto moveEvent = static_cast<MoveEvent*>(event.get());
- window.moved(moveEvent->x, moveEvent->y);
- }
- break;
-
- case EventType::resize:
- {
- auto resizeEvent = static_cast<ResizeEvent*>(event.get());
- if((resizeEvent->width != window.width()) ||
- (resizeEvent->height != window.height()))
- {
- window.resized(resizeEvent->width, resizeEvent->height);
- }
- }
- break;
-
- case EventType::mouseMove:
- {
- // Skip all consecutive mouse move events and handle only the last one.
- while(queryNextEventType(EventType::mouseMove))
- {
- event = getNextEvent();
- }
-
- auto moveEvent = static_cast<MouseMoveEvent*>(event.get());
-
- auto widget = window.find(moveEvent->x, moveEvent->y);
- auto oldwidget = window.mouseFocus();
- if(widget != oldwidget)
- {
- // Send focus leave to oldwidget
- if(oldwidget)
- {
- oldwidget->mouseLeaveEvent();
- }
-
- // Send focus enter to widget
- if(widget)
- {
- widget->mouseEnterEvent();
- }
-
- window.setMouseFocus(widget);
- }
-
- if(window.buttonDownFocus())
- {
- auto widget = window.buttonDownFocus();
- moveEvent->x -= widget->translateToWindowX();
- moveEvent->y -= widget->translateToWindowY();
-
- window.buttonDownFocus()->mouseMoveEvent(moveEvent);
- break;
- }
-
- if(widget)
- {
- moveEvent->x -= widget->translateToWindowX();
- moveEvent->y -= widget->translateToWindowY();
- widget->mouseMoveEvent(moveEvent);
- }
- }
- break;
-
- case EventType::button:
- {
- if(block_interaction)
- {
- continue;
- }
-
- auto buttonEvent = static_cast<ButtonEvent*>(event.get());
- if(lastWasDoubleClick && (buttonEvent->direction == Direction::down))
- {
- lastWasDoubleClick = false;
- continue;
- }
-
- lastWasDoubleClick = buttonEvent->doubleClick;
-
- auto widget = window.find(buttonEvent->x, buttonEvent->y);
-
- if(window.buttonDownFocus())
- {
- if(buttonEvent->direction == Direction::up)
- {
- auto widget = window.buttonDownFocus();
- buttonEvent->x -= widget->translateToWindowX();
- buttonEvent->y -= widget->translateToWindowY();
-
- widget->buttonEvent(buttonEvent);
- window.setButtonDownFocus(nullptr);
- break;
- }
- }
-
- if(widget)
- {
- buttonEvent->x -= widget->translateToWindowX();
- buttonEvent->y -= widget->translateToWindowY();
-
- widget->buttonEvent(buttonEvent);
-
- if((buttonEvent->direction == Direction::down) &&
- widget->catchMouse())
- {
- window.setButtonDownFocus(widget);
- }
-
- if(widget->isFocusable())
- {
- window.setKeyboardFocus(widget);
- }
- }
- }
- break;
-
- case EventType::scroll:
- {
- if(block_interaction)
- {
- continue;
- }
-
- auto scrollEvent = static_cast<ScrollEvent*>(event.get());
-
- auto widget = window.find(scrollEvent->x, scrollEvent->y);
- if(widget)
- {
- scrollEvent->x -= widget->translateToWindowX();
- scrollEvent->y -= widget->translateToWindowY();
-
- widget->scrollEvent(scrollEvent);
- }
- }
- break;
-
- case EventType::key:
- {
- if(block_interaction)
- {
- continue;
- }
-
- // TODO: Filter out multiple arrow events.
-
- auto keyEvent = static_cast<KeyEvent*>(event.get());
- if(window.keyboardFocus())
- {
- window.keyboardFocus()->keyEvent(keyEvent);
- }
- }
- break;
-
- case EventType::close:
- if(block_interaction)
- {
- continue;
- }
-
- closeNotifier();
- break;
-
- case EventType::mouseEnter:
- {
- auto enterEvent = static_cast<MouseEnterEvent*>(event.get());
- auto widget = window.find(enterEvent->x, enterEvent->y);
- if(widget)
- {
- widget->mouseEnterEvent();
- }
- }
- break;
-
- case EventType::mouseLeave:
- {
- auto widget = window.mouseFocus();
- if(widget)
- {
- widget->mouseLeaveEvent();
- }
- }
- break;
- }
- }
-
- // Probe window and children to redraw as needed.
- // NOTE: This method will invoke native->redraw() if a redraw is needed.
- window.updateBuffer();
-}
-
-void EventHandler::registerDialog(Dialog* dialog)
-{
- dialogs.push_back(dialog);
-}
-
-void EventHandler::unregisterDialog(Dialog* dialog)
-{
- dialogs.remove(dialog);
-}
-
-
-} // GUI::