void CEditWithButton_Base::OnLButtonUp(UINT nFlags, CPoint point) { if (m_IsMouseActive) { ReleaseCapture(); ClientToScreen(&point); CRect rectWindow; GetWindowRect(rectWindow); CRect rectButton = GetButtonRect(rectWindow); // Reset the button to a "normal" state. m_IsButtonHot = false; m_IsButtonPressed = false; m_IsMouseActive = false; // Redraw the button to reflect the changes. SetWindowPos(NULL, 0, 0, 0, 0, SWP_DRAWFRAME | SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER); // Run the on-click logic if appropriate. if (rectButton.PtInRect(point)) OnLeftClick(); } CEdit::OnLButtonUp(nFlags, point); }
/////////////////////////////////////////////////////////////////////////////// // Descripcion: // - Notificacion de un evento sobre un componente. // - Se debera de tener en cuenta que si el identificador asociado al // evento es menor que el primero de los identificadores para componentes // locales, se debera de trasladar la responsabilidad de la llamada a la // clase base. // Parametros: // - GUICEvent. Evento que se ha producido. // Devuelve: // Notas: ////////////////////////////////////////////////////////////////////////////// void CGUIWItemSelectToUse::ComponentNotify(const GUIDefs::sGUICEvent& GUICEvent) { // SOLO si instancia inicializada ASSERT(Inherited::IsInitOk()); // ¿NO pertence el evento a esta instancia? if (GUICEvent.IDComponent < CGUIWItemSelectToUse::ID_CANCEL) { Inherited::ComponentNotify(GUICEvent); } else { // Se comprueba el tipo de evento // Comprueba el tipo de evento switch(GUICEvent.Event) { case GUIDefs::GUIC_SELECT: { // Seleccion OnSelect(GUICEvent.IDComponent, true); } break; case GUIDefs::GUIC_UNSELECT: { // Deseleccion OnSelect(GUICEvent.IDComponent, false); } break; case GUIDefs::GUIC_BUTTONLEFT_PRESSED: { // Pulsacion OnLeftClick(GUICEvent.IDComponent); } break; }; // ~ switch } }
/////////////////////////////////////////////////////////////////////////////// // Descripcion: // - Notifica un evento producido sobre un boton de opciones. // Parametros: // - GUICEvent. Evento producido. // Devuelve: // Notas: ////////////////////////////////////////////////////////////////////////////// void CGUIWQuestionDialog::ComponentNotify(const GUIDefs::sGUICEvent& GUICEvent) { // SOLO si instancia inicializada ASSERT(Inherited::IsInitOk()); // Comprueba tipo de evento switch (GUICEvent.Event) { case GUIDefs::GUIC_SELECT: { // Seleccion OnSelect(GUICEvent.IDComponent, true); } break; case GUIDefs::GUIC_UNSELECT: { // Deseleccion OnSelect(GUICEvent.IDComponent, false); } break; case GUIDefs::GUIC_BUTTONLEFT_PRESSED: { // Pulsacion OnLeftClick(GUICEvent.IDComponent); // Se notifica al GUIManager que se Deactive el cuadro de dialogo SYSEngine::GetGUIManager()->DeactiveAdviceDialog(); } break; }; // ~ switch }
void CBCGPBreadcrumb::OnLClickReflect (NMHDR* pNmhdr, LRESULT*) { NMCLICK* pClick = (NMCLICK*)pNmhdr; if (pClick != NULL) { OnLeftClick (pClick->pt, (UINT)pClick->dwHitInfo, (HBREADCRUMBITEM)pClick->dwItemSpec); } }
bool wxToolMenuBar::MSWCommand(WXUINT WXUNUSED(cmd), WXWORD id_) { const int id = (signed short)id_; wxToolBarToolBase *tool = FindById(id); if ( !tool ) { bool checked = false; if ( m_menuBar ) { wxMenuItem *item = m_menuBar->FindItem(id); if ( item && item->IsCheckable() ) { item->Toggle(); checked = item->IsChecked(); } } wxCommandEvent event(wxEVT_MENU); event.SetEventObject(this); event.SetId(id); event.SetInt(checked); return GetEventHandler()->ProcessEvent(event); } if ( tool->CanBeToggled() ) { LRESULT state = ::SendMessage(GetHwnd(), TB_GETSTATE, id, 0); tool->Toggle((state & TBSTATE_CHECKED) != 0); } bool toggled = tool->IsToggled(); // avoid sending the event when a radio button is released, this is not // interesting if ( !tool->CanBeToggled() || tool->GetKind() != wxITEM_RADIO || toggled ) { // OnLeftClick() can veto the button state change - for buttons which // may be toggled only, of course. if ( !OnLeftClick((int)id, toggled) && tool->CanBeToggled() ) { // revert back toggled = !toggled; tool->SetToggle(toggled); ::SendMessage(GetHwnd(), TB_CHECKBUTTON, id, MAKELONG(toggled, 0)); } } return true; }
/////////////////////////////////////////////////////////////////////////////// // Descripcion: // - Logica asociada a la notificacion de un suceso en CWorld. // - Seran de interes las notificaciones: // * Destruccion de una entidad. // Parametros: // - NotifyType. Tipo de notificacion. // - udParam. Parametro asociado. // Devuelve: // Notas: /////////////////////////////////////////////////////////////////////////////// void CGUIWItemSelectToUse::WorldObserverNotify(const WorldObserverDefs::eObserverNotifyType& NotifyType, const dword udParam) { // SOLO si instancia inicializada y activada ASSERT(Inherited::IsInitOk()); ASSERT(Inherited::IsActive()); // Comprueba el tipo de notificacion switch(NotifyType) { case WorldObserverDefs::ENTITY_DESTROY: { // ¿Es la entidad destruida la asociada? if (udParam == m_EntitiesInfo.pDestEntity->GetHandle()) { // Si, se cierra de inmediato la interfaz, simulando la // pulsacion del boton ESC OnSelect(CGUIWItemSelectToUse::ID_CANCEL, true); OnLeftClick(CGUIWItemSelectToUse::ID_CANCEL); } } break; }; // ~ switch }
void GuiIconCarousel::OnDPADClick(GuiButton *button, const GuiController *controller, GuiTrigger *trigger) { if(trigger == &buttonATrigger){ //! do not auto launch when wiimote is pointing to screen and presses A if((controller->chan & (GuiTrigger::CHANNEL_2 | GuiTrigger::CHANNEL_3 | GuiTrigger::CHANNEL_4 | GuiTrigger::CHANNEL_5)) && controller->data.validPointer) { return; } OnLaunchClick(button,controller,trigger); } else if(trigger == &buttonLTrigger){ OnLeftSkipClick(button,controller,trigger); } else if(trigger == &buttonRTrigger){ OnRightSkipClick(button,controller,trigger); } else if(trigger == &buttonLeftTrigger){ OnLeftClick(button,controller,trigger); } else if(trigger == &buttonRightTrigger){ OnRightClick(button,controller,trigger); } }
/////////////////////////////////////////////////////////////////////////////// // Descripcion: // - Captura la pulsacion de la tecla ESC para cancelacion rapida de la // interfaz. // Parametros: // - InputEvent. Evento. // Devuelve: // Notas: ////////////////////////////////////////////////////////////////////////////// bool CGUIWItemSelectToUse::DispatchEvent(const InputDefs::sInputEvent& InputEvent) { // SOLO si instancia inicializada ASSERT(Inherited::IsInitOk()); // Evalua el evento producido switch(InputEvent.EventType) { case InputDefs::BUTTON_EVENT: { // Pulsacion de tecla switch(InputEvent.EventButton.Code) { case InputDefs::IE_KEY_ESC: { // Se simula la pulsacion del boton de salir OnSelect(CGUIWItemSelectToUse::ID_CANCEL, true); OnLeftClick(CGUIWItemSelectToUse::ID_CANCEL); return InputDefs::NO_SHARE_INPUT_EVENT; } break; }; // ~ switch } break; }; // ~ switch // No se capturo evento / Se comparte return InputDefs::SHARE_INPUT_EVENT; }
bool Control::NotificationMouseButton(const SDL_MouseButtonEvent& buttonEvent) { // raise the mouse button event before the click event auto result = OnMouseButton(buttonEvent); if (buttonEvent.state == SDL_PRESSED) { m_flags |= State::MouseDown; } else if (m_flags & State::MouseDown && buttonEvent.state == SDL_RELEASED) { auto clickLoc = SDLPoint(buttonEvent.x, buttonEvent.y); if (buttonEvent.button == SDL_BUTTON_LEFT) OnLeftClick(clickLoc); else if (buttonEvent.button == SDL_BUTTON_RIGHT) OnRightClick(clickLoc); else if (buttonEvent.button == SDL_BUTTON_MIDDLE) OnMiddleClick(clickLoc); m_flags ^= State::MouseDown; } return result; }
void GUIControl::Process() { __super::Process(); if(IsVisible() && IsEnabled()) { if(PointInBox(mouseX, mouseY, GetX(), GetY(), GetWidth(), GetHeight())) { int cursor = GetLastCursorPos(); SetLastCursorPos(1); // mouse is in // here // 0 - init // 1 - mouse was IN control // 2 - mouse was OUT control if(cursor == 0 || cursor == 2) { OnMouseEnter(); } else { OnMouseMove(); } if(mouse[0] || mouse[1]) { if(GetLastPressState() == 0) { OnMouseDown(); if(mouse[0]) SetLastPressState(1); else if(mouse[1]) SetLastPressState(2); } } else { int press_state = GetLastPressState(); SetLastPressState(0); // here // 0 - init // 1 - left mouse down // 2 - right mouse down // 3 - all up if(press_state == 1) { OnLeftClick(); OnMouseUp(); } else if(press_state == 2) { OnRightClick(); OnMouseUp(); } } } else { int cursor = GetLastCursorPos(); SetLastCursorPos(2); // mouse is out if(cursor == 1) { OnMouseLeave(); SetLastPressState(0); } } // TODO: // fix it somehow :( if(IsFocused()) { static UCHAR count = 0; int delay = 0; for(UCHAR i = 0; i < 255; i++) { if(GetAsyncKeyState(i) & 0x8000) { count++; static int prev; count == 1 ? delay = KEY_FIRST_DELAY : delay = KEY_DELAY; if(current_time - prev >= delay) { if(i != VK_SHIFT) { OnKeyDown(i); prev = current_time; } } } } } } }
/* OnHotKey. * ** Commands are case insensitive ** * Some commands are relative to the item under the mouse cursor * aDC = current device context * aHotkeyCode = hotkey code (ascii or wxWidget code for special keys) * aPosition The cursor position in logical (drawing) units. * aItem = NULL or pointer on a EDA_ITEM under the mouse cursor */ void PL_EDITOR_FRAME::OnHotKey( wxDC* aDC, int aHotkeyCode, const wxPoint& aPosition, EDA_ITEM* aItem ) { bool busy = GetScreen()->GetCurItem() != NULL; wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED ); cmd.SetEventObject( this ); /* Convert lower to upper case (the usual toupper function has problem with non ascii * codes like function keys */ if( (aHotkeyCode >= 'a') && (aHotkeyCode <= 'z') ) aHotkeyCode += 'A' - 'a'; EDA_HOTKEY * HK_Descr = GetDescriptorFromHotkey( aHotkeyCode, s_PlEditor_Hotkey_List ); if( HK_Descr == NULL ) HK_Descr = GetDescriptorFromHotkey( aHotkeyCode, s_Common_Hotkey_List ); if( HK_Descr == NULL ) return; WORKSHEET_DATAITEM* item; switch( HK_Descr->m_Idcommand ) { case HK_NOT_FOUND: return; case HK_LEFT_CLICK: OnLeftClick( aDC, aPosition ); break; case HK_LEFT_DCLICK: // Simulate a double left click: generate 2 events OnLeftClick( aDC, aPosition ); OnLeftDClick( aDC, aPosition ); break; case HK_HELP: // Display Current hotkey list DisplayHotkeyList( this, s_PlEditor_Hokeys_Descr ); break; case HK_UNDO: case HK_REDO: if( busy ) break; cmd.SetId( HK_Descr->m_IdMenuEvent ); GetEventHandler()->ProcessEvent( cmd ); break; case HK_ZOOM_IN: cmd.SetId( ID_POPUP_ZOOM_IN ); GetEventHandler()->ProcessEvent( cmd ); break; case HK_ZOOM_OUT: cmd.SetId( ID_POPUP_ZOOM_OUT ); GetEventHandler()->ProcessEvent( cmd ); break; case HK_ZOOM_REDRAW: cmd.SetId( ID_ZOOM_REDRAW ); GetEventHandler()->ProcessEvent( cmd ); break; case HK_ZOOM_CENTER: cmd.SetId( ID_POPUP_ZOOM_CENTER ); GetEventHandler()->ProcessEvent( cmd ); break; case HK_ZOOM_AUTO: cmd.SetId( ID_ZOOM_PAGE ); GetEventHandler()->ProcessEvent( cmd ); break; case HK_RESET_LOCAL_COORD: // Reset the relative coord GetScreen()->m_O_Curseur = GetCrossHairPosition(); break; case HK_SET_GRID_ORIGIN: SetGridOrigin( GetCrossHairPosition() ); break; case HK_MOVE_ITEM: case HK_MOVE_START_POINT: case HK_MOVE_END_POINT: case HK_DELETE_ITEM: if( busy ) break; if( (item = Locate( aPosition )) == NULL ) break; // Only rect and lines have a end point. if( HK_Descr->m_Idcommand == HK_MOVE_END_POINT && !item->HasEndPoint() ) break; if( m_treePagelayout->GetPageLayoutSelectedItem() != item ) m_treePagelayout->SelectCell( item ); cmd.SetId( HK_Descr->m_IdMenuEvent ); GetEventHandler()->ProcessEvent( cmd ); break; case HK_PLACE_ITEM: if( busy ) { cmd.SetId( HK_Descr->m_IdMenuEvent ); GetEventHandler()->ProcessEvent( cmd ); } break; default: wxMessageBox( wxT("Unknown hotkey") ); return; } }
bool FOOTPRINT_EDIT_FRAME::OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition, EDA_ITEM* aItem ) { if( aHotKey == 0 ) return false; bool blockActive = GetScreen()->m_BlockLocate.GetCommand() != BLOCK_IDLE; BOARD_ITEM* item = GetCurItem(); bool ItemFree = (item == 0) || (item->GetFlags() == 0); wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED ); cmd.SetEventObject( this ); /* Convert lower to upper case (the usual toupper function has problem with non ascii * codes like function keys */ if( (aHotKey >= 'a') && (aHotKey <= 'z') ) aHotKey += 'A' - 'a'; EDA_HOTKEY* HK_Descr = GetDescriptorFromHotkey( aHotKey, common_Hotkey_List ); if( HK_Descr == NULL ) HK_Descr = GetDescriptorFromHotkey( aHotKey, module_edit_Hotkey_List ); if( HK_Descr == NULL ) return false; switch( HK_Descr->m_Idcommand ) { default: case HK_NOT_FOUND: return false; case HK_HELP: // Display Current hotkey list DisplayHotkeyList( this, g_Module_Editor_Hokeys_Descr ); break; case HK_RESET_LOCAL_COORD: // set local (relative) coordinate origin GetScreen()->m_O_Curseur = GetCrossHairPosition(); break; case HK_LEFT_CLICK: OnLeftClick( aDC, aPosition ); break; case HK_LEFT_DCLICK: // Simulate a double left click: generate 2 events OnLeftClick( aDC, aPosition ); OnLeftDClick( aDC, aPosition ); break; case HK_SET_GRID_ORIGIN: SetGridOrigin( GetCrossHairPosition() ); m_canvas->Refresh(); break; case HK_RESET_GRID_ORIGIN: SetGridOrigin( wxPoint(0,0) ); m_canvas->Refresh(); break; case HK_SWITCH_UNITS: cmd.SetId( (g_UserUnit == INCHES) ? ID_TB_OPTIONS_SELECT_UNIT_MM : ID_TB_OPTIONS_SELECT_UNIT_INCH ); GetEventHandler()->ProcessEvent( cmd ); break; case HK_ZOOM_IN: cmd.SetId( ID_POPUP_ZOOM_IN ); GetEventHandler()->ProcessEvent( cmd ); break; case HK_ZOOM_OUT: cmd.SetId( ID_POPUP_ZOOM_OUT ); GetEventHandler()->ProcessEvent( cmd ); break; case HK_ZOOM_REDRAW: cmd.SetId( ID_ZOOM_REDRAW ); GetEventHandler()->ProcessEvent( cmd ); break; case HK_ZOOM_CENTER: cmd.SetId( ID_POPUP_ZOOM_CENTER ); GetEventHandler()->ProcessEvent( cmd ); break; case HK_UNDO: case HK_REDO: if( ItemFree && !blockActive ) { wxCommandEvent event( wxEVT_COMMAND_TOOL_CLICKED, HK_Descr->m_IdMenuEvent ); wxPostEvent( this, event ); } break; case HK_ZOOM_AUTO: cmd.SetId( ID_ZOOM_PAGE ); GetEventHandler()->ProcessEvent( cmd ); break; case HK_EDIT_ITEM: OnHotkeyEditItem( HK_EDIT_ITEM ); break; case HK_DELETE: OnHotkeyDeleteItem( HK_DELETE ); break; case HK_MOVE_ITEM: OnHotkeyMoveItem( HK_MOVE_ITEM ); break; case HK_ROTATE_ITEM: OnHotkeyRotateItem( HK_ROTATE_ITEM ); break; } return true; }
void SCH_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event ) { int id = event.GetId(); wxPoint pos; SCH_SCREEN* screen = GetScreen(); SCH_ITEM* item = screen->GetCurItem(); pos = wxGetMousePosition(); pos.y += 20; // If needed, stop the current command and deselect current tool switch( id ) { case wxID_CUT: case wxID_COPY: case ID_POPUP_CANCEL_CURRENT_COMMAND: case ID_POPUP_SCH_ENTRY_SELECT_SLASH: case ID_POPUP_SCH_ENTRY_SELECT_ANTISLASH: case ID_POPUP_SCH_BEGIN_WIRE: case ID_POPUP_SCH_BEGIN_BUS: case ID_POPUP_END_LINE: case ID_POPUP_SCH_SET_SHAPE_TEXT: case ID_POPUP_SCH_CLEANUP_SHEET: case ID_POPUP_SCH_END_SHEET: case ID_POPUP_SCH_RESIZE_SHEET: case ID_POPUP_IMPORT_GLABEL: case ID_POPUP_SCH_INIT_CMP: case ID_POPUP_SCH_DISPLAYDOC_CMP: case ID_POPUP_SCH_EDIT_CONVERT_CMP: case ID_POPUP_DELETE_BLOCK: case ID_POPUP_PLACE_BLOCK: case ID_POPUP_ZOOM_BLOCK: case ID_POPUP_DRAG_BLOCK: case ID_POPUP_COPY_BLOCK: case ID_POPUP_SCH_DELETE_NODE: case ID_POPUP_SCH_DELETE_CONNECTION: case ID_POPUP_SCH_ENTER_SHEET: case ID_POPUP_SCH_LEAVE_SHEET: case ID_POPUP_SCH_ADD_JUNCTION: case ID_POPUP_SCH_ADD_LABEL: case ID_POPUP_SCH_GETINFO_MARKER: /* At this point: Do nothing. these commands do not need to stop the * current command (mainly a block command) or reset the current state * They will be executed later, in next switch structure. */ break; case ID_POPUP_SCH_DELETE_CMP: case ID_POPUP_SCH_DELETE: // Stop the current command (if any) but keep the current tool m_canvas->EndMouseCapture(); break; default: // Stop the current command and deselect the current tool m_canvas->EndMouseCapture( ID_NO_TOOL_SELECTED, m_canvas->GetDefaultCursor() ); break; } INSTALL_UNBUFFERED_DC( dc, m_canvas ); item = screen->GetCurItem(); // Can be modified by previous calls. switch( id ) { case ID_HIERARCHY: InstallHierarchyFrame( &dc, pos ); SetRepeatItem( NULL ); break; case wxID_CUT: if( screen->m_BlockLocate.GetCommand() != BLOCK_MOVE ) break; screen->m_BlockLocate.SetCommand( BLOCK_DELETE ); screen->m_BlockLocate.SetMessageBlock( this ); HandleBlockEnd( &dc ); SetRepeatItem( NULL ); SetSheetNumberAndCount(); break; case wxID_PASTE: HandleBlockBegin( &dc, BLOCK_PASTE, GetCrossHairPosition() ); break; case ID_POPUP_SCH_ENTRY_SELECT_SLASH: m_canvas->MoveCursorToCrossHair(); SetBusEntryShape( &dc, dynamic_cast<SCH_BUS_ENTRY_BASE*>( item ), '/' ); break; case ID_POPUP_SCH_ENTRY_SELECT_ANTISLASH: m_canvas->MoveCursorToCrossHair(); SetBusEntryShape( &dc, dynamic_cast<SCH_BUS_ENTRY_BASE*>( item ), '\\' ); break; case ID_POPUP_CANCEL_CURRENT_COMMAND: if( m_canvas->IsMouseCaptured() ) { m_canvas->EndMouseCapture(); SetToolID( GetToolId(), m_canvas->GetCurrentCursor(), wxEmptyString ); } else { SetToolID( ID_NO_TOOL_SELECTED, m_canvas->GetDefaultCursor(), wxEmptyString ); } break; case ID_POPUP_END_LINE: m_canvas->MoveCursorToCrossHair(); EndSegment( &dc ); break; case ID_POPUP_SCH_BEGIN_WIRE: m_canvas->MoveCursorToCrossHair(); OnLeftClick( &dc, GetCrossHairPosition() ); break; case ID_POPUP_SCH_BEGIN_BUS: m_canvas->MoveCursorToCrossHair(); OnLeftClick( &dc, GetCrossHairPosition() ); break; case ID_POPUP_SCH_SET_SHAPE_TEXT: // Not used break; case ID_POPUP_SCH_DELETE_NODE: case ID_POPUP_SCH_DELETE_CONNECTION: m_canvas->MoveCursorToCrossHair(); DeleteConnection( id == ID_POPUP_SCH_DELETE_CONNECTION ); screen->SetCurItem( NULL ); SetRepeatItem( NULL ); screen->TestDanglingEnds( m_canvas, &dc ); m_canvas->Refresh(); break; case ID_POPUP_SCH_BREAK_WIRE: { DLIST< SCH_ITEM > oldWires; oldWires.SetOwnership( false ); // Prevent DLIST for deleting items in destructor. m_canvas->MoveCursorToCrossHair(); screen->ExtractWires( oldWires, true ); screen->BreakSegment( GetCrossHairPosition() ); if( oldWires.GetCount() != 0 ) { PICKED_ITEMS_LIST oldItems; oldItems.m_Status = UR_WIRE_IMAGE; while( oldWires.GetCount() != 0 ) { ITEM_PICKER picker = ITEM_PICKER( oldWires.PopFront(), UR_WIRE_IMAGE ); oldItems.PushItem( picker ); } SaveCopyInUndoList( oldItems, UR_WIRE_IMAGE ); } screen->TestDanglingEnds( m_canvas, &dc ); } break; case ID_POPUP_SCH_DELETE_CMP: case ID_POPUP_SCH_DELETE: if( item == NULL ) break; DeleteItem( item ); screen->SetCurItem( NULL ); SetRepeatItem( NULL ); screen->TestDanglingEnds( m_canvas, &dc ); SetSheetNumberAndCount(); OnModify(); break; case ID_POPUP_SCH_END_SHEET: m_canvas->MoveCursorToCrossHair(); addCurrentItemToList( &dc ); break; case ID_POPUP_SCH_RESIZE_SHEET: ReSizeSheet( (SCH_SHEET*) item, &dc ); screen->TestDanglingEnds( m_canvas, &dc ); break; case ID_POPUP_IMPORT_GLABEL: if( item != NULL && item->Type() == SCH_SHEET_T ) screen->SetCurItem( ImportSheetPin( (SCH_SHEET*) item, &dc ) ); break; case ID_POPUP_SCH_CLEANUP_SHEET: if( item != NULL && item->Type() == SCH_SHEET_T ) { SCH_SHEET* sheet = (SCH_SHEET*) item; if( !sheet->HasUndefinedPins() ) { DisplayInfoMessage( this, _( "There are no undefined labels in this sheet to clean up." ) ); return; } if( !IsOK( this, _( "Do you wish to cleanup this sheet?" ) ) ) return; /* Save sheet in undo list before cleaning up unreferenced hierarchical labels. */ SaveCopyInUndoList( sheet, UR_CHANGED ); sheet->CleanupSheet(); OnModify(); m_canvas->RefreshDrawingRect( sheet->GetBoundingBox() ); } break; case ID_POPUP_SCH_INIT_CMP: m_canvas->MoveCursorToCrossHair(); break; case ID_POPUP_SCH_EDIT_CONVERT_CMP: // Ensure the struct is a component (could be a struct of a component, like Field, text..) if( item && item->Type() == SCH_COMPONENT_T ) { m_canvas->MoveCursorToCrossHair(); ConvertPart( (SCH_COMPONENT*) item, &dc ); } break; case ID_POPUP_SCH_DISPLAYDOC_CMP: // Ensure the struct is a component (could be a piece of a component, like Field, text..) if( item && item->Type() == SCH_COMPONENT_T ) { LIB_ALIAS* LibEntry; LibEntry = CMP_LIBRARY::FindLibraryEntry( ( (SCH_COMPONENT*) item )->GetLibName() ); if( LibEntry && LibEntry->GetDocFileName() != wxEmptyString ) { GetAssociatedDocument( this, LibEntry->GetDocFileName(), &wxGetApp().GetLibraryPathList() ); } } break; case ID_POPUP_SCH_ENTER_SHEET: if( item && (item->Type() == SCH_SHEET_T) ) { m_CurrentSheet->Push( (SCH_SHEET*) item ); DisplayCurrentSheet(); } break; case ID_POPUP_SCH_LEAVE_SHEET: m_CurrentSheet->Pop(); DisplayCurrentSheet(); break; case wxID_COPY: // really this is a Save block for paste screen->m_BlockLocate.SetCommand( BLOCK_SAVE ); screen->m_BlockLocate.SetMessageBlock( this ); HandleBlockEnd( &dc ); break; case ID_POPUP_PLACE_BLOCK: m_canvas->SetAutoPanRequest( false ); m_canvas->MoveCursorToCrossHair(); HandleBlockPlace( &dc ); break; case ID_POPUP_ZOOM_BLOCK: screen->m_BlockLocate.SetCommand( BLOCK_ZOOM ); screen->m_BlockLocate.SetMessageBlock( this ); HandleBlockEnd( &dc ); break; case ID_POPUP_DELETE_BLOCK: m_canvas->MoveCursorToCrossHair(); screen->m_BlockLocate.SetCommand( BLOCK_DELETE ); screen->m_BlockLocate.SetMessageBlock( this ); HandleBlockEnd( &dc ); SetSheetNumberAndCount(); break; case ID_POPUP_COPY_BLOCK: m_canvas->MoveCursorToCrossHair(); screen->m_BlockLocate.SetCommand( BLOCK_COPY ); screen->m_BlockLocate.SetMessageBlock( this ); HandleBlockEnd( &dc ); break; case ID_POPUP_DRAG_BLOCK: m_canvas->MoveCursorToCrossHair(); screen->m_BlockLocate.SetCommand( BLOCK_DRAG ); screen->m_BlockLocate.SetMessageBlock( this ); HandleBlockEnd( &dc ); break; case ID_POPUP_SCH_ADD_JUNCTION: m_canvas->MoveCursorToCrossHair(); screen->SetCurItem( AddJunction( &dc, GetCrossHairPosition(), true ) ); screen->TestDanglingEnds( m_canvas, &dc ); screen->SetCurItem( NULL ); break; case ID_POPUP_SCH_ADD_LABEL: case ID_POPUP_SCH_ADD_GLABEL: screen->SetCurItem( CreateNewText( &dc, id == ID_POPUP_SCH_ADD_LABEL ? LAYER_LOCLABEL : LAYER_GLOBLABEL ) ); item = screen->GetCurItem(); if( item ) addCurrentItemToList( &dc ); break; case ID_POPUP_SCH_GETINFO_MARKER: if( item && item->Type() == SCH_MARKER_T ) ( (SCH_MARKER*) item )->DisplayMarkerInfo( this ); break; default: // Log error: wxFAIL_MSG( wxString::Format( wxT( "Cannot process command event ID %d" ), event.GetId() ) ); break; } // End switch ( id ) (Command execution) if( GetToolId() == ID_NO_TOOL_SELECTED ) SetRepeatItem( NULL ); }
void SCH_EDIT_FRAME::OnSelectTool( wxCommandEvent& aEvent ) { int id = aEvent.GetId(); // Stop the current command and deselect the current tool. m_canvas->EndMouseCapture( ID_NO_TOOL_SELECTED, m_canvas->GetDefaultCursor() ); switch( id ) { case ID_NO_TOOL_SELECTED: SetToolID( id, m_canvas->GetDefaultCursor(), _( "No tool selected" ) ); break; case ID_HIERARCHY_PUSH_POP_BUTT: SetToolID( id, wxCURSOR_HAND, _( "Descend or ascend hierarchy" ) ); break; case ID_NOCONN_BUTT: SetToolID( id, wxCURSOR_PENCIL, _( "Add no connect" ) ); break; case ID_WIRE_BUTT: SetToolID( id, wxCURSOR_PENCIL, _( "Add wire" ) ); break; case ID_BUS_BUTT: SetToolID( id, wxCURSOR_PENCIL, _( "Add bus" ) ); break; case ID_LINE_COMMENT_BUTT: SetToolID( id, wxCURSOR_PENCIL, _( "Add lines" ) ); break; case ID_JUNCTION_BUTT: SetToolID( id, wxCURSOR_PENCIL, _( "Add junction" ) ); break; case ID_LABEL_BUTT: SetToolID( id, wxCURSOR_PENCIL, _( "Add label" ) ); break; case ID_GLABEL_BUTT: SetToolID( id, wxCURSOR_PENCIL, _( "Add global label" ) ); break; case ID_HIERLABEL_BUTT: SetToolID( id, wxCURSOR_PENCIL, _( "Add hierarchical label" ) ); break; case ID_TEXT_COMMENT_BUTT: SetToolID( id, wxCURSOR_PENCIL, _( "Add text" ) ); break; case ID_ADD_IMAGE_BUTT: SetToolID( id, wxCURSOR_PENCIL, _( "Add image" ) ); break; case ID_WIRETOBUS_ENTRY_BUTT: SetToolID( id, wxCURSOR_PENCIL, _( "Add wire to bus entry" ) ); break; case ID_BUSTOBUS_ENTRY_BUTT: SetToolID( id, wxCURSOR_PENCIL, _( "Add bus to bus entry" ) ); break; case ID_SHEET_SYMBOL_BUTT: SetToolID( id, wxCURSOR_PENCIL, _( "Add sheet" ) ); break; case ID_SHEET_PIN_BUTT: SetToolID( id, wxCURSOR_PENCIL, _( "Add sheet pins" ) ); break; case ID_IMPORT_HLABEL_BUTT: SetToolID( id, wxCURSOR_PENCIL, _( "Import sheet pins" ) ); break; case ID_SCH_PLACE_COMPONENT: SetToolID( id, wxCURSOR_PENCIL, _( "Add component" ) ); break; case ID_PLACE_POWER_BUTT: SetToolID( id, wxCURSOR_PENCIL, _( "Add power" ) ); break; case ID_SCHEMATIC_DELETE_ITEM_BUTT: SetToolID( id, wxCURSOR_BULLSEYE, _( "Delete item" ) ); break; default: SetRepeatItem( NULL ); } // Simulate left click event if we got here from a hot key. if( aEvent.GetClientObject() != NULL ) { EDA_HOTKEY_CLIENT_DATA* data = (EDA_HOTKEY_CLIENT_DATA*) aEvent.GetClientObject(); wxPoint pos = data->GetPosition(); INSTALL_UNBUFFERED_DC( dc, m_canvas ); OnLeftClick( &dc, pos ); } }
bool PCB_EDIT_FRAME::OnHotKey( wxDC* aDC, int aHotkeyCode, const wxPoint& aPosition, EDA_ITEM* aItem ) { if( aHotkeyCode == 0 ) return false; bool itemCurrentlyEdited = GetCurItem() && GetCurItem()->GetFlags(); MODULE* module = NULL; int evt_type = 0; //Used to post a wxCommandEvent on demand PCB_SCREEN* screen = GetScreen(); auto displ_opts = (PCB_DISPLAY_OPTIONS*)GetDisplayOptions(); /* Convert lower to upper case * (the usual toupper function has problem with non ascii codes like function keys */ if( (aHotkeyCode >= 'a') && (aHotkeyCode <= 'z') ) aHotkeyCode += 'A' - 'a'; EDA_HOTKEY* HK_Descr = GetDescriptorFromHotkey( aHotkeyCode, common_Hotkey_List ); if( HK_Descr == NULL ) HK_Descr = GetDescriptorFromHotkey( aHotkeyCode, board_edit_Hotkey_List ); if( HK_Descr == NULL ) return false; int hk_id = HK_Descr->m_Idcommand; // Create a wxCommandEvent that will be posted in some hot keys functions wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED ); cmd.SetEventObject( this ); LAYER_NUM ll; switch( hk_id ) { default: case HK_NOT_FOUND: return false; case HK_LEFT_CLICK: OnLeftClick( aDC, aPosition ); break; case HK_LEFT_DCLICK: // Simulate a double left click: generate 2 events OnLeftClick( aDC, aPosition ); OnLeftDClick( aDC, aPosition ); break; case HK_SWITCH_TRACK_WIDTH_TO_NEXT: if( GetCanvas()->IsMouseCaptured() ) GetCanvas()->CallMouseCapture( aDC, wxDefaultPosition, false ); if( GetDesignSettings().GetTrackWidthIndex() < GetDesignSettings().m_TrackWidthList.size() - 1 ) GetDesignSettings().SetTrackWidthIndex( GetDesignSettings().GetTrackWidthIndex() + 1 ); else GetDesignSettings().SetTrackWidthIndex( 0 ); if( GetCanvas()->IsMouseCaptured() ) GetCanvas()->CallMouseCapture( aDC, wxDefaultPosition, false ); break; case HK_SWITCH_TRACK_WIDTH_TO_PREVIOUS: if( GetCanvas()->IsMouseCaptured() ) GetCanvas()->CallMouseCapture( aDC, wxDefaultPosition, false ); if( GetDesignSettings().GetTrackWidthIndex() <= 0 ) GetDesignSettings().SetTrackWidthIndex( GetDesignSettings().m_TrackWidthList.size() -1 ); else GetDesignSettings().SetTrackWidthIndex( GetDesignSettings().GetTrackWidthIndex() - 1 ); if( GetCanvas()->IsMouseCaptured() ) GetCanvas()->CallMouseCapture( aDC, wxDefaultPosition, false ); break; case HK_SWITCH_GRID_TO_FASTGRID1: SetFastGrid1(); break; case HK_SWITCH_GRID_TO_FASTGRID2: SetFastGrid2(); break; case HK_SWITCH_GRID_TO_NEXT: evt_type = ID_POPUP_GRID_NEXT; break; case HK_SWITCH_GRID_TO_PREVIOUS: evt_type = ID_POPUP_GRID_PREV; break; case HK_SWITCH_LAYER_TO_PREVIOUS: ll = GetActiveLayer(); if( !IsCopperLayer( ll ) ) break; if( ll == F_Cu ) ll = B_Cu; else if( ll == B_Cu ) ll = ToLAYER_ID( GetBoard()->GetCopperLayerCount() - 2 ); else ll = ll - 1; SwitchLayer( aDC, ToLAYER_ID( ll ) ); break; case HK_SWITCH_LAYER_TO_NEXT: ll = GetActiveLayer(); if( !IsCopperLayer( ll ) ) break; if( ll == B_Cu ) ll = F_Cu; else if( ++ll >= GetBoard()->GetCopperLayerCount() - 1 ) ll = B_Cu; SwitchLayer( aDC, ToLAYER_ID( ll ) ); break; case HK_SWITCH_LAYER_TO_COMPONENT: SwitchLayer( aDC, F_Cu ); break; case HK_SWITCH_LAYER_TO_COPPER: SwitchLayer( aDC, B_Cu ); break; case HK_SWITCH_LAYER_TO_INNER1: SwitchLayer( aDC, In1_Cu ); break; case HK_SWITCH_LAYER_TO_INNER2: SwitchLayer( aDC, In2_Cu ); break; case HK_SWITCH_LAYER_TO_INNER3: SwitchLayer( aDC, In3_Cu ); break; case HK_SWITCH_LAYER_TO_INNER4: SwitchLayer( aDC, In4_Cu ); break; case HK_SWITCH_LAYER_TO_INNER5: SwitchLayer( aDC, In5_Cu ); break; case HK_SWITCH_LAYER_TO_INNER6: SwitchLayer( aDC, In6_Cu ); break; case HK_HELP: // Display Current hotkey list DisplayHotkeyList( this, g_Board_Editor_Hotkeys_Descr ); break; case HK_PREFERENCES: evt_type = wxID_PREFERENCES; break; case HK_ZOOM_IN: evt_type = ID_KEY_ZOOM_IN; break; case HK_ZOOM_OUT: evt_type = ID_KEY_ZOOM_OUT; break; case HK_ZOOM_REDRAW: evt_type = ID_ZOOM_REDRAW; break; case HK_ZOOM_AUTO: evt_type = ID_ZOOM_PAGE; break; case HK_ZOOM_CENTER: evt_type = ID_POPUP_ZOOM_CENTER; break; case HK_ZOOM_SELECTION: evt_type = ID_ZOOM_SELECTION; break; case HK_ADD_MODULE: evt_type = ID_PCB_MODULE_BUTT; break; case HK_UNDO: case HK_REDO: if( !itemCurrentlyEdited ) { wxCommandEvent event( wxEVT_COMMAND_TOOL_CLICKED, HK_Descr->m_IdMenuEvent ); wxPostEvent( this, event ); } break; case HK_RESET_LOCAL_COORD: // Set the relative coord GetScreen()->m_O_Curseur = GetCrossHairPosition(); break; case HK_SET_GRID_ORIGIN: PCBNEW_CONTROL::SetGridOrigin( GetGalCanvas()->GetView(), this, new KIGFX::ORIGIN_VIEWITEM( GetGridOrigin(), UR_TRANSIENT ), GetCrossHairPosition() ); m_canvas->Refresh(); break; case HK_RESET_GRID_ORIGIN: PCBNEW_CONTROL::SetGridOrigin( GetGalCanvas()->GetView(), this, new KIGFX::ORIGIN_VIEWITEM( GetGridOrigin(), UR_TRANSIENT ), wxPoint( 0, 0 ) ); m_canvas->Refresh(); break; case HK_SWITCH_UNITS: evt_type = (GetUserUnits() == INCHES) ? ID_TB_OPTIONS_SELECT_UNIT_MM : ID_TB_OPTIONS_SELECT_UNIT_INCH; break; case HK_SWITCH_TRACK_DISPLAY_MODE: displ_opts->m_DisplayPcbTrackFill = !displ_opts->m_DisplayPcbTrackFill; m_canvas->Refresh(); break; case HK_DELETE: OnHotkeyDeleteItem( aDC ); break; case HK_BACK_SPACE: if( IsCopperLayer( GetActiveLayer() ) ) { if( !itemCurrentlyEdited ) { // no track is currently being edited - select a segment and remove it. // @todo: possibly? pass the HK command code to PcbGeneralLocateAndDisplay() // so it can restrict its search to specific item types. BOARD_ITEM * item = PcbGeneralLocateAndDisplay(); // don't let backspace delete modules!! if( item && item->IsTrack() ) { Delete_Segment( aDC, (TRACK*) item ); SetCurItem( NULL ); } OnModify(); } else if( GetCurItem()->IsTrack() ) { // then an element is being edited - remove the last segment. // simple lines for debugger: TRACK* track = (TRACK*) GetCurItem(); track = Delete_Segment( aDC, track ); SetCurItem( track ); OnModify(); } } break; case HK_GET_AND_MOVE_FOOTPRINT: if( !itemCurrentlyEdited ) evt_type = ID_POPUP_PCB_GET_AND_MOVE_MODULE_REQUEST; break; case HK_FIND_ITEM: if( !itemCurrentlyEdited ) evt_type = ID_FIND_ITEMS; break; case HK_OPEN: if( !itemCurrentlyEdited ) evt_type = ID_LOAD_FILE ; break; case HK_SAVE: if( !itemCurrentlyEdited ) evt_type = ID_SAVE_BOARD; break; case HK_ADD_MICROVIA: // Place a micro via if a track is in progress if( GetToolId() != ID_TRACK_BUTT ) return true; if( !itemCurrentlyEdited ) // no track in progress: nothing to do break; if( GetCurItem()->Type() != PCB_TRACE_T ) // Should not occur return true; if( !GetCurItem()->IsNew() ) return true; // place micro via and switch layer if( IsMicroViaAcceptable() ) evt_type = ID_POPUP_PCB_PLACE_MICROVIA; break; case HK_ADD_BLIND_BURIED_VIA: case HK_ADD_THROUGH_VIA: // Switch to alternate layer and Place a via if a track is in progress if( GetBoard()->GetDesignSettings().m_BlindBuriedViaAllowed && hk_id == HK_ADD_BLIND_BURIED_VIA ) GetBoard()->GetDesignSettings().m_CurrentViaType = VIA_BLIND_BURIED; else GetBoard()->GetDesignSettings().m_CurrentViaType = VIA_THROUGH; if( !itemCurrentlyEdited ) // no track in progress: switch layer only { Other_Layer_Route( NULL, aDC ); if( displ_opts->m_ContrastModeDisplay ) m_canvas->Refresh(); break; } if( GetToolId() != ID_TRACK_BUTT ) return true; if( GetCurItem()->Type() != PCB_TRACE_T ) return true; if( !GetCurItem()->IsNew() ) return true; evt_type = hk_id == HK_ADD_BLIND_BURIED_VIA ? ID_POPUP_PCB_PLACE_BLIND_BURIED_VIA : ID_POPUP_PCB_PLACE_THROUGH_VIA; break; case HK_SEL_LAYER_AND_ADD_THROUGH_VIA: case HK_SEL_LAYER_AND_ADD_BLIND_BURIED_VIA: if( GetCurItem() == NULL || !GetCurItem()->IsNew() || GetCurItem()->Type() != PCB_TRACE_T ) break; evt_type = hk_id == HK_SEL_LAYER_AND_ADD_BLIND_BURIED_VIA ? ID_POPUP_PCB_SELECT_CU_LAYER_AND_PLACE_BLIND_BURIED_VIA : ID_POPUP_PCB_SELECT_CU_LAYER_AND_PLACE_THROUGH_VIA; break; case HK_SWITCH_TRACK_POSTURE: /* change the position of initial segment when creating new tracks * switch from _/ to -\ . */ evt_type = ID_POPUP_PCB_SWITCH_TRACK_POSTURE ; break; case HK_DRAG_TRACK_KEEP_SLOPE: OnHotkeyMoveItem( HK_DRAG_TRACK_KEEP_SLOPE ); break; case HK_PLACE_ITEM: OnHotkeyPlaceItem( aDC ); break; case HK_ADD_NEW_TRACK: // Start new track, if possible OnHotkeyBeginRoute( aDC ); break; case HK_EDIT_ITEM: // Edit board item OnHotkeyEditItem( HK_EDIT_ITEM ); break; case HK_EDIT_MODULE_WITH_MODEDIT: // Edit module with module editor OnHotkeyEditItem( HK_EDIT_MODULE_WITH_MODEDIT ); break; case HK_LOCK_UNLOCK_FOOTPRINT: // toggle module "MODULE_is_LOCKED" status: // get any module, locked or not locked and toggle its locked status if( !itemCurrentlyEdited ) { wxPoint pos = RefPos( true ); module = GetBoard()->GetFootprint( pos, screen->m_Active_Layer, true ); } else if( GetCurItem()->Type() == PCB_MODULE_T ) { module = (MODULE*) GetCurItem(); } if( module ) { SetCurItem( module ); module->SetLocked( !module->IsLocked() ); OnModify(); SetMsgPanel( module ); } break; case HK_DRAG_ITEM: // Start drag module or track segment OnHotkeyMoveItem( HK_DRAG_ITEM ); break; case HK_MOVE_ITEM: // Start move item OnHotkeyMoveItem( HK_MOVE_ITEM ); break; case HK_COPY_ITEM: evt_type = OnHotkeyCopyItem(); break; case HK_ROTATE_ITEM: // Rotation OnHotkeyRotateItem( HK_ROTATE_ITEM ); break; case HK_FLIP_ITEM: OnHotkeyFlipItem( HK_FLIP_ITEM ); break; case HK_MOVE_ITEM_EXACT: case HK_DUPLICATE_ITEM: case HK_DUPLICATE_ITEM_AND_INCREMENT: case HK_CREATE_ARRAY: OnHotkeyDuplicateOrArrayItem( HK_Descr->m_Idcommand ); break; case HK_SWITCH_HIGHCONTRAST_MODE: // switch to high contrast mode and refresh the canvas displ_opts->m_ContrastModeDisplay = !displ_opts->m_ContrastModeDisplay; m_canvas->Refresh(); break; case HK_CANVAS_CAIRO: evt_type = ID_MENU_CANVAS_CAIRO; break; case HK_CANVAS_OPENGL: evt_type = ID_MENU_CANVAS_OPENGL; break; case HK_CANVAS_LEGACY: evt_type = ID_MENU_CANVAS_LEGACY; break; case HK_ZONE_FILL_OR_REFILL: evt_type = ID_POPUP_PCB_FILL_ALL_ZONES; break; case HK_ZONE_REMOVE_FILLED: evt_type = ID_POPUP_PCB_REMOVE_FILLED_AREAS_IN_ALL_ZONES; break; } if( evt_type != 0 ) { wxCommandEvent evt( wxEVT_COMMAND_MENU_SELECTED ); evt.SetEventObject( this ); evt.SetId( evt_type ); GetEventHandler()->ProcessEvent( evt ); } return true; }
bool LIB_VIEW_FRAME::OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition, EDA_ITEM* aItem ) { if( aHotKey == 0 ) return false; wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED ); cmd.SetEventObject( this ); /* Convert lower to upper case (the usual toupper function has problem with non ascii * codes like function keys */ if( (aHotKey >= 'a') && (aHotKey <= 'z') ) aHotKey += 'A' - 'a'; EDA_HOTKEY* HK_Descr = GetDescriptorFromHotkey( aHotKey, common_basic_Hotkey_List ); if( HK_Descr == NULL ) HK_Descr = GetDescriptorFromHotkey( aHotKey, viewlib_Hotkey_List ); if( HK_Descr == NULL ) return false; switch( HK_Descr->m_Idcommand ) { default: case HK_NOT_FOUND: return false; case HK_HELP: // Display Current hotkey list DisplayHotkeyList( this, g_Viewlib_Hokeys_Descr ); break; case HK_RESET_LOCAL_COORD: // set local (relative) coordinate origin GetScreen()->m_O_Curseur = GetCrossHairPosition(); break; case HK_LEFT_CLICK: OnLeftClick( aDC, aPosition ); break; case HK_LEFT_DCLICK: // Simulate a double left click: generate 2 events OnLeftClick( aDC, aPosition ); OnLeftDClick( aDC, aPosition ); break; case HK_ZOOM_IN: cmd.SetId( ID_POPUP_ZOOM_IN ); GetEventHandler()->ProcessEvent( cmd ); break; case HK_ZOOM_OUT: cmd.SetId( ID_POPUP_ZOOM_OUT ); GetEventHandler()->ProcessEvent( cmd ); break; case HK_ZOOM_REDRAW: cmd.SetId( ID_ZOOM_REDRAW ); GetEventHandler()->ProcessEvent( cmd ); break; case HK_ZOOM_CENTER: cmd.SetId( ID_POPUP_ZOOM_CENTER ); GetEventHandler()->ProcessEvent( cmd ); break; case HK_ZOOM_AUTO: cmd.SetId( ID_ZOOM_PAGE ); GetEventHandler()->ProcessEvent( cmd ); break; } return true; }
bool LIB_EDIT_FRAME::OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition, EDA_ITEM* aItem ) { if( aHotKey == 0 ) return false; wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED ); cmd.SetEventObject( this ); /* Convert lower to upper case (the usual toupper function has problem * with non ascii codes like function keys */ if( (aHotKey >= 'a') && (aHotKey <= 'z') ) aHotKey += 'A' - 'a'; EDA_HOTKEY* hotKey = GetDescriptorFromHotkey( aHotKey, common_Hotkey_List ); if( hotKey == NULL ) hotKey = GetDescriptorFromHotkey( aHotKey, libEdit_Hotkey_List ); if( hotKey == NULL ) return false; bool itemInEdit = m_drawItem && m_drawItem->InEditMode(); bool blocInProgress = GetScreen()->m_BlockLocate.GetState() != STATE_NO_BLOCK; switch( hotKey->m_Idcommand ) { default: case HK_NOT_FOUND: return false; case HK_HELP: // Display Current hotkey list DisplayHotkeyList( this, g_Libedit_Hokeys_Descr ); break; case HK_RESET_LOCAL_COORD: // Reset the relative coord GetScreen()->m_O_Curseur = GetCrossHairPosition(); break; case HK_LEFT_CLICK: OnLeftClick( aDC, aPosition ); break; case HK_LEFT_DCLICK: // Simulate a double left click: generate 2 events OnLeftClick( aDC, aPosition ); OnLeftDClick( aDC, aPosition ); break; case HK_ZOOM_IN: case HK_ZOOM_OUT: case HK_ZOOM_REDRAW: case HK_ZOOM_CENTER: case HK_ZOOM_AUTO: cmd.SetId( hotKey->m_IdMenuEvent ); GetEventHandler()->ProcessEvent( cmd ); break; case HK_UNDO: case HK_REDO: if( !itemInEdit ) { cmd.SetId( hotKey->m_IdMenuEvent ); GetEventHandler()->ProcessEvent( cmd ); } break; case HK_REPEAT_LAST: if( ! itemInEdit ) { if( m_lastDrawItem && !m_lastDrawItem->InEditMode() && ( m_lastDrawItem->Type() == LIB_PIN_T ) ) RepeatPinItem( aDC, (LIB_PIN*) m_lastDrawItem ); } break; case HK_EDIT: if( !itemInEdit ) m_drawItem = LocateItemUsingCursor( aPosition ); if( m_drawItem ) { switch( m_drawItem->Type() ) { case LIB_PIN_T: cmd.SetId( ID_LIBEDIT_EDIT_PIN ); GetEventHandler()->ProcessEvent( cmd ); break; case LIB_ARC_T: case LIB_CIRCLE_T: case LIB_RECTANGLE_T: case LIB_POLYLINE_T: case LIB_TEXT_T: cmd.SetId( ID_POPUP_LIBEDIT_BODY_EDIT_ITEM ); GetEventHandler()->ProcessEvent( cmd ); break; case LIB_FIELD_T: cmd.SetId( ID_POPUP_LIBEDIT_FIELD_EDIT_ITEM ); GetEventHandler()->ProcessEvent( cmd ); break; default: break; } } break; case HK_ROTATE: if( blocInProgress ) { GetScreen()->m_BlockLocate.SetCommand( BLOCK_ROTATE ); HandleBlockPlace( aDC ); } else { if ( !itemInEdit ) m_drawItem = LocateItemUsingCursor( aPosition ); if( m_drawItem ) { cmd.SetId( ID_LIBEDIT_ROTATE_ITEM ); GetEventHandler()->ProcessEvent( cmd ); } } break; case HK_LIBEDIT_LOAD_PART: LoadOneLibraryPart( cmd ); break; case HK_LIBEDIT_CREATE_PIN: if( ! itemInEdit ) { SetToolID( ID_LIBEDIT_PIN_BUTT, wxCURSOR_PENCIL, _( "Add Pin" ) ); OnLeftClick( aDC, aPosition ); } break; case HK_DELETE: if( !itemInEdit ) m_drawItem = LocateItemUsingCursor( aPosition ); if( m_drawItem && !m_drawItem->InEditMode() ) { cmd.SetId( ID_POPUP_LIBEDIT_DELETE_ITEM ); Process_Special_Functions( cmd ); } break; case HK_LIBEDIT_MOVE_GRAPHIC_ITEM: if( !itemInEdit ) { m_drawItem = LocateItemUsingCursor( aPosition ); if( m_drawItem ) { cmd.SetId( ID_POPUP_LIBEDIT_MOVE_ITEM_REQUEST ); Process_Special_Functions( cmd ); } } break; case HK_DRAG: if( !itemInEdit ) { m_drawItem = LocateItemUsingCursor( aPosition ); if( m_drawItem && !m_drawItem->InEditMode() ) { cmd.SetId( ID_POPUP_LIBEDIT_MODIFY_ITEM ); Process_Special_Functions( cmd ); } } break; case HK_MIRROR_Y: // Mirror Y if( !itemInEdit ) m_drawItem = LocateItemUsingCursor( aPosition ); cmd.SetId( ID_LIBEDIT_MIRROR_Y ); GetEventHandler()->ProcessEvent( cmd ); break; case HK_MIRROR_X: // Mirror X if( !itemInEdit ) m_drawItem = LocateItemUsingCursor( aPosition ); cmd.SetId( ID_LIBEDIT_MIRROR_X ); GetEventHandler()->ProcessEvent( cmd ); break; } // Hot key handled. return true; }
/* * Hot keys. Some commands are relative to the item under the mouse cursor * Commands are case insensitive */ bool SCH_EDIT_FRAME::OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition, EDA_ITEM* aItem ) { if( aHotKey == 0 ) return false; wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED ); SCH_SCREEN* screen = GetScreen(); // itemInEdit == false means no item currently edited. We can ask for editing a new item bool itemInEdit = screen->GetCurItem() && screen->GetCurItem()->GetFlags(); // blocInProgress == false means no block in progress. // Because a drag command uses a drag block, false means also no drag in progress // If false, we can ask for editing a new item bool blocInProgress = screen->m_BlockLocate.GetState() != STATE_NO_BLOCK; // notBusy == true means no item currently edited and no other command in progress // We can change active tool and ask for editing a new item bool notBusy = (!itemInEdit) && (!blocInProgress); /* Convert lower to upper case (the usual toupper function has problem * with non ascii codes like function keys */ if( (aHotKey >= 'a') && (aHotKey <= 'z') ) aHotKey += 'A' - 'a'; // Search command from key : EDA_HOTKEY* hotKey = GetDescriptorFromHotkey( aHotKey, common_Hotkey_List ); if( hotKey == NULL ) hotKey = GetDescriptorFromHotkey( aHotKey, schematic_Hotkey_List ); if( hotKey == NULL ) return false; switch( hotKey->m_Idcommand ) { default: case HK_NOT_FOUND: return false; case HK_HELP: // Display Current hotkey list DisplayHotkeyList( this, g_Schematic_Hokeys_Descr ); break; case HK_RESET_LOCAL_COORD: // Reset the relative coord GetScreen()->m_O_Curseur = GetCrossHairPosition(); break; case ID_HOTKEY_HIGHLIGHT: if( notBusy ) HighlightConnectionAtPosition( GetCrossHairPosition() ); break; case HK_LEFT_CLICK: case HK_LEFT_DCLICK: // Simulate a double left click: generate 2 events if( screen->m_BlockLocate.GetState() == STATE_BLOCK_MOVE ) { GetCanvas()->SetAutoPanRequest( false ); HandleBlockPlace( aDC ); } else if( screen->m_BlockLocate.GetState() == STATE_NO_BLOCK ) { OnLeftClick( aDC, aPosition ); if( hotKey->m_Idcommand == HK_LEFT_DCLICK ) OnLeftDClick( aDC, aPosition ); } break; case HK_ZOOM_IN: case HK_ZOOM_OUT: case HK_ZOOM_REDRAW: case HK_ZOOM_CENTER: case HK_ZOOM_AUTO: case HK_ZOOM_SELECTION: case HK_MOVEBLOCK_TO_DRAGBLOCK: // Switch to drag mode, when block moving case HK_SAVE_BLOCK: // Copy block to paste buffer. cmd.SetId( hotKey->m_IdMenuEvent ); GetEventHandler()->ProcessEvent( cmd ); break; case HK_DELETE: if( notBusy ) DeleteItemAtCrossHair( aDC ); break; case HK_REPEAT_LAST: if( notBusy ) RepeatDrawItem( aDC ); break; case HK_END_CURR_LINEWIREBUS: // this key terminates a new line/bus/wire in progress if( aItem && aItem->IsNew() && aItem->Type() == SCH_LINE_T ) { cmd.SetId( hotKey->m_IdMenuEvent ); GetEventHandler()->ProcessEvent( cmd ); } break; case HK_UNDO: // Hot keys that map to command IDs that cannot be called case HK_REDO: // while busy performing another command. case HK_FIND_ITEM: case HK_FIND_REPLACE: case HK_DELETE_NODE: case HK_LEAVE_SHEET: if( notBusy ) { cmd.SetId( hotKey->m_IdMenuEvent ); GetEventHandler()->ProcessEvent( cmd ); } break; case HK_FIND_NEXT_ITEM: case HK_FIND_NEXT_DRC_MARKER: if( notBusy ) { wxFindDialogEvent event( hotKey->m_IdMenuEvent, GetId() ); event.SetEventObject( this ); event.SetFlags( m_findReplaceData->GetFlags() ); event.SetFindString( m_findReplaceData->GetFindString() ); GetEventHandler()->ProcessEvent( event ); } break; case HK_ADD_NEW_COMPONENT: // Add component case HK_ADD_NEW_POWER: // Add power component case HK_ADD_LABEL: case HK_ADD_HLABEL: case HK_ADD_GLABEL: case HK_ADD_JUNCTION: case HK_ADD_WIRE_ENTRY: case HK_ADD_BUS_ENTRY: case HK_ADD_HIER_SHEET: case HK_ADD_GRAPHIC_TEXT: case HK_ADD_GRAPHIC_POLYLINE: case HK_ADD_NOCONN_FLAG: // Add a no connected flag case HK_BEGIN_BUS: case HK_BEGIN_WIRE: if( notBusy ) { EDA_HOTKEY_CLIENT_DATA data( aPosition ); cmd.SetInt( aHotKey ); cmd.SetClientObject( &data ); cmd.SetId( hotKey->m_IdMenuEvent ); GetEventHandler()->ProcessEvent( cmd ); } else if( aItem && aItem->IsNew() ) { // If the item is a bus or a wire, a begin command is not possible. if( (GetToolId() == ID_BUS_BUTT) && (aItem->Type() == SCH_LINE_T) ) { SCH_LINE* segment = (SCH_LINE*) aItem; if( segment->GetLayer() != LAYER_BUS ) break; // Bus in progress: OnLeftClick( aDC, aPosition ); } else if( (GetToolId() == ID_WIRE_BUTT ) && (aItem->Type() == SCH_LINE_T) ) { SCH_LINE* segment = (SCH_LINE*) aItem; if( segment->GetLayer() != LAYER_WIRE ) break; // Wire in progress: OnLeftClick( aDC, aPosition ); } } break; case HK_COPY_COMPONENT_OR_LABEL: // Duplicate component or text/label if( itemInEdit ) break; if( aItem == NULL ) { aItem = LocateAndShowItem( aPosition, SCH_COLLECTOR::CopyableItems ); if( aItem == NULL ) break; } cmd.SetId( hotKey->m_IdMenuEvent ); wxPostEvent( this, cmd ); break; case HK_DRAG: // Start drag case HK_MOVE_COMPONENT_OR_ITEM: // Start move schematic item. if( ! notBusy ) break; // Fall through case HK_EDIT: // Edit schematic item. Do not allow sheet edition when mowing // Because a sheet edition can be complex. if( itemInEdit && screen->GetCurItem()->Type() == SCH_SHEET_T ) break; // Fall through case HK_EDIT_COMPONENT_VALUE: // Edit component value field. case HK_EDIT_COMPONENT_REFERENCE: // Edit component value reference. case HK_EDIT_COMPONENT_FOOTPRINT: // Edit component footprint field. case HK_MIRROR_Y: // Mirror Y case HK_MIRROR_X: // Mirror X case HK_ORIENT_NORMAL_COMPONENT: // Orient 0, no mirror (Component) case HK_ROTATE: // Rotate schematic item. case HK_EDIT_COMPONENT_WITH_LIBEDIT: // Call Libedit and load the current component case HK_AUTOPLACE_FIELDS: // Autoplace all fields around component { // force a new item search on hot keys at current position, // if there is no currently edited item, // to avoid using a previously selected item if( ! itemInEdit ) screen->SetCurItem( NULL ); EDA_HOTKEY_CLIENT_DATA data( aPosition ); cmd.SetInt( hotKey->m_Idcommand ); cmd.SetClientObject( &data ); cmd.SetId( hotKey->m_IdMenuEvent ); GetEventHandler()->ProcessEvent( cmd ); } break; } // Hot key handled. return true; }
void wxShapeCanvas::OnMouseEvent(wxMouseEvent& event) { wxClientDC dc(this); PrepareDC(dc); wxPoint logPos(event.GetLogicalPosition(dc)); double x, y; x = (double) logPos.x; y = (double) logPos.y; int keys = 0; if (event.ShiftDown()) keys = keys | KEY_SHIFT; if (event.ControlDown()) keys = keys | KEY_CTRL; bool dragging = event.Dragging(); // Check if we're within the tolerance for mouse movements. // If we're very close to the position we started dragging // from, this may not be an intentional drag at all. if (dragging) { int dx = abs(dc.LogicalToDeviceX((long) (x - m_firstDragX))); int dy = abs(dc.LogicalToDeviceY((long) (y - m_firstDragY))); if (m_checkTolerance && (dx <= GetDiagram()->GetMouseTolerance()) && (dy <= GetDiagram()->GetMouseTolerance())) { return; } else // If we've ignored the tolerance once, then ALWAYS ignore // tolerance in this drag, even if we come back within // the tolerance range. m_checkTolerance = false; } // Dragging - note that the effect of dragging is left entirely up // to the object, so no movement is done unless explicitly done by // object. if (dragging && m_draggedShape && m_dragState == StartDraggingLeft) { m_dragState = ContinueDraggingLeft; // If the object isn't m_draggable, transfer message to canvas if (m_draggedShape->Draggable()) m_draggedShape->GetEventHandler()->OnBeginDragLeft((double)x, (double)y, keys, m_draggedAttachment); else { m_draggedShape = NULL; OnBeginDragLeft((double)x, (double)y, keys); } m_oldDragX = x; m_oldDragY = y; } else if (dragging && m_draggedShape && m_dragState == ContinueDraggingLeft) { // Continue dragging m_draggedShape->GetEventHandler()->OnDragLeft(false, m_oldDragX, m_oldDragY, keys, m_draggedAttachment); m_draggedShape->GetEventHandler()->OnDragLeft(true, (double)x, (double)y, keys, m_draggedAttachment); m_oldDragX = x; m_oldDragY = y; } else if (event.LeftUp() && m_draggedShape && m_dragState == ContinueDraggingLeft) { m_dragState = NoDragging; m_checkTolerance = true; m_draggedShape->GetEventHandler()->OnDragLeft(false, m_oldDragX, m_oldDragY, keys, m_draggedAttachment); m_draggedShape->GetEventHandler()->OnEndDragLeft((double)x, (double)y, keys, m_draggedAttachment); m_draggedShape = NULL; } else if (dragging && m_draggedShape && m_dragState == StartDraggingRight) { m_dragState = ContinueDraggingRight; if (m_draggedShape->Draggable()) m_draggedShape->GetEventHandler()->OnBeginDragRight((double)x, (double)y, keys, m_draggedAttachment); else { m_draggedShape = NULL; OnBeginDragRight((double)x, (double)y, keys); } m_oldDragX = x; m_oldDragY = y; } else if (dragging && m_draggedShape && m_dragState == ContinueDraggingRight) { // Continue dragging m_draggedShape->GetEventHandler()->OnDragRight(false, m_oldDragX, m_oldDragY, keys, m_draggedAttachment); m_draggedShape->GetEventHandler()->OnDragRight(true, (double)x, (double)y, keys, m_draggedAttachment); m_oldDragX = x; m_oldDragY = y; } else if (event.RightUp() && m_draggedShape && m_dragState == ContinueDraggingRight) { m_dragState = NoDragging; m_checkTolerance = true; m_draggedShape->GetEventHandler()->OnDragRight(false, m_oldDragX, m_oldDragY, keys, m_draggedAttachment); m_draggedShape->GetEventHandler()->OnEndDragRight((double)x, (double)y, keys, m_draggedAttachment); m_draggedShape = NULL; } // All following events sent to canvas, not object else if (dragging && !m_draggedShape && m_dragState == StartDraggingLeft) { m_dragState = ContinueDraggingLeft; OnBeginDragLeft((double)x, (double)y, keys); m_oldDragX = x; m_oldDragY = y; } else if (dragging && !m_draggedShape && m_dragState == ContinueDraggingLeft) { // Continue dragging OnDragLeft(false, m_oldDragX, m_oldDragY, keys); OnDragLeft(true, (double)x, (double)y, keys); m_oldDragX = x; m_oldDragY = y; } else if (event.LeftUp() && !m_draggedShape && m_dragState == ContinueDraggingLeft) { m_dragState = NoDragging; m_checkTolerance = true; OnDragLeft(false, m_oldDragX, m_oldDragY, keys); OnEndDragLeft((double)x, (double)y, keys); m_draggedShape = NULL; } else if (dragging && !m_draggedShape && m_dragState == StartDraggingRight) { m_dragState = ContinueDraggingRight; OnBeginDragRight((double)x, (double)y, keys); m_oldDragX = x; m_oldDragY = y; } else if (dragging && !m_draggedShape && m_dragState == ContinueDraggingRight) { // Continue dragging OnDragRight(false, m_oldDragX, m_oldDragY, keys); OnDragRight(true, (double)x, (double)y, keys); m_oldDragX = x; m_oldDragY = y; } else if (event.RightUp() && !m_draggedShape && m_dragState == ContinueDraggingRight) { m_dragState = NoDragging; m_checkTolerance = true; OnDragRight(false, m_oldDragX, m_oldDragY, keys); OnEndDragRight((double)x, (double)y, keys); m_draggedShape = NULL; } // Non-dragging events else if (event.IsButton()) { m_checkTolerance = true; // Find the nearest object int attachment = 0; wxShape *nearest_object = FindShape(x, y, &attachment); if (nearest_object) // Object event { if (event.LeftDown()) { m_draggedShape = nearest_object; m_draggedAttachment = attachment; m_dragState = StartDraggingLeft; m_firstDragX = x; m_firstDragY = y; } else if (event.LeftUp()) { // N.B. Only register a click if the same object was // identified for down *and* up. if (nearest_object == m_draggedShape) nearest_object->GetEventHandler()->OnLeftClick((double)x, (double)y, keys, attachment); m_draggedShape = NULL; m_dragState = NoDragging; } else if (event.LeftDClick()) { nearest_object->GetEventHandler()->OnLeftDoubleClick((double)x, (double)y, keys, attachment); m_draggedShape = NULL; m_dragState = NoDragging; } else if (event.RightDown()) { m_draggedShape = nearest_object; m_draggedAttachment = attachment; m_dragState = StartDraggingRight; m_firstDragX = x; m_firstDragY = y; } else if (event.RightUp()) { if (nearest_object == m_draggedShape) nearest_object->GetEventHandler()->OnRightClick((double)x, (double)y, keys, attachment); m_draggedShape = NULL; m_dragState = NoDragging; } } else // Canvas event (no nearest object) { if (event.LeftDown()) { m_draggedShape = NULL; m_dragState = StartDraggingLeft; m_firstDragX = x; m_firstDragY = y; } else if (event.LeftUp()) { OnLeftClick((double)x, (double)y, keys); m_draggedShape = NULL; m_dragState = NoDragging; } else if (event.RightDown()) { m_draggedShape = NULL; m_dragState = StartDraggingRight; m_firstDragX = x; m_firstDragY = y; } else if (event.RightUp()) { OnRightClick((double)x, (double)y, keys); m_draggedShape = NULL; m_dragState = NoDragging; } } } }
void wxToolBar::OnMouseEvent( wxMouseEvent& rEvent ) { POINTL vPoint; HWND hWnd; wxCoord vX; wxCoord vY; HPOINTER hPtr = ::WinQuerySysPointer(HWND_DESKTOP, SPTR_ARROW, FALSE); ::WinSetPointer(HWND_DESKTOP, hPtr); ::WinQueryPointerPos(HWND_DESKTOP, &vPoint); hWnd = ::WinWindowFromPoint(HWND_DESKTOP, &vPoint, TRUE); if (hWnd != (HWND)GetHwnd()) { m_vToolTimer.Stop(); return; } rEvent.GetPosition(&vX, &vY); wxToolBarTool* pTool = (wxToolBarTool *)FindToolForPosition( vX ,vY ); if (rEvent.LeftDown()) { CaptureMouse(); } if (rEvent.LeftUp()) { ReleaseMouse(); } if (!pTool) { m_vToolTimer.Stop(); if (m_nCurrentTool > -1) { if (rEvent.LeftIsDown()) SpringUpButton(m_nCurrentTool); pTool = (wxToolBarTool *)FindById(m_nCurrentTool); if (pTool && !pTool->IsToggled()) { RaiseTool( pTool, FALSE ); } m_nCurrentTool = -1; OnMouseEnter(-1); } return; } if (!rEvent.IsButton()) { if (pTool->GetId() != m_nCurrentTool) { // // If the left button is kept down and moved over buttons, // press those buttons. // if (rEvent.LeftIsDown() && pTool->IsEnabled()) { SpringUpButton(m_nCurrentTool); if (pTool->CanBeToggled()) { pTool->Toggle(); } DrawTool(pTool); } wxToolBarTool* pOldTool = (wxToolBarTool*)FindById(m_nCurrentTool); if (pOldTool && !pTool->IsToggled()) RaiseTool( pOldTool, FALSE ); m_nCurrentTool = pTool->GetId(); OnMouseEnter(m_nCurrentTool); if (!pTool->GetShortHelp().empty()) { if (m_pToolTip) delete m_pToolTip; m_pToolTip = new wxToolTip(pTool->GetShortHelp()); m_vXMouse = (wxCoord)vPoint.x; m_vYMouse = (wxCoord)vPoint.y; m_vToolTimer.Start(1000L, TRUE); } if (!pTool->IsToggled()) RaiseTool(pTool); } return; } // Left button pressed. if (rEvent.LeftDown() && pTool->IsEnabled()) { if (pTool->CanBeToggled()) { pTool->Toggle(); } DrawTool(pTool); } else if (rEvent.RightDown()) { OnRightClick( pTool->GetId() ,vX ,vY ); } // // Left Button Released. Only this action confirms selection. // If the button is enabled and it is not a toggle tool and it is // in the pressed state, then raise the button and call OnLeftClick. // if (rEvent.LeftUp() && pTool->IsEnabled() ) { // // Pass the OnLeftClick event to tool // if (!OnLeftClick( pTool->GetId() ,pTool->IsToggled()) && pTool->CanBeToggled()) { // // If it was a toggle, and OnLeftClick says No Toggle allowed, // then change it back // pTool->Toggle(); } DrawTool(pTool); } } // end of wxToolBar::OnMouseEvent