|
|
Home » U++ Library support » TreeCtrl » SetFocus with EditString as Node
SetFocus with EditString as Node [message #40901] |
Sat, 05 October 2013 15:35  |
iST1
Messages: 107 Registered: August 2013
|
Experienced Member |
|
|
This is simple edit node example (based on <a href=" http://www.ultimatepp.org/forum/index.php?t=msg&th=6380& amp;start=0&" target="_blank"></a>) with SetFocus problem when first "Add" button click:
class EditableTree : public TreeCtrl {
public:
EditableTree() : selId_(-1) {
editNode.SetCtrl(edit);
OpenDeep(0, true);
}
void AddNode() {
CloseEdit();
int selId_ = Add(0);
edit.SetData("Node" + AsString(selId_));
edit.Show();
edit.AutoSize();
edit.SetFocus();//at first not select because IsOpen is false => why?
SetNode(selId_, editNode);
}
void CloseEdit() {
if (selId_ > 0) {
SetNode(selId_, Node(~edit));
edit.Hide();
}
}
private:
int selId_;
EditString edit;
TreeCtrl::Node editNode;
};
GUI_APP_MAIN
{
TopWindow wnd;
Button btn;
wnd.Add(btn.SetLabel("Add").LeftPos(10).TopPos(10));
EditableTree tree;
wnd.Add(tree.VSizePos(40).HSizePos());
btn <<= callback(&tree, &EditableTree::AddNode);
wnd.Run();
}
[Updated on: Sat, 05 October 2013 15:35] Report message to a moderator
|
|
|
Re: SetFocus with EditString as Node [message #40918 is a reply to message #40901] |
Mon, 07 October 2013 20:20   |
 |
mirek
Messages: 14255 Registered: November 2005
|
Ultimate Member |
|
|
iST1 wrote on Sat, 05 October 2013 09:35 | This is simple edit node example (based on <a href=" http://www.ultimatepp.org/forum/index.php?t=msg&th=6380& amp; amp;start=0&" target="_blank"></a>) with SetFocus problem when first "Add" button click:
class EditableTree : public TreeCtrl {
public:
EditableTree() : selId_(-1) {
editNode.SetCtrl(edit);
OpenDeep(0, true);
}
void AddNode() {
CloseEdit();
int selId_ = Add(0);
edit.SetData("Node" + AsString(selId_));
edit.Show();
edit.AutoSize();
edit.SetFocus();//at first not select because IsOpen is false => why?
SetNode(selId_, editNode);
}
void CloseEdit() {
if (selId_ > 0) {
SetNode(selId_, Node(~edit));
edit.Hide();
}
}
private:
int selId_;
EditString edit;
TreeCtrl::Node editNode;
};
GUI_APP_MAIN
{
TopWindow wnd;
Button btn;
wnd.Add(btn.SetLabel("Add").LeftPos(10).TopPos(10));
EditableTree tree;
wnd.Add(tree.VSizePos(40).HSizePos());
btn <<= callback(&tree, &EditableTree::AddNode);
wnd.Run();
}
|
Should be fixed, however you have to use SetFocus AFTER SetNode,
because only widget that is descendant of open window can have focus and until SetNode, edit is not assigned to any window. However, TreeCtrl still needed fixing to make it work...
|
|
|
|
|
|
|
|
|
Re: SetFocus with EditString as Node [message #41104 is a reply to message #41082] |
Thu, 31 October 2013 15:06   |
iST1
Messages: 107 Registered: August 2013
|
Experienced Member |
|
|
Mirek, can you fixed this code? I have no idea
class EditableTree : public TreeCtrl {
public:
typedef EditableTree CLASSNAME;
EditableTree() : selId_(0) {
NoRoot().MultiSelect(true).HighlightCtrl(false);
WhenSel = THISBACK(OnSelect);
}
int AddNode(int parent) {
EditString &edit = edit_.Add(edit_.GetCount());
edit.SetData("NODE" + AsString(GetChildCount(parent) + 1));
edit.AutoSize();
edit.SetFrame(NullFrame());
Node node;
node.SetCtrl(edit);
return Add(parent, node);
}
void OnAddNode() {
int id = AddNode(selId_);
Open(selId_);
edit_.Get(edit_.GetCount() - 1).SetFocus();
}
void OnSelect() {
if (GetSelectCount() <= 0 || selId_ == GetSel()[0])
return;
selId_ = GetSel()[0];
}
private:
int selId_;
ArrayMap<int, EditString> edit_;
};
GUI_APP_MAIN
{
TopWindow wnd;
Button btn;
wnd.Add(btn.SetLabel("Add").LeftPos(10).TopPos(10));
EditableTree tree;
wnd.Add(tree.VSizePos(40).HSizePos());
tree.AddNode(0);
tree.AddNode(0);
btn <<= callback(&tree, &EditableTree::OnAddNode);
wnd.Run();
}
[Updated on: Thu, 31 October 2013 15:07] Report message to a moderator
|
|
|
|
|
Re: SetFocus with EditString as Node [message #41148 is a reply to message #41128] |
Wed, 06 November 2013 16:36   |
iST1
Messages: 107 Registered: August 2013
|
Experienced Member |
|
|
And some one trouble
class EditableTree : public TreeCtrl {
public:
typedef EditableTree CLASSNAME;
EditableTree() : selId_(0) {
NoRoot().MultiSelect(true).HighlightCtrl(false);
WhenSel = THISBACK(OnSelect);
}
bool Key(dword key, int count) {
if (K_ENTER != key || selId_ <= 0) {
return 1;
}
AddNode(0);
Single<TopWindow>().Run();//=> ASSERTION: WindowProc invoked for class Upp::TopWindow while in Paint routine
}
int AddNode(int parent) {
EditString &edit = edit_.Add(edit_.GetCount());
edit.SetData("NODE" + AsString(GetChildCount(parent) + 1));
edit.AutoSize();
edit.SetFrame(NullFrame());
Node node;
node.SetCtrl(edit);
return Add(parent, node);
}
void OnSelect() {
if (GetSelectCount() <= 0 || selId_ == GetSel()[0])
return;
selId_ = GetSel()[0];
}
private:
int selId_;
ArrayMap<int, EditString> edit_;
};
GUI_APP_MAIN
{
TopWindow wnd;
EditableTree tree;
wnd.Add(tree.VSizePos(40).HSizePos());
tree.AddNode(0);
tree.AddNode(0);
wnd.Run();
}
[Updated on: Wed, 06 November 2013 16:37] Report message to a moderator
|
|
|
|
|
Re: SetFocus with EditString as Node [message #41162 is a reply to message #41161] |
Thu, 07 November 2013 18:38   |
iST1
Messages: 107 Registered: August 2013
|
Experienced Member |
|
|
Thank you very much!
There is another moment: in my old code MultiSelect(true) is used to set cursor in the end of EditString:
edit.SetSelection(AsString(~edit).GetCount());
when node selecting (WhenSel callback). The example before whit MultiSelect(true) doesn't work correctly. It is easy to solve? PS: ideally when user clicked mouse selId_ value must be set, whereupon we can do everything whit appropriate node.
[Updated on: Thu, 07 November 2013 18:44] Report message to a moderator
|
|
|
|
|
|
|
Re: SetFocus with EditString as Node [message #41178 is a reply to message #41173] |
Fri, 08 November 2013 17:46   |
iST1
Messages: 107 Registered: August 2013
|
Experienced Member |
|
|
UDP: small fixes to illustrate trouble
class EditableTree : public TreeCtrl {
Array<EditString> edits;
public:
typedef EditableTree CLASSNAME;
EditableTree() : selId_(0) {
NoRoot().HighlightCtrl(false);
WhenSel = THISBACK(OnSelect);
}
void OnSelect() {
selId_ = GetCursor();//not called
//..some node view preparing
}
int AddNode(int parent_id) {
EditString& edit = edits.Add();
edit.AutoSize().SetFrame(NullFrame());
edit <<= "NODE" + AsString(GetChildCount(parent_id) + 1);
return Add(parent_id, Null, edit);
}
void OnAddNode() {
if (!IsCursor())
return;
SetCursor(AddNode(selId_));
}
private:
int selId_;
};
[Updated on: Mon, 11 November 2013 09:35] Report message to a moderator
|
|
|
Goto Forum:
Current Time: Fri Apr 25 21:34:43 CEST 2025
Total time taken to generate the page: 0.01471 seconds
|
|
|