fix: fix bug for windows dialog
This commit is contained in:
		@ -70,8 +70,8 @@ namespace yycc::windows::dialog {
 | 
			
		||||
        // Assign data one by one
 | 
			
		||||
        for (auto i = 0; i < n; ++i) {
 | 
			
		||||
            // Fetch item
 | 
			
		||||
            const auto& filter = m_WinFilters[n];
 | 
			
		||||
            auto& data_struct = m_WinDataStruct[n];
 | 
			
		||||
            const auto& filter = m_WinFilters[i];
 | 
			
		||||
            auto& data_struct = m_WinDataStruct[i];
 | 
			
		||||
            // Assign pointer
 | 
			
		||||
            data_struct.pszName = filter.first.c_str();
 | 
			
		||||
            data_struct.pszSpec = filter.second.c_str();
 | 
			
		||||
@ -151,6 +151,8 @@ namespace yycc::windows::dialog {
 | 
			
		||||
        rv.update();
 | 
			
		||||
 | 
			
		||||
        // okey, return value
 | 
			
		||||
        // please note that we do not check whether this list is empty in there.
 | 
			
		||||
        // this was done in generic_file_dialog() function.
 | 
			
		||||
        return rv;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -337,10 +339,6 @@ namespace yycc::windows::dialog {
 | 
			
		||||
        else rv.m_WinFileTypes = std::move(win_file_types.value());
 | 
			
		||||
 | 
			
		||||
        // check and assign default file type index
 | 
			
		||||
        // check whether it is out of filters range
 | 
			
		||||
        if (m_DefaultFileTypeIndex >= m_FileTypes.get_count()) {
 | 
			
		||||
            return std::unexpected(DialogError::IndexOutOfRange);
 | 
			
		||||
        }
 | 
			
		||||
        // check whether it can be safely casted into UINT.
 | 
			
		||||
        auto win_def_index_base0 = SAFECAST::try_to<UINT>(m_DefaultFileTypeIndex);
 | 
			
		||||
        if (!win_def_index_base0.has_value()) {
 | 
			
		||||
@ -351,7 +349,9 @@ namespace yycc::windows::dialog {
 | 
			
		||||
        if (!win_def_index.has_value()) {
 | 
			
		||||
            return std::unexpected(DialogError::IndexOverflow);
 | 
			
		||||
        }
 | 
			
		||||
        // okey, assign it
 | 
			
		||||
        // okey, assign it.
 | 
			
		||||
        // please note we do not check the relation between this variable and file filters.
 | 
			
		||||
        // this was done in generic_file_dialog() function.
 | 
			
		||||
        rv.m_WinDefaultFileTypeIndex = win_def_index.value();
 | 
			
		||||
 | 
			
		||||
        // everything is okey
 | 
			
		||||
@ -485,11 +485,21 @@ namespace yycc::windows::dialog {
 | 
			
		||||
 | 
			
		||||
        // set file types and default file index when we picking file
 | 
			
		||||
        if constexpr (EDialogType != GenericFileDialogType::OpenFolder) {
 | 
			
		||||
            // set file types list
 | 
			
		||||
            // fetch file filters
 | 
			
		||||
            const auto& file_filters = win_params.get_file_types();
 | 
			
		||||
 | 
			
		||||
            // first, check whether file filters is empty
 | 
			
		||||
            if (file_filters.get_filter_count() == 0) {
 | 
			
		||||
                return std::unexpected(DialogError::EmptyFilters);
 | 
			
		||||
            }
 | 
			
		||||
            // then validate index
 | 
			
		||||
            if (win_params.get_default_file_type_index() > file_filters.get_filter_count()) {
 | 
			
		||||
                return std::unexpected(DialogError::IndexOutOfRange);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // set file types list
 | 
			
		||||
            hr = pfd->SetFileTypes(file_filters.get_filter_count(), file_filters.get_filter_specs());
 | 
			
		||||
            if (FAILED(hr)) return BAD_COM_CALL;
 | 
			
		||||
 | 
			
		||||
            // set default file type index
 | 
			
		||||
            hr = pfd->SetFileTypeIndex(win_params.get_default_file_type_index());
 | 
			
		||||
            if (FAILED(hr)) return BAD_COM_CALL;
 | 
			
		||||
@ -578,7 +588,7 @@ namespace yycc::windows::dialog {
 | 
			
		||||
            if (inner.has_value()) {
 | 
			
		||||
                const auto& vec = inner.value();
 | 
			
		||||
                if (vec.size() != 1u) throw std::logic_error("return value doesn't contain exactly one item");
 | 
			
		||||
                else return std::move(vec.front());
 | 
			
		||||
                else return vec.front();
 | 
			
		||||
            } else {
 | 
			
		||||
                return std::nullopt;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@ -32,6 +32,7 @@ namespace yycc::windows::dialog {
 | 
			
		||||
        BadEncoding,     ///< Error occurs when perform encoding convertion.
 | 
			
		||||
        TooManyFilters,  ///< The size of file filters list is too large for Windows.
 | 
			
		||||
        IndexOverflow,   ///< Default filter index is too large for Windows.
 | 
			
		||||
        EmptyFilters,    ///< File filters is empty when picking file.
 | 
			
		||||
        IndexOutOfRange, ///< Default filter index is out of range of filters list.
 | 
			
		||||
        NoSuchDir,       ///< Given initial directory path is invalid.
 | 
			
		||||
        BadCOMCall,      ///< Some COM function calls failed.
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user