>I think the patch is great, but the colours are a real problem 

I've change the patch a little. I've implemented a slightly other display: The 
text remains in the default color. For indication of cp connection I added a 
small bar. The length of the bar corresponds to the maximum cp error. This 
allows also a finer differentiation. The bar ranges from 10 to 0. For bigger 
errors there is no finer differentiation.

Additional I changed the green to a darker green. 

I hope this improves the readability.

Thomas
-- 
Computer Bild Tarifsieger! GMX FreeDSL - Telefonanschluss + DSL
für nur 17,95 ¿/mtl.!* http://dsl.gmx.de/?ac=OM.AD.PD003K11308T4569a

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"hugin and other free panoramic software" group.
A list of frequently asked questions is available at: 
http://wiki.panotools.org/Hugin_FAQ
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at http://groups.google.com/group/hugin-ptx
-~----------~----~----~----~------~----~------~--~---

Index: src/hugin1/hugin/CMakeLists.txt
===================================================================
--- src/hugin1/hugin/CMakeLists.txt     (Revision 3630)
+++ src/hugin1/hugin/CMakeLists.txt     (Arbeitskopie)
@@ -23,7 +23,7 @@
 # sources
 set(hugin_SOURCES
 huginApp.cpp ImagesList.cpp AutoCtrlPointCreator.cpp
-MainFrame.cpp CPImageCtrl.cpp CPEditorPanel.cpp LensPanel.cpp 
+MainFrame.cpp CPImageCtrl.cpp CPImagesComboBox.cpp CPEditorPanel.cpp 
LensPanel.cpp 
 ImagesPanel.cpp CommandHistory.cpp PanoPanel.cpp NonaOptionsDialog.cpp
 PreviewFrame.cpp PreviewPanel.cpp GLPreviewFrame.cpp GLViewer.cpp 
GLRenderer.cpp
 CropPanel.cpp OptimizePhotometricPanel.cpp OptimizePanel.cpp CPListFrame.cpp
Index: src/hugin1/hugin/CPEditorPanel.cpp
===================================================================
--- src/hugin1/hugin/CPEditorPanel.cpp  (Revision 3630)
+++ src/hugin1/hugin/CPEditorPanel.cpp  (Arbeitskopie)
@@ -94,8 +94,8 @@
 BEGIN_EVENT_TABLE(CPEditorPanel, wxPanel)
     EVT_CPEVENT(CPEditorPanel::OnCPEvent)
 #ifdef HUGIN_CP_IMG_CHOICE
-    EVT_CHOICE(XRCID("cp_editor_left_choice"), 
CPEditorPanel::OnLeftChoiceChange )
-    EVT_CHOICE(XRCID("cp_editor_right_choice"), 
CPEditorPanel::OnRightChoiceChange )
+    EVT_COMBOBOX(XRCID("cp_editor_left_choice"), 
CPEditorPanel::OnLeftChoiceChange )
+    EVT_COMBOBOX(XRCID("cp_editor_right_choice"), 
CPEditorPanel::OnRightChoiceChange )
 #endif
 #ifdef HUGIN_CP_IMG_TAB
     EVT_NOTEBOOK_PAGE_CHANGED ( 
XRCID("cp_editor_left_tab"),CPEditorPanel::OnLeftImgChange )
@@ -168,7 +168,7 @@
     m_leftTabs->SetSizeHints(1,tabH,1000,tabH,-1,-1);
 #endif
 #ifdef HUGIN_CP_IMG_CHOICE
-    m_leftChoice = XRCCTRL(*this, "cp_editor_left_choice", wxChoice);          
             
+    m_leftChoice = XRCCTRL(*this, "cp_editor_left_choice", CPImagesComboBox); 
 #endif
 
 #if 0
@@ -187,7 +187,7 @@
     m_rightTabs->SetSizeHints(1,tabH,1000,tabH,-1,-1);
 #endif
 #ifdef HUGIN_CP_IMG_CHOICE
-    m_rightChoice = XRCCTRL(*this, "cp_editor_right_choice", wxChoice);        
             
+    m_rightChoice = XRCCTRL(*this, "cp_editor_right_choice", CPImagesComboBox);
 #endif
 
 #if 0
@@ -360,6 +360,8 @@
         if (m_leftChoice->GetSelection() != (int) imgNr) {
             m_leftChoice->SetSelection(imgNr);
         }
+        m_rightChoice->SetRefImage(m_pano,m_leftImageNr);
+        m_rightChoice->Refresh();
 #endif
 #ifdef HUGIN_CP_IMG_TAB
         if (m_leftTabs->GetSelection() != (int) imgNr) {
@@ -400,17 +402,19 @@
         m_rightRot = GetRot(yaw, pitch, roll);
         m_rightImg->setImage(m_pano->getImage(imgNr).getFilename(), 
m_rightRot);
         // select tab
+        m_rightImageNr = imgNr;
 #ifdef HUGIN_CP_IMG_CHOICE
         if (m_rightChoice->GetSelection() != (int) imgNr) {
             m_rightChoice->SetSelection(imgNr);
         }
+        m_leftChoice->SetRefImage(m_pano,m_rightImageNr);
+        m_leftChoice->Refresh();
 #endif
 #ifdef HUGIN_CP_IMG_TAB
         if (m_rightTabs->GetSelection() != (int) imgNr) {
             m_rightTabs->SetSelection(imgNr);
         }
 #endif
-        m_rightImageNr = imgNr;
         m_rightFile = m_pano->getImage(imgNr).getFilename();
         // update the rest of the display (new control points etc)
         changeState(NO_POINT);
@@ -628,6 +632,10 @@
     SelectGlobalPoint(lPoint);
     changeState(NO_POINT);
     MainFrame::Get()->SetStatusText(_("new control point added"));
+#ifdef HUGIN_CP_IMG_CHOICE
+    m_leftChoice->CalcCPDistance(m_pano);
+    m_rightChoice->CalcCPDistance(m_pano);
+#endif
 }
 
 
@@ -1293,8 +1301,8 @@
 #ifdef HUGIN_CP_IMG_CHOICE
       for (unsigned int i=0; i < ((nrTabs < nrImages)? nrTabs: nrImages); i++) 
{
           wxFileName fileName(wxString 
(pano.getImage(i).getFilename().c_str(), HUGIN_CONV_FILENAME));
-          m_leftChoice->SetString(i, wxString::Format(wxT("%2d"), i) + wxT(". 
- ") + fileName.GetFullName());
-          m_rightChoice->SetString(i, wxString::Format(wxT("%2d"), i) + wxT(". 
- ") + fileName.GetFullName());
+          m_leftChoice->SetString(i, wxString::Format(wxT("%d"), i) + wxT(". - 
") + fileName.GetFullName());
+          m_rightChoice->SetString(i, wxString::Format(wxT("%d"), i) + wxT(". 
- ") + fileName.GetFullName());
       }
 /*
       ls = m_leftChoice->GetSelection();
@@ -1315,8 +1323,8 @@
           for (unsigned int i=nrTabs; i < nrImages; i++) {
 #ifdef HUGIN_CP_IMG_CHOICE
               wxFileName fileName(wxString 
(pano.getImage(i).getFilename().c_str(), HUGIN_CONV_FILENAME));
-              m_leftChoice->Append(wxString::Format(wxT("%2d"), i) + wxT(". - 
") + fileName.GetFullName());
-              m_rightChoice->Append(wxString::Format(wxT("%2d"), i) + wxT(". - 
") + fileName.GetFullName());
+              m_leftChoice->Append(wxString::Format(wxT("%d"), i) + wxT(". - 
") + fileName.GetFullName());
+              m_rightChoice->Append(wxString::Format(wxT("%d"), i) + wxT(". - 
") + fileName.GetFullName());
 #endif
 #ifdef HUGIN_CP_IMG_TAB
               wxWindow* t1= new 
wxWindow(m_leftTabs,-1,wxPoint(0,0),wxSize(0,0));
@@ -1467,6 +1475,10 @@
     wxLogError(wxString::Format(wxT("panoramaImagesChanged. After 
update\nleft: %d, right: %d, count: %d %d"), ls, rs, nrTabsNew));
 #endif
     */
+#ifdef HUGIN_CP_IMG_CHOICE
+    m_leftChoice->CalcCPDistance(m_pano);
+    m_rightChoice->CalcCPDistance(m_pano);
+#endif
 }
 
 void CPEditorPanel::UpdateDisplay(bool newPair)
@@ -1956,6 +1968,10 @@
         GlobalCmdHist::getInstance().addCommand(
             new PT::RemoveCtrlPointCmd(*m_pano,pNr )
             );
+#ifdef HUGIN_CP_IMG_CHOICE
+        m_leftChoice->CalcCPDistance(m_pano);
+        m_rightChoice->CalcCPDistance(m_pano);
+#endif
     }
 }
 
Index: src/hugin1/hugin/CPEditorPanel.h
===================================================================
--- src/hugin1/hugin/CPEditorPanel.h    (Revision 3630)
+++ src/hugin1/hugin/CPEditorPanel.h    (Arbeitskopie)
@@ -42,6 +42,7 @@
 
 #include <PT/Panorama.h>
 
+#include "CPImagesComboBox.h"
 
 // Always use wxChoice, the tabs behave badly with many images on GTK as well.
 #define HUGIN_CP_IMG_CHOICE
@@ -265,8 +266,8 @@
 
     // GUI controls
 #ifdef HUGIN_CP_IMG_CHOICE
-    wxChoice *m_leftChoice;
-    wxChoice *m_rightChoice;
+    CPImagesComboBox *m_leftChoice;
+    CPImagesComboBox *m_rightChoice;
 #endif
 #ifdef HUGIN_CP_IMG_TAB
     wxNotebook *m_leftTabs, *m_rightTabs;
Index: src/hugin1/hugin/CPImagesComboBox.cpp
===================================================================
--- src/hugin1/hugin/CPImagesComboBox.cpp       (Revision 0)
+++ src/hugin1/hugin/CPImagesComboBox.cpp       (Revision 0)
@@ -0,0 +1,197 @@
+#include "hugin/CPImagesComboBox.h"
+
+BEGIN_EVENT_TABLE(CPImagesComboBox,wxOwnerDrawnComboBox)
+    EVT_MOUSEWHEEL(CPImagesComboBox::OnMouseWheel)
+    EVT_KEY_DOWN(CPImagesComboBox::OnKeyDown)
+END_EVENT_TABLE()
+
+void CPImagesComboBox::OnMouseWheel(wxMouseEvent & e)
+{
+    //mimic wxChoice behaviour
+    //when popup is shown, there could be a scrollbar which processes the 
mouse wheel event
+    if(!IsPopupShown())
+    {
+        if(e.GetWheelRotation()<0)
+            SelectNext();
+        else
+            SelectPrev();
+    }
+    else
+    {
+        e.Skip();
+    };
+};
+
+void CPImagesComboBox::OnKeyDown(wxKeyEvent & e)
+{
+    if(!IsPopupShown())
+    {
+        //mimic wxChoice behaviour
+        switch (e.GetKeyCode()){
+            case WXK_DOWN:
+            case WXK_RIGHT:
+            case WXK_NUMPAD_DOWN:
+            case WXK_NUMPAD_RIGHT:
+                SelectNext();
+                break;
+            case WXK_UP:
+            case WXK_LEFT:
+            case WXK_NUMPAD_UP:
+            case WXK_NUMPAD_LEFT:
+                SelectPrev();
+                break;
+            case WXK_PAGEDOWN:
+            case WXK_NUMPAD_PAGEDOWN:
+                SelectNext(5);
+                break;
+            case WXK_PAGEUP:
+            case WXK_NUMPAD_PAGEUP:
+                SelectPrev(5);
+                break;
+            case WXK_HOME:
+            case WXK_NUMPAD_HOME:
+                SelectPrev(GetCount());
+                break;
+            case WXK_END:
+            case WXK_NUMPAD_END:
+                SelectNext(GetCount());
+                break;
+            case WXK_SPACE:
+                ShowPopup();
+                break;
+            default:
+                e.Skip();
+        };
+    }
+    else
+    {
+        e.Skip();
+    }
+};
+
+void CPImagesComboBox::SelectNext(int step)
+{
+    int index=min<int>(GetSelection()+step,GetCount()-1);
+    if(index!=GetSelection())
+    {
+        Select(index);
+        Update();
+        NotifyParent();
+    };
+};
+
+void CPImagesComboBox::SelectPrev(int step)
+{
+    int index=max<int>(GetSelection()-step,0);
+    if(index!=GetSelection())
+    {
+        Select(index);
+        Update();
+        NotifyParent();
+    };
+};
+
+void CPImagesComboBox::NotifyParent()
+{
+    //notify parent about changed selection
+    //select doesn't send the corresponding event
+    wxCommandEvent ne(wxEVT_COMMAND_COMBOBOX_SELECTED);
+    ne.SetEventObject(this);
+    ne.SetId(this->GetId());
+    ne.SetInt(GetSelection());
+    ProcessEvent(ne);
+};
+
+void CPImagesComboBox::Init()
+{
+    CPConnection.resize(0);
+    refImage=0;
+};
+
+void CPImagesComboBox::OnDrawItem(wxDC& dc,
+                                  const wxRect& rect,
+                                  int item,
+                                  int WXUNUSED(flags)) const
+{
+    if ( item == wxNOT_FOUND )
+       return;
+    dc.DrawText(GetString(item),rect.x + 3,rect.y + ((rect.height - 
dc.GetCharHeight())/2));
+    //draw rectangle when images are connected by control points
+    if(CPConnection[item]>-1.0)
+    {
+        wxCoord x;
+        x=rect.width / 5 *(1-min<double>(CPConnection[item],10)/10);
+        //ensure that always a bar is drawn
+        x=max<wxCoord>(5,x);
+        wxPen MyPen(wxColour(0,192,0),1,wxSOLID);
+        wxBrush MyBrush(wxColour(0,192,0),wxSOLID);
+        const wxPen * oldPen = & dc.GetPen();
+        const wxBrush * oldBrush= & dc.GetBrush();
+        if(CPConnection[item]>5)
+        {
+            MyPen.SetColour(wxColour(255,0,0));
+            MyBrush.SetColour(wxColour(255,0,0));
+        };
+        //inner rectangle, proportional to max cp error (max. 10)
+        dc.SetPen(MyPen);
+        dc.SetBrush(MyBrush);
+        
dc.DrawRectangle(rect.x+0.75*rect.width,rect.y+rect.height/3-1,x,2*rect.height/3);
+        //outer rectangle, same colour as text
+               MyPen.SetColour(dc.GetTextForeground());
+               dc.SetPen(MyPen);
+        dc.SetBrush(*wxTRANSPARENT_BRUSH);
+        
dc.DrawRectangle(rect.x+0.75*rect.width,rect.y+rect.height/3-1,rect.width/5,2*rect.height/3);
+        dc.SetPen(*oldPen);
+        dc.SetBrush(*oldBrush);
+    };
+};
+
+void CPImagesComboBox::CalcCPDistance(Panorama * pano)
+{
+    CPConnection.clear();
+    CPConnection.resize(this->GetCount(),-1.0);
+    unsigned int noPts = pano->getNrOfCtrlPoints();
+    // loop over all points to get the maximum error
+    for (unsigned int ptIdx = 0 ; ptIdx < noPts ; ptIdx++)
+    {
+        const ControlPoint & cp = pano->getCtrlPoint(ptIdx);
+        if(cp.image1Nr==refImage)
+        {
+            
CPConnection[cp.image2Nr]=max<double>(cp.error,CPConnection[cp.image2Nr]);
+        }
+        else if(cp.image2Nr==refImage)
+        {
+            
CPConnection[cp.image1Nr]=max<double>(cp.error,CPConnection[cp.image1Nr]);
+        };
+    }
+};
+
+IMPLEMENT_DYNAMIC_CLASS(CPImagesComboBox, wxOwnerDrawnComboBox)
+
+IMPLEMENT_DYNAMIC_CLASS(CPImagesComboBoxXmlHandler, 
wxOwnerDrawnComboBoxXmlHandler)
+
+CPImagesComboBoxXmlHandler::CPImagesComboBoxXmlHandler()
+                : wxOwnerDrawnComboBoxXmlHandler()
+{
+    AddWindowStyles();
+}
+
+wxObject *CPImagesComboBoxXmlHandler::DoCreateResource()
+{
+    XRC_MAKE_INSTANCE(cp, CPImagesComboBox)
+
+    cp->Create(m_parentAsWindow,
+                   GetID(), wxEmptyString,
+                   GetPosition(), GetSize(),
+                   GetStyle(wxT("style")), wxDefaultValidator,
+                   GetName());
+
+    SetupWindow(cp);
+
+    return cp;
+}
+
+bool CPImagesComboBoxXmlHandler::CanHandle(wxXmlNode *node)
+{
+    return IsOfClass(node, wxT("CPImagesComboBox"));
+}
Index: src/hugin1/hugin/CPImagesComboBox.h
===================================================================
--- src/hugin1/hugin/CPImagesComboBox.h (Revision 0)
+++ src/hugin1/hugin/CPImagesComboBox.h (Revision 0)
@@ -0,0 +1,78 @@
+// -*- c-basic-offset: 4 -*-
+/** @file CPImagesComboBox.h
+ *
+ *
+ *  This is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ *  This software is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public
+ *  License along with this software; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#ifndef _CPIMAGESCOMBOBOX_H
+#define _CPIMAGESCOMBOBOX_H
+
+// standard wx include
+//#include <config.h>
+#include "panoinc.h"
+#include "panoinc_WX.h"
+#include "wx/odcombo.h"
+#include "wx/xrc/xh_odcombo.h"
+
+
+using namespace std;
+using namespace PT;
+
+class CPImagesComboBox : public wxOwnerDrawnComboBox
+{
+public:
+    virtual void OnDrawItem(wxDC& dc,
+                            const wxRect& rect,
+                            int item,
+                            int WXUNUSED(flags)) const;
+    void CalcCPDistance(Panorama * pano);
+    void SetRefImage(Panorama * pano, unsigned int newRefImg)
+    {
+        refImage=newRefImg;
+        CalcCPDistance(pano);
+    };
+    const unsigned int GetRefImage()
+    {
+        return refImage;
+    };
+protected:
+    void OnMouseWheel(wxMouseEvent & e);
+    void OnKeyDown(wxKeyEvent & e);
+private:
+    unsigned int refImage;
+    std::vector<double> CPConnection;
+    void Init();
+    void SelectNext(int step = 1);
+    void SelectPrev(int step = 1);
+    void NotifyParent();
+
+    DECLARE_EVENT_TABLE()
+    DECLARE_DYNAMIC_CLASS(CPImagesComboBox)
+};
+
+/** xrc handler */
+class CPImagesComboBoxXmlHandler : public wxOwnerDrawnComboBoxXmlHandler
+{
+    DECLARE_DYNAMIC_CLASS(CPImagesComboBoxXmlHandler)
+
+public:
+    CPImagesComboBoxXmlHandler();
+    virtual wxObject *DoCreateResource();
+    virtual bool CanHandle(wxXmlNode *node);
+};
+
+#endif
Index: src/hugin1/hugin/huginApp.cpp
===================================================================
--- src/hugin1/hugin/huginApp.cpp       (Revision 3630)
+++ src/hugin1/hugin/huginApp.cpp       (Arbeitskopie)
@@ -216,6 +216,7 @@
     wxXmlResource::Get()->AddHandler(new CenterCanvasXmlHandler());
     wxXmlResource::Get()->AddHandler(new CPEditorPanelXmlHandler());
     wxXmlResource::Get()->AddHandler(new CPImageCtrlXmlHandler());
+    wxXmlResource::Get()->AddHandler(new CPImagesComboBoxXmlHandler());
     wxXmlResource::Get()->AddHandler(new OptimizePanelXmlHandler());
     wxXmlResource::Get()->AddHandler(new OptimizePhotometricPanelXmlHandler());
     wxXmlResource::Get()->AddHandler(new PanoPanelXmlHandler());
Index: src/hugin1/hugin/PanoPanel.cpp
===================================================================
--- src/hugin1/hugin/PanoPanel.cpp      (Revision 3630)
+++ src/hugin1/hugin/PanoPanel.cpp      (Arbeitskopie)
@@ -53,6 +53,7 @@
 //#include "hugin/LensPanel.h"
 //#include "hugin/ImagesPanel.h"
 #include "hugin/CPImageCtrl.h"
+#include "hugin/CPImagesComboBox.h"
 #include "hugin/PanoPanel.h"
 #include "hugin/MainFrame.h"
 #include "hugin/huginApp.h"
Index: src/hugin1/hugin/xrc/cp_editor_panel.xrc
===================================================================
--- src/hugin1/hugin/xrc/cp_editor_panel.xrc    (Revision 3630)
+++ src/hugin1/hugin/xrc/cp_editor_panel.xrc    (Arbeitskopie)
@@ -26,8 +26,9 @@
                             <border>3</border>
                           </object>
                           <object class="sizeritem">
-                            <object class="wxChoice" 
name="cp_editor_left_choice">
+                            <object class="CPImagesComboBox" 
name="cp_editor_left_choice">
                               <content/>
+                              <style>wxCB_READONLY</style>
                             </object>
                             <option>1</option>
                             <flag>wxALL|wxADJUST_MINSIZE</flag>
@@ -58,8 +59,9 @@
                         <object class="wxBoxSizer">
                           <orient>wxHORIZONTAL</orient>
                           <object class="sizeritem">
-                            <object class="wxChoice" 
name="cp_editor_right_choice">
+                            <object class="CPImagesComboBox" 
name="cp_editor_right_choice">
                               <content/>
+                              <style>wxCB_READONLY</style>
                             </object>
                             <option>1</option>
                             <flag>wxALL|wxADJUST_MINSIZE</flag>

Reply via email to