OSDN Git Service

航路保存機能試作。
[gvonavish/GVONavish.git] / GVONavish / GVONavish / GVOShipRouteList.cpp
index 70c88d0..01e9789 100644 (file)
-#include "stdafx.h"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
+#include "stdafx.h"
 #include "GVOShipRouteList.h"
 
 
+namespace {
+       struct FileHeaderV1 {
+               enum {
+                       k_FileVersion = 1,
+               };
+               const uint32_t version = k_FileVersion;
+               uint32_t favoritsCount = 0;
+       };
 
-GVOShipRouteList::~GVOShipRouteList()
+       typedef FileHeaderV1 FileHeader;
+}
+
+
+bool GVOShipRouteList::saveToFile( const std::wstring & filePath )
+{
+       std::unique_ptr<FILE, decltype(&::fclose)> file(::_wfopen(filePath.c_str(), L"wb"), &::fclose);
+       if ( !file ) {
+               return false;
+       }
+
+       FileHeader fileHeader;
+
+       ::fseek( file.get(), sizeof(FileHeader), SEEK_SET );
+
+       for ( const auto & shipRoute : m_shipRouteList ) {
+               if ( shipRoute->isFavorite() ) {
+                       ++fileHeader.favoritsCount;
+
+                       std::time_t dateTime = std::time_t();
+                       dateTime = shipRoute->earliestDateTime();
+                       ::fwrite( &dateTime, sizeof(dateTime), 1, file.get() );
+                       dateTime = shipRoute->latestDateTime();
+                       ::fwrite( &dateTime, sizeof(dateTime), 1, file.get() );
+
+                       const size_t lineCount = shipRoute->getLines().size();
+                       ::fwrite( &lineCount, sizeof(lineCount), 1, file.get() );
+
+                       for ( const auto & line : shipRoute->getLines() ) {
+                               const size_t count = line.size();
+                               ::fwrite( &count, sizeof(count), 1, file.get() );
+                               if ( !line.empty() ) {
+                                       ::fwrite( &line[0], sizeof(line[0]), line.size(), file.get() );
+                               }
+                       }
+               }
+       }
+
+       ::fseek( file.get(), 0, SEEK_SET );
+       ::fwrite( &fileHeader, sizeof(fileHeader), 1, file.get() );
+       return true;
+}
+
+
+bool GVOShipRouteList::loadFromFile( const std::wstring & filePath )
 {
-       for ( GVOShipRoute *route : m_shipRouteList ) {
-               delete route;
+       std::unique_ptr<FILE, decltype(&::fclose)> file( ::_wfopen( filePath.c_str(), L"rb" ), &::fclose );
+       if ( !file ) {
+               return false;
        }
+
+       FileHeader fileHeader;
+       ::fread( &fileHeader, sizeof( fileHeader ), 1, file.get() );
+
+       if ( fileHeader.version != FileHeader::k_FileVersion ) {
+               return false;
+       }
+
        m_shipRouteList.clear();
+
+       for ( uint32_t i = 0; i < fileHeader.favoritsCount; ++i ) {
+               GVOShipRoutePtr shipRoute( new GVOShipRoute() );
+               shipRoute->setFavorite( true );
+
+               std::time_t dateTime = std::time_t();
+               ::fread( &dateTime, sizeof(dateTime), 1, file.get() );
+               shipRoute->setEarliestDateTime( dateTime );
+               ::fread( &dateTime, sizeof(dateTime), 1, file.get() );
+               shipRoute->setLatestDateTime( dateTime );
+
+               size_t lineCount = 0;
+               ::fread( &lineCount, sizeof(lineCount), 1, file.get() );
+
+               for ( size_t k = 0; k < lineCount; ++k ) {
+                       size_t pointCount = 0;
+                       ::fread( &pointCount, sizeof(pointCount), 1, file.get() );
+                       if ( 0 < pointCount ) {
+                               GVOShipRoute::Line tmp( pointCount );
+                               ::fread( &tmp[0], sizeof(tmp[0]), tmp.size(), file.get() );
+                               shipRoute->addLine( std::move( tmp ) );
+                       }
+               }
+
+               m_shipRouteList.push_back( std::move( shipRoute ) );
+       }
+
+       return true;
 }
 
 
 void GVOShipRouteList::closeRoute()
 {
-       addRoute();
+       if ( !m_shipRouteList.empty() ) {
+               m_shipRouteList.back()->setFix( true );
+       }
 }
 
 
 void GVOShipRouteList::addRoutePoint( const GVONormalizedPoint point )
 {
-       if ( m_shipRouteList.empty() ) {
+       if ( m_shipRouteList.empty() || m_shipRouteList.back()->isFixed() ) {
                addRoute();
        }
        m_shipRouteList.back()->addRoutePoint( point );
        if ( m_observer ) {
-               m_observer->onShipRouteListUpdateRoute( *m_shipRouteList.back() );
+               m_observer->onShipRouteListUpdateRoute( m_shipRouteList.back() );
        }
 }
 
 
-void GVOShipRouteList::removeShipRouteAtReverseIndex( int reverseIndex )
+void GVOShipRouteList::removeShipRoute( GVOShipRoutePtr shipRoute )
 {
-       _ASSERT( 0 <= reverseIndex );
-       _ASSERT( reverseIndex < (int)m_shipRouteList.size() );
-
-       std::unique_ptr<GVOShipRoute> route;
-       RouteList::iterator it;
-       it = m_shipRouteList.begin();
-       std::advance( it, indexFromReverseIndex( reverseIndex ) );
-       route.reset( std::move( *it ) );
+       _ASSERT( shipRoute != nullptr );
+       auto it = std::find( m_shipRouteList.begin(), m_shipRouteList.end(), shipRoute );
+       if ( it == m_shipRouteList.end() ) {
+               return;
+       }
+       GVOShipRoutePtr removeTarget = shipRoute;
        m_shipRouteList.erase( it );
        if ( m_observer ) {
-               m_observer->onShipRouteListRemoveItem( *route );
-       }
-       if ( reverseIndex == 0 ) {
-               // \8dÅ\90V\8dX\90V\92\86\8dq\98H\82ð\92P\8f\83\8dí\8f\9c\82·\82é\82Æ\92¼\91O\82Ì\8dq\98H\82ª\8dX\90V\82³\82ê\91±\82¯\82é\88×\81A\90V\8bK\8dq\98H\82ð\8dì\90¬\82·\82é\81B
-               addRoute();
+               m_observer->onShipRouteListRemoveItem( removeTarget );
        }
 }
 
@@ -63,9 +148,9 @@ void GVOShipRouteList::clearAllItems()
 void GVOShipRouteList::addRoute()
 {
        // \92Ç\89Á\82Æ\92Ê\92m
-       m_shipRouteList.push_back( new GVOShipRoute() );
+       m_shipRouteList.push_back( GVOShipRoutePtr( new GVOShipRoute() ) );
        if ( m_observer ) {
-               m_observer->onShipRouteListAddRoute( *m_shipRouteList.back() );
+               m_observer->onShipRouteListAddRoute( m_shipRouteList.back() );
        }
 
        // \88ì\82ê\82½\95ª\82ð\8dí\8f\9c
@@ -81,13 +166,11 @@ void GVOShipRouteList::addRoute()
                int removeCount = 0;
                auto it = m_shipRouteList.begin();
                while ( it != m_shipRouteList.end() && removeCount < overCount) {
-                       auto route = *it;
-                       if ( route->isFavorite() ) {
+                       if ( (*it)->isFavorite() ) {
                                ++it;
                                continue;
                        }
                        auto itNext = std::next( it, 1 );
-                       delete route;
                        m_shipRouteList.erase( it );
                        ++removeCount;
                        it = itNext;
@@ -106,18 +189,23 @@ void GVOShipRouteList::joinPreviousRouteAtReverseIndex( int reverseIndex )
        std::advance( itBase, indexFromReverseIndex( reverseIndex ) );
        RouteList::iterator itPrev = std::prev( itBase );
        _ASSERT( itPrev != m_shipRouteList.end() );
-       GVOShipRoute *baseRoute = *itBase;
-       std::unique_ptr<GVOShipRoute> prevRoute( std::move( *itPrev ) );
+       GVOShipRoutePtr baseRoute = *itBase;
+       GVOShipRoutePtr prevRoute = *itPrev;
 
        m_shipRouteList.erase( itPrev );
+
+       // remove\82µ\82½\8e\9e\82É\92Ê\92m\83n\83\93\83h\83\89\82Å\91®\90«\82ª\95Ï\8dX\82³\82ê\82Ä\82µ\82Ü\82¤\82Ì\82Å\81A
+       // \82±\82Ì\8e\9e\93_\82Å\8b­\92²\91®\90«\82ð\95Û\91\82µ\82Ä\82¨\82­\81B
+       bool isHilight = prevRoute->isHilight() | baseRoute->isHilight();
        if ( m_observer ) {
-               m_observer->onShipRouteListRemoveItem( *prevRoute );
+               m_observer->onShipRouteListRemoveItem( prevRoute );
        }
 
        baseRoute->jointPreviousLinesWithRoute( *prevRoute );
+       baseRoute->setHilight( isHilight );
 
        // \92Ê\92m
        if ( m_observer ) {
-               m_observer->onShipRouteListUpdateRoute( *baseRoute );
+               m_observer->onShipRouteListUpdateRoute( baseRoute );
        }
 }