tag:blogger.com,1999:blog-79704643569581906432024-03-13T00:28:39.968+01:00PySnippetTech and developer related blogMariohttp://www.blogger.com/profile/06895806907930156083noreply@blogger.comBlogger59125tag:blogger.com,1999:blog-7970464356958190643.post-59855761922651824282014-10-14T09:49:00.001+02:002015-05-14T10:48:36.839+02:00chmod-fu for iOSJust want to share with you that I published my first app on App Store, <i><b><a href="https://itunes.apple.com/app/apple-store/id927838132?pt=109962802&ct=pysnippet&mt=8" target="_blank">chmod-fu</a></b></i>.<br />
<br />
It will help you with calculating the octal value for manipulating file permissions using the <i><a href="http://linux.die.net/man/1/chmod" target="_blank">chmod</a></i> command which is typically found on Unix and Linux systems. It's also a good tool for deciphering an octal value.<br />
<br />
I re-wrote the <a href="http://appworld.blackberry.com/webstore/content/130470" target="_blank">BlackBerry 10 version of the app</a> to iOS. Below you'll find two screen shots from the iOS app:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAwccdGj-i2Xui_zj-s0zzqxzYxHfjz1YECQrMzKY8kH-3bqa9fyyjEtJBtTLfB2-HtslVSnV_bGNLKj-379EmPZKQPLHMEniq34mNynmke9opu-_Cyj2Nq8MRtNhwVk1WXxb2eOLLqjbu/s1600/chmod.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAwccdGj-i2Xui_zj-s0zzqxzYxHfjz1YECQrMzKY8kH-3bqa9fyyjEtJBtTLfB2-HtslVSnV_bGNLKj-379EmPZKQPLHMEniq34mNynmke9opu-_Cyj2Nq8MRtNhwVk1WXxb2eOLLqjbu/s1600/chmod.png" width="179" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<i><span style="font-size: x-small;">Main view where you can manipulate and see the relation between individual bits and the octal value.</span></i></div>
<div class="separator" style="clear: both; text-align: center;">
<i><span style="font-size: x-small;"><br /></span></i></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTB7skGdATHZL0oxudUauvPOsO37GLp0_dd8srXCnfNdcM8uX_N7_0QwOEVjmbElpSkU9-kJYJh7YI4E0Q622_-4hDky1Ig5MMAYJHSqQkqsv-WUJ5EfpCU5eEaI-7Avukx3lOZdfRH-wL/s1600/share.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTB7skGdATHZL0oxudUauvPOsO37GLp0_dd8srXCnfNdcM8uX_N7_0QwOEVjmbElpSkU9-kJYJh7YI4E0Q622_-4hDky1Ig5MMAYJHSqQkqsv-WUJ5EfpCU5eEaI-7Avukx3lOZdfRH-wL/s1600/share.png" width="179" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<i><span style="font-size: x-small;">It's also possible to share the octal value with others directly from within the app.</span></i></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://itunes.apple.com/app/apple-store/id927838132?pt=109962802&ct=pysnippet&mt=8"><img border="0" height="40" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVY_preiZnQSHKpBF_xF-t6z-RNHIICD7z8ZS6ys0Vc4YFrhM4U4HkNduwfprmL5rNTDvMiv1yzc8UdiepbIqO2pDUYu4Bi7tTH6w4LW4-YNuh0tEyYK77Ry7LdwVe2Y-5Z9I8PHC0i1KX/s1600/Download_on_the_App_Store_Badge_US-UK_135x40.png" style="border: none;" width="135" /></a></div>
<div style="text-align: center;">
<br /></div>
<br />Mariohttp://www.blogger.com/profile/06895806907930156083noreply@blogger.com2tag:blogger.com,1999:blog-7970464356958190643.post-26796901474223682292013-01-29T20:10:00.001+01:002013-01-29T20:10:51.938+01:00Planning Poker for BB10Check out my new app, <a href="http://appworld.blackberry.com/webstore/content/21717661/" target="_blank">Planning Poker</a> for BlackBerry 10. It's created using Qt and Cascades/QML. The source code, which is released under the Apache License v2.0, is available from the <a href="https://bitbucket.org/marioboikov/planning-poker/" target="_blank">project page</a> on <a href="http://bitbucket.org/" target="_blank">Bitbucket</a>.<br />
<br />
The application features a clean, simple and Ad-free user interface for your agile planning sessions. Simply swipe between cards or pinch to pick one fast. Double tap to hide/unhide. Supports light and dark card theme.<br />
<br /><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnknoo6eyiZ40_DyUFvghRHSQn9rd_Gxhf8o_2drK9oZdCEU7rNolFSi7QZF9qHFD2b4Vw_5hqNvA5X4lhEA7SIjN7hVly5YVeNyuiRyz98dRXIjSD9up4BjxqbuWdEH2hM1Tc-wysAWZQ/s1600/IMG_00000037.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnknoo6eyiZ40_DyUFvghRHSQn9rd_Gxhf8o_2drK9oZdCEU7rNolFSi7QZF9qHFD2b4Vw_5hqNvA5X4lhEA7SIjN7hVly5YVeNyuiRyz98dRXIjSD9up4BjxqbuWdEH2hM1Tc-wysAWZQ/s320/IMG_00000037.png" width="192" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgS4O1JVdT_lgxnuQCeafksOwRA3xOke4n4DYSSBHii6IMhMxQ1rHi-P6nxpjJ86hfu0_3zbZDFrD4dvRemzA3HxOKU2FbNusjp_NXEjKxXecuCVysGudE5VD63GESq8H_UKUpV68O8ih6i/s1600/IMG_00000036.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgS4O1JVdT_lgxnuQCeafksOwRA3xOke4n4DYSSBHii6IMhMxQ1rHi-P6nxpjJ86hfu0_3zbZDFrD4dvRemzA3HxOKU2FbNusjp_NXEjKxXecuCVysGudE5VD63GESq8H_UKUpV68O8ih6i/s320/IMG_00000036.png" width="192" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_KFcV4pY7MpFoXoj7rIYciWU-n59lREHGMpz91JW99ISlCDkQjMQIzrytnfmRwL-FujNZ94PNX2BYxpjbPHHpfkj4Y2d2CZZBTderjEPPRvBEkUV9pwrfDGoeuOIb_f6ZKFxIEa1iP2ns/s1600/IMG_00000038.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_KFcV4pY7MpFoXoj7rIYciWU-n59lREHGMpz91JW99ISlCDkQjMQIzrytnfmRwL-FujNZ94PNX2BYxpjbPHHpfkj4Y2d2CZZBTderjEPPRvBEkUV9pwrfDGoeuOIb_f6ZKFxIEa1iP2ns/s320/IMG_00000038.png" width="192" /></a></div>
<br />
<div>
<br /></div>
Mariohttp://www.blogger.com/profile/06895806907930156083noreply@blogger.com2tag:blogger.com,1999:blog-7970464356958190643.post-459555542977468772013-01-17T19:26:00.000+01:002013-01-17T19:26:25.955+01:00Informative list views in Cascades (BB10)This post gives an example how you can present the user some informative text or controls when a list view is empty.<br />
<br />
Typical scenarios where this may be desirable are:<br />
<ul>
<li>When populating a list view with data from a network service.<ul>
<li>Show a <i>Fetch data</i> button if the list view is empty.</li>
<li>Present any error that might occur while downloading/processing the data</li>
</ul>
</li>
<li>Showing search result in a list view.</li>
<ul>
<li>Present a <i>No items found</i> text to the user if the list view is empty.</li>
</ul>
</ul>
<div>
In the example application I'm using an <a href="https://developer.blackberry.com/cascades/reference/bb__cascades__arraydatamodel.html" target="_blank">ArrayDataModel</a>, but it should work for <a href="https://developer.blackberry.com/cascades/reference/bb__cascades__qlistdatamodel.html" target="_blank">QListDataModel</a> and <a href="https://developer.blackberry.com/cascades/reference/bb__cascades__groupdatamodel.html" target="_blank">GroupDataModel</a> too. Unfortunately, it will not work with <a href="https://developer.blackberry.com/cascades/reference/bb__cascades__xmldatamodel.html" target="_blank">XmlDataModel</a> because the class doesn't expose any function to query if the model is empty (at least not easily).<br />
<br />
All of the data models mentioned above provides an <i>isEmpty()</i> function which can be used to check if the data model contain any items or not.<br />
<br />
The example should speaks for itself, so without any further ado, here's the code:</div>
<div>
<br /></div>
<pre class="javascript" name="code">import bb.cascades 1.0
Page {
Container {
layout: DockLayout {}
ListView {
dataModel: ArrayDataModel {
id: model
// Bindable property which tells if the
// model is empty or not
property bool empty: true
// Populates model with dummy data
function populate() {
for (var i = 0; i < 10; i++) {
append({'title' : 'Item #' + i})
}
}
// The following signal handlers updates
// the empty property to correct state
onItemAdded: empty = isEmpty()
onItemRemoved: empty = isEmpty()
onItemUpdated: empty = isEmpty()
// You might see an 'unknown signal' error
// in the QML-editor, guess it's a SDK bug.
onItemsChanged: empty = isEmpty()
}
}
// Only visible when data model is empty.
// This should be declared after the ListView
// to prevent the ListView from consuming touch input etc
// Setting ListView's visible property to !model.empty will
// also work.
Label {
visible: model.empty //model.isEmpty() will not work
horizontalAlignment: HorizontalAlignment.Fill
verticalAlignment: VerticalAlignment.Center
text: qsTr("No entries yet\n\nPlease populate data model")
textStyle.base: SystemDefaults.TextStyles.BigText
textStyle.textAlign: TextAlign.Center
multiline: true
}
}
actions: [
// Action to populate/clear data model depending on state.
// Same here, model.isEmpty() will not behave as expected.
ActionItem {
title: model.empty ? qsTr("Populate") : qsTr("Clear")
onTriggered: model.empty ? model.populate() : model.clear()
ActionBar.placement: ActionBarPlacement.OnBar
}
]
}
</pre>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJuC3Y_dn5NjlBELtv6V6BXPsB_TM7Nlh8SQNBp3V49wImv23PSGHTNEkHxG7VGZAxSoGjEOxnQznpkmmHdcpbkNnZeb7t4qJVEr6anOO5Kg-2XMEsFj_5IYXZNtCf4EPe16gRML0gh8bW/s1600/screenshots.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="258" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJuC3Y_dn5NjlBELtv6V6BXPsB_TM7Nlh8SQNBp3V49wImv23PSGHTNEkHxG7VGZAxSoGjEOxnQznpkmmHdcpbkNnZeb7t4qJVEr6anOO5Kg-2XMEsFj_5IYXZNtCf4EPe16gRML0gh8bW/s320/screenshots.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<i><span style="font-size: x-small;">Screenshots from the example application</span></i></div>
<div class="separator" style="clear: both; text-align: center;">
<i><span style="font-size: x-small;"><br /></span></i></div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<div style="text-align: -webkit-auto;">
A work-around is required because <i>isEmpty()</i> is only an invokable function in QML, and not a bindable property. The example will not behave as expected if <i>model.isEmpty()</i> is set as a value for the Label's visible property. The <i>isEmpty()</i> function is only called once when the Label is created and will never be re-evaluated again since it's not a bindable property (hint to Cascades API developers).</div>
<div style="text-align: -webkit-auto;">
<br /></div>
<div style="text-align: -webkit-auto;">
Please feel free to add other ways to accomplish this in the comments section.</div>
Mariohttp://www.blogger.com/profile/06895806907930156083noreply@blogger.com0tag:blogger.com,1999:blog-7970464356958190643.post-74067532401037144442012-11-23T18:48:00.002+01:002012-11-23T18:48:40.280+01:00More guest posts at devblog.blackberry.comForgot to mention that I've posted two more posts at <a href="http://devblog.blackberry.com/">BlackBerry DevBlog</a> a while ago.<br />
<ul>
<li><a href="http://devblog.blackberry.com/2012/06/qml-cascades-tip-namespaces/">QML/Cascades tip of the day – Namespaces</a><br />Cover the topic of using namespaces to avoid name clashes etc in QML.</li>
<li><a href="http://devblog.blackberry.com/2012/07/qml-tip-property-aliases/">QML/Cascades tip of the day – Property Aliases</a><br />Covers the topic about property alias in QML.</li>
</ul>
<div>
The target audience are new comers to QML.</div>
Mariohttp://www.blogger.com/profile/06895806907930156083noreply@blogger.com0tag:blogger.com,1999:blog-7970464356958190643.post-60987881624819021472012-06-26T21:20:00.000+02:002012-06-26T21:20:42.795+02:00Python and Qt on BlackBerry [PlayBook]I've just bought a BlackBerry PlayBook. After been spending some time with a borrowed PlayBook I decided to buy one myself. Many of you might wonder why the hell I did that but I really think it's a great device. The three top things that made me buy the PlayBook are:<br />
<ul>
<li><span style="background-color: white;">Cheap! Good value for the money, the 32 Gb version for only €249</span></li>
<li>Awesome user experience. Really love those swipe gestures which only requires one finger so you can pretty much operate the device with only one finger :). It also gets addictive!</li>
<li>It runs Qt and Python!</li>
</ul>
<div>
You might argue that there are very little apps for the PlayBook but admittedly I mostly use the browser so that isn't such a big deal for me. The native PIM-apps integrates well with Google services, such as mail, calendar and contacts. The only thing that I'm missing is an official twitter client. There're a bunch of them on AppWorld but I haven't had time to checked them out yet. RIM do also claim that the PlayBook will be upgradeable to BlackBerry 10 so that should give some confidence of the PlayBook having an upgrade path :)</div>
<div>
<br /></div>
<div>
The PlayBook is powered by <a href="http://www.qnx.com/">QNX</a> which is a real-time micro kernel and supports a lot of POSIX APIs. This basically means that many open source apps/libs for Linux can be ported with little or no effort. What I think is rather cool is that Python 3.2 is pre-installed on the PlayBook which you can use to run Python application.</div>
<div>
<br /></div>
<div>
<a href="http://blackberry-py.microcode.ca/">BlackBerry-Py</a> is a project which goal is to build an environment to support application development in Python for the PlayBook and the upcoming BlackBerry 10 OS. BB-Py uses <a href="http://www.pyside.org/">PySide</a> (Python bindings for Qt) for the UI and the project is also working on support for <a href="https://developer.blackberry.com/cascades/">Cascades</a>. It's very easy to get started so I'll just point you to the <a href="http://hg.microcode.ca/blackberry-py/wiki/Building%20HelloWorld">"Hello World"</a> example which describes every step you need to take to deploy an app to the device. And no, I didn't find it that hard to get the <i>debug token </i>which you need to install your app on the device :).</div>
<div>
<br /></div>
<div>
Currently the PlayBook OS doesn't include the Qt libraries so they, and PySide, need to be bundled with your app. BB10 is using Qt to a great extent (Cascades is built on top of Qt) and the libraries will be available on the filesystem, only PySide needs to be bundled.</div>
<div>
<br /></div>
<div>
Oh, you also need to download an SDK, for example the <a href="https://developer.blackberry.com/platforms/ndk">Native SDK</a>, to get the required tools for packaging and deploying.</div>
<div>
<br /></div>Mariohttp://www.blogger.com/profile/06895806907930156083noreply@blogger.com1tag:blogger.com,1999:blog-7970464356958190643.post-15954534696444297732012-06-07T22:40:00.000+02:002012-06-07T22:40:24.777+02:00QML tip over at BlackBerry DevBlogI've just got a guest post published over at BlackBerry DevBlog.<br />
<br />
The post is about adding properties to existing components (<a href="https://bdsc.webapps.blackberry.com/cascades/">Cascades</a> example) to make the code <i>more</i> declarative if you want to track values that are only emitted in signal handlers.<br />
<br />
You can read the post <a href="http://devblog.blackberry.com/2012/06/cascades-tip-qml/#more-9733">here</a>Mariohttp://www.blogger.com/profile/06895806907930156083noreply@blogger.com0tag:blogger.com,1999:blog-7970464356958190643.post-57408508788642834452012-03-30T15:30:00.000+02:002012-03-30T15:30:12.254+02:00Nokia Developer ChampionI just got an e-mail from Nokia saying "Welcome to the Nokia Developer Champion Program".<br />
<br />
It's an invite only reward program by Nokia. You can read more about the program <a href="https://www.developer.nokia.com/Community/Champions/">here</a>.Mariohttp://www.blogger.com/profile/06895806907930156083noreply@blogger.com0tag:blogger.com,1999:blog-7970464356958190643.post-67632674545857112012-03-08T08:43:00.000+01:002012-03-08T08:43:45.805+01:00Opensourcedays 2012I've just signed up for <a href="http://opensourcedays.org/2012/">opensourcedays 2012</a> which is held this weekend.<br />
<br />
I'm especially looking forward to the talks about Qt and KDE.<br />
<br />
Maybe I'll see you there?Mariohttp://www.blogger.com/profile/06895806907930156083noreply@blogger.com0tag:blogger.com,1999:blog-7970464356958190643.post-67200070961587270422011-10-12T10:49:00.000+02:002011-10-12T10:50:40.099+02:00Open links from Text-elements in QtQuickI just finished yet another blog post on my companies blog site. It's about opening external application when clicking on links in QML Text-element.<br />
<br />
Read about it <a href="http://blog.jayway.com/2011/10/12/open-links-from-text-elements-in-qtquick/">here</a>Mariohttp://www.blogger.com/profile/06895806907930156083noreply@blogger.com0tag:blogger.com,1999:blog-7970464356958190643.post-538302855194728032011-09-22T15:34:00.000+02:002011-09-22T15:35:30.347+02:00Using QtCreator for Arduino developmentI just finished a blog post on my company's blog site about using QtCreator as development environment for the Arduino board.<br />
<br />
Please head over <a href="http://blog.jayway.com/2011/09/22/using-qtcreator-for-arduino-development/">here</a> to read all about it.<br />
<br />
<br />Mariohttp://www.blogger.com/profile/06895806907930156083noreply@blogger.com0tag:blogger.com,1999:blog-7970464356958190643.post-38975415954933904542011-09-03T10:39:00.000+02:002011-09-03T10:39:51.166+02:00System 76: Linux Devices and Better Business Values<style type="text/css">
<!--
@page { margin: 2cm }
P { margin-bottom: 0.21cm }
A:link { color: #0000ff }
-->
</style>
<br />
<div style="line-height: 100%; margin-bottom: 0cm;">
<span style="font-family: Times New Roman,serif;"><span style="font-size: small;"><i>Guest post by Nadia Jones. Look at the end of the post for more info about Nadia.</i></span></span><br />
<span style="font-family: Times New Roman,serif;"><span style="font-size: small;"><i> </i> </span></span><br />
<span style="font-family: Times New Roman,serif;"><span style="font-size: small;">To
the average computer user there are two types of operating systems:
Apple and Microsoft. While for the mass market this basically stands
true, computer programmers, developers, and techies also recognize
Linux as one of the great computer operating systems. Though Linux is
not as widespread or popular as Apple or Microsoft, it is just as
well-respected (if not more so). There are several reasons that Linux
just hasn't become a mass success like other operating systems have.
While there are very few companies that produce computers with the
Linux OS already installed, </span></span><span style="color: blue;"><u><a href="http://www.system76.com/"><span style="font-family: Times New Roman,serif;"><span style="font-size: small;">System76
does</span></span></a></u></span><span style="font-family: Times New Roman,serif;"><span style="font-size: small;">.
</span></span>
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<span style="font-family: Times New Roman,serif;"><span style="font-size: small;">Not
only is System76 one of the few companies that sells laptops with
Linux preinstalled, they are one of the </span></span><span style="font-family: Times New Roman,serif;"><span style="font-size: small;"><i>only</i></span></span><span style="font-family: Times New Roman,serif;"><span style="font-size: small;">
companies that sells them at reasonably competitive prices. No doubt,
these computers will likely cost more than your average Dell because
System76 is such a small outfit, but the prices remain extremely
reasonable. Selling laptops, desktops, and servers all outfitted with
Ubuntu, System76 is a firm believer in Linux as an operating system.
As System76 explains, Linux offers stability, security, and the
"freedom to use the software you like, the way you like to use
it". One of the other big perks about using Linux and all of its
machines is that they are completely free. System 76 will provide you
with preinstalled applications such as open office suite, Totem and
Xine movie players, GIMP image manipulation, and several others. </span></span>
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<span style="font-family: Times New Roman,serif;"><span style="font-size: small;">Moreover,
System76 is unique in that they actually do something with your
device before they send it to you. Rather than simply installing
Ubuntu on the laptop you order and then sending it to you, the
System76 people give you their own drivers and special configurations
to make your machine run as smoothly and flawlessly as possible.
Along with special attention paid to each individual product they
ship out, System76 also pays special attention to each of their
customers. Because they are such a small company, they are able to
offer exceptional customer service. If there is any sort of software
or hardware issue, you can email the company and you will receive a
personal email back from someone involved with building your
computer. </span></span>
</div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<br /></div>
<div style="line-height: 100%; margin-bottom: 0cm;">
<span style="font-family: Times New Roman,serif;"><span style="font-size: small;">While
not everything about these computers and this company is going to
work impeccably, their focus on customer service and better business
is noteworthy. System76 offers a unique system with customizable
approaches. Furthermore, System76 is dedicated to eco-friendly
business values, making them not only reliable, but also current and
forward thinking. For Linux enthusiasts and newbies alike, System76
is certainly worth a look-see. </span></span>
</div>
<div style="line-height: 100%; margin-bottom: 0.49cm; margin-top: 0.49cm;">
<span style="color: black;"><span style="font-family: Times New Roman,serif;"><span style="font-size: small;"><u><b>Author
Bio:</b></u></span></span></span></div>
<div style="line-height: 100%; margin-bottom: 0.49cm; margin-top: 0.49cm;">
<span style="font-family: Times New Roman,serif;"><span style="font-size: small;"><span style="color: black;">This
is a guest post by </span><span style="color: black;"><b>Nadia Jones</b></span><span style="color: black;">
who blogs at </span><span style="color: blue;"><u><a href="http://www.onlinecollege.org/">online
college</a></u></span><span style="color: black;"> about education,
college, student, teacher, money saving, movie related topics. You
can reach her at nadia.jones5 @ gmail.com.</span></span></span></div>
Mariohttp://www.blogger.com/profile/06895806907930156083noreply@blogger.com0tag:blogger.com,1999:blog-7970464356958190643.post-44244215559385419882011-08-13T09:26:00.010+02:002011-08-13T09:48:06.700+02:00tvmatchen for Nokia N9I just released a video of my port of tvmatchen for Nokia devices (Symbian^3 and now N9). Tvmatchen is a tv-guide application for live sports and is only available in Swedish.
<br />
<br /><a href="http://nokiagadgets.com/">NokiaGadgets</a> actually wrote a couple of lines about the application, even though the app is in Swedish. The <span style="font-style: italic;">review</span> was very positive and the author wants to see more apps looking like this one. It does feel good in a coders heart when someone writes something positive about your app :)
<br />
<br />Link to the <a href="http://nokiagadgets.com/2011/08/12/how-these-new-qt-apps-should-look-like-tvmatchen-for-n9n950swe/">article</a>.
<br />
<br />And of course the video
<br /><iframe src="http://www.youtube.com/embed/AN3Y2n2h9Xk" allowfullscreen="" frameborder="0" height="510" width="640"></iframe>Mariohttp://www.blogger.com/profile/06895806907930156083noreply@blogger.com1tag:blogger.com,1999:blog-7970464356958190643.post-50360440578774981752011-06-22T09:13:00.002+02:002011-06-22T09:13:43.448+02:00Nokia N9 and PythonYet another great day to be a python coder! The new Harmattan/MeeGo device, Nokia N9, will be packed with support for Python!<br />
<br />
For more info, look <a href="http://wiki.meego.com/Harmattan_Python">here</a><br />
<br />
Yes, it seems that you can publish your python apps on ovi... Nokia Store too.Anonymousnoreply@blogger.com4tag:blogger.com,1999:blog-7970464356958190643.post-23853286148017539472011-06-19T14:44:00.000+02:002014-03-12T19:34:52.655+01:00QtQuick - From Bling Bling To Blink Blink<span id="internal-source-marker_0.6282135008404465" style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">Probably
most of you already know that QtQuick is used to create amazing
blingalicous UIs without too much effort. The declarative QML language
makes it very easy to create object instances and setup property
bindings, animation, states etc. Lately I’ve been tinkering with my <a href="http://www.blogger.com/goog_7803471">Velleman </a></span><span id="internal-source-marker_0.6282135008404465" style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"><a href="http://www.velleman.eu/distributor/products/view/?country=be&lang=en&id=351346">K8055</a> USB experiment board and wanted to create a nice UI to control the board. </span><span id="internal-source-marker_0.6282135008404465" style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">It
didn’t take too long until I was thinking a little bit out side of the
box and started experimenting with controlling the board with QtQuick
but without a UI. I created a couple of QML components on the C++ side
to control the input/outputs of the board and quickly realized the
possibilities QML provides even for non-UI applications.</span><br />
<br />
<span id="internal-source-marker_0.6282135008404465" style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">Basically
what I did was to create a declarative engine and not a declarative
view. By doing this you can have a QML file interpreted and access to
the object instances created by the engine from within your C++ code. I
see a lot of potential and possibilities, one thing that comes to my
mind straight away is to utilize QML as a <i><a href="http://en.wikipedia.org/wiki/Dependency_injection">Dependency Injection</a></i></span><span id="internal-source-marker_0.6282135008404465" style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"> </span><span id="internal-source-marker_0.6282135008404465" style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">container :)</span><br />
<pre class="cpp" name="code">QDeclarativeEngine *engine = new QDeclarativeEngine;
QDeclarativeComponent component(engine, QUrl("qrc:/example1.qml"));
Board *board = qobject_cast<board *>(component.create());</pre>
<div style="text-align: center;">
<span id="internal-source-marker_0.6282135008404465" style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"><i><span style="font-size: x-small;">Example code to interpret a QML file</span></i></span></div>
<div style="text-align: left;">
</div>
<span id="internal-source-marker_0.6282135008404465" style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">The source code is available at <a href="https://bitbucket.org/marioboikov/k8055tinker">k8055tinker</a></span><br />
<br />
<span id="internal-source-marker_0.6282135008404465" style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">Check out the video below which demonstrates my code:</span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/wYD-he0ywew?feature=player_embedded' frameborder='0'></iframe></div>
<br />
<span id="internal-source-marker_0.6282135008404465" style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"><i>I've also tagged this post with </i><i>Python because it can be of interest for the planet python readers since this can also be accomplished with <a href="http://www.pyside.org/">PySide</a>. </i></span>Anonymousnoreply@blogger.com2tag:blogger.com,1999:blog-7970464356958190643.post-18285372214162496402011-05-21T12:42:00.000+02:002011-05-21T12:42:04.992+02:00I wish that I had Jessie's girl...<a href="http://www.youtube.com/watch?v=qYkbTyHXwbs">Rick Springfield</a> had a great hit with a song called <i>Jessie's Girl</i> and the same track is now used for the <a href="http://mynokiablog.com/2011/05/17/video-holy-crap-its-the-nokia-n9-or-n950-meego-phone-teaser-advert/">Nokia N9 teaser ad</a> which popped up a couple of days ago.<br />
<br />
I really hope this is a MeeGo device, or to be honest, I just hope it's a Linux + Qt/QtQuick enabled device with some MeeGo compliance.<br />
<br />
I've had quite a lot of fun with QtQuick lately (both for desktop and my N8) and I really enjoy using it. It just open so much possibilities and lets you be creative.<br />
<br />Another thing that would be awesome is if Nokia actually puts <a href="http://www.pyside.org/">PySide</a>, the Nokia sponsored Qt-bindings for Python, on the handset. Having Python as a rapid back-end language combined with QtQuick for the view is just too sweet :)<br />
<br />
Grr... I hate not knowing, but I just have to wait and see.Anonymousnoreply@blogger.com2tag:blogger.com,1999:blog-7970464356958190643.post-17157405996121142011-04-20T15:58:00.000+02:002011-04-20T15:58:52.868+02:00I won the "Travelling salesman" competition!Nokia held a mobile app competition at its Nordic blog which I won!<br />
<br />
For more info, look <a href="http://blogs.nokia.com/nordicblog/news/mario-boikov-%E2%80%93-winner-of-the-traveling-salesman-competition/#date=2011-04-20,mode=month">here</a><br />Anonymousnoreply@blogger.com0tag:blogger.com,1999:blog-7970464356958190643.post-68815976265997726782011-04-13T13:08:00.000+02:002011-04-13T13:08:03.105+02:00Tips! Kdenlive - A great video editorI've just started to take a look on how to editing videos and was searching the net to find some tools for Linux.<br />
<br />
After trying a couple I found out about the <a href="http://www.kde.org/">KDE</a> application <a href="http://kdenlive.org/">Kdenlive</a> from some blog post and I must say that this tools looks very promising. It did crash once when I tried it out but I can live with that since I'm not a heavy user of video editing. I just need something for creating youtube videos occasionally.<br />
<br />
In addition to the great app there's also a bunch of video tutorials <a href="http://www.kdenlive.org/tutorial">here</a> to help you getting started.<br />
<br />
So if you're in the same position as me I think you should take a look at KdenliveAnonymousnoreply@blogger.com0tag:blogger.com,1999:blog-7970464356958190643.post-81261622756005743992011-03-29T09:38:00.000+02:002011-03-29T09:38:02.072+02:00PySide and QMLIt has been out there for a while but I haven't had time to try it out, PySide 1.0 with QML support!<br /><br />This really gives you a über rapid app development environment. The power of Python combined with the awesomeness of the declarative language QML from the Qt framework.<br /><br />Take a look and feel free to play with the example below:
<pre name="code" class="python">
from PySide import QtCore
from PySide import QtGui
from PySide import QtDeclarative
class Message(QtDeclarative.QDeclarativeItem):
messageChanged = QtCore.Signal()
def __init__(self, parent = None):
QtDeclarative.QDeclarativeItem.__init__(self, parent)
self._msg = u''
def getMessage(self):
return self._msg
def setMessage(self, value):
if self._msg != value:
print "Setting message property to", value
self._msg = value
self.messageChanged.emit()
else:
print "Message property already set to", value
message = QtCore.Property(unicode, getMessage, setMessage, notify=messageChanged)
def main():
app = QtGui.QApplication([])
QtDeclarative.qmlRegisterType(Message, "utils", 1, 0, "Message")
win = QtDeclarative.QDeclarativeView()
win.setSource("main.qml")
win.setWindowTitle("Hello World")
win.setResizeMode(QtDeclarative.QDeclarativeView.SizeRootObjectToView)
win.show()
app.exec_()
if __name__ == "__main__":
main()
</pre>
<pre name="code" class="javascript">
import Qt 4.7 // or QtQuick 1.0 if applicable
import utils 1.0
Rectangle {
id: main
signal clicked
color: "black"
width: 360; height: 360
Message {
id: msg
message: "Click Me!"
onMessageChanged: label.font.pixelSize = 40
}
Text {
id: label
anchors.centerIn: parent
text: msg.message
color: "white"
font.pixelSize: 25
Behavior on font.pixelSize {
NumberAnimation { duration: 800; easing.type: Easing.OutBounce }
}
MouseArea {
anchors.fill: parent
onClicked: msg.message = "Hello World"
}
}
}
</pre>
For more information point your browser to <a href="http://www.pyside.org/">http://www.pyside.org</a> and download the package for your OS.<br />
<br />
You'll also find useful information at <a href="http://developer.qt.nokia.com/wiki/Category:LanguageBindings::PySide">http://developer.qt.nokia.com/wiki/Category:LanguageBindings::PySide</a><br /><br />Happy hacking!<br />Anonymousnoreply@blogger.com6tag:blogger.com,1999:blog-7970464356958190643.post-51085470086515550362011-02-01T20:24:00.000+01:002011-02-01T20:24:32.079+01:00Guest blog post at Nokia Nordic BlogI've been invited to write a guest blog post at Nokia Nordic blog. Please check it out if you're interested in Qt-development.<br />
<br />
<a href="http://blogs.nokia.com/nordicblog/news/meet-mario-the-man-behind-the-qt-app-tvmatchen/#date=2011-02-01,mode=month">http://blogs.nokia.com/nordicblog/news/meet-mario-the-man-behind-the-qt-app-tvmatchen/#date=2011-02-01,mode=month</a><br />
<br />
<br />Anonymousnoreply@blogger.com0tag:blogger.com,1999:blog-7970464356958190643.post-42074333619502866642010-11-29T20:37:00.000+01:002010-11-29T20:37:53.314+01:00Nokia Certified Qt DeveloperNow I finally received my Qt certification diploma by mail. Actually, I passed the exam when I attended the Qt DevDays 2010 (october) in Munich. See if I'll go for the <a href="http://qt.nokia.com/developer/learning/qt-curriculum/advanced-exam-curricula/">advanced exam</a> some day.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/_ilsnPCKxGBM/TPQALgSxz6I/AAAAAAAAAC0/NQ3dzZlmdLY/s1600/cert.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="209" src="http://3.bp.blogspot.com/_ilsnPCKxGBM/TPQALgSxz6I/AAAAAAAAAC0/NQ3dzZlmdLY/s320/cert.png" width="320" /></a></div>
<br />Anonymousnoreply@blogger.com4tag:blogger.com,1999:blog-7970464356958190643.post-53555022424138590712010-11-12T11:52:00.000+01:002010-11-12T11:52:04.564+01:00Nokia Rules!There's a conference in the southern part of Sweden (Malmoe) called <a href="http://www.oredev.org/">Oredev</a> which I have been attending this week. I was interested in a talk about MeeGo, meet some Nokia people and to attend a two days Qt course.<br />
<br />
Nokia had a booth and I was passing by to check out if they had some Qt stickers which I needed for a demonstration (a simple QML app) I was going to show at my employers booth. To my disappointment they had no stickers but instead I had a great chat with one of guys.<br />
<br />
We had an interesting and giving chat about Qt, apps, OviStore, Nokia and MeeGo. Suddenly the guy grabs a package and hands it to me, to my surprise I just realized that he gave me a Nokia N8! He smiled at me and told me to make my app available on OviStore.<br />
<br />
Now finally Nokia has given me the opportunity to develop apps for mobile devices since I can use Qt (I already made an app w/o owning a device).<br />
<br />
I can't wait for MeeGo devices to show up. <br />
<br />
Thanks Nokia!Anonymousnoreply@blogger.com4tag:blogger.com,1999:blog-7970464356958190643.post-40861858342887032632010-11-06T17:08:00.000+01:002010-11-06T17:08:59.223+01:00Getting Interactive With PyQtOne of the cooler features with PyQt (IMHO) is the possibility to write Qt code interactively. It isn't actually something new and I'm sure it's been there for a while but some of you might not be aware of it. I find it very useful when I want to learn new things in Qt, so without further ado, here's a short introduction on using it.<br />
<br />
Start an interactive python session by executing python in a shell:
<br />
<pre class="python" name="code">$> python
Python 2.6.6 (r266:84292, Sep 15 2010, 16:22:56)
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
</pre>
Let's create a simle top-level window (I wont add the '>>>' in case you would like to copy/paste the code):
<br />
<pre class="python" name="code">from PyQt4.QtCore import *
from PyQt4.QtGui import *
app = QApplication([])
window = QWidget()
window.resize(400, 300)
window.show()
</pre>
Now you should have a window similar to the screen shot below:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/_ilsnPCKxGBM/TNV0F-KvpiI/AAAAAAAAACU/TAG8AyiWDeo/s1600/window.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="259" src="http://3.bp.blogspot.com/_ilsnPCKxGBM/TNV0F-KvpiI/AAAAAAAAACU/TAG8AyiWDeo/s320/window.png" width="320" /></a></div>
<br />
Ok, let's create a push button:
<br />
<pre class="python" name="code">button = QPushButton("Click Me!", window)
</pre>
Hmm, no button shows up... Why? Well, that's because we need to make it visible after we have added it to the window:
<br />
<pre class="python" name="code">button.show()
</pre>
Ahh, sweet! We have added the button to the window interactively:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/_ilsnPCKxGBM/TNV0bcFHqOI/AAAAAAAAACY/3st5zlKCvLA/s1600/button.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="259" src="http://3.bp.blogspot.com/_ilsnPCKxGBM/TNV0bcFHqOI/AAAAAAAAACY/3st5zlKCvLA/s320/button.png" width="320" /></a></div>
Let's put the button at the center of the window by using a layout manager:<br />
<br />
<pre class="python" name="code">layout = QHBoxLayout(window)
layout.addWidget(button)
</pre>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/_ilsnPCKxGBM/TNV5Qa6XbfI/AAAAAAAAACc/XU8Xu33BbHc/s1600/center.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="http://3.bp.blogspot.com/_ilsnPCKxGBM/TNV5Qa6XbfI/AAAAAAAAACc/XU8Xu33BbHc/s320/center.png" width="320" /></a></div>
<br />
And finally, let's see how 'layout.addStretch()' affects the layout:
<br />
<pre class="python" name="code">layout.addStretch()
</pre>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/_ilsnPCKxGBM/TNV5U6VjBmI/AAAAAAAAACg/Hbz2JbvtuCQ/s1600/stretch.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="259" src="http://3.bp.blogspot.com/_ilsnPCKxGBM/TNV5U6VjBmI/AAAAAAAAACg/Hbz2JbvtuCQ/s320/stretch.png" width="320" /></a></div>
You can easily add a slot to the button's clicked signal:<br />
<pre class="python" name="code">def mySlot():
print "Button Clicked"
button.clicked.connect(mySlot)
</pre>
As you can see, it's an easy way to try out thing in Qt.<br />
<br />
Thanks for reading!Anonymousnoreply@blogger.com12tag:blogger.com,1999:blog-7970464356958190643.post-75172018907073517492010-09-27T20:10:00.000+02:002010-09-27T20:10:39.384+02:00Qt DevDays 2010I'm attending <a href="http://qt.nokia.com/qtdevdays2010/">Qt DevDays 2010</a> and really looking forward to it.<br />
<br />
I haven't decided yet which tracks I'll attend, there are so many interesting but I definitely go for some Quick-talks. I believe I'll have a great time.<br />
<br />
And that's not all, in November I'll also attend a two day <a href="http://oredev.org/2010/courses#qt">Mobile Qt</a> course at <a href="http://oredev.org/2010">Öredev</a> with topics such as Qt Mobility API, Gesture framework, Hybrid JavaScript apps and last but not least Quick. Looks very promising.Anonymousnoreply@blogger.com2tag:blogger.com,1999:blog-7970464356958190643.post-34111006337838502402010-09-11T09:23:00.000+02:002010-09-11T09:23:11.328+02:00PyQt and Signal overloadsI almost spent half an hour trying to figure out why my code didn't work.<br />
<br />
I used a QSignalMapper to connect a couple of clickable widgets to emit just one signal, <i>widgetClicked(int index)</i>, instead of having multiple signals, one for each widget. I connected the <i>widgetClicked</i> signal to the <i>mapped</i> signal of the QSignalMapper class and did the required set up for the signal mapper, something like the following snippet:
<br />
<pre class="python" name="code">self._signalMapper = QSignalMapper(self)
self._signalMapper.mapped.connect(self.widgetClicked)
for index, widget in enumerate(buttons):
widget.clicked.connect(self._signalMapper.map)
self._signalMapper.setMapping(widget, index)
</pre>
Everything worked fine until I changed the signature of <i>widgetClicked</i> to pass a string instead of an int, it didn't work anymore. I only got the following print out: <b>TypeError: connect() failed between 'mapped' and 'widgetClicked'</b> and had no clue why because the <i>mapped</i> signal has a couple of overloads:
<br />
<pre class="c++" name="code">void mapped(int i)
void mapped(const QString & text)
void mapped(QWidget * widget)
void mapped(QObject * object)
</pre>
I did also try changing <i>widgetClicked</i> to not receive any arguments and that worked, which was expected because the receiver is not required to match all arguments of a signal. Of course, it also worked if I changed back to int...<br />
<br />
What the #@! is going on? Naturally, I had no option of searching for answers since I was sitting on the train back home from work and had no Internet connection.<br />
<br />
Then it come to me, Python is not aware of the C++ signature overload. Python doesn't support overloading. Python/PyQt can't set up the right connection between <i>widgetClicked</i> and <i>mapped</i>. But how do you specify which of the overloads you want to connect to? By indexing:<br />
<pre class="python" name="code"># This connects your slot/signal to the string-overload
signalMapper.mapped[str].connect(...)
</pre>
The int overload will be used default by PyQt, that's why my code worked when I connected <i>widgetClicked</i> to <i>mapped</i> w/o specifying which overload I wanted.<br />
<br />Anonymousnoreply@blogger.com0tag:blogger.com,1999:blog-7970464356958190643.post-76752981622668091892010-09-05T15:03:00.000+02:002010-09-05T15:03:58.694+02:00IcecastRadio - Qt widget/Qt Quick example Icecast playerI've been toying with modeling a Qt application which supports both a traditional widget-based view and a quick-based (qml) view.<br />
<br />
<b>About IcecastRadio</b><br />
The intention of this project/application is to demonstrate how important<br />
it can be to design a model for your application. If the model is correctly<br />
designed, it can be used from both traditional widget based UIs and<br />
modern UIs built with Qt Quick without too much effort.<br />
<br />
The advantage is of course that you can provide both a desktop application which integrates with the native look and feel of the OS and at the same time have a totally different experience UI-wise, for example in an embedded device by only changing the view-layer.<br />
<br />
IcecastRadio is actually two applications, QtCast and QuickCast. QtCast implements the widget-based view and QuickCast the quick-based view. Both application depends on a third entity, the model. You'll see this division in the source code in form of three projects, qtcast, quickcast and model.<br />
<br />
The application was successfully compiled against Qt 4.7-beta 1 and 2. <br />
<br />
<b>Source code</b><br />
You'll find the source code at <a href="http://gitorious.org/icecastradio">http://gitorious.org/icecastradio</a>. The player code is released under the MIT license, clone and have fun. Please read the README file found in the repository for more information.<br />
<br />
<b>Screenshots</b><br />
Must have...<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/_ilsnPCKxGBM/TIOPAjSVJ3I/AAAAAAAAAB8/jdoPpQ_1gsk/s1600/qtcast.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="312" src="http://1.bp.blogspot.com/_ilsnPCKxGBM/TIOPAjSVJ3I/AAAAAAAAAB8/jdoPpQ_1gsk/s400/qtcast.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/_ilsnPCKxGBM/TIOPJ-huZ4I/AAAAAAAAACE/24PHo5GJjhc/s1600/quickcast.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="http://3.bp.blogspot.com/_ilsnPCKxGBM/TIOPJ-huZ4I/AAAAAAAAACE/24PHo5GJjhc/s400/quickcast.png" width="400" /></a><a class="cssButton ubtn-disabled" href="javascript:void(0)" id="draftButton" onclick="if (this.className.indexOf("ubtn-disabled") == -1) {var e = document['postingForm'].saveDraft;(e.length) ? e[0].click() : e.click(); if (window.event) window.event.cancelBubble = true; return false;}" target=""></a></div>
<br />
<br />
<b>Remark</b><br />
The application lacks a lot of features that could be expected from a radio player, for example there is no way of sorting the list of stations nor any filtering can be applied. The intention was not to create a full blown Icecast player but to demonstrate how to create a model that is usable from both a widget-based application and a quick-based application.<br />
<br />
Patches are welcome :) <br />
<br />Anonymousnoreply@blogger.com2