Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
K
kicad-source-mirror
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
Elphel
kicad-source-mirror
Commits
31fea1e7
Commit
31fea1e7
authored
Feb 14, 2014
by
Henner Zeller
Committed by
jean-pierre charras
Feb 14, 2014
Browse files
Options
Browse Files
Download
Plain Diff
PATCH: making component choosing (much!) more usable
parents
63eac42d
4340ceeb
Changes
9
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
1728 additions
and
80 deletions
+1728
-80
CMakeLists.txt
eeschema/CMakeLists.txt
+3
-0
component_tree_search_container.cpp
eeschema/component_tree_search_container.cpp
+356
-0
component_tree_search_container.h
eeschema/component_tree_search_container.h
+108
-0
dialog_choose_component.cpp
eeschema/dialogs/dialog_choose_component.cpp
+275
-0
dialog_choose_component.h
eeschema/dialogs/dialog_choose_component.h
+69
-0
dialog_choose_component_base.cpp
eeschema/dialogs/dialog_choose_component_base.cpp
+109
-0
dialog_choose_component_base.fbp
eeschema/dialogs/dialog_choose_component_base.fbp
+710
-0
dialog_choose_component_base.h
eeschema/dialogs/dialog_choose_component_base.h
+67
-0
getpart.cpp
eeschema/getpart.cpp
+31
-80
No files found.
eeschema/CMakeLists.txt
View file @
31fea1e7
...
...
@@ -19,6 +19,8 @@ set( EESCHEMA_DLGS
dialogs/dialog_bom.cpp
dialogs/dialog_bom_base.cpp
dialogs/dialog_bom_cfg_keywords.cpp
dialogs/dialog_choose_component.cpp
dialogs/dialog_choose_component_base.cpp
dialogs/dialog_lib_edit_text.cpp
dialogs/dialog_lib_edit_text_base.cpp
dialogs/dialog_edit_component_in_lib.cpp
...
...
@@ -88,6 +90,7 @@ set( EESCHEMA_SRCS
files-io.cpp
find.cpp
getpart.cpp
component_tree_search_container.cpp
hierarch.cpp
hotkeys.cpp
libarch.cpp
...
...
eeschema/component_tree_search_container.cpp
0 → 100644
View file @
31fea1e7
This diff is collapsed.
Click to expand it.
eeschema/component_tree_search_container.h
0 → 100644
View file @
31fea1e7
/* -*- c++ -*-
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2014 Henner Zeller <h.zeller@acm.org>
* Copyright (C) 2014 KiCad Developers, see change_log.txt for contributors.
*
* This program 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 program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http: *www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http: *www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <vector>
#include <wx/string.h>
class
LIB_COMPONENT
;
class
CMP_LIBRARY
;
class
wxTreeCtrl
;
class
wxArrayString
;
// class COMPONENT_TREE_SEARCH_CONTAINER
// A container for components that allows to search them matching their name, keywords
// and descripotions, updating a wxTreeCtrl with the results (toplevel nodes:
// libraries, leafs: components), scored by relevance.
//
// The scored result list is adpated on each update on the search-term: this allows
// to have a search-as-you-type experience.
class
COMPONENT_TREE_SEARCH_CONTAINER
{
public
:
COMPONENT_TREE_SEARCH_CONTAINER
();
~
COMPONENT_TREE_SEARCH_CONTAINER
();
/** Function AddLibrary
* Add the components of this library to be searched.
* To be called in the setup phase to fill this container.
*
* @param aLib containting all the components to be added.
*/
void
AddLibrary
(
CMP_LIBRARY
&
aLib
);
/** Function AddComponentList
* Add the given list of components, given by name, to be searched.
* To be called in the setup phase to fill this container.
*
* @param aNodeName The parent node name the components will show up as leaf.
* @param aComponentNameList List of component names.
* @param aOptionalLib Library to look up the component names (if NULL: global lookup)
* @param aNormallyExpanded Should the node in the tree be expanded by default.
*/
void
AddComponentList
(
const
wxString
&
aNodeName
,
const
wxArrayString
&
aComponentNameList
,
CMP_LIBRARY
*
aOptionalLib
,
bool
aNormallyExpanded
);
/** Function SetPreselectNode
* Set the component name to be selected in absence of any search-result.
*
* @param aComponentName the component name to be selected.
*/
void
SetPreselectNode
(
const
wxString
&
aComponentName
);
/** Function SetTree
* Set the tree to be manipulated.
* Each update of the search term will update the tree, with the most
* scoring component at the top and selected. If a preselect node is set, this
* is displayed. Does not take ownership of the tree.
*
* @param aTree that is to be modified on search updates.
*/
void
SetTree
(
wxTreeCtrl
*
aTree
);
/** Function UpdateSearchTerm
* Update the search string provided by the user and narrow down the result list.
*
* This string is a space-separated list of terms, each of which
* is applied to the components list to narrow it down. Results are scored by
* relevancy (e.g. exact match scores higher than prefix-match which in turn scores
* higher than substring match). This updates the search and tree on each call.
*
* @param aSearch is the user-provided search string.
*/
void
UpdateSearchTerm
(
const
wxString
&
aSearch
);
/** Function GetSelectedComponent
*
* @return the selected component or NULL if there is none.
*/
LIB_COMPONENT
*
GetSelectedComponent
();
private
:
struct
TREE_NODE
;
static
bool
scoreComparator
(
const
TREE_NODE
*
a1
,
const
TREE_NODE
*
a2
);
std
::
vector
<
TREE_NODE
*>
nodes
;
wxString
preselect_node_name
;
wxTreeCtrl
*
tree
;
};
eeschema/dialogs/dialog_choose_component.cpp
0 → 100644
View file @
31fea1e7
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2014 Henner Zeller <h.zeller@acm.org>
* Copyright (C) 2014 KiCad Developers, see change_log.txt for contributors.
*
* This program 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 program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <dialog_choose_component.h>
#include <set>
#include <boost/foreach.hpp>
#include <wx/tokenzr.h>
#include <class_library.h>
#include <component_tree_search_container.h>
#include <sch_base_frame.h>
// Work-around broken implementation in wxWidgets <=2.8 tree.
static
wxTreeItemId
fixedGetPrevVisible
(
const
wxTreeCtrl
&
tree
,
const
wxTreeItemId
&
item
);
// Combine descriptions of all aliases from given component.
static
wxString
combineDescriptions
(
LIB_COMPONENT
*
aComponent
)
{
std
::
set
<
wxString
>
descriptions
;
for
(
size_t
i
=
0
;
i
<
aComponent
->
GetAliasCount
();
++
i
)
{
LIB_ALIAS
*
a
=
aComponent
->
GetAlias
(
i
);
if
(
!
a
->
GetDescription
().
empty
()
)
descriptions
.
insert
(
a
->
GetDescription
()
);
}
wxString
result
;
BOOST_FOREACH
(
const
wxString
&
s
,
descriptions
)
result
+=
s
+
wxT
(
"
\n
"
);
return
result
;
}
// Combine keywords. Keywords come as a string, but are considered space-separated
// individual words. Return a string with a unique set of these.
static
wxString
combineKeywords
(
LIB_COMPONENT
*
aComponent
)
{
std
::
set
<
wxString
>
keywords
;
for
(
size_t
i
=
0
;
i
<
aComponent
->
GetAliasCount
();
++
i
)
{
LIB_ALIAS
*
a
=
aComponent
->
GetAlias
(
i
);
wxStringTokenizer
tokenizer
(
a
->
GetKeyWords
()
);
while
(
tokenizer
.
HasMoreTokens
()
)
keywords
.
insert
(
tokenizer
.
GetNextToken
()
);
}
wxString
result
;
BOOST_FOREACH
(
const
wxString
&
s
,
keywords
)
result
+=
s
+
wxT
(
" "
);
return
result
;
}
DIALOG_CHOOSE_COMPONENT
::
DIALOG_CHOOSE_COMPONENT
(
wxWindow
*
aParent
,
const
wxString
&
aTitle
,
COMPONENT_TREE_SEARCH_CONTAINER
*
aContainer
)
:
DIALOG_CHOOSE_COMPONENT_BASE
(
aParent
,
wxID_ANY
,
aTitle
),
m_search_container
(
aContainer
),
m_selected_component
(
NULL
),
m_external_browser_requested
(
false
),
m_received_doubleclick_in_tree
(
false
)
{
// TODO: restore last size user was choosing.
m_search_container
->
SetTree
(
m_libraryComponentTree
);
m_searchBox
->
SetFocus
();
m_componentDetails
->
SetEditable
(
false
);
}
// After this dialog is done: return the component that has been selected, or an
// empty string if there is none.
wxString
DIALOG_CHOOSE_COMPONENT
::
GetSelectedComponentName
()
const
{
if
(
m_selected_component
==
NULL
)
return
wxEmptyString
;
return
m_selected_component
->
GetName
();
}
void
DIALOG_CHOOSE_COMPONENT
::
OnSearchBoxChange
(
wxCommandEvent
&
aEvent
)
{
m_selected_component
=
NULL
;
m_search_container
->
UpdateSearchTerm
(
m_searchBox
->
GetLineText
(
0
)
);
updateSelection
();
}
void
DIALOG_CHOOSE_COMPONENT
::
OnSearchBoxEnter
(
wxCommandEvent
&
aEvent
)
{
EndModal
(
wxID_OK
);
// We are done.
}
void
DIALOG_CHOOSE_COMPONENT
::
SelectIfValid
(
const
wxTreeItemId
&
aTreeId
)
{
if
(
aTreeId
.
IsOk
()
&&
aTreeId
!=
m_libraryComponentTree
->
GetRootItem
()
)
m_libraryComponentTree
->
SelectItem
(
aTreeId
);
}
void
DIALOG_CHOOSE_COMPONENT
::
OnInterceptSearchBoxKey
(
wxKeyEvent
&
aKeyStroke
)
{
// Cursor up/down are forwarded to the tree. This is done by intercepting some navigational
// keystrokes that normally would go to the text search box (which has the focus by default).
const
wxTreeItemId
sel
=
m_libraryComponentTree
->
GetSelection
();
switch
(
aKeyStroke
.
GetKeyCode
()
)
{
case
WXK_UP
:
SelectIfValid
(
fixedGetPrevVisible
(
*
m_libraryComponentTree
,
sel
)
);
break
;
case
WXK_DOWN
:
SelectIfValid
(
m_libraryComponentTree
->
GetNextVisible
(
sel
)
);
break
;
default
:
aKeyStroke
.
Skip
();
// Pass on to search box.
break
;
}
}
void
DIALOG_CHOOSE_COMPONENT
::
OnTreeSelect
(
wxTreeEvent
&
aEvent
)
{
updateSelection
();
}
void
DIALOG_CHOOSE_COMPONENT
::
OnDoubleClickTreeSelect
(
wxTreeEvent
&
aEvent
)
{
updateSelection
();
if
(
m_selected_component
==
NULL
)
return
;
// Ok, got selection. We don't just end the modal dialog here, but
// wait for the MouseUp event to occur. Otherwise something (broken?)
// happens: the dialog will close and will deliver the 'MouseUp' event
// to the eeschema canvas, that will immediately place the component.
m_received_doubleclick_in_tree
=
true
;
}
void
DIALOG_CHOOSE_COMPONENT
::
OnTreeMouseUp
(
wxMouseEvent
&
aMouseEvent
)
{
if
(
m_received_doubleclick_in_tree
)
EndModal
(
wxID_OK
);
// We are done (see OnDoubleClickTreeSelect)
else
aMouseEvent
.
Skip
();
// Let upstream handle it.
}
void
DIALOG_CHOOSE_COMPONENT
::
OnStartComponentBrowser
(
wxMouseEvent
&
aEvent
)
{
m_external_browser_requested
=
true
;
EndModal
(
wxID_OK
);
// We are done.
}
void
DIALOG_CHOOSE_COMPONENT
::
updateSelection
()
{
LIB_COMPONENT
*
selection
=
m_search_container
->
GetSelectedComponent
();
if
(
selection
==
m_selected_component
)
return
;
// no change.
m_selected_component
=
selection
;
m_componentDetails
->
Clear
();
if
(
m_selected_component
==
NULL
)
return
;
wxFont
font_normal
=
m_componentDetails
->
GetFont
();
wxFont
font_bold
=
m_componentDetails
->
GetFont
();
font_bold
.
SetWeight
(
wxFONTWEIGHT_BOLD
);
wxTextAttr
headline_attribute
;
headline_attribute
.
SetFont
(
font_bold
);
wxTextAttr
text_attribute
;
text_attribute
.
SetFont
(
font_normal
);
const
wxString
description
=
combineDescriptions
(
selection
);
if
(
!
description
.
empty
()
)
{
m_componentDetails
->
SetDefaultStyle
(
headline_attribute
);
m_componentDetails
->
AppendText
(
_
(
"Description
\n
"
)
);
m_componentDetails
->
SetDefaultStyle
(
text_attribute
);
m_componentDetails
->
AppendText
(
description
);
m_componentDetails
->
AppendText
(
wxT
(
"
\n
"
)
);
}
const
wxString
keywords
=
combineKeywords
(
selection
);
if
(
!
keywords
.
empty
()
)
{
m_componentDetails
->
SetDefaultStyle
(
headline_attribute
);
m_componentDetails
->
AppendText
(
_
(
"Keywords
\n
"
)
);
m_componentDetails
->
SetDefaultStyle
(
text_attribute
);
m_componentDetails
->
AppendText
(
keywords
);
}
m_componentDetails
->
SetInsertionPoint
(
0
);
// scroll up.
}
// The GetPrevVisible() method is broken in at least 2.8 wxWidgets. This is mostly copied
// verbatim from the latest 3.x source in which this is fixed.
// ( wxWidgets/src/generic/treectlg.cpp )
static
wxTreeItemId
fixedGetPrevVisible
(
const
wxTreeCtrl
&
tree
,
const
wxTreeItemId
&
item
)
{
#if wxCHECK_VERSION( 3, 0, 0 )
return
tree
.
GetPrevVisible
(
item
);
#else
// find out the starting point
wxTreeItemId
prevItem
=
tree
.
GetPrevSibling
(
item
);
if
(
!
prevItem
.
IsOk
()
)
{
prevItem
=
tree
.
GetItemParent
(
item
);
}
// find the first visible item after it
while
(
prevItem
.
IsOk
()
&&
!
tree
.
IsVisible
(
prevItem
)
)
{
prevItem
=
tree
.
GetNext
(
prevItem
);
if
(
!
prevItem
.
IsOk
()
||
prevItem
==
item
)
{
// there are no visible items before item
return
wxTreeItemId
();
}
}
// from there we must be able to navigate until this item
while
(
prevItem
.
IsOk
()
)
{
const
wxTreeItemId
nextItem
=
tree
.
GetNextVisible
(
prevItem
);
if
(
!
nextItem
.
IsOk
()
||
nextItem
==
item
)
break
;
prevItem
=
nextItem
;
}
return
prevItem
;
#endif
}
eeschema/dialogs/dialog_choose_component.h
0 → 100644
View file @
31fea1e7
/* -*- c++ -*-
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2014 Henner Zeller <h.zeller@acm.org>
* Copyright (C) 2014 KiCad Developers, see change_log.txt for contributors.
*
* This program 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 program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <dialog_choose_component_base.h>
class
COMPONENT_TREE_SEARCH_CONTAINER
;
class
LIB_COMPONENT
;
class
wxTreeItemId
;
class
DIALOG_CHOOSE_COMPONENT
:
public
DIALOG_CHOOSE_COMPONENT_BASE
{
public
:
DIALOG_CHOOSE_COMPONENT
(
wxWindow
*
aParent
,
const
wxString
&
aTitle
,
COMPONENT_TREE_SEARCH_CONTAINER
*
aSearch_container
);
/** Function GetSelectedComponentName
* To be called after this dialog returns from ShowModal().
*
* @return the component that has been selected, or an empty string if there is none.
*/
wxString
GetSelectedComponentName
()
const
;
/** Function IsExternalBrowserSelected
*
* @return true, iff the browser pressed the browsing button.
*/
bool
IsExternalBrowserSelected
()
const
{
return
m_external_browser_requested
;
}
protected
:
virtual
void
OnSearchBoxChange
(
wxCommandEvent
&
aEvent
);
virtual
void
OnSearchBoxEnter
(
wxCommandEvent
&
aEvent
);
virtual
void
OnInterceptSearchBoxKey
(
wxKeyEvent
&
aEvent
);
virtual
void
OnTreeSelect
(
wxTreeEvent
&
aEvent
);
virtual
void
OnDoubleClickTreeSelect
(
wxTreeEvent
&
aEvent
);
virtual
void
OnTreeMouseUp
(
wxMouseEvent
&
aMouseEvent
);
virtual
void
OnStartComponentBrowser
(
wxMouseEvent
&
aEvent
);
private
:
void
updateSelection
();
void
SelectIfValid
(
const
wxTreeItemId
&
aTreeId
);
COMPONENT_TREE_SEARCH_CONTAINER
*
const
m_search_container
;
LIB_COMPONENT
*
m_selected_component
;
bool
m_external_browser_requested
;
bool
m_received_doubleclick_in_tree
;
};
eeschema/dialogs/dialog_choose_component_base.cpp
0 → 100644
View file @
31fea1e7
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Nov 6 2013)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
#include "dialog_choose_component_base.h"
///////////////////////////////////////////////////////////////////////////
DIALOG_CHOOSE_COMPONENT_BASE
::
DIALOG_CHOOSE_COMPONENT_BASE
(
wxWindow
*
parent
,
wxWindowID
id
,
const
wxString
&
title
,
const
wxPoint
&
pos
,
const
wxSize
&
size
,
long
style
)
:
DIALOG_SHIM
(
parent
,
id
,
title
,
pos
,
size
,
style
)
{
this
->
SetSizeHints
(
wxSize
(
450
,
-
1
),
wxDefaultSize
);
wxBoxSizer
*
bSizer1
;
bSizer1
=
new
wxBoxSizer
(
wxVERTICAL
);
wxBoxSizer
*
bSearchSizer
;
bSearchSizer
=
new
wxBoxSizer
(
wxHORIZONTAL
);
m_searchLabel
=
new
wxStaticText
(
this
,
wxID_ANY
,
wxT
(
"Search"
),
wxDefaultPosition
,
wxDefaultSize
,
0
);
m_searchLabel
->
Wrap
(
-
1
);
bSearchSizer
->
Add
(
m_searchLabel
,
0
,
wxALL
,
5
);
m_searchBox
=
new
wxTextCtrl
(
this
,
wxID_ANY
,
wxEmptyString
,
wxDefaultPosition
,
wxDefaultSize
,
wxTE_PROCESS_ENTER
);
bSearchSizer
->
Add
(
m_searchBox
,
1
,
wxALL
,
5
);
bSizer1
->
Add
(
bSearchSizer
,
0
,
wxEXPAND
,
5
);
m_libraryComponentTree
=
new
wxTreeCtrl
(
this
,
wxID_ANY
,
wxDefaultPosition
,
wxDefaultSize
,
wxTR_DEFAULT_STYLE
|
wxTR_HIDE_ROOT
);
m_libraryComponentTree
->
SetMinSize
(
wxSize
(
-
1
,
50
)
);
bSizer1
->
Add
(
m_libraryComponentTree
,
2
,
wxALL
|
wxEXPAND
,
5
);
wxBoxSizer
*
bSizer3
;
bSizer3
=
new
wxBoxSizer
(
wxHORIZONTAL
);
m_componentView
=
new
wxStaticText
(
this
,
wxID_ANY
,
wxT
(
"TODO
\n
(mini. comp image)"
),
wxDefaultPosition
,
wxSize
(
100
,
100
),
0
);
m_componentView
->
Wrap
(
-
1
);
m_componentView
->
SetMinSize
(
wxSize
(
100
,
100
)
);
bSizer3
->
Add
(
m_componentView
,
0
,
wxALL
,
5
);
wxBoxSizer
*
bSizer6
;
bSizer6
=
new
wxBoxSizer
(
wxVERTICAL
);
m_componentDetails
=
new
wxTextCtrl
(
this
,
wxID_ANY
,
wxEmptyString
,
wxDefaultPosition
,
wxSize
(
-
1
,
100
),
wxTE_MULTILINE
);
bSizer6
->
Add
(
m_componentDetails
,
1
,
wxALL
|
wxEXPAND
,
5
);
m_unitChoice
=
new
wxComboBox
(
this
,
wxID_ANY
,
wxT
(
"Unit A"
),
wxDefaultPosition
,
wxDefaultSize
,
0
,
NULL
,
0
);
m_unitChoice
->
Enable
(
false
);
m_unitChoice
->
Hide
();
bSizer6
->
Add
(
m_unitChoice
,
0
,
wxALL
,
5
);
bSizer3
->
Add
(
bSizer6
,
2
,
wxEXPAND
,
5
);
bSizer1
->
Add
(
bSizer3
,
1
,
wxEXPAND
,
5
);
wxBoxSizer
*
bSizer5
;
bSizer5
=
new
wxBoxSizer
(
wxHORIZONTAL
);
bSizer5
->
Add
(
0
,
0
,
1
,
wxEXPAND
,
5
);
m_button
=
new
wxStdDialogButtonSizer
();
m_buttonOK
=
new
wxButton
(
this
,
wxID_OK
);
m_button
->
AddButton
(
m_buttonOK
);
m_buttonCancel
=
new
wxButton
(
this
,
wxID_CANCEL
);
m_button
->
AddButton
(
m_buttonCancel
);
m_button
->
Realize
();
bSizer5
->
Add
(
m_button
,
0
,
wxEXPAND
,
5
);
bSizer1
->
Add
(
bSizer5
,
0
,
wxEXPAND
,
5
);
this
->
SetSizer
(
bSizer1
);
this
->
Layout
();
this
->
Centre
(
wxBOTH
);
// Connect Events
m_searchBox
->
Connect
(
wxEVT_KEY_DOWN
,
wxKeyEventHandler
(
DIALOG_CHOOSE_COMPONENT_BASE
::
OnInterceptSearchBoxKey
),
NULL
,
this
);
m_searchBox
->
Connect
(
wxEVT_COMMAND_TEXT_UPDATED
,
wxCommandEventHandler
(
DIALOG_CHOOSE_COMPONENT_BASE
::
OnSearchBoxChange
),
NULL
,
this
);
m_searchBox
->
Connect
(
wxEVT_COMMAND_TEXT_ENTER
,
wxCommandEventHandler
(
DIALOG_CHOOSE_COMPONENT_BASE
::
OnSearchBoxEnter
),
NULL
,
this
);
m_libraryComponentTree
->
Connect
(
wxEVT_LEFT_UP
,
wxMouseEventHandler
(
DIALOG_CHOOSE_COMPONENT_BASE
::
OnTreeMouseUp
),
NULL
,
this
);
m_libraryComponentTree
->
Connect
(
wxEVT_COMMAND_TREE_ITEM_ACTIVATED
,
wxTreeEventHandler
(
DIALOG_CHOOSE_COMPONENT_BASE
::
OnDoubleClickTreeSelect
),
NULL
,
this
);
m_libraryComponentTree
->
Connect
(
wxEVT_COMMAND_TREE_SEL_CHANGED
,
wxTreeEventHandler
(
DIALOG_CHOOSE_COMPONENT_BASE
::
OnTreeSelect
),
NULL
,
this
);
m_componentView
->
Connect
(
wxEVT_LEFT_UP
,
wxMouseEventHandler
(
DIALOG_CHOOSE_COMPONENT_BASE
::
OnStartComponentBrowser
),
NULL
,
this
);
}
DIALOG_CHOOSE_COMPONENT_BASE
::~
DIALOG_CHOOSE_COMPONENT_BASE
()
{
// Disconnect Events
m_searchBox
->
Disconnect
(
wxEVT_KEY_DOWN
,
wxKeyEventHandler
(
DIALOG_CHOOSE_COMPONENT_BASE
::
OnInterceptSearchBoxKey
),
NULL
,
this
);
m_searchBox
->
Disconnect
(
wxEVT_COMMAND_TEXT_UPDATED
,
wxCommandEventHandler
(
DIALOG_CHOOSE_COMPONENT_BASE
::
OnSearchBoxChange
),
NULL
,
this
);
m_searchBox
->
Disconnect
(
wxEVT_COMMAND_TEXT_ENTER
,
wxCommandEventHandler
(
DIALOG_CHOOSE_COMPONENT_BASE
::
OnSearchBoxEnter
),
NULL
,
this
);
m_libraryComponentTree
->
Disconnect
(
wxEVT_LEFT_UP
,
wxMouseEventHandler
(
DIALOG_CHOOSE_COMPONENT_BASE
::
OnTreeMouseUp
),
NULL
,
this
);
m_libraryComponentTree
->
Disconnect
(
wxEVT_COMMAND_TREE_ITEM_ACTIVATED
,
wxTreeEventHandler
(
DIALOG_CHOOSE_COMPONENT_BASE
::
OnDoubleClickTreeSelect
),
NULL
,
this
);
m_libraryComponentTree
->
Disconnect
(
wxEVT_COMMAND_TREE_SEL_CHANGED
,
wxTreeEventHandler
(
DIALOG_CHOOSE_COMPONENT_BASE
::
OnTreeSelect
),
NULL
,
this
);
m_componentView
->
Disconnect
(
wxEVT_LEFT_UP
,
wxMouseEventHandler
(
DIALOG_CHOOSE_COMPONENT_BASE
::
OnStartComponentBrowser
),
NULL
,
this
);
}
eeschema/dialogs/dialog_choose_component_base.fbp
0 → 100644
View file @
31fea1e7
This diff is collapsed.
Click to expand it.
eeschema/dialogs/dialog_choose_component_base.h
0 → 100644
View file @
31fea1e7
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Nov 6 2013)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
#ifndef __DIALOG_CHOOSE_COMPONENT_BASE_H__
#define __DIALOG_CHOOSE_COMPONENT_BASE_H__
#include <wx/artprov.h>
#include <wx/xrc/xmlres.h>
class
DIALOG_SHIM
;
#include "dialog_shim.h"
#include <wx/string.h>
#include <wx/stattext.h>
#include <wx/gdicmn.h>
#include <wx/font.h>
#include <wx/colour.h>
#include <wx/settings.h>
#include <wx/textctrl.h>
#include <wx/sizer.h>
#include <wx/treectrl.h>
#include <wx/combobox.h>
#include <wx/button.h>
#include <wx/dialog.h>
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/// Class DIALOG_CHOOSE_COMPONENT_BASE
///////////////////////////////////////////////////////////////////////////////
class
DIALOG_CHOOSE_COMPONENT_BASE
:
public
DIALOG_SHIM
{
private
:
protected
:
wxStaticText
*
m_searchLabel
;
wxTextCtrl
*
m_searchBox
;
wxTreeCtrl
*
m_libraryComponentTree
;
wxStaticText
*
m_componentView
;
wxTextCtrl
*
m_componentDetails
;
wxComboBox
*
m_unitChoice
;
wxStdDialogButtonSizer
*
m_button
;
wxButton
*
m_buttonOK
;
wxButton
*
m_buttonCancel
;
// Virtual event handlers, overide them in your derived class
virtual
void
OnInterceptSearchBoxKey
(
wxKeyEvent
&
event
)
{
event
.
Skip
();
}
virtual
void
OnSearchBoxChange
(
wxCommandEvent
&
event
)
{
event
.
Skip
();
}
virtual
void
OnSearchBoxEnter
(
wxCommandEvent
&
event
)
{
event
.
Skip
();
}
virtual
void
OnTreeMouseUp
(
wxMouseEvent
&
event
)
{
event
.
Skip
();
}
virtual
void
OnDoubleClickTreeSelect
(
wxTreeEvent
&
event
)
{
event
.
Skip
();
}
virtual
void
OnTreeSelect
(
wxTreeEvent
&
event
)
{
event
.
Skip
();
}
virtual
void
OnStartComponentBrowser
(
wxMouseEvent
&
event
)
{
event
.
Skip
();
}
public
:
DIALOG_CHOOSE_COMPONENT_BASE
(
wxWindow
*
parent
,
wxWindowID
id
=
wxID_ANY
,
const
wxString
&
title
=
wxEmptyString
,
const
wxPoint
&
pos
=
wxDefaultPosition
,
const
wxSize
&
size
=
wxSize
(
450
,
500
),
long
style
=
wxDEFAULT_DIALOG_STYLE
|
wxRESIZE_BORDER
);
~
DIALOG_CHOOSE_COMPONENT_BASE
();
};
#endif //__DIALOG_CHOOSE_COMPONENT_BASE_H__
eeschema/getpart.cpp
View file @
31fea1e7
...
...
@@ -45,11 +45,14 @@
#include <viewlib_frame.h>
#include <eeschema_id.h>
#include <dialog_choose_component.h>
#include <component_tree_search_container.h>
#include <dialog_get_component.h>
#include <boost/foreach.hpp>
// TODO(hzeller): would be good if we could give a pre-selected component.
wxString
SCH_BASE_FRAME
::
SelectComponentFromLibBrowser
(
void
)
{
wxSemaphore
semaphore
(
0
,
1
);
...
...
@@ -76,118 +79,66 @@ wxString SCH_BASE_FRAME::SelectComponentFromLibBrowser( void )
return
cmpname
;
}
wxString
SCH_BASE_FRAME
::
SelectComponentFromLibrary
(
const
wxString
&
aLibname
,
wxArrayString
&
aHistoryList
,
bool
aUseLibBrowser
,
int
*
aUnit
,
int
*
aConvert
)
{
int
CmpCount
=
0
;
LIB_COMPONENT
*
libEntry
=
NULL
;
CMP_LIBRARY
*
currLibrary
=
NULL
;
wxString
cmpName
,
keys
,
msg
;
bool
allowWildSeach
=
true
;
int
cmpCount
=
0
;
wxString
dialogTitle
;
COMPONENT_TREE_SEARCH_CONTAINER
search_container
;
// Container doing search-as-you-type
if
(
!
aLibname
.
IsEmpty
()
)
{
currLibrary
=
CMP_LIBRARY
::
FindLibrary
(
aLibname
);
CMP_LIBRARY
*
currLibrary
=
CMP_LIBRARY
::
FindLibrary
(
aLibname
);
if
(
currLibrary
!=
NULL
)
CmpCount
=
currLibrary
->
GetCount
();
{
cmpCount
=
currLibrary
->
GetCount
();
search_container
.
AddLibrary
(
*
currLibrary
);
}
}
else
{
BOOST_FOREACH
(
CMP_LIBRARY
&
lib
,
CMP_LIBRARY
::
GetLibraryList
()
)
{
CmpCount
+=
lib
.
GetCount
();
cmpCount
+=
lib
.
GetCount
();
search_container
.
AddLibrary
(
lib
);
}
}
// Ask for a component name or key words
msg
.
Printf
(
_
(
"Component selection (%d items loaded):"
),
CmpCount
);
DIALOG_GET_COMPONENT
dlg
(
this
,
aHistoryList
,
msg
,
aUseLibBrowser
);
if
(
!
aHistoryList
.
empty
()
)
{
// This is good for a transition for experineced users: giving them a History. Ideally,
// we actually make this part even faster to access with a popup on ALT-a or something.
search_container
.
AddComponentList
(
_
(
"-- History --"
),
aHistoryList
,
NULL
,
true
);
search_container
.
SetPreselectNode
(
aHistoryList
[
0
]
);
}
if
(
aHistoryList
.
GetCount
()
)
dlg
.
SetComponentName
(
aHistoryList
[
0
]
);
dialogTitle
.
Printf
(
_
(
"Choose Component (%d items loaded)"
),
cmpCount
);
DIALOG_CHOOSE_COMPONENT
dlg
(
this
,
dialogTitle
,
&
search_container
);
if
(
dlg
.
ShowModal
()
==
wxID_CANCEL
)
return
wxEmptyString
;
if
(
dlg
.
m_GetExtraFunction
)
wxString
cmpName
=
dlg
.
GetSelectedComponentName
();
if
(
dlg
.
IsExternalBrowserSelected
()
)
{
cmpName
=
SelectComponentFromLibBrowser
();
cmpName
=
SelectComponentFromLibBrowser
();
// Would be good if we could pre-select.
if
(
aUnit
)
*
aUnit
=
LIB_VIEW_FRAME
::
GetUnit
();
if
(
aConvert
)
*
aConvert
=
LIB_VIEW_FRAME
::
GetConvert
();
if
(
!
cmpName
.
IsEmpty
()
)
AddHistoryComponentName
(
aHistoryList
,
cmpName
);
return
cmpName
;
}
else
cmpName
=
dlg
.
GetComponentName
();
if
(
cmpName
.
IsEmpty
()
)
return
wxEmptyString
;
// Here, cmpName contains the component name,
// or "*" if the Select All dialog button was pressed
#ifndef KICAD_KEEPCASE
cmpName
.
MakeUpper
();
#endif
if
(
dlg
.
IsKeyword
()
)
{
allowWildSeach
=
false
;
keys
=
cmpName
;
cmpName
=
DataBaseGetName
(
this
,
keys
,
cmpName
);
if
(
cmpName
.
IsEmpty
()
)
return
wxEmptyString
;
}
else
if
(
cmpName
==
wxT
(
"*"
)
)
{
allowWildSeach
=
false
;
if
(
GetNameOfPartToLoad
(
this
,
currLibrary
,
cmpName
)
==
0
)
return
wxEmptyString
;
}
else
if
(
cmpName
.
Contains
(
wxT
(
"?"
)
)
||
cmpName
.
Contains
(
wxT
(
"*"
)
)
)
{
allowWildSeach
=
false
;
cmpName
=
DataBaseGetName
(
this
,
keys
,
cmpName
);
if
(
cmpName
.
IsEmpty
()
)
return
wxEmptyString
;
}
libEntry
=
CMP_LIBRARY
::
FindLibraryComponent
(
cmpName
,
aLibname
);
if
(
!
libEntry
&&
allowWildSeach
)
// Search with wildcard
{
allowWildSeach
=
false
;
wxString
wildname
=
wxChar
(
'*'
)
+
cmpName
+
wxChar
(
'*'
);
cmpName
=
wildname
;
cmpName
=
DataBaseGetName
(
this
,
keys
,
cmpName
);
if
(
!
cmpName
.
IsEmpty
()
)
libEntry
=
CMP_LIBRARY
::
FindLibraryComponent
(
cmpName
,
aLibname
);
if
(
!
libEntry
)
return
wxEmptyString
;
}
if
(
!
libEntry
)
{
msg
.
Printf
(
_
(
"Failed to find part <%s> in library"
),
GetChars
(
cmpName
)
);
DisplayError
(
this
,
msg
);
return
wxEmptyString
;
}
if
(
!
cmpName
.
empty
()
)
AddHistoryComponentName
(
aHistoryList
,
cmpName
);
AddHistoryComponentName
(
aHistoryList
,
cmpName
);
return
cmpName
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment