mirror of
https://github.com/gui-cs/Terminal.Gui.git
synced 2025-12-28 16:58:01 +01:00
updated docs further, added UICatalog API, clean up
This commit is contained in:
@@ -1,115 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<!--[if IE]><![endif]-->
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<title>Conceptual Documentation </title>
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<meta name="title" content="Conceptual Documentation ">
|
||||
<meta name="generator" content="docfx 2.53.1.0">
|
||||
|
||||
<link rel="shortcut icon" href="../favicon.ico">
|
||||
<link rel="stylesheet" href="../styles/docfx.vendor.css">
|
||||
<link rel="stylesheet" href="../styles/docfx.css">
|
||||
<link rel="stylesheet" href="../styles/main.css">
|
||||
<link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet">
|
||||
<meta property="docfx:navrel" content="">
|
||||
<meta property="docfx:tocrel" content="">
|
||||
|
||||
<meta property="docfx:rel" content="../">
|
||||
|
||||
</head> <body data-spy="scroll" data-target="#affix" data-offset="120">
|
||||
<div id="wrapper">
|
||||
<header>
|
||||
|
||||
<nav id="autocollapse" class="navbar navbar-inverse ng-scope" role="navigation">
|
||||
<div class="container">
|
||||
<div class="navbar-header">
|
||||
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar">
|
||||
<span class="sr-only">Toggle navigation</span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</button>
|
||||
|
||||
<a class="navbar-brand" href="../index.html">
|
||||
<img id="logo" class="svg" src="../images/logo48.png" alt="">
|
||||
</a>
|
||||
</div>
|
||||
<div class="collapse navbar-collapse" id="navbar">
|
||||
<form class="navbar-form navbar-right" role="search" id="search">
|
||||
<div class="form-group">
|
||||
<input type="text" class="form-control" id="search-query" placeholder="Search" autocomplete="off">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div class="subnav navbar navbar-default">
|
||||
<div class="container hide-when-search" id="breadcrumb">
|
||||
<ul class="breadcrumb">
|
||||
<li></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
<div class="container body-content">
|
||||
|
||||
<div id="search-results">
|
||||
<div class="search-list"></div>
|
||||
<div class="sr-items">
|
||||
<p><i class="glyphicon glyphicon-refresh index-loading"></i></p>
|
||||
</div>
|
||||
<ul id="pagination"></ul>
|
||||
</div>
|
||||
</div>
|
||||
<div role="main" class="container body-content hide-when-search">
|
||||
<div class="article row grid">
|
||||
<div class="col-md-10">
|
||||
<article class="content wrap" id="_content" data-uid="">
|
||||
<h1 id="conceptual-documentation">Conceptual Documentation</h1>
|
||||
|
||||
<ul>
|
||||
<li><a href="overview.html">Terminal.Gui Overview</a></li>
|
||||
<li><a href="keyboard.html">Keyboard Event Processing</a></li>
|
||||
<li><a href="mainloop.html">Event Processing and the Application Main Loop</a></li>
|
||||
</ul>
|
||||
</article>
|
||||
</div>
|
||||
|
||||
<div class="hidden-sm col-md-2" role="complementary">
|
||||
<div class="sideaffix">
|
||||
<div class="contribution">
|
||||
<ul class="nav">
|
||||
</ul>
|
||||
</div>
|
||||
<nav class="bs-docs-sidebar hidden-print hidden-xs hidden-sm affix" id="affix">
|
||||
<!-- <p><a class="back-to-top" href="#top">Back to top</a><p> -->
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<footer>
|
||||
<div class="grad-bottom"></div>
|
||||
<div class="footer">
|
||||
<div class="container">
|
||||
<span class="pull-right">
|
||||
<a href="#top">Back to top</a>
|
||||
</span>
|
||||
|
||||
<span>Generated by <strong>DocFX</strong></span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript" src="../styles/docfx.vendor.js"></script>
|
||||
<script type="text/javascript" src="../styles/docfx.js"></script>
|
||||
<script type="text/javascript" src="../styles/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,137 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<!--[if IE]><![endif]-->
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<title>Keyboard Event Processing </title>
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<meta name="title" content="Keyboard Event Processing ">
|
||||
<meta name="generator" content="docfx 2.53.1.0">
|
||||
|
||||
<link rel="shortcut icon" href="../favicon.ico">
|
||||
<link rel="stylesheet" href="../styles/docfx.vendor.css">
|
||||
<link rel="stylesheet" href="../styles/docfx.css">
|
||||
<link rel="stylesheet" href="../styles/main.css">
|
||||
<link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet">
|
||||
<meta property="docfx:navrel" content="">
|
||||
<meta property="docfx:tocrel" content="">
|
||||
|
||||
<meta property="docfx:rel" content="../">
|
||||
|
||||
</head> <body data-spy="scroll" data-target="#affix" data-offset="120">
|
||||
<div id="wrapper">
|
||||
<header>
|
||||
|
||||
<nav id="autocollapse" class="navbar navbar-inverse ng-scope" role="navigation">
|
||||
<div class="container">
|
||||
<div class="navbar-header">
|
||||
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar">
|
||||
<span class="sr-only">Toggle navigation</span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</button>
|
||||
|
||||
<a class="navbar-brand" href="../index.html">
|
||||
<img id="logo" class="svg" src="../images/logo48.png" alt="">
|
||||
</a>
|
||||
</div>
|
||||
<div class="collapse navbar-collapse" id="navbar">
|
||||
<form class="navbar-form navbar-right" role="search" id="search">
|
||||
<div class="form-group">
|
||||
<input type="text" class="form-control" id="search-query" placeholder="Search" autocomplete="off">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div class="subnav navbar navbar-default">
|
||||
<div class="container hide-when-search" id="breadcrumb">
|
||||
<ul class="breadcrumb">
|
||||
<li></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
<div class="container body-content">
|
||||
|
||||
<div id="search-results">
|
||||
<div class="search-list"></div>
|
||||
<div class="sr-items">
|
||||
<p><i class="glyphicon glyphicon-refresh index-loading"></i></p>
|
||||
</div>
|
||||
<ul id="pagination"></ul>
|
||||
</div>
|
||||
</div>
|
||||
<div role="main" class="container body-content hide-when-search">
|
||||
<div class="article row grid">
|
||||
<div class="col-md-10">
|
||||
<article class="content wrap" id="_content" data-uid="">
|
||||
<h1 id="keyboard-event-processing">Keyboard Event Processing</h1>
|
||||
|
||||
<p>Keyboard events are sent by the <a href="mainloop.html">Main Loop</a> to the
|
||||
Application class for processing. The keyboard events are sent
|
||||
exclusively to the current <code>Toplevel</code>, this being either the default
|
||||
that is created when you call <code>Application.Init</code>, or one that you
|
||||
created an passed to <code>Application.Run(Toplevel)</code>. </p>
|
||||
<h2 id="flow">Flow</h2>
|
||||
<p>Keystrokes are first processes as hotkeys, then as regular keys, and
|
||||
there is a final cold post-processing event that is invoked if no view
|
||||
processed the key.</p>
|
||||
<h2 id="hotkey-processing">HotKey Processing</h2>
|
||||
<p>Events are first send to all views as a "HotKey", this means that the
|
||||
<code>View.ProcessHotKey</code> method is invoked on the current toplevel, which
|
||||
in turns propagates this to all the views in the hierarchy. If any
|
||||
view decides to process the event, no further processing takes place.</p>
|
||||
<p>This is how hotkeys for buttons are implemented. For example, the
|
||||
keystroke "Alt-A" is handled by Buttons that have a hot-letter "A" to
|
||||
activate the button.</p>
|
||||
<h2 id="regular-processing">Regular Processing</h2>
|
||||
<p>Unlike the hotkey processing, the regular processing is only sent to
|
||||
the currently focused view in the focus chain.</p>
|
||||
<p>The regular key processing is only invoked if no hotkey was caught.</p>
|
||||
<h2 id="cold-key-processing">Cold-key Processing</h2>
|
||||
<p>This stage only is executed if the focused view did not process the
|
||||
event, and is broadcast to all the views in the Toplevel.</p>
|
||||
<p>This method can be overwritten by views that want to provide
|
||||
accelerator functionality (Alt-key for example), but without
|
||||
interefering with normal ProcessKey behavior.</p>
|
||||
</article>
|
||||
</div>
|
||||
|
||||
<div class="hidden-sm col-md-2" role="complementary">
|
||||
<div class="sideaffix">
|
||||
<div class="contribution">
|
||||
<ul class="nav">
|
||||
</ul>
|
||||
</div>
|
||||
<nav class="bs-docs-sidebar hidden-print hidden-xs hidden-sm affix" id="affix">
|
||||
<!-- <p><a class="back-to-top" href="#top">Back to top</a><p> -->
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<footer>
|
||||
<div class="grad-bottom"></div>
|
||||
<div class="footer">
|
||||
<div class="container">
|
||||
<span class="pull-right">
|
||||
<a href="#top">Back to top</a>
|
||||
</span>
|
||||
|
||||
<span>Generated by <strong>DocFX</strong></span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript" src="../styles/docfx.vendor.js"></script>
|
||||
<script type="text/javascript" src="../styles/docfx.js"></script>
|
||||
<script type="text/javascript" src="../styles/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,220 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<!--[if IE]><![endif]-->
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<title>Event Processing and the Application Main Loop </title>
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<meta name="title" content="Event Processing and the Application Main Loop ">
|
||||
<meta name="generator" content="docfx 2.53.1.0">
|
||||
|
||||
<link rel="shortcut icon" href="../favicon.ico">
|
||||
<link rel="stylesheet" href="../styles/docfx.vendor.css">
|
||||
<link rel="stylesheet" href="../styles/docfx.css">
|
||||
<link rel="stylesheet" href="../styles/main.css">
|
||||
<link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet">
|
||||
<meta property="docfx:navrel" content="">
|
||||
<meta property="docfx:tocrel" content="">
|
||||
|
||||
<meta property="docfx:rel" content="../">
|
||||
|
||||
</head> <body data-spy="scroll" data-target="#affix" data-offset="120">
|
||||
<div id="wrapper">
|
||||
<header>
|
||||
|
||||
<nav id="autocollapse" class="navbar navbar-inverse ng-scope" role="navigation">
|
||||
<div class="container">
|
||||
<div class="navbar-header">
|
||||
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar">
|
||||
<span class="sr-only">Toggle navigation</span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</button>
|
||||
|
||||
<a class="navbar-brand" href="../index.html">
|
||||
<img id="logo" class="svg" src="../images/logo48.png" alt="">
|
||||
</a>
|
||||
</div>
|
||||
<div class="collapse navbar-collapse" id="navbar">
|
||||
<form class="navbar-form navbar-right" role="search" id="search">
|
||||
<div class="form-group">
|
||||
<input type="text" class="form-control" id="search-query" placeholder="Search" autocomplete="off">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div class="subnav navbar navbar-default">
|
||||
<div class="container hide-when-search" id="breadcrumb">
|
||||
<ul class="breadcrumb">
|
||||
<li></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
<div class="container body-content">
|
||||
|
||||
<div id="search-results">
|
||||
<div class="search-list"></div>
|
||||
<div class="sr-items">
|
||||
<p><i class="glyphicon glyphicon-refresh index-loading"></i></p>
|
||||
</div>
|
||||
<ul id="pagination"></ul>
|
||||
</div>
|
||||
</div>
|
||||
<div role="main" class="container body-content hide-when-search">
|
||||
<div class="article row grid">
|
||||
<div class="col-md-10">
|
||||
<article class="content wrap" id="_content" data-uid="">
|
||||
<h1 id="event-processing-and-the-application-main-loop">Event Processing and the Application Main Loop</h1>
|
||||
|
||||
<p>The method <code>Application.Run</code> that we covered before will wait for
|
||||
events from either the keyboard or mouse and route those events to the
|
||||
proper view.</p>
|
||||
<p>The job of waiting for events and dispatching them in the
|
||||
<code>Application</code> is implemented by an instance of the
|
||||
<a href=""><code>MainLoop</code></a>
|
||||
class.</p>
|
||||
<p>Mainloops are a common idiom in many user interface toolkits so many
|
||||
of the concepts will be familiar to you if you have used other
|
||||
toolkits before.</p>
|
||||
<p>This class provides the following capabilities:</p>
|
||||
<ul>
|
||||
<li>Keyboard and mouse processing</li>
|
||||
<li>.NET Async support</li>
|
||||
<li>Timers processing</li>
|
||||
<li>Invoking of UI code from a background thread</li>
|
||||
<li>Idle processing handlers</li>
|
||||
<li>Possibility of integration with other mainloops.</li>
|
||||
<li>On Unix systems, it can monitor file descriptors for readability or writability.</li>
|
||||
</ul>
|
||||
<p>The <code>MainLoop</code> property in the the
|
||||
<a href="../api/Terminal.Gui/Terminal.Gui.Application.html"><code>Application</code></a>
|
||||
provides access to these functions.</p>
|
||||
<p>When your code invokes <code>Application.Run (Toplevel)</code>, the application
|
||||
will prepare the current
|
||||
<a href="../api/Terminal.Gui/Terminal.Gui.Toplevel.html"><code>Toplevel</code></a> instance by
|
||||
redrawing the screen appropriately and then calling the mainloop to
|
||||
run. </p>
|
||||
<p>You can configure the Mainloop before calling Application.Run, or you
|
||||
can configure the MainLoop in response to events during the execution.</p>
|
||||
<p>The keyboard inputs is dispatched by the application class to the
|
||||
current TopLevel window this is covered in more detail in the
|
||||
<a href="keyboard.html">Keyboard Event Processing</a> document.</p>
|
||||
<h2 id="async-execution">Async Execution</h2>
|
||||
<p>On startup, the <code>Application</code> class configured the .NET Asynchronous
|
||||
machinery to allow you to use the <code>await</code> keyword to run tasks in the
|
||||
background and have the execution of those tasks resume on the context
|
||||
of the main thread running the main loop.</p>
|
||||
<p>Once you invoke <code>Application.Main</code> the async machinery will be ready
|
||||
to use, and you can merely call methods using <code>await</code> from your main
|
||||
thread, and the awaited code will resume execution on the main
|
||||
thread. </p>
|
||||
<h2 id="timers-processing">Timers Processing</h2>
|
||||
<p>You can register timers to be executed at specified intervals by
|
||||
calling the <a href=""><code>AddTimeout</code></a> method, like this:</p>
|
||||
<pre><code class="lang-csharp">void UpdateTimer ()
|
||||
{
|
||||
time.Text = DateTime.Now.ToString ();
|
||||
}
|
||||
|
||||
var token = Application.MainLoop.AddTimeout (TimeSpan.FromSeconds (20), UpdateTimer);
|
||||
</code></pre><p>The return value from AddTimeout is a token value that you can use if
|
||||
you desire to cancel the timer before it runs:</p>
|
||||
<pre><code class="lang-csharup">Application.MainLoop.RemoveTimeout (token);
|
||||
</code></pre><h2 id="idle-handlers">Idle Handlers</h2>
|
||||
<p>You can register code to be executed when the application is idling
|
||||
and there are no events to process by calling the
|
||||
<a href=""><code>AddIdle</code></a>
|
||||
method. This method takes as a parameter a function that will be
|
||||
invoked when the application is idling. </p>
|
||||
<p>Idle functions should return <code>true</code> if they should be invoked again,
|
||||
and <code>false</code> if the idle invocations should stop.</p>
|
||||
<p>Like the timer APIs, the return value is a token that can be used to
|
||||
cancel the scheduled idle function from being executed.</p>
|
||||
<h2 id="threading">Threading</h2>
|
||||
<p>Like other UI toolkits, Terminal.Gui is generally not thread safe.
|
||||
You should avoid calling methods in the UI classes from a background
|
||||
thread as there is no guarantee that they will not corrupt the state
|
||||
of the UI application. </p>
|
||||
<p>Generally, as there is not much state, you will get lucky, but the
|
||||
application will not behave properly.</p>
|
||||
<p>You will be served better off by using C# async machinery and the
|
||||
various APIs in the <code>System.Threading.Tasks.Task</code> APIs. But if you
|
||||
absolutely must work with threads on your own you should only invoke
|
||||
APIs in Terminal.Gui from the main thread.</p>
|
||||
<p>To make this simple, you can use the <code>Application.MainLoop.Invoke</code>
|
||||
method and pass an <code>Action</code>. This action will be queued for execution
|
||||
on the main thread at an appropriate time and will run your code
|
||||
there.</p>
|
||||
<p>For example, the following shows how to properly update a label from a
|
||||
background thread:</p>
|
||||
<pre><code>void BackgroundThreadUpdateProgress ()
|
||||
{
|
||||
Application.MainLoop.Invoke (() => {
|
||||
progress.Text = $"Progress: {bytesDownloaded/totalBytes}";
|
||||
});
|
||||
}
|
||||
</code></pre><h2 id="integration-with-other-main-loop-drivers">Integration With Other Main Loop Drivers</h2>
|
||||
<p>It is possible to run the main loop in a way that it does not take
|
||||
over control of your application, but rather in a cooperative way.</p>
|
||||
<p>To do this, you must use the lower-level APIs in <code>Application</code>: the
|
||||
<code>Begin</code> method to prepare a toplevel for execution, followed by calls
|
||||
to <code>MainLoop.EventsPending</code> to determine whether the events must be
|
||||
processed, and in that case, calling <code>RunLoop</code> method and finally
|
||||
completing the process by calling <code>End</code>.</p>
|
||||
<p>The method <code>Run</code> is implemented like this:</p>
|
||||
<pre><code>void Run (Toplevel top)
|
||||
{
|
||||
var runToken = Begin (view);
|
||||
RunLoop (runToken);
|
||||
End (runToken);
|
||||
}
|
||||
</code></pre><h2 id="unix-file-descriptor-monitoring">Unix File Descriptor Monitoring</h2>
|
||||
<p>On Unix, it is possible to monitor file descriptors for input being
|
||||
available, or for the file descriptor being available for data to be
|
||||
written without blocking the application.</p>
|
||||
<p>To do this, you on Unix, you can cast the <code>MainLoop</code> instance to a
|
||||
<a href=""><code>UnixMainLoop</code></a>
|
||||
and use the <code>AddWatch</code> method to register an interest on a particular
|
||||
condition.</p>
|
||||
</article>
|
||||
</div>
|
||||
|
||||
<div class="hidden-sm col-md-2" role="complementary">
|
||||
<div class="sideaffix">
|
||||
<div class="contribution">
|
||||
<ul class="nav">
|
||||
</ul>
|
||||
</div>
|
||||
<nav class="bs-docs-sidebar hidden-print hidden-xs hidden-sm affix" id="affix">
|
||||
<!-- <p><a class="back-to-top" href="#top">Back to top</a><p> -->
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<footer>
|
||||
<div class="grad-bottom"></div>
|
||||
<div class="footer">
|
||||
<div class="container">
|
||||
<span class="pull-right">
|
||||
<a href="#top">Back to top</a>
|
||||
</span>
|
||||
|
||||
<span>Generated by <strong>DocFX</strong></span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript" src="../styles/docfx.vendor.js"></script>
|
||||
<script type="text/javascript" src="../styles/docfx.js"></script>
|
||||
<script type="text/javascript" src="../styles/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,436 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<!--[if IE]><![endif]-->
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<title>Terminal.Gui API Overview </title>
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<meta name="title" content="Terminal.Gui API Overview ">
|
||||
<meta name="generator" content="docfx 2.53.1.0">
|
||||
|
||||
<link rel="shortcut icon" href="../favicon.ico">
|
||||
<link rel="stylesheet" href="../styles/docfx.vendor.css">
|
||||
<link rel="stylesheet" href="../styles/docfx.css">
|
||||
<link rel="stylesheet" href="../styles/main.css">
|
||||
<link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet">
|
||||
<meta property="docfx:navrel" content="">
|
||||
<meta property="docfx:tocrel" content="">
|
||||
|
||||
<meta property="docfx:rel" content="../">
|
||||
|
||||
</head> <body data-spy="scroll" data-target="#affix" data-offset="120">
|
||||
<div id="wrapper">
|
||||
<header>
|
||||
|
||||
<nav id="autocollapse" class="navbar navbar-inverse ng-scope" role="navigation">
|
||||
<div class="container">
|
||||
<div class="navbar-header">
|
||||
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar">
|
||||
<span class="sr-only">Toggle navigation</span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</button>
|
||||
|
||||
<a class="navbar-brand" href="../index.html">
|
||||
<img id="logo" class="svg" src="../images/logo48.png" alt="">
|
||||
</a>
|
||||
</div>
|
||||
<div class="collapse navbar-collapse" id="navbar">
|
||||
<form class="navbar-form navbar-right" role="search" id="search">
|
||||
<div class="form-group">
|
||||
<input type="text" class="form-control" id="search-query" placeholder="Search" autocomplete="off">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div class="subnav navbar navbar-default">
|
||||
<div class="container hide-when-search" id="breadcrumb">
|
||||
<ul class="breadcrumb">
|
||||
<li></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
<div class="container body-content">
|
||||
|
||||
<div id="search-results">
|
||||
<div class="search-list"></div>
|
||||
<div class="sr-items">
|
||||
<p><i class="glyphicon glyphicon-refresh index-loading"></i></p>
|
||||
</div>
|
||||
<ul id="pagination"></ul>
|
||||
</div>
|
||||
</div>
|
||||
<div role="main" class="container body-content hide-when-search">
|
||||
<div class="article row grid">
|
||||
<div class="col-md-10">
|
||||
<article class="content wrap" id="_content" data-uid="">
|
||||
<h1 id="terminalgui-api-overview">Terminal.Gui API Overview</h1>
|
||||
|
||||
<p><code>Terminal.Gui</code> is a library intended to create console-based
|
||||
applications using C#. The framework has been designed to make it
|
||||
easy to write applications that will work on monochrome terminals, as
|
||||
well as modern color terminals with mouse support.</p>
|
||||
<p>This library works across Windows, Linux and MacOS.</p>
|
||||
<p>This library provides a text-based toolkit as works in a way similar
|
||||
to graphic toolkits. There are many controls that can be used to
|
||||
create your applications and it is event based, meaning that you
|
||||
create the user interface, hook up various events and then let the
|
||||
a processing loop run your application, and your code is invoked via
|
||||
one or more callbacks.</p>
|
||||
<p>The simplest application looks like this:</p>
|
||||
<pre><code class="lang-csharp">using Terminal.Gui;
|
||||
|
||||
class Demo {
|
||||
static int Main ()
|
||||
{
|
||||
Application.Init ();
|
||||
|
||||
var n = MessageBox.Query (50, 7,
|
||||
"Question", "Do you like console apps?", "Yes", "No");
|
||||
|
||||
return n;
|
||||
}
|
||||
}
|
||||
</code></pre><p>This example shows a prompt and returns an integer value depending on
|
||||
which value was selected by the user (Yes, No, or if they use chose
|
||||
not to make a decision and instead pressed the ESC key).</p>
|
||||
<p>More interesting user interfaces can be created by composing some of
|
||||
the various views that are included. In the following sections, you
|
||||
will see how applications are put together.</p>
|
||||
<p>In the example above, you can see that we have initialized the runtime by calling the
|
||||
<a href="../api/Terminal.Gui/Terminal.Gui.Application.html#Terminal_Gui_Application_Init"><code>Init</code></a> method in the Application class - this sets up the environment, initializes the color
|
||||
schemes available for your application and clears the screen to start your application.</p>
|
||||
<p>The <a href="../api/Terminal.Gui/Terminal.Gui.Application.html"><code>Application</code></a> class, additionally creates an instance of the [Toplevel]((../api/Terminal.Gui/Terminal.Gui.Toplevel.html) class that is ready to be consumed,
|
||||
this instance is available in the <code>Application.Top</code> property, and can be used like this:</p>
|
||||
<pre><code class="lang-csharp">using Terminal.Gui;
|
||||
|
||||
class Demo {
|
||||
static int Main ()
|
||||
{
|
||||
Application.Init ();
|
||||
|
||||
var label = new Label ("Hello World") {
|
||||
X = Pos.Center (),
|
||||
Y = Pos.Center (),
|
||||
Height = 1,
|
||||
};
|
||||
Application.Top.Add (label);
|
||||
Application.Run ();
|
||||
}
|
||||
}
|
||||
</code></pre><p>Typically, you will want your application to have more than a label, you might
|
||||
want a menu, and a region for your application to live in, the following code
|
||||
does this:</p>
|
||||
<pre><code class="lang-csharp">using Terminal.Gui;
|
||||
|
||||
class Demo {
|
||||
static int Main ()
|
||||
{
|
||||
Application.Init ();
|
||||
var menu = new MenuBar (new MenuBarItem [] {
|
||||
new MenuBarItem ("_File", new MenuItem [] {
|
||||
new MenuItem ("_Quit", "", () => {
|
||||
Application.RequestStop ();
|
||||
})
|
||||
}),
|
||||
});
|
||||
|
||||
var win = new Window ("Hello") {
|
||||
X = 0,
|
||||
Y = 1,
|
||||
Width = Dim.Fill (),
|
||||
Height = Dim.Fill () - 1
|
||||
};
|
||||
|
||||
// Add both menu and win in a single call
|
||||
Application.Top.Add (menu, win);
|
||||
Application.Run ();
|
||||
}
|
||||
}
|
||||
</code></pre><h1 id="views">Views</h1>
|
||||
<p>All visible elements on a Terminal.Gui application are implemented as
|
||||
<a href="../api/Terminal.Gui/Terminal.Gui.View.html">Views</a>. Views are self-contained
|
||||
objects that take care of displaying themselves, can receive keyboard and mouse
|
||||
input and participate in the focus mechanism.</p>
|
||||
<p>Every view can contain an arbitrary number of children views. These are called
|
||||
the Subviews. You can add a view to an existing view, by calling the
|
||||
<a href="../api/Terminal.Gui/Terminal.Gui.View.html#Terminal_Gui_View_Add_Terminal_Gui_View_"><code>Add</code></a> method, for example, to add a couple of buttons to a UI, you can do this:</p>
|
||||
<pre><code class="lang-csharp">void SetupMyView (View myView)
|
||||
{
|
||||
var label = new Label ("Username: ") {
|
||||
X = 1,
|
||||
Y = 1,
|
||||
Width = 20,
|
||||
Height = 1
|
||||
};
|
||||
myView.Add (label);
|
||||
|
||||
var username = new TextField ("") {
|
||||
X = 1,
|
||||
Y = 2,
|
||||
Width = 30,
|
||||
Height = 1
|
||||
};
|
||||
myView.Add (username);
|
||||
}
|
||||
</code></pre><p>The container of a given view is called the <code>SuperView</code> and it is a property of every
|
||||
View.</p>
|
||||
<p>There are many views that you can use to spice up your application:</p>
|
||||
<p><a href="../api/Terminal.Gui/Terminal.Gui.Button.html">Buttons</a>, <a href="../api/Terminal.Gui/Terminal.Gui.Label.html">Labels</a>, <a href="../api/Terminal.Gui/Terminal.Gui.TextField.html">Text entry</a>, <a href="../api/Terminal.Gui/Terminal.Gui.TextView.html">Text view</a>, <a href="../api/Terminal.Gui/Terminal.Gui.RadioGroup.html">Radio buttons</a>, <a href="../api/Terminal.Gui/Terminal.Gui.CheckBox.html">Checkboxes</a>, <a href="../api/Terminal.Gui/Terminal.Gui.Dialog.html">Dialog boxes</a>, <a href="../api/Terminal.Gui/Terminal.Gui.MessageBox.html">Message boxes</a>, <a href="../api/Terminal.Gui/Terminal.Gui.Window.html">Windows</a>, <a href="../api/Terminal.Gui/Terminal.Gui.MenuBar.html">Menus</a>, <a href="../api/Terminal.Gui/Terminal.Gui.ListView.html">ListViews</a>, <a href="../api/Terminal.Gui/Terminal.Gui.FrameView.html">Frames</a>, <a href="../api/Terminal.Gui/Terminal.Gui.ProgressBar.html">ProgressBars</a>, <a href="../api/Terminal.Gui/Terminal.Gui.ScrollView.html">Scroll views</a> and <a href="../api/Terminal.Gui/Terminal.Gui.ScrollBarView.html">Scrollbars</a>.</p>
|
||||
<h2 id="layout">Layout</h2>
|
||||
<p><code>Terminal.Gui</code> supports two different layout systems, absolute and computed \
|
||||
(controlled by the <a href="../api/Terminal.Gui/Terminal.Gui.LayoutStyle.html"><code>LayoutStyle</code></a>
|
||||
property on the view.</p>
|
||||
<p>The absolute system is used when you want the view to be positioned exactly in
|
||||
one location and want to manually control where the view is. This is done
|
||||
by invoking your View constructor with an argument of type <a href="../api/Terminal.Gui/Terminal.Gui.Rect.html"><code>Rect</code></a>. When you do this, to change the
|
||||
position of the View, you can change the <code>Frame</code> property on the View.</p>
|
||||
<p>The computed layout system offers a few additional capabilities, like automatic
|
||||
centering, expanding of dimensions and a handful of other features. To use
|
||||
this you construct your object without an initial <code>Frame</code>, but set the
|
||||
<code>X</code>, <code>Y</code>, <code>Width</code> and <code>Height</code> properties after the object has been created.</p>
|
||||
<p>Examples:</p>
|
||||
<pre><code class="lang-csharp">
|
||||
// Dynamically computed
|
||||
var label = new Label ("Hello") {
|
||||
X = 1,
|
||||
Y = Pos.Center (),
|
||||
Width = Dim.Fill (),
|
||||
Height = 1
|
||||
};
|
||||
|
||||
// Absolute position using the provided rectangle
|
||||
var label2 = new Label (new Rect (1, 2, 20, 1), "World")
|
||||
</code></pre><p>The computed layout system does not take integers, instead the <code>X</code> and <code>Y</code> properties are of type <a href="../api/Terminal.Gui/Terminal.Gui.Pos.html"><code>Pos</code></a> and the <code>Width</code> and <code>Height</code> properties are of type <a href="../api/Terminal.Gui/Terminal.Gui.Dim.html"><code>Dim</code></a> both which can be created implicitly from integer values.</p>
|
||||
<h3 id="the-pos-type">The <code>Pos</code> Type</h3>
|
||||
<p>The <code>Pos</code> type on <code>X</code> and <code>Y</code> offers a few options:</p>
|
||||
<ul>
|
||||
<li>Absolute position, by passing an integer</li>
|
||||
<li>Percentage of the parent's view size - <code>Pos.Percent(n)</code></li>
|
||||
<li>Anchored from the end of the dimension - <code>AnchorEnd(int margin=0)</code></li>
|
||||
<li>Centered, using <code>Center()</code></li>
|
||||
<li>Reference the Left (X), Top (Y), Bottom, Right positions of another view</li>
|
||||
</ul>
|
||||
<p>The <code>Pos</code> values can be added or subtracted, like this:</p>
|
||||
<pre><code class="lang-csharp">// Set the X coordinate to 10 characters left from the center
|
||||
view.X = Pos.Center () - 10;
|
||||
|
||||
view.Y = Pos.Percent (20);
|
||||
|
||||
anotherView.X = AnchorEnd (10);
|
||||
anotherView.Width = 9;
|
||||
|
||||
myView.X = Pos.X (view);
|
||||
myView.Y = Pos.Bottom (anotherView);
|
||||
</code></pre><h3 id="the-dim-type">The <code>Dim</code> Type</h3>
|
||||
<p>The <code>Dim</code> type is used for the <code>Width</code> and <code>Height</code> properties on the View and offers
|
||||
the following options:</p>
|
||||
<ul>
|
||||
<li>Absolute size, by passing an integer</li>
|
||||
<li>Percentage of the parent's view size - <code>Dim.Percent(n)</code></li>
|
||||
<li>Fill to the end - <code>Dim.Fill ()</code></li>
|
||||
<li>Reference the Width or Height of another view</li>
|
||||
</ul>
|
||||
<p>Like, <code>Pos</code>, objects of type <code>Dim</code> can be added an subtracted, like this:</p>
|
||||
<pre><code class="lang-csharp">// Set the Width to be 10 characters less than filling
|
||||
// the remaining portion of the screen
|
||||
view.Width = Dim.Fill () - 10;
|
||||
|
||||
view.Height = Dim.Percent(20) - 1;
|
||||
|
||||
anotherView.Height = Dim.Height (view)+1
|
||||
</code></pre><h1 id="toplevels-windows-and-dialogs">TopLevels, Windows and Dialogs.</h1>
|
||||
<p>Among the many kinds of views, you typically will create a <a href="../api/Terminal.Gui/Terminal.Gui.Toplevel.html">Toplevel</a> view (or any of its subclasses,
|
||||
like <a href="../api/Terminal.Gui/Terminal.Gui.Window.html">Window</a> or <a href="../api/Terminal.Gui/Terminal.Gui.Dialog.html">Dialog</a> which is special kind of views
|
||||
that can be executed modally - that is, the view can take over all input and returns
|
||||
only when the user chooses to complete their work there. </p>
|
||||
<p>The following sections cover the differences.</p>
|
||||
<h2 id="toplevel-views">TopLevel Views</h2>
|
||||
<p><a href="../api/Terminal.Gui/Terminal.Gui.Toplevel.html">Toplevel</a> views have no visible user interface elements and occupy an arbitrary portion of the screen.</p>
|
||||
<p>You would use a toplevel Modal view for example to launch an entire new experience in your application, one where you would have a new top-level menu for example. You
|
||||
typically would add a Menu and a Window to your Toplevel, it would look like this:</p>
|
||||
<pre><code class="lang-csharp">using Terminal.Gui;
|
||||
|
||||
class Demo {
|
||||
static void Edit (string filename)
|
||||
{
|
||||
var top = new Toplevel () {
|
||||
X = 0,
|
||||
Y = 0,
|
||||
Width = Dim.Fill (),
|
||||
Height = Dim.Fill ()
|
||||
};
|
||||
var menu = new MenuBar (new MenuBarItem [] {
|
||||
new MenuBarItem ("_File", new MenuItem [] {
|
||||
new MenuItem ("_Close", "", () => {
|
||||
Application.RequestStop ();
|
||||
})
|
||||
}),
|
||||
});
|
||||
|
||||
// nest a window for the editor
|
||||
var win = new Window (filename) {
|
||||
X = 0,
|
||||
Y = 1,
|
||||
Width = Dim.Fill (),
|
||||
Height = Dim.Fill () - 1
|
||||
};
|
||||
|
||||
var editor = new TextView () {
|
||||
X = 0,
|
||||
Y = 0,
|
||||
Width = Dim.Fill (),
|
||||
Height = Dim.Fill ()
|
||||
};
|
||||
editor.Text = System.IO.File.ReadAllText (filename);
|
||||
win.Add (editor);
|
||||
|
||||
// Add both menu and win in a single call
|
||||
top.Add (win, menu);
|
||||
Application.Run (top);
|
||||
}
|
||||
}
|
||||
</code></pre><h2 id="window-views">Window Views</h2>
|
||||
<p><a href="../api/Terminal.Gui/Terminal.Gui.Window.html">Window</a> views extend the Toplevel view by providing a frame and a title around the toplevel - and can be moved on the screen with the mouse (caveat: code is currently disabled)</p>
|
||||
<p>From a user interface perspective, you might have more than one Window on the screen at a given time.</p>
|
||||
<h2 id="dialogs">Dialogs</h2>
|
||||
<p><a href="../api/Terminal.Gui/Terminal.Gui.Dialog.html">Dialog</a> are <a href="../api/Terminal.Gui/Terminal.Gui.Window.html">Window</a> objects that happen to be centered in the middle of the screen.</p>
|
||||
<p>Dialogs are instances of a Window that are centered in the screen, and are intended
|
||||
to be used modally - that is, they run, and they are expected to return a result
|
||||
before resuming execution of your application.</p>
|
||||
<p>Dialogs are a subclass of <code>Window</code> and additionally expose the
|
||||
<a href="https://migueldeicaza.github.io/gui.cs/api/Terminal.Gui/Terminal.Gui.Dialog.html#Terminal_Gui_Dialog_AddButton_Terminal_Gui_Button_"><code>AddButton</code></a> API which manages the layout
|
||||
of any button passed to it, ensuring that the buttons are at the bottom of the dialog.</p>
|
||||
<p>Example:</p>
|
||||
<pre><code class="lang-csharp">bool okpressed = false;
|
||||
var ok = new Button("Ok");
|
||||
var cancel = new Button("Cancel");
|
||||
var dialog = new Dialog ("Quit", 60, 7, ok, cancel);
|
||||
</code></pre><p>Which will show something like this:</p>
|
||||
<pre><code>+- Quit -----------------------------------------------+
|
||||
| |
|
||||
| |
|
||||
| [ Ok ] [ Cancel ] |
|
||||
+------------------------------------------------------+
|
||||
</code></pre><h2 id="running-modally">Running Modally</h2>
|
||||
<p>To run your Dialog, Window or Toplevel modally, you will invoke the <code>Application.Run</code>
|
||||
method on the toplevel. It is up to your code and event handlers to invoke the <code>Application.RequestStop()</code> method to terminate the modal execution.</p>
|
||||
<pre><code class="lang-csharp">bool okpressed = false;
|
||||
var ok = new Button(3, 14, "Ok") {
|
||||
Clicked = () => { Application.RequestStop (); okpressed = true; }
|
||||
};
|
||||
var cancel = new Button(10, 14, "Cancel") {
|
||||
Clicked = () => Application.RequestStop ()
|
||||
};
|
||||
var dialog = new Dialog ("Login", 60, 18, ok, cancel);
|
||||
|
||||
var entry = new TextField () {
|
||||
X = 1,
|
||||
Y = 1,
|
||||
Width = Dim.Fill (),
|
||||
Height = 1
|
||||
};
|
||||
dialog.Add (entry);
|
||||
Application.Run (dialog);
|
||||
if (okpressed)
|
||||
Console.WriteLine ("The user entered: " + entry.Text);
|
||||
</code></pre><p>There is no return value from running modally, so your code will need to have a mechanism
|
||||
of indicating the reason that the execution of the modal dialog was completed, in the
|
||||
case above, the <code>okpressed</code> value is set to true if the user pressed or selected the Ok button.</p>
|
||||
<h1 id="input-handling">Input Handling</h1>
|
||||
<p>Every view has a focused view, and if that view has nested views, one of those is
|
||||
the focused view. This is called the focus chain, and at any given time, only one
|
||||
View has the focus. </p>
|
||||
<p>The library binds the key Tab to focus the next logical view,
|
||||
and the Shift-Tab combination to focus the previous logical view. </p>
|
||||
<p>Keyboard processing is divided in three stages: HotKey processing, regular processing and
|
||||
cold key processing. </p>
|
||||
<ul>
|
||||
<li><p>Hot key processing happens first, and it gives all the views in the current
|
||||
toplevel a chance to monitor whether the key needs to be treated specially. This
|
||||
for example handles the scenarios where the user pressed Alt-o, and a view with a
|
||||
highlighted "o" is being displayed.</p>
|
||||
</li>
|
||||
<li><p>If no view processed the hotkey, then the key is sent to the currently focused
|
||||
view.</p>
|
||||
</li>
|
||||
<li><p>If the key was not processed by the normal processing, all views are given
|
||||
a chance to process the keystroke in their cold processing stage. Examples
|
||||
include the processing of the "return" key in a dialog when a button in the
|
||||
dialog has been flagged as the "default" action.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>The most common case is the normal processing, which sends the keystrokes to the
|
||||
currently focused view.</p>
|
||||
<p>Mouse events are processed in visual order, and the event will be sent to the
|
||||
view on the screen. The only exception is that no mouse events are delivered
|
||||
to background views when a modal view is running. </p>
|
||||
<p>More details are available on the <a href="keyboard.html"><code>Keyboard Event Processing</code></a> document.</p>
|
||||
<h1 id="colors-and-color-schemes">Colors and Color Schemes</h1>
|
||||
<p>All views have been configured with a color scheme that will work both in color
|
||||
terminals as well as the more limited black and white terminals. </p>
|
||||
<p>The various styles are captured in the <a href="../api/Terminal.Gui/Terminal.Gui.Colors.html"><code>Colors</code></a> class which defined color schemes for
|
||||
the normal views, the menu bar, popup dialog boxes and error dialog boxes, that you can use like this:</p>
|
||||
<ul>
|
||||
<li><code>Colors.Base</code></li>
|
||||
<li><code>Colors.Menu</code></li>
|
||||
<li><code>Colors.Dialog</code></li>
|
||||
<li><code>Colors.Error</code></li>
|
||||
</ul>
|
||||
<p>You can use them for example like this to set the colors for a new Window:</p>
|
||||
<pre><code>var w = new Window ("Hello");
|
||||
w.ColorScheme = Colors.Error
|
||||
</code></pre><p>The <a href="../api/Terminal.Gui/Terminal.Gui.ColorScheme.html"><code>ColorScheme</code></a> represents
|
||||
four values, the color used for Normal text, the color used for normal text when
|
||||
a view is focused an the colors for the hot-keys both in focused and unfocused modes.</p>
|
||||
<p>By using <code>ColorSchemes</code> you ensure that your application will work correctbly both
|
||||
in color and black and white terminals.</p>
|
||||
<p>Some views support setting individual color attributes, you create an
|
||||
attribute for a particular pair of Foreground/Background like this:</p>
|
||||
<pre><code>var myColor = Application.Driver.MakeAttribute (Color.Blue, Color.Red);
|
||||
var label = new Label (...);
|
||||
label.TextColor = myColor
|
||||
</code></pre><h1 id="mainloop-threads-and-input-handling">MainLoop, Threads and Input Handling</h1>
|
||||
<p>Detailed description of the mainlop is described on the <a href="mainloop.html">Event Processing and the Application Main Loop</a> document.</p>
|
||||
</article>
|
||||
</div>
|
||||
|
||||
<div class="hidden-sm col-md-2" role="complementary">
|
||||
<div class="sideaffix">
|
||||
<div class="contribution">
|
||||
<ul class="nav">
|
||||
</ul>
|
||||
</div>
|
||||
<nav class="bs-docs-sidebar hidden-print hidden-xs hidden-sm affix" id="affix">
|
||||
<!-- <p><a class="back-to-top" href="#top">Back to top</a><p> -->
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<footer>
|
||||
<div class="grad-bottom"></div>
|
||||
<div class="footer">
|
||||
<div class="container">
|
||||
<span class="pull-right">
|
||||
<a href="#top">Back to top</a>
|
||||
</span>
|
||||
|
||||
<span>Generated by <strong>DocFX</strong></span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript" src="../styles/docfx.vendor.js"></script>
|
||||
<script type="text/javascript" src="../styles/docfx.js"></script>
|
||||
<script type="text/javascript" src="../styles/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,117 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<!--[if IE]><![endif]-->
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<title>Views </title>
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<meta name="title" content="Views ">
|
||||
<meta name="generator" content="docfx 2.53.1.0">
|
||||
|
||||
<link rel="shortcut icon" href="../favicon.ico">
|
||||
<link rel="stylesheet" href="../styles/docfx.vendor.css">
|
||||
<link rel="stylesheet" href="../styles/docfx.css">
|
||||
<link rel="stylesheet" href="../styles/main.css">
|
||||
<link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet">
|
||||
<meta property="docfx:navrel" content="">
|
||||
<meta property="docfx:tocrel" content="">
|
||||
|
||||
<meta property="docfx:rel" content="../">
|
||||
|
||||
</head> <body data-spy="scroll" data-target="#affix" data-offset="120">
|
||||
<div id="wrapper">
|
||||
<header>
|
||||
|
||||
<nav id="autocollapse" class="navbar navbar-inverse ng-scope" role="navigation">
|
||||
<div class="container">
|
||||
<div class="navbar-header">
|
||||
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar">
|
||||
<span class="sr-only">Toggle navigation</span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</button>
|
||||
|
||||
<a class="navbar-brand" href="../index.html">
|
||||
<img id="logo" class="svg" src="../images/logo48.png" alt="">
|
||||
</a>
|
||||
</div>
|
||||
<div class="collapse navbar-collapse" id="navbar">
|
||||
<form class="navbar-form navbar-right" role="search" id="search">
|
||||
<div class="form-group">
|
||||
<input type="text" class="form-control" id="search-query" placeholder="Search" autocomplete="off">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div class="subnav navbar navbar-default">
|
||||
<div class="container hide-when-search" id="breadcrumb">
|
||||
<ul class="breadcrumb">
|
||||
<li></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
<div class="container body-content">
|
||||
|
||||
<div id="search-results">
|
||||
<div class="search-list"></div>
|
||||
<div class="sr-items">
|
||||
<p><i class="glyphicon glyphicon-refresh index-loading"></i></p>
|
||||
</div>
|
||||
<ul id="pagination"></ul>
|
||||
</div>
|
||||
</div>
|
||||
<div role="main" class="container body-content hide-when-search">
|
||||
<div class="article row grid">
|
||||
<div class="col-md-10">
|
||||
<article class="content wrap" id="_content" data-uid="">
|
||||
<h1 id="views">Views</h1>
|
||||
|
||||
<h1 id="layout">Layout</h1>
|
||||
<h1 id="creating-custom-views">Creating Custom Views</h1>
|
||||
<h2 id="constructor">Constructor</h2>
|
||||
<h2 id="rendering">Rendering</h2>
|
||||
<h3 id="using-custom-colors">Using Custom Colors</h3>
|
||||
<h2 id="keyboard-processing">Keyboard processing</h2>
|
||||
<h2 id="mouse-event-processing">Mouse event processing</h2>
|
||||
</article>
|
||||
</div>
|
||||
|
||||
<div class="hidden-sm col-md-2" role="complementary">
|
||||
<div class="sideaffix">
|
||||
<div class="contribution">
|
||||
<ul class="nav">
|
||||
</ul>
|
||||
</div>
|
||||
<nav class="bs-docs-sidebar hidden-print hidden-xs hidden-sm affix" id="affix">
|
||||
<!-- <p><a class="back-to-top" href="#top">Back to top</a><p> -->
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<footer>
|
||||
<div class="grad-bottom"></div>
|
||||
<div class="footer">
|
||||
<div class="container">
|
||||
<span class="pull-right">
|
||||
<a href="#top">Back to top</a>
|
||||
</span>
|
||||
|
||||
<span>Generated by <strong>DocFX</strong></span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript" src="../styles/docfx.vendor.js"></script>
|
||||
<script type="text/javascript" src="../styles/docfx.js"></script>
|
||||
<script type="text/javascript" src="../styles/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user