Updates from Fred to add a progress bar and fix visual glitches.
Tweaks by Curt to progress bar, plus sanity checks on included uninstall box entries.
This commit is contained in:
parent
2985caa09b
commit
2513d06633
7 changed files with 88 additions and 27 deletions
|
@ -47,7 +47,7 @@ FGAdminUI::FGAdminUI() {
|
|||
{ Fl_Double_Window* o = main_window = new Fl_Double_Window(465, 435, "FlightGear Admin Wizard");
|
||||
w = o;
|
||||
o->user_data((void*)(this));
|
||||
{ Fl_Button* o = quit_b = new Fl_Button(190, 405, 85, 25, "Quit");
|
||||
{ Fl_Button* o = quit_b = new Fl_Button(360, 405, 85, 25, "Quit");
|
||||
o->callback((Fl_Callback*)cb_quit_b);
|
||||
}
|
||||
{ Fl_Button* o = source_b = new Fl_Button(5, 5, 225, 25, "Select Scenery Source ...");
|
||||
|
@ -68,6 +68,10 @@ FGAdminUI::FGAdminUI() {
|
|||
o->labelfont(1);
|
||||
o->callback((Fl_Callback*)cb_remove_b);
|
||||
}
|
||||
{ Fl_Progress* o = progress = new Fl_Progress(20, 405, 195, 25);
|
||||
o->color(FL_BACKGROUND_COLOR);
|
||||
o->selection_color((Fl_Color)175);
|
||||
}
|
||||
o->end();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,7 +11,7 @@ decl {\#include <FL/Fl_Preferences.H>} {public
|
|||
decl {using std::string;} {public
|
||||
}
|
||||
|
||||
class FGAdminUI {open selected
|
||||
class FGAdminUI {open
|
||||
} {
|
||||
decl {\#include <iostream>} {}
|
||||
decl {using std::cout;} {}
|
||||
|
@ -20,12 +20,12 @@ class FGAdminUI {open selected
|
|||
} {
|
||||
Fl_Window main_window {
|
||||
label {FlightGear Admin Wizard} open
|
||||
xywh {187 544 465 435} type Double visible
|
||||
xywh {294 195 465 435} type Double visible
|
||||
} {
|
||||
Fl_Button quit_b {
|
||||
label Quit
|
||||
callback {quit();}
|
||||
xywh {190 405 85 25}
|
||||
xywh {360 405 85 25}
|
||||
}
|
||||
Fl_Button source_b {
|
||||
label {Select Scenery Source ...}
|
||||
|
@ -63,6 +63,9 @@ refresh_lists();}
|
|||
callback {remove_selected();}
|
||||
xywh {250 360 195 35} labelfont 1
|
||||
}
|
||||
Fl_Progress progress {selected
|
||||
xywh {20 405 195 25} color 49 selection_color 175
|
||||
}
|
||||
}
|
||||
}
|
||||
decl {~FGAdminUI();} {public
|
||||
|
@ -71,6 +74,8 @@ refresh_lists();}
|
|||
}
|
||||
decl {void show();} {public
|
||||
}
|
||||
decl {static void step( void * );} {public
|
||||
}
|
||||
decl {void refresh_lists();} {}
|
||||
decl {void quit();} {}
|
||||
decl {void select_install_source();} {}
|
||||
|
|
|
@ -10,6 +10,7 @@ using std::string;
|
|||
#include <FL/Fl_Button.H>
|
||||
#include <FL/Fl_Input.H>
|
||||
#include <FL/Fl_Check_Browser.H>
|
||||
#include <FL/Fl_Progress.H>
|
||||
|
||||
class FGAdminUI {
|
||||
public:
|
||||
|
@ -44,9 +45,11 @@ private:
|
|||
inline void cb_remove_b_i(Fl_Button*, void*);
|
||||
static void cb_remove_b(Fl_Button*, void*);
|
||||
public:
|
||||
Fl_Progress *progress;
|
||||
~FGAdminUI();
|
||||
void init();
|
||||
void show();
|
||||
static void step( void * );
|
||||
private:
|
||||
void refresh_lists();
|
||||
void quit();
|
||||
|
|
|
@ -42,6 +42,8 @@ using std::endl;
|
|||
using std::vector;
|
||||
using std::string;
|
||||
|
||||
static const float min_progress = 0.0;
|
||||
static const float max_progress = 5000.0;
|
||||
|
||||
// destructor
|
||||
FGAdminUI::~FGAdminUI() {
|
||||
|
@ -64,6 +66,9 @@ void FGAdminUI::init() {
|
|||
dest = buf;
|
||||
|
||||
refresh_lists();
|
||||
|
||||
progress->minimum( min_progress );
|
||||
progress->maximum( max_progress );
|
||||
}
|
||||
|
||||
// show our UI
|
||||
|
@ -180,6 +185,8 @@ void FGAdminUI::update_install_box() {
|
|||
}
|
||||
|
||||
delete [] sort_list;
|
||||
|
||||
install_box->redraw();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -196,7 +203,13 @@ void FGAdminUI::update_remove_box() {
|
|||
ulDir *dir = ulOpenDir( dest.c_str() ) ;
|
||||
ulDirEnt *ent;
|
||||
while ( ent = ulReadDir( dir ) ) {
|
||||
if ( strcmp(ent->d_name, ".") && strcmp(ent->d_name, "..") ) {
|
||||
if ( strlen(ent->d_name) != 7 ) {
|
||||
// simple heuristic to ingore non-scenery directories
|
||||
} else if ( ent->d_name[0] != 'e' && ent->d_name[0] != 'w' ) {
|
||||
// further sanity checks on name
|
||||
} else if ( ent->d_name[4] != 'n' && ent->d_name[4] != 's' ) {
|
||||
// further sanity checks on name
|
||||
} else {
|
||||
dir_list.push_back( ent->d_name );
|
||||
}
|
||||
}
|
||||
|
@ -216,6 +229,8 @@ void FGAdminUI::update_remove_box() {
|
|||
}
|
||||
|
||||
delete [] sort_list;
|
||||
|
||||
remove_box->redraw();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -224,6 +239,9 @@ void FGAdminUI::update_remove_box() {
|
|||
void FGAdminUI::install_selected() {
|
||||
char *f;
|
||||
|
||||
install_b->deactivate();
|
||||
remove_b->deactivate();
|
||||
|
||||
// traverse install box and install each item
|
||||
for ( int i = 0; i <= install_box->nitems(); ++i ) {
|
||||
if ( install_box->checked( i ) ) {
|
||||
|
@ -231,15 +249,21 @@ void FGAdminUI::install_selected() {
|
|||
SGPath file( source );
|
||||
file.append( f );
|
||||
cout << "installing " << file.str() << endl;
|
||||
tarextract( (char *)file.c_str(), (char *)dest.c_str(), true, 0 );
|
||||
progress->value( min_progress );
|
||||
main_window->cursor( FL_CURSOR_WAIT );
|
||||
tarextract( (char *)file.c_str(), (char *)dest.c_str(), true, &FGAdminUI::step, this );
|
||||
progress->value( min_progress );
|
||||
main_window->cursor( FL_CURSOR_DEFAULT );
|
||||
}
|
||||
}
|
||||
install_b->activate();
|
||||
remove_b->activate();
|
||||
|
||||
refresh_lists();
|
||||
}
|
||||
|
||||
|
||||
static void remove_dir( const char *dir_name ) {
|
||||
static void remove_dir( const char *dir_name, void (*step)(void*), void *data ) {
|
||||
ulDir *dir = ulOpenDir( dir_name ) ;
|
||||
ulDirEnt *ent;
|
||||
while ( ent = ulReadDir( dir ) ) {
|
||||
|
@ -250,11 +274,12 @@ static void remove_dir( const char *dir_name ) {
|
|||
} else if ( ent->d_isdir ) {
|
||||
SGPath child( dir_name );
|
||||
child.append( ent->d_name );
|
||||
remove_dir( child.c_str() );
|
||||
remove_dir( child.c_str(), step, data );
|
||||
} else {
|
||||
SGPath child( dir_name );
|
||||
child.append( ent->d_name );
|
||||
unlink( child.c_str() );
|
||||
if (step) step( data );
|
||||
}
|
||||
}
|
||||
ulCloseDir( dir );
|
||||
|
@ -266,17 +291,42 @@ static void remove_dir( const char *dir_name ) {
|
|||
void FGAdminUI::remove_selected() {
|
||||
char *f;
|
||||
|
||||
install_b->deactivate();
|
||||
remove_b->deactivate();
|
||||
// traverse remove box and recursively remove each item
|
||||
for ( int i = 0; i <= remove_box->nitems(); ++i ) {
|
||||
if ( remove_box->checked( i ) ) {
|
||||
f = remove_box->text( i );
|
||||
SGPath dir( dest );
|
||||
dir.append( f );
|
||||
progress->value( min_progress );
|
||||
main_window->cursor( FL_CURSOR_WAIT );
|
||||
cout << "removing " << dir.str() << endl;
|
||||
remove_dir( dir.c_str() );
|
||||
remove_dir( dir.c_str(), &FGAdminUI::step, this );
|
||||
progress->value( min_progress );
|
||||
main_window->cursor( FL_CURSOR_DEFAULT );
|
||||
}
|
||||
}
|
||||
install_b->activate();
|
||||
remove_b->activate();
|
||||
|
||||
refresh_lists();
|
||||
|
||||
}
|
||||
|
||||
|
||||
void FGAdminUI::step(void *data)
|
||||
{
|
||||
Fl_Progress *p = ((FGAdminUI*)data)->progress;
|
||||
|
||||
// we don't actually know the total work in advanced due to the
|
||||
// nature of tar archives, and it would be inefficient to prescan
|
||||
// the files, so just cycle the progress bar until we are done.
|
||||
float tmp = p->value() + 1;
|
||||
if ( tmp > max_progress ) {
|
||||
tmp = 0.0;
|
||||
}
|
||||
p->value( tmp );
|
||||
|
||||
Fl::check();
|
||||
}
|
||||
|
|
|
@ -1166,7 +1166,7 @@ static int matchname (int arg,int argc,char **argv,char *fname)
|
|||
|
||||
/* Tar file list or extract */
|
||||
|
||||
static int tar (Readable* rin,int action,int arg,int argc,char **argv, char const* TGZfile, int verbose, void (*step)(void)) {
|
||||
static int tar (Readable* rin,int action,int arg,int argc,char **argv, char const* TGZfile, int verbose, void (*step)(void *), void *data) {
|
||||
union tar_buffer buffer;
|
||||
int is_tar_ok=0;
|
||||
int len;
|
||||
|
@ -1341,7 +1341,7 @@ static int tar (Readable* rin,int action,int arg,int argc,char **argv, char cons
|
|||
outfile = NULL;
|
||||
utime(fname,&settime);
|
||||
#endif
|
||||
if (step) step();
|
||||
if (step) step(data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1440,7 +1440,7 @@ int main(int argc,char **argv) {
|
|||
case 3: fprintf(stderr, "%s: not a tar file: %s\n", prog, TGZfile); return 1;
|
||||
case 4: fprintf(stderr, "%s: cannot open tar file: %s\n", prog, TGZfile); return 1;
|
||||
}
|
||||
return tar(&r, action, arg, argc, argv, TGZfile, 1, 0);
|
||||
return tar(&r, action, arg, argc, argv, TGZfile, 1, 0, 0);
|
||||
default: error("Unknown option!");
|
||||
}
|
||||
return 0;
|
||||
|
@ -1448,7 +1448,7 @@ int main(int argc,char **argv) {
|
|||
#endif
|
||||
|
||||
void
|
||||
tarextract(char *TGZfile,char *dest,int verbose, void (*step)(void))
|
||||
tarextract(char *TGZfile,char *dest,int verbose, void (*step)(void *), void *data)
|
||||
{
|
||||
Readable r;
|
||||
if (xOpen4Read(&r,TGZfile) == 0)
|
||||
|
@ -1459,6 +1459,6 @@ tarextract(char *TGZfile,char *dest,int verbose, void (*step)(void))
|
|||
chdir( dest );
|
||||
argv[0] = "fgadmin";
|
||||
argv[1] = TGZfile;
|
||||
tar(&r, TGZ_EXTRACT, arg, argc, argv, TGZfile, 0, step);
|
||||
tar(&r, TGZ_EXTRACT, arg, argc, argv, TGZfile, 0, step, data);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,4 +7,4 @@ using std::string;
|
|||
|
||||
// extract the specified tar file into the specified destination
|
||||
// directory
|
||||
extern "C" void tarextract( char *tarfile, char *destdir, int verbose, void (*step)(void) );
|
||||
extern "C" void tarextract( char *tarfile, char *destdir, int verbose, void (*step)(void*), void *data );
|
||||
|
|
|
@ -66,9 +66,10 @@
|
|||
Optimization="2"
|
||||
InlineFunctionExpansion="1"
|
||||
OmitFramePointers="TRUE"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
||||
AdditionalIncludeDirectories="..\..\..\..\fltk-1.1.4"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;HAVE_ZLIB"
|
||||
StringPooling="TRUE"
|
||||
RuntimeLibrary="4"
|
||||
RuntimeLibrary="2"
|
||||
EnableFunctionLevelLinking="TRUE"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
|
@ -78,8 +79,10 @@
|
|||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="fltk.lib Simgear.lib ul.lib comctl32.lib wsock32.lib zlib.lib"
|
||||
OutputFile="$(OutDir)/fgadmin.exe"
|
||||
LinkIncremental="1"
|
||||
AdditionalLibraryDirectories=""..\..\..\..\fltk-1.1.4\lib""
|
||||
GenerateDebugInformation="TRUE"
|
||||
SubSystem="1"
|
||||
OptimizeReferences="2"
|
||||
|
@ -106,32 +109,28 @@
|
|||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm">
|
||||
<File
|
||||
RelativePath="..\..\..\src\fgadmin.cxx">
|
||||
RelativePath="..\..\src\fgadmin.cxx">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\fgadmin_funcs.cxx">
|
||||
RelativePath="..\..\src\fgadmin_funcs.cxx">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\main.cxx">
|
||||
RelativePath="..\..\src\main.cxx">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\untarka.c">
|
||||
RelativePath="..\..\src\untarka.c">
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl;inc">
|
||||
<File
|
||||
RelativePath="..\..\..\src\fgadmin.h">
|
||||
RelativePath="..\..\src\fgadmin.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\..\src\tar_utils.hxx">
|
||||
RelativePath="..\..\src\untarka.h">
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Resource Files"
|
||||
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe">
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
|
|
Loading…
Reference in a new issue