Sunday, April 17, 2011

연결선 및 그라데이션 추가.

이전 포스팅에서 에디터를 직접 구현하기로 했는데, 시간이 너무 많이 걸릴 것으로 예상되었다. 각각의 방식이 장단점은 있으나 다분히 많은 코드가 들어가야 할 것으로 보인다.

이러한 경우 어떠한 선택을 하느냐에 따라 개발시간/코드등 많은 차이가 날 수 있다. 장기적으로는 자체 에디터 개발이 맞다고 예상되나 단기적으로는 에디터를 사용하는 것이 맞을 수 있다.

미래의 일은 예측이 불가능하여 이러한 선택에서 고민을 많이 하는데, 여기서는 간단한 솔루션이 Strategy 패턴을 사용하는 방법이다.

간단한 인터페이스만 심어두고 구현은 뒤로 미룬다. 추후 구현시 단위테스트까지 구현이 가능하다. 물론 c로 작성해도 인터페이스만 맞추면 되겠다.

현재로서는 데스크탑 1차버전 완성도 중요하지만 마인드맵 자체 기능을 추가하여 아이폰용 업데이트도 해줘야 하는 상황인지라 에디터는 잠시 접고 연결선 작업을 했다.

Cairo 와 Quartz 는 동일한 좌표 시스템을 사용하도록 변경 가능했고, 함수 인자도 동일하여 함수명 변경으로만 기존 코드를 Cairo 로 변경 가능했다. 덕분에 쉽게 작업이 완료되었다.

image

노드 배경색에 그라데이션 작업도 쉽게 추가하였다. 아이폰에서는 그라데이션이 하드 코딩되어 있다. 데스크탑 버전에서는 테마에서 설정된 값으로 처리한다.

Quartz 에서 Cairo 로 포팅이 비교적 쉽게 이루어지고 있지만, 그림자 기능 관련하여 Cairo에서 직접적으로 지원을 하지 않는 것으로 보인다. 일단 패스.

마인드맵 기능 추가를 위해서 노드간 관계 작업을 해야 하는데 아직 노드 선택조차 되지 않으므로 어떻게 구현해야 할지 고민이 필요하다.

텍스트 출력과 스크롤 추가

주말동안 텍스트 출력과 스크롤 처리를 하였다. 이전에 데스크탑버전 개발시 텍스트 입력을 받고, 리치텍스트 및 이미지 처리등 리치컨트롤을 직접 제작하려 하였다.

이 부분에서 상대히 많은 시간을 소모하였는데(물론 제대로 완성하지도 못했다) 잠시 잊고 있었던 힘들었던 기억이 떠올랐다. 다시 리치에디터를 구현하기는 힘들 듯 하여 아이폰과 같이 단순한 에디터 수준으로 1차 버전은 만족하기로 했다.

물론 단순한 에디터라고 표현했지만 에디터를 직접 구현하는 작업이라 만만치 않을 것으로 예상된다.

다른 방법으로 윈도우에서는 리치에디터 컨트롤을 사용하고, 맥에서는 NSTextView 를 사용하여 구현이 가능하겠다.

image

텍스트 출력과 관련된 문제가 있는데, 영문폰트가 설정된 경우 한글을 출력하면 Cairo 라이브러리에서 출력은 하지 못한다. 당연한 얘기지만...

한글 윈도우일 경우 GDI에서 자동으로 한글 디폴트 폰트(굴림)으로 출력이 된다. 이 부분을 확인하기 위해 많이 시간이 투자되었다. 자세한 사항은 다음에 다루겠다.

아이폰 수준까지만 만들려고 했는데 초반부터 심상치 않다. 쉽지 않을 듯 하다.

Friday, April 15, 2011

MindHD 윈도우 버전 개발 시작

기존 데스크탑 버전은 QT를 이용하여 단일 소스로 각 플랫폼별로 구동하였다. 이러한 방식은 각 플랫폼별 고유한 UI에 어울리지 못하는 부분이 있었고, 맥스토어가 나오면서 경쟁력을 갖기 어려웠다. 또한 윈도우 앱스토어도 예고되어 상황이다. 단일 소스라는 커다란 장점이 있지만 사용자들이 받아들이는 친숙한 UI를 구현하지 못한다는 단점이 더 크게 부각되었다.

결국 각 플랫폼별로 제작을 하기로 결정하고 윈도우버전 개발을 다시 시작하였다. 먼 길이지만 돌아가기로 결정한 것이다.

image 윈도우 버전의 프로젝트 구성이다. 기본적으로 C++로 작성된 엔진과 엔진에 직접 접근하여 UI와 구동되는 WTL프로젝트가 있다. 여기에서 만든 클래스를 이용하여 Active Document를 제작하는 DocServer 프로젝트가 있으며 최종적으로 리본컨트롤은 사용하는 MFC 프로젝트가 있다. 그리고 단위테스트가 있다.

이러한 구성은 엔진을 이용하는 컴포넌트로 구성하여 모듈화 시키려는 의도가 있으며 추후 컴포넌트 판매를 기대할 수 있다.

처음부터 복잡한 구성이 개발기간을 늘리는 원인이 될 수 있지만 모듈화된 틀 안에서 개발에 임할 수 있으므로 설계/소스관리등 장기적인 관점에서는 유리하다는 계산이다.

WTL로 제작된 스크린샷이다. 아직 별 다른 기능은 없다.

image

Tuesday, April 5, 2011

NSString 을 std::wstring 으로 변환 및 버그 수정

MindHD 는 마인드맵 관련 엔진이 C++로 작성되어 iOS에서 구동될 경우 스트링 변환이 필수적이었다. 따라서, NSString을 wstring으로 변환하는 과정이 필요하다. void NSStringToString(const NSString* text, String& str){         str = L"";         size_t len = [text length];         if(len <= 0){                 return;         }                  if([text canBeConvertedToEncoding:NSUTF32LittleEndianStringEncoding]){                 str = (wchar_t*)[text cStringUsingEncoding:NSUTF32LittleEndianStringEncoding];         } } NSUTF32LittleEndianStringEncoding 사용하여 변환이 가능한데, 위 코드에 버그가 있었다. 리턴값이 char* 인데 wchar_t*로 변경하니 널 문자 삽입이 제대로 되지 않는 경우가 발생한 것이다. str = wstring((wchar_t*)[text cStringUsingEncoding:NSUTF32LittleEndianStringEncoding], len); 명시적으로 스트링 길이를 주어 해결함.

HTML Encoded

프리마인드 포맷에 캐릭터 표현은 HTML Encoded 표현방식으로 작성된다. CPP에서 UTF8 변환 관련 라이브러리는 UTF8-CPP를 사용했다. http://utfcpp.sourceforge.net/         std::string strUTF8 = "한글 테스트";         std::ostringstream aStream;                  std::string::iterator beg = strUTF8.begin();         std::string::iterator end = strUTF8.end();         for(; beg!=end; ) {          if(127 < (unsigned char)*beg)                         aStream << "&#x" << std::hex << utf8::unchecked::next(beg) << ';';                 else                 {                         aStream << *beg;                         ++beg;                 } }

Friday, April 1, 2011

XCode 4 디버깅 단축키

Step Over - F6 Step Into - F7 Step Out - F8 Continue program execution - CMD+CTRL+Y Stop - CMD+. Help search - CMD+CTRL+OPT+/