[ROOT] button sensitivity

From: Galina Asova (assova@ifh.de)
Date: Tue Oct 07 2003 - 12:33:47 MEST


Hello,

I'm using ROOT 3.02/07 under SuSE Linux 7.2 for an application (gui) 
developing and I have a question concerning a button - it is not 
sensitive enough - I mean when one wants to stop a process (that's the 
aim of my button) he should see that the button really goes down (is 
pressed). Otherwise, if you just click on it, without paying attention 
does it sink, nothing happens - the process is still running. Does 
anybody have any idea what is the reason for this and how it can be done?
The attachment is the code I've written - ArchiveStatus.cpp and 
ArchiveStatus.h - concern the class which is doing all the stuff about 
the button and the small piece of code after is where I'm using 
ArchiveStatus.*.

ArchiveStatus *as = new ArchiveStatus(gClient->GetRoot(), 230, 80);
	Bool_t not_stop = kTRUE;
	while (gtime <= end){
		if (as->fCancel->IsDown()){
			as->fStop = kTRUE;
			not_stop = kFALSE;	
			break;
		}	

		Int_t skip = StepSize;
		Bool_t SetIsComplete = kTRUE;
		for (Int_t i=0; i < nr; i++) {
			TTFFloatData *d = FetchObj(list[i],i, gtime,skip, cntr, names, signs, 
values);
gtime, i, skip);
			if ( (d == NULL) || (d->EventTime() > end) || (d->bad()) ) {
				SetIsComplete = kFALSE;
				if (d != NULL) delete d;
				break;
			}
			else if (i == 0) ftime = d->EventTime();
			else if (ftime != d->EventTime()) {
				SetIsComplete = kFALSE;
				delete d;
				break;
			}
			*data[i] = *d;
			delete d;
		}

		if (SetIsComplete) {
			all++;
			TTFFCp *FC = new TTFFCp[cntr];
			for (int j = 0; j < cntr; j++)
			{
				FC[j] = new TTFFetchCache();
				PosCacheCon[j] = 0;	
			}	
			Bool_t full_set = kTRUE;
			for (int j = 0; j < cntr; j++){
				TTFFloatData 
*cfe=ConditionFileEvent(names[j],signs[j],values[j],j,gtime,skip, FC[j],
				p);
				
				if ((cfe == NULL) || (cfe->bad()) || (cfe->EventTime() > end))
				{
					full_set = kFALSE;
					if (cfe != NULL) delete cfe;
					if (FC[j] != NULL) delete FC[j];
					break;
				}
				if (cfe->EventTime() != data[0]->EventTime())
				{
					full_set = kFALSE;
					delete cfe;
					if (FC[j] != NULL) delete FC[j];
					break;
				}
				delete cfe;
				cfe = NULL;				
				delete FC[j];	
				
			}	
			if (full_set){
				tree->Fill();
				++counter;
				gtime = data[0]->EventTime();
				SetEventsNumber(counter);

				if (not_stop)			 
as->RunFilter(TTFEventTime::Diff(gtime,begin)*100/iInterval);

			}		
			delete[] FC;
		}

		for (Int_t j=0; j < nr; j++) data[j]->Reset();
		if (skip == -1) {
			std::cerr << "Fatal error, aborting." << endl;
			break;
		}
		gtime += skip;
		gSystem->ProcessEvents();
	}

	for (int i = 0; i < nr; i++) delete fCache[i];
	
	if (not_stop) as->CloseWindow();
//============ArchiveStatus.h

#ifndef __ArchiveStatus_h__
#define __ArchiveStatus_h__


#include <TGFrame.h>
#include <TGClient.h>
#include <TGButton.h>
#include <TGProgressBar.h>

#include "TTFConstant.h"

const char PROGRESS_TITLE[] = "Estimated time";

enum ProgressBarWidgets
{
	BT_STOP
};

class ArchiveStatus: public TGMainFrame{
	
	private:
                 TGHorizontalFrame *fHorFr;
                 TGVerticalFrame *fVerFr;
                 TGLayoutHints *fHint, *fHint1;

         public:

                 TGHProgressBar *fBar;
		TGTextButton *fCancel;
		Bool_t fStop;

                 ArchiveStatus(const TGWindow *p, UInt_t w, UInt_t h);
                 ~ArchiveStatus();

                 void CloseWindow(void);
		void FrameClose(void);
		void RunFilter(Int_t increment);
		//Bool_t ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2);
                 inline void ResetBar(void) {fBar->Reset();};

         ClassDef(ArchiveStatus,1)

};

#endif


//============ArchiveStatus.cpp

#include <stdlib.h>
#include <iostream>
#include "TTFTransBuffer.h"
#include "ArchiveStatus.h"
#include <TGFrame.h>

ClassImp(ArchiveStatus);

ArchiveStatus::ArchiveStatus(const TGWindow *p, UInt_t w, UInt_t h): 
TGMainFrame(p, w, h)
{
	
	fStop = kFALSE;
	fHorFr = new TGHorizontalFrame(this, w, 40, kFixedWidth);
	fVerFr = new TGVerticalFrame(this, w, 70, kFixedWidth);

	fBar = new TGHProgressBar (fVerFr, TGProgressBar::kStandard, 200);
	fBar->ShowPosition();
	fBar->SetBarColor("lightblue");
	
	fCancel = new TGTextButton(fVerFr, "Stop filter", BT_STOP);
	fCancel->Connect("Clicked()", "ArchiveStatus", this, "FrameClose()");
		
	fHint = new TGLayoutHints(kLHintsCenterX|kLHintsExpandX | 
kLHintsCenterY,10,5,10,0);
	fHint1 = new TGLayoutHints(kLHintsCenterX|kLHintsExpandX | 
kLHintsCenterY,60,60,15,0);
	fVerFr->Resize(230, 130);
	
	fHorFr->AddFrame(fBar, fHint);
	fVerFr->AddFrame(fBar, fHint);
	fVerFr->AddFrame(fCancel, fHint1);
	AddFrame(fVerFr);
	
	
	MapSubwindows();
	Layout();
	SetWindowName(PROGRESS_TITLE);
	SetIconName("ArchiveStatus");
	MapWindow();

}

ArchiveStatus::~ArchiveStatus()
{
    delete fHint;
    delete fBar;
    delete fHorFr;
  }

void ArchiveStatus::CloseWindow()
{
         SendCloseMessage();
	delete this;
}

void ArchiveStatus::FrameClose(void)
{
	cout << "Archive Filter aborted!" << endl;
	if (fStop) SendCloseMessage();
}

void ArchiveStatus::RunFilter(Int_t increment)
{
	fBar->SetPosition(increment);
}



This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:16 MET