csharp texteditor app: Revamping of this example

Summary:
Added save and load buttons.
Added information popups.
Adapted to the style of the rest of the csharp examples.

Reviewers: lauromoura, vitor.sousa, felipealmeida, ajwillia.ms

Reviewed By: lauromoura

Differential Revision: https://phab.enlightenment.org/D7173
This commit is contained in:
Xavi Artigas 2018-10-19 15:30:16 +02:00
parent eb2cf48195
commit a040529352
1 changed files with 162 additions and 90 deletions

View File

@ -1,141 +1,213 @@
/* Simple text editor with a main text box and a toolbar on top:
+vbox----------------------------------------+
| +hbox------------------------------------+ |
| | +btn-+ +btn-+ +btn-+ +box-----+ +btn-+ | |
| | |NEW | |SAVE| |LOAD| | spacer | |QUIT| | |
| | +----+ +----+ +----+ +--------+ +----+ | |
| +----------------------------------------+ |
| +text------------------------------------+ |
| | | |
| | | |
| | Main text box | |
| | | |
| | | |
| +----------------------------------------+ |
+--------------------------------------------+
*/
using System; using System;
public class TextEditor : IDisposable public class TextEditor
{ {
private efl.ui.IWin win; private efl.ui.IWin win; // The main window
private efl.ui.IText editor; private efl.ui.IText editorTextBox; // The main text entry
private efl.ui.IButton toolbarNew; private efl.ui.IButton toolbarButtonNew; // The "New" button in the toolbar
private efl.ui.IButton toolbarButtonSave; // The "Save" button in the toolbar
private efl.ui.IButton toolbarButtonLoad; // The "Load" button in the toolbar
private bool edited = false; private bool edited = false; // Document was edited since last save
// File to load and save is fixed since we do not use a file selection dialog
private readonly string filename = System.IO.Path.Combine(System.IO.Path.GetTempPath(),
"texteditor_example.txt");
// Quits the application
private void GUIQuitCb(object sender, EventArgs ea) private void GUIQuitCb(object sender, EventArgs ea)
{ {
efl.ui.Config.Exit(); efl.ui.Config.Exit();
} }
// Enables or disables buttons on the toolbar as required
private void GUIToolbarRefresh()
{
// "New" is enabled if there is text in the text box
toolbarButtonNew.SetDisabled(string.IsNullOrEmpty(editorTextBox.GetText()));
// "Save" is enabled if the text has been modified since last save or load
toolbarButtonSave.SetDisabled(!edited);
// "Load" is enabled if there is a file to load
toolbarButtonLoad.SetDisabled(!System.IO.File.Exists(filename));
}
// Called when the text in the editor has changed
private void EditorChangedCb(object sender, EventArgs ea) private void EditorChangedCb(object sender, EventArgs ea)
{ {
edited = true; edited = true;
GUIToolbarRefresh(); GUIToolbarRefresh();
} }
private efl.ui.IButton GUIToolbarButtonAdd(efl.ui.IBox toolbar, string name, string iconName, EventHandler func) // Shows a modal message popup with an "OK" button
private void ShowMessage(string message)
{ {
efl.ui.IButton button = new efl.ui.Button(toolbar); new efl.ui.Popup_Alert_Text (win, (efl.ui.IPopup_Alert_Text epopup) => {
button.SetText(name); epopup.SetText(message);
button.ClickedEvt += func; epopup.SetExpandable(new eina.Size2D(200,200));
epopup.SetButton(efl.ui.Popup_Alert_Button.Positive, "OK", null);
toolbar.DoPack(button); epopup.ButtonClickedEvt +=
(object sender, efl.ui.Popup_Alert.ButtonClickedEvt_Args ea) => {
efl.ui.IImage img = new efl.ui.Image(toolbar); // Dismiss popup when the button is clicked
img.SetIcon(iconName); ((efl.ui.IPopup_Alert_Text)sender).SetParent(null);
};
efl.Content.static_cast(button.GetPart("efl.content")).SetContent(img); });
return button;
} }
// Adds a button to the toolbar, with the given text, icon and click event handler
private efl.ui.IButton GUIToolbarButtonAdd(efl.ui.IBox toolbar, string name,
string iconName, EventHandler func)
{
return new efl.ui.Button(toolbar, (efl.ui.IButton ebutton) => {
ebutton.SetText(name);
ebutton.ClickedEvt += func;
ebutton.SetHintWeight(0, 1);
toolbar.DoPack(ebutton);
// Set the content of the button
efl.Content.static_cast(ebutton.GetPart("efl.content")).SetContent(
// Which is an image
new efl.ui.Image(toolbar, (efl.ui.IImage eimage) => {
eimage.SetIcon(iconName);
})
);
});
}
// Creates a new toolbar, with all its buttons
private void GUIToolbarSetup(efl.ui.IBox parent) private void GUIToolbarSetup(efl.ui.IBox parent)
{ {
efl.ui.IBox bar = new efl.ui.Box(parent); // Create a horizontal box container for the buttons
bar.SetHintWeight(1, 0); efl.ui.IBox bar = new efl.ui.Box(parent, (efl.ui.IBox ebox) => {
bar.SetDirection(efl.ui.Dir.Horizontal); // 0 vertical weight means that the toolbar will have the minimum height
parent.DoPack(bar); // to accommodate all its buttons and not a pixel more. The rest of the
// space will be given to the other object in the parent container.
ebox.SetHintWeight(1, 0);
ebox.SetDirection(efl.ui.Dir.Horizontal);
parent.DoPack(ebox);
});
toolbarNew = GUIToolbarButtonAdd(bar, "New", "document-new", // "New" button
(object sender, EventArgs ea) => toolbarButtonNew = GUIToolbarButtonAdd(bar, "New", "document-new",
{ (object sender, EventArgs ea) => {
editor.SetText(""); // When this button is clicked, remove content and refresh toolbar
editorTextBox.SetText("");
GUIToolbarRefresh();
});
// "Save" button
toolbarButtonSave = GUIToolbarButtonAdd(bar, "Save", "document-save",
(object sender, EventArgs ea) => {
// When this button is clicked, try to save content and refresh toolbar
try {
System.IO.File.WriteAllText(filename, editorTextBox.GetText());
edited = false; edited = false;
GUIToolbarRefresh(); GUIToolbarRefresh();
ShowMessage("Saved!");
} catch (Exception e) {
// If something fails, show the error message
ShowMessage(e.Message);
}
}); });
// spacer box // "Load" button
toolbarButtonLoad = GUIToolbarButtonAdd(bar, "Load", "document-open",
(object sender, EventArgs ea) => {
// When this button is clicked, try to load content and refresh toolbar
try {
editorTextBox.SetText(System.IO.File.ReadAllText(filename));
edited = false;
GUIToolbarRefresh();
ShowMessage("Loaded!");
} catch (Exception e) {
// If something fails, show the error message
ShowMessage(e.Message);
}
});
// Spacer box to use all available space not required by buttons
// (It has a default horizontal weight of 1, whereas all buttons have
// a horizontal weight of 0).
// As a result, it pushes the "Quit" button to the right margin and
// the rest to the left.
efl.ui.IBox box = new efl.ui.Box(parent); efl.ui.IBox box = new efl.ui.Box(parent);
box.SetHintWeight(10, 0);
bar.DoPack(box); bar.DoPack(box);
// "Quit" button
GUIToolbarButtonAdd(bar, "Quit", "application-exit", GUIQuitCb); GUIToolbarButtonAdd(bar, "Quit", "application-exit", GUIQuitCb);
}
// Builds the user interface for the text editor
public TextEditor()
{
// Create a window and initialize it
win = new efl.ui.Win(efl.App.GetLoopMain(), (efl.ui.IWin ewin) => {
ewin.SetText("Text Editor");
ewin.SetAutohide(true);
ewin.HideEvt += GUIQuitCb;
});
// Create a vertical box container
efl.ui.IBox box = new efl.ui.Box(win);
win.SetContent(box);
// Create the toolbar and add it to the box
GUIToolbarSetup(box);
// Create the main text entry
editorTextBox = new efl.ui.Text(box, (efl.ui.IText etext) => {
etext.SetFont("Mono", 14);
etext.SetMultiline(true);
etext.SetEditable(true);
etext.SetScrollable(true);
etext.SetHintMin(new eina.Size2D(360, 240));
etext.ChangedEvt += EditorChangedCb;
etext.ChangedUserEvt += EditorChangedCb;
box.DoPack(etext);
});
// Initial refresh of the toolbar buttons
GUIToolbarRefresh(); GUIToolbarRefresh();
} }
private void GUIToolbarRefresh() // This method won't return until the application quits
{
toolbarNew.SetDisabled(!edited);
}
public TextEditor()
{
win = new efl.ui.Win(null, (efl.ui.IWin ewin) => {
ewin.SetWinType(efl.ui.Win_Type.Basic);
ewin.SetText("Text Editor");
ewin.SetAutohide(true);
});
// when the user clicks "close" on a window there is a request to hide
win.HideEvt += GUIQuitCb;
efl.ui.IBox box = new efl.ui.Box(win);
eina.Size2D sz;
sz.W = 360;
sz.H = 240;
box.SetHintMin(sz);
win.SetContent(box);
GUIToolbarSetup(box);
editor = new efl.ui.Text(box);
editor.SetFont("Mono", 14);
editor.SetMultiline(true);
editor.SetEditable(true);
editor.SetScrollable(true);
editor.SetScrollable(true);
editor.ChangedEvt += EditorChangedCb;
editor.ChangedUserEvt += EditorChangedCb;
box.DoPack(editor);
}
~TextEditor()
{
Dispose(false);
}
protected void Dispose(bool disposing)
{
editor.Dispose();
toolbarNew.Dispose();
win.Dispose();
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
public void Run() public void Run()
{ {
// start main loop // Start the EFL main loop
efl.ui.Config.Run(); efl.ui.Config.Run();
} }
} }
public class Example public class Example
{ {
#if WIN32
[STAThreadAttribute()]
#endif
public static void Main() public static void Main()
{ {
// Initialize EFL and all UI components
efl.All.Init(efl.Components.Ui); efl.All.Init(efl.Components.Ui);
var textEditor = new TextEditor(); var textEditor = new TextEditor();
textEditor.Run(); textEditor.Run();
// dispose after quit // Shutdown EFL
textEditor.Dispose();
efl.All.Shutdown(); efl.All.Shutdown();
} }
} }