Giter Site home page Giter Site logo

flame.js's Introduction

Introduction

Flame.js is a widget/UI library for Ember.js. It's aimed at implementing desktop-style applications using Ember.js. It contains a host of widgets (such as list, tree and tab views), a layouting mechanism for positioning widgets, and some other supporting functionality on top of Ember.js.

Flame.js is designed to bring some of the features of SproutCore 1.x to Ember world, and in fact originally came to be as a byproduct of porting a large SC 1.x application to Ember. While it's not 1:1 compatible with SproutCore 1.x, porting an existing SC1 app to Ember+Flame should be fairly straightforward.

Flame.js has been tested & works on Chrome, Safari, Firefox, Edge and IE11.

Getting Started

A starter kit is provided for quickly getting started on writing an application with Flame.

The starter kit is a simple static application that you can start hacking with. In most real projects, you're probably going to need some build tools and a backend server, but Flame.js is agnostic to all those. The starter kit also includes all of Flame’s dependencies.

You can play around with Flame in your browser with this jsFiddle.

We've given a presentation about Ember and Flame at frontend.fi on April 11th 2012, slides can be found here.

For a bit more extensive example, see the address book application.

Widgets

All Flame.js widgets have been designed to be binding-friendly. If you’re familiar with Ember.js, using the widgets to build your application should feel very natural.

The most notable widgets are (we've provided jsfiddle examples for some of them to illustrate what they do and how you can use them):

Layouting

Flame views work very much like regular Ember views. The biggest practical differences are that mostly you don't use any handlebars templates with Flame views (although it’s possible and very useful in some cases), and they are typically laid out with absolute positioning. The views are usually defined with some JS code, like this:

Flame.View.extend({
    layout: { width: 500, height: 300, centerX: 0, centerY: 0 },
    childViews: ['labelView', 'fieldView'],

    labelView: Flame.LabelView.extend({
        layout: { left: 20, top: 20, width: 200 },
        value: 'Please enter your name:'
    }),

    fieldView: Flame.TextFieldView.extend({
        layout: { left: 240, top: 20, right: 20 }
    })
})

The layout can include properties ‘left’, ‘right’, ‘top’, ‘bottom’, ‘width’, ‘height’, ‘centerX’, ‘centerY’. Only some combinations of these are valid - for example, if you define left and right, you shouldn’t define width. Each of these should either be an integer, which is interpreted as a pixel value, or a string like ‘50%’. It can also be a property path, in which case a binding to that property will be used as the coordinate. (Contrary to normal practices, you should not use a ‘Binding’ suffix in this case, but just the normal coordinate name, e.g. left: ‘leftProperty’.)

If you don’t define a layout for a view at all, it defaults to { left: 0, top: 0, bottom: 0, right: 0 }. If you define a layout, but no height or bottom, a default height of 24 is used for ButtonViews, 22 for LabelViews and TextFieldViews. Similarly, a default width of 200 is used for LabelViews, TextFieldViews and TextAreaViews.

Using Layout Managers

It can be tedious to define the layout coordinates manually, and sometimes you end up with undesirable repetition in the coordinates. For example, if you want to position a number of child views so that they appear vertically stacked, the height of each view affects the top coordinate of all the child views coming after it. Now changing any of the heights may require changing several other values, too.

To ease this kind of problems, Flame.js includes the concept of a layout manager. A layout manager is a class that can control the positioning of views inside a parent view. Flame.js currently includes one implementation, called VerticalStackLayoutManager. It stacks views on top of each other, based on their heights. It also takes care of repositioning the views, should any of the views become hidden or visible. For example:

Flame.View.extend({
    layout: { width: 500, centerX: 0, centerY: 0 },
    layoutManager: Flame.VerticalStackLayoutManager.create({ topMargin: 5, spacing: 10, bottomMargin: 5 }),
    childViews: ['view1', 'view2', 'view3'],

    view1: Flame.LabelView.extend({value: 'Label1'}),
    view2: Flame.LabelView.extend({value: 'Label2'}),
    view3: Flame.LabelView.extend({value: 'Label3'})
})

There’s a few things to note about the example above:

  • The child views don’t define any height or width. In the case of LabelViews, this means they’ll use their default height and width.
  • The child views don’t define a top or left, either. This means that left defaults to 0. Top will be set by the layout manager so that the views appear stacked.
  • The layout manager is configured so that it will leave a margin of 5 pixels at the top and bottom, and a margin of 10 pixels between the child views.
  • The parent view layout is also missing the height. The height will also be controlled by the layout manager, setting it to the total height of the child views, plus the margins.

With this setup, if you need to change the height of any of the child views, or if you add, remove or hide views, all the dependent coordinates will be updated on the fly, including the height of the parent view. If its parent is also using a layout manager, the change would be propagated to that as well.

Using Handlebars Templates

Using inline handlebars templates can be very handy in some cases. Especially for producing text on the page, it can save you from creating many small LabelViews. For example:

someView: Flame.View.extend({
    layout: { left: 20, top: 20, width: 400 },
    handlebars: 'Player {{view.player.name}} has {{view.player.points}} points'
})

The rule is that if a Flame view has handlebars property defined, then that is used as the content of the view, and possible childViews array is ignored. If there’s no handlebars property defined, then the childViews array is consulted instead.

Validations

You can mix in Flame.Validatable into any object to enable on-the-fly validation. Validations are specified with the validations property. The object will then have the isValid property which you can observe or bind to.

App.Person = Ember.Object.extend(Flame.Validatable, {
    firstName: '',
    lastName: '',
    age: 0,

    validations: {
        firstName: Flame.Validator.notBlank,
        lastName: Flame.Validator.notBlank,
        age: Flame.Validator.number
    }
});

App.Person.create({ firstName: 'John', lastName: '' }).get('isValid'); // => false

The FormView can use validations to indicate validity of form elements as shown here.

Built-in validations

Flame comes with a few often used validators ready for you to use:

  • Flame.Validator.notBlank
  • Flame.Validator.email
  • Flame.Validator.number
  • Flame.Validator.association

You can also use validators to validate a single value:

Flame.Validator.email.validateValue('[email protected]');

Creating your own Validator

You can create your own validator by creating a new Flame.Validator instance which needs to override the validate method. The validate method takes two arguments, the first is an Ember Object, the second is the name of the property on the given Ember Object that needs to be validated.

App.positiveNumberValidator = Flame.Validator.create({
    validate: function(target, key) {
        var number = target.get(key);
        return number > 0;
    }
});

Using a function as a validation

Instead of creating a Flame.Validator, you can also provide a function that validates the value right in the validations property.

App.Person = Ember.Object.extend(Flame.Validatable, {
    validations: {
        age: function(value) {
            return value > 0;
        }
    }
});

Event Manager

Key events

For a view to able to listen to key events, it needs to have the acceptsKeyResponder property set to true. To listen for key events, you can implement the following methods:

  • deleteBackward
  • insertTab
  • insertNewline
  • cancel
  • insertSpace
  • moveLeft
  • moveUp
  • moveRight
  • moveDown
  • deleteForward
  • insertBacktab
  • moveLeftAndModifySelection
  • moveUpAndModifySelection
  • moveRightAndModifySelection
  • moveDownAndModifySelection

If you want to listen for key events in general you can implement keyDown, if you want to use the character of the key that was pressed you should use keyPress instead.

Flame.View.extend({
    acceptsKeyResponder: true,
    insertNewline: function(event) {
        alert('Enter key was pressed');
        return true; // We handled the key event here, don’t pass it up to the parent view
    }
})

Returning false from an event handler will pass on the event to the parent view.

Mouse events

Flame will ensure that every view that received a mouseDown will also receive the corresponding ``mouseUp``` event. This means that for example when reordering items in a list view, the reordering operation will continue smoothly even if user’s mouse pointer wanders off the list view.

Mixing Flame views with plain Ember views

Mixing Flame views into an existing Ember application is currently not going to produce a smooth result. The biggest problem is Flame’s event manager, which is needed to guarantee that whichever view received the mouseDown event will also receive the subsequent mouseMove events and the final mouseUp event. For this to work, all views on the page must use the Flame event manager, which “redirects” events to make this happen.

You might be able to work around this by making all your Ember views use the Flame event manager. In any case, we hope to come up with a solution to this problem in the future, to eventually allow using Flame views as part of any JS application.

Performance

On modern browsers, like Chrome, a recent Firefox version and IE9+, you mostly shouldn’t have any problems with performance. The most problematic area is currently list views and tree views with hundreds of items, for which the initial rendering might take a few seconds. On IE8, even less than hundred items may give you trouble.

Based on our profiling, most of the time seems to be taken by rendering the item views. For simple views, you can speed it up somewhat by scrapping child views and handlebars templates in favor of a custom render method that produces the HTML as a string.

In the future, we hope to implement lazy rendering for list and tree views, so that only the items currently visible would be initially rendered.

Migrating from SC1.x to Ember+Flame

Flame.js is not meant to be 1:1 compatible with SproutCore 1.x, but migrating an existing SC1.x application should still be fairly straightforward. You can get a long way by just replacing ‘SC.’ with ‘Flame.’. More complicated views, like lists and trees, are gonna need some more tweaking. You could probably use array and object proxies as before, although those are not really necessary with Ember. The SproutCore data store should also work with Ember+Flame.

Testing

rake jshint will run the javascript sources through to JSHint, which will require JSHint and node.js to be installed. First install node.js …

brew install node

… and then JSHint

npm -g install jshint

Make sure your changes pass JSHint cleanly before submitting a pull request.

Contributing

Fork flamejs/flame.js on GitHub, fix a bug or add a feature, push it to a branch in your fork named for the topic and send a pull request. You can also file a bug or feature request as an issue under the flame.js project on GitHub. If you’d like to chat, drop by #flamejs on Freenode IRC. (Also #emberjs is a good place for less Flame.js-specific discussion.)

For inspiration, you could have a look at the current issues.

flame.js's People

Contributors

ctimmerm avatar massive avatar jmiettinen avatar lalnuo avatar pjmorse avatar williamcoates avatar tomilaine avatar jugimaster avatar mebe avatar lofstrom avatar artemmoskalev avatar jmalves avatar guilhermeaiolfi avatar lukemelia avatar manko avatar mercurio avatar harjis avatar mjokinenrelex avatar aethersurfer avatar svanteha avatar ember-tomster avatar

Stargazers

fancyoung avatar Junru Zhong avatar  avatar Muhammad Ardhy avatar Kris Khaira avatar Colin Eatherton avatar Kamil Tomšík avatar 平江 avatar Venkat Korvi avatar Cassano Gabriele avatar Angus H. avatar Blockly avatar Marcelo Serpa avatar Louis R avatar Arthur Goldsmith avatar  avatar  avatar Michael Anthony avatar piesrtasty avatar Sunel Tr avatar Matt Cudmore avatar Ahmed Abbas avatar Marc Cantwell avatar zalem avatar Michael Bodnarchuk avatar vamdt avatar Christopher Tava avatar Immi avatar Michael Black Ritter avatar Tai Hoang avatar John DeHerrera avatar Courtney Robinson avatar Ryan Bonte avatar AnsonT avatar Gavin Wong avatar santiblanko avatar igal nassima avatar  avatar Denis Stoyanov avatar Simon Wade avatar Sean Goresht avatar Ketan Deshmukh avatar  avatar  avatar Jonah Ruiz avatar  avatar Torsten Marek avatar Guido avatar Stan Williams  avatar Maxim Kott avatar Lars Andersen avatar Kyrre Wahl Kongsgård avatar Ming Liu avatar Martin Honermeyer avatar Bonsak Schiledrop avatar Knut Ole Sjøli avatar  avatar Ahmed Hemdan avatar  avatar Tobias avatar rahulan sritharan avatar  avatar Jake Tobin avatar Alexander Mikuta avatar Matteo Latini avatar Nicholas Kircher avatar Kirill Chernyshov avatar sharavsambuu avatar  avatar TuNA avatar HM. Yen avatar Ralf Niedling avatar Ottimo Go avatar Sean Collins avatar Andre Kramer avatar Antoine Lagadec avatar Schmulik Raskin avatar  avatar Mars Hall avatar Neilor Caldeira avatar Gerson Goulart avatar Chance avatar Ankur Agarwal avatar Arthur Gunn avatar Aaron Williams avatar Pavlo Osadchyi avatar Jay Liu avatar Anton avatar Tiago Rezende avatar leeoxiang avatar newlix avatar Christoph Ladurner avatar Jasson Cascante avatar Jeff Jantz avatar Ali Malekpour avatar zp avatar Scott Cheng avatar Farley Knight avatar Joel Kallman avatar yanhua365 avatar

Watchers

Boram Yoon avatar arden avatar Bob avatar Ben Wu avatar  avatar  avatar Fadzril Muhamad avatar Neil Hooper avatar Gulen Chongtham avatar Tomas Korcak avatar Joachim Haagen Skeie avatar Zeeshan Mian avatar James Cloos avatar  avatar Nicolas Maubourguet avatar Michael Anthony avatar  avatar  avatar zalem avatar Md. Helal Uddin avatar  avatar Cassano Gabriele avatar  avatar

flame.js's Issues

Ember outlet

Does FlameJS support EmberJS outlet and Router? If yes, how it works with the layoutmanager

MenuView popup fails if Ember > v0.9.5

I've implemented a button with a menu popup, using the example at http://jsfiddle.net/k6AT4/ , and it only works if I'm using v0.9.5 of Ember. Under v0.9.6 and v0.9.7.1, this error occurs after the call to Flame.MenuView.create({..}).popup(anchor) completes (and the popup fails to appear):

Uncaught TypeError: Object # has no method 'get'
flame.js:3865

Examples, Demos

Maybe I'm just being slow today but I dont see any demos hosted online or within the library itself.

Either would be a great thing. :)

Thanks

Flame.FormView creates views too many times

All Flame-views inherit from Ember.ContainerView.

In Ember.ContainerView#init there are the following lines:

      if ('string' === typeof viewName) {
        view = get(this, viewName);
        view = this.createChildView(view);
        set(this, viewName, view);
      } else {
        view = this.createChildView(viewName);
      }

Currently, for controls at least, this causes three calls to createChildView: first by the getter, then the direct call to createChildView and at last, the setter also causes a call (see https://github.com/flamejs/flame.js/blob/master/views/form_view.js#L80).

Simply changing control to a normal property does not seem to work ([1]). So on what preconditions am I stepping on and how should this be done correctly?

[1] Simple modification to use simple property instead of a computed property.

        var view = {
            layout: { left: this.get('leftMargin'), right: this.get('rightMargin') },
            layoutManager: Flame.VerticalStackLayoutManager.create({ topMargin: this._focusRingMargin, spacing: 0, bottomMargin: this._focusRingMargin }),
            childViews: ['label', 'control'],
            isVisible: descriptor.get('isVisible') === undefined ? true : descriptor.get('isVisible'),
            label: this._buildLabel(descriptor),
            control: control
        };
        view.control.layout = view.control.layout || {};
        view.control.layout.left = formView.labelWidth + formView.columnSpacing;
        view.control.layout.left.right = formView._focusRingMargin;

Radio buttons behaving strangely

I'm syncing up with the new starterkit (from March of this year) and radio buttons are now acting strange.
radio
The attached image shows the state after clicking on the File button twice and the AMQP 1.0 button once. The AMQP 1.0 option is selected, and the rest of the application behaves as though it is (the value bound to the targetValue for each radio button is changing). Clicking on a button first adds the thin blue outline (like the AMQP 1.0 button), clicking on it a second time changes it to the thick blue inset (like the File button). If a button has the thick inlay selecting another button will not remove it, as shown in this picture:
radio2

There's no jsfiddle for the radio button but I was able to get it to work easily months ago and it worked fine with the flame library from the previous starterkit. Any idea what's going on here?

Implement isSimpleTable for row headers

Currently isSimpleTable in TableView hides the column headers. But there is no way to hide row headers.

I suggest allowing headerProperty to be null, and if it's null, don't render row headers.

Maybe headerProperty could be rename to rowHeaderProperty in the process because it's confusing at first.

Make Flame.View's position configurable

Currently we can control the view's position by setting useAbsolutePosition.
Let's change it so that we can set the position itself and use the layout based on that.

Can't build :(

This is probably just me, but:

touch-events  flame.js $ bundle install
Using rake (0.9.2.2) 
Using multi_json (1.3.6) 
Using execjs (1.4.0) 
Using hike (1.2.1) 
Using rack (1.4.1) 
Using sass (3.2.1) 
Using tilt (1.3.3) 
Using sprockets (2.7.0) 
Using sprockets-sass (0.9.1) 
Using uglifier (1.3.0) 
Using bundler (1.1.0) 
Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed.
touch-events  flame.js $ bundle exec rake
rake aborted!
wrong number of arguments (2 for 1)
  (in /Users/parker/Sites/ember-examples/flame.js/stylesheets/flame.css.scss)

Tasks: TOP => default => build
(See full trace by running task with --trace)

The trace is, of course, extensive, but the key points I noticed:

/Users/parker/.rvm/gems/ruby-1.9.3-p125@sylvius/gems/sprockets-2.7.0/lib/sprockets/context.rb:245:in `image_path'
# ...lots of lines of Sprockets....
/Users/parker/Sites/ember-examples/flame.js/Rakefile:58:in `block in <top (required)>'

So something wonky is going on with the image_path stuff? Is anyone else seeing this, or am I just going out of my mind?

Ember.View uses layout for {{yield}} helpers

Since 0.9.6 ember introduced the property "layout" to be used together with the {{yield}} helper.

It will conflict with Flame.View layout hash.

Maybe left/right/top/bottom could be set directly into Flame.View:

Flame.View.create({
    width: 100,
    height: 200
});

Editable TableCells in Table view

Not sure if this is implemented yet, but I didn't see any properties or aspects of it in the current build. Any chance this is coming up at some point?

Thanks

Widget Examples

I think it will be nice if you provide a demos for all of your widgets,
your starter kit & address book examples are just not enough.

you work is really impressive, but you need to complete the full cycle.

Blue color in IE8

flamejsie8.PNG
FlameJS starterkit behavior works fine in IE8, but there's a wiered blue color (see the picture)

MenuView closes too fast on Firefox

On Firefox, it seems that when a select button opens a menu, the item underneath the cursor gets selected immediately and the menu closes.

Instead, an item should only be selected after user has either moved the cursor enough to cause another item to be selected or let the mouse button up and then clicked on some item.

Flame.LabelView does not put text in DOM (ember-latest)

I know Flame isn't currently supporting ember-latest (or, indeed, Ember.js beyond 0.9.6.x?) but I need the newer Ember to deal with other issues in my app and getting Flame up to that standard will make my life vastly easier.

In this jsfiddle: http://jsfiddle.net/pjmorse/qUBQg/29/ we see a Flame.LabelView which puts a properly-formatted div in the DOM, but doesn't populate it with text. I don't get an error message in the console so I'm not sure where the failure is happening.

[enhancement] Add missing bower.json.

Hey, maintainer(s) of flamejs/flame.js!

We at VersionEye are working hard to keep up the quality of the bower's registry.

We just finished our initial analysis of the quality of the Bower.io registry:

7530 - registered packages, 224 of them doesnt exists anymore;

We analysed 7306 existing packages and 1070 of them don't have bower.json on the master branch ( that's where a Bower client pulls a data ).

Sadly, your library flamejs/flame.js is one of them.

Can you spare 15 minutes to help us to make Bower better?

Just add a new file bower.json and change attributes.

{
  "name": "flamejs/flame.js",
  "version": "1.0.0",
  "main": "path/to/main.css",
  "description": "please add it",
  "license": "Eclipse",
  "ignore": [
    ".jshintrc",
    "**/*.txt"
  ],
  "dependencies": {
    "<dependency_name>": "<semantic_version>",
    "<dependency_name>": "<Local_folder>",
    "<dependency_name>": "<package>"
  },
  "devDependencies": {
    "<test-framework-name>": "<version>"
  }
}

Read more about bower.json on the official spefication and nodejs semver library has great examples of proper versioning.

NB! Please validate your bower.json with jsonlint before commiting your updates.

Thank you!

Timo,
twitter: @versioneye
email: [email protected]
VersionEye - no more legacy software!

Where is RootView?

I'm trying to sync up to the current version of Flame but it appears that RootView is no longer available. Is there a new way to start a Flame app? Are there any updated examples anywhere? It seems like all of the jsfiddle examples don't work either, both Handlebars and RootView are reported missing.

Error thrown due to computed property in Event Manager.

Error is as follows:

Uncaught Error: assertion failed: Ember.Object.create no longer supports defining computed properties.

Caused by line 86 of the following

https://github.com/flamejs/flame.js/blob/master/mixins/event_manager.js

Apologies that I can't recommend a fix but this is the first day I've looked at ember/flame and I'm still getting my head round it. Ember.js version is the latest from master branch. (compiled yesterday):

// Version: v1.0.0-pre.4-206-gafaabf3
// Last commit: afaabf3 (2013-02-12 21:56:53 -0800)

Idea for a new Flame.FormView

I'm not using flamejs FormView because I like to have control over the layout and put the fields where I want.

So I tried something today and I would like your opinion on this.

So basically you can create your form just like you're used to in HTML:

{{#view TC.Form class="form-horizontal" validatorsBinding="controller.validators" viewName="form"}}
        <fieldset>
          <div class="control-group">
            <label class="control-label">* Name:</label>
            <div class="controls">{{view TC.TextField valueBinding="controller.selected.name" viewName="name"}}</div>
          </div>
         <<< ANY OTHER FIELD HERE >>>
        </fieldset>
        <div class="form-actions">
          <button {{action "save" target="controller"}} class="btn btn-primary">Salvar</button>
          <button {{action "back" target="controller"}} class="btn">Cancelar</button>
        </div>
    {{/view}}

The only thing you need to do is use viewName in your fields so you can ref them in your validators that are in the controller. In your controller you have something like that:

validators: [
                { field: 'name', validator: 'required', message: "Name is mandatory" },
                { field: 'name', validator: function(field) { return field.get('value') != "123"}, message: "Your name can't be 123" }
            ],
save: function() {
    var form = this.view.getPath("form");
    if (form.validate()) {
        // do its thing
   }
}

And fields would show errors messages and add css classes to DOM elements and such.

How so?

 TC.Form = Ember.View.extend({
            classNames: "ember-form",

            formFields: Ember.computed(function() {
              var childViews = this.get('_childViews');

              var ret = Ember.A();

              Ember.ArrayUtils.forEach(childViews, function(view) {

                if (view.isFormField) {
                    ret.push(view);
                }
              });

              return ret;
            }).property().cacheable(),

            clearErrors: function() {
                var form_items = this.get('formFields');
                this.$(".error .help-inline").remove();
                for(var i = 0; i < form_items.length; i++)
                {
                    form_items[i].$().parents(".control-group").removeClass("error");
                }                
            },

            validate: function() {
                var errors = 0;
                var formFields = this.get('formFields');
                this.clearErrors();

                for (var i = 0; i < this.validators.length; i++)
                {
                    var validator = this.validators.objectAt(i);
                    var field = this.getPath(validator.field);
                    var func = Ember.typeOf(validator.validator) == 'string'? TC.Form.defaultValidators[validator.validator] : validator.validator;

                    Ember.assert("Validator for: " + validator.field + ", is not a valid function", !func);

                    var message = validator.message;
                    var field_valid = func(field, this, validator);
                    if (!field_valid) {
                        this.error(field, message);
                        errors++;
                    }
                    else {
                       this.valid(field)
                    }
                }
                return errors == 0;
            },

            valid: function (field) {
                 if (field) {
                    field.$().parents(".control-group").removeClass("error");
                    field.$().next(".help-inline").remove();
                }
            },
            error: function(field, message) {
                if (field) {
                    field.$().parents(".control-group").addClass("error");

                    if (field.$().next(".help-inline").length === 0)
                        field.$().parents(".controls").append("<span class=\"help-inline\">" + message + "</span>");
                }
            }
        });

        TC.Form.reopenClass({
            defaultValidators: {
                        required: function(field) { return field.get('value') != ''; },
                        number: function(field, form, params) { 
                            var max = params.max;
                            var min = params.min;
                            var value = field.get('value');
                            if (parseInt(value) != value || value < min || value > max) return false;

                            return true;
                        }
                    }
        });

This code would show errors for a Bootstrap based layout. But I've done a version showing all errors on the top of the form. It's pretty flexible and shouldn't be a problem create one that shows errors like Flame.FormView does.

"You must pass instance or subclass of View" (ember-latest)

This fiddle: http://jsfiddle.net/pjmorse/qwaZs/1/ shows a Flame.VerticalSplitView failing with ember-latest. The error in the console is "Uncaught Error: assertion failed: You must pass instance or subclass of View." This seems to happen in Ember.View.createChildView, and it seems to be within the parsing of App.RootView because that never gets rendered to the DOM, which makes me think it's finding something invalid about the VerticalSplitView itself.

Touch event support?

It looks like some Flame views which maybe should support touch events don't. The two I'm noticing most prominently in my project are that ListItemViews aren't selectable with touch, and Panels which are allowed to move can't be moved with a touch-drag.

I'm going to fiddle with this a bit and see if they're relatively easy to manage; I'll put in pull requests if I can do it without too much agony. Thought I'd open an issue first, though, to see if anyone else is working on this.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.