From ea6aba8212e88150d89c426d3f7a492d410256b2 Mon Sep 17 00:00:00 2001 From: CHARRAS Date: Fri, 10 Aug 2007 18:05:42 +0000 Subject: [PATCH] Better Hotkey.cpp code for eeschema --- change_log.txt | 5 + common/trigo.cpp | 27 +++- eeschema/controle.cpp | 34 +---- eeschema/hotkeys.cpp | 322 +++++++++++++++++++++++++++++++++++------- include/trigo.h | 32 +---- include/wxstruct.h | 3 +- 6 files changed, 304 insertions(+), 119 deletions(-) diff --git a/change_log.txt b/change_log.txt index ba66588922..122a5268f6 100644 --- a/change_log.txt +++ b/change_log.txt @@ -4,6 +4,11 @@ Started 2007-June-11 Please add newer entries at the top, list the date and your name with email address. +2007-aug-10 UPDATE Jean-Pierre Charras +================================================================================ ++ eeschema + better hotkeys.cpp code. + 2007-Aug-08 UPDATE Dick Hollenbeck ================================================================================ diff --git a/common/trigo.cpp b/common/trigo.cpp index 8ef468a978..12251eeb07 100644 --- a/common/trigo.cpp +++ b/common/trigo.cpp @@ -5,15 +5,14 @@ /* Fichier TRIGO.CPP */ #include "fctsys.h" -#define global extern #include "trigo.h" -/*****************************/ +/************************************************************************/ bool DistanceTest( int seuil, int dx, int dy, int spot_cX, int spot_cY ) -/*****************************/ +/************************************************************************/ /* * Calcul de la distance du curseur souris a un segment de droite : @@ -291,6 +290,27 @@ void RotatePoint( int* pX, int* pY, int cx, int cy, int angle ) } +/********************************************/ +void RotatePoint( wxPoint* point, int angle ) +/********************************************/ + +/* + * Fonction surchargee! + * calcule les nouvelles coord du point point, + * pour une rotation d'angle angle ( en 1/10 degre) + */ +{ + int ox, oy; + + ox = point->x; + oy = point->y; + + RotatePoint( &ox, &oy, angle ); + point->x = ox; + point->y = oy; +} + + /*****************************************************************/ void RotatePoint( wxPoint* point, const wxPoint& centre, int angle ) /*****************************************************************/ @@ -312,6 +332,7 @@ void RotatePoint( wxPoint* point, const wxPoint& centre, int angle ) } + /*************************************************************************/ void RotatePoint( double* pX, double* pY, double cx, double cy, int angle ) /*************************************************************************/ diff --git a/eeschema/controle.cpp b/eeschema/controle.cpp index f16e2cdb0c..998b30b375 100644 --- a/eeschema/controle.cpp +++ b/eeschema/controle.cpp @@ -297,10 +297,6 @@ int hotkey = 0; m_CurrentScreen->m_O_Curseur = m_CurrentScreen->m_Curseur; break; - case '\t': // Switch to drag mode, when block moving - ((WinEDA_SchematicFrame*)this)->HandleBlockEndByPopUp(BLOCK_DRAG, DC); - break; - case WXK_NUMPAD8 : /* Deplacement curseur vers le haut */ case WXK_UP : MousePositionInPixels.y -= delta.y; @@ -325,33 +321,6 @@ int hotkey = 0; DrawPanel->MouseTo(MousePositionInPixels); break; - case WXK_INSERT: - case WXK_NUMPAD0: - if ( m_Ident == SCHEMATIC_FRAME ) - { - if ( g_ItemToRepeat && (g_ItemToRepeat->m_Flags == 0) ) - { - ((WinEDA_SchematicFrame*)this)->RepeatDrawItem(DC); - } - else wxBell(); - break; - } - if ( m_Ident == LIBEDITOR_FRAME ) - { - if ( LibItemToRepeat && (LibItemToRepeat->m_Flags == 0) && - (LibItemToRepeat->m_StructType == COMPONENT_PIN_DRAW_TYPE) ) - { - ((WinEDA_LibeditFrame*)this)->RepeatPinItem(DC, - (LibDrawPin*) LibItemToRepeat); - } - else wxBell(); - break; - } - - case 0: - case WXK_DECIMAL: - break; - default: hotkey = g_KeyPressed; break; @@ -367,8 +336,7 @@ int hotkey = 0; RedrawActiveWindow(DC, TRUE); } - if ( (oldpos.x != m_CurrentScreen->m_Curseur.x) || - (oldpos.y != m_CurrentScreen->m_Curseur.y) ) + if ( oldpos != m_CurrentScreen->m_Curseur ) { curpos = m_CurrentScreen->m_Curseur; m_CurrentScreen->m_Curseur = oldpos; diff --git a/eeschema/hotkeys.cpp b/eeschema/hotkeys.cpp index b475b606c3..7170d15a30 100644 --- a/eeschema/hotkeys.cpp +++ b/eeschema/hotkeys.cpp @@ -15,9 +15,188 @@ #include "protos.h" -/* Routines locales */ +enum hotkey_id_commnand { + HK_NOT_FOUND = 0, + HK_HELP, + HK_ZOOM_IN, + HK_ZOOM_OUT, + HK_ZOOM_REDRAW, + HK_ZOOM_CENTER, + HK_NEXT_SEARCH, + HK_DELETE, + HK_REPEAT_LAST, + HK_MOVEBLOCK_TO_DRAGBLOCK, + HK_ROTATE_COMPONENT, + HK_MIRROR_X_COMPONENT, + HK_MIRROR_Y_COMPONENT, + HK_ORIENT_NORMAL_COMPONENT, + HK_MOVE_COMPONENT, + HK_ADD_NEW_COMPONENT, + HK_BEGIN_WIRE +}; -/* variables externes */ +/* Class to handle hotkey commnands. hotkeys have a default value +This class allows (for the future..) the real key code changed by user(from a key code list file, TODO) +*/ +class Ki_HotkeyInfo +{ +public: + int m_KeyCode; // Key code (ascii value for ascii keys or wxWidgets code for function key + wxString m_InfoMsg; // info message. + hotkey_id_commnand m_Idcommand; // internal id for the corresponding command (see hotkey_id_commnand list) + +public: + Ki_HotkeyInfo(const wxChar * infomsg, hotkey_id_commnand idcommand, int keycode); +}; + +Ki_HotkeyInfo::Ki_HotkeyInfo(const wxChar * infomsg, hotkey_id_commnand idcommand, int keycode) +{ + m_KeyCode = keycode; // Key code (ascii value for ascii keys or wxWidgets code for function key + m_InfoMsg = infomsg; // info message. + m_Idcommand = idcommand; // internal id for the corresponding command (see hotkey_id_commnand list) +} + +/* local variables */ +/* Hotkey list: */ +static Ki_HotkeyInfo HkBeginWire(wxT("begin Wire"), HK_BEGIN_WIRE, 'W'); +static Ki_HotkeyInfo HkAddComponent(wxT("Add Component"), HK_ADD_NEW_COMPONENT, 'A'); +static Ki_HotkeyInfo HkMirrorYComponent(wxT("Mirror Y Component"), HK_MIRROR_Y_COMPONENT, 'Y'); +static Ki_HotkeyInfo HkMirrorXComponent(wxT("Mirror X Component"), HK_MIRROR_X_COMPONENT, 'X'); +static Ki_HotkeyInfo HkOrientNormalComponent(wxT("Orient Normal Component"), HK_ORIENT_NORMAL_COMPONENT, 'N'); +static Ki_HotkeyInfo HkRotateComponent(wxT("Rotate Component"), HK_ROTATE_COMPONENT, 'R'); +static Ki_HotkeyInfo HkMoveComponent(wxT("Move Component"), HK_MOVE_COMPONENT, 'M'); +static Ki_HotkeyInfo HkMove2Drag(wxT("Switch move block to drag block"), HK_MOVEBLOCK_TO_DRAGBLOCK, '\t'); +static Ki_HotkeyInfo HkInsert(wxT("Repeat Last Item"), HK_REPEAT_LAST, WXK_INSERT); +static Ki_HotkeyInfo HkDelete(wxT("Delete Item"), HK_DELETE, WXK_DELETE); +static Ki_HotkeyInfo HkNextSearch(wxT("Next Search"), HK_NEXT_SEARCH, WXK_F5); +static Ki_HotkeyInfo HkZoomCenter(wxT("Zoom Center"), HK_ZOOM_CENTER, WXK_F4); +static Ki_HotkeyInfo HkZoomRedraw(wxT("Zoom Redraw"), HK_ZOOM_REDRAW, WXK_F3); +static Ki_HotkeyInfo HkZoomOut(wxT("Zoom Out"), HK_ZOOM_OUT, WXK_F2); +static Ki_HotkeyInfo HkZoomIn(wxT("Zoom In"), HK_ZOOM_IN, WXK_F1); +static Ki_HotkeyInfo HkHelp(wxT("Help: this message"), HK_HELP, '?'); + +// List of hotkey descriptors for schematic +static Ki_HotkeyInfo *s_Schematic_Hotkey_List[] = { + &HkHelp, + &HkZoomIn, &HkZoomOut, &HkZoomRedraw, &HkZoomCenter, + &HkNextSearch, &HkDelete, &HkInsert, &HkMove2Drag, + &HkMoveComponent, &HkAddComponent, + &HkRotateComponent, &HkMirrorXComponent, &HkMirrorYComponent, & HkOrientNormalComponent, + &HkBeginWire, + NULL +}; + + +// Library editor: +static Ki_HotkeyInfo HkInsertPin(wxT("Repeat Pin"), HK_REPEAT_LAST, WXK_INSERT); + +// List of hotkey descriptors for libray editor +static Ki_HotkeyInfo *s_LibEdit_Hotkey_List[] = +{ + &HkHelp, + &HkZoomIn, &HkZoomOut, &HkZoomRedraw, &HkZoomCenter, + &HkInsertPin, + NULL +}; + + +/****************************************************/ +static wxString ReturnKeyNameFromKeyCode(int keycode) +/****************************************************/ +/* + * return the key name from the key code + * Only some wxWidgets key values are handled for function key + * @param key = key code (ascii value, or wxWidgets value for function keys) + * @return the key name wxString +*/ +{ +wxString keyname, modifier, fullkeyname; + + if ( keycode & GR_KB_CTRL) modifier << wxT("Ctrl "); + if ( keycode & GR_KB_ALT) modifier << wxT("Alt "); + if ( keycode & GR_KB_SHIFT) modifier << wxT("Shift "); + keycode &= ~(GR_KB_CTRL|GR_KB_ALT|GR_KB_SHIFT); + + switch ( keycode ) + { + default: + keyname.Printf(wxT("%c"), keycode); + break; + + case WXK_F1: + case WXK_F2: + case WXK_F3: + case WXK_F4: + case WXK_F5: + case WXK_F6: + case WXK_F7: + case WXK_F8: + case WXK_F9: + case WXK_F10: + case WXK_F11: + case WXK_F12: + keyname.Printf(wxT("F%d"), keycode - WXK_F1 + 1); + break; + + case '\t': + keyname = wxT("Tab"); + break; + + case WXK_DELETE: + keyname = wxT("Delete"); + break; + + case WXK_INSERT: + keyname = wxT("Insert"); + break; + } + + fullkeyname = modifier + keyname; + return keyname; +} + +/****************************************************************************/ +static void DisplayHotkeyList(WinEDA_DrawFrame * frame, Ki_HotkeyInfo ** List) +/*****************************************************************************/ +/* + * Displays the current hotkey list + * @param frame = current open frame + * @param List = pointer to a Ki_HotkeyInfo list of commands + * @return none +*/ +{ +wxString keyname; + + wxString msg = _("Current hotkey list:\n\n"); + for ( ; * List != NULL; List++ ) + { + Ki_HotkeyInfo * hk_decr = * List; + if ( hk_decr->m_InfoMsg.IsEmpty() ) break; + msg += _("key "); + keyname = ReturnKeyNameFromKeyCode(hk_decr->m_KeyCode); + msg += keyname + wxT(": ") + hk_decr->m_InfoMsg + wxT("\n"); + } + DisplayInfo(frame, msg); +} + +/******************************************************************/ +static int GetCommandCodeFromHotkey(int key, Ki_HotkeyInfo ** List) +/******************************************************************/ +/* + * Return an id identifier fron a key code for OnHotKey() function + * @param key = key code (ascii value, or wxWidgets value for function keys + * @param List = pointer to a Ki_HotkeyInfo list of commands + * @return the corresponding function identifier from the Ki_HotkeyInfo List +*/ +{ + for ( ; * List != NULL; List++ ) + { + Ki_HotkeyInfo * hk_decr = * List; + if ( hk_decr->m_KeyCode == key ) return hk_decr->m_Idcommand; + } + + return HK_NOT_FOUND; +} /***********************************************************/ void WinEDA_SchematicFrame::OnHotKey(wxDC * DC, int hotkey, @@ -27,27 +206,7 @@ void WinEDA_SchematicFrame::OnHotKey(wxDC * DC, int hotkey, Commands are case insensitive Zoom commands are not managed here */ -/* Hotkey list: */ { -static wxString s_Hotkey_List[] = -{ - wxT("key F1: Zoom in"), // general zoom hotkey, not managed here - wxT("key F2: Zoom out"), // general zoom hotkey, not managed here - wxT("key F5: Zoom Redraw"), // general zoom hotkey, not managed here - wxT("key F4: Zoom Center"), // general zoom hotkey, not managed here - wxT("key F5: Next search"), - wxT("key DELETE: delete item"), - wxT("key R: Rotation (component or label)"), - wxT("key X: Mirror X (component)"), - wxT("key Y: Mirror Y (component)"), - wxT("key N: Orient 0 (component)"), - wxT("key M: Start Move component"), - wxT("key A: Add new component"), - wxT("key W: begin new Wire"), - wxT("") // End of list, do not change -}; - - bool PopupOn = m_CurrentScreen->m_CurrentItem && m_CurrentScreen->m_CurrentItem->m_Flags; bool RefreshToolBar = FALSE; // We must refresh tool bar when the undo/redo tool state is modified @@ -56,22 +215,32 @@ bool RefreshToolBar = FALSE; // We must refresh tool bar when the undo/redo tool wxPoint MousePos = m_CurrentScreen->m_MousePosition; - switch (hotkey) + /* Convert lower to upper case (the usual toupper function has problem with non ascii codes like function keys */ + if( (hotkey >= 'a') && (hotkey <= 'z') ) hotkey += 'A' - 'a'; + + // Search commnd from key : + switch ( GetCommandCodeFromHotkey(hotkey, s_Schematic_Hotkey_List) ) { - case '?': // Display Current hotkey list - { - wxString msg = _("Current hotkey list:\n\n"); - for ( unsigned int ii = 0; ; ii++ ) - { - if ( s_Hotkey_List[ii].IsEmpty() ) break; - msg += s_Hotkey_List[ii]; msg += wxT("\n"); - } - DisplayInfo(this, msg); + default: + case HK_NOT_FOUND: + return; + break; + + case HK_HELP: // Display Current hotkey list + DisplayHotkeyList(this, s_Schematic_Hotkey_List); break; - } - case WXK_DELETE: - case WXK_NUMPAD_DELETE: + case HK_ZOOM_IN: + case HK_ZOOM_OUT: + case HK_ZOOM_REDRAW: + case HK_ZOOM_CENTER: + break; + + case HK_MOVEBLOCK_TO_DRAGBLOCK: // Switch to drag mode, when block moving + HandleBlockEndByPopUp(BLOCK_DRAG, DC); + break; + + case HK_DELETE: if ( PopupOn ) break; RefreshToolBar = LocateAndDeleteItem(this, DC); m_CurrentScreen->SetModify(); @@ -79,21 +248,27 @@ wxPoint MousePos = m_CurrentScreen->m_MousePosition; TestDanglingEnds(m_CurrentScreen->EEDrawList, DC); break; - case WXK_F5 : + case HK_REPEAT_LAST: + if ( g_ItemToRepeat && (g_ItemToRepeat->m_Flags == 0) ) + { + RepeatDrawItem(DC); + } + else wxBell(); + break; + + case HK_NEXT_SEARCH : if ( g_LastSearchIsMarker ) WinEDA_SchematicFrame::FindMarker(1); else FindSchematicItem(wxEmptyString, 2); break; - case 'a': - case 'A': // Add component + case HK_ADD_NEW_COMPONENT: // Add component if ( DrawStruct && DrawStruct->m_Flags ) break; // switch to m_ID_current_state = ID_COMPONENT_BUTT; if ( m_ID_current_state != ID_COMPONENT_BUTT ) SetToolID( ID_COMPONENT_BUTT, wxCURSOR_PENCIL, _("Add Component")); OnLeftClick(DC, MousePos); break; - case 'w': - case 'W': // Add wire + case HK_BEGIN_WIRE: // Add wire if ( DrawStruct ) // An item is selected. If edited and not a wire, a new command is not possible { if ( DrawStruct->m_Flags ) // Item selected and edition in progress @@ -111,8 +286,7 @@ wxPoint MousePos = m_CurrentScreen->m_MousePosition; OnLeftClick(DC, MousePos); break; - case 'r': // Rotation - case 'R': + case HK_ROTATE_COMPONENT: // Component Rotation if ( DrawStruct == NULL ) { DrawStruct = PickStruct( GetScreen()->m_Curseur, @@ -148,8 +322,7 @@ wxPoint MousePos = m_CurrentScreen->m_MousePosition; } break; - case 'y': // Mirror Y (drawlibpart) - case 'Y': + case HK_MIRROR_Y_COMPONENT: // Mirror Y (Component) if ( DrawStruct == NULL ) DrawStruct = LocateSmallestComponent( GetScreen() ); if ( DrawStruct ) @@ -164,8 +337,7 @@ wxPoint MousePos = m_CurrentScreen->m_MousePosition; } break; - case 'x': // Mirror X (drawlibpart) - case 'X': + case HK_MIRROR_X_COMPONENT: // Mirror X (Component) if ( DrawStruct == NULL ) DrawStruct = LocateSmallestComponent( GetScreen() ); if ( DrawStruct ) @@ -180,8 +352,7 @@ wxPoint MousePos = m_CurrentScreen->m_MousePosition; } break; - case 'n': - case 'N': // Orient 0, no mirror (drawlibpart) + case HK_ORIENT_NORMAL_COMPONENT: // Orient 0, no mirror (Component) if ( DrawStruct == NULL ) DrawStruct = LocateSmallestComponent( GetScreen() ); if ( DrawStruct ) @@ -197,8 +368,7 @@ wxPoint MousePos = m_CurrentScreen->m_MousePosition; } break; - case 'm': - case 'M': // Start move drawlibpart + case HK_MOVE_COMPONENT: // Start move Component if ( PopupOn ) break; if ( DrawStruct == NULL ) DrawStruct = LocateSmallestComponent( GetScreen() ); @@ -212,3 +382,55 @@ wxPoint MousePos = m_CurrentScreen->m_MousePosition; if ( RefreshToolBar ) SetToolbars(); } + + +/***********************************************************/ +void WinEDA_LibeditFrame::OnHotKey(wxDC * DC, int hotkey, + EDA_BaseStruct * DrawStruct) +/***********************************************************/ +/* Hot keys for the component editot. Some commands are relatives to the item under the mouse cursor + Commands are case insensitive + Zoom commands are not managed here +*/ +{ +bool PopupOn = m_CurrentScreen->m_CurrentItem && + m_CurrentScreen->m_CurrentItem->m_Flags; + +bool RefreshToolBar = FALSE; // We must refresh tool bar when the undo/redo tool state is modified + + if ( hotkey == 0 ) return; + +wxPoint MousePos = m_CurrentScreen->m_MousePosition; + + /* Convert lower to upper case (the usual toupper function has problem with non ascii codes like function keys */ + if( (hotkey >= 'a') && (hotkey <= 'z') ) hotkey += 'A' - 'a'; + switch ( GetCommandCodeFromHotkey(hotkey, s_LibEdit_Hotkey_List) ) + { + default: + case HK_NOT_FOUND: + return; + break; + + case HK_HELP: // Display Current hotkey list + DisplayHotkeyList(this, s_LibEdit_Hotkey_List); + break; + + case HK_ZOOM_IN: + case HK_ZOOM_OUT: + case HK_ZOOM_REDRAW: + case HK_ZOOM_CENTER: + break; + + case HK_REPEAT_LAST: + if ( LibItemToRepeat && (LibItemToRepeat->m_Flags == 0) && + (LibItemToRepeat->m_StructType == COMPONENT_PIN_DRAW_TYPE) ) + { + RepeatPinItem(DC, (LibDrawPin*) LibItemToRepeat); + } + else wxBell(); + break; + } + + if ( RefreshToolBar ) SetToolbars(); +} + diff --git a/include/trigo.h b/include/trigo.h index c55ec32bce..f8373398d0 100644 --- a/include/trigo.h +++ b/include/trigo.h @@ -10,6 +10,7 @@ /* Prototype des fonctions de trigo.cpp */ void RotatePoint(int *pX, int *pY, int angle); void RotatePoint(int *pX, int *pY, int cx, int cy, int angle); +void RotatePoint(wxPoint* point, int angle ); void RotatePoint(wxPoint *point, const wxPoint & centre, int angle); void RotatePoint(double *pX, double *pY, int angle); void RotatePoint(double *pX, double *pY, double cx, double cy, int angle); @@ -22,37 +23,6 @@ int ArcTangente(int dy, int dx); bool DistanceTest( int seuil, int dx, int dy, int spot_cX, int spot_cY ); - - /*************************************************/ - /* Table lookup de 1/COS(X) en fonction de tg(X) */ - /*************************************************/ -eda_global float invcostab[17] -#if defined MAIN - = { 1.0, 1/0.998, 1/0.9923, 1/0.9829, 1/0.97014, 1/0.9545, - 1/0.93633, 1/0.91615, 1/0.8944, 1/0.8715, 1/0.848, 1/0.82404, - 1/0.8, 1/0.7761, 1/0.75257, 1/0.7295, 1/0.707 } -#endif -; - /***************************************************/ - /* Table lookup de 256*COS(X) en fonction de tg(X) */ - /***************************************************/ -eda_global long costab[17] -#if defined MAIN - = { 256, 255, 253, 251, 248, 244, 240, 234, 229, - 223, 217, 211, 205, 198, 192, 187, 181 } -#endif -; - /***************************************************/ - /* Table lookup de 256*SIN(X) en fonction de tg(X) */ - /***************************************************/ -eda_global long sintab[17] -#if defined MAIN - = { 0, 16, 32, 47, 62, 76, 90, 103, 114, - 125, 136, 145, 154, 161, 168, 175, 181 } -#endif -; - - /*******************/ /* Macro NEW_COORD */ /*******************/ diff --git a/include/wxstruct.h b/include/wxstruct.h index 7b66341461..d0d6c042ce 100644 --- a/include/wxstruct.h +++ b/include/wxstruct.h @@ -1120,9 +1120,8 @@ public: int BestZoom( void ); // Retourne le meilleur zoom void SetToolbars( void ); void OnLeftDClick( wxDC* DC, const wxPoint& MousePos ); - SCH_SCREEN* GetScreen( void ) { return (SCH_SCREEN*) m_CurrentScreen; } - + void OnHotKey( wxDC* DC, int hotkey, EDA_BaseStruct* DrawStruct ); private: