Adonthell 0.4
|
00001 /* 00002 (C) Copyright 2000 Joel Vennin 00003 Part of the Adonthell Project http://adonthell.linuxgames.com 00004 00005 This program is free software; you can redistribute it and/or modify 00006 it under the terms of the GNU General Public License. 00007 This program is distributed in the hope that it will be useful, 00008 but WITHOUT ANY WARRANTY. 00009 00010 See the COPYING file for more details 00011 */ 00012 00013 #include "win_theme.h" 00014 #include "win_scrollbar.h" 00015 00016 00017 00018 win_scrollbar::win_scrollbar() 00019 { 00020 wsc_=NULL; 00021 00022 init(); 00023 00024 set_visible_scrollbar(true); 00025 00026 set_trans_scrollbar(false); 00027 00028 set_brightness_scrollbar(false); 00029 00030 refresh(); 00031 } 00032 00033 00034 win_scrollbar::win_scrollbar(win_scroll * wsc) 00035 { 00036 wsc_=wsc; 00037 00038 init(); 00039 00040 set_visible_scrollbar(true); 00041 00042 set_trans_scrollbar(false); 00043 00044 set_brightness_scrollbar(false); 00045 00046 refresh(); 00047 } 00048 00049 00050 win_scrollbar::win_scrollbar(win_scrollbar & ws) 00051 { 00052 wsc_=NULL; 00053 00054 init(); 00055 00056 set_visible_scrollbar(true); 00057 00058 set_trans_scrollbar(false); 00059 00060 set_brightness_scrollbar(false); 00061 00062 *this=ws; 00063 00064 refresh(); 00065 } 00066 00067 00068 win_scrollbar::win_scrollbar(char * rep) 00069 { 00070 wsc_=NULL; 00071 00072 init(); 00073 00074 set_visible_scrollbar(true); 00075 00076 set_trans_scrollbar(false); 00077 00078 set_brightness_scrollbar(false); 00079 00080 load(rep); 00081 00082 refresh(); 00083 } 00084 00085 win_scrollbar::~win_scrollbar() 00086 { 00087 destroy(); 00088 } 00089 00090 00091 void win_scrollbar::set_scrollbar(win_scrollbar & ws) 00092 { 00093 *this=ws; 00094 refresh(); 00095 } 00096 00097 void win_scrollbar::set_scrollbar(win_theme & wt) 00098 { 00099 *this=*(wt.scrollbar); 00100 refresh(); 00101 } 00102 00103 void win_scrollbar::init() 00104 { 00105 back_bot_=NULL; 00106 back_mid_=NULL; 00107 back_top_=NULL; 00108 bar_top_=NULL; 00109 bar_bot_=NULL; 00110 bar_mid_=NULL; 00111 bar_flex_=NULL; 00112 bar_=NULL; 00113 back_=NULL; 00114 bar_brightness_=NULL; 00115 back_brightness_=NULL; 00116 bar_draw_=NULL; 00117 back_draw_=NULL; 00118 } 00119 00120 win_scrollbar & win_scrollbar::operator=(win_scrollbar & wb) 00121 { 00122 destroy(); 00123 bar_top_=new image(); 00124 *bar_top_=*(wb.bar_top_); 00125 bar_mid_=new image(); 00126 *bar_mid_=*(wb.bar_mid_); 00127 bar_bot_=new image(); 00128 *bar_bot_=*(wb.bar_bot_); 00129 bar_flex_=new image(); 00130 *bar_flex_=*(wb.bar_flex_); 00131 00132 back_top_=new image(); 00133 *back_top_=*(wb.back_top_); 00134 back_mid_=new image(); 00135 *back_mid_=*(wb.back_mid_); 00136 back_bot_=new image(); 00137 *back_bot_=*(wb.back_bot_); 00138 00139 bar_=new image(); 00140 back_=new image(); 00141 bar_->set_mask(true); 00142 back_->set_mask(true); 00143 00144 00145 bar_brightness_ = new image(); 00146 back_brightness_ = new image(); 00147 bar_brightness_->set_mask(true); 00148 back_brightness_->set_mask(true); 00149 00150 update_back(); 00151 update_bar(); 00152 00153 return *this; 00154 } 00155 00156 00157 00158 void win_scrollbar::load(char * theme) 00159 { 00160 destroy(); 00161 char path[255];char tmp[255]; 00162 strcpy(path,WIN_DIRECTORY); 00163 strcat(path,WIN_SCROLLBAR_DIRECTORY); 00164 strcat(path,theme); 00165 00166 bar_=new image(); 00167 back_=new image(); 00168 bar_->set_mask(true); 00169 back_->set_mask(true); 00170 00171 bar_brightness_ = new image(); 00172 back_brightness_ = new image(); 00173 bar_brightness_->set_mask(true); 00174 back_brightness_->set_mask(true); 00175 00176 bar_top_=new image(); 00177 strcpy(tmp,path); 00178 strcat(tmp,WIN_SCROLLBAR_BAR_TOP); 00179 bar_top_->load_pnm(tmp); 00180 00181 bar_mid_=new image(); 00182 strcpy(tmp,path); 00183 strcat(tmp,WIN_SCROLLBAR_BAR_MID); 00184 bar_mid_->load_pnm(tmp); 00185 00186 bar_bot_=new image(); 00187 strcpy(tmp,path); 00188 strcat(tmp,WIN_SCROLLBAR_BAR_BOT); 00189 bar_bot_->load_pnm(tmp); 00190 00191 bar_flex_=new image(); 00192 strcpy(tmp,path); 00193 strcat(tmp,WIN_SCROLLBAR_BAR_FLEX); 00194 bar_flex_->load_pnm(tmp); 00195 00196 back_top_=new image(); 00197 strcpy(tmp,path); 00198 strcat(tmp,WIN_SCROLLBAR_BACK_TOP); 00199 back_top_->load_pnm(tmp); 00200 00201 back_mid_=new image(); 00202 strcpy(tmp,path); 00203 strcat(tmp,WIN_SCROLLBAR_BACK_MID); 00204 back_mid_->load_pnm(tmp); 00205 00206 back_bot_=new image(); 00207 strcpy(tmp,path); 00208 strcat(tmp,WIN_SCROLLBAR_BACK_BOT); 00209 back_bot_->load_pnm(tmp); 00210 } 00211 00212 void win_scrollbar::update_back() 00213 { 00214 if(!wsc_ || !back_) return; 00215 00216 back_->resize(back_mid_->length(),wsc_->height()); 00217 00218 00219 back_->tile(*back_mid_); 00220 00221 00222 //back_->putbox_img(back_top_,0,0); 00223 back_top_->draw(0,0,NULL,back_); 00224 00225 //back_->putbox_img(back_bot_,0,wsc_->height()-back_bot_->height()); 00226 back_bot_->draw(0,wsc_->height()-back_bot_->height(),NULL,back_); 00227 00228 00229 back_brightness_->brightness(*back_, WIN_BRIGHTNESS_LEVEL); 00230 00231 } 00232 00233 void win_scrollbar::refresh() 00234 { 00235 if(brightness_) 00236 { 00237 bar_draw_=bar_brightness_; 00238 00239 back_draw_=back_brightness_; 00240 } 00241 else 00242 { 00243 bar_draw_=bar_; 00244 00245 back_draw_=back_; 00246 } 00247 } 00248 00249 00250 void win_scrollbar::destroy() 00251 { 00252 if(back_bot_) delete back_bot_; 00253 00254 if(back_top_) delete back_top_; 00255 00256 if(back_mid_) delete back_mid_; 00257 00258 if(bar_bot_) delete bar_bot_; 00259 00260 if(bar_mid_) delete bar_mid_; 00261 00262 if(bar_top_) delete bar_top_; 00263 00264 if(bar_flex_) delete bar_flex_; 00265 00266 if(bar_) delete bar_; 00267 00268 if(back_) delete back_; 00269 00270 if(bar_brightness_) delete bar_brightness_; 00271 00272 if(back_brightness_) delete back_brightness_; 00273 } 00274 00275 00276 void win_scrollbar::update_bar() 00277 { 00278 if(!wsc_ || !bar_) return; 00279 if (!(wsc_->height() + wsc_->amplitude())) return; 00280 00281 u_int16 calcul = (wsc_->height() * wsc_->height()) / (wsc_->height() + wsc_->amplitude()); 00282 00283 //if(calcul == bar_->height() || bar_->height() == (bar_top_->height() + bar_mid_->height() + bar_bot_->height())) return; 00284 00285 if( calcul > bar_top_->height() + bar_mid_->height() + bar_bot_->height()) 00286 { 00287 00288 00289 bar_->resize(bar_top_->length(), calcul); 00290 00291 //bar_->putbox_tile_img( bar_flex_ ); 00292 bar_->tile(*bar_flex_); 00293 00294 //bar_->putbox_img(bar_top_,0,0); 00295 bar_top_->draw(0,0,NULL,bar_); 00296 00297 //bar_->putbox_img(bar_bot_, 0, bar_->height() - bar_bot_->height()); 00298 bar_bot_->draw(0,bar_->height() - bar_bot_->height(),NULL,bar_); 00299 00300 //bar_->putbox_img(bar_mid_,0,( bar_->height() - bar_mid_->height() ) >>1 ); 00301 bar_mid_->draw(0,(bar_->height() - bar_mid_->height() ) >> 1, NULL,bar_); 00302 } 00303 else 00304 { 00305 bar_->resize(bar_top_->length(), bar_top_->height() + bar_mid_->height() + bar_bot_->height()); 00306 00307 //bar_->putbox_img(bar_top_,0,0); 00308 bar_top_->draw(0,0,NULL,bar_); 00309 00310 //bar_->putbox_img(bar_bot_,0,bar_->height() - bar_bot_->height()); 00311 bar_bot_->draw(0,bar_->height() - bar_bot_->height(),NULL,bar_); 00312 00313 //bar_->putbox_img(bar_mid_,0,bar_top_->height()); 00314 bar_mid_->draw(0,bar_top_->height(),NULL,bar_); 00315 } 00316 bar_brightness_->brightness(*bar_,WIN_BRIGHTNESS_LEVEL); 00317 } 00318 00319 00320 void win_scrollbar::draw(drawing_area * da) 00321 { 00322 if(!visible_ || !back_draw_ || !bar_draw_) return; 00323 00324 back_draw_->draw(wsc_->real_x() + wsc_->length() - back_->length(), wsc_->real_y() , da ); 00325 00326 bar_draw_->draw(1 + wsc_->real_x() + wsc_->length() - back_->length(), wsc_->real_y() + wsc_->cursor_y() , da); 00327 } 00328 00329 00330 00331 00332 00333 00334 00335 00336 00337 00338 00339 00340 00341 00342 00343 00344 00345