Development/Tutorials/Plasma4/RubyApplet: Difference between revisions

    From KDE TechBase
    No edit summary
    No edit summary
    Line 1: Line 1:
    ==Abstract==
    ==Abstract==


    This tutorial shows how to create your own Plasmoids using the Ruby scripting language.
    This tutorial shows how to create your own Plasma Widget/Applet/Plasmoid using the Ruby scripting language.
     
    See also:
    * [[Development/Tutorials/Qt4_Ruby_Tutorial|Qt4 Ruby Tutorial]]
    * [http://www.kdedevelopers.org/node/3560 Writing Plasma Applets in C# and Ruby]


    ==The desktop file==
    ==The desktop file==
    Line 7: Line 11:
    The desktop file is the entry-point to our applet. It does define what the applet is for and how it should be loaded and handled by plasma.
    The desktop file is the entry-point to our applet. It does define what the applet is for and how it should be loaded and handled by plasma.


    [http://websvn.kde.org/trunk/KDE/kdebindings/ruby/plasma/examples/applets/webapplet/plasma-ruby-applet-web.desktop?view=markup plasma-ruby-applet-web.desktop]
    For our webbrowser applet we use the [http://websvn.kde.org/trunk/KDE/kdebindings/ruby/plasma/examples/applets/webapplet/plasma-ruby-applet-web.desktop?view=markup plasma-ruby-applet-web.desktop] desktop file which looks like;


    <code>
    <code>
    Line 32: Line 36:
    ==The Ruby Script==
    ==The Ruby Script==


    It follows the Ruby scripting code which does implement the whole functionality to display a webbrowser within the applet and to allow to browse around.
    It follows the Ruby scripting code which does implement the whole functionality to display a webbrowser within the applet and to browse around using the displayed links.


    [http://websvn.kde.org/trunk/KDE/kdebindings/ruby/plasma/examples/applets/webapplet/web_applet.rb?view=markup web_applet.rb]
    [http://websvn.kde.org/trunk/KDE/kdebindings/ruby/plasma/examples/applets/webapplet/web_applet.rb?view=markup web_applet.rb]
    Line 41: Line 45:
    require 'plasma_applet'
    require 'plasma_applet'


    # we define an own module
    # We define an own module
    module PlasmaRubyWebApplet
    module PlasmaRubyWebApplet


       # the WebApplet class does implement the Plasma::Applet
       # The WebApplet class does implement the Plasma::Applet.
       class WebApplet < Plasma::Applet
       class WebApplet < Plasma::Applet


         # the both slots used by our applet.
         # The both slots used by our applet.
         slots 'load(QUrl)',
         slots 'load(QUrl)',
               'loadFinished(bool)'
               'loadFinished(bool)'


         # constructor.
         # Constructor for our WebApplet class.
         def initialize(parent, args)
         def initialize(parent, args)
           super
           super
         end
         end


         # on initialization this method will be called.
         # On initialization this method will be called by plasma. Here we
        # are able to do expensive initialization work to show something
        # within our applet.
         def init
         def init
           # let's start with a nice default size.
           # Let's start with a nice default size.
           resize(600, 400)
           resize(600, 400)


           # create the Browser widget which will display the content.
           # Create the Browser widget which will display the content
          # of webpages.
           @page = Plasma::WebContent.new(self)
           @page = Plasma::WebContent.new(self)
           @page.page = Qt::WebPage.new(@page)
           @page.page = Qt::WebPage.new(@page)
    Line 68: Line 75:
             Qt::WebSettings::LinksIncludedInFocusChain, true)
             Qt::WebSettings::LinksIncludedInFocusChain, true)


          # Connect signals the webbrowser provides with own functions.
           connect(@page, SIGNAL('loadFinished(bool)'),
           connect(@page, SIGNAL('loadFinished(bool)'),
                   self, SLOT('loadFinished(bool)'))
                   self, SLOT('loadFinished(bool)'))
    Line 73: Line 81:
                   self, SLOT('load(QUrl)'))
                   self, SLOT('load(QUrl)'))


           # start browsing some webpage
           # Start browsing some webpage
           @page.url = Qt::Url.new("http://dot.kde.org/")
           @page.url = Qt::Url.new("http://dot.kde.org/")
         end
         end


         # this method will be called once the user clicks on a link. we
         # This method will be called once the user clicks on a link.
         # just load the defined url and display it.
         # We just load the defined URL-address and let the
        # webbrowser-page display the content.
         def load(url)
         def load(url)
           puts "Loading #{url.toString}"
           puts "Loading #{url.toString}"
    Line 84: Line 93:
         end
         end


         # this method will be called once loading a page finished.
         # This method will be called once loading a page finished.
         def loadFinished(success)
         def loadFinished(success)
           puts "page loaded #{@page.page.currentFrame.url.toString}"
           puts "page loaded #{@page.page.currentFrame.url.toString}"
         end
         end


         # this method will be called each time a constraint changed. the
         # This method will be called each time a constraint changed. the
         # for us most interesting constraints are;
         # for us most interesting constraints are;
         # * LocationConstraint if the location of the applet changed
         # * LocationConstraint if the location of the applet changed
    Line 105: Line 114:
    end
    end
    </code>
    </code>
    That was already all the code needed to implement our own webbrowser Applet using the Ruby language. The in this sample used [http://doc.trolltech.com/4.4/qtwebkit.html browser] does provide for sure much more functionality.


    ==Install and test the Applet==
    ==Install and test the Applet==


    To install the applet the [http://websvn.kde.org/trunk/KDE/kdebindings/ruby/plasma/examples/applets/webapplet/CMakeLists.txt?view=markup CMakeLists.txt] is used. It basicly does copy the both files above to the right locations
    To install the Applet the [http://websvn.kde.org/trunk/KDE/kdebindings/ruby/plasma/examples/applets/webapplet/CMakeLists.txt?view=markup CMakeLists.txt] is used. It basically does copy the both files above to the right locations. Translated to command-line arguments it would look like;


    <code>
    <code>
    cp plasma-ruby-applet-web.desktop `kde4-config --install services`
    sudo cp plasma-ruby-applet-web.desktop `kde4-config --install services`
    cp web_applet.rb `kde4-config --install data`/plasma_ruby_web_applet/
    sudo mkdir `kde4-config --install data`/plasma_ruby_web_applet/
    sudo cp web_applet.rb `kde4-config --install data`/plasma_ruby_web_applet/
    </code>
    </code>


    what installs the both files for all users. If you like to have them accessible only from within one user, then just copy those both files to your $KDEHOME where the command "kde4-config --localprefix" should provide you a hint where that may be :)
    what installs the both files to the global installation directory to make hem available for all users on your sysem. If you like to have them accessible only from within one user, then just copy those both files to the users $KDEHOME (the command "kde4-config --localprefix" should provide you a hint where that may be).


    To take a look at your applet or test it during the developing, you can fire up;
    To take a look at your applet or test it during development, you can;


    <code>
    <code>
    Line 124: Line 136:
    </code>
    </code>


    where the kbuildsycoca4 does rebuild the desktop-cache to update changes done at the desktop file. The plasmoidviewer is a tool that allows you to start and view your applet outside of plasma.
    where the kbuildsycoca4 does rebuild the desktop-cache to update changes done to the desktop file. The plasmoidviewer is a tool that allows you to start and view your applet outside of plasma.

    Revision as of 18:59, 13 July 2008

    Abstract

    This tutorial shows how to create your own Plasma Widget/Applet/Plasmoid using the Ruby scripting language.

    See also:

    The desktop file

    The desktop file is the entry-point to our applet. It does define what the applet is for and how it should be loaded and handled by plasma.

    For our webbrowser applet we use the plasma-ruby-applet-web.desktop desktop file which looks like;

    [Desktop Entry] Name=Ruby Web Browser Icon=internet-web-browser

    Type=Service ServiceTypes=Plasma/Applet

    X-KDE-Library=krubypluginfactory X-KDE-PluginKeyword=plasma_ruby_web_applet/web_applet.rb X-KDE-PluginInfo-Name=plasma-ruby-web-applet

    X-KDE-PluginInfo-Version=pre0.1 X-KDE-PluginInfo-Category=Web X-KDE-PluginInfo-Depends=QtRuby X-KDE-PluginInfo-License=GPL X-KDE-PluginInfo-EnabledByDefault=true

    The important parts within those desktop service file are the referenced X-KDE-Library which will be loaded on request and is responsible for executing our with X-KDE-PluginKeyword defined Ruby scrip file. Our applet will be known by Plasma under the unique name "plasma-ruby-web-applet".

    The Ruby Script

    It follows the Ruby scripting code which does implement the whole functionality to display a webbrowser within the applet and to browse around using the displayed links.

    web_applet.rb

    1. import the plasma-applet functionality which we need to
    2. implement our own webbrowser applet.

    require 'plasma_applet'

    1. We define an own module

    module PlasmaRubyWebApplet

     # The WebApplet class does implement the Plasma::Applet.
     class WebApplet < Plasma::Applet
    
       # The both slots used by our applet.
       slots 'load(QUrl)',
             'loadFinished(bool)'
    
       # Constructor for our WebApplet class.
       def initialize(parent, args)
         super
       end
    
       # On initialization this method will be called by plasma. Here we
       # are able to do expensive initialization work to show something
       # within our applet.
       def init
         # Let's start with a nice default size.
         resize(600, 400)
    
         # Create the Browser widget which will display the content
         # of webpages.
         @page = Plasma::WebContent.new(self)
         @page.page = Qt::WebPage.new(@page)
         @page.page.linkDelegationPolicy = Qt::WebPage::DelegateAllLinks
         @page.page.settings.setAttribute(
           Qt::WebSettings::LinksIncludedInFocusChain, true)
    
         # Connect signals the webbrowser provides with own functions.
         connect(@page, SIGNAL('loadFinished(bool)'),
                 self, SLOT('loadFinished(bool)'))
         connect(@page.page, SIGNAL('linkClicked(QUrl)'),
                 self, SLOT('load(QUrl)'))
    
         # Start browsing some webpage
         @page.url = Qt::Url.new("http://dot.kde.org/")
       end
    
       # This method will be called once the user clicks on a link.
       # We just load the defined URL-address and let the
       # webbrowser-page display the content.
       def load(url)
         puts "Loading #{url.toString}"
         @page.url = url
       end
    
       # This method will be called once loading a page finished.
       def loadFinished(success)
         puts "page loaded #{@page.page.currentFrame.url.toString}"
       end
    
       # This method will be called each time a constraint changed. the
       # for us most interesting constraints are;
       # * LocationConstraint if the location of the applet changed
       # * ScreenConstraint if the screen on which the applet is located
       #   on changed
       # * SizeConstraint if the size of the applet changed
       # * ImmutableConstraint if the applet got locked/unlocked
       def constraintsEvent(constraints)
         if constraints.to_i & Plasma::SizeConstraint.to_i
           @page.resize(size())
         end
       end
    
     end
    

    end

    That was already all the code needed to implement our own webbrowser Applet using the Ruby language. The in this sample used browser does provide for sure much more functionality.

    Install and test the Applet

    To install the Applet the CMakeLists.txt is used. It basically does copy the both files above to the right locations. Translated to command-line arguments it would look like;

    sudo cp plasma-ruby-applet-web.desktop `kde4-config --install services` sudo mkdir `kde4-config --install data`/plasma_ruby_web_applet/ sudo cp web_applet.rb `kde4-config --install data`/plasma_ruby_web_applet/

    what installs the both files to the global installation directory to make hem available for all users on your sysem. If you like to have them accessible only from within one user, then just copy those both files to the users $KDEHOME (the command "kde4-config --localprefix" should provide you a hint where that may be).

    To take a look at your applet or test it during development, you can;

    kbuildsycoca4 plasmoidviewer plasma-ruby-web-applet

    where the kbuildsycoca4 does rebuild the desktop-cache to update changes done to the desktop file. The plasmoidviewer is a tool that allows you to start and view your applet outside of plasma.