#include "picointernal.h"
/* mdc model format */
-#define MDC_MAGIC "IDPC"
-#define MDC_VERSION 2
+const char *MDC_MAGIC = "IDPC";
+const int MDC_VERSION = 2;
/* mdc vertex scale */
-#define MDC_SCALE ( 1.0f / 64.0f )
-#define MDC_MAX_OFS 127.0f
-#define MDC_DIST_SCALE 0.05f
+const float MDC_SCALE = ( 1.0f / 64.0f );
+const float MDC_MAX_OFS = 127.0f;
+const float MDC_DIST_SCALE = 0.05f;
/* mdc decoding normal table */
- double mdcNormals[ 256 ][ 3 ] =
+ const double mdcNormals[ 256 ][ 3 ] =
{
{ 1.000000, 0.000000, 0.000000 },
{ 0.980785, 0.195090, 0.000000 },
}
- #define RETURN_FALSE_IF_FAIL(expression) do { if (!(expression)) return false; } while (0)
-//#define RETURN_FALSE_IF_FAIL( expression ) if ( !expression ) {return false; }else
+ #define RETURN_FALSE_IF_FAIL( expression ) do{ if ( !expression ) {return false; } }while( 0 )
inline void Tokeniser_unexpectedError( Tokeniser& tokeniser, const char* token, const char* expected ){
globalErrorStream() << Unsigned( tokeniser.getLine() ) << ":" << Unsigned( tokeniser.getColumn() ) << ": parse error at '" << ( token != 0 ? token : "#EOF" ) << "': expected '" << expected << "'\n";
#include "model.h"
- #define MD5_RETURN_FALSE_IF_FAIL(expression) do { if (!(expression)) { globalErrorStream() << "md5 parse failed: " #expression "\n"; return false; } } while (0)
-//#define MD5_RETURN_FALSE_IF_FAIL( expression ) if ( !( expression ) ) { globalErrorStream() << "md5 parse failed: " # expression "\n"; return false; } else
+ #define MD5_RETURN_FALSE_IF_FAIL( expression ) do{ if ( !( expression ) ) { globalErrorStream() << "md5 parse failed: " # expression "\n"; return false; } }while( 0 )
bool MD5_parseToken( Tokeniser& tokeniser, const char* string ){
const char* token = tokeniser.getToken();
}
-gboolean selection_button_press( GtkWidget* widget, GdkEventButton* event, WindowObserver* observer ){
+gboolean selection_button_press( ui::Widget widget, GdkEventButton* event, WindowObserver* observer ){
if ( event->type == GDK_BUTTON_PRESS ) {
+ gtk_widget_grab_focus( widget );
observer->onMouseDown( WindowVector_forDouble( event->x, event->y ), button_for_button( event->button ), modifiers_for_state( event->state ) );
}
return FALSE;
return FALSE;
}
-gboolean wheelmove_scroll( GtkWidget* widget, GdkEventScroll* event, CamWnd* camwnd ){
+gboolean wheelmove_scroll( ui::Widget widget, GdkEventScroll* event, CamWnd* camwnd ){
+ //gtk_window_set_focus( camwnd->m_parent, camwnd->m_gl_widget );
+ gtk_widget_grab_focus( camwnd->m_gl_widget );
+ if( !gtk_window_is_active( camwnd->m_parent ) )
+ gtk_window_present( camwnd->m_parent );
+
if ( event->direction == GDK_SCROLL_UP ) {
Camera_Freemove_updateAxes( camwnd->getCamera() );
if( camwnd->m_bFreeMove || !g_camwindow_globals.m_bZoomInToPointer ){
globalErrorStream() << message;
}
- #define PARSE_RETURN_FALSE_IF_FAIL(expression) do { if (!( expression)) { printParseError(FILE_LINE "\nparse failed: " #expression "\n"); return false; } } while (0)
-//#define PARSE_RETURN_FALSE_IF_FAIL( expression ) if ( !( expression ) ) { printParseError( FILE_LINE "\nparse failed: " # expression "\n" ); return false; } else
+ #define PARSE_RETURN_FALSE_IF_FAIL( expression ) do{ if ( !( expression ) ) { printParseError( FILE_LINE "\nparse failed: " # expression "\n" ); return false; } }while( 0 )
bool EntityClassDoom3_parseToken( Tokeniser& tokeniser ){
const char* token = tokeniser.getToken();
void Scene_EntitySetClassname_Selected( const char* classname );
-typedef struct _GtkWidget GtkWidget;
-const char* misc_model_dialog( GtkWidget* parent );
+const char* misc_model_dialog( ui::Widget parent );
+ void Entity_setColour();
-typedef struct _GtkMenu GtkMenu;
-void Entity_constructMenu( GtkMenu* menu );
+void Entity_constructMenu( ui::Menu menu );
void Entity_Construct();
void Entity_Destroy();
};
-GtkWidget* getWidget() const {
- return GTK_WIDGET( m_entry.m_entry.m_frame );
+ class ColorAttribute : public EntityAttribute
+ {
+ CopiedString m_key;
+ BrowsedPathEntry m_entry;
+ NonModalEntry m_nonModal;
+ public:
+ ColorAttribute( const char* key ) :
+ m_key( key ),
+ m_entry( BrowseCaller( *this ) ),
+ m_nonModal( ApplyCaller( *this ), UpdateCaller( *this ) ){
+ m_nonModal.connect( m_entry.m_entry.m_entry );
+ }
+ void release(){
+ delete this;
+ }
-typedef MemberCaller<ColorAttribute, &ColorAttribute::apply> ApplyCaller;
++ui::Widget getWidget() const {
++ return ui::Widget( m_entry.m_entry.m_frame );
+ }
+ void apply(){
+ StringOutputStream value( 64 );
+ value << gtk_entry_get_text( GTK_ENTRY( m_entry.m_entry.m_entry ) );
+ Scene_EntitySetKeyValue_Selected_Undoable( m_key.c_str(), value.c_str() );
+ }
-typedef MemberCaller<ColorAttribute, &ColorAttribute::update> UpdateCaller;
++typedef MemberCaller<ColorAttribute, void(), &ColorAttribute::apply> ApplyCaller;
+ void update(){
+ StringOutputStream value( 64 );
+ value << SelectedEntity_getValueForKey( m_key.c_str() );
+ gtk_entry_set_text( GTK_ENTRY( m_entry.m_entry.m_entry ), value.c_str() );
+ }
-typedef MemberCaller1<ColorAttribute, const BrowsedPathEntry::SetPathCallback&, &ColorAttribute::browse> BrowseCaller;
++typedef MemberCaller<ColorAttribute, void(), &ColorAttribute::update> UpdateCaller;
+ void browse( const BrowsedPathEntry::SetPathCallback& setPath ){
+ //const char *filename = misc_model_dialog( gtk_widget_get_toplevel( GTK_WIDGET( m_entry.m_entry.m_frame ) ) );
+
+ /* hijack BrowsedPathEntry to call colour chooser */
+ Entity_setColour();
+
+ // if ( filename != 0 ) {
+ // setPath( filename );
+ // apply();
+ // }
+ update();
+ }
++typedef MemberCaller<ColorAttribute, void(const BrowsedPathEntry::SetPathCallback&), &ColorAttribute::browse> BrowseCaller;
+ };
+
+
class ModelAttribute : public EntityAttribute
{
CopiedString m_key;
g_current_comment = eclass;
+ g_entityClassComment.text(eclass->comments());
++
+ GtkTextBuffer* buffer = gtk_text_view_get_buffer( g_entityClassComment );
+ //gtk_text_buffer_set_text( buffer, eclass->comments(), -1 );
+ const char* comment = eclass->comments(), *c;
+ int offset = 0, pattern_start = -1, spaces = 0;
+
+ gtk_text_buffer_set_text( buffer, comment, -1 );
+
+ // Catch patterns like "\nstuff :" used to describe keys and spawnflags, and make them bold for readability.
+
+ for( c = comment; *c; ++c, ++offset ) {
+ if( *c == '\n' ) {
+ pattern_start = offset;
+ spaces = 0;
+ }
+ else if( pattern_start >= 0 && ( *c < 'a' || *c > 'z' ) && ( *c < 'A' || *c > 'Z' ) && ( *c < '0' || *c > '9' ) && ( *c != '_' ) ) {
+ if( *c == ':' && spaces <= 1 ) {
+ GtkTextIter iter_start, iter_end;
+
+ gtk_text_buffer_get_iter_at_offset( buffer, &iter_start, pattern_start );
+ gtk_text_buffer_get_iter_at_offset( buffer, &iter_end, offset );
+ gtk_text_buffer_apply_tag_by_name( buffer, "bold", &iter_start, &iter_end );
+ }
+
+ if( *c == ' ' )
+ ++spaces;
+ else
+ pattern_start = -1;
+ }
+ }
}
void SurfaceFlags_setEntityClass( EntityClass* eclass ){
gtk_scrolled_window_set_shadow_type( GTK_SCROLLED_WINDOW( scr ), GTK_SHADOW_IN );
{
- GtkTextView* text = GTK_TEXT_VIEW( gtk_text_view_new() );
- gtk_widget_set_size_request( GTK_WIDGET( text ), 0, -1 ); // allow shrinking
+ auto text = ui::TextView(ui::New);
+ text.dimensions(0, -1); // allow shrinking
gtk_text_view_set_wrap_mode( text, GTK_WRAP_WORD );
gtk_text_view_set_editable( text, FALSE );
- gtk_widget_show( GTK_WIDGET( text ) );
- gtk_container_add( GTK_CONTAINER( scr ), GTK_WIDGET( text ) );
+ text.show();
+ scr.add(text);
g_entityClassComment = text;
+ {
+ GtkTextBuffer *buffer = gtk_text_view_get_buffer( text );
+ gtk_text_buffer_create_tag( buffer, "bold", "weight", PANGO_WEIGHT_BOLD, NULL );
+ }
}
}
}
class PathsDialog : public Dialog
{
public:
-GtkWindow* BuildDialog(){
- GtkFrame* frame = create_dialog_frame( "Path settings", GTK_SHADOW_ETCHED_IN );
+ui::Window BuildDialog(){
+ auto frame = create_dialog_frame( "Path settings", ui::Shadow::ETCHED_IN );
- GtkVBox* vbox2 = create_dialog_vbox( 0, 4 );
- gtk_container_add( GTK_CONTAINER( frame ), GTK_WIDGET( vbox2 ) );
+ auto vbox2 = create_dialog_vbox( 0, 4 );
+ frame.add(vbox2);
+ const char* engine;
+ #if defined( WIN32 )
+ engine = g_pGameDescription->getRequiredKeyValue( "engine_win32" );
+ #elif defined( __linux__ ) || defined ( __FreeBSD__ )
+ engine = g_pGameDescription->getRequiredKeyValue( "engine_linux" );
+ #elif defined( __APPLE__ )
+ engine = g_pGameDescription->getRequiredKeyValue( "engine_macos" );
+ #else
+ #error "unsupported platform"
+ #endif
+ StringOutputStream text( 256 );
+ text << "Select directory, where game executable sits (typically \"" << engine << "\")\n";
+ GtkLabel* label = GTK_LABEL( gtk_label_new( text.c_str() ) );
+ gtk_widget_show( GTK_WIDGET( label ) );
+ gtk_container_add( GTK_CONTAINER( vbox2 ), GTK_WIDGET( label ) );
+
{
- PreferencesPage preferencesPage( *this, GTK_WIDGET( vbox2 ) );
+ PreferencesPage preferencesPage( *this, vbox2 );
Paths_constructPreferences( preferencesPage );
}
- return ui::Window(create_simple_modal_dialog_window( "Engine Path Not Found", m_modal, frame ));
- return create_simple_modal_dialog_window( "Engine Path Configuration", m_modal, GTK_WIDGET( frame ) );
++ return ui::Window(create_simple_modal_dialog_window( "Engine Path Configuration", m_modal, frame ));
}
};
}
}
-gboolean TextureBrowser_button_press( GtkWidget* widget, GdkEventButton* event, TextureBrowser* textureBrowser ){
+gboolean TextureBrowser_button_press( ui::Widget widget, GdkEventButton* event, TextureBrowser* textureBrowser ){
if ( event->type == GDK_BUTTON_PRESS ) {
+ gtk_widget_grab_focus( widget );
if ( event->button == 3 ) {
if ( GlobalTextureBrowser().m_tags ) {
textureBrowser->m_rmbSelected = true;
return FALSE;
}
-gboolean TextureBrowser_scroll( GtkWidget* widget, GdkEventScroll* event, TextureBrowser* textureBrowser ){
+gboolean TextureBrowser_scroll( ui::Widget widget, GdkEventScroll* event, TextureBrowser* textureBrowser ){
+ gtk_widget_grab_focus( widget );
+ if( !gtk_window_is_active( textureBrowser->m_parent ) )
+ gtk_window_present( textureBrowser->m_parent );
+
if ( event->direction == GDK_SCROLL_UP ) {
TextureBrowser_MouseWheel( *textureBrowser, true );
}
}
}
-gboolean xywnd_button_press( GtkWidget* widget, GdkEventButton* event, XYWnd* xywnd ){
+gboolean xywnd_button_press( ui::Widget widget, GdkEventButton* event, XYWnd* xywnd ){
if ( event->type == GDK_BUTTON_PRESS ) {
+ gtk_widget_grab_focus( xywnd->GetWidget() );
+
if( !xywnd->Active() ){
g_pParentWnd->SetActiveXY( xywnd );
}
reinterpret_cast<XYWnd*>( data )->XY_MouseMoved( static_cast<int>( x ), static_cast<int>( y ), buttons_for_state( state ) );
}
-gboolean xywnd_wheel_scroll( GtkWidget* widget, GdkEventScroll* event, XYWnd* xywnd ){
+gboolean xywnd_wheel_scroll( ui::Widget widget, GdkEventScroll* event, XYWnd* xywnd ){
+ gtk_widget_grab_focus( xywnd->GetWidget() );
- GtkWindow* window = xywnd->m_parent != 0 ? xywnd->m_parent : MainFrame_getWindow();
++ ui::Window window = xywnd->m_parent ? xywnd->m_parent : MainFrame_getWindow();
+ if( !gtk_window_is_active( window ) )
+ gtk_window_present( window );
+
if( !xywnd->Active() ){
g_pParentWnd->SetActiveXY( xywnd );
}