mirror of https://github.com/BOINC/boinc.git
119 lines
3.4 KiB
C++
119 lines
3.4 KiB
C++
// Berkeley Open Infrastructure for Network Computing
|
|
// http://boinc.berkeley.edu
|
|
// Copyright (C) 2005 University of California
|
|
//
|
|
// This is free software; you can redistribute it and/or
|
|
// modify it under the terms of the GNU Lesser General Public
|
|
// License as published by the Free Software Foundation;
|
|
// either version 2.1 of the License, or (at your option) any later version.
|
|
//
|
|
// This software 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 Lesser General Public License for more details.
|
|
//
|
|
// To view the GNU Lesser General Public License visit
|
|
// http://www.gnu.org/copyleft/lesser.html
|
|
// or write to the Free Software Foundation, Inc.,
|
|
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
#if defined(__GNUG__) && !defined(__APPLE__)
|
|
#pragma implementation "sg_ProgressBar.h"
|
|
#endif
|
|
|
|
#include "stdwx.h"
|
|
#include "sg_SkinClass.h"
|
|
#include "sg_ImageLoader.h"
|
|
#include "sg_ProgressBar.h"
|
|
|
|
BEGIN_EVENT_TABLE(CProgressBar, wxWindow)
|
|
EVT_ERASE_BACKGROUND(CProgressBar::OnEraseBackground)
|
|
END_EVENT_TABLE()
|
|
|
|
CProgressBar::CProgressBar(wxPanel* parent,wxPoint coord) : wxPanel(parent, wxID_ANY, coord, wxSize(258,18), wxNO_BORDER)
|
|
{
|
|
indicatorWidth = 8;
|
|
indicatorHeight = 7;
|
|
numOfIndic = 30;
|
|
rightPosition = 9;
|
|
topPosition = 5;
|
|
m_progress = 0;
|
|
numOfProgressInd = 0;
|
|
LoadSkinImages();
|
|
}
|
|
void CProgressBar::LoadSkinImages()
|
|
{
|
|
//app skin class
|
|
appSkin = SkinClass::Instance();
|
|
wxString dirPref = appSkin->GetSkinsFolder()+_T("/")+appSkin->GetSkinName()+_T("/");
|
|
//bg
|
|
g_gaugeBg = new wxImage(dirPref + appSkin->GetGaugeBg(), wxBITMAP_TYPE_PNG);
|
|
m_gaugeBG = wxBitmap(g_gaugeBg);
|
|
// indicator
|
|
g_gaugeInd = new wxImage(dirPref + appSkin->GetGaugeProgressInd(), wxBITMAP_TYPE_PNG);
|
|
|
|
}
|
|
void CProgressBar::SetValue(double progress)
|
|
{
|
|
// clrear prior indicators
|
|
ClearIndicators();
|
|
|
|
m_progress = progress;
|
|
numOfProgressInd = progress /(100/numOfIndic);
|
|
|
|
for(int indIndex = 0; indIndex < numOfProgressInd; indIndex++){
|
|
ImageLoader *i_ind = new ImageLoader(this);
|
|
i_ind->Move(wxPoint(rightPosition +((indicatorWidth)*indIndex),topPosition));
|
|
i_ind->LoadImage(g_gaugeInd);
|
|
m_progInd.push_back(i_ind);
|
|
}
|
|
}
|
|
void CProgressBar::UpdateValue(double progress)
|
|
{
|
|
// if updating with smaller value clear indicators first
|
|
if(m_progress>progress){
|
|
ClearIndicators();
|
|
}
|
|
m_progress = progress;
|
|
int currProg = progress /(100/numOfIndic);
|
|
if(numOfProgressInd < currProg){
|
|
for(int indIndex = numOfProgressInd; indIndex < currProg; indIndex++){
|
|
wxWindow *w_ind=new wxWindow(this,-1,wxPoint(rightPosition +((indicatorWidth)*indIndex),topPosition),wxSize(indicatorWidth,indicatorHeight));
|
|
ImageLoader *i_ind = new ImageLoader(w_ind);
|
|
i_ind->LoadImage(g_gaugeInd);
|
|
numOfProgressInd = progress /(100/numOfIndic);
|
|
}
|
|
}
|
|
}
|
|
void CProgressBar::ReskinInterface()
|
|
{
|
|
LoadSkinImages();
|
|
|
|
SetValue(m_progress);
|
|
|
|
|
|
}
|
|
void CProgressBar::ClearIndicators()
|
|
{
|
|
for(int indIndex = 0; indIndex < numOfProgressInd; indIndex++){
|
|
delete m_progInd.at(indIndex);
|
|
}
|
|
//clear vector
|
|
if(m_progInd.size() > 0){
|
|
m_progInd.clear();
|
|
}
|
|
}
|
|
void CProgressBar::OnEraseBackground(wxEraseEvent& event){
|
|
|
|
event.Skip(false);
|
|
wxDC *dc;
|
|
dc=event.GetDC();
|
|
dc->SetBackground(wxBrush(this->GetBackgroundColour(),wxSOLID));
|
|
dc->Clear();
|
|
if(m_gaugeBG.Ok())
|
|
{
|
|
dc->DrawBitmap(m_gaugeBG, 0, 0);
|
|
}
|
|
|
|
}
|