From 53572823bc076d56099317515d2702147da9b40a Mon Sep 17 00:00:00 2001 From: mfranz Date: Fri, 19 May 2006 10:59:04 +0000 Subject: [PATCH] - unify several indentation and coding styles (and no, this is not my preferred style, but the most sane of those used :-) - remove trailing spaces - cleanup (all of this will make further work on the files easier) --- src/GUI/prop_picker.cxx | 820 ++++++++++++++++++++-------------------- src/GUI/prop_picker.hxx | 140 ++++--- 2 files changed, 486 insertions(+), 474 deletions(-) diff --git a/src/GUI/prop_picker.cxx b/src/GUI/prop_picker.cxx index 01f0415f0..c46747736 100755 --- a/src/GUI/prop_picker.cxx +++ b/src/GUI/prop_picker.cxx @@ -9,17 +9,17 @@ ******** PLIB - A Suite of Portable Game Libraries Copyright (C) 2001 Steve Baker - + This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - + This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. @@ -47,7 +47,8 @@ SG_USING_STD(string); -// A local alternative name, for use when a variable called "string" is in scope - e.g. in classes derived from puInput. +// A local alternative name, for use when a variable called "string" +// is in scope - e.g. in classes derived from puInput. typedef string stdString; #define DOTDOTSLASH "../" @@ -63,121 +64,138 @@ static puObject *PP_widget = 0; static puObject *PE_widget = 0; -void prop_pickerInit() + + +// entry point: called from src/GUI/menubar.cxx -- do_properties_dialog() ===== + +void prop_pickerView( puObject * ) { - if( PP_widget == 0 ) { - fgPropPicker *PP = new fgPropPicker ( PROPPICK_X, PROPPICK_Y, PROPPICK_W, PROPPICK_H, 1, "/", "FG Properties"); - PP_widget = PP; - } + if( PP_widget == 0 ) + prop_pickerInit(); + + fgPropPicker *me = (fgPropPicker *)PP_widget -> getUserData(); + // refresh + me -> find_props(); + FG_PUSH_PUI_DIALOG( me ); } -void prop_pickerView( puObject * ) + + + +// ============================================================================ + +void prop_pickerInit() { - if( PP_widget == 0 ) { - prop_pickerInit(); - } - fgPropPicker *me = (fgPropPicker *)PP_widget -> getUserData(); - // refresh - me -> find_props(); - FG_PUSH_PUI_DIALOG( me ); + if ( PP_widget == 0 ) { + fgPropPicker *PP = new fgPropPicker ( PROPPICK_X, PROPPICK_Y, PROPPICK_W, PROPPICK_H, + 1, "/", "FG Properties"); + PP_widget = PP; + } } + void prop_pickerRefresh() { - if( PP_widget == 0 ) { - prop_pickerInit(); - } - fgPropPicker *me = (fgPropPicker *)PP_widget -> getUserData(); - me -> find_props( true ); - me -> clrValue(); + if( PP_widget == 0 ) + prop_pickerInit(); + + fgPropPicker *me = (fgPropPicker *)PP_widget -> getUserData(); + me -> find_props( true ); + me -> clrValue(); } + void prop_editOpen( const char * name, const char * value, char * proppath ) { - if( PE_widget == 0 ) - PE_widget = new fgPropEdit(name, value, proppath); - - fgPropEdit *me = (fgPropEdit *)PE_widget -> getUserData(); - me -> propname -> setLabel (name); - me -> propinput -> setValue (value); - strcpy(me -> propPath, proppath); - me -> propinput -> acceptInput (); - FG_PUSH_PUI_DIALOG( me ); + if( PE_widget == 0 ) + PE_widget = new fgPropEdit(name, value, proppath); + + fgPropEdit *me = (fgPropEdit *)PE_widget -> getUserData(); + me -> propname -> setLabel (name); + me -> propinput -> setValue (value); + strcpy(me -> propPath, proppath); + me -> propinput -> acceptInput (); + FG_PUSH_PUI_DIALOG( me ); } -// return a human readable form of the value "type" + static string getValueTypeString( const SGPropertyNode_ptr node ) { string result; - if ( node == NULL ) { - return "unknown"; - } + if ( node == NULL ) + return "unknown"; SGPropertyNode::Type type = node->getType(); - if ( type == SGPropertyNode::UNSPECIFIED ) { - result = "unspecified"; - } else if ( type == SGPropertyNode::NONE ) { + if ( type == SGPropertyNode::UNSPECIFIED ) + result = "unspecified"; + else if ( type == SGPropertyNode::NONE ) result = "none"; - } else if ( type == SGPropertyNode::BOOL ) { - result = "bool"; - } else if ( type == SGPropertyNode::INT ) { - result = "int"; - } else if ( type == SGPropertyNode::LONG ) { - result = "long"; - } else if ( type == SGPropertyNode::FLOAT ) { - result = "float"; - } else if ( type == SGPropertyNode::DOUBLE ) { - result = "double"; - } else if ( type == SGPropertyNode::STRING ) { - result = "string"; - } + else if ( type == SGPropertyNode::BOOL ) + result = "bool"; + else if ( type == SGPropertyNode::INT ) + result = "int"; + else if ( type == SGPropertyNode::LONG ) + result = "long"; + else if ( type == SGPropertyNode::FLOAT ) + result = "float"; + else if ( type == SGPropertyNode::DOUBLE ) + result = "double"; + else if ( type == SGPropertyNode::STRING ) + result = "string"; return result; } + + + +// property picker class ====================================================== + void fgPropPicker::fgPropPickerHandleSlider ( puObject * slider ) { - puListBox* list_box = (puListBox*) slider -> getUserData () ; - - float val ; - slider -> getValue ( &val ) ; - val = 1.0f - val ; - int scroll_range = list_box->getNumItems () - list_box->getNumVisible() ; - if ( scroll_range > 0 ) - { - int index = int ( scroll_range * val + 0.5 ) ; - list_box -> setTopItem ( index ) ; - } + puListBox* list_box = (puListBox*) slider -> getUserData (); + + float val; + slider -> getValue ( &val ); + val = 1.0f - val; + int scroll_range = list_box->getNumItems () - list_box->getNumVisible(); + + if ( scroll_range > 0 ) { + int index = int ( scroll_range * val + 0.5 ); + list_box -> setTopItem ( index ); + } } + void fgPropPicker::fgPropPickerHandleArrow ( puObject *arrow ) { - puSlider *slider = (puSlider *) arrow->getUserData () ; - puListBox* list_box = (puListBox*) slider -> getUserData () ; - - int type = ((puArrowButton *)arrow)->getArrowType() ; - int inc = ( type == PUARROW_DOWN ) ? 1 : - ( type == PUARROW_UP ) ? -1 : - ( type == PUARROW_FASTDOWN ) ? 10 : - ( type == PUARROW_FASTUP ) ? -10 : 0 ; - - float val ; - slider -> getValue ( &val ) ; - val = 1.0f - val ; - int scroll_range = list_box->getNumItems () - list_box->getNumVisible() ; - if ( scroll_range > 0 ) - { - int index = int ( scroll_range * val + 0.5 ) ; - index += inc ; - // if ( index > scroll_range ) index = scroll_range ; - // Allow buttons to scroll further than the slider does - if ( index > ( list_box->getNumItems () - 1 ) ) - index = ( list_box->getNumItems () - 1 ) ; - if ( index < 0 ) index = 0 ; - - slider -> setValue ( 1.0f - (float)index / scroll_range ) ; - list_box -> setTopItem ( index ) ; - } + puSlider *slider = (puSlider *) arrow->getUserData (); + puListBox* list_box = (puListBox*) slider -> getUserData (); + + int type = ((puArrowButton *)arrow)->getArrowType(); + int inc = ( type == PUARROW_DOWN ) ? 1 : + ( type == PUARROW_UP ) ? -1 : + ( type == PUARROW_FASTDOWN ) ? 10 : + ( type == PUARROW_FASTUP ) ? -10 : 0; + + float val; + slider -> getValue ( &val ); + val = 1.0f - val; + int scroll_range = list_box->getNumItems () - list_box->getNumVisible(); + + if ( scroll_range > 0 ) { + int index = int ( scroll_range * val + 0.5 ); + index += inc; + // if ( index > scroll_range ) index = scroll_range; + // Allow buttons to scroll further than the slider does + if ( index > ( list_box->getNumItems () - 1 ) ) + index = ( list_box->getNumItems () - 1 ); + if ( index < 0 ) + index = 0; + + slider -> setValue ( 1.0f - (float)index / scroll_range ); + list_box -> setTopItem ( index ); + } } @@ -185,150 +203,137 @@ void fgPropPicker::chop_file ( char *fname ) { /* removes everything back to the last '/' */ - for ( int i = strlen(fname)-1 ; fname[i] != SLASH[0] && i >= 0 ; i-- ) - fname[i] = '\0' ; + for ( int i = strlen(fname)-1; fname[i] != SLASH[0] && i >= 0; i-- ) + fname[i] = '\0'; } void fgPropPicker::go_up_one_directory ( char *fname ) { - /* removes everything back to the last but one '/' */ + /* removes everything back to the last but one '/' */ - chop_file ( fname ) ; + chop_file ( fname ); - if ( strlen ( fname ) == 0 ) - { - /* Empty string! The only way to go up is to append a "../" */ + if ( strlen ( fname ) == 0 ) { + /* Empty string! The only way to go up is to append a "../" */ + strcpy ( fname, DOTDOTSLASH ); + return; + } - strcpy ( fname, DOTDOTSLASH ) ; - return ; - } + /* If the last path element is a "../" then we'll have to add another "../" */ - /* If the last path element is a "../" then we'll have to add another "../" */ + if ( strcmp ( & fname [ strlen(fname)-3 ], DOTDOTSLASH ) == 0 ) { + if ( strlen ( fname ) + 4 >= PUSTRING_MAX ) { + ulSetError ( UL_WARNING, "PUI: fgPropPicker - path is too long, max is %d.", + PUSTRING_MAX ); + return; + } - if ( strcmp ( & fname [ strlen(fname)-3 ], DOTDOTSLASH ) == 0 ) - { - if ( strlen ( fname ) + 4 >= PUSTRING_MAX ) - { - ulSetError ( UL_WARNING, "PUI: fgPropPicker - path is too long, max is %d.", - PUSTRING_MAX ) ; - return ; + strcat ( fname, DOTDOTSLASH ); + return; } - strcat ( fname, DOTDOTSLASH ) ; - return ; - } - - /* Otherwise, just delete the last element of the path. */ + /* Otherwise, just delete the last element of the path. */ + /* Remove the trailing slash - then remove the rest as if it was a file name */ - /* Remove the trailing slash - then remove the rest as if it was a file name */ - - fname [ strlen(fname)-1 ] = '\0' ; - chop_file ( fname ) ; + fname [ strlen(fname)-1 ] = '\0'; + chop_file ( fname ); } void fgPropPicker::handle_select ( puObject* list_box ) { - fgPropPicker* prop_picker = (fgPropPicker*) list_box -> getUserData () ; - int selected ; - list_box -> getValue ( &selected ) ; - - if ( selected >= 0 && selected < prop_picker -> num_files ) - { - char *dst = prop_picker -> startDir ; - char *src = prop_picker -> files [ selected ] ; - - if (prop_picker->dotFiles && (selected < 2)) { - if ( strcmp ( src, "." ) == 0 ) { - /* Do nothing - but better refresh anyway. */ - - prop_picker -> find_props () ; - return ; - } else if ( strcmp ( src, ".." ) == 0 ) { - /* Do back up one level - so refresh. */ - - go_up_one_directory ( dst ) ; - prop_picker -> find_props () ; - return ; + fgPropPicker* prop_picker = (fgPropPicker*) list_box -> getUserData (); + int selected; + list_box -> getValue ( &selected ); + + if ( selected >= 0 && selected < prop_picker -> num_files ) { + char *dst = prop_picker -> startDir; + char *src = prop_picker -> files [ selected ]; + + if (prop_picker->dotFiles && (selected < 2)) { + if ( strcmp ( src, "." ) == 0 ) { + /* Do nothing - but better refresh anyway. */ + + prop_picker -> find_props (); + return; + } else if ( strcmp ( src, ".." ) == 0 ) { + /* Do back up one level - so refresh. */ + + go_up_one_directory ( dst ); + prop_picker -> find_props (); + return; + } } - } - // we know we're dealing with a regular entry, so convert - // it to an index into children[] - if (prop_picker->dotFiles) selected -= 2; - SGPropertyNode_ptr child = prop_picker->children[selected]; - assert(child != NULL); - - // check if it's a directory (had children) - if ( child->nChildren() ) { - /* If this is a directory - then descend into it and refresh */ - - if ( strlen ( dst ) + strlen ( src ) + 2 >= PUSTRING_MAX ) - { - ulSetError ( UL_WARNING, - "PUI: fgPropPicker - path is too long, max is %d.", PUSTRING_MAX ) ; - return ; - } - - strcat ( dst, src ) ; /* add path to descend to */ - prop_picker -> find_props () ; - return ; - } + // we know we're dealing with a regular entry, so convert + // it to an index into children[] + if (prop_picker->dotFiles) + selected -= 2; + SGPropertyNode_ptr child = prop_picker->children[selected]; + assert(child != NULL); + + // check if it's a directory (had children) + if ( child->nChildren() ) { + /* If this is a directory - then descend into it and refresh */ + + if ( strlen ( dst ) + strlen ( src ) + 2 >= PUSTRING_MAX ) { + ulSetError ( UL_WARNING, + "PUI: fgPropPicker - path is too long, max is %d.", PUSTRING_MAX ); + return; + } + + strcat ( dst, src ); /* add path to descend to */ + prop_picker -> find_props (); + return; + } - /* If this is a regular file - then just append it to the string */ + /* If this is a regular file - then just append it to the string */ - if ( strlen ( dst ) + strlen ( src ) + 2 >= PUSTRING_MAX ) - { - ulSetError ( UL_WARNING, - "PUI: fgPropPicker - path is too long, max is %d.", PUSTRING_MAX ) ; - return ; - } + if ( strlen ( dst ) + strlen ( src ) + 2 >= PUSTRING_MAX ) { + ulSetError ( UL_WARNING, + "PUI: fgPropPicker - path is too long, max is %d.", PUSTRING_MAX ); + return; + } - if (child->getType() == SGPropertyNode::BOOL && (fgGetKeyModifiers() & KEYMOD_CTRL)) { - child->setBoolValue(!child->getBoolValue()); - prop_pickerRefresh(); - } else - prop_editOpen(child->getName(), child->getStringValue(), dst); - } - else - { - /* - The user clicked on blank screen - maybe we should - refresh just in case some other process created the - file. - */ - // should be obsolete once we observe child add/remove on our top node - prop_picker -> find_props () ; - } + if (child->getType() == SGPropertyNode::BOOL && (fgGetKeyModifiers() & KEYMOD_CTRL)) { + child->setBoolValue(!child->getBoolValue()); + prop_pickerRefresh(); + } else + prop_editOpen(child->getName(), child->getStringValue(), dst); + + } else { + // The user clicked on blank screen - maybe we should + // refresh just in case some other process created the file. + // Should be obsolete once we observe child add/remove on our top node + prop_picker -> find_props (); + } } void fgPropPicker::fgPropPickerHandleOk ( puObject* b ) { - fgPropPicker* prop_picker = (fgPropPicker*) b -> getUserData () ; + fgPropPicker* prop_picker = (fgPropPicker*) b -> getUserData (); - /* nothing to do, just hide */ - FG_POP_PUI_DIALOG( prop_picker ); + /* nothing to do, just hide */ + FG_POP_PUI_DIALOG( prop_picker ); } void fgPropPicker::delete_arrays () { - if ( files ) - { - for ( int i=0; inChildren() == 0) + children[C]->removeChangeListener(this); + } - for (int C=0; CnChildren() == 0) - children[C]->removeChangeListener(this); + delete[] files; + delete[] children; } - - delete[] files; - delete[] children; - } } /* @@ -338,199 +343,202 @@ fgPropPicker::~fgPropPicker () delete_arrays(); if ( this == puActiveWidget () ) - puDeactivateWidget () ; + puDeactivateWidget (); } */ + fgPropPicker::fgPropPicker ( int x, int y, int w, int h, int arrows, - const char *dir, const char *title ) : - fgPopup ( x,y ), - _gui((NewGUI *)globals->get_subsystem("gui")) + const char *dir, const char *title ) : + fgPopup ( x,y ), + _gui((NewGUI *)globals->get_subsystem("gui")) { - puFont LegendFont, LabelFont; - puGetDefaultFonts ( &LegendFont, &LabelFont ); - FGColor txtcol(_gui->getColor("label")); - txtcol.merge(_gui->getColor("text")); - txtcol.merge(_gui->getColor("text-label")); - - files = NULL ; - num_files = 0 ; - - strcpy ( startDir, dir ) ; - // printf ( "StartDirLEN=%i", strlen(startDir)); - if ( arrows > 2 ) arrows = 2 ; - if ( arrows < 0 ) arrows = 0 ; - arrow_count = arrows ; - - frame = new puFrame ( 0, 0, w, h ); - - setUserData( this ); - - proppath = new puText (10, h-30); - proppath -> setLabel (startDir); - proppath -> setColor(PUCOL_LABEL, txtcol.red(), txtcol.green(), - txtcol.blue(), txtcol.alpha()); - - slider = new puSlider (w-30,40+20*arrows,h-100-40*arrows,TRUE,20); - slider->setValue(1.0f); - - list_box = new puListBox ( 10, 40, w-40, h-60 ) ; - list_box -> setLabel ( title ); - list_box -> setLabelPlace ( PUPLACE_ABOVE ) ; - list_box -> setStyle ( -PUSTYLE_SMALL_SHADED ) ; - list_box -> setUserData ( this ) ; - list_box -> setCallback ( handle_select ) ; - list_box -> setValue ( 0 ) ; - list_box -> setColor(PUCOL_LABEL, txtcol.red(), txtcol.green(), - txtcol.blue(), txtcol.alpha()); - - ok_button = new puOneShot ( 10, 10, (w<170)?(w/2-5):80, 30 ) ; - ok_button -> setLegend ( "Ok" ) ; - ok_button -> setUserData ( this ) ; - ok_button -> setCallback ( fgPropPickerHandleOk ) ; - - if ( arrows > 0 ) - { - down_arrow = new puArrowButton ( w-30, 20+20*arrows, w-10, 40+20*arrows, PUARROW_DOWN ) ; - down_arrow->setUserData ( slider ) ; - down_arrow->setCallback ( fgPropPickerHandleArrow ) ; - - up_arrow = new puArrowButton ( w-30, h-60-20*arrows, w-10, h-40-20*arrows, PUARROW_UP ) ; - up_arrow->setUserData ( slider ) ; - up_arrow->setCallback ( fgPropPickerHandleArrow ) ; - } - - // after picker is built, load the list box with data... - find_props () ; - -// printf("after Props files[1]=%s\n",files[1]); -// printf("num items %i", list_box -> getNumItems ()); - - slider -> setUserData ( list_box ) ; - slider -> setCallback ( fgPropPickerHandleSlider ) ; - - FG_FINALIZE_PUI_DIALOG( this ); + puFont LegendFont, LabelFont; + puGetDefaultFonts ( &LegendFont, &LabelFont ); + FGColor txtcol(_gui->getColor("label")); + txtcol.merge(_gui->getColor("text")); + txtcol.merge(_gui->getColor("text-label")); + + files = NULL; + num_files = 0; + + strcpy ( startDir, dir ); + // printf ( "StartDirLEN=%i", strlen(startDir)); + if ( arrows > 2 ) + arrows = 2; + if ( arrows < 0 ) + arrows = 0; + arrow_count = arrows; + + frame = new puFrame ( 0, 0, w, h ); + + setUserData( this ); + + proppath = new puText (10, h-30); + proppath -> setLabel (startDir); + proppath -> setColor(PUCOL_LABEL, txtcol.red(), txtcol.green(), + txtcol.blue(), txtcol.alpha()); + + slider = new puSlider (w-30,40+20*arrows,h-100-40*arrows,TRUE,20); + slider->setValue(1.0f); + + list_box = new puListBox ( 10, 40, w-40, h-60 ); + list_box -> setLabel ( title ); + list_box -> setLabelPlace ( PUPLACE_ABOVE ); + list_box -> setStyle ( -PUSTYLE_SMALL_SHADED ); + list_box -> setUserData ( this ); + list_box -> setCallback ( handle_select ); + list_box -> setValue ( 0 ); + list_box -> setColor(PUCOL_LABEL, txtcol.red(), txtcol.green(), + txtcol.blue(), txtcol.alpha()); + + ok_button = new puOneShot ( 10, 10, (w<170)?(w/2-5):80, 30 ); + ok_button -> setLegend ( "Ok" ); + ok_button -> setUserData ( this ); + ok_button -> setCallback ( fgPropPickerHandleOk ); + + if ( arrows > 0 ) { + down_arrow = new puArrowButton ( w-30, 20+20*arrows, w-10, 40+20*arrows, PUARROW_DOWN ); + down_arrow->setUserData ( slider ); + down_arrow->setCallback ( fgPropPickerHandleArrow ); + + up_arrow = new puArrowButton ( w-30, h-60-20*arrows, w-10, h-40-20*arrows, PUARROW_UP ); + up_arrow->setUserData ( slider ); + up_arrow->setCallback ( fgPropPickerHandleArrow ); + } + + // after picker is built, load the list box with data... + find_props (); + + // printf("after Props files[1]=%s\n",files[1]); + // printf("num items %i", list_box -> getNumItems ()); + + slider -> setUserData ( list_box ); + slider -> setCallback ( fgPropPickerHandleSlider ); + + FG_FINALIZE_PUI_DIALOG( this ); } // Like strcmp, but for sorting property nodes into a suitable display order. static int nodeNameCompare(const void *ppNode1, const void *ppNode2) { - const SGPropertyNode_ptr pNode1 = *(const SGPropertyNode_ptr *)ppNode1; - const SGPropertyNode_ptr pNode2 = *(const SGPropertyNode_ptr *)ppNode2; + const SGPropertyNode_ptr pNode1 = *(const SGPropertyNode_ptr *)ppNode1; + const SGPropertyNode_ptr pNode2 = *(const SGPropertyNode_ptr *)ppNode2; - // Compare name first, and then index. - int diff = strcmp(pNode1->getName(), pNode2->getName()); - if (diff) return diff; - return pNode1->getIndex() - pNode2->getIndex(); + // Compare name first, and then index. + int diff = strcmp(pNode1->getName(), pNode2->getName()); + if (diff) + return diff; + + return pNode1->getIndex() - pNode2->getIndex(); } // Replace the current list of properties with the children of node "startDir". void fgPropPicker::find_props ( bool restore_pos ) { - int pi; - int i; - - delete_arrays(); - num_files = 0 ; - -// printf("dir begin of find_props=%s\n",startDir); -// printf("len of dir=%i",strlen(startDir)); - SGPropertyNode * node = globals->get_props()->getNode(startDir); - - num_files = (node) ? (int)node->nChildren() : 0; - - // instantiate string objects and add [.] and [..] for subdirs - if (strcmp(startDir,"/") == 0) { - files = new char* [ num_files+1 ] ; - pi = 0; - dotFiles = false; - } else { - // add two for the .. and . - num_files = num_files + 2; - // make room for .. and . - files = new char* [ num_files+1 ] ; - - stdString line = "."; - files [ 0 ] = new char[line.size() + 1]; - strcpy ( files [ 0 ], line.c_str() ); - - line = ".."; - files [ 1 ] = new char[line.size() + 1]; - strcpy ( files [ 1 ], line.c_str() ); - - pi = 2; - dotFiles = true; - }; - - - if (node) { - // Get the list of children - num_children = node->nChildren(); - children = new SGPropertyNode_ptr[num_children]; - for (i = 0; i < num_children; i++) { - children[i] = node->getChild(i); + int pi; + int i; + + delete_arrays(); + num_files = 0; + + // printf("dir begin of find_props=%s\n",startDir); + // printf("len of dir=%i",strlen(startDir)); + SGPropertyNode * node = globals->get_props()->getNode(startDir); + + num_files = node ? (int)node->nChildren() : 0; + + // instantiate string objects and add [.] and [..] for subdirs + if (strcmp(startDir,"/") == 0) { + files = new char* [ num_files+1 ]; + pi = 0; + dotFiles = false; + } else { + // add two for the .. and . + num_files = num_files + 2; + // make room for .. and . + files = new char* [ num_files+1 ]; + + stdString line = "."; + files [ 0 ] = new char[line.size() + 1]; + strcpy ( files [ 0 ], line.c_str() ); + + line = ".."; + files [ 1 ] = new char[line.size() + 1]; + strcpy ( files [ 1 ], line.c_str() ); + + pi = 2; + dotFiles = true; } - - // Sort the children into display order - qsort(children, num_children, sizeof(children[0]), nodeNameCompare); - - // Make lists of the children's names, values, etc. - for (i = 0; i < num_children; i++) { - SGPropertyNode * child = children[i]; - stdString name = child->getDisplayName(true); - - if ( child->nChildren() > 0 ) { - files[ pi ] = new char[ strlen(name.c_str())+2 ] ; - strcpy ( files [ pi ], name.c_str() ) ; - strcat ( files [ pi ], "/" ) ; - } else { - files[pi] = NULL; // ensure it's NULL before setting intial value - updateTextForEntry(i); - // observe it - child->addChangeListener(this); + + + if (node) { + num_children = node->nChildren(); + children = new SGPropertyNode_ptr[num_children]; + for (i = 0; i < num_children; i++) + children[i] = node->getChild(i); + + qsort(children, num_children, sizeof(children[0]), nodeNameCompare); + + // Make lists of the children's names, values, etc. + for (i = 0; i < num_children; i++) { + SGPropertyNode * child = children[i]; + stdString name = child->getDisplayName(true); + + if ( child->nChildren() > 0 ) { + files[ pi ] = new char[ strlen(name.c_str())+2 ]; + strcpy ( files [ pi ], name.c_str() ); + strcat ( files [ pi ], "/" ); + } else { + files[pi] = NULL; // ensure it's NULL before setting intial value + updateTextForEntry(i); + // observe it + child->addChangeListener(this); + } + + ++pi; } - - ++pi; } - } - - files [ num_files ] = NULL ; - - proppath -> setLabel (startDir); - - int top = list_box->getTopItem(); - list_box -> newList ( files ) ; - if (restore_pos) - list_box->setTopItem(top); - - // adjust the size of the slider... - if (num_files > list_box->getNumVisible()) { - slider->setSliderFraction((float)list_box->getNumVisible() / num_files); - if (!restore_pos) - slider->setValue(1.0f); - slider->reveal(); - up_arrow->reveal(); - down_arrow->reveal(); - } else { - slider->hide(); - up_arrow->hide(); - down_arrow->hide(); - } + + files [ num_files ] = NULL; + + proppath -> setLabel(startDir); + + int top = list_box->getTopItem(); + list_box -> newList ( files ); + if (restore_pos) + list_box->setTopItem(top); + + // adjust the size of the slider... + if (num_files > list_box->getNumVisible()) { + slider->setSliderFraction((float)list_box->getNumVisible() / num_files); + if (!restore_pos) + slider->setValue(1.0f); + + slider->reveal(); + up_arrow->reveal(); + down_arrow->reveal(); + + } else { + slider->hide(); + up_arrow->hide(); + down_arrow->hide(); + } } + void fgPropPicker::updateTextForEntry(int index) { assert((index >= 0) && (index < num_children)); SGPropertyNode_ptr node = children[index]; - - // take a copy of the value + + // take a copy of the value stdString value = node->getStringValue(); - stdString line = node->getDisplayName() + stdString(" = '") - + value + "' " + "("; + stdString line = node->getDisplayName() + stdString(" = '") + value + "' " + "("; line += getValueTypeString( node ); if (fgGetBool("/sim/gui/dialogs/property-browser/show-flags", false)) { @@ -555,15 +563,17 @@ void fgPropPicker::updateTextForEntry(int index) if (line.length() >= PUSTRING_MAX) line[PUSTRING_MAX-1] = '\0'; - if (dotFiles) index +=2; - + if (dotFiles) + index +=2; + // don't leak everywhere if we're updating delete[] files[index]; - - files[index] = new char[ strlen(line.c_str())+2 ] ; - strcpy ( files [ index ], line.c_str() ) ; + + files[index] = new char[ strlen(line.c_str())+2 ]; + strcpy ( files [ index ], line.c_str() ); } + void fgPropPicker::valueChanged(SGPropertyNode *nd) { for (int C=0; C getUserData () ; - prop_pickerRefresh(); - FG_POP_PUI_DIALOG( prop_edit ); + fgPropEdit* prop_edit = (fgPropEdit*) b -> getUserData (); + prop_pickerRefresh(); + FG_POP_PUI_DIALOG( prop_edit ); } + void fgPropEdit::fgPropEditHandleOK ( puObject* b ) { - fgPropEdit* prop_edit = (fgPropEdit*) b -> getUserData () ; - const char* tname; - char* tvalue; + fgPropEdit* prop_edit = (fgPropEdit*) b -> getUserData (); + const char* tname; + char* tvalue; - // use label text for property node to be updated - tname = prop_edit -> propname -> getLabel(); - prop_edit -> propinput -> getValue( &tvalue ); + // use label text for property node to be updated + tname = prop_edit -> propname -> getLabel(); + prop_edit -> propinput -> getValue( &tvalue ); - SGPropertyNode * node = globals->get_props()->getNode(prop_edit -> propPath); - node->getNode( prop_edit -> propname -> getLabel(), true)->setStringValue(tvalue); + SGPropertyNode * node = globals->get_props()->getNode(prop_edit -> propPath); + node->getNode( prop_edit -> propname -> getLabel(), true)->setStringValue(tvalue); - // update the picker display so it shows new value - prop_pickerRefresh(); + // update the picker display so it shows new value + prop_pickerRefresh(); - FG_POP_PUI_DIALOG( prop_edit ); + FG_POP_PUI_DIALOG( prop_edit ); } + fgPropEdit::fgPropEdit ( const char *name, const char *value, char *proppath ) : fgPopup ( 0, 0 ), _gui((NewGUI *)globals->get_subsystem("gui")) @@ -612,32 +629,33 @@ fgPropEdit::fgPropEdit ( const char *name, const char *value, char *proppath ) : // locate in relation to picker widget... int fx = PROPPICK_X; int fy = PROPPICK_Y + PROPPICK_H; - frame = new puFrame (fx,fy, fx+500, fy+120); + frame = new puFrame (fx,fy, fx+500, fy+120); strcpy (propPath, proppath); setUserData( this ); - propname = new puText (fx+10, fy+90); - propname -> setLabel (name); - propname -> setColor(PUCOL_LABEL, txtcol.red(), txtcol.green(), - txtcol.blue(), txtcol.alpha()); - - propinput = new puInput (fx+10, fy+50, fx+480, fy+80); - propinput -> setValue (value); - propinput -> acceptInput(); - - - ok_button = new puOneShot (fx+10, fy+10, fx+80, fy+30); - ok_button -> setUserData (this); - ok_button -> setLegend (gui_msg_OK); - ok_button -> setCallback (fgPropEditHandleOK); - ok_button -> makeReturnDefault(TRUE); - - cancel_button = new puOneShot (fx+100, fy+10, fx+180, fy+30); - cancel_button -> setUserData (this); - cancel_button -> setLegend (gui_msg_CANCEL); - cancel_button -> setCallback (fgPropEditHandleCancel); - + propname = new puText (fx+10, fy+90); + propname -> setLabel(name); + propname -> setColor(PUCOL_LABEL, txtcol.red(), txtcol.green(), + txtcol.blue(), txtcol.alpha()); + + propinput = new puInput (fx+10, fy+50, fx+480, fy+80); + propinput -> setValue (value); + propinput -> acceptInput(); + + ok_button = new puOneShot (fx+10, fy+10, fx+80, fy+30); + ok_button -> setUserData (this); + ok_button -> setLegend (gui_msg_OK); + ok_button -> setCallback (fgPropEditHandleOK); + ok_button -> makeReturnDefault (TRUE); + + cancel_button = new puOneShot (fx+100, fy+10, fx+180, fy+30); + cancel_button -> setUserData (this); + cancel_button -> setLegend (gui_msg_CANCEL); + cancel_button -> setCallback (fgPropEditHandleCancel); + FG_FINALIZE_PUI_DIALOG( this ); } + + diff --git a/src/GUI/prop_picker.hxx b/src/GUI/prop_picker.hxx index 2bb87cb7f..6986c7496 100755 --- a/src/GUI/prop_picker.hxx +++ b/src/GUI/prop_picker.hxx @@ -1,7 +1,5 @@ -/* - prop_picker.hxx - -*/ +#ifndef _PROP_PICKER_HXX +#define _PROP_PICKER_HXX #include @@ -15,93 +13,89 @@ void prop_pickerView( puObject * ); void prop_pickerRefresh(); void prop_editOpen( const char * name, const char * value ); -class fgPropPicker ; -class fgPropEdit ; - -class fgPropPicker : - public fgPopup, - public SGPropertyChangeListener -{ - - static void handle_select ( puObject *b ) ; - static void input_entered ( puObject *b ) ; - static void fgPropPickerHandleSlider ( puObject * slider ); - static void fgPropPickerHandleArrow ( puObject *arrow ); - static void fgPropPickerHandleOk ( puObject* b ); - - void delete_arrays () ; - - /** update the text string in the puList using the given node and - updating the requested offset. The value of dotFiles is taken - into account before the index is applied, i.e this should be - an index into 'children' */ - void updateTextForEntry(int index); - - char** files ; - int num_files ; - int arrow_count ; - char startDir [ PUSTRING_MAX * 2 ] ; - - SGPropertyNode_ptr* children; - int num_children; - - /** set if we're display the . and .. entries at the start of the - list */ - bool dotFiles; - -/* puInput *input ; */ -protected: +class fgPropPicker; +class fgPropEdit; - puFrame *frame ; - puListBox *list_box ; - puSlider *slider ; - puOneShot *cancel_button ; - puOneShot *ok_button ; - puArrowButton *down_arrow ; - puArrowButton *up_arrow ; +class fgPropPicker : public fgPopup, public SGPropertyChangeListener { - NewGUI * _gui; + static void handle_select ( puObject *b ); + static void input_entered ( puObject *b ); + static void fgPropPickerHandleSlider ( puObject * slider ); + static void fgPropPickerHandleArrow ( puObject *arrow ); + static void fgPropPickerHandleOk ( puObject* b ); + + void delete_arrays (); + + // update the text string in the puList using the given node and + // updating the requested offset. The value of dotFiles is taken + // into account before the index is applied, i.e this should be + // an index into 'children' */ + void updateTextForEntry(int index); + + char** files; + int num_files; + int arrow_count; + char startDir [ PUSTRING_MAX * 2 ]; + + SGPropertyNode_ptr* children; + int num_children; + + // set if we're display the . and .. entries at the start of the + // list + bool dotFiles; + +protected: + puFrame *frame; + puListBox *list_box; + puSlider *slider; + puOneShot *cancel_button; + puOneShot *ok_button; + puArrowButton *down_arrow; + puArrowButton *up_arrow; + + NewGUI * _gui; public: - puText *proppath ; - void find_props ( bool restore_slider_pos = false ) ; - fgPropPicker ( int x, int y, int w, int h, int arrows, - const char *dir, const char *title = "Pick a file" ) ; + puText *proppath; + void find_props ( bool restore_slider_pos = false ); + fgPropPicker ( int x, int y, int w, int h, int arrows, + const char *dir, const char *title = "Pick a file" ); - ~fgPropPicker () {;} + ~fgPropPicker () {} - static void go_up_one_directory ( char *fname ) ; - static void chop_file ( char *fname ) ; + static void go_up_one_directory ( char *fname ); + static void chop_file ( char *fname ); - // over-ride the method from SGPropertyNodeListener - virtual void valueChanged (SGPropertyNode * node); -} ; + // over-ride the method from SGPropertyNodeListener + virtual void valueChanged (SGPropertyNode * node); +}; -class fgPropEdit : public fgPopup -{ - static void fgPropEditHandleCancel ( puObject *b ) ; + +class fgPropEdit : public fgPopup { + + static void fgPropEditHandleCancel ( puObject *b ); static void fgPropEditHandleOK ( puObject* b ); protected: - - puFrame *frame ; - puOneShot *cancel_button ; - puOneShot *ok_button ; + puFrame *frame; + puOneShot *cancel_button; + puOneShot *ok_button; NewGUI * _gui; public: - puText *propname ; - puInput *propinput ; - char propPath [ PUSTRING_MAX * 2 ] ; + puText *propname; + puInput *propinput; + char propPath [ PUSTRING_MAX * 2 ]; - fgPropEdit ( const char *name, const char *value, char *proppath ) ; + fgPropEdit ( const char *name, const char *value, char *proppath ); - ~fgPropEdit () {;} + ~fgPropEdit () {} - static void go_up_one_directory ( char *fname ) ; - static void chop_file ( char *fname ) ; + static void go_up_one_directory ( char *fname ); + static void chop_file ( char *fname ); +}; -} ; +#endif // _PROP_PICKER_HXX -- 2.39.2