X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=radiant%2Fgtkdlgs.cpp;h=9b6eb2d816ae638c622112282300cf74dec218ae;hb=b697f9ada5c6ef01411552d9ddbd2e47ecb243a3;hp=817cdbf309f896e50726d0e1f55fe77d17c776f8;hpb=1c26c420f1b5dabd39b492ab017447172ef5a6c8;p=xonotic%2Fnetradiant.git diff --git a/radiant/gtkdlgs.cpp b/radiant/gtkdlgs.cpp index 817cdbf3..9b6eb2d8 100644 --- a/radiant/gtkdlgs.cpp +++ b/radiant/gtkdlgs.cpp @@ -40,7 +40,6 @@ #include #include "debugging/debugging.h" -#include "version.h" #include "aboutmsg.h" #include "igl.h" @@ -70,6 +69,9 @@ #include "url.h" #include "cmdlib.h" +#include "qerplugin.h" +#include "os/file.h" + // ============================================================================= @@ -334,7 +336,7 @@ void ProjectSettingsDialog_ok( ProjectSettingsDialog& dialog ){ } void DoProjectSettings(){ - if ( ConfirmModified( "Edit Project Settings" ) ) { + //if ( ConfirmModified( "Edit Project Settings" ) ) { ModalDialog modal; ProjectSettingsDialog dialog; @@ -345,7 +347,7 @@ void DoProjectSettings(){ } window.destroy(); - } + //} } // ============================================================================= @@ -421,6 +423,19 @@ void about_button_issues( ui::Widget widget, gpointer data ){ OpenURL( cred.c_str() ); } +static void AddParagraph( ui::VBox vbox, const char* text, bool use_markup ){ + auto label = ui::Label( text ); + gtk_label_set_use_markup( GTK_LABEL( label ), use_markup ); + gtk_misc_set_alignment( GTK_MISC( label ), 0, 0 ); + gtk_label_set_justify( label, GTK_JUSTIFY_LEFT ); + label.show(); + vbox.pack_start( label, TRUE, TRUE, 0 ); +} + +static void AddParagraph( ui::VBox vbox, const char* text ){ + AddParagraph( vbox, text, false ); +} + void DoAbout(){ ModalDialog dialog; ModalDialogButton ok_button( dialog, eIDOK ); @@ -433,11 +448,11 @@ void DoAbout(){ { auto hbox = create_dialog_hbox( 4 ); - vbox.pack_start( hbox, FALSE, TRUE, 0 ); + vbox.pack_start( hbox, FALSE, FALSE, 0 ); { auto vbox2 = create_dialog_vbox( 4 ); - hbox.pack_start( vbox2, TRUE, FALSE, 0 ); + hbox.pack_start( vbox2, FALSE, FALSE, 5 ); { auto frame = create_dialog_frame( 0, ui::Shadow::IN ); vbox2.pack_start( frame, FALSE, FALSE, 0 ); @@ -450,29 +465,44 @@ void DoAbout(){ } { - char const *label_text = RADIANT_NAME " " RADIANT_VERSION_STRING "\n" - __DATE__ "\n\n" - RADIANT_ABOUTMSG "\n\n" - "This program is free software\n" - "licensed under the GNU GPL.\n\n" - RADIANT_NAME " is unsupported, however\n" - "you may report your problems at\n" - "https://gitlab.com/xonotic/netradiant/issues"; - - auto label = ui::Label( label_text ); - - label.show(); - hbox.pack_start( label, FALSE, FALSE, 0 ); - gtk_misc_set_alignment( GTK_MISC( label ), 1, 0.5 ); - gtk_label_set_justify( label, GTK_JUSTIFY_LEFT ); + // HACK: that may not be related to font size + auto about_vbox = ui::VBox( FALSE, 5 ); + about_vbox.show(); + hbox.pack_start( about_vbox, FALSE, FALSE, 0 ); + + AddParagraph( about_vbox, + RADIANT_NAME " " RADIANT_VERSION_STRING " (" __DATE__ ")\n" + RADIANT_ABOUTMSG ); + AddParagraph( about_vbox, + "Get news and latest build at " + "" + "netradiant.gitlab.io" + "\n" + "Please report your issues at " + "" + "gitlab.com/xonotic/netradiant/issues" + "\n" + "The team cannot provide support for custom builds.", true ); + AddParagraph( about_vbox, + RADIANT_NAME " is a community project maintained by " + "" + "Xonotic" + "\n" + "and developed with help from " + "" + "other game projects" + " and individuals. ", true ); + AddParagraph( about_vbox, + "This program is free software licensed under the GNU GPL." ); } { auto vbox2 = create_dialog_vbox( 4 ); - hbox.pack_start( vbox2, FALSE, TRUE, 0 ); + hbox.pack_start( vbox2, TRUE, TRUE, 0 ); { auto button = create_modal_dialog_button( "OK", ok_button ); vbox2.pack_start( button, FALSE, FALSE, 0 ); + gtk_widget_grab_focus( GTK_WIDGET( button ) ); } { auto button = create_dialog_button( "Credits", G_CALLBACK( about_button_credits ), 0 ); @@ -637,13 +667,13 @@ EMessageBoxReturn DoTextureLayout( float *fx, float *fy ){ } } } - + // Initialize with last used values char buf[16]; - + sprintf( buf, "%f", last_used_texture_layout_scale_x ); x.text( buf ); - + sprintf( buf, "%f", last_used_texture_layout_scale_y ); y.text( buf ); @@ -654,7 +684,7 @@ EMessageBoxReturn DoTextureLayout( float *fx, float *fy ){ if ( ret == eIDOK ) { *fx = static_cast( atof( gtk_entry_get_text( x ) ) ); *fy = static_cast( atof( gtk_entry_get_text( y ) ) ); - + // Remember last used values last_used_texture_layout_scale_x = *fx; last_used_texture_layout_scale_y = *fy; @@ -671,12 +701,13 @@ EMessageBoxReturn DoTextureLayout( float *fx, float *fy ){ // master window widget static ui::Window text_editor{ui::null}; static ui::Widget text_widget{ui::null}; // slave, text widget from the gtk editor +static GtkTextBuffer* text_buffer_; static gint editor_delete( ui::Widget widget, gpointer data ){ - if ( ui::alert( widget.window(), "Close the shader editor ?", "Radiant", ui::alert_type::YESNO, ui::alert_icon::Question ) == ui::alert_response::NO ) { +/* if ( ui::alert( widget.window(), "Close the shader editor ?", "Radiant", ui::alert_type::YESNO, ui::alert_icon::Question ) == ui::alert_response::NO ) { return TRUE; } - +*/ text_editor.hide(); return TRUE; @@ -684,23 +715,33 @@ static gint editor_delete( ui::Widget widget, gpointer data ){ static void editor_save( ui::Widget widget, gpointer data ){ FILE *f = fopen( (char*)g_object_get_data( G_OBJECT( data ), "filename" ), "w" ); - gpointer text = g_object_get_data( G_OBJECT( data ), "text" ); + //gpointer text = g_object_get_data( G_OBJECT( data ), "text" ); if ( f == 0 ) { ui::alert( ui::Widget::from(data).window(), "Error saving file !" ); return; } - char *str = gtk_editable_get_chars( GTK_EDITABLE( text ), 0, -1 ); + /* Obtain iters for the start and end of points of the buffer */ + GtkTextIter start; + GtkTextIter end; + gtk_text_buffer_get_start_iter (text_buffer_, &start); + gtk_text_buffer_get_end_iter (text_buffer_, &end); + + /* Get the entire buffer text. */ + char *str = gtk_text_buffer_get_text (text_buffer_, &start, &end, FALSE); + + //char *str = gtk_editable_get_chars( GTK_EDITABLE( text ), 0, -1 ); fwrite( str, 1, strlen( str ), f ); fclose( f ); + g_free (str); } static void editor_close( ui::Widget widget, gpointer data ){ - if ( ui::alert( text_editor.window(), "Close the shader editor ?", "Radiant", ui::alert_type::YESNO, ui::alert_icon::Question ) == ui::alert_response::NO ) { +/* if ( ui::alert( text_editor.window(), "Close the shader editor ?", "Radiant", ui::alert_type::YESNO, ui::alert_icon::Question ) == ui::alert_response::NO ) { return; } - +*/ text_editor.hide(); } @@ -709,7 +750,7 @@ static void CreateGtkTextEditor(){ dlg.connect( "delete_event", G_CALLBACK( editor_delete ), 0 ); - gtk_window_set_default_size( dlg, 600, 300 ); + gtk_window_set_default_size( dlg, 400, 300 ); auto vbox = ui::VBox( FALSE, 5 ); vbox.show(); @@ -750,7 +791,7 @@ static void CreateGtkTextEditor(){ text_widget = text; } -static void DoGtkTextEditor( const char* filename, guint cursorpos ){ +static void DoGtkTextEditor( const char* filename, guint cursorpos, int length ){ if ( !text_editor ) { CreateGtkTextEditor(); // build it the first time we need it @@ -775,7 +816,7 @@ static void DoGtkTextEditor( const char* filename, guint cursorpos ){ gtk_window_set_title( text_editor, filename ); auto text_buffer = gtk_text_view_get_buffer(ui::TextView::from(text_widget)); - gtk_text_buffer_set_text( text_buffer, (char*)buf, len ); + gtk_text_buffer_set_text( text_buffer, (char*)buf, length ); old_filename = g_object_get_data( G_OBJECT( text_editor ), "filename" ); if ( old_filename ) { @@ -799,12 +840,14 @@ static void DoGtkTextEditor( const char* filename, guint cursorpos ){ // character offset, not byte offset gtk_text_buffer_get_iter_at_offset( text_buffer, &text_iter, cursorpos ); gtk_text_buffer_place_cursor( text_buffer, &text_iter ); + gtk_text_view_scroll_to_iter( GTK_TEXT_VIEW( text_widget ), &text_iter, 0, TRUE, 0, 0); } #if GDEF_OS_WINDOWS gtk_widget_queue_draw( text_widget ); #endif + text_buffer_ = text_buffer; free( buf ); fclose( f ); } @@ -998,18 +1041,55 @@ EMessageBoxReturn DoShaderInfoDlg( const char* name, const char* filename, const #if GDEF_OS_WINDOWS // use the file associations to open files instead of builtin Gtk editor -bool g_TextEditor_useWin32Editor = true; +bool g_TextEditor_useWin32Editor = false; #else // custom shader editor bool g_TextEditor_useCustomEditor = false; CopiedString g_TextEditor_editorCommand( "" ); #endif -void DoTextEditor( const char* filename, int cursorpos ){ +void DoTextEditor( const char* filename, int cursorpos, int length ){ #if GDEF_OS_WINDOWS if ( g_TextEditor_useWin32Editor ) { - globalOutputStream() << "opening file '" << filename << "' (line " << cursorpos << " info ignored)\n"; - ShellExecute( (HWND)GDK_WINDOW_HWND( gtk_widget_get_window( MainFrame_getWindow() ) ), "open", filename, 0, 0, SW_SHOW ); + StringOutputStream path( 256 ); + StringOutputStream modpath( 256 ); + const char* gamename = GlobalRadiant().getGameName(); + const char* basegame = GlobalRadiant().getRequiredGameDescriptionKeyValue( "basegame" ); + const char* enginePath = GlobalRadiant().getEnginePath(); + path << enginePath << basegame << '/' << filename; + modpath << enginePath << gamename << '/' << filename; + if ( file_exists( modpath.c_str() ) ){ + globalOutputStream() << "opening file '" << modpath.c_str() << "' (line " << cursorpos << " info ignored)\n"; + ShellExecute( (HWND)GDK_WINDOW_HWND( gtk_widget_get_window( MainFrame_getWindow() ) ), "open", modpath.c_str(), 0, 0, SW_SHOW ); + } + else if ( file_exists( path.c_str() ) ){ + globalOutputStream() << "opening file '" << path.c_str() << "' (line " << cursorpos << " info ignored)\n"; + ShellExecute( (HWND)GDK_WINDOW_HWND( gtk_widget_get_window( MainFrame_getWindow() ) ), "open", path.c_str(), 0, 0, SW_SHOW ); + } + else{ + globalOutputStream() << "Failed to open '" << filename << "\n"; + } + return; + } + else{ + StringOutputStream path( 256 ); + StringOutputStream modpath( 256 ); + const char* gamename = GlobalRadiant().getGameName(); + const char* basegame = GlobalRadiant().getRequiredGameDescriptionKeyValue( "basegame" ); + const char* enginePath = GlobalRadiant().getEnginePath(); + path << enginePath << basegame << '/' << filename; + modpath << enginePath << gamename << '/' << filename; + if ( file_exists( modpath.c_str() ) ){ + globalOutputStream() << "opening file '" << modpath.c_str() << "' (line " << cursorpos << " info ignored)\n"; + DoGtkTextEditor( modpath.c_str(), cursorpos, length ); + } + else if ( file_exists( path.c_str() ) ){ + globalOutputStream() << "opening file '" << path.c_str() << "' (line " << cursorpos << " info ignored)\n"; + DoGtkTextEditor( path.c_str(), cursorpos, length ); + } + else{ + globalOutputStream() << "Failed to open '" << filename << "\n"; + } return; } #else @@ -1029,7 +1109,7 @@ void DoTextEditor( const char* filename, int cursorpos ){ return; } } -#endif - DoGtkTextEditor( filename, cursorpos ); + DoGtkTextEditor( filename, cursorpos, length ); +#endif }