<?

// попытка генерировать события
// пока просто сборище функций
class Ui_events {

	static function change_disk() {
		GLOBAL $Graphs, $OP, $INFO;

		// в данном месте это служит как установка значений в info после загрузки новых настроек.
		// если на этот диск еще не заходили то тем более надо проинициализировать настройки.
//		Stat::process_clear();
		
		// сбрасываем максимальное значение столбца
		$Graphs['frags']->set_max_value(5);
		$Graphs['speed']->set_max_value(5);
		// график диска сам пересчитается при загрузке полей
		
		//$log->line('Размер info[frags]: ' . sizeof($INFO['frags']));

		// включаем все поля в легенде диска
		// какие надо, выключим 
		// userfiles контролируются полями, его не трогаем
		// $Graphs['disk']->legend->visible(GRD_good_write, 1);
		// $Graphs['disk']->legend->visible(GRD_slow_auto, 1);
		// $Graphs['disk']->legend->visible(GRD_read_err, 1);
		// $Graphs['disk']->legend->visible(GRD_create_err, 1);
		// $Graphs['disk']->legend->visible(GRD_frag, 1);
		// $Graphs['disk']->legend->visible(GRD_all_slow, 1);
		// $Graphs['disk']->legend->visible(GRD_result_space, 1);
		
		// переходим на create_blocks если не указан другой этап
		if(!isset($INFO['step']) OR $INFO['step'] == 'select_disc') {
			$INFO['step'] = 'create_blocks';
		}

		// да, именно здесь. Потому что onChange самого чекбокса может сработать до инициализации INFO и OP что не правильно.
		Ui_create_blocks::change_part_size();

		// если не демо, но диск был обработан в демо режиме, то можно повторить этап "финальные операции" для обработки остальных блоков
		/*
		if($INFO['step'] == 'final' and $INFO['demo_overlimit']) {
			c('dlPause')->execute();
			//$bt = new Bt_repeat('final_operations');
			//$bt->onClick();
		}*/

		// сбрасываем предыдущий этап текущей сесси, потому что она только началась
		$INFO['session_prev_step'] = '';
	}


	static function every_tick() {
		GLOBAL $log, $INFO, $OP, $Ui_thread;

		// видимость сообщений в левой панели
		Left_panel::view_messages();


		//активация кнопок остановки этапа и пропустить
		if(!empty($INFO['one_thread_can_stop'])) {
			if(!c('Fm->bt_run')->enabled) {
				//$log->line('включаем кнопку');
				c('Fm->bt_run')->enabled = true;
				c('Fm->bt_skip_files')->enabled = true;
				c('Fm->bt_step_reset')->enabled = true;
			}
		}


		// выходит ли курсор за пределы главной формы
		$form = c('Fm');
		$mouse_x = cursor_pos_x();
		$mouse_y = cursor_pos_y();

		if(($mouse_x < $form->x or $mouse_x >  $form->x +  $form->w)
			OR
		   ($mouse_y < $form->y or $mouse_y >  $form->y +  $form->h)) {
			Ui_mouse_event::outRootForm();
		}


		
	}

	// активация этапа
	// вызывается после active у ui_create_blocks::active () итд
	static function active() {
		GLOBAL $INFO, $OP, $GOP, $Ui_thread, $Graphs, $Lang, $Bt_run, $Ui_steps_story, $log, $setting;

		// ГЛЮЧИТ. Иногда поток не запускается, хотя должен. Очевидно виноват one_thread_working, хотя вроде везде прописан корректно
		// автозапуск потока только если на нем вылетела программа
		// скорее всего баг был в том что key мог быть нулем. Но это не точно
		// if($key = array_search('crash_restore', $GLOBALS['argv'])) {
		// 	unset($GLOBALS['argv'][$key]);
			
		// 	// если процесс не запущен, но в one_thread_working указано что запущен, значит программа зависла при работе, и поток надо запускать
		// 	if(!$Ui_thread->check_run() and !empty($INFO['one_thread_working'])) {
		// 		$Bt_run->start($INFO['step']);
		// 	}
		// }

		//logFile(serialize($GLOBALS['argv']));

		// специально делаем это не в условии которое ниже, мало ли ситуации бывают.
		// при удалении не которые файлы могут не удаляться, потому что не закрыли их хенделы
		// в таком случае мы перезагрузим программу. А здесь защита от бесконечной перезагрузки
		// если программа уже была перезагружена для удаления, второй раз не перезагружаем
		$key = array_search('clear_disk_prog_restart', $GLOBALS['argv']);
		if($key !== false) {
			//logFile(serialize($GLOBALS['argv']));
			$clear_disk_prog_restart = 1;
			unset($GLOBALS['argv'][$key]);
		}
		else $clear_disk_prog_restart = 0;

		$INFO['clear_disk_prog_restart_is_have'] = $clear_disk_prog_restart;
		$setting->edit_recovery_info_if_exist(array('clear_disk_prog_restart_is_have'=>$clear_disk_prog_restart)); //

		// автозапуск потока если программа вылетела
		// то что программа вызывается с параметром crash_restore, уже говорит что поток надо запустить, так что это неплохой алгоритм
		$key = array_search('crash_restore', $GLOBALS['argv']);
		if($key !== false) {
			unset($GLOBALS['argv'][$key]);

			if(!$Ui_thread->check_run()) {
				
				if($INFO['step'] == CREATE_BLOCKS AND empty($INFO['create_blocks.mode_onli_cleaning'])) {
					logFile('1');
					if($INFO['procent'] > 0 OR $clear_disk_prog_restart) {
						logFile('2');
						$Bt_run->start($INFO['step']);
					}
				}
				elseif($INFO['step'] != FINAL_BLOCKS) {
					$Bt_run->start($INFO['step']);
				}
			}
		}

		// запуск в случае если была прервана очистка папки
		if(!empty($INFO['create_blocks.mode_onli_cleaning'])) {
			$log->line('UI_events: Установлен режим очистки');
			if(!$Ui_thread->check_run()) {
				$log->line('поток не запущен, значит запускаем в режиме очистки');
				$Bt_run->start(CREATE_BLOCKS);
			}

		}


	}


	// вызывается до активации этапа
	static function change_step($last_step, $new_step) {
		GLOBAL $INFO, $OP, $GOP, $Graphs, $Lang, $Bt_run, $Ui_steps_story;
		
		// выключаем подсветку кнопки завершающий этап
		visible_group('next_analize_blocks', false);


		// КОСТЫЛЬ. если программа вылетела в процессе работы, эта метка остается
		// хотя поток уже не работает. И чтобы таймер не тикал при перезагрузке программы, удаляем метку
		$INFO['start_time_thread'] = false;

		// ползунки графиков. вкл/выкл
		// блокируем ползунки в том числе на этапе чтения. Люди могут считать что они на что-то влияют и дергать их. А еще они сбрасываются когда люди во время работы потока их дергают (точнее при нажатии на паузу и потом продолжения)
		if($new_step == ANALIZE_BLOCKS)
			$enabled = true;
		else $enabled = false;
		c('Fm->speed_select_bar')->enabled = $enabled;
		c('Fm->frags_select_bar')->enabled = $enabled;
		

		// на этапе анализа, не надо показывать статистику этапа. Это только введет человека в заблуждение что он не пройден
		// она будет автоматом показываться при запуске анализа
		if($new_step == ANALIZE_BLOCKS)
			 $view = false;
		else $view = true;
		//c('Fm->step_stat')->visible = $view;
		$GLOBALS['GB_step_stat']->enabled($view);
		
		
		// === скрываем кнопку сначала и запуск если этап анализ ===
		if($new_step == ANALIZE_BLOCKS or $new_step == FINAL_BLOCKS)
			 $run_and_reset = false;
		else $run_and_reset = true;

		c('Fm->bt_run')->visible = $run_and_reset;
		c('Fm->bt_step_reset')->visible = $run_and_reset;

		// оформление кнопки run, доступность кнопки reset
		Ui_over::visual_bts_run_and_reset();


		// показ блока с процентами и временем
		if($new_step == FINAL_BLOCKS)
			 $view_times_and_proc = false;
		else $view_times_and_proc = true;

		// костыль DS связанный с видимостью дочернего и родительских панелей
		// убираем видимость
		if($view_times_and_proc == false) {
			с('Fm->msg_disk_full_test_files')->visible = false;
			c('Fm->msg_optimizate_no_finish')->visible = false;
		}

		с('Fm->pn_cur_step_stat')->visible = $view_times_and_proc;


		// Костыль. Меняем цвет графика диска
		// если запись, фон один.
		// на всех остальных этапах фон совпадает с цветом тестовых блоков
		if($new_step == CREATE_BLOCKS)
			 $color_bg = $GOP['graph_disk']['def_bg'];
		else $color_bg = $GOP['graph_disk']['colors'][GRD_good_write][0];

		//$log->line("меняем цвет фона: $color_bg ");
		$Graphs['disk']->active_bg = $color_bg;
		$Graphs['disk']->redraw_all();


		// видимость плашки под полем "всего получите" в графике диска
		if($new_step == CREATE_BLOCKS)
			$view = false;
		else $view = true;
		c('Fm->disk_result_space_bg')->visible = $view;

		// общая кнопка "пропустить остальные сектора"
		if($new_step == CREATE_BLOCKS)
			 $view = true;
		else $view = false;			
		c('Fm->bt_skip_nextall')->visible = $view;

		// активность кнопки отправки результата оптимизации
		$bt_name = 'bt_send_result'; 
		if($new_step == FINAL_BLOCKS) {
			visible_group($bt_name, true);
			c('Fm->'.$bt_name)->enabled = true;
		}
		else {
			visible_group($bt_name, false);
			c('Fm->'.$bt_name)->enabled = false;
		}


		// панель с описанием этапа и настройками
		if($new_step != SELECT_DISC) {
			// скрываем все панели
			foreach(Steps_info::$data as $step_name=>$info) {
				if($step_name == SELECT_DISC) continue;

				$details = c('Fm->details_'.$step_name);
				$details->visible = false;
				$details->enabled = false;
			}
			// показываем нужную
			$cur_details = c('Fm->details_'.$new_step);
			$cur_details->x = 0;
			$cur_details->y = 172 * Ui_adapt_size::$pxRatio;
			$cur_details->visible = true;
			$cur_details->enabled = true;
			$cur_details->bevelOuter = bvNone;
			$cur_details->toFront(); // чтобы на этапе анализа, перекрыть пустое пространство панели статистики
			c('Fm->pn_setting')->toFront(); // чтобы панель настроек, если она открыта, этап не перекрыл частично
			Hint::toFront();
			// смещаем панель статистики
			// если это этап подбора параметров, надо сместить выше потому что кнопок запуска нет
			// панель описания перекроет часть панели статистики и не будет дырки
			if($new_step == ANALIZE_BLOCKS)
				$offset_y = -25;
			else $offset_y = 0;

			$pn_stat = с('Fm->pn_cur_step_stat');
			$pn_stat->y = $cur_details->y + $cur_details->h + $offset_y;
			$pn_stat->bevelOuter = bvNone;

			// включаем/выключаем статистику этапа
			$pn_stat->enabled = ($new_step == FINAL_BLOCKS) ? 
										false:
										true;
		}

		// информация справа в зависимости от этапа
		if($new_step == SELECT_DISC or $new_step == CREATE_BLOCKS) {
			$view_graphs = false;
			$view_create_blocks = true;
		}
		else {
			$view_graphs = true;
			$view_create_blocks = false;
		}
		// панель для чтения файлов
		$info_create_blocks = c('Fm->info_create_blocks');
		$info_create_blocks->visible = $view_create_blocks;

		// лютый костыль, баг DS
		// если графики скрывает, то скрываем и сообщения, причем перед скрытие графика
		//иначе видимость у сообщения собъется и его именение не привидит к визуальному скрытью/показу сообщения
		if($view_graphs == false) {
			c('Fm->grSpeed_msgfrag')->visible = false;
		}

		// графики чтения и размера фрагментов
		$gr_speed = с('Fm->graph_speed_wrap');
		$gr_frags = с('Fm->graph_frags_wrap');
		$gr_speed->visible = $view_graphs;
		$gr_frags->visible = $view_graphs;

		// // указываем имя этапа 
		// $step_stat = c('cur_step_groupBox');

		// $lang_key = Steps_info::$data[$new_step]['lang_name'];
		// $step_title = $Lang->get($lang_key);
		// $step_stat->caption = "Для этапа: $step_title";

		// // включаем/выключаем статистику этапа
		// $step_stat->enabled = ($new_step == FINAL_BLOCKS) ? 
		// 							false:
		// 							true;

	}


}


?>