Esempio n. 1
0
void CTextInput::keyPressed( const SDL_KeyboardEvent & key )
{
	if(!focus || key.state != SDL_PRESSED)
		return;

	if(key.keysym.sym == SDLK_TAB)
	{
		moveFocus();
		GH.breakEventHandling();
		return;
	}

	std::string oldText = text;
	switch(key.keysym.sym)
	{
	case SDLK_BACKSPACE:
		if(!text.empty())
			text.resize(text.size()-1);
		break;
	default:
		if (key.keysym.unicode < ' ')
			return;
		else
			text += key.keysym.unicode; //TODO 16-/>8
		break;
	}

	filters(text, oldText);
	if (text != oldText)
	{
		redraw();
		cb(text);
	}
}
Esempio n. 2
0
void EventEngine::run(Control &c)
{
	for (bool redraw = true;;)
	{
		if (redraw)
		{
			_graphics.resetColors();
			_graphics.clearScreen();
			_graphics.setCursorVisibility(false);
			for (size_t p = 0; p < 3; p++) {
				c.draw(_graphics, 0, 0, p);
			}
			redraw = false;
			Control * focused = Control::getFocus();
			if (dynamic_cast<TextBox *>(focused) != NULL) {
				static_cast<TextBox *>(focused)->moveCurser(_graphics);
			}
		}

		INPUT_RECORD record;
		DWORD count;
		ReadConsoleInput(_console, &record, 1, &count);
		switch (record.EventType)
		{
		case KEY_EVENT:
		{
			auto f = Control::getFocus();
			if (f != nullptr && record.Event.KeyEvent.bKeyDown)
			{
				auto code = record.Event.KeyEvent.wVirtualKeyCode;
				auto chr = record.Event.KeyEvent.uChar.AsciiChar;
				if (code == VK_TAB) {
					if (!Panel::getMsgOpen()){
						moveFocus(c, f);
					}
				}
				else
					f->keyDown(code, chr);
				redraw = true;
			}
			break;
		}
		case MOUSE_EVENT:
		{
			auto button = record.Event.MouseEvent.dwButtonState;
			auto coord = record.Event.MouseEvent.dwMousePosition;
			auto x = coord.X;
			auto y = coord.Y;
			if (button == FROM_LEFT_1ST_BUTTON_PRESSED || button == RIGHTMOST_BUTTON_PRESSED)
			{
				c.mousePressed(x, y, button == FROM_LEFT_1ST_BUTTON_PRESSED);
				redraw = true;
			}
			break;
		}
		default:
			break;
		}
	}
}
void EventEngine::run(Control &c)
{
	for (bool redraw = true;;)
	{
		if (redraw)
		{
			_graphics.clearScreen();
			_graphics.setCursorVisibility(false);
			for (size_t p = 0; p < 6; ++p)
				c.draw(_graphics, 0, 0, p);
			redraw = false;
			Control::getFocus()->nowInFocus();
		}

		INPUT_RECORD record;
		DWORD count;
		ReadConsoleInput(_console, &record, 1, &count);
		switch (record.EventType)
		{
		case KEY_EVENT:
		{
			auto f = Control::getFocus();
			if ((f != nullptr) && (record.Event.KeyEvent.bKeyDown))
			{
				auto code = record.Event.KeyEvent.wVirtualKeyCode;
				auto chr = record.Event.KeyEvent.uChar.AsciiChar;
				if (code == VK_TAB)
					moveFocus(c, f);
				else {
					f->keyDown(code, chr);
				}
				redraw = true;
			}
			break;
		}
		case MOUSE_EVENT:
		{
			auto button = record.Event.MouseEvent.dwButtonState;
			auto coord = record.Event.MouseEvent.dwMousePosition;
			auto x = coord.X - c.getLeft();
			auto y = coord.Y - c.getTop();
			if (button == FROM_LEFT_1ST_BUTTON_PRESSED || button == RIGHTMOST_BUTTON_PRESSED)
			{
				c.mousePressed(x, y, button == FROM_LEFT_1ST_BUTTON_PRESSED);
				redraw = true;
			}
			break;
		}
		default:
			break;
		}
	}
}
/**
 * Constructor of CommandManager.
 *
 * @param parent parent widget
 */
CommandManager::CommandManager(QWidget *parent)
    : QMenuBar(parent)
{
    actionMenu = new QPopupMenuExt(parent);
    goMenu = new QPopupMenuExt(parent);
    helpMenu = new QPopupMenuExt(parent);

    // Listen on menu item selection
    connect(actionMenu, SIGNAL(activated(int)), SLOT(commandActivated(int)));
    connect(goMenu, SIGNAL(activated(int)), SLOT(commandActivated(int)));
    connect(helpMenu, SIGNAL(activated(int)), SLOT(commandActivated(int)));
    
#ifndef QT_NO_ACCEL
    QAccel* focusAccel = new QAccel(this, "focus-change accelerator");
    focusAccel->connectItem(focusAccel->insertItem(MOVE_FOCUS, 0), 
        this, SLOT(moveFocus()));
#endif

}
Esempio n. 5
0
bool PasswordDialog::eventFilter(QObject *obj, QEvent *event)
{
    QWidget *wnd = 0;
    if (event->type() == QEvent::KeyRelease)
    {
        QKeyEvent *key_event = static_cast<QKeyEvent *>(event);
        if (obj == &text_edit_)
        {
            if (key_event->key() == Qt::Key_Down)
            {
                show_plain_text_.setFocus();
                return true;
            }
            else if (key_event->key() == Qt::Key_Right && ok_button_.isEnabled())
            {
                ok_button_.setFocus();
                return true;
            }
        }
        else if (obj == &ok_button_)
        {
            if (key_event->key() == Qt::Key_Right)
            {
                clear_button_.setFocus();
                return true;
            }
            else if (key_event->key() == Qt::Key_Down)
            {
                show_plain_text_.setFocus();
                return true;
            }
            else if (key_event->key() == Qt::Key_Left)
            {
                text_edit_.setFocus();
                return true;
            }
        }
        else if (obj == &clear_button_)
        {
            if (key_event->key() == Qt::Key_Down)
            {
                show_plain_text_.setFocus();
                return true;
            }
            else if (key_event->key() == Qt::Key_Left)
            {
                text_edit_.setFocus();
                return true;
            }
        }
        else if (obj == &keyboard_ || obj == &show_plain_text_)
        {
            if (key_event->key() == Qt::Key_Down ||
                key_event->key() == Qt::Key_Up ||
                key_event->key() == Qt::Key_Left ||
                key_event->key() == Qt::Key_Right)
            {
                wnd = moveFocus(this, key_event->key());
                if (wnd)
                {
                    wnd->setFocus();
                }
                return true;
            }
        }
    }
    // standard event processing
    return QObject::eventFilter(obj, event);
}
Esempio n. 6
0
bool UIWindow::display(int offsetX, int offsetY) {
	// go exclusive
	if (_mode == WINDOW_EXCLUSIVE || _mode == WINDOW_SYSTEM_EXCLUSIVE) {
		if (!_shieldWindow) {
			_shieldWindow = new UIWindow(_gameRef);
		}
		if (_shieldWindow) {
			_shieldWindow->_posX = _shieldWindow->_posY = 0;
			_shieldWindow->_width = _gameRef->_renderer->getWidth();
			_shieldWindow->_height = _gameRef->_renderer->getHeight();

			_shieldWindow->display();
		}
	} else if (_isMenu) {
		if (!_shieldButton) {
			_shieldButton = new UIButton(_gameRef);
			_shieldButton->setName("close");
			_shieldButton->setListener(this, _shieldButton, 0);
			_shieldButton->_parent = this;
		}
		if (_shieldButton) {
			_shieldButton->_posX = _shieldButton->_posY = 0;
			_shieldButton->setWidth(_gameRef->_renderer->getWidth());
			_shieldButton->setHeight(_gameRef->_renderer->getHeight());

			_shieldButton->display();
		}
	}

	if (!_visible) {
		return STATUS_OK;
	}

	if (_fadeBackground) {
		Graphics::PixelFormat format = _gameRef->_renderer->getPixelFormat();
		byte fadeR, fadeG, fadeB, fadeA;
		// First convert from the internal format to the screen-format
		uint32 fadeColor = format.ARGBToColor(RGBCOLGetA(_fadeColor), RGBCOLGetR(_fadeColor), RGBCOLGetG(_fadeColor), RGBCOLGetB(_fadeColor));
		// Then get components
		format.colorToARGB(fadeColor, fadeA, fadeR, fadeG, fadeB);
		_gameRef->_renderer->fadeToColor(fadeR, fadeG, fadeB, fadeA);
	}

	if (_dragging) {
		_posX += (_gameRef->_mousePos.x - _dragFrom.x);
		_posY += (_gameRef->_mousePos.y - _dragFrom.y);

		_dragFrom.x = _gameRef->_mousePos.x;
		_dragFrom.y = _gameRef->_mousePos.y;
	}

	if (!_focusedWidget || (!_focusedWidget->canFocus() || _focusedWidget->isDisabled() || !_focusedWidget->isVisible())) {
		moveFocus();
	}

	bool popViewport = false;
	if (_clipContents) {
		if (!_viewport) {
			_viewport = new BaseViewport(_gameRef);
		}
		if (_viewport) {
			_viewport->setRect(_posX + offsetX, _posY + offsetY, _posX + _width + offsetX, _posY + _height + offsetY);
			_gameRef->pushViewport(_viewport);
			popViewport = true;
		}
	}


	UITiledImage *back = _back;
	BaseSprite *image = _image;
	BaseFont *font = _font;

	if (!isFocused()) {
		if (_backInactive) {
			back = _backInactive;
		}
		if (_imageInactive) {
			image = _imageInactive;
		}
		if (_fontInactive) {
			font = _fontInactive;
		}
	}

	if (_alphaColor != 0) {
		_gameRef->_renderer->_forceAlphaColor = _alphaColor;
	}
	if (back) {
		back->display(_posX + offsetX, _posY + offsetY, _width, _height);
	}
	if (image) {
		image->draw(_posX + offsetX, _posY + offsetY, _transparent ? nullptr : this);
	}

	if (!BasePlatform::isRectEmpty(&_titleRect) && font && _text) {
		font->drawText((byte *)_text, _posX + offsetX + _titleRect.left, _posY + offsetY + _titleRect.top, _titleRect.right - _titleRect.left, _titleAlign, _titleRect.bottom - _titleRect.top);
	}

	if (!_transparent && !image) {
		_gameRef->_renderer->addRectToList(new BaseActiveRect(_gameRef,  this, nullptr, _posX + offsetX, _posY + offsetY, _width, _height, 100, 100, false));
	}

	for (uint32 i = 0; i < _widgets.size(); i++) {
		_widgets[i]->display(_posX + offsetX, _posY + offsetY);
	}

	if (_alphaColor != 0) {
		_gameRef->_renderer->_forceAlphaColor = 0;
	}

	if (popViewport) {
		_gameRef->popViewport();
	}

	return STATUS_OK;
}
Esempio n. 7
0
KJotsMain::KJotsMain(const char* name)
  : KTopLevelWidget( name )
{
  //create widgets
  f_main = new QFrame( this, "Frame_0" );
  f_main->move(0, 28);
  f_main->setMinimumSize( 500, 180 );
  f_main->setFrameStyle( 0 );

  f_text = new QFrame( f_main, "Frame_1" );
  f_text->setGeometry( 8, 72, 452, 45 );
  f_text->setFrameStyle( 50 );
  
  f_labels = new QFrame( f_main, "Frame_2" );
  f_labels->setMinimumSize( 436, 24 );
  f_labels->setFrameStyle( 0 );
  
  menubar = new KMenuBar( this, "MenuBar_1" );
  // KMenubar is not a FRAME!!! (sven)
  //menubar->setFrameStyle( 34 );
  //menubar->setLineWidth( 2 );

  s_bar = new QScrollBar( f_main, "ScrollBar_1" );
  s_bar->setMinimumSize( 452, 16 );
  s_bar->setOrientation( QScrollBar::Horizontal );
  
  me_text = new MyMultiEdit( f_text, "me_text" );
  me_text->setMinimumSize( 436, 30 );
  me_text->insertLine( "" );

  l_folder = new QLabel( f_labels, "Label_4" );
  l_folder->setMinimumSize( 68, 20 );
  l_folder->setFrameStyle( QFrame::WinPanel | QFrame::Sunken );
  l_folder->setText( "" );
  
  le_subject = new QLineEdit( f_labels, "le_subject" );
  le_subject->setMinimumSize( 56, 20 );
  le_subject->setText( "" );
  le_subject->setFocusPolicy(QWidget::ClickFocus);
  
  bg_top = new MyButtonGroup( f_main, "ButtonGroup_2" );
  bg_top->setMinimumSize( 452, 32 );
  bg_top->setFrameStyle( 49 ); 
  bg_top->setTitle( "" );
  bg_top->setAlignment( 1 );
  bg_top->lower();
  
  this->setMinimumSize(500, 211);
  
  KConfig *config = KApplication::getKApplication()->getConfig();

  config->setGroup("kjots");
  entrylist.setAutoDelete(TRUE);
  button_list.setAutoDelete(TRUE);
  folderOpen = FALSE;
  entrylist.append(new TextEntry);
  confdiag = NULL;
  subj_list = new SubjList;
  connect( this, SIGNAL(folderChanged(QList<TextEntry> *)), subj_list,
	   SLOT(rebuildList( QList<TextEntry> *)) );
  connect( this, SIGNAL(entryMoved(int)), subj_list, SLOT( select(int)) );
  connect( subj_list, SIGNAL(entryMoved(int)), this, SLOT( barMoved(int)) );
  connect( le_subject, SIGNAL(textChanged(const char *)), subj_list, 
	   SLOT(entryChanged(const char*)) );
  me_text->setEnabled(FALSE);
  le_subject->setEnabled(FALSE);
  current = 0;
  connect( s_bar, SIGNAL(valueChanged(int)), this, SLOT(barMoved(int)) );
 
  top2bottom = new QGridLayout( f_main, 4, 1, 4 );
  top2bottom->addWidget( f_text, 0, 0, AlignCenter );
  top2bottom->setRowStretch( 0, 1 );
  top2bottom->addWidget( s_bar, 1, 0, AlignCenter );
  top2bottom->addWidget( bg_top, 2, 0, AlignCenter );
  top2bottom->addWidget( f_labels, 3, 0, AlignCenter );
  top2bottom->activate();

  labels_layout = new QGridLayout( f_labels, 1, 2, 0 );
  labels_layout->addWidget( l_folder, 0, 0, AlignVCenter | AlignLeft );
  labels_layout->addWidget( le_subject, 0, 1, AlignVCenter | AlignLeft );
  labels_layout->setColStretch( 1, 1 );
  labels_layout->activate();

  QFont font_label(l_folder->fontInfo().family());
  font_label.setBold(TRUE);
  l_folder->setFont(font_label);

  f_text_layout = new QGridLayout( f_text, 2, 1, 4 );
  f_text_layout->addWidget( me_text, 0, 0, AlignCenter );
  f_text_layout->setRowStretch( 0, 1 );
  f_text_layout->activate();

  s_bar->setRange(0,0);
  s_bar->setValue(0);
  s_bar->setSteps(1,1);

  bg_top->setExclusive(TRUE);
  me_text->setFocusPolicy(QWidget::StrongFocus);

  // read hotlist
  config->readListEntry( "Hotlist", hotlist );
  while( hotlist.count() > HOT_LIST_SIZE )
    hotlist.removeLast();
  // read list of folders
  config->readListEntry( "Folders", folder_list );

  QString temp;
  folders = new QPopupMenu;
  int i = 0;
  QPushButton *temp_button;
  for( temp = folder_list.first(); !temp.isEmpty(); temp = folder_list.next(), i++ )
    { 
      folders->insertItem(temp, i); 
      if( hotlist.contains(temp) )
	{
	  temp_button = new QPushButton(temp, bg_top);
	  temp_button->setFocusPolicy(QWidget::ClickFocus);
	  temp_button->setToggleButton(TRUE);
	  temp_button->setFixedSize(BUTTON_WIDTH,24);
	  bg_top->insert(temp_button, i);
	  button_list.append(temp_button);
	}
    }
  unique_id = i+1;
  connect( folders, SIGNAL(activated(int)), this, SLOT(openFolder(int)) );
  connect( bg_top, SIGNAL(clicked(int)), this, SLOT(openFolder(int)) );

  updateConfiguration();

  // creat keyboard shortcuts
  // CTRL+Key_J := previous page
  // CTRL+Key_K := next page
  // CTRL+Key_L := show subject list
  // CTRL+Key_A := add new page
  // CTRL+Key_M := move focus

  keys = new KAccel( this ); 


  keys->insertStdItem( KAccel::New, klocale->translate("New Book") ); 


  keys->connectItem( KAccel::New, this, SLOT(createFolder()) );
  keys->connectItem( KAccel::Save , this, SLOT(saveFolder()) );
  keys->connectItem( KAccel::Quit, qApp, SLOT(quit()) );
  keys->connectItem( KAccel::Cut , me_text, SLOT(cut()) );
  keys->connectItem( KAccel::Copy , me_text, SLOT(copyText()) );
  keys->connectItem( KAccel::Paste , me_text, SLOT(paste()) );

  keys->insertItem(i18n("PreviousPage"),    "PreviousPage",    CTRL+Key_J);
  keys->insertItem(i18n("NextPage"),        "NextPage",        CTRL+Key_K);
  keys->insertItem(i18n("ShowSubjectList"), "ShowSubjectList", CTRL+Key_L);
  keys->insertItem(i18n("AddNewPage"),      "AddNewPage",      CTRL+Key_A);
  keys->insertItem(i18n("MoveFocus"),       "MoveFocus",       CTRL+Key_M);
  keys->insertItem(i18n("CopySelection"),   "CopySelection",   CTRL+Key_Y);
  keys->connectItem( "PreviousPage", this, SLOT(prevEntry()) );
  keys->connectItem( "NextPage", this, SLOT(nextEntry()) );
  keys->connectItem( "ShowSubjectList", this, SLOT(toggleSubjList()) );
  keys->connectItem( "AddNewPage", this, SLOT(newEntry()) );
  keys->connectItem( "MoveFocus", this, SLOT(moveFocus()) );
  keys->connectItem( "CopySelection", this, SLOT(copySelection()) );
  keys->readSettings();

  // create menu
  int id;
  QPopupMenu *file = new QPopupMenu;
  id = file->insertItem(klocale->translate("&New Book"), this, SLOT(createFolder()));
  keys->changeMenuAccel(file, id, KAccel::New); 

  file->insertSeparator();
  id = file->insertItem(klocale->translate("Save current book"), this, SLOT(saveFolder()) );
  keys->changeMenuAccel(file, id, KAccel::Save); 
  id = file->insertItem(klocale->translate("Save book to ascii file"), this, SLOT(writeBook()) );
  id = file->insertItem(klocale->translate("Save page to ascii file"), this, SLOT(writePage()) );
  file->insertSeparator();
  id = file->insertItem(klocale->translate("Delete current book"), this, SLOT(deleteFolder()) );
  file->insertSeparator();
  id = file->insertItem(klocale->translate("&Quit"), qApp, SLOT( quit() ));
  keys->changeMenuAccel(file, id, KAccel::Quit); 

  QPopupMenu *edit_menu = new QPopupMenu;

  id = edit_menu->insertItem(klocale->translate("C&ut"),me_text, SLOT(cut()));
  keys->changeMenuAccel(edit_menu, id, KAccel::Cut); 
  id = edit_menu->insertItem(klocale->translate("&Copy") , me_text, SLOT(copyText()) );
  keys->changeMenuAccel(edit_menu, id, KAccel::Copy); 
  id = edit_menu->insertItem(klocale->translate("&Paste"), me_text, SLOT(paste()));
  keys->changeMenuAccel(edit_menu, id, KAccel::Paste); 
  edit_menu->insertSeparator();
  id = edit_menu->insertItem(klocale->translate("&New Page"), this, SLOT(newEntry()) );
  keys->changeMenuAccel(edit_menu, id, "AddNewPage"); 
  id = edit_menu->insertItem(klocale->translate("&Delete Page"), this, SLOT(deleteEntry()) );

  QPopupMenu *options = new QPopupMenu;
  options->insertItem(klocale->translate("&Config"), this, SLOT(configure()) );
  options->insertItem(klocale->translate("Configure &Keys"), this, SLOT(configureKeys()) );

  QPopupMenu *hotlist = new QPopupMenu;
  hotlist->insertItem(klocale->translate("Add current book to hotlist"), 
		      this, SLOT(addToHotlist()) );
  hotlist->insertItem(klocale->translate("Remove current book from hotlist"),
		      this, SLOT(removeFromHotlist()) );

  menubar->insertItem( klocale->translate("&File"), file );
  menubar->insertItem( klocale->translate("&Edit"), edit_menu );
  menubar->insertItem( klocale->translate("Hot&list"), hotlist );
  menubar->insertItem( klocale->translate("&Options"), options );
  menubar->insertItem( klocale->translate("&Books"), folders );
  menubar->insertSeparator();
  QString about = "KJots 0.3.1\n\r(C) ";
  about += (QString) klocale->translate("by") +
    " Christoph Neerfeld\n\[email protected]";
  menubar->insertItem( klocale->translate("&Help"),
		       KApplication::getKApplication()->getHelpMenu(TRUE, about ) );


  config->setGroup("kjots");
  // create toolbar
  toolbar = new KToolBar(this);
  QPixmap temp_pix;
  temp_pix = global_pix_loader->loadIcon("filenew.xpm");
  toolbar->insertButton(temp_pix, 0, SIGNAL(clicked()), this,
		      SLOT(newEntry()), TRUE, i18n("New"));
  temp_pix = global_pix_loader->loadIcon("filedel.xpm");
  toolbar->insertButton(temp_pix, 1, SIGNAL(clicked()), this,
		      SLOT(deleteEntry()), TRUE, i18n("Delete"));
  temp_pix = global_pix_loader->loadIcon("back.xpm");
  toolbar->insertButton(temp_pix, 2, SIGNAL(clicked()), this,
		      SLOT(prevEntry()), TRUE, i18n("Previous"));
  temp_pix = global_pix_loader->loadIcon("forward.xpm");
  toolbar->insertButton(temp_pix, 3, SIGNAL(clicked()), this,
		      SLOT(nextEntry()), TRUE, i18n("Next"));
  toolbar->insertSeparator();
  temp_pix = global_pix_loader->loadIcon("openbook.xpm");
  toolbar->insertButton(temp_pix, 4, SIGNAL(clicked()), this,
		      SLOT(toggleSubjList()), TRUE, i18n("Subject List"));
  toolbar->insertSeparator();
  temp_pix = global_pix_loader->loadIcon("exit.xpm");
  toolbar->setBarPos( (KToolBar::BarPosition) config->readNumEntry("ToolBarPos") );
  addToolBar(toolbar);
  setView(f_main, FALSE);
  setMenu(menubar);
  enableToolBar(KToolBar::Show);

  QString last_folder = config->readEntry("LastOpenFolder");
  int nr;
  if( (nr = folder_list.find(last_folder)) >= 0 )
    openFolder(nr);
  int width, height;
  width = config->readNumEntry("Width");
  height = config->readNumEntry("Height");
  if( width < minimumSize().width() )
    width = minimumSize().width();
  if( height < minimumSize().height() )
    height = minimumSize().height();
  resize(width, height);
}
Esempio n. 8
0
void GameFrame::keyPressEvent(QKeyEvent *event) {
    int key = event->key();

    if (key == Qt::Key_Control && notesEnabled) {
        takingNotes = !takingNotes;
        if (takingNotes) {
            emit toggleTakingNotes("Input mode: NOTE");
        } else {
            emit toggleTakingNotes("Input mode: NORMAL");
        }
        return;
    }

    if (focused == -1 || gameOver) {
        return;
    }

    if (key == Qt::Key_Right || key == Qt::Key_Left || key == Qt::Key_Down || key == Qt::Key_Up) {
        int old_focus = focused;

        int row = focused / 9;
        int col = focused % 9;

        switch (key) {
        case Qt::Key_Right:
            col = moveFocus(1, false);
            break;
        case Qt::Key_Left:
            col = moveFocus(-1, false);
            break;
        case Qt::Key_Up:
            row = moveFocus(-1, true);
            break;
        case Qt::Key_Down:
            row = moveFocus(1, true);
            break;
        }

        focused = row * 9 + col;

        if (focused != old_focus && mode == COOP) {
            emit sendFocusedSquare(focused);
        }

    } else {
        if (key == Qt::Key_0 || key == Qt::Key_Backspace || key == Qt::Key_Delete) {
            if (!takingNotes || !notesEnabled) {
                setAt(focused, 0, true);
            } else {
                notes[focused].clear();
                if (mode == COOP) {
                    emit sendNotes(focused, notes[focused]);
                }
            }
        } else if (key == Qt::Key_Escape) {
            focused = -1;
        } else {
            auto check = key_map.find(key);
            if (check != key_map.end()) {
                if (!takingNotes || !notesEnabled) {
                    setAt(focused, check->second, true);
                } else {
                    if (getAt(focused) > 0) {
                        return;
                    }
                    std::vector<int> &notes_pos = notes[focused];

                    auto iterator = std::find(notes_pos.begin(), notes_pos.end(), check->second);
                    if (iterator == notes_pos.end()) {
                        notes_pos.push_back(check->second);
                        std::sort(notes_pos.begin(), notes_pos.end());
                    } else {
                        notes_pos.erase(iterator);
                    }
                    if (mode == COOP) {
                        emit sendNotes(focused, notes_pos);
                    }
                }
            }
        }
    }
    repaint();
}