* build menu.customize: ctrl + c / ctrl + insert = copy, ctrl + v / shift + insert = paste build presets and command lines

This commit is contained in:
Garux 2019-10-09 15:05:13 +03:00
parent 4809f1a27a
commit e849c95216
3 changed files with 52 additions and 4 deletions

View File

@ -115,6 +115,10 @@ Accelerator accelerator_for_event_key( guint keyval, guint state ){
return Accelerator( keyval, (GdkModifierType)( state & gtk_accelerator_get_default_mod_mask() ) ); return Accelerator( keyval, (GdkModifierType)( state & gtk_accelerator_get_default_mod_mask() ) );
} }
Accelerator accelerator_for_event_key( const GdkEventKey* event ){
return accelerator_for_event_key( event->keyval, event->state );
}
bool AcceleratorMap_activate( const AcceleratorMap& acceleratorMap, const Accelerator& accelerator ){ bool AcceleratorMap_activate( const AcceleratorMap& acceleratorMap, const Accelerator& accelerator ){
AcceleratorMap::const_iterator i = acceleratorMap.find( accelerator ); AcceleratorMap::const_iterator i = acceleratorMap.find( accelerator );
if ( i != acceleratorMap.end() ) { if ( i != acceleratorMap.end() ) {

View File

@ -69,6 +69,10 @@ inline Accelerator accelerator_null(){
return Accelerator( 0, (GdkModifierType)0 ); return Accelerator( 0, (GdkModifierType)0 );
} }
typedef struct _GdkEventKey GdkEventKey;
Accelerator accelerator_for_event_key( const GdkEventKey* event );
const char* global_keys_find( unsigned int key ); const char* global_keys_find( unsigned int key );
unsigned int global_keys_find( const char* name ); unsigned int global_keys_find( const char* name );

View File

@ -649,6 +649,7 @@ void build_commands_write( const char* filename ){
#include "gtkutil/dialog.h" #include "gtkutil/dialog.h"
#include "gtkutil/closure.h" #include "gtkutil/closure.h"
#include "gtkutil/window.h" #include "gtkutil/window.h"
#include "gtkutil/accelerator.h"
#include "gtkdlgs.h" #include "gtkdlgs.h"
void Build_refreshMenu( GtkMenu* menu ); void Build_refreshMenu( GtkMenu* menu );
@ -727,10 +728,26 @@ gboolean project_cell_edited( GtkCellRendererText* cell, gchar* path_string, gch
return FALSE; return FALSE;
} }
BuildPair g_buildpair_copied;
BuildCommand g_buildcommand_copied;
inline bool event_is_del( const GdkEventKey* event ){
return accelerator_for_event_key( event ) == Accelerator( GDK_Delete );
}
inline bool event_is_copy( const GdkEventKey* event ){
return ( accelerator_for_event_key( event ) == Accelerator( 'C', GDK_CONTROL_MASK ) )
|| ( accelerator_for_event_key( event ) == Accelerator( GDK_Insert, GDK_CONTROL_MASK ) );
}
inline bool event_is_paste( const GdkEventKey* event ){
return ( accelerator_for_event_key( event ) == Accelerator( 'V', GDK_CONTROL_MASK ) )
|| ( accelerator_for_event_key( event ) == Accelerator( GDK_Insert, GDK_SHIFT_MASK ) );
}
gboolean project_key_press( GtkWidget* widget, GdkEventKey* event, ProjectList* projectList ){ gboolean project_key_press( GtkWidget* widget, GdkEventKey* event, ProjectList* projectList ){
Project& project = projectList->m_project; Project& project = projectList->m_project;
if ( event->keyval == GDK_Delete ) { if ( event_is_del( event ) || event_is_copy( event ) || event_is_paste( event ) ) {
GtkTreeSelection* selection = gtk_tree_view_get_selection( GTK_TREE_VIEW( widget ) ); GtkTreeSelection* selection = gtk_tree_view_get_selection( GTK_TREE_VIEW( widget ) );
GtkTreeIter iter; GtkTreeIter iter;
GtkTreeModel* model; GtkTreeModel* model;
@ -739,13 +756,25 @@ gboolean project_key_press( GtkWidget* widget, GdkEventKey* event, ProjectList*
Project::iterator x = Project_find( project, gtk_tree_path_get_indices( path )[0] ); Project::iterator x = Project_find( project, gtk_tree_path_get_indices( path )[0] );
gtk_tree_path_free( path ); gtk_tree_path_free( path );
if ( x != project.end() ) { if ( event_is_del( event ) && x != project.end() ) {
projectList->m_changed = true; projectList->m_changed = true;
project.erase( x ); project.erase( x );
Build_refreshMenu( g_bsp_menu ); Build_refreshMenu( g_bsp_menu );
gtk_list_store_remove( projectList->m_store, &iter ); gtk_list_store_remove( projectList->m_store, &iter );
} }
else if ( event_is_copy( event ) && x != project.end() ) {
g_buildpair_copied = ( *x );
}
else if ( event_is_paste( event ) && string_not_empty( g_buildpair_copied.first.c_str() ) ) {
projectList->m_changed = true;
project.insert( x, g_buildpair_copied );
Build_refreshMenu( g_bsp_menu );
GtkTreeIter newIter;
gtk_list_store_insert_before( projectList->m_store, &newIter, &iter );
gtk_list_store_set( projectList->m_store, &newIter, 0, g_buildpair_copied.first.c_str(), -1 );
}
} }
} }
return FALSE; return FALSE;
@ -833,7 +862,7 @@ gboolean commands_key_press( GtkWidget* widget, GdkEventKey* event, GtkListStore
} }
Build& build = *g_current_build; Build& build = *g_current_build;
if ( event->keyval == GDK_Delete ) { if ( event_is_del( event ) || event_is_copy( event ) || event_is_paste( event ) ) {
GtkTreeSelection* selection = gtk_tree_view_get_selection( GTK_TREE_VIEW( widget ) ); GtkTreeSelection* selection = gtk_tree_view_get_selection( GTK_TREE_VIEW( widget ) );
GtkTreeIter iter; GtkTreeIter iter;
GtkTreeModel* model; GtkTreeModel* model;
@ -842,12 +871,23 @@ gboolean commands_key_press( GtkWidget* widget, GdkEventKey* event, GtkListStore
Build::iterator i = Build_find( build, gtk_tree_path_get_indices( path )[0] ); Build::iterator i = Build_find( build, gtk_tree_path_get_indices( path )[0] );
gtk_tree_path_free( path ); gtk_tree_path_free( path );
if ( i != build.end() ) { if ( event_is_del( event ) && i != build.end() ) {
g_build_changed = true; g_build_changed = true;
build.erase( i ); build.erase( i );
gtk_list_store_remove( store, &iter ); gtk_list_store_remove( store, &iter );
} }
else if ( event_is_copy( event ) && i != build.end() ) {
g_buildcommand_copied = ( *i );
}
else if ( event_is_paste( event ) ) {
g_build_changed = true;
build.insert( i, g_buildcommand_copied );
GtkTreeIter newIter;
gtk_list_store_insert_before( store, &newIter, &iter );
gtk_list_store_set( store, &newIter, 0, g_buildcommand_copied.c_str(), -1 );
}
} }
} }
return FALSE; return FALSE;