Esempio n. 1
0
        private async void StartSearch(object sender, EventArgs e)
        {
            if (System.IO.Directory.Exists(pathTextBox.Text) || allDrivesCheckBox.Checked)
            {
                //формирование критериев поиска
                Date            date    = null;
                ISO             iso     = null;
                ExposureProgram ep      = ExposureProgram.Any;
                Orientation     or      = Orientation.Any;
                ExposureTime    et      = null;
                bool            isDSC   = false;
                string          camName = null;
                bool            isManualWhiteBalance = false;
                bool            isFlashOn            = false;
                bool            isGPS  = false;
                bool            isEdit = false;
                //---------------------------------


                searchSettings.Clear();



                //------ДАТА
                if (datesCheckBox.Checked == true)
                {
                    if (endDateTimePicker.Value.Date < startDateTimePicker.Value.Date)
                    {
                        MessageBox.Show("Неверно выставлены настройки поиска по дате. Пожалуйста исправьте.");
                        return;
                    }
                    searchSettings.AppendLine("Поиск по датам: " + startDateTimePicker.Value.ToShortDateString() + " - " + endDateTimePicker.Value.ToShortDateString());
                    date = new Date(startDateTimePicker.Value.Date, endDateTimePicker.Value.Date);
                }
                //-----ISO
                if (ISOCheckBox.Checked)
                {
                    uint minISO;
                    uint maxISO;
                    bool isMinISOCorrect = uint.TryParse(minISOTextBox.Text, out minISO);
                    bool isMaxISOCorrect = uint.TryParse(maxISOTextBox.Text, out maxISO);
                    if (isMinISOCorrect == true && isMaxISOCorrect == true)
                    {
                        if (maxISO < minISO)
                        {
                            MessageBox.Show("Неверно выставлены настройки поиска по ISO. Пожалуйста исправьте.");
                            return;
                        }
                        if (maxISO > uint.MaxValue)
                        {
                            MessageBox.Show("Неверно выставлены настройки поиска по ISO. Пожалуйста исправьте.");
                            return;
                        }

                        searchSettings.AppendLine("Поиск по ISO: " + minISO + " - " + maxISO);
                        iso = new ISO(minISO, maxISO);
                    }
                    else
                    {
                        MessageBox.Show("Неверно выставлены настройки поиска по ISO. Пожалуйста исправьте.");
                        return;
                    }
                }
                //-----ВЫДЕРЖКА
                if (ExposureTimeCheckBox.Checked)
                {
                    Rational minExposureTime;
                    Rational maxExposureTime;
                    bool     isMinValueCorrect = GetRationalFromString(minExposureTimeTextBox.Text, out minExposureTime);
                    bool     isMaxValueCorrect = GetRationalFromString(maxExposureTimeTextBox.Text, out maxExposureTime);
                    if (isMinValueCorrect == true && isMaxValueCorrect == true)
                    {
                        //теперь проверим на нижние и верхние границы

                        double min = minExposureTime.ToDouble();
                        double max = maxExposureTime.ToDouble();

                        if (!(min <= max + double.Epsilon))
                        {
                            MessageBox.Show("Неверно выставлены настройки поиска по выдержке. Пожалуйста исправьте.");
                            return;
                        }
                        searchSettings.AppendLine("Поиск по выдержке: " + minExposureTime.ToSimpleString() + " - " + maxExposureTime.ToSimpleString());
                        et = new ExposureTime(minExposureTime, maxExposureTime);
                    }
                    else
                    {
                        MessageBox.Show("Неверно выставлены настройки поиска по выдержке. Пожалуйста исправьте.");
                        return;
                    }
                }
                //---МОДЕЛЬ КАМЕРЫ

                if (cameraCheckBox.Checked)
                {
                    if (!string.IsNullOrWhiteSpace(CameraTextBox.Text))
                    {
                        camName = CameraTextBox.Text.Trim().Split(' ')[0];
                        searchSettings.AppendLine("Поиск по модели камеры: " + camName);
                    }
                    else
                    {
                        MessageBox.Show("Неверно выставлены настройки поиска по производителю камеры. Пожалуйста исправьте.");
                        return;
                    }
                }

                if (WhiteBalanceСheckBox.Checked)
                {
                    isManualWhiteBalance = true;
                    searchSettings.AppendLine("Поиск снимков с ручным балансом белого");
                }

                if (flashOnCheckBox.Checked)
                {
                    isFlashOn = true;
                    searchSettings.AppendLine("Поиск снимков со вспышкой");
                }

                if (gpsCheckBox.Checked)
                {
                    isGPS = true;
                    searchSettings.AppendLine("Поиск снимков с геоданными");
                }
                if (EditCheckBox.Checked)
                {
                    isEdit = true;
                    searchSettings.AppendLine("Поиск редактированных снимков");
                }
                if (ExposureProgramCheckBox.Checked)
                {
                    if (exposureProgramComboBox.SelectedIndex == -1)
                    {
                        MessageBox.Show("Неверно выставлены настройки поиска по программе управления экспозицией. Пожалуйста исправьте.");
                        return;
                    }
                    ep = (ExposureProgram)exposureProgramComboBox.SelectedIndex + 1;
                }

                //источник изображения

                if (DSCCheckBox.Checked)
                {
                    isDSC = true;
                    searchSettings.AppendLine("Поиск изображений сделанных только на фотоаппарат");
                }


                if (orientationСheckBox.Checked)
                {
                    int sel = orientationComboBox.SelectedIndex;
                    if (sel == -1)
                    {
                        MessageBox.Show("Неверно выставлены настройки поиска по ориентации. Пожалуйста исправьте.");
                        return;
                    }
                    switch (sel)
                    {
                    case 0:
                        or = Orientation.Horizonatal;
                        break;

                    case 1:
                        or = Orientation.Vertical;
                        break;
                    }
                }

                if (allDrivesCheckBox.Checked)
                {
                    searchSettings.AppendLine("Поиск изображений: весь компьютер");
                    finder = new Search(!skipWinDirectoryCheckBox.Checked);
                }
                else
                {
                    searchSettings.AppendLine("Поиск изображений в: " + pathTextBox.Text);
                    finder = new Search(pathTextBox.Text, !skipWinDirectoryCheckBox.Checked);
                }

                finder.ChangeFolder += ChangeStatus;
                finder.NewFile      += newFileFinded;
                status.Text          = "Выполняется поиск...";

                //---кнопка меняется на "стоп"
                startButton.Text   = "Остановить поиск";
                startButton.Click -= StartSearch;
                startButton.Click += Stop;

                searchToolStripMenuItem.Text   = "Остановить поиск";
                searchToolStripMenuItem.Click -= StartSearch;
                searchToolStripMenuItem.Click += Stop;


                filesListBox.Items.Clear();
                imageInformationTextBox.Clear();

                pictureBox.Image = null;
                imageWorks?.img?.Dispose();


                //---пуск задачи---//
                cancelTokenSource = new CancellationTokenSource();
                token             = cancelTokenSource.Token;


                isWorking = true;
                await finder.GetImagesWithMyParams(iso, date, et, ep, or, isDSC, camName, isManualWhiteBalance, isFlashOn, isGPS, isEdit, token);

                isWorking = false;

                // MessageBox.Show(searchSettings.ToString() + "\nНайдено изображений: " + imagesBindingSource.Count);
                //------------------//
                status.Text = "Поиск окончен";
                // imagesBindingSource.DataSource = images;

                //---кнопка меняется на старт
                startButton.Text   = "Начать поиск";
                startButton.Click += StartSearch;
                startButton.Click -= Stop;

                searchToolStripMenuItem.Text   = "Начать поиск";
                searchToolStripMenuItem.Click += StartSearch;
                searchToolStripMenuItem.Click -= Stop;

                if (WindowState == FormWindowState.Minimized)
                {
                    //мигание значка на панели задач, когда поиск завершен (если окно свернуто)
                    FLASHWINFO fwi = new FLASHWINFO();
                    fwi.cbSize    = Marshal.SizeOf(fwi);
                    fwi.hwnd      = Handle;
                    fwi.dwFlags   = 0x00000002;
                    fwi.dwTimeout = 0;
                    fwi.uCount    = 5;
                    FlashWindowEx(ref fwi);
                }

#if DEBUG
                #region Tests
                Console.WriteLine("Tests...");
                //---тестируем поиск по датам, удалить в релизе
                if (datesCheckBox.Checked)
                {
                    foreach (var i in filesListBox.Items)
                    {
                        var sdir   = ((ImageInformation)i).Directories.OfType <ExifSubIfdDirectory>().FirstOrDefault();
                        var dbdate = sdir.GetDateTime(ExifDirectoryBase.TagDateTimeOriginal).Date;
                        Debug.Assert((dbdate >= startDateTimePicker.Value.Date) && (dbdate <= endDateTimePicker.Value.Date), "DateTime Bug: " + ((ImageInformation)i).FileName);
                    }
                }

                //---тестируем баланс белого (ручной)
                if (WhiteBalanceСheckBox.Checked)
                {
                    foreach (var i in filesListBox.Items)
                    {
                        var sdir = ((ImageInformation)i).Directories.OfType <ExifSubIfdDirectory>().FirstOrDefault();
                        var wb   = sdir.GetUInt16(ExifDirectoryBase.TagWhiteBalanceMode);
                        Debug.Assert(wb == 1, "White Balance Bug: " + ((ImageInformation)i).FileName);
                    }
                }
                //---тестируем источник снимка
                if (DSCCheckBox.Checked)
                {
                    foreach (var i in filesListBox.Items)
                    {
                        var sdir = ((ImageInformation)i).Directories.OfType <ExifSubIfdDirectory>().FirstOrDefault();
                        var dsc  = sdir.GetUInt16(ExifDirectoryBase.TagFileSource);
                        Debug.Assert(dsc == 3, " DSC Bug: " + ((ImageInformation)i).FileName);
                    }
                }

                //---тестируем модель камеры, удалить в релизе
                if (cameraCheckBox.Checked)
                {
                    foreach (var x in filesListBox.Items)
                    {
                        if (x is ImageInformation)
                        {
                            var sdir = ((ImageInformation)x).Directories.OfType <ExifIfd0Directory>().FirstOrDefault();
                            var cam  = sdir.GetDescription(ExifIfd0Directory.TagMake);
                            cam = cam.ToLower();
                            Debug.Assert(cam.Contains(camName.ToLower()), "Неверно отработал поиск по камере" + ((ImageInformation)x).FileName);
                        }
                    }
                }


                //---тестируем выдержку, удалить в релизе
                if (ExposureTimeCheckBox.Checked)
                {
                    foreach (var i in filesListBox.Items)
                    {
                        var sdir = ((ImageInformation)i).Directories.OfType <ExifSubIfdDirectory>().FirstOrDefault();

                        Rational minExposureTime;
                        Rational maxExposureTime;
                        bool     isMinValueCorrect = GetRationalFromString(minExposureTimeTextBox.Text, out minExposureTime);
                        bool     isMaxValueCorrect = GetRationalFromString(maxExposureTimeTextBox.Text, out maxExposureTime);
                        if (isMinValueCorrect == true && isMaxValueCorrect == true)
                        {
                            double min     = minExposureTime.ToDouble();
                            double max     = maxExposureTime.ToDouble();
                            double exptime = sdir.GetRational(ExifDirectoryBase.TagExposureTime).ToDouble();
                            Debug.Assert((exptime >= min - double.Epsilon) && (exptime <= max + double.Epsilon), "Exposure Bug: " + ((ImageInformation)i).FileName + " " + exptime);
                        }
                    }
                }

                //тестируем ISO
                if (ISOCheckBox.Checked)
                {
                    foreach (var i in filesListBox.Items)
                    {
                        var sdir  = ((ImageInformation)i).Directories.OfType <ExifSubIfdDirectory>().FirstOrDefault();
                        var dbiso = sdir.GetUInt16(ExifDirectoryBase.TagIsoEquivalent);
                        Debug.Assert((dbiso >= ushort.Parse(minISOTextBox.Text)) && (dbiso <= ushort.Parse(maxISOTextBox.Text)), "ISO Bug: " + ((ImageInformation)i).FileName);
                    }
                }

                //тестируем вспышку
                if (flashOnCheckBox.Checked)
                {
                    foreach (var i in filesListBox.Items)
                    {
                        var    sdir  = ((ImageInformation)i).Directories.OfType <ExifSubIfdDirectory>().FirstOrDefault();
                        ushort flash = sdir.GetUInt16(ExifDirectoryBase.TagFlash);
                        Debug.Assert((flash & 0x1) != 0, "Flash Bug: " + ((ImageInformation)i).FileName + "Flash value: " + flash);
                    }
                }

                //тестируем программу экспозиции
                if (ExposureProgramCheckBox.Checked)
                {
                    foreach (var i in filesListBox.Items)
                    {
                        var    sdir     = ((ImageInformation)i).Directories.OfType <ExifSubIfdDirectory>().FirstOrDefault();
                        ushort eProgram = sdir.GetUInt16(ExifDirectoryBase.TagExposureProgram);
                        Debug.Assert(eProgram == (int)exposureProgramComboBox.SelectedIndex + 1, "Exposure Program Bug: " + ((ImageInformation)i).FileName + " EP Value: " + eProgram);
                    }
                }

                //тестируем ориентацию
                if (ExposureProgramCheckBox.Checked)
                {
                    foreach (var i in filesListBox.Items)
                    {
                        var    sdir   = ((ImageInformation)i).Directories.OfType <ExifIfd0Directory>().FirstOrDefault();
                        ushort orient = sdir.GetUInt16(ExifDirectoryBase.TagOrientation);

                        if (or == Orientation.Horizonatal)
                        {
                            Debug.Assert(orient <= 4, "Orientation bug");
                        }
                        if (or == Orientation.Vertical)
                        {
                            Debug.Assert(orient > 4, "Orientation bug");
                        }
                    }
                }


                #endregion
#endif
            }
            else
            {
                MessageBox.Show("Путь указан неверно!", "WhereIsMyPhoto");
            }
        }