long m_min,m_max;
};
+#ifndef __WXGTK20__
+
+// -------------------------------------
+// wxDataViewChoiceRenderer
+// -------------------------------------
+
+class WXDLLIMPEXP_ADV wxDataViewChoiceRenderer: public wxDataViewCustomRenderer
+{
+public:
+ wxDataViewChoiceRenderer( const wxArrayString &choices,
+ wxDataViewCellMode mode = wxDATAVIEW_CELL_EDITABLE,
+ int alignment = wxDVR_DEFAULT_ALIGNMENT );
+ virtual bool HasEditorCtrl() { return true; }
+ virtual wxControl* CreateEditorCtrl( wxWindow *parent, wxRect labelRect, const wxVariant &value );
+ virtual bool GetValueFromEditorCtrl( wxControl* editor, wxVariant &value );
+ virtual bool Render( wxRect rect, wxDC *dc, int state );
+ virtual wxSize GetSize() const;
+ virtual bool SetValue( const wxVariant &value );
+ virtual bool GetValue( wxVariant &value ) const;
+
+private:
+ wxArrayString m_choices;
+ wxString m_data;
+};
+
+#endif
+
//-----------------------------------------------------------------------------
// wxDataViewTreeStore
//-----------------------------------------------------------------------------
DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewDateRenderer)
};
+// -------------------------------------
+// wxDataViewChoiceRenderer
+// -------------------------------------
+
+class WXDLLIMPEXP_ADV wxDataViewChoiceRenderer: public wxDataViewCustomRenderer
+{
+public:
+ wxDataViewChoiceRenderer( const wxArrayString &choices,
+ wxDataViewCellMode mode = wxDATAVIEW_CELL_EDITABLE,
+ int alignment = wxDVR_DEFAULT_ALIGNMENT );
+ virtual bool Render( wxRect rect, wxDC *dc, int state );
+ virtual wxSize GetSize() const;
+ virtual bool SetValue( const wxVariant &value );
+ virtual bool GetValue( wxVariant &value ) const;
+
+ void SetAlignment( int align );
+private:
+ wxArrayString m_choices;
+ wxString m_data;
+};
+
// ---------------------------------------------------------
// wxDataViewColumn
// ---------------------------------------------------------
/*
Implement this data model
- Title Artist Year
--------------------------------------------------------------
+ Title Artist Year Judgement
+--------------------------------------------------------------------------
1: My Music:
2: Pop music
- 3: You are not alone Michael Jackson 1995
- 4: Take a bow Madonna 1994
+ 3: You are not alone Michael Jackson 1995 good
+ 4: Take a bow Madonna 1994 good
5: Classical music
- 6: Ninth Symphony Ludwig v. Beethoven 1824
- 7: German Requiem Johannes Brahms 1868
+ 6: Ninth Symphony Ludwig v. Beethoven 1824 good
+ 7: German Requiem Johannes Brahms 1868 good
*/
m_title = title;
m_artist = artist;
m_year = year;
+ m_quality = "good";
m_isContainer = false;
}
wxString m_title;
wxString m_artist;
int m_year;
+ wxString m_quality;
private:
MyMusicModelNode *m_parent;
virtual unsigned int GetColumnCount() const
{
- return 5;
+ return 6;
}
virtual wxString GetColumnType( unsigned int col ) const
case 0: variant = node->m_title; break;
case 1: variant = node->m_artist; break;
case 2: variant = (long) node->m_year; break;
- case 3:
+ case 3: variant = node->m_quality; break;
+ case 4:
// wxMac doesn't conceal the popularity progress renderer, return 0 for containers
if (IsContainer(item))
variant = (long) 0;
else
variant = (long) 80; // all music is very 80% popular
break;
- case 4:
+ case 5:
// Make size of red square depend on year
if (GetYear(item) < 1900)
variant = (long) 35;
case 0: node->m_title = variant.GetString(); return true;
case 1: node->m_artist = variant.GetString(); return true;
case 2: node->m_year = variant.GetLong(); return true;
+ case 3: node->m_quality = variant.GetString(); return true;
default: wxLogError( wxT("MyMusicModel::SetValue: wrong column") );
}
return false;
virtual wxSize GetSize() const
{
- return wxSize(60,m_height);
+ //return wxSize(60,m_height);
+ return wxSize(60,20);
}
virtual bool SetValue( const wxVariant &value )
wxDATAVIEW_COL_SORTABLE | wxDATAVIEW_COL_REORDERABLE | wxDATAVIEW_COL_RESIZABLE );
m_musicCtrl->AppendColumn( column1 );
-#if 1
wxDataViewSpinRenderer *sr = new wxDataViewSpinRenderer( 0, 2010, wxDATAVIEW_CELL_EDITABLE, wxALIGN_RIGHT );
- wxDataViewColumn *column2 = new wxDataViewColumn( wxT("year"), sr, 2, 80, wxALIGN_LEFT,
+ wxDataViewColumn *column2 = new wxDataViewColumn( wxT("year"), sr, 2, 100, wxALIGN_LEFT,
wxDATAVIEW_COL_SORTABLE | wxDATAVIEW_COL_REORDERABLE | wxDATAVIEW_COL_RESIZABLE );
m_musicCtrl->AppendColumn( column2 );
- m_musicCtrl->AppendProgressColumn( wxT("popularity"), 3, wxDATAVIEW_CELL_INERT, 80 );
+ wxArrayString choices;
+ choices.Add( "good" );
+ choices.Add( "bad" );
+ choices.Add( "lousy" );
+ wxDataViewChoiceRenderer *c = new wxDataViewChoiceRenderer( choices, wxDATAVIEW_CELL_EDITABLE, wxALIGN_RIGHT );
+ wxDataViewColumn *column3 = new wxDataViewColumn( wxT("rating"), c, 3, 100, wxALIGN_LEFT,
+ wxDATAVIEW_COL_REORDERABLE | wxDATAVIEW_COL_RESIZABLE );
+ m_musicCtrl->AppendColumn( column3 );
+
+ m_musicCtrl->AppendProgressColumn( wxT("popularity"), 4, wxDATAVIEW_CELL_INERT, 80 );
MyCustomRenderer *cr = new MyCustomRenderer( wxDATAVIEW_CELL_ACTIVATABLE, wxALIGN_RIGHT );
- wxDataViewColumn *column3 = new wxDataViewColumn( wxT("custom"), cr, 4, -1, wxALIGN_LEFT,
+ wxDataViewColumn *column4 = new wxDataViewColumn( wxT("custom"), cr, 5, -1, wxALIGN_LEFT,
wxDATAVIEW_COL_RESIZABLE );
- m_musicCtrl->AppendColumn( column3 );
-#endif
+ m_musicCtrl->AppendColumn( column4 );
data_sizer->Add( m_musicCtrl, 3, wxGROW );
#endif
wxDataViewTextRendererAttr *ra = new wxDataViewTextRendererAttr;
- wxDataViewColumn *column4 = new wxDataViewColumn(wxT("attributes"), ra, 2 );
- m_listCtrl->AppendColumn( column4 );
+ wxDataViewColumn *column5 = new wxDataViewColumn(wxT("attributes"), ra, 2 );
+ m_listCtrl->AppendColumn( column5 );
data_sizer->Add( m_listCtrl, 2, wxGROW );
#include "wx/dataview.h"
#include "wx/spinctrl.h"
+#include "wx/choice.h"
#include "wx/weakref.h"
return true;
}
+// -------------------------------------
+// wxDataViewChoiceRenderer
+// -------------------------------------
+
+#ifndef __WXGTK20__
+
+wxDataViewChoiceRenderer::wxDataViewChoiceRenderer( const wxArrayString& choices, wxDataViewCellMode mode, int alignment ) :
+ wxDataViewCustomRenderer(wxT("string"), mode, alignment )
+{
+ m_choices = choices;
+}
+
+wxControl* wxDataViewChoiceRenderer::CreateEditorCtrl( wxWindow *parent, wxRect labelRect, const wxVariant &value )
+{
+ wxString s = value;
+ wxSize size = labelRect.GetSize();
+#ifdef __WXMAC__
+ size = wxSize( wxMax(70,labelRect.width ), -1 );
+#endif
+ wxChoice *c = new wxChoice( parent, wxID_ANY, labelRect.GetTopLeft(), size, m_choices );
+ c->SetStringSelection( value.GetString() );
+
+ return c;
+}
+
+bool wxDataViewChoiceRenderer::GetValueFromEditorCtrl( wxControl* editor, wxVariant &value )
+{
+ wxChoice *c = (wxChoice*) editor;
+ wxString s = c->GetStringSelection();
+ value = s;
+ return true;
+}
+
+bool wxDataViewChoiceRenderer::Render( wxRect rect, wxDC *dc, int state )
+{
+ RenderText( m_data, 0, rect, dc, state );
+ return true;
+}
+
+wxSize wxDataViewChoiceRenderer::GetSize() const
+{
+ return wxSize(80,16);
+}
+
+bool wxDataViewChoiceRenderer::SetValue( const wxVariant &value )
+{
+ m_data = value.GetString();
+ return true;
+}
+
+bool wxDataViewChoiceRenderer::GetValue( wxVariant &value ) const
+{
+ value = m_data;
+ return true;
+}
+
+#endif
+
//-----------------------------------------------------------------------------
// wxDataViewTreeStore
//-----------------------------------------------------------------------------
static void wxGtkTextRendererEditedCallback( GtkCellRendererText *WXUNUSED(renderer),
gchar *arg1, gchar *arg2, gpointer user_data )
{
- wxDataViewTextRenderer *cell = (wxDataViewTextRenderer*) user_data;
+ wxDataViewRenderer *cell = (wxDataViewRenderer*) user_data;
wxString tmp = wxGTK_CONV_BACK_FONT(arg2, cell->GetOwner()->GetOwner()->GetFont());
wxVariant value = tmp;
return wxSize(40,12);
}
+// -------------------------------------
+// wxDataViewChoiceRenderer
+// -------------------------------------
+
+wxDataViewChoiceRenderer::wxDataViewChoiceRenderer( const wxArrayString &choices,
+ wxDataViewCellMode mode, int alignment ) :
+ wxDataViewCustomRenderer( "string", mode, alignment, true )
+{
+ m_choices = choices;
+
+#ifdef __WXGTK26__
+ if (!gtk_check_version(2,6,0))
+ {
+ m_renderer = (GtkCellRenderer*) gtk_cell_renderer_combo_new();
+
+ GtkListStore *store = gtk_list_store_new( 1, G_TYPE_STRING );
+ size_t n;
+ for (n = 0; n < m_choices.GetCount(); n++)
+ gtk_list_store_insert_with_values( store, NULL, n, 0, m_choices[n].utf8_str(), -1 );
+
+ g_object_set (m_renderer,
+ "model", store,
+ "text-column", 0,
+ "has-entry", FALSE,
+ NULL);
+
+ bool editable = (mode & wxDATAVIEW_CELL_EDITABLE);
+ g_object_set (m_renderer, "editable", editable, NULL);
+
+ SetAlignment(alignment);
+
+ g_signal_connect_after( m_renderer, "edited", G_CALLBACK(wxGtkTextRendererEditedCallback), this );
+
+ GtkInitHandlers();
+ }
+ else
+#endif
+ {
+ // Use custom cell code
+ wxDataViewCustomRenderer::Init(mode, alignment);
+ }
+}
+
+bool wxDataViewChoiceRenderer::Render( wxRect rect, wxDC *dc, int state )
+{
+ RenderText( m_data, 0, rect, dc, state );
+ return true;
+}
+
+wxSize wxDataViewChoiceRenderer::GetSize() const
+{
+ return wxSize(70,20);
+}
+
+bool wxDataViewChoiceRenderer::SetValue( const wxVariant &value )
+{
+
+#ifdef __WXGTK26__
+ if (!gtk_check_version(2,6,0))
+ {
+ GValue gvalue = { 0, };
+ g_value_init( &gvalue, G_TYPE_STRING );
+ g_value_set_string( &gvalue, wxGTK_CONV_FONT( value.GetString(), GetOwner()->GetOwner()->GetFont() ) );
+ g_object_set_property( G_OBJECT(m_renderer), "text", &gvalue );
+ g_value_unset( &gvalue );
+ }
+ else
+#endif
+ m_data = value.GetString();
+
+ return true;
+}
+
+bool wxDataViewChoiceRenderer::GetValue( wxVariant &value ) const
+{
+#ifdef __WXGTK26__
+ if (!gtk_check_version(2,6,0))
+ {
+ GValue gvalue = { 0, };
+ g_value_init( &gvalue, G_TYPE_STRING );
+ g_object_get_property( G_OBJECT(m_renderer), "text", &gvalue );
+ wxString temp = wxGTK_CONV_BACK_FONT( g_value_get_string( &gvalue ), const_cast<wxDataViewTextRenderer*>(this)->GetOwner()->GetOwner()->GetFont() );
+ g_value_unset( &gvalue );
+ value = temp;
+ wxPrintf( "temp %s\n", temp );
+ }
+ else
+#endif
+ value = m_data;
+
+ return true;
+}
+
+void wxDataViewChoiceRenderer::SetAlignment( int align )
+{
+ wxDataViewCustomRenderer::SetAlignment(align);
+
+ if (gtk_check_version(2,10,0))
+ return;
+
+ // horizontal alignment:
+ PangoAlignment pangoAlign = PANGO_ALIGN_LEFT;
+ if (align & wxALIGN_RIGHT)
+ pangoAlign = PANGO_ALIGN_RIGHT;
+ else if (align & wxALIGN_CENTER_HORIZONTAL)
+ pangoAlign = PANGO_ALIGN_CENTER;
+
+ GValue gvalue = { 0, };
+ g_value_init( &gvalue, gtk_cell_renderer_mode_get_type() );
+ g_value_set_enum( &gvalue, pangoAlign );
+ g_object_set_property( G_OBJECT(m_renderer), "alignment", &gvalue );
+ g_value_unset( &gvalue );
+}
+
// ---------------------------------------------------------
// wxDataViewDateRenderer
// ---------------------------------------------------------